python基础之生成器迭代器
1 生成器:
为什么要有生成器?
就拿列表来说吧,假如我们要创建一个list,这个list要求格式为:[1,4,9,16,25,36……]这么一直持续下去,直到有了一万个元素的时候为止。如果我们要创建这个list,那么应该是这样的:
[i*i for i in range(1,10001)] #列表生成式,不要忘了
#结果就不列出来了
这样的话,这个list会占用极多的内存,如果我们能只将算法保存在list中,那么这个list所占的内存会大大减小,等我们需要用到list的值的时候,这个list会自动运行其中的算法,将第一个值输出,再次运行时,就会自动输出第二个值,以此类推…… 这个特殊的list就被我们称之为生成器(generator)。
如何创建生成器?
创建生成器有很多方法:
1 第一种方法:
#将list生成式中的‘[’换为‘(’
>>> (i*i for i in range(1,10001))
<generator object <genexpr> at 0x7fb0a69dc6e0>
>>> g=(i*i for i in range(1,10001))
#使用next()函数获取g的下一个值
>>> g.next()
1
>>> g.next()
4
>>> next(g)
9
#当没有元素可返回的时候,会报错
>>> g=(i for i in range(1,3))
>>> g.next()
1
>>> g.next()
2
>>> g.next()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration #实际上,我们不推荐用next()函数,较为常用的是用for循环,实际上for循环的本质就是调用了next()函数。即:首先通过iter()将可迭代的数据转换为可迭代对象,然后调用next()
g=(i for i in range(1,11))
for i in g:
print(i)
#结果为:
1
2
3
4
5
6
7
8
9
10
#这样当没有值可供返回的时候就会退出循环并不会报错。
2 第二种方法:
这种方法用在函数中,比如说用函数实现杨辉三角:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1……………………………………………………………1
个人实现该函数的代码:
def yh():
l=[1]
n=[1]
while True:
yield n #这里有一个yield关键字!,yield就是定义generator的关键字,yield类似于return,
#当函数运行到这里就会结束,但不同的是,当下次继续运行该函数时,就会从yield下方开始,也就是接续上次运行的地方继续运行。
l.append(0)
n=copy.copy(l) #注意这里为什么要用copy功能!!!!
for i in range(len(l)):
n[i]=l[i]+l[i-1]
l=n
import copy
n=0
for i in yh():
if n==10:
break
print(i)
n=n+1
这里有一个yield关键字!,yield就是定义generator的关键字,yield类似于return,当函数运行到这里就会结束,但不同的是,当下次继续运行该函数时,就会从yield下方开始,也就是接续上次运行的地方继续运行。
另外摘抄了一个比较短小精悍的代码:
def yh():
N = [1]
while True:
yield N
N.append(0)
N = [N[i-1] + N[i] for i in range(len(N))]
…………
…………
2 迭代器
迭代器有什么用途?
生成器存储了算法,而迭代器则负责一次输出一个该算法的结果。迭代器类似于生成器(事实上,并不仅仅只是生成器)与循环的结合,只不过这个循环“很懒”,一次只输出一个值。
迭代和迭代器的区别:
迭代:
几乎所有的python对象都是可迭代的,像str dict list tuple generator set……等都是可迭代的。
判断一个对象是否可迭代:
>>> from collections import Iterable
>>> isinstance([], Iterable)
True
迭代器:
可以被next()
函数调用并不断返回下一个值的对象称为迭代器:Iterable
判断一个对象是否为迭代器对象:
>>> from collections import Iterator
>>> isinstance((x for x in range(10)), Iterator)
True
>>> isinstance([], Iterator)
False
>>> isinstance({}, Iterator)
False
>>> isinstance('abc', Iterator)
False
生成器就是一个迭代器对象,他可以被next()函数调用。而像其他类型的对象,例如list,dict……需要使用iter()函数将其转换为迭代器对象。
>>> isinstance(iter([]), Iterator)
True
>>> isinstance(iter('abc'), Iterator)
True
本文参考了廖雪峰大神的python教程。详细请阅读:http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000
python基础之生成器迭代器的更多相关文章
- python基础(八)生成器,迭代器,装饰器,递归
生成器 在函数中使用yield关键字就会将一个普通的函数变成一个生成器(generator),普通的函数只能使用return来退出函数,而不执行return之后的代码.而生成器可以使用调用一个next ...
- python高级之生成器&迭代器
python高级之生成器&迭代器 本机内容 概念梳理 容器 可迭代对象 迭代器 for循环内部实现 生成器 1.概念梳理 容器(container):多个元素组织在一起的数据结构 可迭代对象( ...
- 第三篇:python高级之生成器&迭代器
python高级之生成器&迭代器 python高级之生成器&迭代器 本机内容 概念梳理 容器 可迭代对象 迭代器 for循环内部实现 生成器 1.概念梳理 容器(container ...
- 十三. Python基础(13)--生成器进阶
十三. Python基础(13)--生成器进阶 1 ● send()方法 generator.send(value) Resumes the execution, and "sends&qu ...
- 十二. Python基础(12)--生成器
十二. Python基础(12)--生成器 1 ● 可迭代对象(iterable) An object capable of returning its members one at a time. ...
- 【笔记】Python基础四:迭代器和生成器
一,迭代器协议和for循环工作机制 (一),迭代器协议 1,迭代器协议:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个stopiteration异常,以终止迭代(只能往 ...
- python基础编程:生成器、迭代器、time模块、序列化模块、反序列化模块、日志模块
目录: 生成器 迭代器 模块 time 序列化 反序列化 日志 一.生成器 列表生成式: a = [1,2,3,3,4,5,6,7,8,9,10] a = [i+1 for i in a ] prin ...
- (转)python基础学习-----生成器和迭代器
在Python中,很多对象都是可以通过for语句来直接遍历的,例如list.string.dict等等,这些对象都可以被称为可迭代对象.至于说哪些对象是可以被迭代访问的,就要了解一下迭代器相关的知识了 ...
- python基础一 day13 迭代器
# 双下方法# print([1].__add__([2]))# print([1]+[2]) # 迭代器# l = [1,2,3]# 索引# 循环 for# for i in l:# i## for ...
随机推荐
- spring boot的maven项目报404错误
$.ajax({ async: false, type: "POST", url:'searchFileSource', contentType : "applicati ...
- Daily Scrum (2015/11/2)
今日我们完成了博客作业的发布,并且也完成了服务器的配置. 成员 今日工作 时间 明日工作 符美潇 两篇文档的修善和数据库的搭建. 2h 完成数据库搭建,并能爬取数据提供给第二小组使用 潘礼鹏 编写两篇 ...
- fullPage全屏高度自适应
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- 课堂讨论—Alpha版总结会议
我们在课堂上针对第一阶段冲刺过程中存在的问题,展开了激烈的讨论,并投票选出需要改进的最主要三个问题. 有图有真相:
- Mongodb compass 介绍
参考官方文档:https://docs.mongodb.com/compass/current/install/#install-on-red-hat-enterprise-linux-rhel Mo ...
- cxGrid 单元格回车移到下一行,当移到最后一个单元格时回车新增一行【转】
1 在TcxGridDBTableView中,设定属性 NewItemRow.Visible = True 2 在cxgrid中输入数据怎样回车换行 在TcxGridDBTableView中 将属 ...
- loadrunner汉化【运行时设置】菜单选项截图
来自为知笔记(Wiz)
- scrapy 直接在编辑器运行
# *_*coding:utf-8 *_* from scrapy.cmdline import execute execute("scrapy crawl spbeen --nolog&q ...
- mysqldumpslow 分析slow query日志和explain分析mysql查询结构
mysqldumpslow的使用:比如我们要查询按时间返回前5条日志信息,格式如下:mysqldumpslow -s t -t 5 /var/log/mysql/slowquery_20180303. ...
- js全端
js是世界上最好的语言之一,或许可以不用加之一 我是个js游戏前端开发者,但是我不局限于只是开发h5游戏,微信小游戏... js很强大很强大很强大,没有哪种语言能通吃,除了js. 网页, app, 服 ...