zoukankan      html  css  js  c++  java
  • python之路——第二块(装饰器、生成器、迭代器)

    装饰器

    def deco(count):
        def func(num):
            if num < 10:
                count(num)
            else:
                exit()
        return func
    
    @deco
    def count(num):
        a = 0
        for i in range(num):
            a += i
        print(a)
    
    count(11)
    

      

    注:deco(count)和下面的count(num)中的count只是一个形参,count可以用任何变量名替换,但是num是一定要有,因此传入的实参是被装饰函数,被装饰函数有num形参。

    总结:1、装饰器没有修改被装饰函数的源代码和调用方式

       2、用到了高阶函数,把被装饰函数函数名当做实数传入装饰器第一级函数;装饰器第二级函数包含被装饰函数以及要加的新功能,然后将第二级函数的内存地址返回给第一级函数。这样就能达到装饰的效果。

       3、用到了嵌套函数,第一级函数嵌套第二级函数。

    生成器:一边循环一边计算的机制,节省内存空间;只有在调用这个生成器时,才会生成想应的数据。

      首先看一个列表生产式

    a = [i*2 for i in range(10)]        #列表生产式
    print(a)          #直接打印a列表的所有结果
    

      但是如果range()里面是10000的时候,就会占用电脑大量内存,我们需要的仅仅是其中一个数据。此时可以用生成器

    b = (i*2 for i in range(10))   #生成器
    print(b)      #打印的是内存地址
    

      此时,b就是生成器,打印b显示的是内存地址,可用_next_方法

    print(b.__next__())   #0
    print(b.__next__())   #2
    print(b.__next__())   #4
    

    除了这种列表生产器,还可以把函数改装生成器,比如下面一个斐波那契函数

    def fei(max):              #斐波那契额函数
        a,b,n = 0,1,0
        while n < max:
            print(b)
            a,b = b,a+b
            n += 1
    

      调用这个函数,输出的是整个斐波那契列表,但是可以把print(b)改成yield b的方法,把函数变成生成器。

    def feib(max):
        a,b,n = 0,1,0
        while n < max:
            yield b            #将print 改为 yield 变成斐波那契生成器
            a,b = b,a+b
            n += 1
    f = feib(10)
    print(f.__next__())   #1
    print(f.__next__())   #1
    print(f.__next__())   #2
    

      可以用for的方法,来输出生产器的所有结果

    for i in fei(10):
        print(i)
    

      输出的结果和

    f = fei(10)
    

      的结果一样

    可迭代对象:可以直接作用于for循环的对象统称为可迭代对象:Iterable

    迭代器:可以被_next_()函数调用并不断返回下一个值的对象称为迭代器:Iterator

    1、可以使用isinstance()判断一个对象是否是Iterable对象

    2、集合数据类型,如listtupledictsetstr等可以使用for循环,但是不具有_next_()方法,使用只属于可迭代对象,不属于迭代器

    所以,生成器属于迭代器,也属于可迭代对象,但是迭代器不一定是生成器。

  • 相关阅读:
    time 模块学习
    day 14 自定义模块,常用模块 time .datetime ,time 模块
    day 13 课后作业
    day 12 课后作业
    day 11课后作业
    树状数组最值
    hdu 1059 Dividing bitset 多重背包
    XVII Open Cup named after E.V. Pankratiev. XXI Ural Championship
    最长公共子序列板/滚动 N^2
    Uva 10635
  • 原文地址:https://www.cnblogs.com/japhi/p/6924538.html
Copyright © 2011-2022 走看看