首页 > 编程语言 >Python-推导式和生成器表达式

Python-推导式和生成器表达式

时间:2023-08-01 11:23:29浏览次数:32  
标签:推导 Python 生成器 列表 print example 表达式

推导式

利用 [] 或者 {} 可以定义列表推导式、集合/字典推导式,推导式的结果就是相应的列表,字典/集合数据类型。注意是没有元组推导式的,因为圆括号 () 被用来作为生成器表达式语法了。

列表推导式 List Comprehension

用方括号 [ ] 包含内容,里面利用 for [if] 循环和相应的函数生成相应序列

# 单循环
example_01 = [x * 2 for x in range(10)]  # 创建列表推导式
print(example_01)

# [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
# 双循环
example_02 = [(i,j) for i in range(3) for j in range(5)] # 创建列表推导式
print(example_02)

# [(0, 0), (0, 1), (0, 2), (0, 3), (0, 4), (1, 0), (1, 1), (1, 2), (1, 3), (1, 4), (2, 0), (2, 1), (2, 2), (2, 3), (2, 4)]
# for if 表达式
symbols = 'abcdef'
nums_big = [ord(symbol) for symbol in symbols if ord(symbol) > 98]

#  [99, 100, 101, 102]

集合生成式 ( Set Comprehension)

用花括号 {} 包含内容,里面利用 for [if] 循环和相应的函数生成相应集合

numbers = [1,2,3,4,5,]
{x * x for x in numbers}

# {1, 4, 9, 16, 25}

字典生成式 ( (Dict Comprehension)

也是用花括号 {} 包含内容,但是里面是利用 for [if] 循环和相应的函数生成相应字典:

numbers = [1,2,3,4,5,]
{x : x * x for x in numbers}

# {1:1, 2:4, 3:9, 4:16, 5:25}

生成器表达式

除了有一种称之为 “惰性计算” 的特点以外,生成器表达式和推导式的用法基本一致,只不过是把方括号/花括号换成了一对圆括号 ()

example_03 = (x * 2 for x in range(10) if x % 2 == 1)  # 创建生成器表达式
print(example_03)   # 实际调用生成器时代码并不会立即执行
输出:<generator object <genexpr> at 0x000001AACF7D3CF0>
for x in example_03:
    print(x,end = ' ')
输出:2 6 10 14 18 

两者区别

  • 生成器表达式本质上是一个生成器,它每次生成一个元素,而不是一下生成全部数据。这个特性叫作“惰性计算”,优点是可以节省大量的内存,在处理的数据量较大时,非常有用。相比之下,推导式是直接生成全部数据。

  • 列表推导式可以多次迭代,生成器表达式只能单次迭代(符合生成器的一般特性,生成器结束后再调用 next() 函数会抛出 StopIteration 异常)

# 列表推导式
example_04 = [x for x in range(10)] # 获取 0 - 9 的序列
# 第一次调用
for x in example_04:
    print(x,end = ' ')

# 0 1 2 3 4 5 6 7 8 9 
# 第二次调用
for x in example_04:
    print(x,end = ' ')

# 0 1 2 3 4 5 6 7 8 9 
# 生成器表达式
example_05 = (x for x in range(10))
# 第一次调用
for x in example_05:
    print(x,end = ' ')
# 0 1 2 3 4 5 6 7 8 9 
# 第二次调用   注意与列表推导式的区别
for x in example_05:
    print(x,end = ' ')

# 无输出

Reference

标签:推导,Python,生成器,列表,print,example,表达式
From: https://www.cnblogs.com/dawnlh/p/17595989.html

相关文章

  • 【Python】calendar_标准库的日历模块
    日历模块calendar.calendar(year,c,w,l)c:每月间隔距离w:每日宽度间隔l:每星期行数打印年日历#coding:utf-8importcalendarfromloguruimportloggeraslogsif__name__=="__main__":"""Run""""""打印年日历......
  • python发送消息到Teams以及阿里云的上传与删除
    1importurllib2importtime3importoss24importos5importrandom6frompathlibimportPath7importrequests8importdatetime9fromdecoupleimportconfig1011fromurllib.parseimportunquote121314#......
  • 009 python socket UDP服务端程序,在pycharm正常运行,生成的exe运行有时候接收不到数据,
    写了一个简单的socket服务端程序,在pycharm中正常,生成exe后运行,有时候接收不到数据。经过半天折腾,发现,只要按一下回车,程序又能正常运行了。最终发现,是因为控制台的快速编辑功能打开导致程序假死。在控制台程序的菜单栏右键点击--->默认值--->去掉“快速编辑模式”和“插入模式”......
  • Python高级过滤器:掌握filter函数从入门到精通
    简介在Python中,filter()是一个非常有用的内置函数,它能够根据指定的函数来筛选出可迭代对象中满足条件的元素,返回一个迭代器。filter()函数的使用能够简化代码,并提高程序的可读性。本文将从入门到精通,全面介绍filter()函数的用法和相关知识点。1.filter()函数的基本用法filter(......
  • 巧用Python中set集合对比两个文本文件
    """1.读取文件2.使用set集合s.add(x)添加xins是否在集合中>>>basket={'apple','orange','apple','pear','orange','banana'}>>>print(basket)           #这......
  • opencv-python 边缘提取
    边缘时像素值发生跃迁的位置,是图像的显著特征之一。在图像特征提取,对象检测,模式识别等方面有重要作用。1sobel(索贝尔)算子sobel算子对图像求一阶导数。一阶导数越大,说明像素在该方向的变化越大,边缘信号越强。因为图像的灰度值都是离散的数字,sobel算子采用离散差分算子计算图像......
  • python解释器安装后,pip的设置步骤
    当python解释器安装好后,开发过程中势必要涉及第三方包的安装,那么由于pip自带的下载源是境外的,下载速度很慢(经常会下载失败)所以必须要先设置pip的全局下载源为国内镜像(这个具体看个人,我比较喜欢清华镜像源(豆瓣,阿里也都不错的)),具体如下:(1)打开cmd,输入pip,然后回车(这步的目的是确保我们......
  • python网站创建007:常见CSS样式
    1.高度和宽度注意1:默认情况下高度和宽度无法应用在行内标签上注意2:默认情况下,块级标签虽然设置了宽度,但是右边空白区域是不允许占用的 高度<divstyle="height:100px"></div>宽度<divstyle="width:200px"></div>块级标签转换为行内标签<divstyle="display:in......
  • python离线安装
      1.安装yumhttps://www.python100.com/html/63851.html2.卸载原本系统中的python参考:https://www.python100.com/html/W9610GF0KY1P.html3.官网下载python对应安装版本的包https://www.python.org/downloads/4.解压python包tar-zxvfPython-3.6.9.tgz5.进入到python-3.6.9......
  • 搭建一个简单的HTTP API Service( python+flask )
    1背景学习HTTP接口相关知识,为了方便,在本地搭建了一个可用的API环境用于学习和测试2环境windows10python3.10Flask2.3.2主要接口逻辑测试post方法get方法服务端请求日志代码提交至giteehttps://gitee.com/hahawa2/simple_api_demo......