Python 基础核心语法(第十三节)

递归、生成器与迭代器

一、递归——>是递一只乌龟给你?

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))

 

 

  • 20
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

中国第一深情

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值