一、迭代器

L=[1,,2,3,4,5,]
  取值:索引、循环for
  循环for的取值:list列表 dic字典 str字符串 tuple元组 set f=open()句柄 range() enumerate枚举
  for i in L:

告诉我列表所拥有的所有方法

print(dir[])

判断某一数据类型是否有__iter__方法(是否可迭代)

print('__iter__' in dir(int))
print('__iter__' in dir(bool))
print('__iter__' in dir(list))
print('__iter__' in dir(dict))
print('__iter__' in dir(set))
print('__iter__' in dir(tuple))
print('__iter__' in dir(enumerate([])))
print('__iter__' in dir(range(1)))

只要能被for循环的数据类型,都有_iter_方法

print([].__iter__())

一个列表执行了__iter__()之后的返回值就是一个迭代器

print(dir([]))
print(dir([].__iter__()))
print(set(dir([].__iter__())) - set(dir([])))
print([1,'a','bbb'].__iter__().__length_hint__()) #元素个数
l = [1,2,3]
iterator = l.__iter__()
print(iterator.__next__())
print(iterator.__next__())
print(iterator.__next__())
print(iterator.__next__())

迭代器的概念:
  内部含有_next_方法和_iter_方法的就是迭代器

可迭代协议:只要含有_iter_方法的就是可迭代的
迭代器协议:内部含有_next_方法和_iter_方法的就是迭代器

可以被for循环的都是可迭代的

可迭代的内部都有_iter_方法

Iterable 可迭代的
_iter_--->只要含有_iter_方法的,都是可迭代的,都可以被for循环
[]._iter_() 迭代器
_next_--->通过next方法就可以从迭代器一个一个取值

for循环其实就是在使用迭代器

iterator
可迭代对象
直接给你内存地址

关于for循环

只有是可迭代对象的时候,才能用for循环
当我们遇到一个新的变量,不能确定能不能循环的时候,判断他是否可迭代
print(_iter _ in dir([]))
print(_iter _ in dir(int))

迭代器的好处:

1.从容器类型中一个一个的取值,会把所有的值取到。
2.可以节省内存空间
3.迭代器不会在内存中再占用一大块内存,而是随着循环,每次生成一个,每次next,每次给我一个
4.方便使用,且每个迭代器只能全部取一次

二、生成器:----迭代器
  生成器函数:----本质上是自己写的函数

生成器函数:只要含有yield关键字的函数都是生成器函数
      yield只能写在函数内部,不能和return共用

def generator():
print(1)
yield 'a' ret = generator()
print(ret)

生成器函数

生成器函数的特点:

1.调用函数的之后函数不执行,返回一个生成器
def generator():
print(1)
return 'a' ret = generator()
print(ret)
2.每调用一次__next__方法会取到一个值
def generator():
print(1)
yield 'a'
print(2)
yield 'b'
yield 'c' g = generator()
ret = g.__next__()
print(ret)
ret = g.__next__()
print(ret)
ret = g.__next__()
print(ret)

__next__方法

3.直到取完最后一个,在执行next会报错

打印2000000000个哇哈哈

def wahaha():
for i in range(2000000):
yield '娃哈哈%s' % i

生成器函数

g = wahaha()

调用生成器函数得到一个生成器

print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())

每调用一次__next__方法会取到一个值

g = wahaha()
count = 0
for i in g:
count +=1
print(i)
if count > 50:
break

用for循环取值

从生成器中取值的几个方法

    1.每调用一次__next__方法会取到一个值
2.用for循环批量取值
3.数据类型的强制转换

监听文件输入例子

def tail(filename):
f = open(filename, encoding='utf-8')
while True:
line = f.readline()
if line.strip():
yield line.strip() g = tail('file')
for i in g:
if 'python' in i:
print('***', i)

文件监听,特定字符打印

Python之路----迭代器与生成器的更多相关文章

  1. python之路——迭代器和生成器

    阅读目录 楔子 python中的for循环 可迭代协议 迭代器协议 为什么要有for循环 初识生成器 生成器函数 列表推导式和生成器表达式 本章小结 生成器相关的面试题 返回顶部 楔子 假如我现在有一 ...

  2. python之路--迭代器和生成器

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

  3. Python之路迭代器协议、for循环机制、三元运算、列表解析式、生成器

    Python之路迭代器协议.for循环机制.三元运算.列表解析式.生成器 一.迭代器协议 a迭代的含义 迭代器即迭代的工具,那什么是迭代呢? #迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的 ...

  4. python is、==区别;with;gil;python中tuple和list的区别;Python 中的迭代器、生成器、装饰器

    1. is 比较的是两个实例对象是不是完全相同,它们是不是同一个对象,占用的内存地址是否相同 == 比较的是两个对象的内容是否相等 2. with语句时用于对try except finally 的优 ...

  5. python设计模式之迭代器与生成器详解(五)

    前言 迭代器是设计模式中的一种行为模式,它提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示.python提倡使用生成器,生成器也是迭代器的一种. 系列文章 python设计模 ...

  6. Python 闭包、迭代器、生成器、装饰器

    Python 闭包.迭代器.生成器.装饰器 一.闭包 闭包:闭包就是内层函数对外层函数局部变量的引用. def func(): a = "哈哈" def func2(): prin ...

  7. Python高手之路【九】python基础之迭代器与生成器

    迭代器与生成器 1.迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外 ...

  8. Python基础之迭代器和生成器

    阅读目录 楔子 python中的for循环 可迭代协议 迭代器协议 为什么要有for循环 初识生成器 生成器函数 列表推导式和生成器表达式 本章小结 生成器相关的面试题 返回顶部 楔子 假如我现在有一 ...

  9. Python中的迭代器和生成器

    本文以实例详解了python的迭代器与生成器,具体如下所示: 1. 迭代器概述: 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后 ...

随机推荐

  1. CentOS7.5安装Tomcat8

    一.tomcat的简介 这是Apache Tomcat Servlet / JSP容器的文档包的顶级入口点 .的Apache Tomcat 8.0版实现了Servlet 3.1和JavaServer ...

  2. POJ-2184 Cow Exhibition(01背包变形)

    Cow Exhibition Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10949 Accepted: 4344 Descr ...

  3. hdu 2444 The Accomodation of Students 【二分图匹配】

    There are a group of students. Some of them may know each other, while others don't. For example, A ...

  4. c++从文件中读取一行数据并保存在数组中

    从txt文本中读取数据存入数组中 #include <iostream> #include <fstream> #include <string> #include ...

  5. HDU 3045 - Picnic Cows - [斜率DP]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3045 It’s summer vocation now. After tedious milking, ...

  6. MySQL在linux上的source code安装方法(configure)

    1.建立操作系统用户和组 [root@faspdev ~]# groupadd mysql [root@faspdev ~]# useradd -g mysql mysql 2.解压安装文件,进入解压 ...

  7. angular2新建的项目上传github

    前提1.git配置好,参见博文 git常用操作 2.angular2安装配置好,这个网上有很多教程,就不多说了,参见angular2快速起步 需要注意的是,大部分问题都是网络问题. 3.新建一个ng项 ...

  8. POJ3468 a simple problem with integers 分块

    题解:分块 解题报告: 是个板子题呢qwq 没什么可说的,加深了对分块的理解趴还是 毕竟这么简单的板子题我居然死去活来WA了半天才调出来,,,哭了QAQ 还是说下我错在了哪几个地方(...是的,有好几 ...

  9. 大数据智能SOC解决方案

  10. sql批量修改wordpress文章发布时间

    有时为了体现wordpress文章的更新程度,会在后台那边重新设置发布时间,有没更简单的方法呢?用sql批量修改wordpress文章发布时间怎么操作呢? UPDATE `wp_posts` SET ...