zoukankan      html  css  js  c++  java
  • 列表生成式的复习以及生成器的练习, 杨辉三角实例(非常巧妙)

    列表生成式

    print('昨日复习--------------------')
    d = {'a':1, 'b':2, 'c':3}
    for key in d:
        print(key)
        
    for value in d.values():
        print(value)
        
    for k, v in d.items():
        print(k, v)
        
    for ch in 'ABC':
        print(ch)
             
    from collections import Iterable
    t = isinstance(123, Iterable) #检查是否可迭代,返回值为布尔类型的
    print(t)
    
    for i, value in enumerate(['A', 'B', 'C']):
        print(i, value)
        
    for x, y in [(1, 1), (2, 4), (3, 9)]:
        print(x, y)
       
    L = list(range(100))
    print(L)

    构建生成器

    print('构建生成器--------------------')
    #通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。
    
    #所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。
    L = [x*x for x in range(10)]
    print(L)
    G = (x * x for x in range(10))
    print(G)
    #如果要一个一个打印出来,可以通过next()函数获得generator的下一个返回值:
    print(next(G))
    print(next(G))
    print(next(G))
    print(next(G))
    print(next(G))
    print(next(G))
    0
    1
    4
    9
    16
    25
    #上面这种不断调用next(g)实在是太变态了,正确的方法是使用for循环,因为generator也是可迭代对象:
    g = (x*x for x in range(10))
    for n in g:
        print(n)

    用函数实现生成器

    print('用函数实现生成器--------------------')
    
    #generator非常强大。如果推算的算法比较复杂,用类似列表生成式的for循环无法实现的时候,还可以用函数来实现。
    def fib(max):
        n, a, b = 0, 0, 1
        while n < max:
            print(b)
            a, b = b, a+b
            n = n + 1
        return 'done'
    #上面的函数可以输出斐波那契数列的前N个数:
    t = fib(6)
    print(t)
    #也就是说,上面的函数和generator仅一步之遥。要把fib函数变成generator,只需要把print(b)改为yield b就可以了:
    def fib(max):
        n, a, b = 0, 0, 1
        while n < max:
            yield(b)
            a, b = b, a+b
            n = n + 1
        return 'done'
    fib(11) #这句话没有执行结果,可以用一个参数接收返回值,然后输出
    #这就是定义generator的另一种方法。如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator:
    f = fib(6)
    print(f)
    #<generator object fib at 0x104feaaa0>
    print('--------------------')
    
    #这里,最难理解的就是generator和函数的执行流程不一样。函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。
    
    #举个简单的例子,定义一个generator,依次返回数字1,3,5:
    def odd():
        print('step 1')
        yield 1
        print('step2')
        yield(3)
        print('step 3')
        yield 5
      
    o = odd()
    print('next输出odd生成器内容--------------------')
    print(next(o))
    print(next(o))
    print(next(o))
    print('迭代输出fib生成器内容--------------------')
    for n in fib(6):
        print(n)
    print('输出带返回值的生成器的所有内容----------')
    
    #但是用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:', e.value)
            break;
        

    杨辉三角的输出

    print('杨辉三角的输出-----------------')
    #天啊, 这代码,太精辟,我无话可说
    
    def fun(n):
        N = [1]
        t = 0
        while t < n:
            yield(N)
            t = t + 1
            N.append(0)
            N = [N[i-1] + N[i] for i in range(len(N))]
    
    for i in fun(6):
        print(i)
    #在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。    
    #执行过程大概如下
    N = 1
    
    N = 1, 0
    
    N = 1, 1
    
    N = 1, 1, 0
    
    N = 1, 2, 1
    
    N = 1, 2, 1, 0
    
    N = 1, 3, 3, 1
    
    N = 1, 3, 3, 1, 0
    
    N = 1, 4, 6, 4, 1
    
    #………………………………

     补充:

    找出一个数据的类型的方法

    a = 1
    print(type(a))
    #<class 'int'>

  • 相关阅读:
    HDU 4278 Faulty Odometer 8进制转10进制
    hdu 4740 The Donkey of Gui Zhou bfs
    hdu 4739 Zhuge Liang's Mines 随机化
    hdu 4738 Caocao's Bridges tarjan
    Codeforces Gym 100187M M. Heaviside Function two pointer
    codeforces Gym 100187L L. Ministry of Truth 水题
    Codeforces Gym 100187K K. Perpetuum Mobile 构造
    codeforces Gym 100187J J. Deck Shuffling dfs
    codeforces Gym 100187H H. Mysterious Photos 水题
    windows服务名称不是单个单词的如何启动?
  • 原文地址:https://www.cnblogs.com/rain-1/p/5547282.html
Copyright © 2011-2022 走看看