递归, 迭代器与生成器
这节课的迭代器与生成器.主要是学习原理.了解原理即可.代码学习的是实现代码, 以后不怎么敲
上节复习
闭包: 在一个嵌套函数中, 用外层函数来接受数据, 再用内层函数操作处理数据.最后返回内置函数
装饰器: 在不改变函数的源代码, 调用方式的情况下.给函数增加功能
##递归是啥?递你乌龟??? 递归是一种函数. 在这个函数中, 通过自己调用自己来解决特定的一些操作.并且这个函数是可以终止的
从前有座山, 山里有座庙, 庙里有个老和尚在讲故事
从前有座山, 山里有座庙, 庙里有个老和尚在讲故事
从前有座山, 山里有座庙, 庙里有个老和尚在讲故事
从前有座山, 山里有座庙, 庙里有个老和尚口干渴死了
你看到一个函数, 这个函数调用了自己, 就属于递归
递归写起来比较方便, 但是从性能考虑, 它的性能比较弱的.对于资源损害比较大.所以在正式算法开发, 比赛中都不推荐用递归
递归: 把一个很大的东西, 拆分成一个个小目标, 然后再去逐个完成的
资源:
1.内存资源
2.时间资源
好算法: 100m, 运行 10S
差算法: 300m, 运行 30s
递归的实例:
课后自行百度
汉诺塔
斐波那契数列
##什么叫迭代??? 有一串数据, 对这串数据进行一些有意义, 有规律的操作. 更换, 升级
写个软件 --> 1.0 2.0 3.0 4.0
上节课的装饰器代码 --> 方案 1 方案 2 --> 方案 5
迭代:
1.里面有多个数据
2.数据之间存在一定联系
麟某人自制火锅料:
1.香油
2.香油 + 耗油 + 老干妈
3.沙茶酱 香油 耗油 老干妈 蒜蓉
迭代 --> 操作一堆数据, 并且数据之间
1.有关联性
2.会更新
##初识迭代器(iter) iter --> 可迭代对象 --> 备胎 iteraotor --> 迭代器 --> 对象
迭代: 操作多个数据, 并且操作时是基于之前的数据进行更新
for i in range(70):
print('新年好')
不属于迭代, 只是单纯的重复
大鱼吃小鱼, 小鱼吃虾米, 虾米吃海藻 --> 基于之前数据的更新, 属于迭代
可迭代对象 --> 有很多的数据, 并且可以把这些数据有规律的输出/使用
作用:
对可以存储'多个数据'的数据集合, 进行更方便的操作
目前学过的: list dict str tuple set
可迭代对象的表现形式:
内置了 __iter__ 方法的数据, 都属于可迭代对象
a = '123'
b = [1,2,3]
c = (1,2,3)
d = {1,2,3}
a.__iter__()
b.__iter__()
c.__iter__()
d.__iter__()
声明迭代器:
变量名 = 可迭代对象.__iter__()
变量名 = iter(可迭代对象)
i_a = a.__iter__()
i_a = iter(a) # 便捷写法.语法糖
有了迭代器对象后, 就可以把里面的数据一取出来
迭代器对象的表现形式:
内置了 __next__, __iter__ 方法的数据, 都是迭代器
next: 从迭代数据里的第一个值开始取, 一直往后, 一位一位的取数据
迭代器.__next__()
i_a.__next__()
next(迭代器)
next(i_a)
for 变量名 in 可迭代对象:
代码块
原理就说把可迭代对象转换为 迭代器. 再自动的把迭代器的数据用 next 输出
优点:
减少代码量, 更好的管理有多个数据的值
缺点:
它是一次性的.只能一直往下取, 不能回头取, 取完一次用完就 over.
不能获取它的长度, 在他输出完之前.程序是不知道这个迭代器有多长.有几个元素
一句话总结:
把一堆的数据, 进行有规律的输出/使用
##初识生成器(yield) 本质: 自定义的迭代器(迭代器的变体)
生成器的作用:
指定一个规则, 基于规则, 生成一些数据!
一个变量, 里面有 70 个值, 你手动声明就很麻烦
如果这个变量里的值, 都是有规律.那就可以写一个生成器, 制定规则来生成这个变量 --> 省事
正常定义一个可迭代对象数据:
a = [1,2,3,4,5]
# 1.得先把数据存储进去才能使用
# 2.生成器可以边生成边迭代使用
生成器的表现形式为:
一个函数中, 有 yield 关键字, 就属于生成器
def fun():
yield 70
如果函数内包含了 yield, 调用这个函数时.是不会运行里面的代码, 并且这个函数的返回值, 就是这个生成器对象
return --> 函数指定到了 return 就会返回值, 后面的代码都不会执行.相当于'结束'了
yield --> 也是可以作为返回值, 但是返回数据之后, 函数是进入'暂停'状态.而不是结束. 等下一次 next 是, 会继续上次的进度运行
本质:
生成器属于迭代器的变体.可以让我们用指定的规则来'生成数据'
以前都是要一个个手动赋值, 现在可以用生成器来为我们赋值.
我们只需要了解他们的实现原理即可.再以后开发实战时, 也基本不会要自己敲迭代器/生成器的代码. 所以只需要知道他们的用处就行了
##复习博客 c.biancheng.net/view/5419.h… --> 迭代器 c.biancheng.net/view/2393.h… --> 生成器 c.biancheng.net/view/2270.h… --> 装饰器 blog.csdn.net/zhengyajun_… --> 装饰器嵌套
##拓展知识点 -- git git 是一个软件.分布式版本控制系统 --> 管软件版本 作用就是可以保存你写的代码提交版本.如果有问题, 那就可以直接倒退回之前的版本
老麟的游戏版本 1.0
老麟的游戏版本 2.0
老麟的游戏版本 3.0 回退到版本 3
老麟的游戏版本 4.0 重大 Bug
老麟的网页:
1. 多喝热水, 蓝色背景
2. 老麟很帅, 绿色背景 + 图片
3. 灌篮高手