zoukankan      html  css  js  c++  java
  • python杂记-4(迭代器&生成器)

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    #1、迭代器&生成器
    #生成器
    #正确的方法是使用for循环,因为generator也是可迭代对象:
    g = (x*x for x in range(10))
    for n in g:
    print(n)
    #斐波拉契数列(Fibonacci),除第一个和第二个数外,任意一个数都可由前两个数相加得到:
    #1, 1, 2, 3, 5, 8, 13, 21, 34, ...
    #斐波拉契数列用列表生成式写不出来,但是,用函数把它打印出来却很容易:
    def fib(max):
    n,a,b = 0,0,1
    while n < max:
    print(b)
    a,b = b,a + b
    n = n + 1
    return 'done'
    print(fib(10))
    #上面的函数和generator仅一步之遥。要把fib函数变成generator,只需要把print(b)改为yield b就可以了:
    def fib(max):
    n,a,b = 0,0,1

    while n < max:
    #print(b)
    yield b
    a,b = b,a+b

    n += 1
    return 'done'
    #generator的执行
    data = fib(10)
    print(data)
    print(data.__next__())
    print(data.__next__())
    print('干点别的事')
    print(data.__next__())
    print(data.__next__())
    print(data.__next__())
    print(data.__next__())
    print(data.__next__())
    #函数改成generator后,我们基本上从来不会用next()来获取下一个返回值,而是直接使用for循环来迭代:
    for n in fib(6):
    print(n)
    #但是用for循环调用generator时,发现拿不到generator的return语句的返回值。如果想要拿到返回值,必须捕获StopIteration错误,返回值包含在StopIteration的value中:
    g = fib(6)
    while True:
    try:
    x = next(g)
    print('g:',x)
    except StopIteration as e:
    print('Generator return value:done')
    break
    #还可通过yield实现在单线程的情况下实现并发运算的效果
    #C:UserssonyPycharmProjectss13 ewprogrammingyieldyield.py
    #迭代器
    #我们已经知道,可以直接作用于for循环的数据类型有以下几种:
    #一类是集合数据类型,如list、tuple、dict、set、str等;
    #一类是generator,包括生成器和带yield的generator function。
    #这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。
    #可以使用isinstance()判断一个对象是否是Iterable对象:
    from collections import Iterable
    print(isinstance([], Iterable))
    print(isinstance({}, Iterable))
    print(isinstance('abc', Iterable))
    print(isinstance((x for x in range(10)), Iterable))
    print(isinstance(100, Iterable))
    #*可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
    #可以使用isinstance()判断一个对象是否是Iterator对象:
    from collections import Iterator
    print(isinstance((x for x in range(10)), Iterator))
    print(isinstance([], Iterator))
    print(isinstance({}, Iterator))
    print(isinstance('abc', Iterator))
    #生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator。
    #把list、dict、str等Iterable变成Iterator可以使用iter()函数:
    print(isinstance(iter([]),Iterator))
    print(isinstance(iter(['abc']),Iterator))
    #凡是可作用于for循环的对象都是Iterable类型;
    #凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;
    #集合数据类型如list、dict、str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。
    #Python的for循环本质上就是通过不断调用next()函数实现的,如:
    for x in [1,2,3,4,5]:
    pass
    #等同于
    # 首先获得Iterator对象:
    it = iter([1, 2, 3, 4, 5])
    # 循环:
    while True:
    try:
    # 获得下一个值:
    x = next(it)
    except StopIteration:
    # 遇到StopIteration就退出循环
    break

    #装饰器
    def w1(func):
    def inner():
    # 验证1
    # 验证2
    # 验证3
    return func()

    return inner

    @w1
    def f1():
    print(f1)
    @w1
    def f2():
    print(f2)
    @w1
    def f3():
    print(f3)
    @w1
    def f4():
    print(f4)

    当写完这段代码后(函数未被执行、未被执行、未被执行),python解释器就会从上到下解释代码,步骤如下:

    1. def w1(func):  ==>将w1函数加载到内存
    2. @w1

    没错,从表面上看解释器仅仅会解释这两句代码,因为函数在没有被调用之前其内部代码不会被执行。

    从表面上看解释器着实会执行这两句,但是 @w1 这一句代码里却有大文章,@函数名 是python的一种语法糖。

    如上例@w1内部会执行一下操作:

      • 执行w1函数,并将 @w1 下面的 函数 作为w1函数的参数,即:@w1 等价于 w1(f1)
        所以,内部就会去执行:
            def inner:
                #验证
                return f1()   # func是参数,此时 func 等于 f1
            return inner     # 返回的 inner,inner代表的是函数,非执行函数
        其实就是将原来的 f1 函数塞进另外一个函数中
      • 将执行完的 w1 函数返回值赋值给@w1下面的函数的函数名
        w1函数的返回值是:
           def inner:
                #验证
                return 原来f1()  # 此处的 f1 表示原来的f1函数
        然后,将此返回值再重新赋值给 f1,即:
        新f1 = def inner:
                    #验证
                    return 原来f1() 
        所以,以后业务部门想要执行 f1 函数时,就会执行 新f1 函数,在 新f1 函数内部先执行验证,再执行原来的f1函数,然后将 原来f1 函数的返回值 返回给了业务调用者。
        如此一来, 即执行了验证的功能,又执行了原来f1函数的内容,并将原f1函数返回值 返回给业务调用着
  • 相关阅读:
    java Metaspace频繁FGC问题定位(转载)
    JVM内存模型详解(转载)
    56. Merge Intervals
    begin again
    55. Jump Game
    54. Spiral Matrix
    53. Maximum Subarray
    52. N-Queens II
    51. N-Queens
    1. 赋值运算符函数
  • 原文地址:https://www.cnblogs.com/LS-blog/p/6023022.html
Copyright © 2011-2022 走看看