深入浅析Python 函数注解与匿名函数

函数注解与匿名函数

关于函数参数的定义,调用以及函数参数的内容,在下面的文章中已经做了初步的介绍,有需要的可以访问进行了解:

Python 函数

函数注解

在编写函数,当下肯定清楚函数如何使用的。若是函数较为复杂,过段时间,编写者有可能需要花一段时间去重新了解函数的使用,那其他使用者也同样会遇到这样的困惑。

所以当编写完函数后,可以为函数的参数添加一些额外的信息。这里给函数参数添加注解,能够提示程序员如何正确使用这个函数。如下示例:

def add(x:int, y:int) -> int:
 '''Returns the sum of two numbers
 '''
 return x + y

在这里,Python 解释器并不会对这些注解添加任何的语义(可能第三方工具和框架会)。它们并不会被类型检查,运行的时候跟没有添加注解前是没有任何差距的。但若是有需要的人阅读源码时,这些都能给阅读者提供帮助。同时会出现在文档里。

>>> help(add)
Help on function add in module __main__:

add(x: int, y: int) -> int
 Returns the sum of two numbers

函数注解只存储于函数的 __annotations__ 属性中。比如:

>>> add.__annotations__
{'x': <class 'int'>, 'y': <class 'int'>, 'return': <class 'int'>}

注解的主要用途还是文档。Python 并没有类型声明,当阅读源码的时候,比较难知道传递什么样的参数给这个函数。这时候,注解就能够给阅读者更多的提示,能够让他们正确使用函数。

匿名函数

如何定义

在前面提及的文章中,讲到了使用 def 定义一个函数。但若是函数能够单行实现,这个时候可以考虑使用匿名函数(lambda 表达式)来实现这种功能。

当函数功能非常简单,仅仅只是计算一个表达式的值时,就可以用 lambda 表达式来替代。比如:

>>> add = lambda x, y: x + y
>>> add
<function <lambda> at 0x0000021496CD98B8>
>>> add(2, 3)
5
>>> add('hello', ' world')
'hello world'

其实使用 lambda 表达式跟下面的效果是一样的:

>>> def add(x, y):
... return x + y
...
>>> add(2, 3)
5
>>> add('hello', ' world')
'hello world'

lambda 表达式主要运用的场景是排序或者数据 reduce:

>>> pairs = [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four')]
>>> sorted(pairs, key=lambda pair: pair[1])
[(4, 'four'), (1, 'one'), (3, 'three'), (2, 'two')]

上面的例子就是用于排序列表元素,以列表元素元组的第二个元素进行排序。此处的元组的第二个元素是字符串,关于字符串的比较,先比较字符串的首字符,首字符相同时,比较第二个字符,以此类推。

在这里, four 与 one , f 比 o 排序更前,所以 four 排在 one 前面, three 和 two 首字符相同,比较的是第二个字符 h 和 w ,所以 three 排在 two 前面。

尽管 lambda 表达式能够定义简单函数,但其实是有限制的。只能指定单个表达式,它的值就是最后返回的值。即是不能包含其他的语言特性,包括多个语句、迭代以及异常处理等等。

捕获变量值

如何在定义匿名函数时捕获某些变量的值?现在,先看看以下示例代码的效果:

>>> x = 10
>>> a = lambda y: x+y
>>> x = 20
>>> b = lambda y: x+y

在这里,先猜猜 a(10) 和 b(10) 的结果?若觉得结果是 20 和 30 ,那就错了:

>>> a(10) 30 >>> b(10) 30

产生上面的结果,是因为 lambda 表达式中的 x 是一个自由变量,它是在运行的时候绑定值,而不是在定义的时候就绑定,这里跟函数的默认值参数定义是不同的。因此,在调用这个 lambda 表达式时, x 的值其实是执行时的值。例如:

>>> x = 10 >>> a(10) 20 >>> x = 20 >>> b(10) 30

若是向在匿名函数在定义时就捕获值,可以将参数值定义为默认参数:

>>> x=10 >>> a = lambda y, x=x: x+y >>> x=20 >>> b = lambda y, x=x: x+y >>> a(10) 20 >>> b(10) 30

还有一个需要注意:假如想用循环或列表推导创建一个 lambda 表达式列表,期望函数能够在定义时就记住每次的迭代值。以下的写法是无法达到效果的:

>>> func = [lambda x: x+n for n in range(5)] >>> for f in func: ... print(f(0)) ...

这里最终执行的结果,也是因为最终执行,n 的值其实是迭代的最后一个值。

修改函数,使其达到想要达到的效果,也是上面提及的默认值的做法:

>>> func = [lambda x, n=n: x+n for n in range(5)] >>> for f in func: ... print(f(0)) ...

现在使用默认值参数的形式,就能够实现在定义时绑定所需的值。

参考资料

来源

[1] David M. Beazley;Brian K. Jones.Python Cookbook, 3rd Edtioni.O'Reilly Media.2013.

[2] "4.7.6 Lambda Expressions".docs.python.org.Retrieved 23 February 2020.

总结

到此这篇关于Python 函数注解与匿名函数的文章就介绍到这了,更多相关Python 函数注解与匿名函数内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 详解Python匿名函数(lambda函数)

    匿名函数lambda Python使用lambda关键字创造匿名函数.所谓匿名,意即不再使用def语句这样标准的形式定义一个函数.这种语句的目的是由于性能的原因,在调用时绕过函数的栈分配.其语法是: lambda [arg1[, arg2, ... argN]]: expression 其中,参数是可选的,如果使用参数的话,参数通常也会在表达式之中出现. 下面举例来说明lambda语句的使用方法(无参数). # 使用def定义函数的方法 def true(): return True #等价的l

  • Python中的匿名函数使用简介

    当我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便. 在Python中,对匿名函数提供了有限支持.还是以map()函数为例,计算f(x)=x2时,除了定义一个f(x)的函数外,还可以直接传入匿名函数: >>> map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9]) [1, 4, 9, 16, 25, 36, 49, 64, 81] 通过对比可以看出,匿名函数lambda x: x * x实际上就是: def f(x):

  • 举例讲解Python的lambda语句声明匿名函数的用法

    所谓匿名函数,即是不需要定义函数,像表达式一样使用,不需要函数名(很多时候名字让我很困扰),一些简单的函数简单化, 举个例子 我需要两个整数相加的函数,通常是这么定义的 def add(x, y): return x + y 很好的完成了我需要的功能, 但是我现在需要一个数字与字符串相加的函数 def addstr(x, y): return x + str(y) 又一次完成了我的需求,但是 我突然需要两个整数相减,相除的功能这样函数就得 一直写下去, 但是使用lambda 匿名函数可以直接使用

  • Python的lambda匿名函数的简单介绍

    lambda函数也叫匿名函数,即,函数没有具体的名称.先来看一个最简单例子: 复制代码 代码如下: def f(x):return x**2print f(4) Python中使用lambda的话,写成这样 复制代码 代码如下: g = lambda x : x**2print g(4) lambda表达式在很多编程语言都有对应的实现.比如C#: 复制代码 代码如下: var g = x => x**2Console.WriteLine(g(4)) 那么,lambda表达式有什么用处呢?很多人提

  • 深入浅析Python 函数注解与匿名函数

    函数注解与匿名函数 关于函数参数的定义,调用以及函数参数的内容,在下面的文章中已经做了初步的介绍,有需要的可以访问进行了解: Python 函数 函数注解 在编写函数,当下肯定清楚函数如何使用的.若是函数较为复杂,过段时间,编写者有可能需要花一段时间去重新了解函数的使用,那其他使用者也同样会遇到这样的困惑. 所以当编写完函数后,可以为函数的参数添加一些额外的信息.这里给函数参数添加注解,能够提示程序员如何正确使用这个函数.如下示例: def add(x:int, y:int) -> int: '

  • python lambda表达式(匿名函数)写法解析

    这篇文章主要介绍了python lambda表达式(匿名函数)写法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 # lambda表达式,为了解决简单函数的情况,如: def func(a1,a2): return a1 + a2 func = lambda a1,a2:a1+a2 # 上面这两个是一样的 def func1(a1,a2): return a1 + a2 func2 = lambda a1,a2:a1+a2 wdc = fu

  • Python 中的lambda匿名函数和三元运算符

    目录 匿名函数 什么是匿名函数 分类 三元运算符 匿名函数 什么是匿名函数 用一句话表达只有返回值的函数就是匿名函数.匿名函数只用来实现一些简单的函数功能,所以追求代码的简洁和高效.使用关键字 ​​lambda​​ 定义,所以匿名函数又称之为lambda表达式. 分类 无参数的​​lambda​​ 表达式 # 普通函数 def func(): return 'hello motherland' # 调用 res = func() print(res) # hello motherland # l

  • c++11 符号修饰与函数签名、函数指针、匿名函数、仿函数、std::function与std::bind

    一.符号修饰与函数签名 1.符号修饰 编译器将c++源代码编译成目标文件时,用函数签名的信息对函数名进行改编,形成修饰名.GCC的C++符号修饰方法如下: 1)所有符号都以_z开头 2)名字空间的名字 名字空间(或类)的名字前加上N 名字前还有一个数字,是名字的字符数.比如1C,1是C的长度. 3)函数名 与名字空间一样,函数名前也有数字,比如4func,4是func的字符数. 4)参数 参数以E开头 例子 N::C::func(int) 的函数签名经过修饰为_ZN1N1C4funcEi 2.函

  • python基础教程之匿名函数lambda

     python lambda 当我们在使用函数时,有时候,并不需要显示的定义一个函数,我们可以使用匿名函数更加方便,在Python中对匿名函数也提供了支持. 比如当我们想计算两个数a,b之和时,即f(a,b) = a + b.我们可以有两种方法完成,第一种就是显示的定义一个函数f(x,y),然后将参数传进去得到结果.第二种方式就是使用匿名函数了. f = lambda x,y:x+y >>>f(1,2) 3 匿名函数lambda x,y:x+y实际上就是: def f(x, y): re

  • 深入浅析Python获取对象信息的函数type()、isinstance()、dir()

    type()函数: 使用type()函数可以判断对象的类型,如果一个变量指向了函数或类,也可以用type判断. 如: class Student(object): name = 'Student' a = Student() print(type(123)) print(type('abc')) print(type(None)) print(type(abs)) print(type(a)) 运行截图如下: 可以看到返回的是对象的类型. 我们可以在if语句中判断比较两个变量的type类型是否相

  • Python函数基础(定义函数、函数参数、匿名函数)

    目录 一.定义函数: 1.简单的规则: 2.语法 3.无参函数 4.有参函数 5.空函数 二.调用函数及返回值 1.函数运行完毕所有代码,如果函数体不写return,则会返回None. 2.函数可以返回一个或多个值(元组类型) 三.函数的参数 1.普通参数,位置必需参数 2.关键字参数 3.默认参数 4.不定长参数之* 注意:实参之* 5.不定长参数之** 注意:实参之** 可变长参数应用 6.命名关键字参数 四.函数对象 1.函数当作参数传给一个另一函数 2.函数当作另一函数的返回值 3.函数

  • jQuery 函数实例分析【函数声明、函数表达式、匿名函数等】

    本文实例讲述了jQuery 函数用法.分享给大家供大家参考,具体如下: 命名函数 可多次调用. 函数声明: function func(args) {//执行语句}; 例: <script> $(document).ready(function() { //创建一个点击事件 $('img').clikc(show); //show()函数声明 function show() { var info = '<div><h3></h3></div>';

  • 浅析python 内置字符串处理函数的使用方法

    一.lower():将大写字母全部转为小写字母.如: 复制代码 代码如下: name='G'b=name.lower() 二.title"":将字符串转化为标题,即所有单词的首字母大写,其他字母小写.使用方法同lower() 三.replace:返回某字符串的所有匹配项均被替换之后得到的字符串. 复制代码 代码如下: 'This is a test'.replace('is','are') 四.split:将字符串分割成序列 复制代码 代码如下: '1+2+3+4+5'.split('

  • Python浅析匿名函数lambda的用法

    目录 lambda函数的定义    Lambda函数在Python中 lambda函数的定义    lambda函数是Python中常用的内置函数,又称为匿名函数.和普通函数相比,它只有函数体,省略了def和return,使得结构看起来更精简.其基本调用语法如下: lambda [var1 [,var2,…varn]]:expression [var1 [,var2,…varn]]:形式参数,可以理解为入参,供表达式使用. expression:函数表达式,其结果为lambda函数的返回值. L

随机推荐