通过列表生成式,我们可以直接创建一个列表
输出结果:[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
受到内存限制,列表容量肯定是有限的。
创建一个包含 100 万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了 。
如果列表元素可以按照某种算法推算出来 ,我们就可以在循环的过程中不断推算出后续的元素了,就不必创建完整的list了,从而节省空间。
这种一边循环一边计算的机制,称为生成器: generator
杨辉三角普通函数的写法:
# _*_ coding:utf-8 _*_
__author__ = 'admin'
def yanghui(n):
b = [1]
while True:
if n == 0:
break
else:
n -= 1
print(b)
b = [1] + [b[i] + b[i + 1]for i in range(len(b) - 1)] + [1]
yanghui(10)
输出结果:
杨辉三角的生成器写法:
# _*_ coding:utf-8 _*_
__author__ = 'admin'
'''
杨辉三角,是二项式系数在三角形中的一种几何排列
每个数等于它上方两数之和。
每行数字左右对称,由1开始逐渐变大
'''
# # 下面这种方法使用递归,会导致压栈,n越大程序反应越慢
# def LN(n):
# l = []
# for i in range(n):
# if i == 0:
# l.append(1)
# elif i == n - 1:
# l.append(1)
# else:
# l.append(LN(n - 1)[i] + LN(n - 1)[i - 1])
# return l
#
# l = LN(10)
# print(l)
# 把每一行看做一个 list,试写一个 generator,不断输出下一行的 list
def yanghui():
b = [1]
while True:
yield b
b = [1] + [b[i] + b[i + 1] for i in range(len(b) - 1)] + [1]
n = 0
for t in yanghui():
print(t)
n += 1
if n == 10:
break
输出结果:
总结:
①如果一个函数定义中包含 yield 关键字,那么这个函数就不再是一个普通函数,而是一个 带有yield的generator function
②函数是顺序执行,遇到 return 语句或者最后一行函数语句就返回
③generator 的函数,在每次调用 next()的时候执行,遇到 yield 语句返回,再次执行时从上次返回的 yield 语句处继续执行
④上面构造了一个杨辉三角的生成器,又使用for循环对generator对象进行迭代得到想要的结果