python学习笔记
写在前面:本篇文章内容只是当前阶段的理解, 不做任何准确性的保证。
赋值表达式与函数传参
python的赋值表达式没有返回值
a = (b = 10)
- 该表达式将报错
python以赋值表达式进行函数传参时,左值必须是函数的一个形参
def calc(a, b):
print(a)
print(b)
print(a+b)
calc(10, 20)
# output:
# 10
# 20
# 30
calc(b=10, a=20)
# output:
# 20
# 10
# 30
- 由上例可知,以赋值表达式传参时,不以顺序进行识别,而以形参标识符进行识别
calc(10, a=20)
- 若以此形式传参,则报
TypeError: calc() got multiple values for argument 'a'
错误
变量id与参数传递
- python中变量创建时会有一个id(相当于c的内存地址)
- python中数据类型分为不可变类型与可变类型:
- 不可变类型:Number, String, Tuple
- 可变类型:List, Dictionary, Set
- python中不可变数据类型有驻留机制:
- 变量创建时得到的id,可以理解为对应数据类型存储的内存地址
123
a = 123 print(id(a))
- 此时的输出结果即为系统为整数123分配的内存地址
a = 123 b = 123 print(id(a)) print(id(b))
- 此时输出的a与b的id相同,都是系统为整数123分配的内存地址
a = 123 b = 123 print(id(a)) print(id(b)) a = 234 print(id(a))
- 此时最后a的id改变,事实上变为了系统为整数234分配的内存地址
- 可变数据类型没有驻留机制
a = [1, 2, 3] b = [1, 2, 3] print(id(a)) print(id(b))
- 此时输出的a与b的id不同
- 函数参数传递时,所有形参id都为对应实参id,即可变数据类型都可对实参本身进行修改,而不可变数据类型在重新赋值后,都将变为新的数据的id。
必需参数&默认值参数,位置参数&关键字参数
- 所谓必需参数与默认值参数,是对形参而言的,即形参列表中,有默认值的即为默认值参数,在传参时,如果不为其传值,则其使用默认值;无默认值的则为必需参数,在传参时,必须为其传值
- 位置参数与关键字参数,是对实参而言的,传参时以值传递的实参为位置参数,以赋值表达式传递的实参为关键字参数
- 形参列表中
*a
,代表此处可传递个数可变的位置参数,其后不能再出现其它必需参数,在函数体内,变量a
为元组 - 形参列表中
**a
,代表此处可传递个数可变的关键字参数,其后不能再出现其它形参,在函数体内,变量a
为字典
def test(*args, **kwargs): print(args) print(kwargs) test(10, a=10, b=10.) # output: # (10,) # {'a': 10, 'b': 10.0}
- 形参列表中,
*
可以单独出现,若出现*
号,则其后传入必须为关键字参数
def test(a, b, *, c): print(a) print(b) print(c) # test(10, 20, 30, 40, 50, c=60) 将报错 test(10, 20, c = 30) # output: # 10 # 20 # 30
- 形参列表中,若出现
/
号,则其前面的实参必须使用位置参数(python3.8新特性)
def test(a, b=10, /, *, c): print(a) print(b) print(c) test(10, c=30) # output: # 10 # 10 # 30 test(10, 20, c=30) # output: # 10 # 20 # 30
/
与*
之间的实参,既可以是位置参数,也可以是关键字参数- 形参列表中,在
*
之前,默认值参数后面不能有必需参数 - 在传递实参时,
*
将序列中的每个元素转换为位置参数,**
将字典中的每个键值对转换为关键字参数
- 形参列表中