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': , 'y': , 'return': }

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

匿名函数

如何定义

在前面提及的文章中,讲到了使用

def

定义一个函数。但若是函数能够单行实现,这个时候可以考虑使用匿名函数(lambda 表达式)来实现这种功能。

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

>>> add = lambda x, y: x + y

>>> add

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))

...

4

4

4

4

4

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

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

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

>>> for f in func:

... print(f(0))

...

0

1

2

3

4

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

参考资料

来源

[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 函数的注解以及匿名函数的定义及其一些需要注意的问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值