zoukankan      html  css  js  c++  java
  • Python核心技术与实战——八|匿名函数

    今天我们来学习一下匿名函数。在学习了上一节的自定义函数后,是时候了解一下匿名函数了。他们往往非常简短,就一行,而且有个关键字: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('1',window)
    btn_2 = QPushButton('2',window)
    btn_3 = QPushButton('3',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.模块化代码

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

  • 相关阅读:
    菜鸟看懂算法以后之一:头痛的64次左移
    C语言通过指针数组和二维数组读取文件
    C++中构造函数调用构造函数
    bnuoj53075 外挂使用拒绝
    [CodeForces]String Reconstruction
    BNU-2017.7.4排位赛2总结
    BNU-2017.7.5排位赛3总结
    BNU-2017.7.3排位赛1总结
    微软大楼设计方案(困难)
    最长公共子序列针对小字符集的算法
  • 原文地址:https://www.cnblogs.com/yinsedeyinse/p/11210148.html
Copyright © 2011-2022 走看看