*args 和 **kwargs
定义函数的时候, *args 和 **kwargs作为收集参数使用, 也就是分别将传递的参数收集到这个里面去
调用函数的时候, *args 和 **kwargs作为解参数使用, 也就是在调用的时候将一堆定好的参数解散在调用的参数括号
# 定义函数的时候
def eat(*args, **kwargs):
print(args, kwargs)
if __name__ == '__main__':
eat('Rice', 'Fish', Fruit='Apple', Staple='Corn')
# ('Rice', 'Fish') {'Fruit': 'Apple', 'Staple': 'Corn'}
args = ('Rice', 'Fish')
params = {"hello": 1, "world": 2}
# 调用的时候
eat(*args, **params)
eat(*('Rice', 'Fish'), **{"hello": 1, "world": 2})
# ('Rice', 'Fish') {'hello': 1, 'world': 2}
函数返回None,一值和返回多值
def add(x,y):
sum=x+y
return sum
a1 = add(1,2)
print(a1)
#3
a2 = add(add(1,2),3)
print(a2)
# 6
#将函数返回值作为参数,由内到外
#没返回return ,返回None
def foo():
'''hello test'''
print("hello")
print(foo())
print(foo.__doc__)
#一个返回,返回值
def add(x,y):
sum=x+y
return sum
print(add(1,2))
#多返回,返回元组
def dao(x):
'''
the function is test
'''
return 1,2,3,{"name","alex"},["hello",1,3]
dao1 = dao(2)
print(dao1) #多返回值,返回元组
# (1, 2, 3, {'alex', 'name'}, ['hello', 1, 3])
# 如果需要取出来,就依次赋值
a,b,c,d,e=dao(3)
print(a)
print(b)
print(c)
print(d)
print(e)
def tell_cmd():
msg='''
1 look
2 buy
'''
print(msg)
x='male'
def register(sex=x):
print(sex)
#-----------------------调用阶段
register()
x=[]
def register1(name,name_list=x):
name_list.append(name)
#-----------------------调用阶段
register1('hello')
register1('world')
register1('ada')
print(x)
#都在搞全局变量的值
def my_sum(*nums):
res=0
for i in nums:
res+=i
print(my_sum(1,2,3,4,5,6,7))
函数传参的时候需要注意的事项:
def reg(username,password,sex="male"):
print("username,password,sex 分别是:",username,password,sex)
def fun(*args,**kwargs):
print("args:",args)
print("kwargs:",kwargs)
reg(*args,**kwargs)
fun("alex","123456")
# args: ('alex', '123456')
# kwargs: {}
# username,password,sex 分别是: alex 123456 male
fun("egon","123456","female")
# args: ('egon', '123456', 'female')
# kwargs: {}
# username,password,sex 分别是: egon 123456 female
fun(username="adamander",password="23456")
# args: ()
# kwargs: {'password': '23456', 'username': 'adamander'}
# username,password,sex 分别是: adamander 23456 male
# 在上面可以总结出,args将一般位置参数作为元组,kwargs接收关键字参数作为字典
# 函数传值的时候,你可以只按照位置传值
# 函数传值的时候,你可以只按照关键字传值
# 函数传值的时候,你可以混合位置和关键字传值,但是要注意位置传值要放在按关键字传值前面,而且参数会覆盖函数中默认值