python【进阶】5.一等函数(注销)

在 Python 中,函数是一等对象。编程语言理论家把“一等对象”定义为满足下述条件的程
序实体:

  • 在运行时创建
  • 能赋值给变量或数据结构中的元素
  • 能作为参数传给函数
  • 能作为函数的返回结果

在 Python 中,所有函数都是一等对象。

5.1 把函数视作对象

>>> def d(n):
...   '''return n!'''
...   return 1 if n<2 else n*d(n-1)
... 
>>> d(42)
1405006117752879898543142606244511569936384000000000
>>> d.__doc__
'return n!'
>>> 
# __doc__ 属性用于生成对象的帮助文本。

map 函数返回一个可迭代对象,里面的元素是把第一个参数(一个函数)应用到第二个参数(一个可迭代对象,这
里是 range(11))中各个元素上得到的结果。

>>> list(map(f,range(11)))
[1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800]

有了一等函数,就可以使用函数式风格编程。函数式编程的特点之一是使用高阶函数。

5.2 高阶函数

接受函数为参数,或者把函数作为结果返回的函数是高阶函数(higher-orderfunction)。map 函数就是一例此外,内置函数 sorted 也是:可选的key 参数用于提供一个函数,它会应用到各个元素上进行排序。

示例 5-3:根据单词长度给一个列表排序

>>> fruits = ['strawberry', 'fig', 'apple', 'cherry', 'raspberry', 'banana']
>>> sorted(fruits, key=len)
['fig', 'apple', 'cherry', 'banana', 'raspberry', 'strawberry']

示例 5-4:根据反向拼写给一个单词列表排序

>>> def reverse(word):
...
return word[::-1]
>>> reverse('testing')
'gnitset'
>>> sorted(fruits, key=reverse)
['banana', 'apple', 'fig', 'raspberry', 'strawberry', 'cherry']
>>>

map、filter和reduce的现代替代品

函数式语言通常会提供 map、filter 和 reduce 三个高阶函数(有时使用不同的名
称)。在 Python 3 中,map 和 filter 还是内置函数,但是由于引入了列表推导和生成器表达式,它们变得没那么重要了。
列表推导或生成器表达式具有 map 和 filter 两个函数的功能,而且更易于阅读,如示例 5-5 所示。

示例 5-5:计算阶乘列表:map 和 filter 与列表推导比较

>>> list(map(f,range(11)))
[1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800]
>>> list(map(f,range(6)))
[1, 1, 2, 6, 24, 120]
>>> [f(n) for n in range(6)]
[1, 1, 2, 6, 24, 120]
>>> list(map(f,filter(lambda n: n%2,range(6))))
[1, 6, 120]
  • 使用列表推导做相同的工作,换掉 map 和 filter,并避免了使用 lambda 表达式。

在 Python 3 中,map 和 filter 返回生成器(一种迭代器),因此现在它们的直接替代品
是生成器表达式(在 Python 2 中,这两个函数返回列表,因此最接近的替代品是列表推导.

示例 5-6
使用 reduce 和 sum 计算 0~99 之和

>>> from functools import reduce❶ 
>>> from operator import add ➋
>>> reduce(add, range(100)) ➌
4950
>>> sum(range(100)) ➍
4950
>>>

❶ 从 Python 3.0 起,reduce 不再是内置函数了。
❷ 导入 add,以免创建一个专求两数之和的函数。
❸ 计算 0~99 之和。
❹ 使用 sum 做相同的求和;无需导入或创建求和函数。

  • sum 和 reduce 的通用思想是把某个操作连续应用到序列的元素上,累计之前的结果,把
    一系列值归约成一个值。

all 和 any 也是内置的归约函数。

  • all(iterable)如果 iterable 的每个元素都是真值,返回 True;all([]) 返回 True。
  • any(iterable)只要 iterable 中有元素是真值,就返回 True;any([]) 返回 False。

5.3匿名函数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/273817.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

进程状态转换(了解)

进程三个基本状态&#xff1a;就绪、阻塞、运行 这个比较简单&#xff0c;进程创建后进入就绪状态、然后若CPU空闲或能打断CPU正在执行的进程&#xff08;优先级低的&#xff09;&#xff0c;那么就绪状态转换成运行态&#xff0c;运行时&#xff0c;进程需要用到其他资源&…

rebuild online意外终止导致ora-8104错误的实验

rebuild online意外终止导致ora-8104错误的实验 SQL> !oerr ora 810408104, 00000, "this index object %s is being online built or rebuilt"// *Cause: the index is being created or rebuild or waited for recovering // from the online (re)build // *Act…

关于range方法,如果你觉得python很简单就错了

前言&#xff1a;在系统学习迭代器之前&#xff0c;我一直以为 range() 方法也是用于生成迭代器的&#xff0c;现在却突然发现&#xff0c;它生成的只是可迭代对象&#xff0c;而并不是迭代器&#xff01; 1、range() 是什么&#xff1f; 对于 range() 函数&#xff0c;有几个注…

centos下crontab的使用

1.作用使用crontab命令可以修改crontab配置文件&#xff0c;然后该配置由cron公用程序在适当的时间执行&#xff0c;该命令使用权限是所有用户。2.格式crontab [-u user] {-l | -r | -e}3.crontab命令选项: -u指定一个用户, -l列出某个用户的任务计划, -r删除某个用户的任务, -…

关于python3中的包operator(支持函数式编程的包)

文章目录1.functools2.operator.itemgetter3.operator.attrgetter虽然 Guido 明确表明,Python 的目标不是变成函数式编程语言,但是得益于 operator 和 functools 等包的支持,函数式编程风格也可以信手拈来。接下来的两节分别介绍这两 个包。 1.functools 示例1 使用 reduce 函…

collections 中的namedtuple

文章目录namedtuple 基本用法namedtuple特性_make(iterable)_asdict()_replace(**kwargs)_fields_fields_defaults参考&#xff1a;namedtuple 基本用法 Tuple还有一个兄弟&#xff0c;叫namedtuple。虽然都是tuple&#xff0c;但是功能更为强大。对于namedtuple&#xff0c;你…

abap 中modify 的使用

1、modify table itab from wa Transporting f1 f2 ... 表示表itab中符合工作区wa 中关键字的一条数据的 f1 f2字段会被wa中对应的字段值更新。 modify用于更新和新增数据&#xff0c;当表中没有数据时就新增&#xff0c;有就修改。 2、在使用binary search 时一定要先排序&am…

python[进阶] 6.使用一等函数实现设计模式

文章目录6.1.1 经典的“策略”模式6.1.2 使用函数实现“策略”模式6.1.3 选择最佳策略&#xff1a;简单的6.1.4 找出模块中的全部6.2 “命令”模式6.1.1 经典的“策略”模式 为抽象基类&#xff08;Abstract Base Class&#xff0c;ABC&#xff09;&#xff0c;这么做是为了使…

2014阿里巴巴校园招聘笔试题 - 中南站

转载于:https://www.cnblogs.com/gotodsp/articles/3530329.html

python中一些特殊方法的作用

我们先暂且称呼为特殊方法。 单下划线开头&#xff08;_foo&#xff09;双下划线开头的&#xff08;__foo&#xff09;双下划线开头和结尾的&#xff08; __foo__&#xff09;代表不能直接访问的类属性&#xff0c;需通过类提供的接口进行访问&#xff0c;不能用“from xxx im…

Spring的IOC原理[通俗解释一下]

1. IoC理论的背景 我们都知道&#xff0c;在采用面向对象方法设计的软件系统中&#xff0c;它的底层实现都是由N个对象组成的&#xff0c;所有的对象通过彼此的合作&#xff0c;最终实现系统的业务逻辑。 图1&#xff1a;软件系统中耦合的对象 如果我们打开机械式手表的后盖&am…

python爬虫面试遇到的问题

文章目录&#xff11;python基础1.1 列表生成式和生成器的区别 &#xff1f;1.2 如何不用任何循环快速筛掉列表中的奇数元素 &#xff1f;1.3 map和reduce的用法1.4 装饰器的作用1.5 Python中__new__与__init方法的区别1.6 python中的设计模式1.7 lambda函数&#xff0c;以及它…

ubuntu18 常用命令

文章目录卸载和安装卸载和安装 1.打开一个终端&#xff0c;输入dpkg --list ,按下Enter键&#xff0c;终端输出以下内容&#xff0c;显示的是你电脑上安装的所有软件。 2.安装 dpkg –i name.deb 安装一个 deb 包&#xff1b;在终端上输入命令sudo apt-get --purge remove 包…

以嵌入式系统设计师考试成绩,开始嵌入式博客之旅

http://www.rkb.gov.cn/jsj/cms/s_contents/download/s_dt201003110106.html 转载于:https://www.cnblogs.com/yueqian-scut/p/3952268.html

SSH框架配置及Maven使用

1.SSH框架配置 1.1. SSH框架介绍 1.2. SSH框架配置 所需资源下载&#xff1a; l jdk; 从Oracle官方网站&#xff1a;http://www.oracle.com/technetwork/cn/java/javase/downloads/index.html下载jdk&#xff0c;win7是默认安装在C:\Program Files (x86)\Java\jdk1.6.0_25路径下…

cookie,session的区别和联系(补充token)

文章目录1 http为什么是无状态的2 cookie 和session 的区别详解3 token参考&#xff1a;备注: 博客文章仅限于学习&#xff0c;禁止商用1 http为什么是无状态的 2 cookie 和session 的区别详解 这些都是基础知识&#xff0c;不过有必要做深入了解。先简单介绍一下。 二者的定…

库函数和系统调用的区别

前言 这是一对非常容易混淆的概念。对于用户( 应用程序开发者 )来说&#xff0c;并不一定要严格区分其意义。因为在用户看来&#xff0c;它们都是以C函数的形式出现的。但了解二者的区别对我们掌握整个计算机系统有很大帮助。 区别 1. 一部分库函数实现需要使用系统调用( 如 pr…

Flask 从入门到熟悉(不敢称为精通)

文章目录2.1 Flask介绍及其安装2.2 Virtualenv3.1 一个最小的应用3.2 外部课件服务器3.3 调试模式4.1 路由介绍4.2 变量规则4.3 构建URL4.4 HTTP 方法4 总结5.1 静态文件5.2 渲染模板5.3 练习66.1 接收请求数据6.2 请求对象6.3 文件上传6.4 Cookies6 总结77.1 重定向和错误7.2 …

Ext JS 5 beta版发布

原文&#xff1a;Announcing Public Beta of Ext JS 5我们非常高兴的宣布&#xff0c;Sencha Ext JS 5 beta版本开始进行公测了。这个beta版本可以让你、我们Sencha社区来对我们的Ext JS 5的工作进度进行评测。对于所以Ext JS开发人员&#xff0c;这事一个很好的机会来协助完成…

算法【二分查找】(数组)

1 .山脉数组的巅峰索引 信息 我们把符合下列属性的数组 A 称作山脉&#xff1a; A.length > 3 存在 0 < i < A.length - 1 使得A[0] < A[1] < … A[i-1] < A[i] > A[i1] > … > A[A.length - 1] 给定一个确定为山脉的数组&#xff0c;返回任何满…