当前位置: 首页 > 科技观察

鲜为人知的Python5高级功能

时间:2023-03-22 13:11:56 科技观察

任何编程语言的高级功能通常都是通过大量的经验发现的。假设您正在编写一个复杂的项目并在stackoverflow上寻找问题的答案。然后你突然发现了一个非常优雅的解决方案,它使用了一个你从不知道存在的Python特性!这种学习方式非常有趣:通过探索,通过偶然发现一些东西。下面是Python的5个高级特性以及如何使用它们。Lambda函数Lambda函数是一个相对较小的匿名函数——匿名的意思是它实际上没有函数名称。Python函数通常使用defa_function_name()风格定义,但对于lambda函数,我们根本不命名。这是因为lambda函数的功能是执行某种简单的表达式或操作,而无需完整定义函数。lambda函数可以接受任意数量的参数,但表达式只能有一个。x=lambdaa,b:a*bprint(x(5,6))#prints30x=lambdaa:a*3+3print(x(3))#prints12看看这有多简单!我们执行了一些简单的数学运算而没有定义整个函数。这是Python的众多特性之一,使其成为一种干净、简单的编程语言。Map函数Map()是一个内置的Python函数,可以将函数应用于各种数据结构中的元素,例如列表或字典。这是执行此类操作的一种非常干净且可读的方式。defsquare_it_func(a):returna*ax=map(square_it_func,[1,4,7])print(x)#prints[1,16,47]defmultiplier_func(a,b):returna*bx=map(multiplier_func,[1,4,7],[2,5,8])print(x)#prints[2,20,56]看上面的例子!我们可以将函数应用于单个或多个列表。事实上,您可以使用任何Python函数作为map函数的输入,只要它与您正在操作的序列的元素兼容即可。Filter函数filter内置函数与map函数非常相似,它也将函数应用于序列结构(列表、元组、字典)。两者之间的主要区别在于filter()将只返回应用函数返回True的元素。详情请看下面的例子:#Ournumbersnumbers=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]#Functionthatfiltersoutallnumberswhichareodddeffilter_odd_numbers(num):ifnum%2==0:returnTrueelse:returnFalsefilterfiltered_numbers=filter(filter_odd_numbers,numbers)print(filtered_numbers)#filtered_numbers=[2,4,6,8,10,12,14]我们不仅为每个列表元素评估True或False,filter()函数还确保只返回匹配True的元素。处理检查表达式和构建返回列表这两个步骤非常方便。Itertools模块Python的Itertools模块是一组用于处理迭代器的工具。迭代器是一种可以在for循环语句中使用的数据类型,包括列表、元组和字典。使用Itertools模块中的函数可以执行许多通常需要多行函数和复杂列表理解的迭代器操作。请参阅此示例以了解Itertools的魔力:fromitertoolsimport*#Easyjoiningoftwolistsintoalistoftuplesforiinizip([1,2,3],[a,b,c]):printi#(a,1)#(b,2)#(c,3)#Thecount()函数返回一个永远#produces连续整数的interator。这个#oneisgreatforaddingindicesnexttoyourlist#elementsforreadabilityandconvenienceforiinizip(count(1),[Bob,Emily,Joe]):printi#(1,Bob)#(2,Emily)#(3,Joe)#Thedropwhile()函数返回返回#alltheelementsoftheinputwhichcomeafteracertain的迭代器#conditionbecomesfalseforthefirsttime.defcheck_for_drop(x):printChecking:,xreturn(x>5)foriindropwhile(should_drop,[2,4,6:8,10,Result1)检查:2#Checking:4#Result:6#Result:8#Result:10#Result:12#Thegroupby()函数非常适合检索束#ofiteratorelementswhicharethesameorhavesimilar#propertiesa=sorted([1,2,1,3,2,1,2,3,4,5])forkey,valueingroupby(a):打印(键,值),结束=)#(1,[1,1,1])#(2,[2,2,2])#(3,[3,3])#(4,[4])#(5,[5])生成器函数生成器函数是一个类似于迭代器的函数,即也可以用在for循环语句中。这极大地简化了您的代码,并且与简单的for循环相比节省了大量内存。例如,我们想要将1到1000之间的所有数字相加,以下代码块的第一部分向您展示了如何使用for循环来执行此计算。如果列表很小,比如1000行,计算所需的内存就可以了。但是如果列表很长,比如十亿个浮点数,这就会出问题。使用这种for循环,内存中会有很多列表,但不是每个人都有无限的RAM来存储这么多东西。Python中的range()函数做同样的事情,它在内存中构建列表。代码的第二部分展示了如何使用Python生成器函数对数字列表求和。生成器函数只在必要时创建元素并将它们存储在内存中,即一次一个。这意味着如果你要创建数十亿个浮点数,你一次只能将它们存储在内存中!Python2.x中的xrange()函数使用生成器来构建列表。上面的例子说明了:如果要生成一个范围很大的列表,那么就需要用到生成器函数。如果您的内存有限,例如移动设备或边缘计算,这一点尤为重要。也就是说,如果您想多次迭代一个列表,并且它足够小以适合内存,您最好使用for循环或Python2.x中的range函数。因为generator函数和xrange函数每次访问都会生成新的列表值,而Python2.xrange函数是静态列表,为了快速访问,整数已经放在内存中了。#(1)使用forloopvnumbers=list()foriinrange(1000):numbers.append(i+1)total=sum(numbers)#(2)Usingageneratordefgenerate_numbers(n):num,numbers=1,[]whilenum