python——4种函数参数

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

InceptionZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>