继续说
4.未知类型,未知个数参数
(*args)可以表示整型,浮点型,字符串,列表,元组等参数。例子①:
def func_1(*args):
print(args)
print(*args)
func_1(1,4.44444,'abc',[1,'扒点刚货'],(2,'badianganghuo'))
执行结果:
(1, 4.44444, 'abc', [1, '扒点刚货'], (2, 'badianganghuo'))
1 4.44444 abc [1, '扒点刚货'] (2, 'badianganghuo')
(**args)表示字典类型参数。调用函数传递参数的时候,表示方法为(键 = 值)。例子②:
def func_2(a,b,**kwargs):
print(a)
print(b)
print(kwargs)
func_2(a = '扒点刚货',b ='badianganghuo',c = '扒点刚货',d ='badianganghuo')
执行结果:
扒点刚货
badianganghuo
{'c': '扒点刚货', 'd': 'badianganghuo'}
综上:当参数都是未知的时候,一般写成(*args, **kwargs)。
综合例子:
def func_3(*args, **kwargs):
print(args)
print(kwargs)
func_3(1,4.44444,'abc',[1,'扒点刚货'],(2,'badianganghuo'),a='扒点刚货', b='badianganghuo')
执行结果:
(1, 4.44444, 'abc', [1, '扒点刚货'], (2, 'badianganghuo'))
{'a': '扒点刚货', 'b': 'badianganghuo'}
三、内嵌函数
在函数体内创建另外一个函数(对象)是合法的,这种函数叫内部/内嵌函数。
1.普通内嵌
例子:
def foo():
def bar():
print('bar() called')
print('foo() called')
bar()
foo()
执行结果:
foo() called
bar() called
2.闭包
如果内部函数引用了函数外定义的对象,此时把这个特别的内部函数叫做闭包。例子:
num_1 = 1
def func_1():
num_2 = 2
def func_2():
num_3 = num_1 + num_2
print('{}加上{}等于{}'.format(num_1,num_2,num_3))
return func_2
fun = func_1()
fun()
执行结果:
1加上2等于3
注意:fun = func_1()是调用外部函数,并且复制给fun,因为func_1返回值为func_2(类似于一个变量名),随意fun等同于func_2,func_2()就是调用内部函数。
四、函数装饰器
装饰器是在函数调用之上的装饰。当不想改变已经定义好的函数名称,且要对该函数进行加工的时候,可以使用函数装饰器。
比如当一个函数func1在很多地方被调用,现在要调用它,可是又得需要对它进行一些改变,就可以使用函数装饰器。
1.函数装饰器语法
@decorator(dec_opt_args)
def fun2Bdecorated(func_opt_args):
...
装饰器的语法是用@开头,接着是装饰器的函数的名字和可选的参数,紧跟着装饰器声明的是被修饰的函数和装饰器函数的可选参数。
例子:
def decor(func):
print('start')
func()
print('有10000粉丝')
print('是个成熟的公众号')
print('end')
#return wrapper
@decor
def func_2():
#已知函数,不建议更改
print('我是扒点刚货')
执行结果:
start
我是扒点刚货
有10000粉丝
是个成熟的公众号
end
时间有限,明天详细展开多个函数装饰器共同使用,装饰器规范写法,以及多个装饰器的参数传递,多层返回值等。