def hhh(a,b) :
print("老师真漂亮")
hhh(1,2)
hhh(a=1,b=2)
"""
普通函数传参时一般就两种:
1.默认位置匹配
2.形参作关键字参数的键,后面接传入的值
def fack(a,b):
print(a)
print(b)
fack(args=(1,2))也报错,普通定义函数不能像多进程多线程那里“可变参数形式”传参
"""
可变元组形参
# 可变元组形参
def fack(*a):#这里我没设普通参数
print(a)
args=(1,2)
args1=[1,2]
args2="我爱你直到海枯石烂,地老天荒"
#直接fack(*args=(1,2))报错,fack(args=(1,2))也报错
fack(*args)
fack(*args1)
fack(*args2)
fack(args)
fack(args1)
fack(args2)
fack((1,2))
fack(*(1,2))
fack([1,2])
fack(*[1,2])
fack("我爱你直到海枯石烂,地老天荒")
fack(*"我爱你直到海枯石烂,地老天荒")
"""
(1, 2)
(1, 2)
('我', '爱', '你', '直', '到', '海', '枯', '石', '烂', ',', '地', '老', '天', '荒')
((1, 2),)
([1, 2],)
('我爱你直到海枯石烂,地老天荒',)
((1, 2),)
(1, 2)
([1, 2],)
(1, 2)
('我爱你直到海枯石烂,地老天荒',)
('我', '爱', '你', '直', '到', '海', '枯', '石', '烂', ',', '地', '老', '天', '荒')
这种输出说明可变元组参数形参定义的函数传入某容器实参时如果没星号就会当成一个容器元素传入可变元组前面的普通形参或者可变元组形参中
有单星号就会按照位置搜索容器里面的元素解包,之后传入函数按照位置匹配(这个时候如果可变元组形参前面有普通形参就会先匹配),
剩下未匹配元素组成新元组(默认的和可变元组形参都是从左向右按位置匹配),可变元组形参会直接指向新元组
这个容器可以是三种序列,应该还可以是别的可迭代对象...
这个单星号解包容器不是可变元组形参特有的,普通形参(普通函数)也可以接收解包后各元素的位置参数匹配
传入一个单星号解包的容器等效于传入一堆离散的位置匹配参数
传入一个双星号解包的字典等效于传入一堆 ”键等于值对“,这玩意也叫“关键字参数”
"""
可变字典形参
#可变字典形参
def printStr(first, **dict):
print(str(first) + "\n")
print(dict)
printDic = {"name": "tyson", "age": "99"}
printStr(100, **printDic)
# 等同于
printStr(100, name="tyson", age="99")
"""
第一个printStr会把printDic字典解包成 name="tyson", age="99"这俩关键字参数(应该是可变字典参数不能直接传入键值对,只能关键字参数,不是会报错),
然后传入函数后,普通形参按照位置匹配完后,就由可变字典形参转换成新字典,然后可变字典参数指向它
"""
当lambda函数遇上可变元组参数:
f=lambda *args:print(args.__class__.__name__)
f(1,2,3,4)
输出:tuple
说明这个*args就是可变元组参数,args这个局部变量指向的是位置匹配后剩下未匹配的1 2 3 4四个元素组成的新元组
更详细请见:
lambda函数详解:
需要简单函数作为某函数参数或者返回值(嵌套函数)的时候常用lambda函数