python非匿名函数_python 匿名函数

本文介绍了Python中的lambda函数、map和filter的应用、列表解析、迭代器生成及字符串替换等实用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

lambda 本身不是一个函数,而是一个关键字,它告诉python创建一个函数并在适当的位置使用它,而不是通过一个名称引用它。

>>> filter_me=[1,2,3,4,5,6,7,8,11]

>>> func=lambda x:x%2==0

>>> result=filter(func,filter_me)

>>> print(result)

>>> print(*result)

2 4 6 8

>>> result=filter(lambda x:x%2==0,filter_me)

>>> print(*result)

由于缺少名称,lambda创建的函数被称为匿名函数,可以使用lambda 语句的结果给函数绑定一个名称。该名称只在创建名称的作用域内可用

lambda只能是一个简单函数,并且不能包含其他语句,比如为变量创建一个名称。在lambda内部,只能执行有限的操作,比如测试相等性、将两个数相乘或者以特定的方式使用其他已经存在的函数。只能使用传递到lambda函数的参数。然而,可以通过使用and/or 操作。

lambda主要用在内置函数map和filter中。通过使用lambda,这些函数能够以紧凑的方式执行一些大的操作,而不必使用循环。

2 map短路循环:

map是一个特殊的函数,它用于需要对列表中的每个元素执行一个指定的操作的情形。

>>> map_me=['a','b','c','d']

>>> result=map(lambda x:"the letter is %s"%x,map_me)

>>> print(*result)

如果向map中传递一个列表 或者元组 的列表,则它期待得到列表。主列表中的每个序列应该有相同数目的元素。

>>> # use map with a list of lists,to re-order the output

>>> map_me_again=[[1,2,3],[4,5,6]]

>>> result=map(lambda list:[list[1],list[0],list[2]],map_me_again)

>>> print(*result)

[2, 1, 3] [5, 4, 6]

map总是返回一个迭代器。可以传递给map一个非匿名函数的名称,它仍然以相同的方式运行。

3 列表解析

>>> everything=[1,2,3,4,5,6,7,8,12]

>>> print([x for x in everything if x%2==0])

[2, 4, 6, 8, 12]

这是将列表的一部分放入循环中的一种简洁实用的方式。列表中只有相关的部分,也就是在程序中希望得到的部分才会被加入到循环中。

列表解析可以包括循环和条件语句,能够提供更强大的做出决策的能力。而lambda只允许执行一个简单表达式。

在大多数情况中,列表解析将比其他方式运行得更快。

4 为循环生成迭代器

python有一个能够创建迭代器的特殊特性,即range函数:

>>> f=range(10,20)

>>> print(*f)

10 11 12 13 14 15 16 17 18 19

如果只给range传递一个数值,那么它将从0数到该数值。这个数值既可以是正数,也可以是负数

如果只希望每隔一个数值或者每隔两个数值打印数值,可以使用一个可选的第三个参数step

>>> f=range(-1)

>>> print(*f)

>>> for number in range(5,55,4):

print("number from 5 to 55 by fours:%d"%number)

range返回一个行为与列表类似的迭代器对象。注意这个对象没有公共接口。而仅有私有方法。dir(range(0,10)

可以通过同列表、序列以及字典相同的解除引用操作符(方括号)来访问它,当使用方括号访问时,是在告诉python要调用列表、元组或字典的__getitem__方法,range对象具有这个私有方法

>>> f=range(2)

>>> f[0]

0

5 使用字典的特殊字符串替换

使用字典进行字符串替换

>>> person={"name":"James","camera":"nikon","handedness":"lefty","baseball_team":"angels","instrument":"guitar"}

>>> print("%(name)s,%(camera)s,%(baseball_team)s"%person)

James,nikon,angels

圆括号中的信息是键名,它的值将从字典中得到并替换为字符串。圆括号后面指定插入的数据类型,s 字符串,i 整数、j虚数、L长整数

>>> import string

>>> person={"name":"James","camera":"nikon","handedness":"lefty","baseball_team":"angels","instrument":"guitar"}

>>> person["height"]=1.6

>>> person["weight"]=80

>>> t=string.Template("$name is $height m high and $weight kilos")

>>> print(t.substitute(person))

James is 1.6 m high and 80 kilos

lambda允许编写一个简单的函数而不必在其他地方声明它。编写和运行这些函数不需要绑定一个名称,因此它们称为匿名函数。map在列表上操作,当用于一个简单列表时,将针对列表从头到尾的每个元素运行一个函数。当提供给map多个列表,或者列表中包含列表时,它具有更复杂的行为。

列表解析是指在解除对序列的引用的方括号中运行有限量代码的能力,只有满足中括号中标准的那些元素被返回。通过列表解析可以简单快速的访问一个序列的指定成员

range操作能够提供起始于任意数值并且终止于任意数值的数值列表,所以可以用来生成一个通常用于for循环的迭代器。

除了简单的字符串替换以外,还可以提供一个具有格式说明符的字符串,这些格式说明符通过使用一种特殊的语法引用字典中的键名。这个形式允许继续使用格式说明符选项

string.Template模块中为这种简单的基于键名字符串格式化提供了一种替换形式。它提供了略微简单一点的格式,在允许用户指定模板时更适合。生成套用信函是使用这个方法的一个例子。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值