欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

生成器、装饰器(闭包)

程序员文章站 2022-06-11 22:05:54
...

#生成器是特殊的迭代器,一遍循环一遍计算的机制

# g = (x for x in range(10))
# #for i in g:
# # print(i)
#
# print(next(g))
def fb(month):
    m= 0
    a,b = 0,1
    while m<month:
        # print(b)
        yield b   #生成器的核心
        # return b  #return 不能用,后面不运行
        a,b = b,a+b
        m +=1
        # print(a,b)
if __name__ == '__main__':
    ret =fb(5)
    print(type(ret))
    # for item in ret:
    # print(item)

    # print(next(ret))
    # print(next(ret))
    # print(next(ret))
    # print(next(ret))

    # next(ret)   #可以用next传值唤醒生成器
    # ret.send(None)  #send第一次传值为none,唤醒生成器,第一次不能传值
    # # 再用send传值

#装饰器

# def func1():
#     print('这是函数func1')
#
# if __name__ == '__main__':
#     func1()
#     func2 =func1
#     print(id(func1))
#     print(id(func2))
#     func2()
#     #函数的引用就是地址的传递
#     # print(id(1999999))#pycharm中为了提高运行效率,扩大了小整数池的范围,小整数池范围-5到256
#     # print(id(1999999))
#     # print(id(1999999))
#
# #闭包
# # def wrapper(num1):
# #     def inner(num2):
# #         print(num1,num2)
# #     return inner
# #
# # if __name__ == '__main__':
# #     f1 = wrapper(1)
# #     f1(2)
# #     print(f1)
#
# def linner(k,b):
#     def inner(x):
#         print(x*k+b)
#
#     return inner
# if __name__ == '__main__':
#     l = linner(1,2)
#     l(3)
#     print(l)
#闭包存在的问题:消耗内存

#LEGB原则
'''
Local 可能是在一个函数或者类方法内部。
Enclosed 可能是嵌套函数内,比如说 一个函数包裹在另一个函数内部。
Global 代表的是执行脚本自身的最高层次。
Built-in 是Python为自身保留的特殊名称。
'''

def warpper(func):
    def inner():
        # 第一验证  验证是否登录
        # 第二验证  验证是否具有权限
        print(func)
        func()
    return inner

def ordering():
    #第一验证,验证是否登陆
    #第二验证,验证是否有权限

    print('----------正在下单---------')

# @warpper  语法糖
def changepwd():
    print('---------修改密码----------')


def showinfo():
    print('-------个人信息--------')