高阶函数就是能够把函数当成参数传递的函数就是高阶函数,换句话说如果一个函数的参数是函数,那么这个函数就是一个高阶函数。
高阶函数可以是你使用def关键字自定义的函数,也有Python系统自带的内置高阶函数。
我们下面的例子中,函数 senior 的参数中有一个是函数,那么senior就是一个高阶函数;函数 tenfold 的参数不是函数,所以tenfold就只是一个普通的函数。
# 定义高阶函数
def senior(func, container):
"""
将容器中的数据依次放入函数中进行运算,
将结果返回到迭代器中,最后返回迭代器。
"""
lst = list()
for i in container:
lst.append(func(i))
return iter(lst)
# 定义普通的功能函数
def tenfold(num):
"""
十倍器
将数据乘 10,返回结果。
"""
return num * 10
# 定义一个列表
lst = [10, 20666, 'msr']
# 使用高阶函数
it = senior(tenfold, lst)
print(list(it)) # [100, 206660, 'msrmsrmsrmsrmsrmsrmsrmsrmsrmsr']
| 函数 | 功能作用 |
|---|---|
| map | 处理可迭代对象中的数据,将处理的结果返回到迭代器中。 |
| filter | 过滤可迭代对象中的数据,将过滤好的数据返回到迭代器中。 |
| reduce | 处理可迭代对象中的数据,将最终的结果返回出来。 |
| sorted | 排序可迭代对象中的数据,将排序好的结果返回出来。 |
语法:map(function, Iterable)
function:函数,可以是 自定义函数 或者是 内置函数;
iterable:可迭代对象,可迭代性数据。(容器类型数据和类容器类型数据、range对象、迭代器)
把可迭代对象中的数据一个一个拿出来,然后放在到指定的函数中做处理,将处理之后的结果依次放入迭代器中,最后返回这个迭代器。
将列表中的元素转成整型类型,然后返回出来。
lst = ['1', '2', '3', '4']
""" 使用常规的写法 """
new_lst = list()
for i in lst:
new_lst.append(int(i))
print(new_lst) # [1, 2, 3, 4]
""" 使用map函数实现 """
it = map(int, lst)
new_lst = list(it)
print(new_lst) # [1, 2, 3, 4]
列表中的每一个数依次乘 2的下标索引+1 次方。使用自定义的函数,配合实现功能。
lst = [1, 2, 3, 4]
""" 普通的方法,利用左移 """
new_lst = list()
for i in lst:
res = i << i
new_lst.append(res)
print(new_lst) # [2, 8, 24, 64]
""" 使用map函数 """
# 先定义一个左移函数,自定义的函数必须是一个带参函数并且有返回值
def func(num):
return num << num
new_lst = list(map(func, lst))
print(new_lst) # [2, 8, 24, 64]
""" 使用lambda简化 """
new_lst = list(map(lambda num: num << num, lst))
print(new_lst) # [2, 8, 24, 64]
语法:filter(function, iterable)
参数的意义和map函数一样
filter用于过滤数据,将可迭代对象中的数据一个一个的放入函数中进行处理,如果函数返回值为真,将数据保留;反之不保留,最好返回迭代器。
保留容器中的偶数
lst = [11, 2, 3, 34, 4, 4, 55]
""" 常规写法 """
new_lst = list()
for i in lst:
if i % 2 == 0:
new_lst.append(i)
print(new_lst) # [2, 34, 4, 4]
""" 使用filter函数 """
def func(num):
if num % 2 == 0:
return True
new_lst = list(filter(func, lst))
print(new_lst) # [2, 34, 4, 4]
""" filter + lambda """
new_lst = list(filter(lambda num: True if (num % 2 == 0) else False, lst))
print(new_lst) # [2, 34, 4, 4]
语法:reduce(function, iterable)
参数含义与map、filter一致。
计算数据,将可迭代对象的中的前两个值放在函数中做出运算,得出结果在和第三个值放在函数中运算得出结果,以此类推,直到所有的结果运算完毕,返回最终的结果。
根据功能我们就应该直到,reduce中的函数需要可以接收两个参数才可以。
reduce函数使用需要先从标准库functools中导入
将列表中的数据元素组合成为一个数,
from functools import reduce
lst = [2, 0, 6, 6, 6]
""" 常规方法 """
char = str()
for i in lst:
char += str(i)
print(int(char)) # 20666
""" 使用reduse函数 """
def func(x, y):
return x * 10 + y
res = reduce(func, lst)
print(res) # 20666
""" reduce + lambda """
res = reduce((lambda x, y: (x * 10 + y)), lst)
print(res) # 20666
语法:sorted(Iterable, key=function, reverse=False)
iterable:可迭代对象;
key:指定函数,默认为空;
reverse:排序的方法,默认为False,意为升序;
如果没有指定函数,就单纯的将数据安札ASCII进行排序;如果指定了函数,就将数据放入函数中进行运算,根据数据的结果进行排序,返回新的数据,不会改变原有的数据。
注意,如果指定了函数,排序之后是根据数据的结果对原数据进行排序,而不是排序计算之后的就结果数据。
将列表中的数据进行排序。
lst = [1, 23, 34, 5, 6, 342, 12, 12, 2345, -3]
""" 使用列表的内置函数进行排序,默认升序 """
lst.sort()
print(lst) # [-3, 1, 5, 6, 12, 12, 23, 34, 342, 2345]
# 降序排序
lst.sort(reverse=True)
print(lst) # [2345, 342, 34, 23, 12, 12, 6, 5, 1, -3]
lst = [1, 23, 34, 5, 6, 342, 12, 12, 2345, -3]
""" 使用sorted进行排序 """
new_lst = sorted(lst)
print(new_lst) # [-3, 1, 5, 6, 12, 12, 23, 34, 342, 2345]
print(lst) # [1, 23, 34, 5, 6, 342, 12, 12, 2345, -3]
还有一点就是 sorted 函数可以将数据放入函数中进行处理,然后根据结果进行排序。
lst = [1, 23, 34, 5, 6, 342, 12, 12, 2345, -3]
""" 按照绝对值进行排序 """
new_lst = sorted(lst, key=abs)
print(new_lst) # [1, -3, 5, 6, 12, 12, 23, 34, 342, 2345]
""" 按照除以10的余数进行排序 """
def func(num):
return num % 10
new_lst = sorted(lst, key=func)
print(new_lst) # [1, 342, 12, 12, 23, 34, 5, 2345, 6, -3]
# 可以看到,我们指定函数之后排序的结果既不是原数据的绝对值、也不是原数据除以10的余数,而是根据这两种计算结果对原数据进行了排序。
既然有了列表的内置函数sort,为什么我们还要使用sorted函数呢?
高阶函数就是将函数作为参数的函数。
map(Function,Iterable)(将可迭代性数据中的元素一一取出放入函数中进行运算在将结果返回,最后返回的数据类型是迭代器)
filter(Function,Iterable)(过滤数据,将可迭代性数据放入函数中进行运算,结果为真将数据返回,反之舍弃,最会返回的数据类型是迭代器)
reduce(Function,Iterable)(计算数据,将可迭代型数据中的前两个元素拿出放入函数中进行运算将结果在与后一个元素进行运算,最后返回最终的结果)
sorted(Iterable,[key=Function],[reverse =Bool(False(default)/True)])(将可迭代型数据进行排序,或将可迭代型数据放入函数中进行运算将结果进行排序返回)
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re
我正在尝试用ruby中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了
我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht
如何在Ruby中按名称传递函数?(我使用Ruby才几个小时,所以我还在想办法。)nums=[1,2,3,4]#Thisworks,butismoreverbosethanI'dlikenums.eachdo|i|putsiend#InJS,Icouldjustdosomethinglike:#nums.forEach(console.log)#InF#,itwouldbesomethinglike:#List.iternums(printf"%A")#InRuby,IwishIcoulddosomethinglike:nums.eachputs在Ruby中能不能做到类似的简洁?我可以只
华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o
我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的
本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决