广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python生成器/生成器函数/推导式/
  • 507
分享到

Python生成器/生成器函数/推导式/

生成器函数Python 2023-01-31 00:01:01 507人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

1. 生成器   生成器的本质就是迭代器   在python中有三种⽅方式来获取⽣生成器:     1. 通过生成器函数     2. 通过各种推导式来实现⽣成器     3. 通过数据的转换也可以获取生成

1. 生成器
  生成器的本质就是迭代器

  在python中有三种⽅方式来获取⽣生成器:

    1. 通过生成器函数
    2. 通过各种推导式来实现⽣成器
    3. 通过数据的转换也可以获取生成器

  生成器的特点和迭代器一样.取值方式和迭代器一样(__next__(), send(): 给上一个yield传值).
  生成器一般由生成器函数或者生成器表达式来创建
  其实就是手写的迭代器

2. 生成器函数
  和普通函数没有区别. 里面有yield的函数就是生成器函数.
  生成器函数在执行的时候. 默认不会执行函数体. 返回生成器
  通过生成器的__next__()分段执行这个函数.
  send() 给上一个yield传值, 不能再开头(没有上一个yield), 最后一个yield也不可以用send()

⾸先, 我们先看一个很简单的函数:

def func():
    print("111")
    return 222
ret = func()
print(ret)
结果: 111 222

 

将函数中的return换成yield就是生成器

def func():
    print("111")
    yield 222
ret = func()
print(ret)
结果:
<generator object func at 0x10567ff68>

  运⾏的结果和上⾯不一样. 为什么呢. 由于函数中存在了yield. 那么这个函数就是⼀个生成器 函数. 这个时候. 我们再执行这个函数的时候. 就不再是函数的执行了. ⽽是获取这个生成器. 如何使用呢? 想迭代器. 生成器的本质是迭代器. 所以. 我们可以直接执⾏__next__()来执行

以下生成器:

def func():
    print("111")
yield 222
gener = func() # 这个时候函数不会执行. ⽽是获取到生成器
ret = gener.__next__() # 这个时候函数才会执行. yield的作用和return一样. 也是返回数据
print(ret)
结果:
111
222

 

那么我们可以看到, yield和return的效果是一样的. 有什么区别呢? yield是分段来执⾏行一个函数. return呢? 直接停止执⾏函数.

def func():
    print("111")
    yield 222
    print("333")
    yield 444
gener = func()
ret = gener.__next__()
print(ret)
ret2 = gener.__next__()
print(ret2)
ret3 = gener.__next__() # 最后⼀个yield执⾏完毕. 再次__next__()程序报错, 也就是说. 和return⽆关了.
print(ret3)
结果:
111
Traceback (most recent call last): 222
333
  File "/Users/sylar/PyCharmProjects/oldboy/iterator.py", line 55, in
<module>
444
ret3 = gener.__next__() # 最后一个yield执行完毕. 再次__next__()程序报错, 也就是说. 和return⽆关了.
StopIteration

当程序运⾏完最后一个yield. 那么后⾯继续进行__next__()程序会报错.

我们来看send⽅方法, send和__next__()⼀一样都可以让⽣生成器执⾏行行到下⼀一个yield.

def eat(): 
    print("我喜欢玩王者荣耀的:") 
    a = yield "鲁班" 
    print("a=",a)
    b = yield "程咬金" 
    print("b=",b)
    c = yield "安琪拉" 
    print("c=",c) 
    yield "GAME OVER"

gen = eat() # 获取⽣成器
ret1 = gen.__next__() 
print(ret1)
ret2 = gen.send("大乔") 
print(ret2)
ret3 = gen.send("后裔) 
print(ret3)
ret4 = gen.send("马克") 
print(ret4)

send和__next__()区别:

1. send和next()都是让⽣成器向下走一次
2. send可以给上一个yield的位置传递值,不能给最后一个yield发送值.在第一次执⾏⽣成器代码的时候不能使用send()

⽣成器可以使⽤for循环来循环获取内部的元素:

def func():
    print(111)
    yield 222
    print(333)
    yield 444
    print(555)
    yield 666
gen = func()
for i in gen:
  print(i)
结果: 111 222 333 444 555 666

3. 推导式
  1. 列表推导式 [结果 for循环 条件筛选]\

首先我们先看一下这样的代码, 给出一个列列表, 通过循环, 向列表中添加1-14 :

lst = []
for i in range(1, 15):
    lst.append(i)
print(lst)

替换成列列表推导式:

lst = [i for i in range(1, 15)]
print(lst)

列表推导式是通过⼀行来构建你要的列表, 列表推导式看起来代码简单. 但是出现错误之后很难排查.

筛选模式:
  [ 结果 for 变量量 in 可迭代对象 if 条件 ]

# 获取1-100内所有的偶数
lst = [i for i in range(1, 100) if i % 2 == 0] 
print(lst)

⽣成器表达式和列表推导式的语法基本上是一样的. 只是把[]替换成()

gen = (i for i in range(10))
    print(gen)
结果:
<generator object <genexpr> at 0x106768f10>

⽣成器表达式也可以进行筛选:

# 获取1-100内能被3整除的数
gen = (i for i in range(1,100) if i % 3 == 0) 
for num in gen:
    print(num)

  2. 字典推导式 {k:v for循环 条件筛选}

# [11,22,33,44] => {0:11,1:22,2:33,3:44}
lst = [11,22,33,44]
dic = {i:lst[i] for i in range(len(lst)) if i < 2}
    print(dic)
# 语法:{k:v for循环 条件筛选}

  3. 集合推导式 {k for循环 条件}

 

# 集合推到式
lst = [1,1,4,6,7,7,4,2,2]
s = {el for el in lst}
print(s)
s = set(lst)
print(s)

 

4. 生成器表达式

  ⽣成器表达式和列表推导式的区别:

  1. 列表推导式比较耗内存.一次性加载.生成器表达式几乎不占⽤内存.使⽤的时候才分配和使⽤内存

  2. 得到的值不⼀样.列表推导式得到的是一个列列表.⽣成器表达式获取的是一个生成器.

  (结果 for循环 条件)
  特点:
    1. 惰性机制
    2. 只能向前
    3. 节省内存

--结束END--

本文标题: Python生成器/生成器函数/推导式/

本文链接: https://www.lsjlt.com/news/182561.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python生成器/生成器函数/推导式/
    1. 生成器   生成器的本质就是迭代器   在python中有三种⽅方式来获取⽣生成器:     1. 通过生成器函数     2. 通过各种推导式来实现⽣成器     3. 通过数据的转换也可以获取生成...
    99+
    2023-01-31
    生成器 函数 Python
  • day15(PYTHON)推导式{生成器
    #[每一个元素或者是和元素相关的操作 for 元素 in 可迭代数据类型] #遍历之后挨个处理 #[满足条件的元素相关的操作 for 元素 in 可迭代数据类型 if 元素相关的条件] #筛选功能 # #30以内所有能被3整...
    99+
    2023-01-30
    生成器 PYTHON
  • 生成器及推导式
    一、生成器——自己写的函数 1、只要有yield关键字的函数都是生成器函数 2、yield关键字不能与return关键字同时使用 3、return结束函数,yield不结束函数,生成器函数执行之后得到一个生成器作为返回值 return与y...
    99+
    2023-01-31
    器及
  • Python全栈之推导式和生成器
    目录1.推导式2.推导式练习3.集合_字典推导式4.生成器4.1生成器表达式4.2生成器函数5.小练习总结1. 推导式 # ### 推导式 : 通过一行循环判断遍历出一些列数据的...
    99+
    2022-11-12
  • Python生成器、推导式之前襟后裾
    生成器 函数体内有yield选项的就是生成器,生成器的本质是迭代器,由于函数结构和生成器结构类似,可以通过调用来判断是函数还是生成器,如下: def fun(): yield "我是生成器" print(fun()) # 打印...
    99+
    2023-01-30
    生成器 前襟后裾 Python
  • python3--列表推导式,生成器表达式,内置函数
    python列表推导式l = [i for i in range(10)] print(l) ll = ['选择{}'.format(i)&nb...
    99+
    2023-01-30
    生成器 表达式 函数
  • Python全栈推导式和生成器怎么实现
    本篇内容主要讲解“Python全栈推导式和生成器怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python全栈推导式和生成器怎么实现”吧!1. 推导式# ### 推导...
    99+
    2023-06-21
  • Python 推导式、生成器与切片问题解决思路
    推导式、生成器与切片 一、实验要求 1.理解并掌握序列中的常用操作。2.理解并掌握推导式、切片等用法并能解决实际问题。 二、实验内容 1,编写程序,测试字符的出现频率。 #u...
    99+
    2022-11-13
  • Python推导式、生成器与切片问题怎么解决
    本篇内容介绍了“Python推导式、生成器与切片问题怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、实验要求理解并掌握序列中的常用...
    99+
    2023-06-29
  • python中列表推导式与生成器表达式对比详解
    目录概述列表推导式生成器表达式使用场景选择参考总结概述 Python中的列表推倒式(List Comprehension) 和 生成器表达式(Generator Expression...
    99+
    2023-01-07
    python 列表推导式 python 生成器表达式
  • Python进阶之列表推导与生成器表达式详解
    目录内置序列类型列表推导与生成器表达式列表推导生成器表达式总结在python学习的过程中,我们最先接触到的就是python的数组,元组,字典等基础类型,但很少有人深入讨论python...
    99+
    2023-05-16
    Python列表推导 生成器表达式 Python 列表推导 Python 生成器表达式
  • Python中列表推导和生成器表达式如何使用
    Python中列表推导和生成器表达式如何使用,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。 序列序列是指一组数据,按存放类型分为容器序列与扁平序列,按能否被修改分为不...
    99+
    2023-06-15
  • python列表生成器与生成器
    列表生成器是python内置的非常简单却非常强大的。生成一个列表[1,2,3,4]可以用list(range(1,5))列表生成器的应用如果上面的公式加上判断,就可以筛选出想要的结果,比如仅需要偶数的平方使用多层循环生成器生成器与列表生成器...
    99+
    2023-01-31
    生成器 列表 python
  • python-装饰器&生成器&迭代器&推
     一:普通装饰器 概念:在不改变原函数内部代码的基础上,在函数执行之前和之后自动执行某个功能,为已存在的对象添加某个功能 普通装饰器编写的格式 def 外层函数(参数) def 内层函数(*args,**kwargs) ...
    99+
    2023-01-31
    生成器 迭代 python
  • python生成器
    所属网站分类: python基础 > 装饰器,迭代器,生成器 作者:慧雅 原文链接: http://www.pythonheidong.com/blog/article/20/ 来源:python黑洞网 www.python...
    99+
    2023-01-31
    生成器 python
  • python 生成器
    先来讲一个列表生成式列表生成式:就是一个用来生成列表的特定语法形式的表达式。基础语法格式[exp for iter_var in iterable]普通创建列表是这样的a = [1...
    99+
    2023-01-30
    生成器 python
  • Python---生成器
    # 生成器 # 通过列表生成式,我们可以直接创建一个列表 # 但是,受到内存限制,列表容量肯定是有限的 # 创建一个100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了 #...
    99+
    2023-01-31
    生成器 Python
  • Python:生成器
        生成器是Python中的一个高级用法,有段时间我对生成器的理解颇为费劲,直到我看到一句话“yield语句挂起该生成器函数的状态,保留足够的信息,以便之后从它离开的地方继续执行”后,让我恍然大悟,这是生成器中的状态挂起,这句话让我想起...
    99+
    2023-01-31
    生成器 Python
  • 列表生成式,迭代器和生成器
    一、列表生成式 现在有个需求,看列表[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],现在要求把列表里的每个值加1,你怎么实现?你可能会想到的几种方法: 方法1: a = [0, 1, 2, 3, 4, 5, 6, 7, 8...
    99+
    2023-01-31
    生成器 迭代 列表
  • python生成器函数有什么特点
    今天就跟大家聊聊有关python生成器函数有什么特点,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Python主要用来做什么Python主要应用于:1、Web开发;2、数据科学研究;...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作