匿名函数python内置高阶函数以及递归
匿名函数
python定义一个函数通常使用def关键词,后面跟函数名,然后是注释、代码块等。
def func():
'''注释'''
print('from func')
这样就在全局命名空间定义了一个叫func的函数,func表示函数体的内存地址,因为func指向函数体内存地址,所以可以通过func来调用函数。
那么匿名函数呢?从名字就可看出,匿名。想想就有点像以前小时候的佚名一样,带点说不清楚的神秘色彩,现在想来之所以感觉神秘可能是因为那时候不认识‘’佚‘’这个字。。。
强调:
匿名函数的定义就相当于只产生一个变量在值,而没有绑定任何名字,
所以会在定义完之后就被回收,无法重复使用,只能在定义时使用一次
应用:当某一个功能仅使用一次就没有再重复使用的必要了,就应该定义成匿名函数
言归正传,匿名和佚名一样没有名字或者不需要知道名字,对就是这么酷。
定义一个匿名函数使用lambda关键词,和def比较的话会发现其实定义逻辑很像。
lambda x: x**2
定义的匿名函数的意思是参数为x,返回x的平方,返回?怎么没看到return?因为lambd引号后面的值默认返回,所以没必要加return了,但是我一定要加呢?就是这么不讲道理。那么解释器只好报错了,因为你不认同我的语法,那我也没必要惯着你了。就是这么拽。
匿名函数的使用场景通常为使用一次就结束了,不会频繁的使用。而且匿名函数通常和python里面自带的高阶函数结合使用,在某些应用场景下会达到事倍功半的效果哦。
高阶函数
map
map的意思是地图的意思,由此引申出映射表示一一对应。

翻译过来的意思是:创建一个迭代器,使用每个迭代的参数计算函数。 当最短的可迭代用尽时停止。
map函数有两个参数,第一个为某种规则的函数,第二个位多个可迭代对象。
def func(x):
return x * 2
lis = [1, 2, 3, 4, 5, 6]
print(type(map(func, lis)))
print(list(map(func, lis)))
map函数把可迭代对象中的元素自动传给func,通过func的加工,得到一个生成器对象,通过list函数转化为一个列表。
当然,map函数可以接收多个可迭代对象,比如
def func(x, y):
return x + y
lis1 = [1,2,3,4,5,6]
lis2 = [2,3,4,5,6,7,8,9,10,11]
print(list(map(func, lis1,lis2)))
# 结果为[3, 5, 7, 9, 11, 13]
map函数会把后面迭代器对象中的元素迭代出来经过func加工,当最短的可迭代用尽是停止,所以只进行到6+7就结束了。
reduce
reduce是减少、合并的意思,会把可迭代对象中的元素经过函数的加工进而产生新的结果。

翻译过来就是:从左到右累加两个参数的函数到序列的项目,以便将序列减少为单个值。例如,reduce(lambda x,y:x + y,[1,2,3] ,4,5]计算(((((1 + 2)+3)+4)+5)。如果存在初始值,则将其放置在计算中序列的项之前,并在序列为空时用作默认值。
reduce函数有三个参数,函数和序列都是必须参数,初始值为可选参数。
应用:比如求1-100的和
from functools import reduce
def func(x, y):
return x+y
print(reduce(func, [i for i in range(1,101)]))
# 结果为 5050
filter
filter的意思为过滤,通过函数的返回值对序列进行过滤。

翻译过来:返回一个迭代器,产生函数(item)为真的迭代项。 如果函数为None,则返回结果为真的项。
def func(x):
return x.isdigit()
lis = ['12', 'ad', '34', 'bc', '46']
print(list(filter(func, lis)))
# 结果为 ['12', '34', '46']
filter过滤结果为真的值放进迭代器中。
高阶函数和匿名函数
map和匿名函数
在之前map函数中的func参数都是定义了一个有名参数,然后用函数名传入map函数的,有了匿名函数就不用这么麻烦了。
lis = [1, 2, 3, 4, 5, 6]
print(list(map(lambda x: x*2, lis)))
# 结果为 [2, 4, 6, 8, 10, 12]
reduce和匿名函数
print(reduce(lambda x, y: x + y, [i for i in range(101)], 100))
# 输出结果为 5050
filter和匿名函数
sala = {
'MAC': 30000,
'iPhone': 9000,
'lenovo': 10000,
'xiaomi': 3000
}
print(list(filter(lambda x: sala[x] > 5000, sala)))
# 输出结果为 [‘iPhone', 'lenovo']
匿名函数的使用场景较为单一,一次性使用,随用随时定义。在某些场景下和高阶函数结合会提升效率,同时使代码更加简洁。
递归
一 递归调用的定义
递归调用时函数嵌套调用的一种特殊形式,函数在调用时,直接或间接地调用了自身,就是递归调用。
# 直接调用自身
def f1():
print('from f1')
f1()
f1()
# 间接调用自身
def f1():
print('from f1')
f2()
def f2():
print('from f1')
f1()
f2()
# 调用函数会产生局部的名称空间,占用内存,因为上述这种调用会无限调用自身,python解释器的内存管理机制为了防止无限占用内存,对函数的递归调用做了层级限制,可以通过代码修改最大层级限制。
import sys
sys.setrecursionlimit(100000)
二 递归调用的两个阶段
递归调用包含两个明确的阶段:回溯,递推
回溯就是从外向里一层一层递归调用下去,回溯阶段必须要有一个明确的结束条件(不然会成为死循环),每进入下一次递归时,问题的规模都应该有所减少。
递推就是从里向外一层层结束递归。
递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈实现的,每当进入一个函数调用,在栈下面会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以递归调用次数过多,会导致栈溢出)
三 二分法
从一个排序的数字列表中找到指定的数字,使用遍历的效率太低,使用二分法可以极大地缩小问题规模。
实现in的效果
nums = [1,5,12,23,34,46,59,99,443] def fucn(num, nums):
if len(nums) == 0:
return
mid_index = len(nums) // 2
if num > nums[mid_index]:
nums = nums[mid_index+1:]
fucn(num, nums) elif num < nums[mid_index]:
nums = nums[:mid_index]
fucn(num,nums)
else:
print('not exis')
实现index的效果
nums = [1, 13, 15, 23, 27, 31, 33, 57, 73, 81, 93, 94, 97, 101] # 从小到大排列的数字列表
def binary_search(find_num,nums):
print(nums)
if len(nums) == 0:
print('not exists')
return # 功能
mid_index = len(nums) // 2
if find_num > nums[mid_index]:
# in the right
nums=nums[mid_index+1:]
# 重新运行功能,传入新列表
binary_search(find_num,nums)
elif find_num < nums[mid_index]:
# in the left
nums=nums[:mid_index]
# 重新运行功能,传入新列表
binary_search(find_num,nums)
else:
print('find it') binary_search(95,nums)
匿名函数python内置高阶函数以及递归的更多相关文章
- Python中匿名函数与内置高阶函数详解
大家好,从今天起早起Python将持续更新由小甜同学从 初学者的角度 学习Python的笔记,其特点就是全文大多由 新手易理解 的 代码与注释及动态演示 .刚入门的读者千万不要错过! 很多人学习pyt ...
- Python内置高阶函数map()
map()函数map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回. 例如,对于lis ...
- python(内置高阶函数)
1.高阶函数介绍: 一个函数可以作为参数传给另外一个函数,或者一个函数的返回值为另外一个函数(若返回值为该函数本身,则为递归),如果满足其一,则为高阶函数. 常见的高阶函数:map().sorted( ...
- python面试_总结01_概念和内置高阶函数
- 简答题 1.请谈谈Python中is 和 == 的区别(代码演示) is用于比较两个变量是否引用了同一个内存地址,is表示的是对象标识符(object identity),作用是用来检查对象的标识 ...
- reduce内置高阶函数求和
>>> def f(x, y): ... return x+y ... >>> reduce(f, a, ) >>> reduce(lambda ...
- Python中的高阶函数与匿名函数
Python中的高阶函数与匿名函数 高阶函数 高阶函数就是把函数当做参数传递的一种函数.其与C#中的委托有点相似,个人认为. def add(x,y,f): return f( x)+ f( y) p ...
- Python 函数式编程 & Python中的高阶函数map reduce filter 和sorted
1. 函数式编程 1)概念 函数式编程是一种编程模型,他将计算机运算看做是数学中函数的计算,并且避免了状态以及变量的概念.wiki 我们知道,对象是面向对象的第一型,那么函数式编程也是一样,函数是函数 ...
- python字符串反转 高阶函数 @property与sorted(八)
(1)字符串反转 1倒序输出 s = 'abcde' print(s[::-1]) #输出: 'edcba' 2 列表reverse()操作 s = 'abcde' lt = list(s) lt.r ...
- Python入门篇-高阶函数
Python入门篇-高阶函数 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.高级函数 1>.First Class Object 函数在Python中是一等公民 函数也 ...
随机推荐
- Multi-pattern string match using Aho-Corasick
我是擅(倾)长(向)把一篇文章写成杂文的.毕竟,写博客记录生活点滴,比不得发 paper,要求字斟句酌八股结构到位:风格偏杂文一点,也是没人拒稿的.这么说来,arxiv 就好比是 paper 世界的博 ...
- 《代码不朽:编写可维护软件的10大要则(C#版)》读后感
本书作者Joost Visser,译者张若飞.本书讲解了编写可维护代码的10个要则,从目录就可以看出这10点分别是: 编写短小的代码单元(15行以内,在大部分情况下还是能实现的,但是当我们使用Linq ...
- 当input中的type值为file时,各浏览器的表现形式不同
如果想使各浏览器下的表现形式相同,需要对该input元素隐藏,然后再改元素下方添加标签.其html写法如下 <div class="input-file"> <i ...
- keepalived给LVS带来了什么
LVS+Keepalived 1>Keepalived简介 Keepalived是Linux下一个轻量级别的高可用解决方案,高可用(High Avalilability,HA),其实两种不同的 ...
- 升讯威微信营销系统开发实践:订阅号和服务号深入分析( 完整开源于 Github)
GitHub:https://github.com/iccb1013/Sheng.WeixinConstruction因为个人精力时间有限,不会再对现有代码进行更新维护,不过微信接口比较稳定,经测试至 ...
- Unable to launch the IIS Express Web server
尝试运行程序,出现此异常提示Unable to launch the IIS Express Web server. 解决问题,是把网址修改为另一个试试: 把http://localhost:1114 ...
- J2EE导论 | 疑惑篇
J2EE是Java程序员从新手进阶的一个必经之路.要体会所谓的工业级代码,就必须要融入和经历更为复杂的开发.部署环境,需要同更多的模块.组件做信息流交换,比较和使用不同的框架,逐一去琢磨和考察它们的必 ...
- 「ZJOI2016」解题报告
「ZJOI2016」解题报告 我大浙的省选题真是超级神仙--这套已经算是比较可做的了. 「ZJOI2016」旅行者 神仙分治题. 对于一个矩形,每次我们从最长边切开,最短边不会超过 \(\sqrt{n ...
- Javascript高级编程学习笔记(69)—— 事件(13)触摸与手势事件
触摸与手势事件 由于移动设备既没有鼠标也没有键盘,所以在为移动浏览器开发交互性网页时,常规的鼠标键盘事件根本不够用 所以早期的苹果为Safari 添加了一些与触摸相关的事件 随着后面Android的W ...
- Python教程:从零到大师
首先, 什么是Python? 用python作者Guido van Rossum自己的话来说,Python是这样的一门语言: "它是一门高级编程语言, 它的核心设计理念是让所有代码变得 ...