zoukankan      html  css  js  c++  java
  • python 三大器

    三大器

    python 三大器
    迭代器:  有__iter__()和__next__()方法
    生成器:函数中将return换成yield 
    装饰器:闭包的本质
    

    迭代器

    # 迭代器 拥有__iter__()和__next__()方法
    # 先将可迭代对象赋值一个新的变量转成迭代器
    # 每次都返回一个值
    # 一个__next__()对应一个输出结果
    s = "1234"
    new_s = s.__iter__()
    print(new_s.__next__())# 输出1
    print(new_s.__next__())# 输出2
    
    # 变量名 = 可迭代对象
    # 新赋值的变量名 = 变量名.__iter__() # 装成迭代器
    # print(新赋值的变量名.__next__())
    

    生成器

    # 生成器 函数中将return改成yield的函数
    def func():
        print(1)
        yield 2
    g = func()
    print(next(g))
    
    # def 函数名():
    #     print(输出)
    #     yield 返回值
    # 新的函数名 = 调用函数名()
    # print(next(新的函数名))
    
    # yield from 将可迭代对象逐行输出 节省空间
    

    装饰器

    # 闭包
    def func():
        a = 11
        def foo():
            print(a)
        return foo
    ret = func()
    print(ret.__closure__)# 返回内存地址
    
    def func():
        a = 11
        def foo():
            print(a)
        return foo
    func()()
    print(func.__closure__)# 返回None
    
    
    # 递归 不断自己调用自己,有明确终止条件
    def age(n):
        if n == 4:
            return 18
        else:
            return age(n+1)-2
    print(age(1))# 输出12
    
    # 将age"1"的实参传给age"n"形参
    # if 1!=4,执行else
    # else return age(1+1)=2
    # 直到4==4,return18
    # 18反给age(3),18-2=16
    # 一直反age(2),16-2=14  age(1),14-12=12
    # age(1)=12
    
    
    # 装饰器 在不改变源代码和调用方法的基础上增加新功能
    # 将闭包的参数换成函数名
    def func(f):
        def foo(*args,**kwargs):
            print("装饰器")
            return f()
        return foo
    @func
    # @函数名 语法糖 相当于 f=func(f)
    def index():
        print(123)
        return 456
    print(index())
    # 输出 装饰器 123 456
    
    # def 外层函数(参数):
    #     def 内层函数(动态参数,形参):
    #         print()
    #         return 参数()
    #     return 内层函数
    # @外层函数
    # def 源函数():
    #     print()
    #     return
    # print(源函数())
    
    
  • 相关阅读:
    [转]Javascript中prototype和constructor详解
    [转]SCIM输入启动遭遇“Failed to load x11 FrontEnd module. ”错误
    [转]搭建高效的symbols服务器
    编译 boost 1.52.0
    opensuse 11.4 安装slickedit 2012 完美支持中文
    【转】MyEclipse 6.5 大提速
    [转]VS2005生成pdb签名的问题
    理解泛型 从需求演变开始
    数学中一个很简单的组合 但用程序如何去实现呢?
    从零开始开发服务器控件
  • 原文地址:https://www.cnblogs.com/zhangshan33/p/11211553.html
Copyright © 2011-2022 走看看