python高阶函数&异常处理
高阶函数
1、什么是高阶函数
在Python中,变量可以指向函数
函数名也是变量
既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。
map()高阶函数
map(function, iterable, ...)
功能
- 将第一个参数 function 依次作用在参数可迭代对象中的每一个元素上,返回包含每次 function 函数返回值的新迭代器
参数
- function -- 函数,有两个参数
- iterable -- 一个或多个可迭代对象(如:序列)
返回值
- Python 3.x 返回迭代器
def f(x):
return x*x
r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
print(list(r)) 运行结果:
[1, 4, 9, 16, 25, 36, 49, 64, 81]
reduce()高阶函数
reduce(function, iterable[, initializer])
功能
- 函数将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 function 函数运算,最后得到一个结果。
其效果类似:reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
参数
- function -- 函数,有两个参数
- iterable -- 可迭代对象
- initializer -- 可选,初始参数
返回值
- 返回函数计算结果。
from functools import reduce
def add(x, y):
return x + y r = reduce(add, [1, 3, 5, 7, 9])
print(r) 运行结果:
25
filter()函数
filter(function, iterable)
功能
- 该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判,然后返回 True 或 False,最后将返回 True 的元素放到新迭代器对象中
参数
- function -- 判断函数
- iterable -- 可迭代对象(如:序列)
返回值
- 返回一个迭代器对象
def is_odd(n):
return n % 2 == 1 tmplist = filter(is_odd, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
newlist = list(tmplist)
print(newlist) 运行结果:
[1, 3, 5, 7, 9]
sorted()函数
sorted(iterable, key=abs, reverse=False)
功能
- 对所有可迭代的对象进行排序操作
参数
- iterable -- 可迭代对象。
- key -- key指定的函数将作用于可迭代对象上的每一个元素,并根据key函数返回的结果进行排序
- reverse -- 排序规则,reverse = True 降序 , reverse = False 升序(默认)
返回值
- 返回重新排列的列表
print(sorted([36, 5, -12, 9, -21]))
运行结果:[-21, -12, 5, 9, 36] print(sorted([36, 5, -12, 9, -21], key=abs))
#abs(绝对值函数)此处也可使用 ~ 匿名函数
运行结果:[5, 9, -12, -21, 36]
返回函数
高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。
def lazy_sum(*args):
def sum():
ax = 0
for n in args:
ax = ax + n
return ax
return sum #将定义的函数sum()作为结果值返回 f = lazy_sum(1, 3, 5, 7, 9)
f()
闭包
闭包是“返回函数”的一个典型应用
闭包的定义: 在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用。这样就构成了一个闭包。
#闭包函数的实例
# outer是外部函数 a和b都是外函数的临时变量
def outer( a ):
b = 10
def inner(): # inner是内函数
print(a+b) #在内函数中 用到了外函数的临时变量
return inner # 外函数的返回值是内函数的引用 if __name__ == '__main__':
# 在这里我们调用外函数传入参数5
#此时外函数两个临时变量 a是5 b是10 ,并创建了内函数,然后把内函数的引用返回存给了demo
# 外函数结束的时候发现内部函数将会用到自己的临时变量,这两个临时变量就不会释放,会绑定给这个内部函数
demo = outer(5)
# 我们调用内部函数,看一看内部函数是不是能使用外部函数的临时变量
# demo存了外函数的返回值,也就是inner函数的引用,这里相当于执行inner函数
demo() # demo2 = outer(7)
demo2()#
匿名函数(lambda表达式)
匿名函数的另一个别称是“lambda表达式”
- lambda表达式的语法: lambda argument_list: expression
- 这里的argument_list是参数列表。它的结构与Python中函数(function)的参数列表是一样的。
- 这里的expression是一个关于参数的表达式。表达式中出现的参数需要在argument_list中有定义,并且表达式只能是单行的。
lambda x: x*x
这个lambda表达式实际等同于:
def f(x):
return x*x >>> f = lambda x: x * x
>>> f
<function <lambda> at 0x101c6ef28>
>>> f(5)
25
递归函数
在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。
举个例子,我们来计算阶乘n! = 1 x 2 x 3 x ... x n, 用函数fact(n)表示
可以看出: fact(n) = n! = 1 x 2 x 3 x ... x (n-1) x n = (n-1)! x n = fact(n-1) x n
所以,fact(n)可以表示为n x fact(n-1),只有n=1时需要特殊处理。
于是,fact(n)用递归的方式写出来就是:
def fact(n):
if n==1:
return 1
return n * fact(n - 1)
如果我们计算fact(5),可以根据函数定义看到计算过程如下: ===> fact(5)
===> 5 * fact(4)
===> 5 * (4 * fact(3))
===> 5 * (4 * (3 * fact(2)))
===> 5 * (4 * (3 * (2 * fact(1))))
===> 5 * (4 * (3 * (2 * 1)))
===> 5 * (4 * (3 * 2))
===> 5 * (4 * 6)
===> 5 * 24
===> 120
递归函数的优点和缺点
递归函数的优点是定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。
缺点是过深的调用会导致栈溢出。
异常处理
1、python各种常见异常
1) Exception: 所有异常类型
2) AttributeError: 特性引用或赋值失败时引发
3) IOError: 试图打开不存在的文件时引发
4) IndexError: 在使用序列中不存在的索引时引发
5) KeyError: 在使用映射时不存在的键时引发
6) NameError: 在找不到变量名字时引发
7) SyntaxError: 代码有语法错误时引发
8) TypeError: 函数应用于错误类型的对象时引发
9) ValueError: 函数应用于正确类型的对象,但该对象使用不合适的值时引发
10) ZeroDivisionError: 在除操作时第二个参数为0时引发 Python中各种内建异常
2、几种常见捕获异常的方法
1、捕获单个异常
names = ['alex','jack']
try:
names[2]
except IndexError as e:
print("列表操作错误",e)
# 运行结果: 列表操作错误 list index out of range 捕获单个异常
2、 多个except子句,捕获多个异常
try:
x = input("Enter the first number:")
y = input("Enter the second number:")
print(x/y)
except ZeroDivisionError:
print("The second number can't zero")
except NameError:
print('That was not a number....') 多个except子句
3、 一个except捕获多个异常
说明:如果需要用一个块扑捉多个异常类型,那么可以将他们作为元组列出
try:
x = input("Enter the first number:")
y = input("Enter the second number:")
print(x/y)
except (ZeroDivisionError, TypeError, NameError):
print("your numbers were bogus...") 一个except捕获多个异常
4、 捕捉对象: except (NameError) as e
try:
x = input("Enter the first number:")
y = input("Enter the second number:")
print(x/y)
except (ZeroDivisionError, TypeError, NameError) as e:
print(e) 捕捉对象: except (NameError) as e
import traceback try:
name = int('df11')
except Exception as e:
print(traceback.format_exc()) # Traceback (most recent call last):
# File "C:/Users/tom/Desktop/cmdb_cli_ser/AutoClient/test01.py", line 4, in <module>
# name = int('df11')
# ValueError: invalid literal for int() with base 10: 'df11' traceback.format_exc()获取详细异常信息
5、真正的全捕捉: except
try:
x = input("Enter the first number:")
y = input("Enter the second number:")
print(x/y)
except:
print('something wrong happened') 正真的全捕捉: except
6、异常使用结构
try:
# 主代码块
pass
except KeyError as e:
# 异常时,执行该块
pass
else:
# 主代码块正常执行完,执行该块
pass
finally:
# 无论异常与否,最终执行该块
pass 异常使用结构
7、主动触发异常
try:
raise Exception('错误了。。。')
except Exception as e:
print(e)
# 运行结果: 错误了。。。
8、自定义异常
class WupeiqiException(Exception):
def __init__(self, msg):
self.message = msg
def __str__(self):
return self.message #最终打印的结果就是这里return返回的值 try:
raise WupeiqiException('我的异常') #这里的字符串就会传入到class类的msg中
except WupeiqiException as e:
print(e)
# 运行结果: 我的异常 自定义异常
9、断言
作用:Python的assert是用来检查一个条件,如果它为真,就不做任何事。如果它为假,则会抛出AssertError并且包含错误信息
n = 1
assert type(n) is int
print('aaaa')
# 1. Assert后的断言结果成立时才会执行:print('aaaa')
# 2. Assert后的断言结果不成立时会引发AssertError并退出程序
python高阶函数&异常处理的更多相关文章
- 用一个简单的例子来理解python高阶函数
============================ 用一个简单的例子来理解python高阶函数 ============================ 最近在用mailx发送邮件, 写法大致如 ...
- Python高阶函数_map/reduce/filter函数
本篇将开始介绍python高阶函数map/reduce/filter的用法,更多内容请参考:Python学习指南 map/reduce Python内建了map()和reduce()函数. 如果你读过 ...
- Python高阶函数及函数柯里化
1 Python高阶函数 接收函数为参数,或者把函数作为结果返回的函数为高阶函数. 1.1 自定义sort函数 要求:仿照内建函数sorted,自行实现一个sort函数.内建函数sorted函数是返回 ...
- python——高阶函数:高阶函数
python高阶函数 00初识高阶函数 一等公民 函数在python中是一等公民(First-Class Object),同样和变量一样,函数也是对象,只不过是可调用的对象,所以函数也可以作为一个普通 ...
- python高阶函数的使用
目录 python高阶函数的使用 1.map 2.reduce 3.filter 4.sorted 5.小结 python高阶函数的使用 1.map Python内建了map()函数,map()函数接 ...
- python 高阶函数之filter
前文说到python高阶函数之map,相信大家对python中的高阶函数有所了解,此次继续分享python中的另一个高阶函数filter. 先看一下filter() 函数签名 >>> ...
- Python高阶函数
在Python中,函数名也是一个变量,可以进行赋值 高阶函数是至少满足下列一个条件的函数: 接受一个或多个函数作为输入 输出一个函数 函数名也可以作为函数参数,还可以作为函数返回值 def f(n) ...
- Python高阶函数之 - 装饰器
高阶函数: 1. 函数名可以作为参数传入 2. 函数名可以作为返回值. python装饰器是用于拓展原来函数功能的一种函数 , 这个函数的特殊之处在于它的返回值也是一个函数 , 使用pyth ...
- Python高阶函数和匿名函数
高阶函数:就是把函数当成参数传递的一种函数:例如 注解: 1.调用add函数,分别执行abs(-8)和abs(11),分别计算出他们的值 2.最后在做和运算 map()函数 python内置的一个高阶 ...
随机推荐
- JAVA WEB期末项目第二阶段成果
我们做的系统是一个基于Java web与MySQL的食堂订餐系统 班级: 计科二班 小组成员:李鉴宣.袁超 1.开发环境 开发编辑器使用:Visual Studio Code 数据库使用:MySQL8 ...
- js如何把a标签里面的值传递到函数里面
----------------------a标签如何定 如何传参到函数---------------------- 1.<a></a>标签 如何传参到函数 <a cla ...
- Hive Functions
函数的分类 内置函数 操作符 复杂对象 UDF函数 数学函数 类型转换函数 日期函数 条件函数 UDTF函数 常用UDTF函数 explode posexplode inline stack json ...
- 不装逼地说,在 Google 到底能学到啥?
不装逼地说,在 Google 到底能学到啥? 2017-03-17 PHP开发者 (点击上方蓝字,快速关注我们) 本文转自公众号「半轻人」(ID:ban-qing-ren),伯乐在线/PHP开发者已获 ...
- Redis: userd_memory使用超出maxmemory
Redis:userd_memory使用超出maxmemory 一.问题现象 2018.12.30 19:26分,收到Redis实例内存使用告警“内存使用率299%>=80%”,检查实例info ...
- 视频描述(Video Captioning)近年重要论文总结
视频描述 顾名思义视频描述是计算机对视频生成一段描述,如图所示,这张图片选取了一段视频的两帧,针对它的描述是"A man is doing stunts on his bike", ...
- Zookeeper的使用场景和集群配置
Zookeeper的介绍 ZK在分布式系统的应用 Zookeeper搭建 集群角色介绍 ZK的常用命令 一.Zookeeper的介绍 官方:ZooKeeper是一个分布式的,开放源码的分布式应用程序协 ...
- 常见WAF绕过思路
WAF分类 0x01 云waf 在配置云waf时(通常是CDN包含的waf),DNS需要解析到CDN的ip上去,在请求uri时,数据包就会先经过云waf进行检测,如果通过再将数据包流给主机. 0x02 ...
- python如何在图片上添加文字(中文和英文)
Python在图片上添加文字的两种方法:OpenCV和PIL 一.OpenCV方法 1.安装cv2 pip install opencv-python 2.利用putText方法来实现在图片的指定位置 ...
- Go性能分析大杀器PPROF
这是什么 想要进行性能优化,Go本身自带的工具链就包含了性能分析工具,而且也非常棒,pprof就是Go性能分析的利器,它是Go语言自带的包,有如下两种: runtime/pprof:采集程序(非 Se ...