阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Python 迭代器与生成器

107次阅读
没有评论

共计 2120 个字符,预计需要花费 6 分钟才能阅读完成。

一、可迭代对象

1、概念

可以直接作用于 for 循环的对象统称为可迭代对象 (Iterable)

2、可以直接作用于 for 循环的数据类型

​ 1、集合数据类型 (list、tuple、dict、set、string)
​ 2、generator
​ a、生成器
​ b、带 yield 的 generator function

Iterable 表示可迭代类型

from collections import Iterable # 格式 # isinstance(obj, type):判断 obj 是否属于 type 类型 print(isinstance([], Iterable)) print(isinstance((), Iterable)) print(isinstance({}, Iterable)) print(isinstance("", Iterable)) print(isinstance(range(10), Iterable)) print(isinstance(100, Iterable))

二、迭代器

1、概念

​ 1、可以被 next() 函数调用并返回一个值的对象为迭代器对象
​ 2、迭代器不但可以用于 for,还可以用于 next()

实例:

# 转成 Iterator 对象 li = [1,2,3,4,5] g = iter(li) print(g, type(g)) print(next(g)) print(next(g))

2、为什么 list、tuple、dict、string、set 等数据类型不是 Iterator?

Iterator 对象表示的是一个流数据,Iterator 对象可以被 next() 调用并返回一个数据,直到抛出 StopIteration 异常错误则停止。可以把数据流看成一个有序的序列,但是不确定这个序列的长度,只能通过 next() 函数不断计算求值,Iterator 可以表示一个无限大的数据流,而 list 等永远不可能存储无限的数据

三、列表生成式

1、概述

​ 生成列表

2、回顾

只能生成简单的列表

print(list(range(1,11)))

3、需求

[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

4、实现

  1. 循环生成列表

    li = [] for i in range(1, 11): li.append(pow(i, 2)) print(li)

    缺点:循环比较繁琐

  2. 列表生成式

    作用

    列表推导式提供了从序列创建列表的简单途径。

  • 一般形式

    li2 = [x * x for x in range(1, 11)] print(li2)
  • 添加判断

    li3 = [x * x for x in range(1, 11) if x % 2 == 0] print(li3)
  • 多层循环

    li4 = [x + y for x in "ABC" for y in "123"] print(li4)

    拆分

    for x in "ABC": for y in "123": ret = x + y

四、生成器

1、概述

推导的算法比较复杂,用给列表生成式的 for 循环无法实现的时候,可以选择使用函数得到生成器

2、注意

  1. 函数时顺序执行,遇到 return 语句后者最后一行代码就返回
  2. 如果想让一个函数变为生成器函数,只需将函数中的 return 改为 yield
  3. 执行生成器函数不会执行函数代码,得到一个生成器
  4. 在每次调用 next() 的时候,会执行生成器函数,遇到 yield 语句就返回,如果再次执行 next()

3、实现

使用函数实现

# 函数 def func1(): print("zutuanxue_com is a good man") print("zutuanxue_com is a nice man") print("zutuanxue_com is a cool man") print("zutuanxue_com is a handsome man") return 1 # 生成器函数 def func2(): print("zutuanxue_com is a good man") print("zutuanxue_com is a nice man") print("zutuanxue_com is a cool man") print("zutuanxue_com is a handsome man") yield 2 def func3(): print("zutuanxue_com is a good man") yield 1 print("zutuanxue_com is a nice man") yield 2 print("zutuanxue_com is a cool man") yield 3 print("zutuanxue_com is a handsome man") yield 4 res1 = func1() res2 = func2() res3 = func3() print(res1, type(res1)) print(res2, type(res2)) print(res3, type(res3)) print("------------------") print(next(res3)) print(next(res3)) print(next(res3)) print(next(res3)) def func4(): for i in range(1, 11): yield pow(i, 2) g2 = func4() for x in g2: print("-----------", x)

使用列表生成式实现

g1 = (x * x for x in range(1, 11))

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-05-26发表,共计2120字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中