缘起是在学习廖雪峰的官方网站时,生成器一节中打印杨辉三角形一题中,网友的简洁写法
def triangles():
b = [1]
while True:
yield b
b = [1] + [x + b[i + 1] for i, x in enumerate(b[:-1])] + [1]
对于b的迭代代码中的列表生成式[x + b[i+1]] for i, x in enumrate(b[:-1])]
的理解
这是第二行以后list除首尾两个1
中间部分的代码
b[:-1]
将上一行list的最后一个元素排除,因为有b[i+1]
,防止越界
但在第一次循环,当b = [1]
时,b[i+1]
是否越界
这次循环时,enumrate()
函数的传入参数是[]
按照官方文档中给的等价代码,返回值是一个generator
,若使用next()
来拿到值,直接就会抛出StopIteration
的错误
但如果像列表生成式中那样使用for
循环,不会抛出错误,而是直接结束运行,导致整个列表表达式在第一次循环时返回的是一个[]