我的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 ...
随机推荐
- RAC手动中断订阅
__block RACDisposable* dispose = [[RACObserve(self, price) skip:1]subscribeNext:^(NSNumber* x) { [di ...
- css中实现ul两端的li对齐外面边缘
其实就是设置ul的宽度大一些就好
- 一个很实用的css3兼容工具很多属性可以兼容到IE6
当你看到这样的效果图是不是已经崩溃了 css3没出来之前大部分人基本都是用图片的方式拼出来的 腾讯邮箱就是这么做的 然后你想和设计说换直角吧.我用图片的好烦的感觉!而且我们还要兼容到ie6 她和你说别 ...
- 【CTF WEB】反序列化
反序列化 漏洞代码 <?php error_reporting(0); if(empty($_GET['code'])) die(show_source(__FILE__)); class ex ...
- linux下如何模拟按键输入和模拟鼠标【转】
转自:http://www.cnblogs.com/leaven/archive/2010/11/30/1891947.html 查看/dev/input/eventX是什么类型的事件, cat /p ...
- css初始化minireset.css
一个很小的现代CSS重置,涵盖了基本内容: 重置字体大小:这样使用语义标记不会影响样式 重置块边距:所以只有在需要时才应用间距 重置表格:这样表格数据只占用它所需的空间 保留了行内间距:因此,按钮和输 ...
- 如何在Axure中使用FontAwesome字体图标
Font Awesome为您提供可缩放的矢量图标,您可以使用CSS所提供的所有特性对它们进行更改,包括:大小.颜色.阴影或者其它任何支持的效果. FontAwesome应用在web网页开发中非常方便, ...
- Session,Token相关区别
1. 为什么要有session的出现?答:是由于网络中http协议造成的,因为http本身是无状态协议,这样,无法确定你的本次请求和上次请求是不是你发送的.如果要进行类似论坛登陆相关的操作,就实现不了 ...
- JavaEE-案例1-网站信息展示
案例1-网站信息展示 需求: 在页面上展示一些文字信息,需要排版. 技术分析: html:超文本 标签 语言 作用:展示 超文本:超越了一般文本,描述文本的字体.颜色.图片 标签:标记 html书写规 ...
- DOM事件阶段以及事件捕获与事件冒泡先后执行顺序
平时浏览这么多技术文章,如过不去实践.深入弄透它,这个技术点很快就会在脑海里模糊.要加深印象,就得好好过一遍.重要的事情说三遍,重要的知识写一遍. 开发过程中我们都希望使用别人成熟的框架,因为站在巨人 ...