一、什么是迭代器

迭代指的是一个重复的过程,每一次重复都是基于上一次的结果而来的

  1. # 这里的循环也是一个迭代,每次基于上一次的结果而取值
  2. li = 'hello'
  3.  
  4. i = 0
  5. while i < len(li):
  6. print(li[i])
  7. i += 1

迭代器指的是迭代取值的工具,该工具的特点是可以不依赖于索引取值

二、为何要用迭代器

  为了找出一种通用的、可以不依赖于索引的迭代取值方式

三、如何使用迭代器

可迭代的对象:但凡内置有 __iter__ 方法的对象都称之为可迭代的对象

  如:str、list、tuple、dict、set、文件对象

迭代器对象:既内置有 __iter__方法,又内置有 __next__ 方法

  如:文件对象

关于 __iter__ 方法:

  调用可迭代对象的 __iter__ 会的到一个迭代器对象

  调用迭代器对象的 __iter__ 会的到迭代器本身

可迭代对象可以转化为迭代器对象:调用可迭代对象内置的 __iter__ 方法会有一个返回值,该返回值就是对应的迭代器对象

  1. dic = {'x':1, 'y':2, 'z':3}
  2.  
  3. iter_dic = dic.__iter__()
  4. print(iter_dic)
  5.  
  6. res1 = iter_dic.__next__()
  7. print(res1)
  8.  
  9. res2 = iter_dic.__next__()
  10. print(res2)
  11.  
  12. res3 = iter_dic.__next__()
  13. print(res3)
  14. # 每次取一个值, 取完了没有就会报错
  15. res4 = iter_dic.__next__()
  16. print(res4)

使用迭代器

  1. dic = {'x':1, 'y':2, 'z':3}
  2.  
  3. # 注意:这样每次只会取到x,因为每次取值都是从dic去取,不是基于上一次的结果
  4. print(dic.__iter__().__next__())
  5. print(dic.__iter__().__next__())
  6. print(dic.__iter__().__next__())

注意

四、for循环的本质

for循环的本质就是一个迭代器,原理如下:

  1、先调用for语句中in后面的值的 __iter__ 方法,得到迭代器对象

  2、执行迭代器 __next__ 方法得到一个返回值,然后赋值给一个变量,运行循环体代码

  3、循环往复,直到迭代器取值完毕抛出异常,然后捕捉异常自动结束循环

 五、生成器

常规定义函数,但是,使用yield语句而不是return语句返回结果。yield语句执行一次返回一个结果

yield关键字:只能用在函数内

在函数内但凡包含有yield关键字,再去执行函数,就不会立刻运行函数体代码,会得到一个返回值,该返回值成之为生成器对象,生成器本质就是迭代器

总结 yield:

  1、提供一种自定义迭代器的解决方案

  2、yield可用于返回值,和return相比,相同点是都可以用于返回值,不同点是yield可以暂停函数,可以返回多次值,而return只能返回值一次值函数就立刻终止

  1. def func(): # 这是一个简单的函数
  2. a = 1
  3. return a
  4.  
  5. print(func())
  6.  
  7. def func():
  8. print('aaaaaaaaaaa')
  9. a = 1
  10. yield a # 返回第一个值
  11. print('bbbbbb')
  12. yield 12 # 返回第二个值
  13.  
  14. ret = func() # 得拿到一个生成器
  15. # print(ret) # 返回的是一个地址
  16. print(next(ret)) # 取第一个值
  17. print(next(ret)) # 取第二个值
  18. print(next(ret)) # 取第三个值,会报错,因为没有yield第三个值

初始生成器

练习:写一个功能,在Python3中实现Python2使用range函数的效果

Python2中使用 range 会将结果打印出来,Python3则不会

  1. def my_range(start, stop, step=1):
  2. while start < stop:
  3. yield start
  4. start += step
  5.  
  6. res = my_range(1, 5, 2) # 1 3
  7.  
  8. next(res)
  9. next(res)

补充:

三元表达式:将简单的 if--else 语句用一条语句完成

  1. x = 10
  2. y = 20
  3. if x > y:
  4. res = x
  5. else:
  6. res = y
  7.  
  8. print(res)
  9.  
  10. # ========================================================================================
  11.  
  12. x = 10
  13. y = 20
  14. res = x if x > y else y
  15. print(res)

三元表达式

列表生成式

  1. names = ['qiu', 'xi', 'qiuxi', 'zhi', 'fei']
  2. l = []
  3. for name in names:
  4. if name != 'qiu':
  5. res = '%s_1024' %name
  6. l.append(res)
  7.  
  8. print(l)
  9.  
  10. # ========================================================================================
  11.  
  12. l = ['%s_1024' %name for name in names if name != 'qiuxi']
  13. print(l)

列表生成式

字典生成式

  1. items = [('name', 'qiuxi'), ('age', 22), ('sex', 'male')]
  2.  
  3. dic = {}
  4. for k, v in items:
  5. dic[k] = v
  6. print(dic)
  7.  
  8. # ========================================================================================
  9.  
  10. res = {k: v for k, v in items if k != 'sex'}
  11. print(res)

字典生成式

生成器表达式

  1. res=(i**2 for i in range(3))
  2. print(res)
  3. print(next(res))
  4. print(next(res))
  5. print(next(res))
  6. print(next(res))

生成器表达式

Learning-Python【13】:迭代器和生成器的更多相关文章

  1. python之迭代器与生成器

    python之迭代器与生成器 可迭代 假如现在有一个列表,有一个int类型的12345.我们循环输出. list=[1,2,3,4,5] for i in list: print(i) for i i ...

  2. python基础—迭代器、生成器

    python基础-迭代器.生成器 1 迭代器定义 迭代的意思是重复做一些事很多次,就像在循环中做的那样. 只要该对象可以实现__iter__方法,就可以进行迭代. 迭代对象调用__iter__方法会返 ...

  3. python的迭代器、生成器、装饰器

    迭代器.生成器.装饰器 在这个实验里我们学习迭代器.生成器.装饰器有关知识. 知识点 迭代器 生成器 生成器表达式 闭包 装饰器 实验步骤 1. 迭代器 Python 迭代器(Iterators)对象 ...

  4. Python之迭代器和生成器

    Python 迭代器和生成器 迭代器 Python中的迭代器为类序列对象(sequence-like objects)提供了一个类序列的接口,迭代器不仅可以对序列对象(string.list.tupl ...

  5. 【Python】迭代器、生成器、yield单线程异步并发实现详解

    转自http://blog.itpub.net/29018063/viewspace-2079767 大家在学习python开发时可能经常对迭代器.生成器.yield关键字用法有所疑惑,在这篇文章将从 ...

  6. Python之迭代器,生成器

    迭代器 1.什么是可迭代对象 字符串.列表.元组.字典.集合都可以被for循环,说明他们都是可迭代的. from collections import Iterable l = [1,2,3,4] t ...

  7. python之迭代器、生成器与面向过程编程

    目录 一 迭代器 二 生成器 三 面向过程编程 一.迭代器 1.迭代器的概念理解 ''' 迭代器从字面上理解就是迭代的工具.而迭代是每次的开始都是基于上一次的结果,不是周而复始的,而是不断发展的. ' ...

  8. day13 python学习 迭代器,生成器

    1.可迭代:当我们打印 print(dir([1,2]))   在出现的结果中可以看到包含 '__iter__', 这个方法,#次协议叫做可迭代协议 包含'__iter__'方法的函数就是可迭代函数 ...

  9. Python之迭代器及生成器

    一. 迭代器 1.1 什么是可迭代对象 字符串.列表.元组.字典.集合 都可以被for循环,说明他们都是可迭代的. 我们怎么来证明这一点呢? from collections import Itera ...

  10. python基础----迭代器、生成器、协程函数及应用(面向过程实例)

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

随机推荐

  1. python全栈开发 * 31知识点汇总 * 180716

    31 模块和包一.模块(一)模块的种类:内置模块,自定义模块,扩展模块第三方模块(二)自定义模块 1.模块的创建 : 新建一个py文件. 2.模块名 : 模块名需要符合变量的命名规范. 3.模块的导入 ...

  2. Gym 101873I - Uberwatch - [DP]

    题目链接:http://codeforces.com/gym/101873/problem/I 题意: 给出 $n(1 \le n \le 300000)$ 个单位时间,每个单位时间给出一个 $x_i ...

  3. 解决adb:error: unknown host service

    1.在使用adb命令跑程序时出现adb: error: failed to get feature set: unknown host service 输入adb shell 时提示error: un ...

  4. ajax中的同步与异步修改数据的问题

    这次项目中因为前端有事儿,项目紧急加个新需求,于是自己硬着头皮上去看了下前端的逻辑后便开始动手了,但是为了简单起见就直接自己写了个ajax调服务来获取数据,然后修改前端定义的全局数据 //ajax来请 ...

  5. bugfree3.0.1-导入excel测试用例

    大多数项目里只用BugFree做缺陷管理工具,其实还可以通过该工具导入测试用例,记录测试结果,最后获得统计结果. 难点 1.导入文件要求XML格式: 2.一般我们的测试用例都是用excle文件存取,很 ...

  6. python tkinter button

    """小白随笔,大佬勿喷""" '''Button按钮 点击执行对应的命令''' import tkinter as tk #初始化窗口 w ...

  7. 搭建sftp

    参考:https://www.cnblogs.com/heyanan/p/8178480.html 需要注意两点:1.链接时候选择sftp不要选择ftp 2.目录权限严格按照参考文章设置

  8. [js]js杂项陆续补充中...

    hasOwnProperty判断对象是否有这个属性 p = { 'name': 'maotai', 'age': 22 }; console.log(p.hasOwnProperty('names') ...

  9. java Quartz定时器任务与Spring 的实现

    1.xml配置 <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http:/ ...

  10. HBase 笔记1

    cap理论: 一致性  可用性   可靠性 任何分布式系统只能最多满足上面2点,无法全部满足 NOSQL  = Not Only SQL = 不只是SQL HBase速度并不快,知识当数据量很大时它慢 ...