编码
默认情况下,Python3 源码文件以 UTF-8 编码,所有字符串都是 unicode 字符串。
当然你也可以为源码文件指定不同的编码:
# -*- coding: cp-1252 -*-
上述定义允许在源文件中使用 Windows-1252 字符集中的字符编码,对应适合语言为保加利亚语、白俄罗斯语、马其顿语、俄语、塞尔维亚语。
标识符
- 标识符以大小写字母(a~z \A ~Z)或下划线_ 开头;(不能以数字开头)
- 标识符其他部分由字母,数字和下划线_组成;
- python是区分大小的语言,例如: Myval 和 myval 就是两个不同的标识符
- 禁止使用关键字:不能把 Python 的关键字(例如 if、else、for、def 等)当作标识符来使用
- 特殊用法的标识符:
1.以单个下划线开头的标识符(例如 _private)习惯上表示这是私有变量。
2.以双下划线开头的标识符(例如 __method)会触发名称修饰。
3.以双下划线开头和结尾的标识符(例如 init)属于 Python 的特殊方法,也被称为魔术方法。
合法标识符:
my_variable = 42
_count = 0
MyClass = type('MyClass', (object,), {})
def my_function(): pass
非法标识符:
123abc = 42 # 错误:不能以数字开头
if = 10 # 错误:不能使用关键字
my-var = 5 # 错误:不能包含连字符
Python 3 允许使用 Unicode 字符作为标识符,可以用中文作为变量名,非 ASCII 标识符也是允许的了。
姓名 = "张三" # 合法
π = 3.14159 # 合法
Python 保留关键字
False class finally is return
None continue for lambda try
True def from nonlocal while
and del global not with
as elif if or yield
assert else import pass
break except in raise
如果你尝试把这些关键字当作标识符来使用,就会引发语法错误。例如:
# 错误示例
if = 5 # 会报错:SyntaxError: invalid syntax
类别 | 关键字 | 说明 |
---|---|---|
逻辑值 | True | 布尔真值 |
False | 布尔假值 | |
None | 表示空值或无值 | |
逻辑运算 | and | 逻辑与运算 |
or | 逻辑或运算 | |
not | 逻辑非运算 | |
条件控制 | if | 条件判断语句 |
elif | 否则如果(else if 的缩写 | |
else | 否则分支 | |
循环控制 | for | 迭代循环 |
while | 条件循环 | |
break | 跳出循环 | |
continue | 跳过当前循环的剩余部分,进入下一次迭代 | |
异常处理 | try | 尝试执行代码块 |
except | 捕获异常 | |
finally | 无论是否发生异常都会执行的代码块 | |
raise | 抛出异常 | |
函数定义 | def | 定义函数 |
return | 从函数返回值 | |
lambda | 创建匿名函数 | |
类与对象 | class | 定义类 |
del | 删除对象引用 | |
模块导入 | import | 导入模块 |
from | 从模块导入特定部分 | |
as | 为导入的模块或对象创建别名 | |
作用域 | global | 声明全局变量 |
nonlocal | 声明非局部变量(用于嵌套函数) | |
异步编程 | async | 声明异步函数 |
await | 等待异步操作完成 | |
其他 | assert | 断言,用于测试条件是否为真 |
in | 检查成员关系 | |
is | 检查对象身份(是否是同一个对象) | |
pass | 空语句,用于占位 | |
with | 上下文管理器,用于资源管理 | |
yield | 从生成器函数返回值 |
Python 注释
- 单行注释
使用 # 符号开头,从 # 到行末的所有内容都会被解释器忽略。
# 这是一个单行注释
x = 5 # 可以在代码行后添加注释
- 多行注释(文档字符串 Docstring)
使用三引号(‘’’ 或 “”")包裹的多行文本,通常用于函数、类或模块的文档说明。
def add(a, b):
"""
计算两个数的和。
参数:
a (int): 第一个加数
b (int): 第二个加数
返回:
int: 两个数的和
"""
return a + b
行与缩进
- 缩进的作用
Python 使用缩进来表示代码块(如 if、for、def、class 等语句的作用域),而非像其他语言那样使用大括号 {}。例如:
def add(a, b):
# 函数体缩进 4 个空格
result = a + b
return result # 同一代码块需保持相同缩进
if x > 5:
print("x 大于 5") # if 语句块
else:
print("x 小于等于 5") # else 语句块
- 缩进规则
统一缩进量:推荐使用 4 个空格(PEP 8 规范),避免使用 Tab(不同编辑器对 Tab 的显示宽度可能不同)。
相同层级对齐:同一代码块内的语句必须保持相同的缩进量。
嵌套代码块:每增加一级嵌套,缩进增加 4 个空格。
def main():
x = 10
if x > 5:
print("x 大于 5") # 缩进 4 个空格
for i in range(3):
print(i) # 嵌套循环,缩进 8 个空格
else:
print("x 小于等于 5") # else 与 if 同级,缩进 4 个空格
以下代码最后一行语句缩进数的空格数不一致,会导致运行错误:
if True:
print ("Answer")
print ("True")
else:
print ("Answer")
print ("False") # 缩进不一致,会导致运行错误
多行语句
- 隐式多行语句(推荐方式)
在括号 ()、方括号 [] 或花括号 {} 内的语句可以自动跨行,无需额外符号。
# 长列表
numbers = [
1, 2, 3,
4, 5, 6,
7, 8, 9
]
# 长函数参数
result = calculate(
value1=10,
value2=20,
options={"verbose": True}
)
# 多行字典
config = {
"host": "localhost",
"port": 8080,
"timeout": 30
}
- 显式多行语句(使用反斜杠 \)
当语句不在括号内时,可以使用反斜杠 \ 显式连接多行。
total = item1 + \
item2 + \
item3
if (a == 10 and
b == 20 and
c == 30):
print("条件满足")
注意:反斜杠后不能有任何字符(包括空格和注释),否则会导致语法错误。
数字(Number)类型
python中数字有四种类型:整数、布尔型、浮点数和复数。
- int (整数), 如 1, 只有一种整数类型 int,表示为长整型,没有 python2 中的 Long。
- bool (布尔), 如 True
- float (浮点数), 如 1.23、3E-2
- complex (复数) - 复数由实部和虚部组成,形式为 a + bj,其中 a 是实部,b 是虚部,j 表示虚数单位。如 1 + 2j、 1.1 + 2.2j
字符串(String)
- 字符串定义
使用单引号 ‘、双引号 " 或三引号 ‘’’/“”" 定义:
s1 = 'Hello'
s2 = "World"
s3 = '''这是一个
多行字符串'''
s4 = """允许嵌套 '单引号' 和 "双引号" """
- 转义字符
使用反斜杠 \ 转义特殊字符:
s = 'He said: "Hello!"' # 单引号内使用双引号
s = "He said: \"Hello!\"" # 双引号内使用双引号需转义
s = '换行符:\n制表符:\t'
常用转义字符:
\n:换行
\t:制表符
\:反斜杠
'/":引号
- 原始字符串
在字符串前加 r 或 R,忽略转义:
path = r'C:\Users\Documents' # 无需双重反斜杠
regex = r'\d+' # 正则表达式中常用
空行
函数之间或类的方法之间用空行分隔,表示一段新的代码的开始。类和函数入口之间也用一行空行分隔,以突出函数入口的开始。
空行与代码缩进不同,空行并不是 Python 语法的一部分。书写时不插入空行,Python 解释器运行也不会出错。但是空行的作用在于分隔两段不同功能或含义的代码,便于日后代码的维护或重构。
记住:空行也是程序代码的一部分。
- 代码组的基本规则
缩进决定分组:同一代码组的语句必须保持相同的缩进量(通常为 4 个空格)。
冒号 : 引导:在 if、for、def、class 等语句末尾使用冒号 :,随后的缩进语句构成代码组。
if x > 5:
print("x 大于 5") # 缩进 4 个空格,属于 if 代码组
y = x * 2 # 同一代码组
else:
print("x 小于等于 5") # else 代码组
y = x / 2
- 常见代码组结构
条件语句(if-elif-else)
if condition1:
# 代码组 1
statement1
statement2
elif condition2:
# 代码组 2
statement3
else:
# 代码组 3
statement4
循环语句(for/while)
for item in iterable:
# 循环体代码组
process(item)
while condition:
# 循环体代码组
update()
if break_condition:
break # 嵌套代码组
函数定义
def function_name(parameters):
# 函数体代码组
result = compute(parameters)
return result
类定义
class MyClass:
# 类代码组
def __init__(self): # 方法代码组
self.value = 0
def method(self): # 另一个方法代码组
return self.value
- 嵌套代码组
代码组可以嵌套,形成更复杂的逻辑结构。每个嵌套层级需要增加相同的缩进量。
for i in range(3):
if i % 2 == 0:
print(f"{i} 是偶数") # 外层循环 + if 嵌套
for j in range(i):
print(j) # 双重嵌套
else:
print(f"{i} 是奇数") # 外层循环 + else 分支
- 单行代码组(不推荐)
虽然 Python 允许在同一行编写简短的代码组,但会降低可读性,不推荐使用:
if x > 5: print("x 大于 5"); y = x * 2 # 不推荐
推荐写法
if x > 5:
print("x 大于 5")
y = x * 2
- 空代码组(占位符)
使用 pass 语句作为空代码组的占位符:
def empty_function():
pass # 占位,避免语法错误
if condition:
pass # 后续再实现
else:
handle_case()
- 代码组与缩进错误
缩进不一致会导致 IndentationError 或逻辑错误:
错误示例
if x > 5:
print("x 大于 5")
y = x * 2 # 缩进错误!与上面语句不在同一代码组
正确示例
if x > 5:
print("x 大于 5")
y = x * 2 # 保持相同缩进
print 输出
print 默认输出是换行的,如果要实现不换行需要在变量末尾加上 end=“”:
#!/usr/bin/python3
x="a"
y="b"
# 换行输出
print( x )
print( y )
print('---------')
# 不换行输出
print( x, end=" " )
print( y, end=" " )
print()
命令行参数
很多程序可以执行一些操作来查看一些基本信息,Python可以使用-h参数查看各参数帮助信息:
$ python -h
usage: python [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-c cmd : program passed in as string (terminates option list)
-d : debug output from parser (also PYTHONDEBUG=x)
-E : ignore environment variables (such as PYTHONPATH)
-h : print this help message and exit
[ etc. ]