一 迭代器

迭代器的由来pythone2.2引进的,是一种序列(也是一种数据类型),也是为类对象提供一个序列的入口。

for 循环
str list tuple dict set 文件句柄
可迭代:
s = 'abc'
for i in s:
print(i)

不可迭代

iterable
for i in 55:
print(i)

什么是可迭代对象?
方法一: dir(被测对象) 如果 他含有__iter__ ,那这个对象就叫做可迭代对象.
遵循可迭代协议
s = 'abc'
print('__iter__' in dir(s))
print('__iter__' in dir(333))

可迭代对象,iterable 与迭代器有什么关系
可迭代对象 ---> 转化成迭代器
可迭代对象.__iter__() ---> 迭代器
s = 'abc'

s1 = s.__iter__()
print(s1) #iterator 遵循迭代器协议
 

迭代器取值:
s2 = 'abcd'
s3 = s2.__iter__()
print(s3.__next__())
print(s3.__next__())
print(s3.__next__())
print(s3.__next__())
print('__iter__' in dir(s2))
print('__iter__' in dir(s3))
print('__next__' in dir(s2))
print('__next__' in dir(s3))

只含有__iter__方法的数据是可迭代对象
含有__iter__方法,并且含有__next__方法的数据是迭代器
l = [1,2,3,4]
#print(dir(l))
print('__iter__' in dir(l))#判断l是不是可迭代对象
print('__next__' in dir(l))#判断l是不是迭代器
liter = l.__iter__()#l转换成迭代器
print(liter.__next__())#输出值
print(liter.__next__())
print(liter.__next__())
print(liter.__next__())
print(liter.__next__())#没有第五项所以报错


方法一: dir(被测对象) 如果 他含有__iter__ ,那这个对象就叫做可迭代对象.
遵循可迭代协议
s = 'abc'
print('__iter__' in dir(s))
print('__iter__' in dir(333))


方法二 测试他是迭代器还是可迭代对象
l = [1,2,3]
l_iter = l.__iter__()
from collections import Iterable
from collections import Iterator
print(isinstance(l,Iterable))
print(isinstance(l,Iterator))
print(isinstance(l_iter,Iterator))
print(isinstance(l,list))


迭代器的意义?
1,迭代器节省内存.
2,迭代器惰性机制.
3,迭代器不能反复,一直向下执行. for循环的机制.
内部含有__iter__方法,他会将可迭代对象先转化成迭代器.
,然后在调用__next__方法.
他有异常处理的方法.
for i in [1,2,3]:
print(i)


l = [1,2,3]
l_iter = l.__iter__()
while True:
try:
print(l_iter.__next__())
except StopIteration:
break
可迭代对象:str list tuple dict set range
迭代器: 文件句柄
print('__iter__' in dir(range(10)))
print('__next__' in dir(range(10)))

l=[1,2,3,4,5]
s=l.__iter__()
print(s.__next__())
print(s.__next__())
print(s.__next__())
print(s.__next__())
print(s.__next__())
# print(s.__next__())
while True:
try:
print(s.__next__())
except:StopIteration
break

迭代器:文件句柄是一个迭代器

二  生成器

什么是生成器?
生成器的本质就是迭代器,生成器是自己用python代码写的迭代器.\
1,可以用生成器函数
2,可以用各种推导式构建迭代器.
3,可以通过数据转化.
def func():
print(111)
return 222
ret = func()
print(ret)

生成器函数 生成器
def gener():
print('aaa')
yield 222
print('bbb')
yield 333
print('ccc')
g = gener()
print(g)
print(g.__next__())
print(g.__next__())
return yield 区别
return 返回给调用者值,并结束此函数.
yiled 返回给调用者值,并将指针停留着当前位置.
def cloth():
for i in range(10000):
print('衣服%s'%i)
cloth()
 

def cloth():
for i in range(8):
yield '衣服%s'%i g_cloth = cloth()
print(g_cloth.__next__())
print(g_cloth.__next__())
for i in range(2):
print(g_cloth.__next__())
for i in range(2):
print(g_cloth.__next__())


send
1,send 和next功能一样
2, 给上一个yiled 整体发送一个值
send不能给最后一个yield发送值
获取第一个值的时候,不能用send 只能用next
def gener():
yield 222
count = yield 333
print('-------->',count)
yield 'aaa'
yield 'bbb'
g = gener()
print(g.send('AAA'))
print(g.send(None))
print(g.send('AAAA'))
print(g.send('wwwwww'))

def gener():
yield 222
count = yield 333
print('-------->',count)
coubt1=yield 444
print(coubt1)
yield 'bbb'
g = gener()
print(g.__next__())
print(g.send('None'))
print(g.send('AAAA'))
print(g.send('ccc'))

 
												

迭代器、生成器 day13的更多相关文章

  1. Python(四)装饰器、迭代器&生成器、re正则表达式、字符串格式化

    本章内容: 装饰器 迭代器 & 生成器 re 正则表达式 字符串格式化 装饰器 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解 ...

  2. Python 迭代器&生成器

    1.内置参数     Built-in Functions     abs() dict() help() min() setattr() all() dir() hex() next() slice ...

  3. python杂记-4(迭代器&生成器)

    #!/usr/bin/env python# -*- coding: utf-8 -*-#1.迭代器&生成器#生成器#正确的方法是使用for循环,因为generator也是可迭代对象:g = ...

  4. Python学习笔记——基础篇【第四周】——迭代器&生成器、装饰器、递归、算法、正则表达式

    目录 1.迭代器&生成器 2.装饰器 a.基本装饰器 b.多参数装饰器 3.递归 4.算法基础:二分查找.二维数组转换 5.正则表达式 6.常用模块学习 #作业:计算器开发 a.实现加减成熟及 ...

  5. python 迭代器 生成器

    迭代器 生成器 一 什么是迭代器协议 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前 ...

  6. Python_迭代器-生成器-复习-习题_41

    # 迭代器和生成器# 迭代器 # 可迭代协议 —— 含有iter方法的都是可迭代的 # 迭代器协议 —— 含有next和iter的都是迭代器 # 特点 # 节省内存空间 # 方便逐个取值,一个迭代器只 ...

  7. day14 迭代器 生成器 面向过程思想

    "" 迭代器 什么是迭代器(iterator) 器指的某种工具, 迭代指的是更新换代的过程,例如应用程序的版本更新从1.0 变成 1.1 再1.2 迭代的目的是要根据上一个结果,产 ...

  8. python各种模块,迭代器,生成器

    从逻辑上组织python代码(变量,函数,类,逻辑:实现一个功能) 本质就是.py结尾的python文件(文件名:test.py,对应的模块名就是test) 包:用来从逻辑上组织模块的,本质就是一个目 ...

  9. Day 13 迭代器,生成器.

    一.迭代器 可以进行for循环的 数据类型 str ,list tuple dict set 文件句柄 什么是可迭代对象? 方法一:dir(被测对象) 如果他含有__iter__,那这个对象就叫做可迭 ...

随机推荐

  1. ReultSet有什么作用和使用

    结果集(ResultSet)是数据中查询结果返回的一种对象,可以说结果集是一个存储查询结果的对象,但是结果集并不仅仅具有存储的功能,他同时还具有操纵数据的功能,可能完成对数据的更新等. int col ...

  2. 解决mysql从windows迁移到centos出现乱码问题

    windows上的数据库编码情况 修改前centos上的编码情况 修改centos上mysql的配置文件my.cnf如下(修改前停掉mysql服务,/etc/init.d/mysqld stop) 红 ...

  3. DNS协议工作过程;DNS的安全隐患

    DNS协议工作过程   下面以域名为m.xyz.com的主机欲通过另一个主机的域名y.abc.com的IP地址为例,简述DNS协议过程. 主机m.xyz.com先向其本地服务器dns.xyz.com进 ...

  4. [原创]HTML 用div模拟select下拉框

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML xmlns=" ...

  5. 在前台页面写java代码,导入java的包

  6. WPF 中关于 DataTemplateSelector 类的应用

    MSDN的解释: 提供一种根据数据对象和与该数据绑定的元素来选择数据模板 DataTemplate 的方法. 示例代码: <Window x:Class="WpfApplication ...

  7. h5做列表 水平分割

    移动端H5各种各样的列表的制作方法(三) by FungLeo 移动端H5各种各样的列表的制作方法(三) by FungLeo 前情回顾 在上一篇博文<移动端各种各样的列表的制作方法(二)> ...

  8. 关于scp在zsh报错:zsh:no matches found :

    我要将某一目录下面所有文件拷贝的时候,scp *.jpg 的时候,报错 zsh: no matchs found:path 其实是zsh自己解析了*号,所以,只要给*加上就可以了\ scp \*.jp ...

  9. 导出pdf

    document.getElementById("exportSiteInfoTemp").onclick = function() { var thisMinheight=$(& ...

  10. vim字符串替换及小技巧

    vi/vim 中可以使用 :s 命令来替换字符串.以前只会使用一种格式来全文替换,今天发现该命令有很多种写法(vi 真是强大啊,还有很多需要学习),记录几种在此,方便以后查询. :s/vivian/s ...