函数的参数是可以多个的, 那大家有没有想过,我们调用函数的时候,参数顺序是不是不能变的?如果要变化位置,要怎么操作?
在函数定义与调用时,我们可以根据自己的需求来实现参数的传递。在Python中,函数的参数一共有两种形式:① 形参 ② 实参
形参:在函数定义时,所编写的参数就称之为形式参数
实参:在函数调用时,所传递的参数就称之为实际参数
def greet(name): # name就是在函数greet定义时,所编写的参数(形参) return name + ',您好'# 调用函数name = '老王'greet(name) # 在函数调用时,所传递的参数就是实际参数
注意:虽然我们在函数传递时,喜欢使用相同的名称作为参数名称。但是两者的作用范围是不同的。name = '老王',代表实参。其是一个全局变量,而greet(name)函数中的name实际是在函数定义时才声明的变量,所以其实一个局部变量。
理论上,在函数定义时,我们可以为其定义多个参数。但是在函数调用时,我们也应该传递多个参数,正常情况,其要一一对应。
def user_info(name, age, address): print(f'我的名字{name},今年{age}岁了,家里住在{address}')# 调用函数user_info('Tom', 23, '美国纽约')
注意事项:位置参数强调的是参数传递的位置必须一一对应,不能颠倒。
函数调用,通过“键=值”形式加以指定。可以让函数更加清晰、容易使用,同时也清除了参数的顺序需求。
def user_info(name, age, address): print(f'我的名字{name},今年{age}岁了,家里住在{address}')# 调用函数(使用关键词参数)user_info(name='Tom', age=23, address='美国纽约')
缺省参数也叫默认参数,用于定义函数,为参数提供默认值,调用函数时可不传该默认参数的值(注意:所有位置参数必须出现在默认参数前,包括函数定义和调用)。
def user_info(name, age, gender='男'): print(f'我的名字{name},今年{age}岁了,我的性别为{gender}')user_info('李林', 25)user_info('振华', 28)user_info('婉儿', 18, '女')
谨记:我们在定义缺省参数时,一定要把其写在参数列表的最后侧。
不定长参数也叫可变参数。用于不确定调用的时候会传递多少个参数(不传参也可以)的场景。此时,可用包裹(packing)位置参数,或者包裹关键字参数,来进行参数传递,会显得非常方便。
def user_info(*args): print(args) # 元组类型数据,对传递参数有顺序要求 # print(f'我的名字{args[0]},今年{args[1]}岁了,住在{args[2]}')# 调用函数,传递参数user_info('Tom', 23, '美国纽约')
注意:传进的所有参数都会被args变量收集,它会根据传进参数的位置合并为一个元组(tuple),args是元组类型,这就是包裹位置传递。
def user_info(**kwargs): # print(kwargs) # 字典类型数据,对传递参数没有顺序要求,格式要求key = value值 print(f'我的名字{kwargs["name"]},今年{kwargs["age"]}岁了,住在{kwargs["address"]}')# 调用函数,传递参数user_info(name='Tom', address='美国纽约', age=23)
综上:无论是包裹位置传递还是包裹关键字传递,都是一个组包的过程。
Python组包:就是把多个数据组成元组或者字典的过程。
def greet(name, greeting="Hello", punctuation="!"): """ 一个简单的问候函数,演示不同类型的参数 参数: name: 位置参数(必需) greeting: 默认参数,默认为"Hello" punctuation: 默认参数,默认为"!" """ message = f"{greeting}, {name}{punctuation}" print(message)
调用函数,需要输入以下内容:
① 输出: Hi, Alice!!
② 输出: Hey, Bob!
③ 输出: Welcome, Charlie.
④ 输出: Hello, David!