前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python 迭代器与生成器

Python 迭代器与生成器

作者头像
星哥玩云
发布2022-09-08 12:52:20
2480
发布2022-09-08 12:52:20
举报
文章被收录于专栏:开源部署

一、可迭代对象

1、概念

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

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

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

Iterable表示可迭代类型

代码语言:javascript
复制
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()

实例:

代码语言:javascript
复制
#转成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、回顾

只能生成简单的列表

代码语言:javascript
复制
print(list(range(1,11)))

3、需求

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

4、实现

循环生成列表

代码语言:javascript
复制
li = []
for i in range(1, 11):
    li.append(pow(i, 2))
print(li)

缺点:循环比较繁琐

列表生成式

作用

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

一般形式

代码语言:javascript
复制
li2 = [x * x for x in range(1, 11)]
print(li2)

添加判断

代码语言:javascript
复制
li3 = [x * x for x in range(1, 11) if x % 2 == 0]
print(li3)

多层循环

代码语言:javascript
复制
li4 = [x + y for x in "ABC" for y in "123"]
print(li4)

拆分

代码语言:javascript
复制
<span class="hljs-keyword">for</span> x <span class="hljs-keyword">in</span> <span class="hljs-string">"ABC"</span>:
    <span class="hljs-keyword">for</span> y <span class="hljs-keyword">in</span> <span class="hljs-string">"123"</span>:
        ret = x + y

四、生成器

1、概述

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

2、注意

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

3、实现

使用函数实现

代码语言:javascript
复制
#函数
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)

使用列表生成式实现

代码语言:javascript
复制
g1 = (x * x for x in range(1, 11))
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、可迭代对象
    • 1、概念
      • 2、可以直接作用于for循环的数据类型
      • 二、迭代器
        • 1、概念
          • 2、为什么list、tuple、dict、string、set等数据类型不是Iterator?
          • 三、列表生成式
            • 1、概述
              • 2、回顾
                • 3、需求
                  • 4、实现
                  • 四、生成器
                    • 1、概述
                      • 2、注意
                        • 3、实现
                        领券
                        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档