python之路day14--嵌套函数、匿名函数、高阶函数。函数的递归
嵌套函数
函数里不仅可以写代码,还可以嵌套函数
name = "小猿圈"
def change():
name = "小猿圈,自学编程"
def change2():
# global name 如果声明了这句,下面的name改的是最外层的全局变层
name = "小猿圈,自学编程不要钱" #这句注释掉的话,下面name打印的是哪个值?
print("第3层打印", name)
change2() # 调用内层函数
print("第2层打印", name)
change()
print("最外层打印", name)
输出
第3层打印 小猿圈,自学编程不要钱
第2层打印 小猿圈,自学编程
最外层打印 小猿圈
通过上面的例子,我们理解了,每个函数里的变量是互相独立的,变量的查找顺序也是从当前层依次往上层找。
问个哲学问题,这东西有什么用呢?哈,现在没用,不解释,长大后学了装饰器你就知道有啥用了。
匿名函数
匿名函数就是不需要显式的指定函数名
#这段代码
def calc(x,y):
return x**y
print(calc(2,5))
#换成匿名函数
calc = lambda x,y:x**y
print(calc(2,5))
你也许会说,用上这个东西没感觉有毛方便呀, 。。。。呵呵,如果是这么用,确实没毛线改进,不过匿名函数主要是和其它函数搭配使用的呢,如下
res = map(lambda x:x**2,[1,5,7,4,8])
for i in res:
print(i)
输出
1
25
49
16
64
高阶函数
变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。
def get_abs(n):
if n < 0 :
n = int(str(n).strip("-"))
return n
def add(x,y,f):
return f(x) + f(y)
res = add(3,-6,get_abs)
print(res)
只需满足以下任意一个条件,即是高阶函数
- 接受一个或多个函数作为输入
- return 返回另外一个函数
函数的递归
求100不断除以2直到商为0为止,打印每次除的商
用循环实现
n = 100
while n > 0:
n = int(n/2)
print(n)
输出:
50
25
12
6
3
1
0
如果用函数,如何实现呢?
def calc(n):
n = int(n/2)
print(n)
if n > 0:
calc(n) #调用自己
calc(100)
在函数内部,可以调用其他函数。如果一个函数在内部调用自已本身,这个函数就叫做递归函数。上面我们写的这个代码就是递归
递归的执行过程
def calc(n):
n = int(n/2)
print(n)
if n > 0:
calc(n)
print(n)
calc(10)
输出:
5
2
1
0
0
1
2
5
为什么输出是这样呢?
如上图所示,函数在每进入下一层的时候,当前层的函数并未结束,它必须等它调用的下一层函数执行结束返回后才能继续往下走。 所以最下面的那句print(n)会等最里层的函数执行时才会执行,然后不断往外退层,所以会出现0、1、2、5的效果
递归特性:
- 必须有一个明确的结束条件
- 每次进入更深一层递归时,问题规模相比上次递归都应有所减少
- 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)
递归在特定场景下还是挺有用的,以后学的一些算法就得用到递归,比如堆排、快排等,现在看还是有些复杂的,以后再讲。
练习题
用递归实现2分查找的算法,以从列表 a = [1,3,4,6,7,8,9,11,15,17,19,21,22,25,29,33,38,69,107] 查找指定的值。
python之路day14--嵌套函数、匿名函数、高阶函数。函数的递归的更多相关文章
- Python之路,Day14 - It's time for Django
Python之路,Day14 - It's time for Django 本节内容 Django流程介绍 Django url Django view Django models Django ...
- Python 进程线程协程 GIL 闭包 与高阶函数(五)
Python 进程线程协程 GIL 闭包 与高阶函数(五) 1 GIL线程全局锁 线程全局锁(Global Interpreter Lock),即Python为了保证线程安全而采取的独立线程运行的 ...
- Python实用笔记 (12)函数式编程——高阶函数
函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数! Python对函数式编程提供部分支持.由于Python允许使用变量,因此,Python不是纯函数式编程语言. 变量 ...
- 『无为则无心』Python函数 — 33、高阶函数
目录 1.高阶函数的定义 2.体验高阶函数 3.内置高阶函数 (1)map()函数 (2)reduce()函数 (3)filter()函数 1.高阶函数的定义 把函数作为参数传入(把一个函数作为另外一 ...
- Kotlin的高阶函数和常用高阶函数
Kotlin的高阶函数和常用高阶函数 文章来源:企鹅号 - Android先生 高阶函数的定义 将函数当做参数或者是返回值的函数 什么是高阶函数 可以看看我们常用的 函数: 首先我们可以知道, 是 的 ...
- Python 基础之匿名函数 迭代器和高阶函数
一.匿名函数 lambda表达式 用一句话来表达只有返回值的函数,叫匿名函数特点:简洁方便语法:lambda 参数: 返回值 1.不带有参数的lambda表达式 def func(): retu ...
- Python之路第三天,基础(3)-set,函数,内置函数,文件,三元运算,lambda
set集合 集合是一个无序的,不重复的元素集合. 集合的创建: name_set = {'tom','jerry','alex','rose'} 或 name_set = set(['tom','je ...
- python 把函数作为参数 ---高阶函数
把函数作为参数 在2.1小节中,我们讲了高阶函数的概念,并编写了一个简单的高阶函数: def add(x, y, f): return f(x) + f(y) 如果传入abs作为参数f的值: add( ...
- 《前端之路》之 JavaScript 高级技巧、高阶函数(一)
目录 一.高级函数 1-1 安全的类型检测 1-2 作用域安全的构造函数 1-3 惰性载入函数 1-4 函数绑定 1-5 函数柯里化 1-6 反函数柯里化 一.高级函数 1-1 安全的类型检测 想到类 ...
- 函数高阶(函数,改变函数this指向,高阶函数,闭包,递归)
一.函数的定义方式 1.函数声明方式 function 关键字(命名函数) 2.函数表达式(匿名函数) 3.new Function( ) var fn = new Function(‘参数1 ...
随机推荐
- STM32 PWM注意事项
频率: f = 时钟周期 / Prescaler / Period: 占空比 = ( Pulse / Period )* 100 %: 需要注意的是,Pulse 不能大于 Period
- java:Oracle(Jdbc的封装)和HTML(登录,注册,个人信息界面)
1.Oracle Jdbc的封装: public class TestJdbc { // 把jdbc需要的属性,全部私有化 private static final String DRIVER = & ...
- hibernate 事务处理
Hibernate的事务处理:事务:* 事务就是逻辑上的一组操作,要么全都成功,要么全都失败!!! 事务特性:* 原子性:事务一组操作不可分割.* 一致性:事务的执行前后,数据完整性要保持一致.* 隔 ...
- CTF—WEB—sql注入之无过滤有回显最简单注入
sql注入基础原理 一.Sql注入简介 Sql 注入攻击是通过将恶意的 Sql 查询或添加语句插入到应用的输入参数中,再在后台 Sql 服务器上解析执行进行的攻击,它目前黑客对数据库进行攻击的最常用手 ...
- 如何解决idea本身的乱码以及解决代码中出现的乱码?
1:解决idea中控制台的乱码现象(3中方法): 第一种: 如图需要找到idea的安装路径: idea\IntelliJ IDEA 2018.3.2\bin 在这个路径下面有一个文件叫:idea64. ...
- squid的三种模式
一.squid代理服务器概述: 概述:Squid Cache(简称为Squid)是http代理服务器软件.Squid用途广泛,可以作为缓存服务器也可以作为缓存代理服务器,代理用户向web服务器请求数据 ...
- KVM虚拟机管理(2)
一.virt-manager创建虚机 命令行需要下载下面的组件: CentOS7: 命令行界面升级为图形化界面 yum groupinstall "X Window System" ...
- 浅谈python中字典append 到list 后值的改变问题
看一个例子 ? 1 2 3 4 d={'test':1} d_test=d d_test['test']=2 print d 如果你在命令行实践的话,会发现你改动的是d_test ,但是d 也跟着改变 ...
- http 中指定head中Content-Encoding属性为gzip 转换过程中的一些问题
项目环境: 对接的服务放在微服务中 提供接口给应用层调用 ,微服务放需要 接受参数 并且转换成压缩格式给 第三方服务 本来以为需要自己压缩,httpclint 中已经封装好了GzipCompressi ...
- spring boot-15.缓存
为了减轻数据库压力和提高访问速度,从spring3.1开始映入了基于注解的缓存机制. 1.Java Caching定义了5个核心接口,分别是CachingProvider, CacheManager, ...