函数参数中有默认值,在函数内部会创建一块区域并维护这个默认值
# 在函数内存中会维护一块区域存储 [1,2,666,666,666] 100010001
def func(a1,a2=[]):
a2.append(666)
print(a1,a2)
func(100)
func(1000)
100 [666]
1000 [666, 666]
def func(a1,a2=[]):
a2.append(666)
print(a1,a2)
func(100)
func(1000,[2])
func(1000)
100 [666]
1000 [2, 666]
1000 [666, 666]
def func(a1, a2=[1, 2]):
a2.append(a1)
return a2
v1 = func(10)
print(v1) # [1, 2, 10]
v2 = func(20)
print(v2) # [1, 2, 10, 20 ]
v3 = func(30, [11, 22])
print(v3) # [11, 22,30]
v4 = func(40)
print(v4) # [1, 2, 10, 20,40 ]
[1, 2, 10]
[1, 2, 10, 20]
[11, 22, 30]
[1, 2, 10, 20, 40]
动态传参数
def func(a1,a2):
print(a1,a2)
func(11,23)
func(a1=1, a2=2)
func(*[11,22])
func(**{'a1':1,'a2':2})
11 23
1 2
11 22
1 2
形参*和**
def func(*args,**kwargs):
print(args,kwargs)
func(11, 22)
func(11, 22, {'k1':1, 'k2':2})
func(11,22,name='黑驴')
func(*[11,22,33], **{'k1':1,'k2':2})
(11, 22) {}
(11, 22, {‘k1’: 1, ‘k2’: 2}) {}
(11, 22) {‘name’: ‘黑驴’}
(11, 22, 33) {‘k1’: 1, ‘k2’: 2}
format字符串
print('我是:{},年龄:{}'.format('大黑驴',25))
print('我是:{name},年龄:{age}'.format(name='中老黑', age=23))
print('我是:{},年龄:{}'.format(*('小黑驴',23)))
print('我是:{name},年龄:{age}'.format(**{'name':'宿舍黑驴', 'age':25}))
我是:大黑驴,年龄:25
我是:中老黑,年龄:23
我是:小黑驴,年龄:23
我是:宿舍黑驴,年龄:25
闭包与装饰器案例
def outer(origin):
def inner():
print('before 110')
res = origin()
print('after')
return res
return inner
@outer
def func1():
print('我是func1函数')
value = (11, 22, 33, 44)
return value
@outer
def func2():
print('我是func2函数')
value = (11, 22, 33, 44)
return value
@outer
def func3():
print('我是func3函数')
value = (11, 22, 33, 44)
return value
func1()
func2()
func3()
before 110
我是func1函数
after
before 110
我是func2函数
after
before 110
我是func3函数
after
def outer(origin):
def inner(*args, **kwargs):
print('before 110')
res = origin(*args, **kwargs)
print('after')
return res
return inner
@outer
def func1(a1):
print('我是func1函数')
value = (11, 22, 33, 44)
return value
@outer
def func2(a1, a2):
print('我是func2函数')
value = (11, 22, 33, 44)
return value
@outer
def func3(a1):
print('我是func3函数')
value = (11, 22, 33, 44)
return value
func1(1)
func2(11, a2=22)
func3(999)
before 110
我是func1函数
after
before 110
我是func2函数
after
before 110
我是func3函数
after
wrap函数,抵消装饰器副作用
标准库 functools 中的 wrap 函数用于包装函数, 不改变原有函数的功能, 仅改变原有函数的一些属性, 例如 name, doc, annotations 等属性
def auth(func):
def inner(*args, **kwargs):
return func(*args, **kwargs)
return inner
@auth
def handler():
pass
handler()
print(handler.__name__) # inner
inner
def handler():
pass
handler()
print(handler.__name__) # handler
handler
# 标准库 functools 中的 wrap 函数用于包装函数, 不改变原有函数的功能, 仅改变原有函数的一些属性, 例如 __name__, __doc__, __annotations__ 等属性
import functools
def auth(func):
@functools.wraps(func)
def inner(*args, **kwargs):
return func(*args, **kwargs)
return inner
@auth
def handler():
pass
handler()
print(handler.__name__) # handler
handler