python 第十二章 递归,迭代器与生成器

81 阅读5分钟

递归, 迭代器与生成器

​ 这节课的迭代器与生成器.主要是学习原理.了解原理即可.代码学习的是实现代码, 以后不怎么敲

上节复习

​ 闭包: 在一个嵌套函数中, 用外层函数来接受数据, 再用内层函数操作处理数据.最后返回内置函数 ​

装饰器: 在不改变函数的源代码, 调用方式的情况下.给函数增加功能

##递归是啥?递你乌龟??? 递归是一种函数. 在这个函数中, 通过自己调用自己来解决特定的一些操作.并且这个函数是可以终止的

从前有座山, 山里有座庙, 庙里有个老和尚在讲故事
从前有座山, 山里有座庙, 庙里有个老和尚在讲故事
从前有座山, 山里有座庙, 庙里有个老和尚在讲故事
从前有座山, 山里有座庙, 庙里有个老和尚口干渴死了

你看到一个函数, 这个函数调用了自己, 就属于递归

递归写起来比较方便, 但是从性能考虑, 它的性能比较弱的.对于资源损害比较大.所以在正式算法开发, 比赛中都不推荐用递归

递归: 把一个很大的东西, 拆分成一个个小目标, 然后再去逐个完成的

资源:
	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. 灌篮高手