python3基础语法梳理(一)
前沿
Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。
注意 官方宣布,2020 年 1 月 1 日, 停止 Python 2 的更新。
所以这次整理 以python3最新的版本和特性为主
Python3安装
python3安装比较简单,略过 如果有需要看这个博客
版本选择 3.13版本
这里我选择了windows嵌入式安装包 解压就可以直接用
Python3 基础语法
标识符规则
第一个字符必须以字母(a-z, A-Z)或下划线 _ 。
标识符的其他的部分由字母、数字和下划线组成。
标识符对大小写敏感,count 和 Count 是不同的标识符。
标识符对长度无硬性限制,但建议保持简洁(一般不超过 20 个字符)。
禁止使用保留关键字,如 if、for、class 等不能作为标识符。
注意 Python 3 允许使用 Unicode 字符作为标识符,可以用中文作为变量名,非 ASCII 标识符也是允许的了。
>>> π = 3.14159 # 合法
>>> π
3.14159
>>> 姓名 = "张三" # 合法
>>> 姓名
'张三'
python3保留字
>>> import keyword
>>> keyword.kwlist
['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']
类别 | 关键字 | 说明 |
---|---|---|
逻辑值 | 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 | 从生成器函数返回值 |
检测标识符是否合法
>>> def is_valid_identifier(name):
... try:
... exec(f"{name} = None")
... return True
... except: ... return False
...
>>> print(is_valid_identifier("2var")) # False
False
>>> print(is_valid_identifier("var2")) # True
python3常见数据类型
类别 | 数据类型 | 描述 | 示例 |
---|---|---|---|
数字类型 | int | 整数(不限大小) | a = 42 |
float | 浮点数(带小数) | b = 3.14 | |
complex | 复数(实部 + 虚部) | c = 2 + 3j | |
文本类型 | str | 字符串(文本序列) | s = “Hello” |
布尔类型 | bool | 逻辑值(True/False) | flag = True |
空类型 | NoneType | 表示无数据 | x = None |
序列类型 | list | 可变有序序列 | lst = [1, “a”, True] |
tuple | 不可变有序序列 | tup = (1, “a”, True) | |
range | 不可变的数字序列(常用于循环) | r = range(5) | |
映射类型 | dict | 键值对集合(无序) | d = {“name”: “Alice”, “age”: 25} |
集合类型 | set | 无序不重复元素集合 | s = {1, 2, 3} |
frozenset | 不可变的 set | fs = frozenset([1, 2, 3]) | |
二进制类型 | bytes | 不可变字节序列(0-255) | b = b"hello" |
bytearray | 可变字节序列 | ba = bytearray(b"hello") | |
memoryview | 内存视图(直接访问二进制数据) | mv = memoryview(b"hello") |
注意:
python3没有单独的字符类型,一个字符就是长度为1的字符串。
Python3 中,bool 是 int 的子类,True 和 False 可以和数字相加, True==1、False==0 会返回 True,但可以通过 is 来判断类型。
可变 vs 不可变
可变类型:list
、dict
、set
、bytearray
(可修改内容)。
不可变类型:int
、float
、str
、tuple
、frozenset
、bytes
(创建后不能修改)。
特殊类型
range
:常用于循环(如for i in range(10)
)。
NoneType
:表示空值,通常用于初始化变量。
类型检查
使用type()
或isinstance()
判断数据类型:
isinstance 和 type 的区别在于:
type()
不会认为子类是一种父类类型。isinstance()
会认为子类是一种父类类型。
示例一
print(type(10)) # <class 'int'>
print(isinstance([], list)) # True
>>> class A:
... pass
...
>>> class B(A):
... pass
...
>>> isinstance(A(), A)
True
>>> type(A()) == A
True
>>> isinstance(B(), A)
True
>>> type(B()) == A
False
>>> issubclass(bool, int)
True
>>> True==1
True
>>> False==0
True
>>> True+1
2
>>> False+1
1
>>> 1 is True
<python-input-12>:1: SyntaxWarning: "is" with 'int' literal. Did you mean "=="?1 is True
False
>>> 0 is False
<python-input-13>:1: SyntaxWarning: "is" with 'int' literal. Did you mean "=="?0 is False
False
什么会出现 SyntaxWarning?
Python 检测到你在用 is 比较一个字面量整数(如 1)和 True,这通常是代码错误(因为 is 比较的是身份,而不是值)。
Python 建议你使用 == 来比较值是否相等,除非你确实想检查是否是同一个对象。
在 Python2 中是没有布尔型的,它用数字 0 表示 False,用 1 表示 True。
不可变类型(Immutable)的底层逻辑
- 示例代码
a = 10 # 创建一个整数对象 10,变量 a 指向它
a = 11 # 创建一个新整数对象 11,变量 a 改为指向它
-
内存中的行为
执行 a = 10 时:
Python 在内存中创建整数对象 10,变量 a 是其引用(类似“标签”)。
执行 a = 11 时:
并非修改 10 这个对象,而是新建一个对象 11,并让 a 指向新对象。
原来的 10 依然存在于内存中(如果没有其他引用,会被垃圾回收)。 -
验证方法
用id()
查看对象的内存地址变化:
>>> a = 10
>>> print(id(a))
140724023542984
>>> a = 11
>>> print(id(a))
140724023543016
>>>
对比可变类型(Mutable)的修改
以列表 list
为例:
>>> lst = [1, 2, 3]
>>> print(id(lst))
1858069687616
>>> lst[0] = 99
>>> print(id(lst))
1858069687616
>>>
- 可变类型(如 list、dict)支持原地修改,对象的内存地址不变。
为什么说整数是不可变的?
因为整数对象 10 或 11 在内存中创建后:
- 你无法通过任何操作改变 10 这个对象的值(例如让它变成 11)。
- 所有看似“修改”的操作(如 a = a + 1)本质是创建新对象并重新绑定变量。
为什么设计不可变类型?
- 安全性:避免意外修改(例如字典的键必须用不可变类型)。
- 性能优化:小整数(如 -5 到 256)在 Python 启动时已缓存,重复使用同一对象。
- 哈希支持:不可变对象可哈希(hash(10) 有效,hash([1,2]) 会报错)
注释
单行注释
Python中单行注释以 # 开头,实例如下:
>>> #!/usr/bin/python3
>>>
>>> # 第一个注释
>>> print ("Hello, Python!") # 第二个注释
Hello, Python!
>>>
多行注释
#!/usr/bin/python3# 第一个注释
# 第二个注释'''
第三注释
第四注释
'''"""
第五注释
第六注释
"""
print ("Hello, Python!")
行与缩进
python最具特色的就是使用缩进来表示代码块,不需要使用大括号 {} 。
缩进的空格数是可变的,但是同一个代码块的语句必须包含相同的缩进空格数。
if True:print ("True")
else:print ("False")
多行语句
Python 通常是一行写完一条语句,但如果语句很长,我们可以使用反斜杠 \ 来实现多行语句
>>> item_one='N'
>>> item_two='B'
>>> item_three='C'
>>> total = item_one+\
... item_two+\
... item_three
>>>
>>> total
'NBC'
>>>
类型运算总结
Number(数字)
注意:
1、Python可以同时为多个变量赋值,如a, b = 1, 2。
2、一个变量可以通过赋值指向不同类型的对象。
3、数值的除法包含两个运算符:/ 返回一个浮点数,// 返回一个整数。
4、在混合计算时,Python会把整型转换成为浮点数。
String(字符串)
注意:
1、反斜杠可以用来转义,使用r可以让反斜杠不发生转义。
2、字符串可以用+运算符连接在一起,用*运算符重复。
3、Python中的字符串有两种索引方式,从左往右以0开始,从右往左以-1开始。
4、Python中的字符串不能改变。
bool(布尔类型)
注意: 在 Python 中,所有非零的数字和非空的字符串、列表、元组等数据类型都被视为 True,只有 0、空字符串、空列表、空元组等被视为 False。因此,在进行布尔类型转换时,需要注意数据类型的真假性。
Tuple(元组)
注意:
1、与字符串一样,元组的元素不能修改。
2、元组也可以被索引和切片,方法一样。
3、注意构造包含 0 或 1 个元素的元组的特殊语法规则。
4、元组也可以使用 + 操作符进行拼接。
Set(集合)
注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。
Dictionary(字典)
注意:
1、字典是一种映射类型,它的元素是键值对。
2、字典的关键字必须为不可变类型,且不能重复。
3、创建空字典使用 { }。
bytes 类型
bytes 类型中的元素是整数值,因此在进行比较操作时需要使用相应的整数值。