[TOC]
命名规范(PEP8)
注释
变量和数据类型
运算符
字符串
列表、元组、字典、集合
控制流(条件、循环)
函数
类和对象
模块和包
异常处理
文件操作
常用内置函数
1.1 标识符:数字+字母+下划线(不能数字开头,大小写敏感)
以单下划线开头:_foo,代表不能直接访问的类属性,需通过类提供的接口进行访问,不能用 from xxx import *
以双下划线开头:__foo,代表类的私有成员
以双下划线开头和结尾:__foo__,代表 Python 里特殊方法专用的标识,如 __init__() 代表类的构造函数。
1.1.1 保留字
| 类别 | 关键字 | 说明 |
|---|---|---|
| 逻辑值(内置常量) | 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 |
从生成器函数返回值 |
1.1.2 命名规范:常量、变量、函数&方法、类、私有成员、异常、前导后缀下划线
常量名:全大写+下划线,通常在模块顶部定义,如MAX_COONNECTIONS = 50,DEFAULT_TIMEOUT = 10.0
项目名/包名:全小写+下划线,短小、简洁、避免连字符,如my_project/data_utils
脚本名/模块名:全小写+下划线,短小、清晰、避免特殊字符,如main.py/data_loades.py
变量名:全小写+下划线,描述性明确,避免单字符(除临时变量),如user_name = "Alice",max_count = 100
函数名:全小写+下划线,使用动词或短语,如
def calculate_total():
pass
def get_user_data():
pass
方法名:全小写+下划线,同函数,如
class Rectangle:
def calculate_area(self):
pass
类命名:首字母大写式驼峰,不使用下划线,如
class UserProfile:
pass
class NetworkHandler:
pass
私有成员:单下划线开头(约定俗称的私有);双下划线开头(触发名称修饰,避免子类冲突),如
class MyClass:
def __init__(self):
self._internal_data = [] # 约定私有
self.__secret_value = 42 # 名称修饰,实际变为_MyClass__secret_value
异常命名:首字母大写式驼峰+Error后缀,如
class ValidationError(Exception)
pass
单前导下划线:约定为“保护”成员,表示该变量或方法仅供内部使用(模块内或类内),如 _variable
class MyClass:
def __init__(self):
self._internal_data = [] # 保护成员
def _internal_method(self): # 保护方法
pass
单后缀下划线:避免与关键字冲突:当变量名与Python关键字(如 class, def, list)冲突时,在末尾加下划线,如 class_
class_ = “Physics” # 避免使用 class 关键字
list_ = [1,2,3] # 避免使用 list 关键字
双前导下划线:会触发名称修饰:用于避免子类中的命名冲突。Python会在变量名前加上`_类名`作为前缀,使其在类外访问时实际名称被改写
实际效果:__var 在类 MyClass 内部会被重命名为 _MyClass__var。
class MyClass:
def __init__(self):
self.__private = 42 # 实际存储为_MyClass__private
obj = MyClass()
print(obj.__private) # 报错AttributeError
print(obj._MyClass__private) # 可访问(但不推荐)
双后缀下划线:无特殊含义,一般避免使用,除非用于避免与关键字冲突(如`class_`而非`class`)。但双后缀下划线本身不是Python的规范用法,如`var__`
双前导和双后缀下划线
特殊方法:这是Python保留的命名方式,用于定义类的特殊行为(如运算符重载、构造方法等);用户不要自定义此类名称,如 __init__
class MyClass:
def __init__(self): # 构造方法
pass
def __str__(self): # 定义对象打印格式
return "MyClass"
99%的场景使用`snake_case`(变量/函数)和`CamelCase`(类)
仅在需要避免命名冲突时使用`__private`
永远不要自定义`__anything__`格式的方法
使用`_internal`传达"仅供模块或类的内部使用"的意图
1.1.3 数据类型
1.1.3.1 可变类型:数字(整数、浮点、布尔、复数)、字符串、元组、字节串
数字:
整数int
浮点数float
布尔值bool
复数complex
字符串str:不可变的字符序列,如 "hello", 'Python'
元组tuple:不可变的有序序列,如 (1, "a", True)
字节串bytes:不可变的二进制数据,如 b'ABC'
1.1.3.2 可变类型(容器):列表、字典、集合、字节数组
列表list:可变的有序序列,如 [1, 2, "three"]
字典dict:键值对的集合(无序),键必须不可变,如 {"name": "Alice", "age": 30}
集合set:无序且元素唯一,如 {1, 2, 3}
字节数组bytearray:可变的二进制数据,如 bytearray(b"hello")
1.1.3.3 特殊类型:空值、范围、冻结集合、二进制序列视图
空值NoneType:表示“无”,唯一值 `None`
范围range:不可变的数字序列,用于循环,如 `range(5)` 生成 `0,1,2,3,4`
冻结集合frozenset:不可变的集合,可作字典的键,如 `frozenset({1, 2})`
二进制序列视图memoryview:直接操作内存的二进制数据(高级用途)
1.1.3.4 类型检查与转换:type、isinstance、强制类型转换
检查类型:用 `type()` 或 `isinstance()`
print(type(10)) # <class 'int'>
print(isinstance("abc", str)) # True
类型转换:
int("42") # 字符串 → 整数 → 42
float(3) # 整数 → 浮点数 → 3.0
str(True) # 布尔 → 字符串 → "True"
list("abc") # 字符串 → 列表 → ['a', 'b', 'c']
tuple([1, 2]) # 列表 → 元组 → (1, 2)
set([1,1,2]) # 列表 → 集合 → {1, 2}
1.2 运算符
1.2.1 算术运算符:加减乘除、取模、取整、幂
加:+
减:-
乘:*
除:/
取整//:向下取整除法
取模%:返回除法的余数
幂**:返回x的y次幂,a**b 为a的b次方,10**2 = 100
1.2.2 比较运算符:大于、小于、大于等于、小于等于、等于、不等于
大于:>
小于:<
大于等于:>=
小于等于:<=
等于:==
不等于:!=
1.2.3 赋值运算符:普通赋值、加赋、减赋、乘赋、除赋、取整赋、取模赋、幂赋、海象运算(优雅的语法糖:=)
普通赋值:=
加法赋值:+=
减法赋值:-=
乘法赋值:*=
除法赋值:/=
取整除赋值://=
取模赋值:%=
幂赋值:**=
海象运算符::= # python3.8新增,同时进行赋值和返回赋值的值
if (n := len(a)) > 10: # 计算列表a的长度,将计算结果赋值给变量n,整个表达式的结果就是 len(a) 的值,再`>10`条件判断
print(f"List is too long ({n} elements, expected <= 10)") # 列表a的长度大于10,则打印
等价于:
n = len(a) # 先计算长度并赋值
if n > 10: # 再检查条件
print(f"List is too long ({n} elements, expected <= 10)")
1.2.3 位运算符:按位与、按位或、按位取反、按位异或、左移、右移
a = 60 # 0011 1100
b = 13 # 0000 1101
按位与&:a&b = 12 # 0000 1100,同1为1
按位或|:a|b = 61 # 0011 1101,有1为1
按位取反~:~a = -61 # 1100 0011,~x = -(x+1)
按位异或^:a^b = 49 # 0011 0001,不同为1
左移<<:a<<2 = 240 # 1111 0000,低位补0
右移>>:a>>2 = 15 # 0000 1111,高位补0
位运算运用
术语 说明 示例(IPv4)
IP地址 32位整数(IPv4) 192.168.1.10
子网掩码 定义网络/主机位的掩码 255.255.255.0
网络地址 IP&掩码 192.168.1.0
广播地址 IP|~掩码 192.168.1.255
CIDR表示 IP/前缀长度 192.168.1.0/24
应用场景:计算网络地址、计算广播地址、判断IP是否同子网、CIDR转掩码(左移后补0)
位运算比字符串操作快100倍以上,是网络设备的硬件基础
1.2.4 逻辑运算符:逻辑与、逻辑或、逻辑非
and: # 所有条件为真时返回真,返回第一个假值或最后一个真值
or: # 任一条件为真时返回真,返回第一个真值或最后一个假值
not: # 反转布尔值 ,总是返回布尔值(True/False)
1.2.5 成员运算符:in、not in
in: 在指定的序列中找到值返回True,否则返回False。
not in: 在指定的序列中没有找到值返回True,否则返回False。
1.2.6 身份运算符:is、is not
is: 判断两个标识符是不是引用自一个对象
is not: 判断两个标识符是不是引用自不同对象
id() 函数用于获取对象内存地址,可以判断是不是同一对象
1.2.7 运算符优先级
| 运算符 | 描述(从最高到最低优先级) |
|---|---|
(expressions...),[expressions...], {key: value...}, {expressions...} |
圆括号的表达式 |
x[index], x[index:index], x(arguments...), x.attribute |
读取,切片,调用,属性引用 |
| await x | await 表达式 |
** |
乘方(指数) |
+x, -x, ~x |
正,负,按位非 NOT |
*, @, /, //, % |
乘,矩阵乘,除,整除,取余 |
+, - |
加和减 |
<<, >> |
移位 |
& |
按位与 AND |
^ |
按位异或 XOR |
| ` | ` |
in,not in, is,is not, <, <=, >, >=, !=, == |
比较运算,包括成员检测和标识号检测 |
not x |
逻辑非 NOT |
and |
逻辑与 AND(and 拥有or更高优先级) |
or |
逻辑或 OR |
if -- else |
条件表达式 |
lambda |
lambda 表达式 |
:= |
赋值表达式 |
1.3 语法
1.3.1 数据类型语法:数字、字符串、元组、列表、字典、集合
数字:
var1 = 1
var2 = 10
字符串:
var1 = "Hello World"
var2 = "Runoob"
元组:(元素不能修改,但可以组合,可以索引,元组实际由逗号定义)
tup1 = ('Google', 'Runoob', 1997, 2000)
tup2 = (1, 2, 3, 4, 5)
tup3 = "a", "b", "c", "d" # 不要括号也可以
列表:(不需要具有相同的类型)
list1 = ['Google', 'Runoob', 1997, 2000]
list2 = [1, 2, 3, 4, 5 ]
list3 = ["a", "b", "c", "d"]
list4 = ['red', 'green', 'blue', 'yellow', 'white', 'black']
字典:(键值对,键必须是唯一的,重复赋值只会记后一个键值)
tinydict = {'name': 'runoob', 'likes': 123, 'url': 'www.runoob.com'}
集合:(无序的不重复元素序列,可交、并、差集)
set1 = {1, 2, 3, 4} # 直接使用大括号创建集合
set2 = set([4, 5, 6, 7]) # 使用 set() 函数从列表创建集合
创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典
1.3.2 流程控制语法
1.3.2.1 if流程控制:多分支、if嵌套、match…case
多分支:
if condition_1:
statement_block_1
elif condition_2:
statement_block_2
else:
statement_block_3
if嵌套:
if 表达式1:
语句
if 表达式2:
语句
elif 表达式3:
语句
else:
语句
elif 表达式4:
语句
else:
语句
match…case:(match 后的对象会依次与case后的内容进行匹配,如果匹配成功,则执行匹配到的表达式,否则直接跳过,_ 可以匹配一切)
match subject:
case <pattern_1>:
<action_1>
case <pattern_2>:
<action_2>
case <pattern_3>:
<action_3>
case _:
<action_wildcard>
1.3.2.2 while流程控制:while循环、while无限循环、while循环使用else、while简单语句组
while循环:
n = 100
sum = 0
counter = 1
while counter <= n:
sum = sum + counter
counter += 1
print("1 到 %d 之和为: %d" % (n,sum))
while无限循环:
var = 1
while var == 1 : # 表达式永远为 true
num = int(input("输入一个数字 :"))
print ("你输入的数字是: ", num)
print ("Good bye!")
while循环使用else:
count = 0
while count < 5:
print (count, " 小于 5")
count = count + 1
else:
print (count, " 大于或等于 5")
while简单语句组:(while 循环体中只有一条语句,可将该语句与while写在同一行中)
flag = 1
while (flag): print ('欢迎访问菜鸟教程!')
print ("Good bye!")
1.3.2.3 for流程控制:for循环语句、for循环打印字符串中的每个字符、for整数范围值配合 range() 、for…else
for循环语句:(可以遍历任何可迭代对象,如一个列表或者一个字符串)
sites = ["Baidu", "Google","Runoob","Taobao"]
for site in sites:
print(site)
for循环打印字符串中的每个字符:
word = 'runoob'
for letter in word:
print(letter)
for整数范围值配合 range() :
for number in range(1, 6):
print(number)
for…else:(用于在循环结束后执行一段代码)
for x in range(6):
print(x)
else:
print("Finally finished!")
1.3.2.4 reak 和 continue 语句及循环中的 else 子句,以及pass语句
break 语句可以跳出 for 和 while 的循环体。如果你从 for 或 while 循环中终止,任何对应的循环 else 块将不执行。
continue 语句被用来告诉 Python 跳过当前循环块中的剩余语句,然后继续进行下一轮循环。
while 中使用 break:
n = 5
while n > 0:
n -= 1
if n == 2:
break
print(n)
print('循环结束。')
while 中使用 continue:
n = 5
while n > 0:
n -= 1
if n == 2:
continue
print(n)
print('循环结束。')
循环字符串 Runoob,碰到字母 o 跳过输出:
for letter in 'Runoob': # 第一个实例
if letter == 'o': # 字母为 o 时跳过输出
continue
print ('当前字母 :', letter)
var = 10 # 第二个实例
while var > 0:
var = var -1
if var == 5: # 变量为 5 时跳过输出
continue
print ('当前变量值 :', var)
print ("Good bye!")
循环语句可以有 else 子句,它在穷尽列表(以for循环)或条件变为 false (以while循环)导致循环终止时被执行,但循环被 break 终止时不执行:
for n in range(2, 10):
for x in range(2, n):
if n % x == 0:
print(n, '等于', x, '*', n//x)
break
else:
# 循环中没有找到元素
print(n, ' 是质数')
pass语句:
pass是空语句,是为了保持程序结构的完整性;pass 不做任何事情,一般用做占位语句