生成器 & 迭代器

列表生成式

现在有个需求,列表[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. Python学习笔记之发展史、简介以及特点

    Python发展史 Python 是由 Guido van Rossum 在八十年代末和九十年代初,在荷兰国家数学和计算机科学研究所设计出来的. Python 本身也是由诸多其他语言发展而来的,这包括 ...

  2. how to create folders in batches

    you need be good at thinking when you see problem. Work experience:when you need to copy web chinese ...

  3. 开源监控zabbix的搭建

    yum-nginx-php-mysql 1.依赖安装 1.依赖 yum -y install pcre* openssl* 2.php rpm -Uvh https://mirror.webtatic ...

  4. 关于Oracle死锁处理方法

    关于数据库死锁的检查方法一.         数据库死锁的现象程序在执行的过程中,点击确定或保存按钮,程序没有响应,也没有出现报错.二.         死锁的原理当对于数据库某个表的某一列做更新或删 ...

  5. IOS HTML+CSS+JS 总结

    一.HTML + CSS 1.能看到标签的结构* 父子关系<p>    <span>123</span></p> * 属性<img src=&qu ...

  6. CodeForces 30C Shooting Gallery 简单dp

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/qq574857122/article/details/36944227 题目链接:点击打开链接 给定 ...

  7. 程序的优化(PHP)

    有些小细节往往容易被人忽视.有时候常常说优化代码优化代码,但是实际操作的时候,最容易被忽视的如下所示: echo 比 print 快. 使用echo的多重参数代替字符串连接. 在执行for循环之前确定 ...

  8. intellij idea下载安装以及创建项目(输出Hello World)

    主题一:下载 第一:可以百度下载 第二:直接进行官网链接下载地址:http://www.jetbrains.com/idea/ 第一步: 第二步: 下载完成后进行安装 主题二:安装 点击Next速度可 ...

  9. CSU 1023 修路(二分+模拟)

    前段时间,某省发生干旱,B山区的居民缺乏生活用水,现在需要从A城市修一条通往B山区的路.假设有A城市通往B山区的路由m条连续的路段组成,现在将这m条路段承包给n个工程队(n ≤ m ≤ 300).为了 ...

  10. MongoDB 和 Mongoose 04

    一.安装 1. 相关 https://www.mongodb.org/dl/win32/ MongoDB的版本偶数版本为稳定版,奇数版本为开发版 MongoDB对于32位系统支持不佳,所以3.2版本以 ...