今天我们来学习一下匿名函数。在学习了上一节的自定义函数后,是时候了解一下匿名函数了。他们往往非常简短,就一行,而且有个关键字:lambda。这就是弥明函数。

一.匿名函数基础

匿名函数的基本格式是这样的:

lambda argument1,argument2,argument3,...,argumentN:expression

lambda后紧跟的是参数,冒号后是表达式。举个例子来说明用法

>>> fun = lambda x:x**2
>>> fun(4)
16

这里的匿名函数只包含了一个参数x,输出则是这个数的平方,如果不用匿名函数的方法是这样的

>>> def fun(x):
... return x**2
>>> fun(4)
16

可以看出来匿名函数和常规函数一样,都是一个函数对象(function object),他们的用法也很相似,不过还是有一些区别的:

  1.lambda是一个表达式(expression)而不是一个语句(statement)。所谓表达式,就是用一系列公式去表达一个东西,比如x+2;而语句就是完成了某些功能比如赋值语句x = 2完成了赋值,print完成了打印等。所以lambda可以用在一些常规函数无法使用的地方,比如一个列表内部,而常规函数就不可以。

>>> l = [(lambda x:x*x)(x) for x in range(10)]
>>> l
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

  或者在PyQt里,也常常用lambda来作为槽函数可以直接使用,比方有三个按钮,每次按下时打印‘按钮1/2/3被按下’

import sys
from PyQt5.Qt import *
app = QApplication(sys.argv)
window = QWidget()
window.resize(800,600)
btn_1 = QPushButton('',window)
btn_2 = QPushButton('',window)
btn_3 = QPushButton('',window)
btn_1.move(100,200)
btn_2.move(100,250)
btn_3.move(100,300) btn_1.clicked.connect(lambda :print('btn1 is clicked'))
btn_2.clicked.connect(lambda :print('btn2 is clicked'))
btn_3.clicked.connect(lambda :print('btn3 is clicked'))

在这里用匿名函数就要比为每个信号定义个槽函数要方便的多

def fun_1():
print('btn1 is clicked')
def fun_2():
print('btn2 is clicked')
def fun_3():
print('btn3 is clicked') btn_1.clicked.connect(fun_1)
btn_2.clicked.connect(fun_2)
btn_3.clicked.connect(fun_3)

  2.lambda的主体是只有一行的简单表达式,并不能扩展成一个多行的代码。其实是出于设计的考虑,lambda和def应该各司其职:前者专注于简单的任务,而后者负责更复杂的多行的逻辑。python之父龟叔有一篇文章就是讲的关于这个的。

总结

  我们使用函数的目的就是这两点:

    1.减少代码的重复性;

    2.模块化代码

  但是如果一个很简单的逻辑功能只是被调用一次或频率很低,就可以用匿名函数解决。

Python核心技术与实战——八|匿名函数的更多相关文章

  1. Python核心技术与实战——七|自定义函数

    我们前面用的代码都是比较简单的脚本,而实际工作中是没有人把整个一个功能从头写到尾按顺序堆到一块的.一个规范的值得借鉴的Python程序,除非代码量很少(10行20行左右)应该由多个函数组成,这样的代码 ...

  2. python全栈开发之匿名函数和递归函数

    python 匿名函数和递归函数 python全栈开发,匿名函数,递归函数 匿名函数 lambda函数也叫匿名函数,即函数没有具体的名称.是为了解决一些功能很简单需求而设计的一句话函数.如下: #这段 ...

  3. Python核心技术与实战——十九|一起看看Python全局解释器锁GIL

    我们在前面的几节课里讲了Python的并发编程的特性,也了解了多线程编程.事实上,Python的多线程有一个非常重要的话题——GIL(Global Interpreter Lock).我们今天就来讲一 ...

  4. Python核心技术与实战 笔记

    基础篇 Jupyter Notebook 优点 整合所有的资源 交互性编程体验 零成本重现结果 实践站点 Jupyter 官方 Google Research 提供的 Colab 环境 安装 运行 列 ...

  5. Python核心技术与实战——六|异常处理

    和其他语言一样,Python中的异常处理是很重要的机制和代码规范. 一.错误与异常 通常来说程序中的错误分为两种,一种是语法错误,另一种是异常.首先要了解错误和异常的区别和联系. 语法错误比较容易理解 ...

  6. Py修行路 python基础 (十三)匿名函数 与 内置函数

    一.匿名函数  1.定义: 匿名函数顾名思义就是指:是指一类无需定义标识符(函数名)的函数或子程序. 2.语法格式:lambda 参数:表达式 lambda语句中,开头先写关键字lambda,冒号前是 ...

  7. Python全栈学习:匿名函数使用规范

    匿名函数,当我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便. 在Python中,对匿名函数提供了有限支持.还是以map()函数为例,计算f(x)=x2时,除了定义一个f(x) ...

  8. python递归函数、二分法、匿名函数、(sorted、map、filter内置函数应用)

    #函数递归是一种特殊的函数嵌套调用,在调用一个函数的过程中,又直接或间接的调用该函数本身递归必须要有两个明确的阶段: 递推:一层一层递归调用下去,强调每进入下一层递归问题的规模都必须有所减少 回溯:递 ...

  9. Python(十) 函数式编程: 匿名函数、高阶函数、装饰器

    一.lambda表达式 lambda parameter_list: expression # 匿名函数 def add(x,y): return x+y print(add(1,2)) f = la ...

随机推荐

  1. 用JS实现快速排序

    "快速排序"的思想很简单,整个排序过程只需要三步: (1)在数据集之中,选择一个元素作为"基准"(pivot). (2)所有小于"基准"的元 ...

  2. rename()函数(包含更改索引列列名的方法)

    1 rename()可以更换列名和行名,必须写上columns或index,否则无效 import pandas as pd df = pd.DataFrame({'a':[1,2], 'b':[3, ...

  3. Unity ZTest 深度测试 & ZWrite 深度写入

    初学Shader,一开始对于渲染队列,ZTest 和 ZWrite一头雾水,经过多方查阅和实验,有了一些自己的理解.发此文与初学Shader的朋友分享,也算是为自己做个笔记.不对或不足之处欢迎指正. ...

  4. BigDecimal进行加减乘除计算

    以前大部分关于查询计算的逻辑是在sql语句中执行的,但是有时候会出现比较复杂的计算情况,需要我们在代码中进行计算,这个时候使用BigDecimal进行计算会很方便. BigDecimal num1 = ...

  5. 操作系统(1)——X86-32硬件介绍、实验环境相关配置、uCore部分技巧介绍

    实验环境 本文假设已经创建虚拟机并配置好Ubuntu 16.04(网上太多教程了,所以这里就不赘述了). X86-32硬件介绍 x86指的是80386这种机器(一种32位CPU,在早期得到了广泛的应用 ...

  6. Pytorch迁移学习

    环境: Pytorch1.1,Python3.6,win10/ubuntu18,GPU 正文 Pytorch构建ResNet18模型并训练,进行真实图片分类: 利用预训练的ResNet18模型进行Fi ...

  7. STL 函数适配器(function adapter)

    函数适配器(function adapter):通过不同函数适配器的绑定,组合和修饰能力,可以实现强大的功能,配合STL泛型算法完成复杂功能. 绑定(bind) template <class ...

  8. [转帖]CBO和RBO

    http://www.itpub.net/thread-263395-1-1.html 参数不能随便改啊.. optimizer_features_enable('8.1.7') ORACLE 提供了 ...

  9. dfs(最佳路径)

    http://acm.hdu.edu.cn/showproblem.php?pid=1242 Rescue Time Limit: 2000/1000 MS (Java/Others)    Memo ...

  10. [Codeforces 1246B] Power Products (STL+分解质因数)

    [Codeforces 1246B] Power Products (STL+分解质因数) 题面 给出一个长度为\(n\)的序列\(a_i\)和常数k,求有多少个数对\((i,j)\)满足\(a_i ...