关键字参数、可变参数
decorator - 装饰器/包装器
def say_hello(**kwargs):
print(kwargs)
# 关键字参数
if 'name' in kwargs:
print('你好,%s!' % kwargs['name'])
elif 'age' in kwargs:
age = kwargs['age']
if age <= 16:
print('你还是个小屁孩')
else:
print('你是一个成年人')
else:
print('请提供个人信息!')
# 可变参数
def my_sum(*args):
total = 0
for val in args:
total += val
return total
# 命名关键字参数
# 后面调用函数时*号后面的需要传入关键字才会生效
def foo(a, b, c, *, name, age):
print(a + b + c)
print(name,':', age)
def main():
say_hello(name='念阳枭', age='23', qq='654321', gender=True)
param = {'name':'刘闯','age':24,'tel':'12345678'}
# 如果希望将一个字典作为关键字参数传入,需要在参数前放两个*
say_hello(**param)
foo(1, 2, c=3, name='念', age=25)
def my_sum(my_list):
total = 0
for val in my_list:
total += val
return total
def my_mul(my_list):
total = 1
for val in my_list:
total *= val
return total
# 高阶函数
# 通过向函数中传入函数,可以写出更通用的代码
# calc函数中的第二个参数是另一个函,它代表了一个二元算法
# 这样calc函数就不需要根某一种特定的二元运算耦合在一起
# 所以calc函数变得通用性更强,可以由传入的第二个参数来决定到底做什么运算
def calc(my_list,op):
total = my_list[0]
for index in range(1, len(my_list)):
total = op(total, my_list[index])
return total
def add(x, y):
return x + y
def mul(x, y):
return x * y
def main():
mylist = [1,2,3,4,5]
print(calc(mylist, add))
print(calc(mylist, mul))
if __name__ == '__main__':
main()
(属性的)包装器/装饰器decorator
# 装饰器语法
def record(fn):
def wrapper(*args, **kwargs):
print('准备执行%s函数...' % fn.__name__)
# print(args)
print(kwargs)
# 此行代码在执行被装饰的函数
# 在这行代码的前后我们可以附加其他的代码
# 这些代码可以让我们在执行函数时做一些额外的工作
val = fn(*args, **kwargs)
print('%s函数执行完成' % fn.__name__)
print('返回了%d' % val)
# 返回被装饰的函数的执行结果
return val
return wrapper
# 通过装饰器修饰f函数,让f函数在执行过程中可以做更多额外的操作
@record # record记录,履历
def f(n):
if n == 0 or n == 1:
return 1
return n * f(n-1)
if __name__ == '__main__':
# fw = record(f)
# print(fw(5))
print(f(5))