刚刚学python,原来用c++,Java很轻松实现的杨辉三角,现在用python实现,代码是少了,理解起来却不容易啊。
这里主要用到的Python的生成器。
我们都知道Python有列表解析功能,根据表达式可以自动生成列表,如:
# 这样就得到了0-9这几个数的平方
my_list = [x**2 for x in range(10)]
print(my_list) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
print(type(my_list)) # <class 'list'>
但是列表的大小受内存的限制,如果我们能记录产生数据的算法,那么就不用构造完整的列表,只需要边循环边产生数据。
下面就来创建一个简单的生成器:
# 创建一个简单的生成器
gen = (x * x for x in range(10))
print(type(gen)) # <class 'generator'>
for item in gen:
print(item, end=" ") # 0 1 4 9 16 25 36 49 64 81
除了用for遍历生成器对象,还可以用next()函数进行遍历
# 创建一个简单的生成器
gen = (x * x for x in range(10))
print(type(gen)) # <class 'generator'>
print(next(gen)) # 0
print(next(gen)) # 1
print(next(gen)) # 4
print(next(gen)) # 9
print(next(gen)) # 16
当没有更多元素用于遍历时,会抛出StopIteration异常
当函数中有yield关键字时,函数会变成生成器:
def gen_func():
n = 1
while True:
yield n * 2 - 1 # 程序运行到yield会中断一次,下次再执行时从上次中断位置开始
n += 1
f = gen_func()
print(type(f)) # <class 'generator'>
n = 1 # 控制打印次数
for item in f:
print(item, end=" ") #1 3 5 7 9 11 13 15 17
n += 1
if n == 10:
break
生成器
和函数
的执行流程不一样。函数
是顺序执行,遇到return
语句或最后一行语句时返回。生成器
是在每次调用next()
时候执行,遇到yield
语句时返回,当再次调用next()
时,从上次返回的yield
语句处继续执行。
下面来实现杨辉三角:
思路是初始化第一行的元素列表,依次生成下一行的元素列表
def triangle():
line = [1] # 第一行就一个元素1
while True:
yield line
# 生成下一行,表达式为 : [1] + 上一行的两个元素之和 + [1]
line = [1] + [line[i] + line[i + 1] for i in range(len(line) - 1)] + [1]
n = 0 # 控制输出行数
for item in triangle():
print(item)
n += 1
if n % 10 == 0:
break
原文出处:https://www.cnblogs.com/wotoufahaiduo/p/10600727.html
来源:oschina
链接:https://my.oschina.net/u/4388800/blog/3267399