1. 位置参数(positional argument)
- 注意事项:调用时,位置参数的顺序不能混乱
def user_info(name,age,gender):
print(f'姓名{name},年龄{age},性别{gender}')
user_info('Tom','20','male')
2. 关键字参数(keyword argument)
- 函数调用时,通过“key-value”形式加以指定。可以让函数更加清晰,同时清除了参数的顺序需求
- 注意事项:函数调用时,如果同时存在位置参数和关键字参数时,位置参数必须在关键字参数的前面,但关键字之间不存在先后顺序。如果位置参数出现在了关键字参数后面,则会引起:
SyntaxError : Positional argument follows keyword argument
def user_info(name,age,gender):
print(f'姓名{name},年龄{age},性别{gender}')
user_info('Rose',age=20,gender='female') # √
user_info('Rose',gender='male',age=20) # √
3. 缺省参数
- 缺省参数也叫默认参数,用于定义函数,为参数提供默认值,调用函数时可以不传该默认参数的值
- 注意事项:
①所有的位置参数必须出现在默认参数前,包括函数定义和调用;
②函数调用时,如果为缺省参数传值,则修改默认参数值;否则使用默认值
def user_info(name,age,gender='male '):
print(f'姓名{name},年龄{age},性别{gender}')
user_info('Tom',20)
user_info('Rose',20,gener='female')
4. 不定长参数(可变参数)
- 不定长参数也叫可变参数。用于不确定调用的时候会传递多少个参数(不传参也可以)的场景。此时们可以用包裹(pack)位置参数,或者包裹关键字参数,来进行参数的传递。
4.1 包裹位置参数
- 注意事项:传进的所有参数都会被args变量收集,他会根据传进参数的位置合并为一个元组(组包的过程)
# *args接收所有位置参数,返回一个元组
def user_info(*arg):
print(arg)
user_info('TOM') # ('TOM',)
user_info('TOM',20) # ('TOM',20)
user_info() # ()
4.2 包裹关键字参数
- 注意事项:传进的所有参数都会被kwargs变量收集,他会根据传进参数的关键字合并为一个字典(组包的过程)
# **kwargs接收所有关键字参数,返回一个字典
def user_info(**kwargs):
print(kwargs)
user_info(name='TOM',age=20,id=110) # {'name':'TOM','age':18,'id'=110}
5. 传入参数的方式
5.1 回顾可变类型和不可变类型
可变类型:修改数据内容,数据的地址没有发生改变{列表,字典,集合}
不可变类型:修改数据内容,数据的地址发生了改变{整型,浮点型,字符串,元组(相对不可变)}
5.2 共享传参
Python唯一支持的参数传递方式是共享传参(call by sharing)或者说是对象引用传递
多数面向对象语言都采用这一模式,包括Ruby、Smalltalk和Java(Java的引用类型是这样,基本类型按值传递)
共享传参是指函数的各个形式参数获得实参中各个引用的副本;也就是说,函数内部的形参是实参的别名(alias),所以传参穿的都是引用而不是数据本身(即本质传递的是对象的地址)。
这种方案的结果是,函数可能会修改作为参数传入的可变对象,但是无法修改那些对象的标识(即不能把一个对象替换为另一个对象)
5.2.1 传入可变参数
以列表举例,这里传入函数的为列表为可变类型数据,向函数传递的是a引用的副本,也就是a的别名b,根据可变类型的特点,他将改变原数据a
a = [1,2,3]
def test(b):
b.append(4)
test(a)
print(a) # [1,2,3,4]
5.2.2 传入不可变参数
传入函数的为整型数据,是不可变类型,所以原数据没有改变
a = 1
def test(b):
b += 1
print(b)
test(a) # 2
print(a) # 1
459

被折叠的 条评论
为什么被折叠?



