高阶函数

1、什么是高阶函数

  • 在Python中,变量可以指向函数

  • 函数名也是变量

  • 既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。  

map()高阶函数

map(function, iterable, ...)

 功能

  • 将第一个参数 function 依次作用在参数可迭代对象中的每一个元素上,返回包含每次 function 函数返回值的新迭代器

 参数

  • function -- 函数,有两个参数
  • iterable  -- 一个或多个可迭代对象(如:序列)

 返回值

  • Python 3.x 返回迭代器
  1. def f(x):
  2. return x*x
  3. r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
  4. print(list(r))
  5.  
  6. 运行结果:
  7. [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 -- 可选,初始参数

 返回值

  • 返回函数计算结果。
  1. from functools import reduce
  2. def add(x, y):
  3. return x + y
  4.  
  5. r = reduce(add, [1, 3, 5, 7, 9])
  6. print(r)
  7.  
  8. 运行结果:
  9. 25

filter()函数

filter(function, iterable)

 功能

  • 该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判,然后返回 True 或 False,最后将返回 True 的元素放到新迭代器对象中

 参数

  • function -- 判断函数
  • iterable -- 可迭代对象(如:序列)

 返回值

  • 返回一个迭代器对象
  1. def is_odd(n):
  2. return n % 2 == 1
  3.  
  4. tmplist = filter(is_odd, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
  5. newlist = list(tmplist)
  6. print(newlist)
  7.  
  8. 运行结果:
  9. [1, 3, 5, 7, 9]

sorted()函数

sorted(iterable, key=abs, reverse=False)

 功能

  • 对所有可迭代的对象进行排序操作

 参数

  • iterable -- 可迭代对象。
  • key -- key指定的函数将作用于可迭代对象上的每一个元素,并根据key函数返回的结果进行排序
  • reverse -- 排序规则,reverse = True 降序 , reverse = False 升序(默认)

 返回值

  • 返回重新排列的列表  
  1. print(sorted([36, 5, -12, 9, -21]))
  2. 运行结果:[-21, -12, 5, 9, 36]
  3.  
  4. print(sorted([36, 5, -12, 9, -21], key=abs))
  5. #abs(绝对值函数)此处也可使用 ~ 匿名函数
  6. 运行结果:[5, 9, -12, -21, 36]

返回函数

高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。

  1. def lazy_sum(*args):
  2. def sum():
  3. ax = 0
  4. for n in args:
  5. ax = ax + n
  6. return ax
  7. return sum #将定义的函数sum()作为结果值返回
  8.  
  9. f = lazy_sum(1, 3, 5, 7, 9)
  10. f()

闭包

闭包是“返回函数”的一个典型应用

闭包的定义: 在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用。这样就构成了一个闭包。

  1. #闭包函数的实例
  2. # outer是外部函数 a和b都是外函数的临时变量
  3. def outer( a ):
  4. b = 10
  5. def inner(): # inner是内函数
  6. print(a+b) #在内函数中 用到了外函数的临时变量
  7. return inner # 外函数的返回值是内函数的引用
  8.  
  9. if __name__ == '__main__':
  10. # 在这里我们调用外函数传入参数5
  11. #此时外函数两个临时变量 a是5 b是10 ,并创建了内函数,然后把内函数的引用返回存给了demo
  12. # 外函数结束的时候发现内部函数将会用到自己的临时变量,这两个临时变量就不会释放,会绑定给这个内部函数
  13. demo = outer(5)
  14. # 我们调用内部函数,看一看内部函数是不是能使用外部函数的临时变量
  15. # demo存了外函数的返回值,也就是inner函数的引用,这里相当于执行inner函数
  16. demo() #
  17.  
  18. demo2 = outer(7)
  19. demo2()#

匿名函数(lambda表达式)

匿名函数的另一个别称是“lambda表达式”

  • lambda表达式的语法: lambda argument_list: expression
  • 这里的argument_list是参数列表。它的结构与Python中函数(function)的参数列表是一样的。
  • 这里的expression是一个关于参数的表达式。表达式中出现的参数需要在argument_list中有定义,并且表达式只能是单行的。
  1. lambda x: x*x
  2. 这个lambda表达式实际等同于:
  3. def f(x):
  4. return x*x
  5.  
  6. >>> f = lambda x: x * x
  7. >>> f
  8. <function <lambda> at 0x101c6ef28>
  9. >>> f(5)
  10. 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)用递归的方式写出来就是:

  1. def fact(n):
  2. if n==1:
  3. return 1
  4. return n * fact(n - 1)
  1. 如果我们计算fact(5),可以根据函数定义看到计算过程如下:
  2.  
  3. ===> fact(5)
  4. ===> 5 * fact(4)
  5. ===> 5 * (4 * fact(3))
  6. ===> 5 * (4 * (3 * fact(2)))
  7. ===> 5 * (4 * (3 * (2 * fact(1))))
  8. ===> 5 * (4 * (3 * (2 * 1)))
  9. ===> 5 * (4 * (3 * 2))
  10. ===> 5 * (4 * 6)
  11. ===> 5 * 24
  12. ===> 120

递归函数的优点和缺点

  • 递归函数的优点是定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。

  • 缺点是过深的调用会导致栈溢出。

异常处理

1、python各种常见异常

  1. 1) Exception: 所有异常类型
  2. 2) AttributeError: 特性引用或赋值失败时引发
  3. 3) IOError: 试图打开不存在的文件时引发
  4. 4) IndexError: 在使用序列中不存在的索引时引发
  5. 5) KeyError: 在使用映射时不存在的键时引发
  6. 6) NameError: 在找不到变量名字时引发
  7. 7) SyntaxError: 代码有语法错误时引发
  8. 8) TypeError: 函数应用于错误类型的对象时引发
  9. 9) ValueError: 函数应用于正确类型的对象,但该对象使用不合适的值时引发
  10. 10) ZeroDivisionError: 在除操作时第二个参数为0时引发
  11.  
  12. Python中各种内建异常

2、几种常见捕获异常的方法

 1、捕获单个异常

  1. names = ['alex','jack']
  2. try:
  3. names[2]
  4. except IndexError as e:
  5. print("列表操作错误",e)
  6. # 运行结果: 列表操作错误 list index out of range
  7.  
  8. 捕获单个异常

 2、 多个except子句,捕获多个异常

  1. try:
  2. x = input("Enter the first number:")
  3. y = input("Enter the second number:")
  4. print(x/y)
  5. except ZeroDivisionError:
  6. print("The second number can't zero")
  7. except NameError:
  8. print('That was not a number....')
  9.  
  10. 多个except子句

 3、 一个except捕获多个异常

  说明:如果需要用一个块扑捉多个异常类型,那么可以将他们作为元组列出

  1. try:
  2. x = input("Enter the first number:")
  3. y = input("Enter the second number:")
  4. print(x/y)
  5. except (ZeroDivisionError, TypeError, NameError):
  6. print("your numbers were bogus...")
  7.  
  8. 一个except捕获多个异常

 4、 捕捉对象: except (NameError) as e

  1. try:
  2. x = input("Enter the first number:")
  3. y = input("Enter the second number:")
  4. print(x/y)
  5. except (ZeroDivisionError, TypeError, NameError) as e:
  6. print(e)
  7.  
  8. 捕捉对象: except (NameError) as e
  1. import traceback
  2.  
  3. try:
  4. name = int('df11')
  5. except Exception as e:
  6. print(traceback.format_exc())
  7.  
  8. # Traceback (most recent call last):
  9. # File "C:/Users/tom/Desktop/cmdb_cli_ser/AutoClient/test01.py", line 4, in <module>
  10. # name = int('df11')
  11. # ValueError: invalid literal for int() with base 10: 'df11'
  12.  
  13. traceback.format_exc()获取详细异常信息

 5、真正的全捕捉: except

  1. try:
  2. x = input("Enter the first number:")
  3. y = input("Enter the second number:")
  4. print(x/y)
  5. except:
  6. print('something wrong happened')
  7.  
  8. 正真的全捕捉: except

 6、异常使用结构

  1. try:
  2. # 主代码块
  3. pass
  4. except KeyError as e:
  5. # 异常时,执行该块
  6. pass
  7. else:
  8. # 主代码块正常执行完,执行该块
  9. pass
  10. finally:
  11. # 无论异常与否,最终执行该块
  12. pass
  13.  
  14. 异常使用结构

 7、主动触发异常

  1. try:
  2. raise Exception('错误了。。。')
  3. except Exception as e:
  4. print(e)
  5. # 运行结果: 错误了。。。

 8、自定义异常

  1. class WupeiqiException(Exception):
  2. def __init__(self, msg):
  3. self.message = msg
  4. def __str__(self):
  5. return self.message #最终打印的结果就是这里return返回的值
  6.  
  7. try:
  8. raise WupeiqiException('我的异常') #这里的字符串就会传入到class类的msg中
  9. except WupeiqiException as e:
  10. print(e)
  11. # 运行结果: 我的异常
  12.  
  13. 自定义异常

 9、断言

  作用:Python的assert是用来检查一个条件,如果它为真,就不做任何事。如果它为假,则会抛出AssertError并且包含错误信息

  1. n = 1
  2. assert type(n) is int
  3. print('aaaa')
  4. # 1. Assert后的断言结果成立时才会执行:print('aaaa')
  5. # 2. Assert后的断言结果不成立时会引发AssertError并退出程序

python高阶函数&异常处理的更多相关文章

  1. 用一个简单的例子来理解python高阶函数

    ============================ 用一个简单的例子来理解python高阶函数 ============================ 最近在用mailx发送邮件, 写法大致如 ...

  2. Python高阶函数_map/reduce/filter函数

    本篇将开始介绍python高阶函数map/reduce/filter的用法,更多内容请参考:Python学习指南 map/reduce Python内建了map()和reduce()函数. 如果你读过 ...

  3. Python高阶函数及函数柯里化

    1 Python高阶函数 接收函数为参数,或者把函数作为结果返回的函数为高阶函数. 1.1 自定义sort函数 要求:仿照内建函数sorted,自行实现一个sort函数.内建函数sorted函数是返回 ...

  4. python——高阶函数:高阶函数

    python高阶函数 00初识高阶函数 一等公民 函数在python中是一等公民(First-Class Object),同样和变量一样,函数也是对象,只不过是可调用的对象,所以函数也可以作为一个普通 ...

  5. python高阶函数的使用

    目录 python高阶函数的使用 1.map 2.reduce 3.filter 4.sorted 5.小结 python高阶函数的使用 1.map Python内建了map()函数,map()函数接 ...

  6. python 高阶函数之filter

    前文说到python高阶函数之map,相信大家对python中的高阶函数有所了解,此次继续分享python中的另一个高阶函数filter. 先看一下filter() 函数签名 >>> ...

  7. Python高阶函数

    在Python中,函数名也是一个变量,可以进行赋值  高阶函数是至少满足下列一个条件的函数: 接受一个或多个函数作为输入 输出一个函数 函数名也可以作为函数参数,还可以作为函数返回值 def f(n) ...

  8. Python高阶函数之 - 装饰器

    高阶函数:  1. 函数名可以作为参数传入     2. 函数名可以作为返回值. python装饰器是用于拓展原来函数功能的一种函数 , 这个函数的特殊之处在于它的返回值也是一个函数 , 使用pyth ...

  9. Python高阶函数和匿名函数

    高阶函数:就是把函数当成参数传递的一种函数:例如 注解: 1.调用add函数,分别执行abs(-8)和abs(11),分别计算出他们的值 2.最后在做和运算 map()函数 python内置的一个高阶 ...

随机推荐

  1. linux服务器项目部署

    重启服务器 :reboot C:\Users\maple>mysql -u root -pEnter password: ******mysql> use test;Database ch ...

  2. if分支判断

    # 控制语句 分支 循环语句 # 判断语句 if ..elif..else # if 条件语句(比较 逻辑 成员运算) # 空数据 == False # 非空数据 == True age = 20 i ...

  3. ES7中的async和await

    ES7中的async和await 在上一章中,使用Promise将原本的回调方式转换为链式操作,这就将一个个异步执行的操作串在一条同步线上了.下一次的操作必须等待当前操作的结束. 使用Promise的 ...

  4. 前沿理论、反思创新、产学结合——你不能错过的WSDM 2016大会

    第九届ACM网络搜索与数据挖掘国际会议(ACM International Conference on Web Search and Data Mining,简称WSDM)已于上周(2月22日-25日 ...

  5. 前端开发个人小结 · Retrospection的博客

    序 2018年转眼来到了最后一个月,算下来我进入前端之门也有一年了,虽然下半年由于忙于筹备毕业论文的相关事项,前端这一块有所放下,但是想想还是给自己这一年的学习做一个总结. 现代化软件开发确实是一个复 ...

  6. HINOC2.0标准介绍(1):概述

    本文首发于'瀚诺观察'微信公众号 摘要: 2016年3月18日,国家新闻出版广电总局批准发布了行业标准GY/T 297-2016<NGB宽带接入系统HINOC2.0物理层和媒体接入控制层技术规范 ...

  7. Microsoft Translator发布粤语文本翻译

    今天,Microsoft Translator发布了粤语的文本翻译,新的语言增加将继续丰富微软翻译产品的生态系统*,让更多组织和个人能够快速且高效地实现翻译应用.在中国,大有约5500万人使用粤语(语 ...

  8. C++走向远洋——57(项目二2、动物这样叫、抽象类)

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...

  9. cooking和session

    ## Cookie ## # 基本概念: >> 用于保存一次会话中的记录,存放在客户端(浏览器); |-- "一次会话" |-- 当客户端打开一个界面时 被称作一次会话 ...

  10. Windows激活服务器搭建

    1.下载服务端的安装包,下载地址: https://github.com/Wind4/vlmcsd/releases 注意,下载编译好的包省时间,名称为:binaries.tar.gz 或者直接下载我 ...