Python函数篇(二)之递归函数、匿名函数及高阶函数
1.全局变量和局部变量
一般定义在程序的最开始的变量称为函数变量,在子程序中定义的变量称为局部变量,可以简单的理解为,无缩进的为全局变量,有缩进的是局部变量,全局变量的作用域是整个程序,而局部变量的作用域是子程序内部,当程序运行时,首先会找程序内部有没有局部变量,如果有,则调用,如果没有,才会去调用全局变量。如下:
name="czp" #全局变量
def func():
name="czp1" #局部变量
print(name)
func()
运行结果:
czp1 调用func()函数,程序会先在函数内部找有没有name这个变量,如果有,就会调用该name的值,而如果没有定义局部变量的话,函数会去找全局name。
可以通过global关键字,通过局部变量修改全局变量,如下所示:
name="czp" #定义全局变量
def func():
global name 在函数内部,通过global关键字,通过局部变量修改全局变量的值
name="czp1"
print(name)
func() 打印局部变量中name的值
print(name) 打印全局变量中name的值
运行结果:
czp1
czp1 在运行结果中可以明显看出,通过global,在定义局部变量的同时,也修改了全局变量的值
global与nonlocal的区别:
python引用变量的顺序: 当前作用域局部变量->外层作用域变量->当前模块中的全局变量->python内置变量
global关键字用来在函数或局部作用域中使用全局变量,并通过glabal关键字在局部作用域中修改全局变量(一般不推荐这么做)
nonlocal关键字用来在函数或局部作用域使用外层(非全局)变量。
2.递归函数
在一个函数的内部,可以调用其他的函数,如果某一个函数在内部调用的函数仍然是自身,这个函数就可以称为递归函数。
def calc(n):
print(n)
if int(n/2)==0:
return n
return calc(int(n/2)) 在calc函数中,反复调用calc自身,这样的函数就是递归函数
calc(10)
运行结果:
10
5
2
1
注意:在递归函数中,并不是可以让自身永远的循环下去,递归函数中必须定义一个明确的结束条件,每进行更深一次的递归,解决问题的规模必须要较上一层有所减少,
递归函数常用来进行二分查找。。
3.匿名函数
匿名函数其实就是不需要指定显示的函数。用lambda关键字定义,通常我们定义一个函数用这种形式:
def calc(x):
return x+1
print(calc(2))
运行结果:
3
而上段代码 用匿名函数使用的话,就可以使用如下的方式,通过lambda关键字,传入一个形参x,用冒号隔开,后面加入return的值。
res=lambda x:x+1 print(res(2)) 运行结果: 3
匿名函数单独这么用意义不大,但是和其他函数一起用的时候,功能就显现的很明显了。如下面的例子
res=map(lambda x:x**2,[2,4,6,])
for i in res:
print(i)
运行结果:
4
16
36
我会在接下来写内置方法的时候具体的展示出使用匿名函数的好处。
4.高阶函数
高阶函数的特点如下:1)函数接收的参数是一个函数 ;2)函数的返回值是一个函数
将函数作为参数传给另一个函数
def foo(n): print(n) def bar(name): print("my name is %s"%name) print(foo(bar("尼古拉斯赵四"))) 运行结果: my name is 尼古拉斯赵四 None None 返回两个None,因为在foo()和bar()函数中我没有定义retturn。默认返回None
将函数作为另一个函数的返回值
def bar(): print("from bar") def foo(): print("from foo") return bar foo()() 运行结果: from foo from bar
4.内置函数
首先我先介绍3个比较重要,也是比较常用的内置函数,map;reduce,filter3个内置函数
1.map:
将函数作用于seq中的每一个元素,并将所有的调用的结果作为一个list返回。
模拟一下这个需求:有一个列表[1,2,3,4],我要让列表中的每一个元素自增1,然后打印出来,这个程序可以这样写:
name=[1,2,3,4]
res=[] 定义一个空列表,用来接收自增一后的值
def calc(array):
for i in array: 使用for循环,遍历传入列表中的每一个元素
res.append(i+1)
return res
print(calc(name))
运行结果:
[2, 3, 4, 5]
那如果 我想要的需求是让列表自减1,自乘呢,难道要把这段代码重复写一段,只是改一句res.append(i-1),或者更高级一点,我们在定义一个函数:
def increase(x):
return x-1 定义一个自减1的函数
name=[1,2,3,4]
res=[]
def calc(func,array): 在这里定义两个形参,一个用来传入函数increase,一个用来传入列表name
for i in array:
res.append(increase(i))
return res
print(calc(increase,name))
运行结果:
[0, 1, 2, 3]
更高级一点呢?我们用map+上面提到的匿名函数,可以很好的完成这样的需求:
name=[1,2,3,4]
print(list(map(lambda x:x+1,name)))
运行结果:
[2,3,4,5]
ok,上面写了那么多,两行代码搞定。
2.reduce:
reduce()函数接收的参数和 map()类似,一个函数 f,一个list,但行为和 map()不同,reduce()传入的函数 f 必须接收两个参数,reduce()对list的每个元素反复调用函数f,并返回最终结果值。可以简单的理解为,map接受一个列表,返回的仍然是一个列表,而reduce会进行计算,返回一个值
from functools import reduce 必须导入reduce方法 name=[1,2,3,4] print((reduce(lambda x,y:x+y,name))) 函数必须传入两个参数,然后传入list。 运行结果: 10
reduce还有一个默认参数 ,就是可以在list后再传入一个初始值。
def reduce(function, sequence, initial=None) 这个初始值默认为None
from functools import reduce name=[1,2,3,4] print((reduce(lambda x,y:x+y,name,5))) 还是上面的例子,我在最后加了初始值5(默认是none) 运行结果: 15
3.filter
filter读入iterable所有的项,判断这些项对function是否为真,返回一个包含所有为真的项的迭代器。如果function是None,返回非空的项。
name=["czp","cc","zp1"]
print(list(filter(lambda n:n.endswith("c"),name))) 通过匿名函数判断条件,返回值为真,就会打印成列表的形式
运行结果:
['cc']
在下一篇文章中,我会介绍其他的常用内置函数
Python函数篇(二)之递归函数、匿名函数及高阶函数的更多相关文章
- Python学习札记(二十) 函数式编程1 介绍 高阶函数介绍
参考: 函数式编程 高阶函数 Note A.函数式编程(Functional Programming)介绍 1.函数是Python内建支持的一种封装,我们通过一层一层的函数调用把复杂任务分解成简单的任 ...
- 函数和常用模块【day04】:高阶函数(七)
本节内容 1.介绍 2.具体实用 3.eval()函数 一.介绍 高阶函数:变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数. 二.具体实用 其实说白了,高阶函数功能就 ...
- Python学习笔记【第六篇】:迭代器、生成器、高阶函数、装饰器
迭代器 迭代器是访问集合元素的一种方式,迭代器从对象的第一个元素开始访问,知道所有元素被访问完成.迭代器只能往前访问,不能通过索引访问. 类型内部使用__iter__()方法转为迭代器,使用__nex ...
- python面试_总结01_概念和内置高阶函数
- 简答题 1.请谈谈Python中is 和 == 的区别(代码演示) is用于比较两个变量是否引用了同一个内存地址,is表示的是对象标识符(object identity),作用是用来检查对象的标识 ...
- Python学习笔记八:文件操作(续),文件编码与解码,函数,递归,函数式编程介绍,高阶函数
文件操作(续) 获得文件句柄位置,f.tell(),从0开始,按字符数计数 f.read(5),读取5个字符 返回文件句柄到某位置,f.seek(0) 文件在编辑过程中改变编码,f.detech() ...
- 【python】-- 递归函数、高阶函数、嵌套函数、匿名函数
递归函数 在函数内部,可以调用其他函数.但是在一个函数在内部调用自身,这个函数被称为递归函数 def calc(n): print(n) if int(n/2) == 0: #结束符 return n ...
- Python进阶:函数式编程(高阶函数,map,reduce,filter,sorted,返回函数,匿名函数,偏函数)...啊啊啊
函数式编程 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计 ...
- (转)Python进阶:函数式编程(高阶函数,map,reduce,filter,sorted,返回函数,匿名函数,偏函数)
原文:https://www.cnblogs.com/chenwolong/p/reduce.html 函数式编程 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数 ...
- Python的高阶函数小结
一. 高阶函数定义 简而言之,Python的高阶函数就是指一个函数作为参数传递给另外一个函数的用法. 举一个最简单的高阶函数来说明: >>> def add(x,y,f): retu ...
- Python之高阶函数如何理解?
我们先要了解一下什么是所谓的高阶函数: 看定义:什么是高阶函数? 高阶函数:我们知道一个函数可以作为参数传给另外一个函数,或者一个函数的返回值为另外一个函数(若返回值为该函数本身,则为递归),如果满足 ...
随机推荐
- (转)关于Tomcat的点点滴滴(体系架构、处理http请求的过程、安装和配置、目录结构、设置压缩和对中文文件名的支持、以及Catalina这个名字的由来……等)
转自:http://itfish.net/article/41668.html 总结Tomcat的体系架构.处理http请求的过程.安装和配置.目录结构.设置压缩和对中文文件名的支持.以及Cata ...
- Python3中urllib详细使用方法(header,代理,超时,认证,异常处理) 转
urllib是python的一个获取url(Uniform Resource Locators,统一资源定址器)了,我们可以利用它来抓取远程的数据进行保存哦,下面整理了一些关于urllib使用中的一些 ...
- Spring bean 生命周期验证
一.从源码注释看bean生命周期 从JDK源码上看,BeanFactory实现类需要支持Bean的完整生命周期,完整的初始化方法及其标准顺序(格式:接口 方法)为: 1.BeanNameAware s ...
- javascript 之异常处理try catch finally--05
语法结构 try catch finally是ECMAScript-262 第三版提供异常处理机制的标准,语法结构如下: try{ //可能会发生的错误代码 } catch(error){ //错误处 ...
- Appium python自动化测试系列之滑动函数封装实战(八)
8.1 什么是函数的封装 教科书上函数的封装太官方,我们这里暂且将函数的封装就是为了偷懒把一些有共性的功能或者一些经常用的功能以及模块放在一起,方便我们以后再其他地方调用.这个只是个人的理解所以大家懂 ...
- Linux进程管理与作业控制
进程和作业的关系:一个作业可以包含多个进程. 进程分类: 1. 交互进程:由一个shell启动的进程.交互进程既可以在前台运行,也可以在后台运行. 2. 批处理进程:这种进程和终端没有联系,是一个进程 ...
- Linux系列教程(八)——Linux常用命令之压缩和解压缩命令
前面一篇博客我们讲解了Linux帮助和用户管理命令,对于帮助命令,man 命令能获得命令和配置文件的帮助信息,help命令能获得shell内置命令的帮助信息.我们可以通过which来区分什么是shel ...
- 最新数据库排行,Oracle略显疲惫
9月份TOPDB Top Database Index排行榜出炉,TOPDB Top Database Index是根据数据库在谷歌上的搜索频率分析得出的,数据库被搜索的频率越大,表示数 9月份的TO ...
- Java8 函数式编程详解
Java8 函数式编程详解 Author:Dorae Date:2017年11月1日23:03:26 转载请注明出处 说起Java8,可能很多人都已经知道其最大的改进,就是引入了Lambda表达式与S ...
- 修改Servlet模板,让Servlet更清新
每次新建一个Servlet,都会有很多的代码跟注释,但是在实际开发中我们是用不到这些的,所以每次都得手动删除,非常麻烦,所以接下来讲一下如何让自己的Servlet看上去更清新: 首先找到你的Myecl ...