生成器是一个可迭代的对象,它的执行会记住上一次返回时在函数体中的位置。对生成器第二次(或第 n 次)调用跳转至该函数上次执行位置继续往下执行,而上次调用的所有局部变量都保持不变。
生成器的特点:1、生成器是一个函数,而且函数的参数都会保留。2、迭代到下一次的调用时,所使用的参数都是第一次所保留下的,即是说,在整个所有函数调用的参数都是第一次所调用时保留的,而不是新创建的。3、函数中yield就是个生成器,多次调用时,根据调用位置依此往下执行,而无法返回
1 #__next__方法会将生成器依此调用,且无法返回,当调用结尾时,迭代器无法活得生成器的数据时会产生报错 2 def a(): 3 yield 1 4 yield 2 5 yield 3 6 7 ret = a() 8 print(ret.__next__()) 9 print(ret.__next__()) 10 print(ret.__next__()) 11 print(ret.__next__()) 12 >>>1 13 >>>2 14 >>>3 15 >>>报错
1 #python中的文件操作以只读方式打开后便会产生一个生成器 2 #db中数据为1 2 3 3 with open('db','r') as f: 4 print(f.__next__()) 5 print(f.__next__()) 6 print(f.__next__()) 7 >>>1 8 >>>2 9 >>>3
#生成器的简单功能实现,从0开始输出小于参数的值 def myrange(arg): start = 0 while True: if start > arg: return yield start start += 1 ret = myrange(3) r = ret.__next__() print(r) r = ret.__next__() print(r) r = ret.__next__() print(r) r = ret.__next__() print(r) >>>0 >>>1 >>>2 >>>3
递归调用
递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。
1 #函数调用自身当满足条件时返回 2 def func(n): 3 if n>=4: 4 return 'end' 5 n+=1 6 print(n) 7 return func(n) 8 print(func(1)) 9 >>>2 10 >>>3 11 >>>4
1 #递归实现1*2*3*4*5*6*7 2 #参数t保存每次计算的结果,n保持递增,然后进行计算 3 def func(n,t): 4 t=t*n 5 if n>=7: 6 return t 7 n+=1 8 return func(n,t) 9 10 print(func(2,1)) 11 >>>5040