Learning-Python【14】:匿名函数与函数递归
一、什么是匿名函数
匿名函数就是没有名字的函数,又叫lambda表达式。用于一些简单的需要用函数去解决的问题,特点是只能在定义时使用一次,且函数体只有一行
匿名函数的定义就相当于只产生一个变量的值,而没有绑定任何名字,所以会在定义完之后就被回收,无法重复使用,只能在定义时使用一次
二、为何要用匿名函数
当某一个功能仅使用一次就没有再重复使用的必要了,就可以定义成匿名函数
三、匿名函数的应用

参数可以有多个,用逗号隔开,返回值和正常的函数一样可以是任意的数据类型
# 把下面的函数转换成匿名函数
def add(x, y):
return x + y s = add(5, 8)
print(s) # 结果:
s = (lambda x, y: x + y)(5, 8)
print(s)
匿名函数的应用
# 取出最大工资对应的人名
salaries = {
'qiu': 2000,
'xi': 30000,
'qiuxi': 2500,
'rufeng': 3000
}
def func(k):
return salaries[k]
print(max(salaries,key=func)) # xi
# 1. 将可迭代对象salaries变成迭代器对象iter_obj
# 2. next(iter_obj)得到一个人名,然后将该人名当作参数传给key指定的函数,然后调用函数将函数的返回值当作比较依据
# 3. 比较大小,取出最大值对应的人名
# 上面的函数还可以用匿名函数来实现
print(max(salaries, key=lambda k: salaries[k]))
# 同样,取出最小的使用函数min
print(min(salaries, key=lambda k: salaries[k]))
max函数与匿名函数
# 将所有人的工资大小排序,输出排序后的人名
salaries = {
'qiu': 2000,
'xi': 30000,
'qiuxi': 2500,
'rufeng': 3000
}
# 从大到小
print(sorted(salaries, key=lambda k: salaries[k], reverse=True))
# 从小到大
print(sorted(salaries, key=lambda k: salaries[k]))
# 运行后
['xi', 'rufeng', 'qiuxi', 'qiu']
['qiu', 'qiuxi', 'rufeng', 'xi']
sorted函数与匿名函数
# 为每个名字加上一串字符
names = ['qiu', 'xi', 'ru', 'feng'] # 手动实现
new_names = []
for name in names:
new_names.append(name+'_nice')
print(new_names) # 列表生成式
new_names = [name+'_nice' for name in names]
print(new_names) # map+匿名函数
res = map(lambda x: x+'_nice', names)
print(res) # Python3里会打印函数地址
print(list(res)) # 运行后
['qiu_nice', 'xi_nice', 'ru_nice', 'feng_nice']
['qiu_nice', 'xi_nice', 'ru_nice', 'feng_nice']
<map object at 0x0000012E7A848A90>
['qiu_nice', 'xi_nice', 'ru_nice', 'feng_nice']
map函数与匿名函数
# 1到100的求和 # 手动实现
res = 0
for i in range(101):
res += i
print(res) # 列表生成式
print(sum([i for i in range(101)])) # reduce+匿名函数
from functools import reduce
print(reduce(lambda x, y: x + y, [i for i in range(101)])) # 运行
5050
5050
5050
reduce函数和匿名函数
# 提取包含指定字符的元素并输出
names=['qiu_nice','xi_nice','ru_nice','feng'] # 方式一:手动实现
new_names = []
for name in names:
if name.endswith('nice'):
new_names.append(name)
print(new_names) # 方式二:列表生成式
new_names = [name for name in names if name.endswith('nice')]
print(new_names) # 方式三:filter+匿名函数
res = filter(lambda name: name.endswith('nice'),names)
print(res) # Python3输出地址
print(list(res)) # 运行
['qiu_nice', 'xi_nice', 'ru_nice']
['qiu_nice', 'xi_nice', 'ru_nice']
<filter object at 0x000001DBBE8C8390>
['qiu_nice', 'xi_nice', 'ru_nice']
filter函数与匿名函数
四、什么是函数递归
函数的递归调用是函数嵌套调用的一种特殊形式,即在调用一个函数的过程中又直接或者间接地调用了该函数本身
递归本质就是一个循环的过程,但是递归必须满足两个原则:
1、每进入下一层递归,问题的规模必须有所减少
2、递归必须有一个明确的结束条件或者说有一个明确的进入下一层递归的条件
并且递归有两个明确的阶段:
1、回溯:一层一层的递归调用下去
2、递推:在某一层结束掉递归,然后一层一层返回
五、为何要用递归
在某些情况下,基于递归来使用重复的过程比循环更加简单
六、递归的使用
1、猜年龄
小明是新来的同学,丽丽问他多少岁了。他说:我不告诉你,但是我比滔滔大两岁。滔滔说:我也不告诉你,我比晓晓大两岁。晓晓说:我也不告诉你,我比小星大两岁。小星也没有告诉他,说:我比小华大两岁。最后小华说,我告诉你,我今年18岁了
这个怎么办呢?当然,有人会说,这个很简单啊,知道小华的,就会知道小星的,知道小星的就会知道晓晓的,以此类推,就会知道小明的年龄啦。这个过程已经非常接近递归的思想了。
| 小华 | 18 |
| 小星 | 18+2 |
| 晓晓 | 20+2 |
| 滔滔 | 22+2 |
| 小明 | 24+2 |
age(5) = age(4)+2
age(4) = age(3) + 2
age(3) = age(2) + 2
age(2) = age(1) + 2
age(1) = 18
def calc_age(n):
if n == 1:
return 18
else:
return calc_age(n-1)+2 print(calc_age(5)) #
代码实现
2、取元素
给定一个嵌套列表,取出列表中的每个元素输出打印
li = [1, [2, [3, [4, [5, [6, [7, [8, [9, ]]]]]]]]]
li = [1, [2, [3, [4, [5, [6, [7, [8, [9, ]]]]]]]]]
def func(l):
for i in l:
if type(i) is list:
func(i)
else:
print(i) func(li)
代码实现
七、二分法查找
假设要在电话簿中找一个名字以K打头的人,可以从头开始翻页,直到进入以K打头的部分。但你很可能不这样做,而是从中间开始,因为你知道以K打头的名字在电话簿中间。这是一个查找问题,可以使用二分查找算法来解决。而算法就是一组完成任务的指令,是高效解决问题的一种思路。
假设我从1到100随便想一个数字,你的目标是以最少的次数猜到这个数字。你每次猜测后,我会说小了、大了或对了。假设你从1开始依次往上猜,每次加一个数,这样每次猜测都只能排除一个数字。如果我想的数字是99,你得猜99次才能猜到!这是简单查找,更准确的说法是傻找,这显然是一种糟糕的猜数法。
假设你从50开始猜,如果小了,排除了一半的数字!至此,你知道1~50都小了。接下来,你猜75,大了,那余下的数字又排除了一半!!使用二分查找时,你猜测的是中间的数字,从而每次都将余下的数字排除一半。接下来,你猜63(50和75中间的数字),大了,猜57,对了,这就是二分查找。不管我心里想的是哪个数字,你在7次之内都能猜到,因为每次猜测都将排除很多数字!

使用二分查找时,每次都排除一半的数字
使用二分法,数字列表是有序的
# 从小到大排列的数字列表
nums = [1, 13, 15, 23, 27, 31, 33, 57, 73, 81, 93, 94, 97, 101]
def binary_search(find_num,nums):
if len(nums) == 0:
print('不存在')
return
mid_index = len(nums) // 2
if find_num > nums[mid_index]:
# 在右边
nums = nums[mid_index + 1:]
binary_search(find_num, nums)
elif find_num < nums[mid_index]:
# 在左边
nums = nums[:mid_index]
binary_search(find_num, nums)
else:
print('找到了') binary_search(97, nums)
代码实现
Learning-Python【14】:匿名函数与函数递归的更多相关文章
- python学习笔记:第14天 内置函数补充和递归
一.匿名函数 匿名函数主要是为了解决一些简单需求而设计的一种函数,匿名函数的语法为: lambda 形参: 返回值 先来看一个例子: # 计算n的n次方 In[2]: lst = lambda n: ...
- python开发基础04-函数、递归、匿名函数、高阶函数、装饰器
匿名函数 lamba lambda x,y,z=1:x+y+z 匿名就是没有名字 def func(x,y,z=1): return x+y+z 匿名 lambda x,y,z=1:x+y+z #与函 ...
- Python第七天 函数 函数参数 函数里的变量 函数返回值 多类型传值 函数递归调用 匿名函数 内置函数
Python第七天 函数 函数参数 函数里的变量 函数返回值 多类型传值 函数递归调用 匿名函数 内置函数 目录 Pycharm使用技巧(转载) Python第一天 ...
- Python匿名函数/排序函数/过滤函数/映射函数/递归/二分法
一. lamda匿名函数 为了解决一些简单的需求而设计的一句话函数 # 计算n的n次方 def func(n): return n**n print(func(10)) f = lambda n: n ...
- 巨蟒python全栈开发-第14天 内置函数2 递归 二分查找
一.今日内容总览 1.内置函数补充 repr() 显示出字符串的官方表示形式 chr() arscii码中的字,转换成位置 ord() arscii码中的位置,转换成字2.递归 自己调用自己 两个口: ...
- Learning Python 012 函数式编程 2 返回函数 匿名函数 装饰器 偏函数
Python 函数式编程 2 返回函数 返回函数的意思就是:函数作为返回值.(高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回.) 举个例子:实现一个可变参数的求和. 正常的函数: de ...
- python函数:匿名函数、函数递归与二分法、面向过程编程
今天主要讲三大部分内容: 一.匿名函数二.函数递归与二分法三.面向过程编程 一.匿名函数: """ 1. 什么时匿名函数 def定义的是有名函数:特点是可以通过名字重复调 ...
- python之路day14--嵌套函数、匿名函数、高阶函数。函数的递归
嵌套函数 函数里不仅可以写代码,还可以嵌套函数 name = "小猿圈" def change(): name = "小猿圈,自学编程" def chang ...
- 11、Python函数基础(定义函数、函数参数、匿名函数)
函数先定义函数,后调用 一.定义函数: 1.简单的规则: 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 (). 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数. 函 ...
随机推荐
- 阿里云 ECS 迁移到七牛 QVM 记
操作 下载脚本 curl -O http://p70nwjoid.bkt.clouddn.com/go2qvm_client1.5_linux_x86_64.zip 解压填写配置 unzip go2q ...
- day18 十八、random、shutil、shevle、logging
一.random 模块:随机数 1. import random # .[,]整数 random randint(,) print(random.randint(, )) # 随机产生[,]中的一个数 ...
- linux crontab详解 php开发相关
vi vi /etc/crontab 注意不是这么直接干的! 下面是内容 SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root ...
- 项目实战:负载均衡集群企业级应用实战—LVS详解
目录 一.负载均衡集群介绍 二.lvs 的介绍 三.LVS负载均衡四种工作模式 1.NAT工作模式 2.DR工作模式 3.TUN工作模式 4.full-nat 工作模式 5.四者的区别 四.LVS i ...
- lambda用法
1.lambda为匿名函数,即不用起函数名2.如果函数使用次数很少并且很简洁,一般可以考虑用lambda函数3.lambda可以简化代码的可读性4.lambda不能使用if for等复杂的语法 示例一 ...
- @ConfigurationProperties + @EnableConfigurationProperties
1.ConfigurationProperties 在类上通过@ConfigurationProperties注解声明当前类为属性读取类. 举例: @ConfigurationProperties(p ...
- docker小结
docker命令汇总 https://www.cnblogs.com/andy9468/p/10762742.html docker概述 https://www.cnblogs.com/andy946 ...
- LDO选型注意事项
以前选择LDO时因为要求不高,只会考虑输入电压Vin,输出电压Vout以及最大输出电流Ioutmax,其他的参数基本不做考虑,后来发现,考虑的太不周到,现在做个笔记记录自己的一些心得. 1.考虑最大输 ...
- js $的扩展写法
(function ($, w) { $.extend({ getRenderList: function (keyword, pageIndex, pageSize, renderEle, re ...
- iPhone屏蔽IOS更新、iPhone系统更新的提示(免越狱,有效期更新至2021年)
iPhone屏蔽IOS更新.iPhone系统更新的提示(免越狱,有效期更新至2021年) 1.在Safari浏览器中粘贴如下链接,按提示打开链接. 输入http://apt.dataage.pub 2 ...