上手运行
跑起第一段代码,弄清 Python 和 JVM 语言在运行方式上的差别。
三个根本差别
Python 的语法很快就能上手。真正需要适应的是下面三点。
- 没有单独的编译步骤。
python3 app.py直接运行源文件,字节码在后台自动生成。除语法错误外,大部分错误要运行到那一行才会暴露。 - 类型属于值,变量没有类型。 同一个变量可以先后指向数字和字符串,传错类型也要到运行时才知道。
- 函数、类、模块都是普通对象。 它们可以赋值给变量、放进列表、当参数传递。
def、class、import都是运行时执行的语句。
| Python | Java | Kotlin | 说明 |
|---|---|---|---|
python3 app.py | javac + java | kotlinc + java | Java 11 起也能用 java App.java 直接运行单个文件 |
| CPython 解释器 | JVM | JVM | |
.pyc 字节码 | .class | .class | Python 自动放在 __pycache__/,不用手动管理 |
python3 交互模式 | jshell | Kotlin Notebook | 验证想法最快的方式 |
Hello World
把下面一行存为 hello.py,再执行 python3 hello.py 就能看到输出。
程序入口
print("Hello, World!")public class Hello {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}fun main() {
println("Hello, World!")
}| 对比项 | Python | Java |
|---|---|---|
| 程序入口 | 文件顶层语句直接执行 | main 方法 |
| 是否需要类 | 不需要 | 需要 |
| 输出语句 | print() | System.out.println() |
| 语句结尾 | 不写分号 | 必须写分号 |
| 对比项 | Python | Kotlin |
|---|---|---|
| 程序入口 | 文件顶层语句直接执行 | main 函数 |
| 输出语句 | print() | println() |
| 是否需要类 | 相同不需要 | |
| 语句结尾 | 相同不写分号 | |
Python 脚本像一段自上而下的指令。需要区分「被运行」和「被导入」时,再用第 6 章的 if __name__ == "__main__"。
运行代码的几种方式
macOS 用 brew install python@3.12,Windows 从 python.org 下载安装包,Linux 大多已经预装。Windows 上命令通常是 python 或 py。
终端
python3 --version # 查看版本
python3 hello.py # 运行脚本
python3 # 进入交互模式,用 exit() 或 Ctrl-D 退出
python3 -c "print(1 + 1)" # 运行一行代码
python3 -m http.server # 把标准库模块当程序运行交互模式是学习期最常用的工具。提示符 >>> 后输入表达式,回车就能看到结果,不用写 print。后面的示例里,# => 表示这一行的结果。
遇到不熟悉的对象,用 help(obj) 看文档,用 dir(obj) 列出它的属性和方法。
交互模式的实用技巧选读
- 按
Tab补全名字,按方向键翻历史命令 _保存上一个表达式的结果python3 -i app.py运行脚本后留在交互模式,可以检查变量- 环境变量
PYTHONSTARTUP指向一个文件,每次进入交互模式时自动执行 - 想要语法高亮和更强的补全,可以安装
ipython
脚本头和源文件编码选读
在 Unix 系统上,给脚本第一行加 #!/usr/bin/env python3,再执行 chmod +x hello.py,就可以用 ./hello.py 运行。源文件默认按 UTF-8 解码,中文变量名和字符串都没问题。极少数情况要用别的编码时,才需要在文件开头写 # -*- coding: cp1252 -*-。
缩进就是语法
Python 用缩进表示代码块,没有花括号和分号。冒号开启一个新块,缩进回退时块结束。
代码块
for n in [1, 2, 3]:
if n % 2 == 0:
print(n, "是偶数")
print("结束")for (int n : List.of(1, 2, 3)) {
if (n % 2 == 0) {
System.out.println(n + " 是偶数");
}
}
System.out.println("结束");for (n in listOf(1, 2, 3)) {
if (n % 2 == 0) {
println("$n 是偶数")
}
}
println("结束")| 对比项 | Python | Java |
|---|---|---|
| 代码块边界 | 缩进 | 花括号 |
| 缩进的作用 | 语法的一部分 | 只是代码风格 |
| 条件括号 | 不写 | 必须写 |
| 代码块开头 | 冒号 | { |
| 嵌套逻辑 | 相同外层控制内层执行 | |
| 对比项 | Python | Kotlin |
|---|---|---|
| 代码块边界 | 缩进 | 花括号 |
| 缩进的作用 | 语法的一部分 | 只是代码风格 |
| 条件括号 | 不写 | 必须写 |
| 代码块开头 | 冒号 | { |
| 嵌套逻辑 | 相同外层控制内层执行 | |
同一个块的缩进必须一致,不一致时报 IndentationError。交给编辑器处理,别混用 Tab 和空格。
注释用 #,没有 /* */ 这样的多行注释。一行写不下时,放在括号里的内容可以直接换行,不需要续行符。
Python
total = (1 + 2 + 3
+ 4 + 5)
print(total) # => 15