zoukankan      html  css  js  c++  java
  • python-生成器,闭包,装饰器

    生成器第一种方式:
    a = (i for i in range(10))
    next(a)或者for循环取数
    第二种:函数内有yield,yield相当于两步:1、程序停止,2、return yield后边的值
    例如:
    def fib4():
    print("---start---")
    a, b = 0, 1
    for i in range(5):
    print("---1---")
    yield b
    print("---2---")
    a, b = b, a + b
    print("---stop---")

    a = fib4()
    a.send("测试")相当于将"测试"赋值给yield b这个整体
    a.send(None)或者先调用一次next()后再调用send()

    闭包:
    函数内定义函数,return内部函数的引用
    例:
    def test1(num):
    def test1_in(num_in):
    print(num+num_in)
    return test_in

    ret = test1(100)
    ret(100)

    def line(a,b):
    def line_in(x):
    return a*x+b
    return line
    line1 = line(1,2)
    y = line1(5)
    print(y)

    装饰器:装饰函数
    只要解释器执行到了装饰器就会自动进行装饰,而不是等到调用的时候才装饰
    多个装饰器同时装饰一个函数时,实际上是从下往上装饰
    def auth(func):
    def inner():
    print("auth")
    func()
    return inner

    @auth
    def f1():
    print("f1")

    @auth
    def f2():
    print("f2")

    f1()
    f2()

    例:
    def w1(func):
    def inner():
    func()
    return inner
    @w1
    def f1():
    print("f1)

    例:
    def w1(func):
    print("正在装饰w1")

    def inner():
    print("正在调用w1")
    func()

    return inner


    def w2(func):
    print("正在装饰w2")

    def inner():
    print("正在调用w2")
    func()

    return inner


    @w1
    @w2
    def f3():
    print("f3")

    结果:
    正在装饰w2
    正在装饰w1
    正在调用w1
    正在调用w2
    f3

    通用装饰器
    类装饰器
    class Test():
    def __call__(self):
    print("---test---)

    t = Test()
    t()

  • 相关阅读:
    HDU 1452
    POJ 1845
    POJ 2992
    POJ 3358
    POJ 3696
    POJ 3090
    POJ 2478
    2016大连网络赛 Football Games
    2016大连网络赛 Function
    2016大连网络赛 Sparse Graph
  • 原文地址:https://www.cnblogs.com/ClarenceSun/p/14766434.html
Copyright © 2011-2022 走看看