社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

十九、深入Python匿名函数

Python开发 • 4 年前 • 264 次点击  
👇👇关注后回复 “进群” ,拉你进程序员交流群👇👇

作者丨小sen

来源丨Python之王


「@Author:Runsen」

匿名函数是没有函数声明def的函数,用lambda关键字定义的函数。匿名函数的定义方式也和普通函数不一样,代码比较简洁。


匿名函数

匿名函数不需要显示地定义函数名,使用【lambda + 参数 +表达式】的方式

lambda 函数

比如,将最简单的平方函数改造成匿名函数

# lambda x : x * x 实际上就是

def f(x):
    return x * x

lambda 函数的形式

lambda argument1, argument2,... argumentN : expression

关于lambda参数的解读:

  • 关键字lambda表示匿名函数,冒号前面的x表示函数参数(可以没有或者是多个)
  • 冒号后边是表达式,在匿名函数中有且只能有一个
  • 匿名函数不用写return,表达式本身结果就是返回值

匿名函数怎么调用,lambda 返回的一个函数对象,只要传入参数,即可调用。

square = lambda x: x**2
square(3)

9

为什么说lambda代码比较简洁,lambda是一个表达式,将def函数三行写在一起。

[(lambda x: x*x)(x) for x in range(10)]
# 输出
[0149162536496481]

上面代码对应的def函数如下。

res = []
for i in range(10):
    res.append(i**2)

使用lambda最常见的方法就是对元祖列表,嵌套列表,字典进行排序。比如,下面的代码。

l = [(120), (30), (910), (2-1)]
l.sort(key=lambda x: x[1]) # 按列表中元祖的第二个元素排序
print(l)
# 输出
[(2-1), (30), (910), (120)]

在tkinter 中,也有对应实现的简单案例,下面代码实现的功能:主要你按压就出现being pressed

from tkinter import Button, mainloop
button = Button(
    text='This is a button',
    command=lambda: print('being pressed')) # 点击时调用 lambda 函数
button.pack()
mainloop()

主要你按压'This is a button',就打印being pressed。

如果用def就是下面的样子

from tkinter import Button, mainloop

def print_message():
    print('being pressed')

button = Button(
    text='This is a button',
    command=print_message) # 点击时调用 print_message 函数
button.pack()
mainloop()

纯函数

对于纯函数这个概念,我是了解极客时间专栏《Python核心技术与实战》才知道的。

函数式编程是指代码每一块都是不可变的,都是由纯函数的组成

这里的纯函数,值函数本身相互独立,对于相同的输入都有相同的输出,但是不改变输入的元素。

比如,传入一个列表将列表的元素变为原来的2倍

l = [12345]
def multiply_2(l):
    for index in range(0, len(l)):
        l[index] *= 2
    return l
multiply_2(l) # [2, 4, 6, 8, 10]
# [2, 4, 6, 8, 10]

上面这段代码不是纯函数的形式,因为经过多次调用,每次得到的结果不一样,因为l本质上发生了改变。

l = [12345]

def multiply_2_pure(l):
    new_list = []
    for item in l:
        new_list.append(item * 2)
    return new_list
multiply_2_pure(l) # [2, 4, 6, 8, 10]
#  [1, 2, 3, 4, 5]

上面这段代码才是纯函数的形式,在函数里面定义一个新的列表,每次得到的结果都一样,因为l本质上没有发生了改变。

其他函数

lambda返回的值,结合map,filter,reduce使用。

下面实例中的map、reduce、filter都是Python内置的高阶函数,

map

map 函数的形式

( function ,iterable )

第一个参数是函数的对象,第二个是一个可迭代对象。具体示例如下。

l = [12345]
new_list = map(lambda x: x * 2, l) 
list(new_list)
# [2, 4, 6, 8, 10]

filter

filter通常对一个集合做过滤的操作。具体示例如下。

l = [12345]
new_list = filter(lambda x: x % 2 == 0, l)
# new_list这里是一个 ,需要进行list转化,才能显示
list(new_list)
# [2, 4]

reduce

reduce通常对一个集合做累积的操作,需要引用functools模块。(只针对Python3而言,在Python2中reduce是内置函数)

import functools

l = [12345]
product = functools.reduce(lambda x, y: x * y, l) 
product
# 120 (1*2*3*4*5 = 120)

product = functools.reduce(lambda x, y: x + y, l) 
# 15  (1+2+3+4+5 = 15)

注意:无论是map还是filter返回的都是对象,需要对其进行列表转化。reduce在python3中已经放进functools模块中了

>>> map(lambda x: x ** 2, [12345])
0x000001CAD42A8CF8>
>>> filter(lambda x: x % 2 ==0, [1,2,3,4,5])
0x000001CAD42A8C88>
>>> reduce(lambda x,y: x*y,[1,2,3,4,5])
Traceback (most recent call last):
  File "", line 1in 
NameError: name 'reduce' is not defined
>>> from functools import reduce
>>> reduce(lambda x,y: x*y,[1,2,3,4,5])
120
map,filter返回的只是一个对象,reduce在python3中已经放进fucntools模块中了

思考题:如何将字典根据值来排序

d = {'Runsen'10'Maoli'20

'Liurunsen'30}
sorted(d.items(),key=lambda x:x[1],reverse=True)
# [('Liurunsen', 30), ('Maoli', 20), ('Runsen', 10)]

参考:https://time.geekbang.org/column/article/98411


Reference

[1]

传送门~: https://github.com/MaoliRUNsen/runsenlearnpy100


-End-

最近有一些小伙伴,让我帮忙找一些 面试题 资料,于是我翻遍了收藏的 5T 资料后,汇总整理出来,可以说是程序员面试必备!所有资料都整理到网盘了,欢迎下载!

点击👆卡片,关注后回复【面试题】即可获取

在看点这里好文分享给更多人↓↓

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/113826
 
264 次点击