python教程之生成器和匿名函数

目录
  • 生成器
    • 01 什么是生成器?
    • 02 通俗的讲解
    • 03 生成器到底有什么用?
    • 04 生成器的常见用途?
  • 匿名函数
    • 01 什么是匿名函数?
    • 02 通俗的讲解
  • 总结

生成器

01 什么是生成器?

记住两个关键:

  • **生成器是一种特殊的函数方法。**意味着它和函数(def)密不可分。
  • 基于上一点,只要函数中出现yield关键字,就是生成器函数

初学的你,还是太难理解?

02 通俗的讲解

你可以将生成器理解为一个盒子,你可以向这个盒子里随意添加元素,当你需要的时候,再取出来用。

请看下面的例子:

# 普通函数
def func():
    return 1
f = func()
print("函数返回值:",f)
->函数返回值:1
print("函数返回值的类型:",type(f))
->函数返回值的类型:<class 'int'>
# 生成器
def gen\_func():
    yield 1
    yield 2
g = gen_func()
print("生成器对象:",g)
->生成器对象:object gen\_func at 0x00000189B8CFF7C8>
print("生成器对象的类型:",type(g))
->生成器对象的类型:<class 'generator'>
# 读取生成器对象的值,因为生成器也是一个迭代器,实现了python的迭代协议(即实现了\_\_iter\_\_方法)
for i in g:
 print("生成器对象的值:",i)
->生成器对象的值: 1
->生成器对象的值: 2

03 生成器到底有什么用?

作用:惰性求值(一边循环一边计算的机制),节省性能

04 生成器的常见用途?

  • 读大文件
  • 网络爬虫 scrapy 框架
  • 协程

举个例子:斐波那契数列(0,1,1,2,3,5…),打印斐波那契数列前50个元素

# 不使用生成器,会消耗大量内存
def fib(idx):
   res=[]
   n, a, b = 0, 0, 1
   while n < idx:
       res.append(b)
       a, b = b, a+b
       n += 1
   return res
res = fib(100)
print(res)
# 使用生成器,可节约大量内存
def gen\_fib(idx):
   n, a, b = 0, 0, 1
   while n < idx:
       yield b
       a, b = b, a+b
       n += 1
for i in gen_fib(100):
   print(i)

匿名函数

01 什么是匿名函数?

当:

  • 函数实现比较简单
  • 函数不需要被多个地方调用
  • 懒得给这个函数起名字时,我们可以使用匿名函数。

初学的你,还是太难理解?

02 通俗的讲解

你想实现一个求x的平方的函数,但是这个函数太简单,不值得专门def定义,同时,你忘记了平方的英文如何拼写,要是命名成 “pingfang”,又显得自己太low,于是乎,你可以不给这个函数起名字,还能实现它。这就是匿名函数lambda表达式。

比如:求一个数的平方

# 不用 lambda 表达式
def square(x):
    return x * x
print(square(2))
# 使用 lambda 表达式
# 写法:lambda 返回值:计算表达式
s = lambda x: x * x
print(s(2))

总结

1 如果你是初学者,可以先不掌握生成器和匿名函数,待学成python后,再行琢磨;

2 在实际工作中,生成器和匿名函数的使用频次,相对较高,并且在面试中是高频问点。

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

时间: 2022-01-11

python基础之匿名函数介绍

目录 前言 一.创建一个匿名函数: 二.创建一个带参数的匿名函数 三.求两个数的中的最大的值 四.练习题: 前言 在定义函数的时候,不想给函数起一个名字.这个时候就可以用lambda来定义一个匿名函数 语法: 变量名= lambda 参数:表达式(block) 参数:可选,通常以逗号分隔的变量表达式形式,也就是位置参数 表达式:不能包含循环.return,可以包含if-else- 注意: 1.表达式中不能包含 循环,return.可以包含 if-else-语句. 2.参数可有可无,如果有多个参数

Python匿名函数详情

1.匿名函数 在python中,除了一般使用def定义的函数外,还有一种使用lambda定义的匿名函数.这种函数可以用在任何普通函数可以使用的地方,但在定义时被严格限定为单一表达式.从语义上讲,它只是普通函数的语法糖. 如果我们需要定义一个特别简单的函数,例如 def add(a, b):     s = a + b     return s 这就出现问题了,这么优雅的Python怎么可以出现这种难看的代码呢,有没有办法可以将其简化为1行代码呢?这么优雅的Python肯定有办法将其简化的方法啊!

用Python写个新年贺卡生成器

目录 前言 开发工具 环境搭建 总结 前言 离过年还有十多天,在这里提前祝各位小伙伴新年快乐呀~ 先说句题外话:疫情还是比较严峻,各位小伙伴要是出门的话一定要做好防护措施呀,不出门的话最好. 大家都不容易,虽说不是专业的也帮不上什么忙,但至少别添乱了.网上很多考验智商的事情,希望大家有明辨是非的能力,多看官方报道,至少比那些东西靠谱很多. OK,言归正转,农历新年快到了,写了个新年贺卡生成器,分享给大家,祝大家新年快乐. 让我们愉快地开始吧~ 开发工具 Python版本: 3.6.4 相关模块:

python三大器之迭代器、生成器、装饰器

目录 迭代器 生成器 装饰器(非常实用!) 迭代器 聊迭代器前我们要先清楚迭代的概念:通常来讲从一个对象中依次取出数据,这个过程叫做遍历,这个手段称为迭代(重复执行某一段代码块,并将每一次迭代得到的结果作为下一次迭代的初始值).可迭代对象(iterable):是指该对象可以被用于for…in…循环,例如:集合,列表,元祖,字典,字符串,迭代器等. 在python中如果一个对象实现了 __iter__方法,我们就称之为可迭代对象,可以查看set\list\tuple…等源码内部均实现了__iter

Python技巧匿名函数、回调函数和高阶函数

目录 1.定义匿名或内联函数 2.在匿名函数中绑定变量的值 3.让带有n个参数的可调用对象以较少的参数调用 4.在回调函数中携带额外的状态 1.定义匿名或内联函数 如果我们想提供一个短小的回调函数供sort()这样的函数用,但不想用def这样的语句编写一个单行的函数,我们可以借助lambda表达式来编写"内联"式的函数. 如下图所示: add = lambda x, y: x + y print(add(2, 3)) # 5 print(add("hello", &

Python中的生成器

目录 1.列表生成式 1.列表生成式 代码演示: # 列表生成式 list_1 = [x**2 for x in range(10)] # x**2处也可以放函数 print(list_1) #[0, 1, 4, 9, 16, 25, 36, 49, 64, 81] # 代码等价于 list_2 = [] for x in range(10): list_2.append(x**2) print(list_2) 2.生成器 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯

详解python中的生成器、迭代器、闭包、装饰器

迭代是访问集合元素的一种方式.迭代器是一个可以记住遍历的位置的对象.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退. 1|1可迭代对象 以直接作用于 for 循环的数据类型有以下几种: 一类是集合数据类型,如 list . tuple . dict . set . str 等: 一类是 generator ,包括生成器和带 yield 的generator function. 这些可以直接作用于 for 循环的对象统称为可迭代对象: Iterable .

浅谈Python中的生成器和迭代器

迭代器 迭代器协议 对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么返回一个异常来终止本次迭代.(只能往前走,不能往后退!) 迭代器对象 遵循了(实现了)迭代器协议的对象.(对象内部实现了一个__next__方法,以实现迭代器协议)称为一个迭代器对象.他们的作用是逐个遍历容器中的对象.迭代器对象一定是可迭代对象 >>> from collections import Iterable, Iterator >>> l = list([1,2,3]) #

简单理解Python中基于生成器的状态机

简单生成器有许多优点.生成器除了能够用更自然的方法表达一类问题的流程之外,还极大地改善了许多效率不足之处.在 Python 中,函数调用代价不菲:除其它因素外,还要花一段时间解决函数参数列表(除了其它的事情外,还要分析位置参数和缺省参数).初始化框架对象还要采取一些建立步骤(据 Tim Peters 在 comp.lang.python 上所说,有 100 多行 C 语言程序:我自己还没检查 Python 源代码呢).与此相反,恢复一个生成器就相当省力:参数已经解析完了,而且框架对象正"无所事事

Python中的生成器和yield详细介绍

列表推导与生成器表达式 当我们创建了一个列表的时候,就创建了一个可以迭代的对象: 复制代码 代码如下: >>> squares=[n*n for n in range(3)] >>> for i in squares:  print i   0 1 4 这种创建列表的操作很常见,称为列表推导.但是像列表这样的迭代器,比如str.file等,虽然用起来很方便,但有一点,它们是储存在内存中的,如果值很大,会很麻烦. 而生成器表达式不同,它执行的计算与列表包含相同,但会迭代的

解析Python中的生成器及其与迭代器的差异

生成器 生成器是一种迭代器,是一种特殊的函数,使用yield操作将函数构造成迭代器.普通的函数有一个入口,有一个返回值:当函数被调用时,从入口开始执行,结束时返回相应的返回值.生成器定义的函数,有多个入口和多个返回值:对生成器执行next()操作,进行生成器的入口开始执行代码,yield操作向调用者返回一个值,并将函数挂起:挂起时,函数执行的环境和参数被保存下来:对生成器执行另一个next()操作时,参数从挂起状态被重新调用,进入上次挂起的执行环境继续下面的操作,到下一个yield操作时重复上面

举例详解Python中yield生成器的用法

yield是生成的意思,但是在python中则是作为生成器理解,生成器的用处主要可以迭代,这样简化了很多运算模型(还不是很了解是如何简化的). yield是一个表达式,是有返回值的. 当一个函数中含有yield时,它不再是一个普通的函数,而是一个生成器.当该函数被调用时不会自动执行,而是暂停,见第一个例子: 例1: >>> def mygenerator(): ... print 'start...' ... yield 5 ... >>> mygenerator()

简单介绍Python中利用生成器实现的并发编程

我们都知道并发(不是并行)编程目前有四种方式,多进程,多线程,异步,和协程. 多进程编程在python中有类似C的os.fork,当然还有更高层封装的multiprocessing标准库,在之前写过的python高可用程序设计方法中提供了类似nginx中master process和worker process间信号处理的方式,保证了业务进程的退出可以被主进程感知. 多线程编程python中有Thread和threading,在linux下所谓的线程,实际上是LWP轻量级进程,其在内核中具有和进

一篇文章彻底搞懂Python中可迭代(Iterable)、迭代器(Iterator)与生成器(Generator)的概念

前言 在Python中可迭代(Iterable).迭代器(Iterator)和生成器(Generator)这几个概念是经常用到的,初学时对这几个概念也是经常混淆,现在是时候把这几个概念搞清楚了. 0x00 可迭代(Iterable) 简单的说,一个对象(在Python里面一切都是对象)只要实现了只要实现了__iter__()方法,那么用isinstance()函数检查就是Iterable对象: 例如 class IterObj: def __iter__(self): # 这里简单地返回自身 #

Python中生成器和yield语句的用法详解

在开始课程之前,我要求学生们填写一份调查表,这个调查表反映了它们对Python中一些概念的理解情况.一些话题("if/else控制流" 或者 "定义和使用函数")对于大多数学生是没有问题的.但是有一些话题,大多数学生只有很少,或者完全没有任何接触,尤其是"生成器和yield关键字".我猜这对大多数新手Python程序员也是如此. 有事实表明,在我花了大功夫后,有些人仍然不能理解生成器和yield关键字.我想让这个问题有所改善.在这篇文章中,我将解

深入讲解Python中的迭代器和生成器

在Python中,很多对象都是可以通过for语句来直接遍历的,例如list.string.dict等等,这些对象都可以被称为可迭代对象.至于说哪些对象是可以被迭代访问的,就要了解一下迭代器相关的知识了. 迭代器 迭代器对象要求支持迭代器协议的对象,在Python中,支持迭代器协议就是实现对象的__iter__()和next()方法.其中__iter__()方法返回迭代器对象本身:next()方法返回容器的下一个元素,在结尾时引发StopIteration异常. __iter__()和next()