sort、sorted、lambda表达式和reduce

本文介绍了Python中两种常用的排序方法:sort()和sorted(),并对比了它们的区别及应用场景。此外,还详细讲解了lambda表达式的使用方法,并通过实例展示了如何利用lambda表达式简化代码。

原文:http://www.cnblogs.com/65702708/archive/2010/09/14/1826362.html

http://blog.youkuaiyun.com/imzoer/article/details/8667176

http://blog.sina.com.cn/s/blog_7b519a6b0101bntx.html

1、sort和sorted

我们需要对List进行排序,Python提供了两个方法

对给定的List L进行排序,
方法1.用List的成员函数sort进行排序
方法2.用built-in函数sorted进行排序(从2.4开始)

--------------------------------sorted---------------------------------------
>>> help(sorted)
Help on built-in function sorted in module __builtin__:

sorted(...)
    sorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list
---------------------------------sort----------------------------------------
>>> help(list.sort)
Help on method_descriptor:

sort(...)
    L.sort(cmp=None, key=None, reverse=False) -- stable sort *IN PLACE*;
    cmp(x, y) -> -1, 0, 1
-----------------------------------------------------------------------------

iterable:是可迭代类型;
cmp:用于比较的函数,比较什么由key决定,有默认值,迭代集合中的一项;
key:用列表元素的某个属性和函数进行作为关键字,有默认值,迭代集合中的一项;
reverse:排序规则. reverse = True 或者 reverse = False,有默认值。
返回值:是一个经过排序的可迭代类型,与iterable一样。
 
注;一般来说,cmp和key可以使用lambda表达式

sort()与sorted()的不同在于,sort是在原位重新排列列表,而sorted()是产生一个新的列表。

Sorting basic:

>>> print sorted([5, 2, 3, 1, 4])
[1, 2, 3, 4, 5]
>>> L = [5, 2, 3, 1, 4]
>>> L.sort()
>>> print L
[1, 2, 3, 4, 5]

Sorting  cmp:

>>>L = [('b',2),('a',1),('c',3),('d',4)]
>>>print sorted(L,cmp=lambda x,y:cmp(x[1],y[1]))
[('a', 1), ('b', 2), ('c', 3), ('d', 4)]

Sorting  keys:

>>>L = [('b',2),('a',1),('c',3),('d',4)]
>>>print sorted(L, key=lambda x:x[1]))
[('a', 1), ('b', 2), ('c', 3), ('d', 4)]

Sorting  reverse:

>>> print sorted([5, 2, 3, 1, 4], reverse=True)
[5, 4, 3, 2, 1]
>>> print sorted([5, 2, 3, 1, 4], reverse=False)
[1, 2, 3, 4, 5]
注:效率key>cmp(key比cmp快)
在Sorting Keys中:我们看到,此时排序过的L是仅仅按照第二个关键字来排的,如果我们想用第二个关键字
排过序后再用第一个关键字进行排序呢?
>>> L = [('d',2),('a',4),('b',3),('c',2)]
>>> print sorted(L, key=lambda x:(x[1],x[0]))
>>>[('c', 2), ('d', 2), ('b', 3), ('a', 4)]


2、lambda表达式

lambda只是一个表达式,函数体比def简单很多。
lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
lambda表达式是起到一个函数速写的作用。允许在代码内嵌入一个函数的定义。
如下例子:


定义了一个lambda表达式,求三个数的和。

再看一个例子:

用lambda表达式求n的阶乘。


lambda表达式也可以用在def函数中。

这里定义了一个action函数,返回了一个lambda表达式。其中lambda表达式获取到了上层def作用域的变量名x的值。

a是action函数的返回值,a(22),即是调用了action返回的lambda表达式。

这里也可以把def直接写成lambda形式。如下




3、reduce()

python中的reduce内建函数是一个二元操作函数,他用来将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给reduce中的函数 func()(必须是一个二元操作函数)先对集合中的第1,2个数据进行操作,得到的结果再与第三个数据用func()函数运算,最后得到一个结果。
def myadd(x,y):   
    return x+y   
sum=reduce(myadd,(1,2,3,4,5,6,7))   
print sum 
#结果就是输出1+2+3+4+5+6+7的结果即28
当然,也可以用lambda的方法,更为简单:

sum=reduce(lambda x,y:x+y,(1,2,3,4,5,6,7))   
print sum 



### Pythonlambda表达式的用途用法 #### 1. lambda表达式的定义与语法 Python中的`lambda`表达式是一种匿名函数,其语法简单明了:`lambda arguments: expression`。其中,`arguments`是函数的参数列表,可以包含任意数量的参数,参数之间用逗号分隔;`expression`是一个合法的Python表达式,其计算结果就是函数的返回值[^3]。 #### 2. lambda表达式的典型用途 `lambda`表达式的典型用途包括但不限于以下场景: - **结合内置函数使用**:`lambda`表达式通常与`map()`、`filter()``reduce()`等内置函数结合使用,以实现对数据的快速处理。 - **简化代码逻辑**:对于简单的函数逻辑,可以直接使用`lambda`表达式替代完整的`def`函数定义。 - **作为高阶函数的参数**:在需要将函数作为参数传递给其他函数时,`lambda`表达式可以提供一种简洁的方式[^2]。 #### 3. 示例代码 以下是几个常见的`lambda`表达式使用示例: ```python # 示例1:使用lambda表达式计算两个数的 add = lambda x, y: x + y print(add(5, 3)) # 输出:8 # 示例2:结合map()函数使用 numbers = [1, 2, 3, 4] squared = list(map(lambda x: x**2, numbers)) print(squared) # 输出:[1, 4, 9, 16] # 示例3:结合filter()函数使用 even_numbers = list(filter(lambda x: x % 2 == 0, numbers)) print(even_numbers) # 输出:[2, 4] # 示例4:结合reduce()函数使用 from functools import reduce factorial = reduce(lambda x, y: x * y, range(1, 6)) print(factorial) # 输出:120 # 示例5:嵌套lambda表达式 f = lambda a: lambda b: a + b g = f(10) print(g(20)) # 输出:30 ``` #### 4. 使用场景分析 - **数据处理**:当需要对列表或其他可迭代对象进行映射或过滤操作时,`lambda`表达式可以显著简化代码。 - **排序**:在使用`sorted()`或`list.sort()`方法时,可以通过`key`参数传递一个`lambda`表达式来定义自定义排序规则。 - **事件处理**:在GUI编程中,`lambda`表达式常用于为按钮或其他控件绑定简单的回调函数[^1]。 ### 注意事项 尽管`lambda`表达式功能强大且简洁,但并不适合所有场景。对于复杂的逻辑,建议使用标准的`def`函数定义方式,以提高代码的可读性可维护性[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值