python 匿名函数 判断 python匿名函数用法

您所在的位置:网站首页 reverse的用法及搭配 python 匿名函数 判断 python匿名函数用法

python 匿名函数 判断 python匿名函数用法

2023-06-30 08:02| 来源: 网络整理| 查看: 265

匿名函数

匿名函数即没有名字的函数,最早出现在LISP语言中,Python对其进行了引用。

匿名函数的作用就是在不丧失代码可读性的前提下为精简代码提供的一种方式,以下是定义匿名函数的语法,通过lambda关键字进行定义。

注意!函数不管有名没名,都必须先定义后使用

语法如下:

lambda 形参1, 形参2 ... : 返回值 # ❶ ❷

❶:形参可以有多个,也可以没有

❷:返回值不用跟return,直接写逻辑语句即可,将会自动的把逻辑语句的结果进行返回

定义和使用匿名函数的实际示例,求2个数的和:

res = (lambda x, y : x + y)(1, 2) print(res)

匿名函数常用于定义一些非常简单的逻辑,不支持多行,因此要尽量写的简洁易懂。

使用方式为匿名函数取名

匿名函数也可以通过一个标识符进行命名,但是一般都不会这样做:

add = lambda x, y : x + y res = add(1, 2) print(res) # 3自执行和自销毁

自执行函数即定义了匿名函数之后就立刻加括号调用,这种函数只会运行一次。

并且由于没有标识符的引用绑定关系,故使用完成后就会被GC机制所立即回收掉:

res = (lambda x, y : x + y)(1, 2) # ❶ print(res) # 3

❶:自执行的匿名函数必须在括号中进行定义

内置函数搭配使用

匿名函数常用于与内置函数进行搭配使用,如下将使用内置函数max()搭配匿名函数求得下列薪资最高的人员名字:

salaries = { 'Ken': 3000, 'Tom': 7000, 'Jack': 2000 } name = max(salaries, key=lambda k: salaries[k]) # ❶ print(name)

❶:max()函数的key参数可指定1个函数,此时函数的返回结果就是本次求最大值的对比条件,这个例子就是指定薪资作为对比条件

常用搭配函数

lambda表达式与一些函数配合,才能发挥出最大的威力。

Python中出名的诸如map()、filter()、reduce()函数等均来自Lisp语言的设计,它们实在是太方便了,其实说到底一门优秀的语言必定大量借鉴了其他语言的优秀特性。

max()与min()

max()函数用于从1个可迭代对象中返回最大的数据项,而min()是返回最小的,其他都一样。

max()函数签名如下:

def max(*args, key=None): pass

参数详解:

args:一个可迭代对象,拥有1个形参key:传入1个可调用对象(通常是指函数),指定本次的大小对比方式,默认是根据数据项值本身对比

默认比对是比对的值本身,如果是字典则拿key的值进行比对,以下示例中,由于C的ASCII码比A大,所以返回了C:

dic = {"A": 100, "B": 50, "C": 20} res = max(dic) print(res) # C

传入参数key,修改对比方式为字典的value,那么最后A的value最大,故返回A:

dic = {"A": 100, "B": 50, "C": 20} res = max(dic, key=lambda k:dic[k]) print(res) # A

手动实现max()函数:

from collections.abc import Iterable def customizeMax(*args, key=None): def default(args): """默认对比规则""" it = iter(args) if not isinstance(args[0], Iterable) else iter(args[0]) currentMaxItem = next(it) for item in it: if currentMaxItem < item: currentMaxItem = item return currentMaxItem def assign(args, key): """自定义对比规则""" oldSequence = tuple(args) if not isinstance( args[0], Iterable) else tuple(args[0]) # 生成新对比规则的序列 newComparisonSeq = tuple(key(item) for item in oldSequence) it = iter(newComparisonSeq) currentMaxNewComparisonItem = next(it) for item in it: if currentMaxNewComparisonItem < item: currentMaxNewComparisonItem = item # 根据索引值返回旧序列相同位置的数据项 return oldSequence[newComparisonSeq.index(currentMaxNewComparisonItem)] # 如果自定义了对比规则,则使用自定义的对比规则 if callable(key): return assign(args, key) # 如果未自定义对比规则,则使用Python的默认规则 elif key is None: return default(args) # 传入的key不是一个可调用对象且不是默认的None,则抛出异常 else: assert TypeError("key must is callable") res = customizeMax({"A": 100, "B": 50, "C": 20}) print(res) res = customizeMax({i for i in range(10)}) print(res) res = customizeMax([i for i in range(10)]) print(res) res = customizeMax(1, 2, 3, 4, 5, 6) print(res) dic = {"A": 100, "B": 50, "C": 20} res = customizeMax(dic, key=lambda k: dic[k]) print(res) s1 = {"A", "B", "C"} res = customizeMax(s1, key=lambda x: hash(x)) print(res) # C # 9 # 9 # 6 # A # Amap()

map()函数会从一个可迭代对象中依次取出1个数据项,并且会按照指定函数对数据项进行处理,处理完成后生成新的map可迭代对象并返回该map可迭代对象。

map()函数签名如下:

def __init__(self, func, *iterables): pass

参数详解:

func:一个可调用对象(通常是指函数),拥有1个形参,对iterables的数据项进行遍历并将返回值加入至新的map容器中,迭代完成后返回新的map容器iterables:一个可迭代对象

其实map()能做的推导式都能做,如将整个可迭代对象中的数据项+100,并返回新的可迭代对象:

newMapObject = map(lambda x:x+100, range(10)) print(list(newMapObject)) newList = [(lambda x:x+100)(i) for i in range(10)] print(newList) # [100, 101, 102, 103, 104, 105, 106, 107, 108, 109] # [100, 101, 102, 103, 104, 105, 106, 107, 108, 109]

手动实现map()函数:

from collections.abc import Iterable def customizeMap(func, *iterables): it = iter(iterables) if not isinstance(iterables[0], Iterable) else iter(iterables[0]) for item in it: yield func(item) print(list(customizeMap(lambda x:x + 100, range(10)))) # [100, 101, 102, 103, 104, 105, 106, 107, 108, 109]filter()

filter()函数会从一个可迭代对象中依次取出1个数据项,并且会按照指定函数对数据项进行筛选,符合条件的数据项加入新的filter对象中,不符合条件的数据项会直接丢弃,当遍历完整个可迭代对象后会返回新的filter对象。

filter()函数签名如下:

def __init__(self, function_or_None, iterable): pass

参数详解:

function_or_None:一个可调用对象(通常是指函数),拥有1个形参,指筛选条件,如果是None则筛选条件,此时会按照数据项本身的布尔值进行筛选iterable:一个可迭代对象

其实filter()能做的推导式都能做,如遍历整个容器对象,将是偶数的数据项筛选出来:

newFilterObject = filter(lambda x: x % 2 == 0, range(10)) print(list(newFilterObject)) newList = [i for i in range(10) if i % 2 == 0] print(newList) # [0, 2, 4, 6, 8] # [0, 2, 4, 6, 8]

手动实现filter()函数:

def customizeFilter(function_or_None, iterable): it = iter(iterable) if function_or_None is None: for item in it: # 若没有指定筛选函数,则按照数据项本身的布尔值进行筛选 if item: yield item for item in it: res = function_or_None(item) if res: yield item print(list(customizeFilter(lambda x: x % 2 == 0, range(10)))) # [0, 2, 4, 6, 8]reduce()

reduce()函数有1个初始值,你可以指定该初始值或者不指定。

每次对可迭代对象数据项进行迭代后,都会调用函数处理该数据项,并且将该数据项与初始值进行操作。

常用于累积运算,如累加,累乘等。

虽然该函数在Python3中已经被移除至内置函数的范畴,但是其强大的功能却很少被人熟练应用。

reduce()函数签名如下:

def reduce(function, sequence, initial=None): pass

参数详解:

function:一个可调用对象(通常是指函数),拥有2个形参,接收来自可迭代对象的2个数据项sequence:一个可迭代对象initial:一个初始值,它会随着可调用对象传入的参数进行运算而不断的改变,最终返回

简单的使用示例,求1 - 100的累加总和:

from functools import reduce seqSum = reduce(lambda x,y:x+y, range(1, 101)) print(seqSum) # 5050

使用reduce()能够快速的完成寻求最大最小值的操作:

from functools import reduce seqMax = reduce(lambda x, y: x if x > y else y, [1, 5, 10, 100, 399, 29]) print(seqMax) # 399

如果指定了初始值,那么则在初始值的基础上进行操作,如下所示初始值是English,每次的x,y进行相加后会再与初始值进行相加,最后会返回初始值:

from functools import reduce seqSumStr = reduce(lambda x, y: x + y, [chr(i) for i in range(65, 65 + 26)], "English:") print(seqSumStr) # English:ABCDEFGHIJKLMNOPQRSTUVWXYZ

手动实现reduce()函数,了解底层实现原理:

def customizeReduce(function, sequence, initial=None): it = iter(sequence) if initial: value = initial else: value = next(it) for item in it: value = function(value, item) return value seqSum = customizeReduce(lambda x, y: x + y, range(1, 101)) print(seqSum) seqMax = customizeReduce(lambda x, y: x if x > y else y, [1, 5, 10, 100, 399, 29]) print(seqMax) seqSumStr = customizeReduce(lambda x, y: x + y, [chr(i) for i in range(65, 65 + 26)], "English:") print(seqSumStr) # 5050 # 399 # English:ABCDEFGHIJKLMNOPQRSTUVWXYZsorted()

sorted()函数可以将一个可迭代对象传入,返回一个经过排序的列表,默认是升序排序。

第一参数:可迭代对象第二参数,关键字key:一个可调用对象(通常是指函数),拥有1个形参,返回结果即为排序的对比规则,如不指定则按照Python默认排序对比规则进行排序对比第三参数,关键字reverse:一个布尔值,当排序完成后是否对新列表进行翻转,默认是False即不翻转整个列表,如果是True则进行翻转,相当于对可迭代对象进行降序排序

sorted()函数与li.sort()方法的区别在于它会返回一个新的排好序的列表,而li.sort()则是原地排序。

此外sorted()函数支持对字典排序,这样做会返回1个包含字典key的列表,而li.sort()方法仅支持对列表排序。

使用如下,按照哈希值进行排序,并且翻转整个新的排序列表:

newList = sorted([chr(i) for i in range(65, 65 + 26)], key=lambda item: hash(item), reverse=True) print(newList) # ['X', 'J', 'R', 'L', 'Q', 'C', 'U', 'T', 'M', 'O', 'I', 'Y', 'A', 'V', 'S', 'N', 'D', 'E', 'G', 'K', 'W', 'F', 'H', 'Z', 'B', 'P']reversed()

reversed()函数不可与lambda表达式进行搭配,放到这里的主要原因是因为它与sorted()的reverse参数、li.sort()的reverse参数作用相同,用于生成一个被翻转过后的新列表,如下所示,返回的结果是一个reversed可迭代对象,必须将它转换为list或者tuple后才能查看其中数据项:

print( tuple(reversed([i for i in range(10)])) ) # (9, 8, 7, 6, 5, 4, 3, 2, 1, 0)

注意:该方法是生成新的对象,而不是原地翻转。

版本区别

Python2中的reduce()是内置模块,直接使用即可。

并且Python2中的map()、filter()的返回结果均为列表,而不是map对象和filter对象。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3