Python学习——generator

摘录自廖雪峰的python3生成器(generator)    

https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014317799226173f45ce40636141b6abc8424e12b5fb27000


tip:generator和函数的区别,函数是顺序执行,遇到return语句或者最后一行语句就返回;

       generator每次条用next()的时候执行,遇到yield语句返回,再次执行从上次返回的yield语句处继续执行,执行完所有yield后继续用next()执行就会报错。


练习:

杨辉三角定义如下:

          1
         / \
        1   1
       / \ / \
      1   2   1
     / \ / \ / \
    1   3   3   1
   / \ / \ / \ / \
  1   4   6   4   1
 / \ / \ / \ / \ / \
1   5   10  10  5   1

把每一行看做一个list,试写一个generator,不断输出下一行的list:


      n = 0
       K = [ ]
       while n < 10:
           L = [ ]
           a = 0
           for i in K:
               L.append(a+i)
               a = i       
           L.append(1)
           yield(L)    
           n = n+1
           K = L  


-------------------------------------------------------------------------------------------------

分析:主要根据数据特点进行分析

# [1]
# [1, 1]
# [1, 2, 1]
# [1, 3, 3, 1]
# [1, 4, 6, 4, 1]
# [1, 5, 10, 10, 5, 1]
# [1, 6, 15, 20, 15, 6, 1]
# [1, 7, 21, 35, 35, 21, 7, 1]
# [1, 8, 28, 56, 70, 56, 28, 8, 1]
# [1, 9, 36, 84, 126, 126, 84, 36, 9, 1]

除了首尾两个数字为固定的1,其它数据的产生都是上一层数据的相加得来的,如左下图所示,所以这里定义了两个列表,L表示当前要产生列表,K表示了上一层的列表。

L列表的产生是对应K列表前两个数相加得到的(这是该数据特征的规律),那我们就对K列表进行遍历,把前两个数相加得出L列表,这里i表示遍历K列表的当前数字,a表示前一个数字。

然后再分析首尾两个1是否遵循这个规律,首位数字1可以看成上层数字加0产生,如右下图所示,这样就继续遵循了上述规律,只需要把前一个数字a赋0即可

而末位数字无法遵循,因为L列表的产生是基于K列表的数据遍历,而K列表数字比L列表少1位,所以无法遍历,所以我们这里单纯的补数字1就好了,即 L.append(1)

                                                  

猜你喜欢

转载自blog.csdn.net/weixin_42156385/article/details/80340488