代码改变世界

python3 - 生成器-装饰器-闭包-lambda表达式

2018-03-16 09:06  菜鸟Alex  阅读(345)  评论(0编辑  收藏  举报

1. lambda 当一个函数只需要在一个地方或者个别地方使用使用次数并不多的情况下可以用lambda表达式例如:

  • 计算一个list元素之和reduce(lambda x,y:x+y, [1, 2, 4])
  • 将函数赋值给一个变量:func_t = lambda x:x+5,func_t(5) (func_t函数接收一个变量x,并且将x增加5并返回)
  • 数组筛选:list(filter(lambda x:x%3 == 0, list_t)),选出数组中被3整除的数,返回一个list

2. 生成器: yield生成器, 相当于return, 不可同时用, 生成一个可迭代对象, 可以是一个函数,

def eat():
    print('汉堡1')
    yield 1 # 第一次调用打印并返回1
    print('鸡腿')
    yield 2 # 第二次调用打印并返回2
func_t = eat()
func_t.__next__() # 调用方式
  • 当打印出鸡腿后再次调用func_t.__next__()导致错误正确连续调用方式用try...expect
while True:
    try:
        func_t.__next__()
    except StopIteration:
        print('stop')
        break

3. 装饰器: 某个函数func_t可以加工成各种需要的功能函数(或者说func_t是一个强大的公共的功能,其他函数都需要func_t功能,由func_t+其他一些代码组成另一个功能函数), 将func_t作为传入参数加工,并返回一个func_a函数,函数名即可调用

def eat(func_in):
    def func_r():
        print('world')
        func_in()
    return func_r
@eat # 被eat装饰,此函数为传入eat(func_in=printHelloWorld),的函数,eat()返回的func_r即为新得到的函数
def printHelloWorld():
    print('hello')
func_f = printHelloWorld() # 生成一个新的函数
func_f #调用 打印结果world hello

4. 闭包: 一个变量被封装在函数中,并且此变量可以改变,重复利用.返回一个在函数中的函数,并且被传递进来的变量被封装在被返回的函数中.

def say(name):
    def hello(time):
        print(name, time)
    return hello
fun = say('adam') # 将变量adam以闭包的形式传递给say,并返回hello函数
fun('下午好') # 相当于hello函数调用hello('下午好') 结果adam 下午好