递归、生成器与迭代器
一、递归——>是递一只乌龟给你?
No No No.
首先,递归的本质是一个函数,但不一定是一个嵌套函数。
特征:其实是自己调用自己来实现程序的运行。(注意:这个操作是循环的,但不是死循环,是可以停止循环调用的。)
例如:
从前有座山,山上有座庙,庙里的老和尚在讲故事。
从前有座山,山上有座庙,庙里的老和尚在讲故事。
从前有座山,山上有座庙,庙里的老和尚在讲故事。
……
从前有座山,山上有座庙,庙里的老和尚在讲故事。
def func():
print("…..") for i in range(10):
func( ) 或 func( )
func( )
那么,如何避免死循环?
看看下面的例子:
def func(age):
if age<=100:
print("从前有座山,山上有座庙,庙里的老和尚在讲故事。")
else:
print(f"从前有座山,山上有座庙,庙里的{age}岁老和尚老死了。")
return None
return func(age+1)
age=int(input("请输入年龄"))
func(age)
输出效果如图所示
#累加(阶乘)
4!=1*2*3*4=24
#递归阶乘
def func(num):
if num==1:
return num
else:
return num*func(num-1)
num=int(input("输入你的阶乘"))
print(func(num))
#斐波拉契数列
1,1,2,3,5,8,13,21,34……
我们发现,该数列的特点是,后一项的数字是前两个的数字之和。
#代码实现如下:
def func(num):
if num==1 or num==2:
return 1
else:
return func(num-1)+func(num-2)——>变量是可以计算后传入实参
num=int(input("请输入斐波拉契数列长度:"))
for i in range(1,num+1):
print(func(i))
优点:
1.内存资源:会占用很大的内存损耗。
2.时间资源:会节约时间成本。
递归的原理:就是把很大的一个内容,拆开成为一个小小的目标进行逐个计算,并快速排序。利用递归原理。
---------------------------------------------------------------------------------------------------------------------------------
二、迭代器(iter)
什么是迭代器:
是对于一些程序或者数据进行有意义的操作——>更行、输出、升级。
迭代的条件: 1.里面有多个数据
2.数据之间有一定联系,操作一堆数据,数据是有关联性的。
迭代器定义:
for i in range(10):
print(i)
上面只是一个循环,不是迭代。
可迭代对象有哪些? ——>元组、字典、列表、字符串、集合。
内置有__iter__的方法就是可迭代对象。
iter——>可迭代对象—>备份
iterator——>迭代器—>对象
a='1,2,3'
b=[1,2,3]
c=(1,2,3)
d={1,2,3}
e={"1":1,""2":2,"3":3}
print(a.__iter__())
print(b.__iter__())
print(c.__iter__())
print(d.__iter__())
print(e.__iter__())
声明迭代器
格式:
变量名=可迭代对象 。__iter__() #这个方法的调用
变量=iter(可迭代对象) #这个是语法糖,可以变成函数调用
b=[1,2,3]
b__Iter=b.__iter__()
print(type(b__Iter))
b=[1,2,3]
b__Iter=iter(b)
print(type(b__Iter))
next( )
next( ):返回迭代器的下一个项目
格式:
next(可迭代对象,default)
其中,default是可以选择填写,作用是如果下一个项目没有数值,会返回default值,如果不设置就会报错。
例如:
a=[1,2,3,4]
a=iter(a)
print(next(a))
#思考一下,列表变成迭代器能不能遍历?(遍历:按照顺序获取可迭代对象数值。)
当然,也可以用这种笨方法:
那如果: b=12345
b=iter(b)
print(next(b))
看,报错。int不能成为迭代器,因为它不是可迭代对象。
迭代器优点:
1、提供通用而且不依赖索引的取值。
2、节省内存,迭代器在内存只占一个空间(数值空间),每个数值取值后,则上一条数据在内存被释放。
缺点:
1、因为有next方法,只能往后取值,不能往前取值,并且取值不如按照索引方法灵活。
2、不能预测迭代器长度。
---------------------------------------------------------------------------------------------------------------------------------
三、生成器
定义:
作用:自定规则,生成数据,本质上还是一个迭代器的,一个特殊的迭代器。
假如:我有一些规律的数据,我们就要写一个生成器,制定规则,然后生成数据。
一般是用来储存数据。
a=[1,2,3,4,5]
1、要把数据存进去。
2、生成器可以边生成边迭代边使用储存数据。
例:def func( ):
yield 100
a=func( )
print(a)
print(type(a))
#如何取值?
print(next(a))
def func( ):
print("开始执行")
for i in range(5):
yield i
print("继续继续")
num = func( )
for i in range(5):
print(next(num))
#func( )
num=func( )
for i in range(5):
print(next(num))
print(list(num))