生成器 & 迭代器

列表生成式

现在有个需求,列表[1, 2, 3, 4, 5, 6, 7, 8, 9],将列表里的每个值加1。

  • 二逼青年版

a = [1, 2, 3, 4, 5, 6, 7, 8, 9] b = []
for item in a:
b.append(item + 1)
a = b
print(a)
  • 普通青年版
a = [1, 2, 3, 4, 5, 6, 7, 8, 9]

for index, ele in enumerate(a, 0):
a[index] += 1 print(a)
  • 文艺版(lambda + map 搭配使用)
a = [1, 2, 3, 4, 5, 6, 7, 8, 9]

a = list(map(lambda x:x+1,a))
print(a)
  • 装逼青年版
a = [1, 2, 3, 4, 5, 6, 7, 8, 9]

print([i + 1 for i in a])
  • 这种写法就是列表生成式
  • 习题:利用列表生成式一行代码实现9 * 9乘法表
print('\n'.join([''.join(['%d * %d = %-3d' % (i, j, i * j) for j in range(1, i + 1)]) for i in range(1, 10)]))

生成器

  • 通过列表生成式,可以直接创建一个列表,但是毕竟内存有限,列表的容量也是有限的。创建一个包含100万个元素的列表,但是我们仅仅需要访问前面几个元素,这就造成了内存大量白白浪费。
  • 在python中有一种更好的解决方式,边循环边计算的机制。称为(generator)
  • 简单创建生成器(只需要把列表生成器的方括号改成括号)
g = (i for i in range(5))

print(type(g),g.next())
  • next()取值和for循环取值
# 使用next()取值
g = (i for i in range(5))
print(type(g))
print('开始取值')
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
# print(next(g)) # 报错:StopIteration,因为取不到值了 # 基本上不会使用next(),正确应该使用for循环。而且还不需要担心会报错。拿不到函数return返回值
g = (i for i in range(10))
for i in g:
print(i)
  • 斐波拉契
# 斐波拉契:1 1 2 3 5 8 13 21
def fbi(num):
n, a, b = 0, 0, 1
while n < num:
yield b # # 到这停止,可以理解为冻结当前代码。并且,把值返回给外面的next()
print(a, b)
a, b = b, a + b
n += 1 for i in fbi(2):
print(i)
  • 代码解析:

    • return 和 yield 的区别

      • 返回并终止函数
      • 返回数据,并冻结当前的执行过程。
      • next()唤醒冻结函数的执行过程,继续执行,直到遇到下一个yield
    • 函数加了yield之后
      • 函数()就得到了生成器,不next()不开始执行。
      • return 在生成器里,代表生成器的终止,直接报错
  • 深入

# 生成器send,相当于唤醒。
def work(n):
count = 0
while count < n:
count += 1
sign = yield count
print('sign的值:',sign)
if not sign:
yield count + 2 new_range = work(4)
# res = next(new_range) # 开始第一次取值 拿到一个1
# print(res) # 1
# res1 = new_range.send(True) # 第二次取值 发送一个true 函数遇到true 循环
# print(res1) # 2
# res2 = new_range.send(False) # 第三次取值 n=3
# print(res2)

迭代器

  • 可以作用for循环的类型:

    • 集合类型:str、list、tuple、dict、set
    • generator:生成器和带yield的函数

    这些类型称为可迭代对象:iterable

    from collections import Iterable
    
    print(isinstance([],Iterable))
    print(isinstance('',Iterable))
    print(isinstance({},Iterable))
    print(isinstance(set(),Iterable))
    print(isinstance((i for i in range(2)),Iterable))
  • 生成器不仅可以作用域for还可以被next()不断取值,直到没有数据可取

from collections import Iterator
print(isinstance((i for i in range(2)),Iterator))

总结

  • 凡是可以作用于for循环的对象都是可迭代对象,Iterable
  • 凡是可以作用于next()的对象都是迭代器,Iterator
  • 集合数据类型虽然不是迭代器,但是可以通过iter()函数变成Iterator。

003---生成器 & 迭代器的更多相关文章

  1. python高级之生成器&迭代器

    python高级之生成器&迭代器 本机内容 概念梳理 容器 可迭代对象 迭代器 for循环内部实现 生成器 1.概念梳理 容器(container):多个元素组织在一起的数据结构 可迭代对象( ...

  2. Python自动化 【第四篇】:Python基础-装饰器 生成器 迭代器 Json & pickle

    目录: 装饰器 生成器 迭代器 Json & pickle 数据序列化 软件目录结构规范 1. Python装饰器 装饰器:本质是函数,(功能是装饰其它函数)就是为其他函数添加附加功能 原则: ...

  3. 第三篇:python高级之生成器&迭代器

    python高级之生成器&迭代器   python高级之生成器&迭代器 本机内容 概念梳理 容器 可迭代对象 迭代器 for循环内部实现 生成器 1.概念梳理 容器(container ...

  4. python 生成器 迭代器

    阅读目录 一 递归和迭代 二 什么是迭代器协议 三 python中强大的for循环机制 四 为何要有for循环 五 生成器初探 六 生成器函数 七 生成器表达式和列表解析 八 生成器总结 一 递归和迭 ...

  5. day6学python 生成器迭代器+压缩文件

    生成器迭代器+压缩文件 readme的规范 1软件定位,软件的基本功能2运行代码的方法:安装环境,启动命令3简要的使用说明4代码目录结构说明,更详细点可以说明软件的基本原理5常见问题说明 ====== ...

  6. python 基础 4.4 生成式 生成器 迭代器

    一.生成式和生成器   列表生成式是python受欢迎的语法之一,通过一句简洁的语法就可以对一组元素进行过滤,还可以对得到的元素进行转换处理.   #/usr/bin/python #coding=u ...

  7. PYDay10&11&12&13-常用模块:time|datetime|os|sys|pickle|json|xml|shutil|logging|paramiko、configparser、字符串格式化、py自动全局变量、生成器迭代器

    1.py文件自动创建的全局变量 print(vars()) 返回值:{'__name__': '__main__', '__package__': None, '__loader__': <_f ...

  8. python学习之- 生成器/迭代器

    列表生成式写法: [ i*2 for i in range(10) ]也可以带函数 [ fun(i) for i in range(10) ] 生成器:一边循环一边计算的机制称为生成器.在常用函数中, ...

  9. %----format 格式化字符串---- 生成器---- 迭代器

    %方式格式化字符串 顺序传参数 o转换8进制x转换十六进制 tp1 = "i am %s" % "alex"tp2 = "i am %s age %d ...

  10. python3 生成器&迭代器

    #Author by Andy#_*_ coding:utf-8 _*_import timefrom collections import Iterable#列表生成式def func(): lis ...

随机推荐

  1. May 30th 2017 Week 22nd Tuesday

    Knowledge will give you power, but character respect. 知识给你力量,品格给你别人的尊敬. Good characters can help us ...

  2. 数据结构与算法分析java——树2(二叉树类型)

    1. 二叉查找树 二叉查找树(Binary Search Tree)/  有序二叉树(ordered binary tree)/ 排序二叉树(sorted binary tree) 1). 若任意节点 ...

  3. 我对git 、github的初印象

    前言:都说,要在IT这行混得风生水起,就必须不断接触新事物.学习新东西.然而,这个重要的点也是难做的点.当老师要我们用博客交作业的时候,我就觉得挺新鲜了,在知道很多牛逼的程序猿还会用到git和gith ...

  4. IOS 极光推送(第三方框架)

    下载极光推送文件,将以下两个文件导入项目中 APService.h libpushSDK.a #import "HMAppDelegate.h" #import "APS ...

  5. Android(java)学习笔记40:WindowManager 中LayoutParams的各种属性

    1. WindowManager 中LayoutParams的各种属性 WindowManager.LayoutParams 是 WindowManager 接口的嵌套类(内部类):它继承于 View ...

  6. 【LOJ6041】「雅礼集训 2017 Day7」事情的相似度(用LCT维护SAM的parent树)

    点此看题面 大致题意: 给你一个\(01\)串,每次询问前缀编号在一段区间内的两个前缀的最长公共后缀的长度. 离线存储询问 考虑将询问离线,按右端点大小用邻接表存下来(直接排序当然也可以啦). 这样的 ...

  7. 大整数乘法(POJ2389)

    题目链接:http://poj.org/problem?id=2389 #include <stdio.h> #include <string.h> #define Max 1 ...

  8. sparkStreamming原理

    一.Spark Streamming 是基于spark流式处理引擎,基本原理是将实时输入的数据以时间片(秒级)为单位进行拆分,然后经过spark引擎以类似批处理的方式处理每个时间片数据. 二.Spar ...

  9. 【转】onConfigurationChanged

    http://blog.csdn.net/xiaodongvtion/article/details/679938 转载自该文章. 注意:onConfigurationChanged事件并不是只有屏幕 ...

  10. darknet53 yolo 下的识别训练

    [目录] 一. 安装Darknet(仅CPU下) 2 1.1在CPU下安装Darknet方式 2 1.2在GPU下安装Darknet方式 4 二. YOLO.V3训练官网数据集(VOC数据集/COCO ...