#!/usr/bin/env python
__author__ = "lrtao2010" #python3.7 迭代器和生成器 #迭代器协议:
'''
1、迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,
要么就引起一个StopIteration异常,已终止迭代,只能往后走,不能往前退.
2、可迭代对象:实现了迭代器协议的对象(对象内部定义一个__iter__()方法),节省内存
3、协议是一种约定,可迭代对象实现了迭代器协议,Python的内部工具(如for、sum、min、max等)
使用迭代器协议访问对象。
''' #for 循环的强大功能
'''
字符串,列表,元祖,字典,集合。这些都不是可迭代对象(没有next方法),在for 循环中,调用了他们的内部
__iter__方法,把他们变成了可迭代对象。
for循环调用可迭代对象的__next__方法去取值,并且for 循环可以捕捉StopIteration异常,终止迭代。 '''
# l_test=[1,2,3]
# iter_l_test=l_test.__iter__()
# print(iter_l_test.__next__())
# print(iter_l_test.__next__())
# print(iter_l_test.__next__())
# print(iter_l_test.__next__())
# # 1
# # 2
# # 3
# # Traceback (most recent call last):
# # File "D:/python3/app/Module_and_Functions/iterator_and_generator.py", line 28, in <module>
# # print(iter_l_test.__next__())
# # StopIteration #用whilex循环模拟for循环
# l_test=[1,2,3]
# iter_l_test=l_test.__iter__()
# while True:
# try:
# #print(iter_l_test.__next__())
# print(next(iter_l_test))
# except StopIteration:
# #print('end')
# break #生成器
'''
生成器也是一种数据类型,这种数据类型自动实现了“迭代器协议”,生成器是可迭代对象。 生成器分类:
1、生成器函数:常规函数定义,但是使用yield语句而不是return 语句返回结果,yield语句
一次返回一个结果,可以使用多次,在每个结果中间,挂起函数的状态,以便下次从它离开的地方
继续执行。 2、生成器表达式:类似列表推导式,生成器返回按需产生结果的一个对象,而不是一次构建
一个完整的结果列表 生成器优点:
在需要的时候才产生结果,不是立即产生结果
''' #生成器函数
# def g_test():
# yield 1
# yield 2
# yield 3
# g_test1=g_test()
# print(g_test1)
# print(g_test1.__next__())
# print(g_test1.__next__())
# print(g_test1.__next__())
# # <generator object g_test at 0x0000000002163570>
# # 1
# # 2
# # 3 #生成器表达式,大数据不会占用大内存
# l_g = ('%s' %i for i in range(10) if i%2 == 0)
# print(l_g)
# print(l_g.__next__())
# print(l_g.__next__())
#print(next(l_g))
# print(l_g.__next__())
# <generator object <genexpr> at 0x0000000002133570>
#
#
#
# #三元表达式
# name = 'test'
# res='True' if name == 'test' else 'False'
# print(res)
# True #列表解析,大数据占用内存比较大
# l_test1=['%s' %i for i in range(10)]
# l_test2=['%s' %i for i in range(10) if i%2 == 0]
# print(l_test1)
# print(l_test2)
# ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
# ['0', '2', '4', '6', '8'] #生成器总结
'''
1、节省内存
2、提高代码可读性
3、只能遍历一次,只能遍历一次,只能遍历一次
'''

python3.7 迭代器和生成器的更多相关文章

  1. python3.5-day5_迭代器_生成器_装饰器_模块

    笔者QQ 360212316 迭代器&生成器 生成器: 一个函数调用返回一个迭代器,那这个函数叫做生成器,如果函数中包含yield语法,那么这个函数就会变成生成器 生成器的特点: 1.生成器必 ...

  2. 【Python3之迭代器,生成器】

    一.可迭代对象和迭代器 1.迭代的概念 上一次输出的结果为下一次输入的初始值,重复的过程称为迭代,每次重复即一次迭代,并且每次迭代的结果是下一次迭代的初始值 注:循环不是迭代 while True: ...

  3. python3 之 迭代器与生成器

    迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,知道所有的元素被访问完结束. 迭代器只能往前不会后 ...

  4. Python3+迭代器与生成器

    转载Python3 迭代器与生成器 迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素 ...

  5. python3基础: 元组tuple、 列表list、 字典dict、集合set。 迭代器、生成器

    一.元组: tuple Python 的元组与列表类似,不同之处在于元组的元素不能修改. 元组中的元素值是不允许删除的,但我们可以使用del语句来删除整个元组 tup2 = (111, 22, 33, ...

  6. python014 Python3 迭代器与生成器

    Python3 迭代器与生成器迭代器迭代是Python最强大的功能之一,是访问集合元素的一种方式..迭代器是一个可以记住遍历的位置的对象.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结 ...

  7. python3基础: 元组tuple、 列表list、 字典dict、集合set。 迭代器、生成器

    一.元组: tuple Python 的元组与列表类似,不同之处在于元组的元素不能修改. 元组中的元素值是不允许删除的,但我们可以使用del语句来删除整个元组 tup2 = (111, 22, 33, ...

  8. python3: 迭代器与生成器(1)

    1. 手动遍历迭代器 你想遍历一个可迭代对象中的所有元素,但是却不想使用for循环. >>> items = [1, 2, 3] >>> # Get the ite ...

  9. python3迭代器和生成器

    1.手动访问迭代器中的元素 #要手动访问迭代器中的元素,可以使用next()函数 In [3]: with open('/etc/passwd') as f: ...: try: ...: while ...

随机推荐

  1. stdafx.h预编译头

    转自http://blog.csdn.net/qingkong8832/article/details/6695123 stdafx.h 1名称的英文全称为:Standard Application  ...

  2. AD Framework 单点登录

    单点登录 单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一.SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统. 中 ...

  3. 《Head First 设计模式》之装饰者模式——饮料加工

    装饰者模式(Decorator) ——动态地将责任附加到对象上.若要扩展功能,装饰者提供了比继承更有弹性的替代方案. 特点:建立拥有共同超类的装饰者与被装饰者来实现功能的动态扩展 原则:对扩展开放,对 ...

  4. 可视化工具Navicat的使用/pymysql模块的使用

    一.可视化工具Navicat的使用 1.官网下载:http://www.navicat.com/en/products/navicat-for-mysql 2.网盘下载:http://pan.baid ...

  5. 【前端】Chrome DevTools 笔记

    1. 查看网络耗时 timeline 生命周期按照以下类别显示花费的时间: Queuing Stalled 如果适用:DNS lookup.initial connection.SSL handsha ...

  6. androidStudio修改包名 Android 如何修改包名(同一个手机可以跑2个eros 项目)。

    修改applicationId(gradle.properties). 2.即时同步更新过去,否则不报错

  7. Android各大手机系统打开权限管理页面

    最近项目上比较忙,终于有空闲时间写写东西了. 相信做过Android的都知道,现在的手机系统五花八门,当我们去请求用户的权限的时候,总是会弹出是否允许的对话框. 而且用户一旦不小心点了拒绝,下次就不再 ...

  8. 基于mllib的协同过滤实战(电影推荐)

    //加载需要的包 import org.apache.spark.rdd._ import org.apache.spark.mllib.recommendation.{ALS, Rating, Ma ...

  9. js在一个div里面移动其子div

    var ChildDiv = $("#cid"); var width = 0; //鼠标点击子div的地方和子div的左边边距距离 var height = 0; //鼠标点击子 ...

  10. java中list强转为map类型

    起因:读取数据库文件的测试用例,测试用例需要存放到一个map中,方便下次调用, 读取的内容返回的内容存放在一个list中,并且数据内容是key=value的形式,最开始使用切片方式,做了很多无用功,后 ...