Python 学习笔记-第7讲:匿名函数 lambda

时间:2022-08-31 19:12:55

1. 匿名函数

lambda [arg1 [,arg2,.....argn]]:expression

lambda 函数是不需要使用 def 语句定义的一个简易函数,其语法只包含一个语句。

  • lambda 只是一个表达式,函数体比 def 简单很多。
  • lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
  • lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。
  • 虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。
>>> double=lambda x:x*2
>>> double(5)
10

x 是lambda函数的参数,将返回表达式 x*2 的值。

相当于:

def double(x):
   return x * 2

lambda 函数通常与内置函数 map()、filter() 等联合使用。

>>> my_list = [1, 5, 4, 6, 8, 11, 3, 12]
>>> new_list = list(filter(lambda x:x%2==0, my_list))    # 筛选出my_list中的所有偶数元素
>>> print(new_list)
[4, 6, 8, 12]

2. Python 中的一些常用函数

    1) map() 函数

        map() 会根据提供的函数对指定序列做映射。

        第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。


        语法:

        map(function, iterable, ...)

        返回值:

        python2 返回一个列表

        python3 返回一个迭代器

>>> def square(x):
	return x**2

>>> my_list = [1, 5, 4, 6, 8, 11, 3, 12]
>>> map(square,my_list)    # 返回一个可迭代的 map 对象,可使用 list() 将其转换为列表;square 是一个函数引用,没有括号
<map object at 0x0000020F48D04EF0> 
>>> list(map(square,my_list))
[1, 25, 16, 36, 64, 121, 9, 144]
>>> list(map(lambda x:x**2,my_list)) # 使用匿名函数 lambda 计算平方数
[1, 25, 16, 36, 64, 121, 9, 144]

map() 函数可以包含多个序列:

>>> list(map(lambda x,y:x+y,my_list,new_list))
[3, 8, 9, 13, 16, 30, 16, 14]

如果函数有多个参数, 但每个参数的序列元素数量不一样, 会根据最少元素的序列进行:

>>> listx = [1,2,3,4,5,6,7]       # 7 个元素
>>> listy = [2,3,4,5,6,7]         # 6 个元素 
>>> listz = [100,100,100,100]     # 4 个元素
>>> list_result = map(lambda x,y,z : x**2 + y + z,listx, listy, listz)
>>> print(list(list_result))
[103, 107, 113, 121]


2) filter() 函数

   filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。

    该函数接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判,然后返回 True 或 False,最后将返回 True 的元素放到    新列表中

    语法

    filter(function, iterable)

    

    返回值:

        python2 返回一个列表

        python3 返回一个迭代器

>>> my_list = [1, 5, 4, 6, 8, 11, 3, 12]
>>> new_list = list(filter(lambda x:x%2==0, my_list))    # 筛选出my_list中的所有偶数元素
>>> print(new_list)
[4, 6, 8, 12]

3) reduce() 函数

    reduce() 函数会对参数序列中元素进行累积。

    函数将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操        作,得到的结果再与第三个数据用 function 函数运算,最后得到一个结果。

    

    语法:

        reduce(function, iterable[, initializer])

     

参数

  • function -- 函数,有两个参数
  • iterable -- 可迭代对象
  • initializer -- 可选,初始参数

返回值

返回函数计算结果。

在 Python3 中,reduce() 函数已经被从全局名字空间里移除了,它现在被放置在 fucntools 模块里,如果想要使用它,则需要通过引入 functools 模块来调用 reduce() 函数。

>>> import functools
>>> result=functools.reduce(lambda x,y:x+y,range(1,101)) # 1-100 数列和
>>> print(result)
5050

阶乘:

>>> result=functools.reduce(lambda x,y:x*y,range(1,6)) # 5! 阶乘
>>> print(result)
120

4) sum() 函数

    sum() 方法对序列进行求和计算。

    语法:

    sum(iterable[, start])
    参数
    iterable -- 可迭代对象,如:列表、元组、集合。
    start -- 指定相加的参数,如果没有设置这个值,默认为0。
    返回值
    返回计算结果。

>>> my_list = [1, 5, 4, 6, 8, 11, 3, 12]
>>> sum(my_list)
50

5) max(), min() 函数

max() 方法返回给定参数的最大值,参数可以为序列。

min() 方法返回给定参数的最小值,参数可以为序列。

max( x, y, z, .... )

>>> max(-10,10,40)
40
>>> min(-10,10,40)
-10
>>> my_list = [1, 5, 4, 6, 8, 11, 3, 12]
>>> max(my_list)
12
>>> min(my_list)
1
>>> a=[(1,2),(2,3),(3,4)]                #比较元组列表
>>> max(a)                                     #按照元组的第一个元素进行比较,如果第一个元素相同,则比较第二个元素
(3, 4)
>>> a=[('a',1),('A',1)]                     
('a', 1)

6) sorted() 函数

sorted() 函数对所有可迭代的对象进行排序。排序时不影响原数据,产生新的排序数据

sorted(iterable[, cmp[, key[, reverse]]])

sort 与 sorted 区别:

sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。

list 的 sort 方法返回的是对已经存在的列表进行操作,而内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作。

7) enumerate()函数
语法
enumerate(iterator, start=0)
用迭代器iterator构造另一个迭代器,这个新的迭代器中的元素是一个2元素元组,元组的第一项是序号(序号从start开始),第二项是iterator中的元素。
  • 对于一个可迭代的(iterable)/可遍历的对象(如列表、字符串),enumerate将其组成一个索引序列,利用它可以同时获得索引和值
  • enumerate多用于在for循环中得到计数,例如对于一个seq,得到:
( 0 , se q[0] ), ( 1 , se q[1] ), ( 2 , se q[2] )
    • 1
  • enumerate()返回的是一个enumerate对象,例如: 
>>> list1=['a','b','c','d','e']
>>> enumerate(list1)
<enumerate object at 0x0000020F48CF4B88>
>>> for index,item in enumerate(list1):
print(index,item)

0 a
1 b
2 c
3 d
4 e