day14 迭代器和生成器
1.迭代器
名词解释
什么是迭代:迭代是一个重复过程,但是每次重复都是基于上一次的结果而继续的
#下列循环只是单纯的重复,没有意义
while True:
print(1)
#基于索引的迭代取值
l = ['a'a,'b','c']
i = 0
while i <len(l):
print(l[i])
i+=1
什么是迭代器:
迭代取值的工具
2.为什么要用迭代器
迭代器
1.优点:提供了一种不依赖索引的迭代取值方式
2.更节省内存(每次只取一个值放到内存中使用,下次调用才会取下个值)
缺点:
1.不如按照索引的取值方式灵活
2.取值一次性的,只能往后取,无法预测值的个数
3.如何用迭代器
可迭代对象:str、list、tuple\dict\set\文件对象
但凡有__iter__方法的对象都称之为可迭代对象
迭代器对象:文件对象
既内置有__iter__方法又内置又__next__方法的对象都称之为迭代器对象
(关键点:调用可迭代对象下__iter__方法,会有一个返回值,该返回值就是内置的迭代器对象)
用内置方法__next__ 可以取出迭代器的下一个值
上面iter_d拿到由d的内容产生的迭代器
但是当next取到最后一个值之后,继续next取值,就会报错,会抛出异常 StopIteration
d={'k1':111,'k2':222,'k3':333}
d={1,2,3,4,5}
iter_d = d.__iter__() 一般__下滑线开头的方法,满足一定条件时自动触发,最好不要这么用
可以用iter_d = iter(d) 来用,就相当于d.__iter__
next也一样
print(next(iter_d)) # 相当于iter_d.__next__()
print(len(d))
就相当于print(d.__len__())
print(iter.d.__iter__().__iter__().__iter__() is iter_d)
上面语句返回的是true,也就是说迭代器的iter返回值就是这个迭代器本身,只是python对于可迭代对象和迭代器对象不写两种实现方式了,所以都用相同的方法,返回都是迭代器
print(d.__iter__().__next__())
print(d.__iter__().__next__())
print(d.__iter__().__next__())
以上三条语句的返回值都一样,都是d产生的迭代器的第一个元素
while True:
try:
v = iter_d.next()
print(v)
except StopIteration:
break
print('第二次取值‘)
#iter_d = d.__iter__() # 没有这句的话,下面的第二次取值不会取到值,因为iter_d这个迭代器已经在上一次循环中取到末尾报异常结束了,如果不重置这个迭代器,就会继续报异常直接结束取值过程
while True:
try:
v = iter_d.__next__()
print(v)
except StopIteration:
break
以上用try去捕捉异常的写法太麻烦了,其实for语句的底层机制就和上面的语句一样
for k in d:
print(k)
for循环的底层原理
1.调用in后面那个值、对象的__iter__方法,拿到一个迭代器对象iter_obj
2.调用迭代器对象iter_obj.__next__()将得到的值返回值赋值给变量名k,循环往复直到取值完毕抛出异常StopIteration
3.捕捉异常结束循环
2.生成器
什么是生成器
生成器就是一个自定义的迭代器
如何得到生成器
单反函数内出现yield关键字时,再去调用函数时不会立即执行函数体代码,会得到一个返回值,该返回值就是生成器对象,即自定义的迭代器
#因为用return的话会直接返回值并且结束程序的运行
def func():
print(‘first’)
yield 1
print(''second')
yield 2
print('third')
yield 3
g = func()
print(g) #g是一个生成器对象
res1 = next(g)
print(res1)
res2 = next(g)
print(res2)
resa3 = next(g)
print(res3)
next(g) # 报错,没有值可以取了
总结 yield
1.提供了一种自定义迭代器的解决方案
2.yield&return
相同点:都可以返回值,返回值没有类型限制、个数限制
不同点: return只能返回一次值,yield却可以让函数暂停在某一个位置,可以返回多次值
来用生成器模拟一个range函数
def calc(start,end,step = 1):
while start < end:
yield start
start += step
a = calc(1,10,2) # 返回生成器对象
for i in a:
print(i) # for循环取出所有值
3. 函数的递归调用和二分法
递归必须满足的两个条件:
1.每进入下一次递归调用,问题的规模都应该有所减少
2.递归必须有一个明确的结束条件
以下递归只是单纯的重复,没有意义
def func():
print(1)
print(2)
print(3)
func()
func()
def bar():
print('from bar')
foo()
def foo():
print('from foo')
bar()
foo()
递归有两个明确的阶段
1.回溯
2.递推
如下面的例子
age(5) = age(4)+2
age(4) = age(3)+2
age(3) = age(2)+2
age(2) = age(1)+2
age(1) = 18
def age(n):
if n == 1:
return 18
return age(n-1) + 2
print(age(5))
l=[1,[2,[3,[4,[5,[6,[7,[8,[9,[]]]]]]]]]]
def func(list1):
for item in list1:
if type(item) is not list:
print(item)
else:
func(item)
func(l)
二分法
顺序排列的数字中查找数字
nums=[1,2,3,4,5,6,7,8,9]
def search(nums,find_num):
if len(nums) == 0:
print('not exist')
return
mid = len(nums) // 2
if nums[mid] > find_num:
search(nums[:mid],find_num)
elif nums[mid]<find_num:
search(nums[mid+1:],find_num)
else:
print('get it')
search(nums,9)
day14 迭代器和生成器的更多相关文章
- python函数(5):迭代器和生成器
迭代器和生成器是函数中的一大重点,务必掌握,何为迭代?何为迭代器? 预习: 处理文件,用户指定要查找的文件和内容,将文件中包含要查找内容的每一行都输出到屏幕 一.迭代器 for i in 50: pr ...
- Python 从零学起(纯基础) 笔记 之 迭代器、生成器和修饰器
Python的迭代器. 生成器和修饰器 1. 迭代器是访问集合元素的一种方式,从第一个到最后,只许前进不许后退. 优点:不要求事先准备好整个迭代过程中的所有元素,仅仅在迭代到某个元素时才计算该元素,而 ...
- Python之模块,迭代器与生成器
本节涉及内容: 1. 迭代器和生成器 2. 递归 3. 字符串格式化 4. 模块 内置模块 自定义模块 第三方模块 5. 序列化的模块 json pickle (一). 迭代器和生成器: 迭代器: ...
- Python之迭代器和生成器
Python 迭代器和生成器 迭代器 Python中的迭代器为类序列对象(sequence-like objects)提供了一个类序列的接口,迭代器不仅可以对序列对象(string.list.tupl ...
- python学习笔记四 迭代器,生成器,装饰器(基础篇)
迭代器 __iter__方法返回一个迭代器,它是具有__next__方法的对象.在调用__next__方法时,迭代器会返回它的下一个值,若__next__方法调用迭代器 没有值返回,就会引发一个Sto ...
- 【Python】迭代器、生成器、yield单线程异步并发实现详解
转自http://blog.itpub.net/29018063/viewspace-2079767 大家在学习python开发时可能经常对迭代器.生成器.yield关键字用法有所疑惑,在这篇文章将从 ...
- 15.python的for循环与迭代器、生成器
在前面学习讲完while循环之后,现在终于要将for循环这个坑填上了.之所以拖到现在是因为for循环对前面讲过的序列.字典.集合都是有效的,讲完前面的内容再来讲for循环会更加容易上手. 首先,for ...
- Python: 迭代器与生成器小结
迭代器与生成器的区别: 1. 迭代器由Class对象创建. 生成器由包含yield表达的Function对象或者Generator Expression创建. 2. 迭代器的原理: (1)由Itera ...
- Python中的迭代器和生成器
本文以实例详解了python的迭代器与生成器,具体如下所示: 1. 迭代器概述: 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后 ...
随机推荐
- python操作浏览器及截图小结
近期做网页自动化用到内容小结 1.打开浏览器1)打开默认配置的浏览器from selenium import webdriverdriver = webdriver.Firefox()"&q ...
- mybatis关系映射之一对多和多对一
本实例使用用户(User)和博客(Post)的例子做说明: 一个用户可以有多个博客, 一个博客只对应一个用户 一. 例子(本实体采用maven构建): 1. 代码结构图: 2. 数据库: t_user ...
- Apache-Axis小结
以前用过axis, 不过好久不弄, 有忘记了.很多很多东西放在收藏夹里面, 但是长时间不去看,结果就是还是不熟悉!现在再简单总结一下吧. Axis开发服务器端webservice其实很简单. 1 下载 ...
- workerman-todpole 执行流程(3)
通过前两篇文章的分析: workerman-todpole 执行流程(1) workerman-todpole 执行流程(2) 我们已经详细了解了主进程以及子进程的启动细节,但之前的文章并没有考虑 W ...
- ABAP-2-会计凭证批量数据导入本地ACCESS
ABAP-1-会计凭证批量数据导入本地ACCESS 上一版本出现问题: A.若TXT数据条目超过800万(大概1.3G),则将TXT导入ACCESS过程不成功,ACCESS数据表为空.(Access单 ...
- FireDac 组件说明一
TFDManager 连接定义和Connect连接管理 TFDConnection 数据库连接组件,支持三种连接方式:1.持久定义(有一个唯一名称和一个配置文件,可以由FDManager管理) 例: ...
- js 对象创建设计模式
创建js对象可以使用多种模式,每种模式有着不同的特点:如下: 1.工厂模式:创建一个函数,在函数中实例化一个对象,当每次调用函数时,就实例化一个对象,并返回这个对象: 我们知道,对象是引用形式的,每次 ...
- html页面跳转
button <button onclick="window.location.href='edit.jsp'">完善个人信息</button> 单击提交表 ...
- Nginx ssl证书部署方法
查看当前安装的OpenSSL版本所支持的密码列表,可以使用下列命令:openssl ciphers 苹果ATS检测:https://www.qcloud.com/product/ssl 刚开始&quo ...
- Android app 性能优化的思考--性能卡顿不好的原因在哪?
说到 Android 系统手机,大部分人的印象是用了一段时间就变得有点卡顿,有些程序在运行期间莫名其妙的出现崩溃,打开系统文件夹一看,发现多了很多文件,然后用手机管家 APP 不断地进行清理优化 ,才 ...