一文弄懂Python中的Map、Filter和Reduce函数

Python101

1. 引言

本文重点介绍Python中的三个特殊函数Map,Filter和Reduce,以及如何使用它们进行代码编程。在开始介绍之前,我们先来理解两个简单的概念高阶函数和Lambda函数。 闲话少说,我们直接开始吧!

2. 高阶函数

把函数作为参数传入,这样的函数称为高阶函数,函数式编程就是指这种高度抽象的编程范式。 举例如下:

def higher(your_function, some_variable):    return your_function(some_variable)

实质上,函数map,filter和reduce均为高阶函数,它们的输入参数为函数和可迭代对象(list,tumple等),具体形式如下:

map(your_function, your_list)filter(your_function, your_list)reduce(your_function, your_list)

3. Lambda表达式

Lambda 函数类似于普通的 Python 函数,区别在于我们必须为普通函数命名,但对于 lambda 函数,它是可选的。具体语法如下:

lambda inputs: output

接下来,让我们看一下几个普通函数及其 lambda 函数等效实现,如下:

def multiply2(x):           # is the same as    return x * 2multiply2 = lambda x: x*2   # lambda function

另一个例子如下:

def add(a, b):          # is the same as    return a + badd = lambda a,b: a+b   # lambda function

4. Map函数

Map 用于迭代可可迭代对象中的每个元素进行相应的转换操作。 例如,通过将 ​ ​[1,2,3]​​ 中的每个元素乘以 2,将 ​ ​[1,2,3] ​​变换为 ​ ​[2,4,6]​​。 为此,我们需要一个lambda函数,该函数用于实现将单个元素乘2的操作,如下:

before = [1,2,3]after = list(map(lambda x:x*2, before))# after is [2,4,6]

此外,我们在看下个示例,主要用于将字符串所有字符转换为大写形式。如下:

before = ["apple", "orange", "pear"]after = list(map(lambda x:x.upper(), before))# after is ["APPLE", "ORANGE", "PEAR"]

需要注意的是,虽然上述 lambda 函数中使用变量 x,但只要它是有效的变量名称,我们可以更换为任何我们想要取的变量名称。

5. Filter函数

过滤器用于可迭代,以仅保留满足特定条件的某些元素。例如,仅将奇数保留在 [1,2,3,4,5,6] 内并得到 [1,3,5]。在这里,我们需要一个lambda函数,它接受一个数字,如果数字是奇数,则返回True,否则返回False。

函数Filter主要功能为对于根据特定过滤条件来从可迭代对象中的选择相应的元素。举例,对于列表​ ​[1,2,3,4,5,6]​​,如果我们想要过滤得到其中的奇数数元素。我们可以实现一个lambda函数,当参数为奇数时为True,否则为False。

代码如下:

before = [1,2,3,4,5,6]after = list(filter(lambda x:x%2==1, before))# after is [1,3,5]

在举个栗子,实现只保留字符串长度大于等于5的,即将列表​ ​[“apple”,“orange”,“pear”]​​转换为​ ​[“apple”,“orange”]​​。此时我们可以实现一个lambda函数,接收一个字符串,如果该字符串的长度大于等于5,则返回True,否则为False。 代码如下:

before = ["apple", "orange", "pear"]after = list(filter(lambda x:len(x)>=5, before))# after is ["apple", "orange"]

6. Reduce函数

函数Reduce主要用于以某种方式来组合可迭代对象中的所有元素。 与函数​ ​map​​和​ ​filter​​不同,我们需要单独引入​ ​ reduce​​,如下所示:

from functools import reduce

此外,reduce中使用的lambda函数需要两个参数,它主要用于告诉我们如何将两个元素组合成起来。举个栗子,假如我们需要将列表​ ​[1,2,3,4,5]​​中的所有元素进行相乘得到数字​ ​120​​,这里我们需要实现的lambda函数就是接收两个数字,并将他们相乘。 代码示例如下:

from functools import reducebefore = [1,2,3,4,5]after = reduce(lambda a,b: a*b, before)# after is 120

另外一个例子,如果我们需要使用​ ​-​​来将字符串连接起来。具体为将列表​ ​["apple", "orange", "pear"]​​变成​ ​"apple-orange-pear"​​。这里,我们需要实现一个lambda函数,它接受2个字符串,并将它们用一个​ ​-​​字符相加。 代码实现如下:

from functools import reducebefore = ["apple", "orange", "pear"]after = reduce(lambda a,b: a+"-"+b, before)

7. 总结

本文从高级函数和Lambda函数入手,先后介绍了Map,Filter和Reduce三个高级函数的用法,并给出了相应的代码示例。

您学废了嘛?

一文弄懂Python中的Map、Filter和Reduce函数

Original: https://blog.51cto.com/u_15506603/5604463
Author: sgzqc
Title: 一文弄懂Python中的Map、Filter和Reduce函数



相关阅读1

Title: Python之用户交互+运算符

程序与用户交互

什么是与用户交付

用户交互就是人往计算机中input/输入数据,计算机print/输出结果

为什么要与用户交互

为了让计算机能够像人一样与用户沟通交流

比如,过去我们去银行取钱,用户需要把帐号密码告诉柜员,而现在,柜员被ATM机取代,ATM机就是一台计算机,所以用户同样需要将帐号密码告诉计算机,于是我们的程序中必须有相应的机制来控制计算机接收用户输入的内容,并且输出结果

如何与用户交互

一文弄懂Python中的Map、Filter和Reduce函数

交互的本质就是输入、输出

输入input:

一文弄懂Python中的Map、Filter和Reduce函数

补充:

在python2中存在一个raw_input功能与python3中的input功能一模一样在python2中还存在一个input功能,需要用户输入一个明确的数据类型,输入什么类型就存成什么类型
输出print:

一文弄懂Python中的Map、Filter和Reduce函数

输出之格式化输出

什么是格式化输出

把一段字符串里面的某些内容替换掉之后再输出,就是格式化输出。

为什么要格式化输出

我们经常会输出具有某种固定格式的内容,比如:'尊敬的xxx你好!你xxx月的话费是xxx,余额是xxx',我们需要做的就是将xxx替换为具体的内容。

如何格式输出

使用占位符,如:%s %d {}

'尊敬的%s你好!你xxx月的话费是%d,余额是%d'

基本运算符

算数运算符

python支持的算数运算符与数学上计算的符号使用是一致的

算数运算符

描述

+

加,两个对象相加

-

减,两个对象相减

*

乘,两个对象相乘

/

除,相除后得到大的返回值会保留整数与小数部分

//

取整数,相除后得到的返回值只保留整数部分

%

相余,相除后只返回余数

**

幂,取员工数的n次方

比较运算符

比较运算用来对两个值进行比较,返回的是布尔值True或False

比较运算符

描述

==

等于,两个对象相等则返回True,否则返回False

!=

不等于,两个对象不等于则返回False,否则返回True

大于

=

大于等于

<

小于

Original: https://blog.51cto.com/u_15222272/5606346
Author: 弓长三虎
Title: Python之用户交互+运算符

相关阅读2

Title: 一个高性能跨平台基于Python的Waitress WSGI Server的介绍!

对于Python来说,它有很多web框架,常见的有jango、Flask、Tornado 、sanic等, 比如Odoo、Superset都基于Flask框架进行开发的开源平台,具有强大的功能。在Linux下,默认使用的WSGI Server一般为Gunicorn, 它是一个比较出名的 Web 服务器。在常规的 Django 和 Flask 应用部署中,都有大量的站点使用 Gunicorn。但它只支持Linux,不支持Windows,但有没有类似Gunicorn的产品,但同时支持跨平台?答案是肯定的,那就是Waitress。一个Web框架如何被客户端访问,如下图:

Web框架被客户端访问过程

Web服务网关接口(Web Server Gateway Interface,简称"WSGI")是一种在Web服务器 和Python Web应用程序或框架之间的标准接口。通过标准化Web服务器和Python web应用程序 或框架之间的行为和通信,WSGI使得编写可移植的的Python web代码变为可能,使其能够部署在任何符合WSGI的web服务器上。 独立WSGI服务器相比传统web服务器,使用更少的资源,并提供最高的性能

Waitress是一个具备生产级品质并有高性能的纯python编写独立的WSGI服务器,它只依赖python标准库,不依赖任何第三方库。同时它可以在多平台下运行,比如windows、linux、unix等,支持http/1.0和http/1.1。 最新版本是2.0.0,Python >=3.6.0,官网文档地址:https://docs.pylonsproject.org/projects/waitress/en/latest/,源代码托管网址:https://github.com/Pylons/waitress。

安装Waitress只需一个命令行: pip install waitress

运行Waitress有两种方式,一种是代码方式,优点灵活性会更好,可以扩展一些增强功能,比如与其他库的交互,日志记录等,另一种方式waitress-serve命令行方式。本文重点介绍一下 waitress-serve命令行方式,该命令行有很多参数,官方文档:https://docs.pylonsproject.org/projects/waitress/en/stable/runner.html,具体如下:

waitress-serve [OPTS] MODULE:OBJECT
常用选项:

--help
显示此信息。
--call
调用给定的对象以获取WSGI应用程序。
--host=ADDR
要侦听的主机名或IP地址,默认值为" 0.0.0.0",表示"此主机上的所有IP地址"。
--port=PORT
要侦听的TCP端口,默认为" 8080"
--listen=host:port
告诉waitress 监听的IP端口。

例子:

--listen = 127.0.0.1:8080 --listen = [:: 1]:8080 --listen = *:8080
可以多次使用此选项以侦听multipe套接字。还支持主机名的通配符,该通配符将绑定到IPv4 / IPv6,具体取决于它们是启用还是禁用。

--[no-]ipv4
启用/禁用IPv4支持。

在侦听通配符地址/端口组合时,这会影响通配符匹配。

--[no-]ipv6
启用/禁用IPv6支持。

在侦听通配符地址/端口组合时,这会影响通配符匹配。

--unix-socket=PATH
Unix套接字的路径。如果指定了套接字路径,则会创建一个Unix域套接字,而不是通常的inet域套接字。

在Windows上不可用。

--unix-socket-perms=PERMS
用于Unix域套接字的八进制权限,默认值为'600'。
--url-scheme=STR
默认wsgi.url_scheme值,默认为" http"。
--url-prefix=STR
该SCRIPT_NAMEWSGI环境价值。将其设置为除空字符串之外的任何SCRIPT_NAME值,将使WSGI值成为传递的值减去您添加的任何斜杠,并且将导致 PATH_INFO带有该值前缀的所有请求的前缀均被删除。默认为空字符串。
--ident=STR
响应中"服务器"标头中使用的服务器身份。默认值为"waitress"。
调整选项:

--threads=INT
用于处理应用程序逻辑的线程数,默认为4。
--backlog=INT
服务器的连接积压。默认值为1024。
--recv-bytes=INT
调用时要请求的字节数socket.recv()。默认值为8192。
--send-bytes=INT
要发送到socket.send()的字节数。默认值为1。9000的倍数应避免部分填充TCP数据包。

从1.3版开始不推荐使用。

--outbuf-overflow=INT
如果挂起的输出大于此大小,则应创建一个临时文件。默认值为1048576(1MB)。
--outbuf-high-watermark=INT
当挂起的输出大于此值时,app_iter将暂停,并在将足够的数据写入套接字以使其降至此阈值以下时将恢复。默认值为16777216(16MB)。
--inbuf-overflow=INT
如果挂起的输入大于此值,则应创建一个临时文件。默认值为524288(512KB)。
--connection-limit=INT
如果已经激活了太多频道,请停止创建新频道。默认值为100。
--cleanup-interval=INT
清理无效通道之间的最短间隔时间。默认值为30。请参见 --channel-timeout。
--channel-timeout=INT
保持不活动连接打开的最大秒数。默认值为120。"不活动"定义为"未从客户端收到任何数据,也未向客户端发送任何数据"。
--[no-]log-socket-errors
切换是否应记录客户端过早断开连接的回溯。默认情况下为开。
--max-request-header-size=INT
合并所有请求标头的最大大小。默认值为262144(256KB)。
--max-request-body-size=INT
请求正文的最大大小。默认值为1073741824(1GB)。
--[no-]expose-tracebacks
切换是否向客户端公开未处理异常的回溯。默认情况下关闭。
--asyncore-loop-timeout=INT
以秒为单位的超时值传递到asyncore.loop()。默认值为1。
--asyncore-use-poll
use_poll参数传递给asyncore.loop()。帮助克服打开文件描述符的限制。默认值为False。

更多技术沟通交流,可关注我的微信号:odoodev

一文弄懂Python中的Map、Filter和Reduce函数

长按图片扫描二维码

也可以关注我的今日头条号:

一文弄懂Python中的Map、Filter和Reduce函数

长按图片扫描二维码

Original: https://www.cnblogs.com/nbpowerboy/p/15784296.html
Author: 软件人生
Title: 一个高性能跨平台基于Python的Waitress WSGI Server的介绍!

相关阅读3

Title: Django 定制后台和修改模型

Django 定制后台和修改模型

原创

Jerrylee6博主文章分类:DevOps ©著作权

文章标签 django 数据 python 文章分类 Python 编程语言

©著作权归作者所有:来自51CTO博客作者Jerrylee6的原创作品,请联系作者获取转载授权,否则将追究法律责任

Django 定制后台和修改模型

当数据模型建立完成时,接下来需要将模型里的数据展示出来,而且是通过模板这种类型进行显示

定制admin后台

  1. 日期类型
class Article(models.Model):  created_time = models.DateTimeField(auto_now_add=True)  last_updated_time = models.DateTimeField(auto_now=True)
  1. 外键-作者
class Article(models.Model):  author = models.ForeignKey(User, on_delete=models.DO_NOTHING, default=1)
  1. 布尔类型
class Article(models.Model):  is_deleted = models.BooleanField(default=False)
  1. 数字类型
class Article(models.Model):  readed_num = models.IntegerField(default=0)
  1. 文件article/admin.py,代码合并如下
from django.db import modelsfrom django.contrib.auth.models import User# Create your models here.class Article(models.Model):    title = models.CharField(max_length=30)    content = models.TextField()    created_time = models.DateTimeField(auto_now_add=True)    last_updated_time = models.DateTimeField(auto_now=True)    author = models.ForeignKey(User, on_delete=models.DO_NOTHING, default=1)    is_deleted = models.BooleanField(default=False)    readed_num = models.IntegerField(default=0)    def __str__(self):        return "" % self.title

同步数据

  1. 生成模型数据文件
python manage.py makemigrations
  1. 应用模型数据-到数据仓库
python manage.py migrate
  1. 编写admin.py文件,内容如下:
from django.contrib import adminfrom .models import Article# Register your models here.@admin.register(Article)class ArticleAdmin(admin.ModelAdmin):    list_display = ("id", "title", "content", "author", "is_deleted", "created_time", "last_updated_time")    ordering = ("-id",)
  1. 测试

  2. 通过访问http://127.0.0.1:8000/admin

  3. 收藏
  4. 评论
  5. *举报

上一篇:Django使用模板显示内容

下一篇:Django 构建个人博客网站

Original: https://blog.51cto.com/51inte/5539273
Author: Jerrylee6
Title: Django 定制后台和修改模型