我的Python之旅第五天---迭代器和生成器
h3,#nv_portal .vw .d .h3 {display: block; font-weight: 500; background-image: linear-gradient(to right bottom, #00BCD4, #3F51B5);background-color: #3F51B5;color: #FFF; font-size: 1.8em; line-height: 2.0em; margin: 16px 10px 16px 0; padding: 12px 15px;letter-spacing:4px; border-left: solid #333 15px; text-shadow: 1px 1px 1px #666;box-shadow: 1px 1px 2px #666;}
一 迭代器
迭代器是Python最强大的功能之一,是访问集合元素的一种方式
迭代器是一种可以记住遍历的位置的对象。
##1迭代器的特点:
(1)节省内存
比如展现一个上亿元素的列表并计算,sum([i*i for i in range(1000000000)])
内存小的机器肯定要宕机
(2)惰性机制
调用一次__next__方法,执行一次
(3)单向执行,不可逆
既就是迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完后结束。只能往前不能后退
##2 判断对象是不是可迭代对象
(1)常见的课迭代对象
包含字符串str、列表list、元组tuple、字典dict、集合set、range以及文件句柄
(2)第一种判断方法__iter__
```
str1="abcdegggg"
list1=[1,3,4,5]
print('__iter__' in dir(str1))
print('__iter__' in dir(list1))
结果为:
True
True
```
(2)第二种判断方法 isinstance('abc',Iterable)
```
str1="abcdegggg"
list1=[1,3,4,5]
from collections import Iterable
print(isinstance(str1,Iterable))
print(isinstance(list1,Iterable))
print(isinstance(123,Iterable))
结果为:
True
True
False
```
##3创建迭代器的方法
将可迭代对象转化为迭代器
(1)第一种方法__iter__()
```
str1="abcdegggg"
list1=[1,3,4,5]
obj_str=str1.__iter__()
obj_list=list1.__iter__()
print(obj_str)
print(obj_list)
结果为:
```
(2)第二种方法iter()
```
str1="abcdegggg"
list1=[1,3,4,5]
obj_str=iter(str1)
obj_list=iter(list1)
print(obj_str)
print(obj_list)
结果为:
```
##4 判断对象是不是迭代器
(1)内部含有__iter__ 且含有__next__方法的对象就是迭代器,遵循迭代器协议
```
str1="abcdegggg"
list1=[1,3,4,5]
obj_str=str1.__iter__()
obj_list=list1.__iter__()
print('iter' in dir(str1))
print('next' in dir(str1))
print('iter' in dir(obj_str))
print('next' in dir(obj_str))
结果为:
True
False
True
True
可以看到,str1虽然是可迭代对象,但是内部不含有__next__方法,所以不是迭代器
(2)isinstance(obj_list,Iterable)
from collections import Iterable
list1=[1,3,4,5]
obj_str=str1.iter()
obj_list=list1.iter()
print(isinstance(list1,Iterable))
print(isinstance(obj_list,Iterable))
print(isinstance(124,Iterable))
结果为:
True
True
False
<h3>二 生成器</h3>
<blockquote background-color:yellow;>
<p>在Python中,使用了yield的函数被称为生成器(generator)。<br>
跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,等简单的理解生成器就是一个迭代器。在调用生成器的运行的过程中,每当遇到yield时函数会暂停并保存当前所有的运行信息,返回yield的值,并在下一次执行next()方法是从当前暂停的位置继续运行。<br>
调用一个生成器,返回的是一个迭代器对象。
</p>
</blockquote>
##1创建一个简单的生成器
def func1():
print(1111)
yield 1
print(2222)
yield 2
print(3333)
yield 3
print(4444)
gener_obj=func1()
print(gener_obj.next())
print(gener_obj.next())
print(gener_obj.next())
结果为:
1111
1
2222
2
3333
3
上边示例中gener_obj=func1()为生成器对象
__next__() 和 yield 必须一一对应
每调用一次__next__()执行一个yield
如果__next__()多于yield则会报错
##2 生成器小试牛刀
(1)
def cloth():
for i in range(1,1000):
yield '衣服%s'%i
ger_obj=cloth()
for i in range(3):
print(ger_obj.next())
结果为:
衣服1
衣服2
衣服3
(2)接下来再次取值时,它会从上次停的地方继续运行
def cloth():
for i in range(1,1000):
yield '衣服%s'%i
ger_obj=cloth()
for i in range(3):
print(ger_obj.next())
for i in range(5):
print(ger_obj.next())
结果为:
衣服1
衣服2
衣服3
衣服4
衣服5
衣服6
衣服7
衣服8
可以看到,它并不会重复打印1-3
##3 send和next的区别
send 和next 都是对生成器取值
send 会给上一个yield 发送一个值。
send 不能用在第一次取值。
最后一个yield 不能得到值
<h3>三 列表生成试</h3>
列表生成试List Comprehensions,是Python内置的非常简单却强大的可以用了创建list的生成试。
##1为何要使用列表生成试
举个例子,要生成list[1,2,3,4,5,6,7]可以用list(range(1,8)):
list(range(1,8))
[1, 2, 3, 4, 5, 6, 7]
如果要生成[1x1,2x2…..10x10]怎么办,方法一是for循环
for i in range(1,11):
list1.append(i*i)list1
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
循环太繁琐了,二使用列表生成试一行语句就可以搞定上边的list
[x*x for x in range(1,11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
##2 列表生成试的一般格式
(1)遍历模式
[变量(加工后的变量) for 变量 in iterable] 遍历模式
如:list = [i for i in range(1,11)]
list = [i for i in range(1,11)]
list
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
(2)筛选模式
[变量(加工后的变量) for 变量 in iterable if 条件] 筛选模式
如:list2 = [i for i in range(1,31) if i % 3 == 0]
list2 = [i for i in range(1,31) if i % 3 == 0]
list2
[3, 6, 9, 12, 15, 18, 21, 24, 27, 30]
##3 特点
列表生成试,直观可以看出,但是占内存
我的Python之旅第五天---迭代器和生成器的更多相关文章
- python函数(5):迭代器和生成器
迭代器和生成器是函数中的一大重点,务必掌握,何为迭代?何为迭代器? 预习: 处理文件,用户指定要查找的文件和内容,将文件中包含要查找内容的每一行都输出到屏幕 一.迭代器 for i in 50: pr ...
- python中可迭代对象、迭代器、生成器
可迭代对象 关注公众号"轻松学编程"了解更多. 1.列表生成式 list = [result for x in range(m, n)] g1 = (i for i in rang ...
- Python之旅第五天(习题集合)
4天时间,虽然上着班,但是学的东西还是有点多,而且晚上看的比较容易忘,所以今天是习题模式,正好教程也是这么要求的,本来以为时间不长,没想到还是很崩溃啊.不多说,上干货. #关于随机产生验证码同时验证用 ...
- python学习笔记:(十五)迭代器和生成器
一.迭代器: 1.迭代器是python最强大的功能之一,是访问集合元素的一种方式. 2.迭代器是一个可以记住遍历的位置的对象. 3.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问结束.迭代 ...
- python函数、装饰器、迭代器、生成器
目录: 函数补充进阶 函数对象 函数的嵌套 名称空间与作用域 闭包函数 函数之装饰器 函数之迭代器 函数之生成器 内置函数 一.函数补充进阶 1.函数对象: 函数是第一类对象,即函数可以当作数据传递 ...
- python 函数之装饰器,迭代器,生成器
装饰器 了解一点:写代码要遵循开发封闭原则,虽然这个原则是面向对象开发,但也适用于函数式编程,简单的来说,就是已经实现的功能代码不允许被修改但 可以被扩展即: 封闭:已实现功能的代码块 开发:对扩张开 ...
- Python语言的循环语句、迭代器与生成器、函数学习
while循环语句 无限循环 我们可以通过设置条件表达式永远不为false来实现无限循环,实例如下: for语句 Python for循环可以遍历任何序列的项目,如一个列表或者一个字符串 Python ...
- 潭州课堂25班:Ph201805201 第十五课 迭代器,生成器 (课堂笔记)
推导表达式 li1 = list() for i in range(10): # 迭代循环内容 li1.append(i) print( li1 ) ---->>> [0, 1, 2 ...
- what's the python之可迭代对象、迭代器与生成器(附面试题)
可迭代对象 字符串.列表.元祖.集合.字典都是可迭代的,数字是不可迭代的.(可以用for循环遍历取出内部元素的就是可迭代的) 如何查看一个变量是否为可迭代: from collections impo ...
随机推荐
- Oracle笔记 - unfinished
1. plsql查看xmltype字段的xml格式时,出现中文乱码问题,可通过该字段.getClobVal():查询到的xml将是中文不乱码的. 2. extract函数查询xml某节点下的所有节点, ...
- pytho部分命令
python --version查看版本号 pip install XXX 安装模块 pip uninstall XXX 卸载模块
- vue 获取后端数据打印结果undefined问题
今天做项目时后端有一个要展示到页面上的附件需要前端获取,我获取到了那个附件的信息,但打印fj.name或fj.url时控制台就会显示undefined,后来才发现是json数据没有解析对,应该使用JS ...
- bzoj千题计划200:bzoj3106: [cqoi2013]棋盘游戏
http://www.lydsy.com/JudgeOnline/problem.php?id=3106 白棋如果第一步不能赢,那么一定输 因为可以黑棋走的距离比白棋大,黑棋可以下一步吃掉白棋,也可以 ...
- 【学习笔记】AspectJ笔记
AspectJ的概念 是一种静态编译期增强性AOP的实现 在编译过程中修改代码加入相关逻辑,无需程序员动手 AspectJ具体用法 下载安装AspectJ,启动jar文件,安装到JDK目录,添加pat ...
- .NET面试题系列(三)排序算法
冒泡排序 , , , , , 7, 2, 4 }; //外层循环控制排序趟数 ; i < arr.Length - ; i++) { //内层循环控制每一趟排序多少次 ; j < arr. ...
- 用phpStorm的数据库工具来管理你的数据库
phpStorm是一个功能强大的IDE,不仅对PHP提供了支持,而且对前端HTML.CSS.JavaScript的支持也是非常不错的.此外,phpStorm还集成了很多实用的功能,下面就phpStor ...
- Linux下内存泄漏工具【转】
转自:http://www.cnblogs.com/guochaoxxl/p/6970090.html 概述 内存泄漏(memory leak)指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况 ...
- 浅谈js设计模式之迭代器模式
迭代器模式无非就是循环访问聚合对象中的各个元素.比如 jQuery中的 $.each 函数,其中回调函数中的参数 i 为当前索引, n 为当前元素,代码如下: $.each([1, 2, 3], fu ...
- js字符串操作之substr与substring
substr和substring两个都是截取字符串的. 两者有相同点,如果只是写一个参数,两者的作用都是一样的:就是截取字符串当前下标以后直到字符串最后的字符串片段. 例如: `var a=" ...