首页 > 编程语言 >Python推导式、迭代器与生成器

Python推导式、迭代器与生成器

时间:2023-03-24 23:02:05浏览次数:37  
标签:__ 迭代 Python 生成器 next range print 列表

列表推导式

  • [表达式 for 局部变量名 in 可迭代对象]
  • [表达式 for 局部变量名 in 可迭代对象 if 条件]

如:

print([i**2 for i in range(1,10)])
# [1, 4, 9, 16, 25, 36, 49, 64, 81]
# 生成1~9的平方存储进列表后打印此列表

print([i**2 for i in range(1,10) if i>5])
# [36, 49, 64, 81]
# 生成1~9的平方,如果i大于5,则存储进列表,然后打印此列表
# (即生成6~9的平方存储进列表后打印此列表)

字典推导式

  • {键:值 for 局部变量名 in 可迭代对象 }
  • {键:值 for 局部变量名 in 可迭代对象 if 条件 }

如:

print({i:i**2 for i in range(1,10)})
# {1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
# 生成1~9对应1~9平方的键值对存储进字典后打印此列表

print([i**2 for i in range(1,10) if i>5])
# {6: 36, 7: 49, 8: 64, 9: 81}
# 生成1~9对应1~9平方的键值对,如果i大于5,则存储进字典,然后打印此字典
# (即生成6~9对应6~9平方的键值对存储进字典后打印此字典)

集合推导式

  • {表达式 for 局部变量名 in 可迭代对象}
  • {表达式 for 局部变量名 in 可迭代对象 if 条件}

如:

print({i**2 for i in range(1,10)})
# {64, 1, 4, 36, 9, 16, 49, 81, 25}
# 生成1~9的平方存储进集合后打印此集合

print({i**2 for i in range(1,10) if i>5})
# {64, 49, 36, 81}
# 生成1~9的平方,如果i大于5,则存储进集合,然后打印此集合
# (即生成6~9的集合存储进集合后打印此集合)

元组推导式

元组推导式和另外三种推导式有一点点不同。。。由于其返回生成器对象,所以它也叫生成器表达式(迭代器的优势:相比较于列表推导式等更节约资源)。但我们可以用tuple(或list、set等)让它成为一个名副其实的“元组推导式”:

t = (i for i in range(3))
# 普通元组推导式

t = tuple(t)
#真·“元组推导式”
  • (表达式 for 局部变量名 in 可迭代对象)
  • (表达式 for 局部变量名 in 可迭代对象 if 条件)

如:

for j in (i**2 for i in range(1,10)):
    print(j, end='  ')
# 1  4  9  16  25  36  49  64  81
# 生成1~9的平方存储进生成器对象后遍历打印

for j in (i**2 for i in range(1,10) if i>5):
    print(j, end='  ')
# 36  49  64  81
# 生成1~9的平方,如果i大于5,则存储进生成器对象,然后遍历打印
# (即生成6~9的平方存储进生成器对象后遍历打印)

推导式与双分支结构紧凑格式

我们可以将双分支结构的if-else紧凑格式与推导式搭配使用,以搭配列表推导式为例:

  • [表达式1 if 条件 else 表达式2 for 局部变量名 in 可迭代对象]
print([i**2 if i!=9 else 0 for i in range(1,10)])
# 生成1~9的平方存储进列表,如果i不是9,则正常存储进列表
# 如果此时i是9,则将当前i替换成0存储进列表,然后打印此列表

print([i**2 if i!=9 else 0 for i in range(1,10) if i>5])
# [36, 49, 64, 0]
# 生成1~9的平方存储进列表,如果i大于5且i不是9,则正常存储进列表
# 如果此时i是9,则将当前i替换成0存储进列表,然后打印此列表
# (即生成6~9的平方存储进列表,再把i=9时的结果81替换成0后打印此列表)

迭代器

  • 迭代器协议是指实现了__next__魔法方法的类。
  • 只要是遵循迭代器协议并实现__iter__魔法方法的对象都可以称作“可迭代对象”。
  • Python部分关键词(如for等)和内建函数(如sum等)都遵循迭代器协议。
  • 迭代器在无可迭代对象后会触发StopIteration异常。
  • 我们也可以通过调用内建函数iter()来创建迭代器,其实质是调用其类或对象的__iter__方法。
  • 迭代器相对普通类型更省内存。
  • 迭代器只能向后迭代,不能向前迭代。

如下,我们可以制作一个调用计数器:

class MyClass():
    counter = 0
    def __iter__(self):
       print('调用了__iter__方法!')
       return self
    def __next__(self):
        print('调用了__next__方法!')
        self.counter += 1

my_class_obj = MyClass()
next(my_class_obj)
next(my_class_obj)
next(my_class_obj)
next(my_class_obj)
print(my_class_obj.counter)

它的结果是:

调用了__next__方法!
调用了__next__方法!
调用了__next__方法!
调用了__next__方法!
4

生成器

生成器是使用yield关键词的函数。每一个生成器都是迭代器,但迭代器不一定是生成器。可以说,生成器是简化了的迭代器。

yield与return相似,但与return不同的一点是,函数会在下一次使用next函数的时候返回下一个yield结果,直到触发StopIteration异常,如:

def func():
    yield 1
    yield 2
f = func()
print(next(f))
print(next(f))
print(next(f))

其结果是:

1
2
Traceback (most recent call last):
  File "*", line *, in *
    print(next(f))
StopIteration

由上,我们可以创建一个上限为10的计数器:

def func():
    counter = 0
    for i in range(10):
        counter += 1
        yield counter

只要next方法调用次数不超过10,就不会触发StopIteration异常。

实际yield还有一种派生用法:yield from 可迭代对象,会每次自动返回其遍历可迭代对象的当前值,如下两个函数的用法是完全相同的:

def func1():
    for i in range(5):
        yield i

def func2():
    yield from range(5)

标签:__,迭代,Python,生成器,next,range,print,列表
From: https://www.cnblogs.com/XuShuo-Self/p/17253585.html

相关文章

  • 用python中的列表构建一个pandas
    importpandasaspd#创建一个包含学生信息的列表students=[['Alice',20,80],['Bob',21,75],['Charlie',19,90],['Dave',18,65]]#将列表转换为Data......
  • bing写的一段python程序
      让ai写一个和chatgpt交互的程序。用户在控制台输入内容来交互。程序不一定能正常运行,但是可以参考如果prompt参数长度过长,可以将其分成多个部分,然后将每个部分......
  • [oeasy]python0115_西里尔字符集_Cyrillic_俄文字符编码_KOI_8859系列
    各语言字符编码回忆上次内容上次回顾了非ascii的拉丁字符编码的进化过程0-127是ascii的领域西欧、北欧语言大多使用拉丁字符由iso组织制定iso-8859-1北欧原来不是......
  • 商城网站毕业设计( Python +Vue)
    网站介绍基于python开发的电子商城网站,平台采用B/S结构,后端采用主流的Python语言进行开发,前端采用主流的Vue.js进行开发。这是给师弟开发的毕业设计。整个平台包......
  • Python爬虫实战:从零开始制作一个网络爬虫
    网络爬虫,又称网页蜘蛛、网页抓取器等,是一种从互联网上自动抓取网页数据的程序。Python是编写网络爬虫的最佳语言,因为它具有简洁的语法、丰富的库和强大的社区支持。本文将......
  • Python3之sqlalchemy
    1.SQLAlchemy介绍SQLAlchemy是Python中一款非常优秀的ORM框架,它可以与任意的第三方web框架相结合,如flask、tornado、django、fastapi等。SQLALchemy相较于Django......
  • python pandas timestamp
    #1.构造Timestamp#ts_input参数支持4种格式,datetime-like,str,int,float#1.1datetime-likeimportdatetimeimportpandasaspdtime_str="2020-08-0110:2......
  • 9个都要了解的单行Python代码
    当我们开始学习Python时,我们通常会优先编写能够完成工作的代码,而不会关注代码的可读性以及代码的简洁性和效率。确切来说,这是完全没有问题的,但是有一些方法可以在不忽略......
  • python 批量爬取邮箱
    python批量爬取邮箱地址#coding:utf-8importrequestsimportbs4#解析网页importlxmlimportreheaders={'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win......
  • 用Python和Pytorch使用softmax和cross-entropy
    softmax激活函数softmax激活函数将包含K个元素的向量转换到(0,1)之间,并且和为1,因此它们可以用来表示概率。   python:defsoftmax(x):returnnp.exp(x)/np.s......