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 关键词开头,后接函数标识符名称和圆括号 (). 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数. 函 ...
随机推荐
- Mysql 索引迁移策略
Mysql 索引迁移策略 近日在核查项目中的一些慢sql时发现一个很鸡仔儿的问题,本地开发库表中索引跟生产上差距很大,又因为生产库登录各种麻烦,需要各种验证码,那么多的慢sql分给好些个人,不可能让大 ...
- input 设置 width:100% 和padding后宽度超出父节点
input 设置 width:100% 和padding后宽度超出父节点 添加如下css即可: box-sizing: border-box; -webkit-box-sizing: border-b ...
- php 获取IP地址 并获取坐标lat lng 并获取到所在地区
函数方法:ps:只能放在服务器上起效果,放在本地是无法起效果的 /* **根据ip获取坐标 ***/ function get_zuobiao(){ $user_IP = ($_SERVER[&quo ...
- 关于0x3f3f3f3f
发现有人把无穷大设成0x3f3f3f3f,好像还真不是随便设的. 0x3f3f3f3f比10^9大一点,比一般数据范围大: 乘2之后比2147483467小,满足正无穷加正无穷还是正无穷: 每个字节都 ...
- js 第二课
=赋值 ==比较 ===绝对比较 &&且 || 或 !取反 a?1:0 a=ture a?1:0 function LeyBc() { var a={d:11,b:22,c:&quo ...
- 格式化输出&初始编码&运算符
一:格式化输出 % %d %s %为占位符 S替换的内容的类型为字符型 d替换的内容为整型 若在格式化输出的时候需要正常用到% 则表示时用两个%%表示 如: name = input( ...
- Flask项目示例目录
Flask不同于Django,Django在创建程序时自动得到必要的目录文件,而Flask则只有一个空文件夹,所以关于Flask项目的目录我们需要自行配置. 首先利用pycharm创建一个项目,在根目 ...
- 004-mac下Java6与Java8 安装
一.Java6安装 官方下载下载地址:http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-down ...
- 2018年工作终总结&规划
收获满满的2018 收获总结: 1. 换了家有地区牌照的公司,薪酬涨了那么一点点,但是工作压力.强度下降不少,这样有更多时间来学习新知识. 2. 跟同事一起接了维护后台管理系统的私活,每个月多了一点点 ...
- Struts2重要知识点总结
一.interceptor拦截器的使用 第一种情况(指定action使用该拦截器):struts.xml文件的配置: <interceptors> <interceptor name ...