函数进阶· 第3篇《常用内置函数filter()、map()、zip(),怎么用的呢?》
坚持原创输出,点击蓝字关注我吧
作者:清菡
博客:oschina、云+社区、知乎等各大平台都有。
由于微信公众号推送改为了信息流的形式,防止走丢,请给加个星标 ,你就可以第一时间接收到本公众号的推送!
目录
- 一、filter()函数
- 1.filter()过滤序列
- 2.生成器、迭代器都是可迭代对象
- 二、map()函数
- 三、zip()函数
- 1.什么是 zip()函数
- 2.zip()可以快速创建字典
常用的内置函数:
- map()函数:会根据提供的函数对指定序列做映射。
- filter()函数:函数用于过滤序列。
- zip()函数:函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组。
一、filter()函数
1.filter()过滤序列
filter:过滤序列。第一参数是函数;第二参数是可迭代对象。
看看filter()
这个内置函数的源码:
class filter(object):
"""
filter(function or None, iterable) --> filter object
Return an iterator yielding those items of iterable for which function(item)
is true. If function is None, return the items that are true.
"""
def __getattribute__(self, *args, **kwargs): # real signature unknown
""" Return getattr(self, name). """
pass
def __init__(self, function_or_None, iterable): # real signature unknown; restored from __doc__
pass
def __iter__(self, *args, **kwargs): # real signature unknown
""" Implement iter(self). """
pass
@staticmethod # known case of __new__
def __new__(*args, **kwargs): # real signature unknown
""" Create and return a new object. See help(type) for accurate signature. """
pass
def __next__(self, *args, **kwargs): # real signature unknown
""" Implement next(self). """
pass
def __reduce__(self, *args, **kwargs): # real signature unknown
""" Return state information for pickling. """
pass
看源码发现居然是个类。
它接收到的是2个参数,2个参数在哪里看呢?
__init__
方法里面看。既然是个类,调用的时候创建一个对象。
Python 中的可迭代对象在一个模块里面。迭代器、生成器、可迭代对象都在这个模块里面。
from collections import Iterator,Iterable,Generator
生成器属于迭代器,生成器是可迭代对象。
列表是个可迭代对象。filter()
这个内置函数传 2 个参数后,会返回出一个对象。
看filter()
源码可以看出它是个类,调用它给它传参,类返回的结果肯定是个对象。
filter()
的作用是过滤,它会进行迭代操作。
它会把后面传入的可迭代对象,里面的元素全部遍历一遍。然后把遍历出来的元素当作参数传到这个fun
函数里面。
当前这个fun()
函数没有定义参数,这个时候运行看看:
# 内置函数
def fun():
pass
li = [1,2,122,331,11,22,33,4,6,7,2,88,31]
res=filter(fun,li)
print(list(res))
返回列表的时候报错了,fun()
需要 0 个参数,但是这里给了一个参数:
当我们把它转换成列表的时候,在这里传进去,它会返回一个对象,这个对象里有一个函数,还有个可迭代对象filter(fun,li)
。
使用filter()
传出来的数据也是个迭代器。它也是个可迭代对象,就可以通过list
把它转换成列表。
当你转换的时候,它会把第一个参数拿到,传到fun()
里面去,会自动传参的。
加个参数,再运行:
# 内置函数
def fun(n):
pass
li = [1,2,122,331,11,22,33,4,6,7,2,88,31]
res=filter(fun,li)
print(list(res))
运行结果:
这个列表是空的。因为函数pass
掉了。只写个pass
,调用这个函数,返回的值是没有结果的。
filter()
会根据传进去的参数,调用func()
函数,这个函数根据返回值pass
,来确定函数li
要不要添加到新的列表里面。
如果将代码修改成这样return True
:
def fun(n):
return True
li = [1,2,122,331,11,22,33,4,6,7,2,88,31]
res=filter(fun,li)
print(list(res))
返回结果:
返回一个 False:
输出结果是一个都没有了。
filter()
函数可以过滤,可以写过滤条件。比如要保留n<10
的数据要保留下来,n<10
是个比较语句。
n<10
返回的是个 True(当前传入的参数保留,添加到新的列表里面),n>10
返回的是个 False(就把数据去掉不要了):
def fun(n):
return n<10
li = [1,2,122,331,11,22,33,4,6,7,2,88,31]
res=filter(fun,li)
print(list(res))
其实和这段代码的操作是一样一样的:
li1 = []
for i in li:
if i > 10:
li1.append(i)
内部操作是这样的:
定义了个新的列表li1
,在这里面来了一个for
循环,判断i
是不是大于 10,如果大于 10,就把它添加到新的列表里面。
会根据你传入的参数fun(n)
进行相应的判断和比较。根据函数返回的是True
还是None
,来决定这个数据要不要保留起来。
2.生成器、迭代器都是可迭代对象
定义个生成器、可迭代对象、迭代器:
from collections import Iterator,Iterable,Generator
def fun(n):
return n < 10
# 列表就是可迭代对象
li = [1, 2, 122, 331, 11, 22, 33, 4, 6, 7, 2, 88, 31]
res = filter(fun, li)
# 定义个迭代器
# 可以把一个可迭代对象转换成一个迭代器
li2 = iter(li)
# 定义个生成器
li3 = (i for i in range(5))
# 用isinstance 判断下列表是不是个可迭代对象
print(isinstance(li,Iterable))
print(isinstance(li2,Iterable))
print(isinstance(li3,Iterable))
isinstance()
函数来判断一个对象是否是一个已知的类型,类似 type()
。
返回都是True
,所以它们 3 个都是可迭代对象。
生成器属于迭代器,那么生成器也是可迭代对象。迭代器是可迭代对象,但是迭代器不是生成器。
二、map()函数
map()
的机制和filter()
是一样的。它也会将后面的可迭代对象里面的数据迭代出来,放到第一个函数里面。
它接收的也是 2 个参数。第一个参数:func
,第二个参数:可迭代对象。
def fun(n):
return n < 10
# 列表就是可迭代对象
li = [1, 2, 122, 331, 11, 22, 33, 4, 6, 7, 2, 88, 31]
res = filter(fun, li)
# map:将可迭代对象中的数据迭代出来,一个一个传到函数中去调用,将返回结果放到新的对象中。
res2=map(fun,li)
print(list(res2))
它返回的结果全是True
和False
。
map()函数可以用来做:
1.把这些数据做统一的处理,比如算这些数据的阶乘,有一批数据要算阶乘,可以一起拿过去。
2.它会把数据当作个参数,放到函数里去调用。
3.然后把函数的返回值放到一个列表里面。
它返回什么就放什么,改成返回 1000:
改成n*2
:
map()
将可迭代对象里面的元素迭代出来,每个元素当作一个参数,传到前面这个函数fun
里面,然后把函数的返回值添加到新的列表里面。
要统一处理一批数据的时候,就可以通过它来做。
三、zip()函数
1.什么是 zip()函数
zip()函数后面接收的是个可迭代对象,后面可接收多个可迭代对象。
来看看 zip 的源码:
它的内部其实也是个类,那么它返回的就是个可迭代对象。
准确得来说,它是个迭代器,迭代器也属于可迭代对象。
例如:
# zip # 打包
res3 = zip([1, 2, 3], [11, 22, 33])
print(res3)
在 Python2 的时候,filter()
、map()
、zip()
函数返回出来的直接是列表。Python3 做了个性能的优化,返回的是个迭代器,可以节约内存。
通过next()
去取值,能获取出来内容的话,说明它就是个迭代器:
直接一次性把它转换成列表,方便看结果:
# zip # 打包
res3 = zip([1, 2, 3], [11, 22, 33])
print(list(res3))
它是这样打包的:
使用zip()
函数传入 2 个可迭代对象,把第一个可迭代对象的第一个元素和第二个可迭代对象的第一个元素拿出来打包成一个元组,后面以此类推。
为什么里面放的是元组?
元组省内存啊。
如果可迭代对象里面元素多少不一样(长短不一)怎么办?
# zip # 打包
res3 = zip([1, 2, 3], [11, 22, 33,44,55],[111,222,333],[111,222,333])
print(list(res3))
它会只会保留最短的。
代码中最短的一组:这里只有 3 个元素。
那么这里的话,只会分成 3 组。就算第二组有 5 个元素,只会拿第一个、第二个、第三个。多余的数据清除掉了,不要了。
2.zip()可以快速创建字典
你看,和字典items()
取值出来的数据是一样的:
通过dict
转换下,你看,它变成了一个字典:
# zip # 打包
res3 = zip([1, 2, 3], [11, 22, 33])
print(dict(list(res3)))
dict1={"key1":1,"key2":2,"key3":3}
print(list(dict1.items()))
创建字典的时候,可通过这种方式快速创建字典。
把键放在一个列表里,把值放在一个列表里,通过zip()
打包一下,通过dit()
就能把它转换成一个字典。
公众号清菡软件测试首发,更多原创文章:清菡软件测试 112+原创文章,欢迎关注、交流,禁止第三方擅自转载。
函数进阶· 第3篇《常用内置函数filter()、map()、zip(),怎么用的呢?》的更多相关文章
- MYSQL常用内置函数详解说明
函数中可以将字段名当作变量来用,变量的值就是该列对应的所有值:在整理98在线字典数据时(http://zidian.98zw.com/),有这要一个需求,想从多音字duoyinzi字段值提取第一个拼音 ...
- Python常用模块中常用内置函数的具体介绍
Python作为计算机语言中常用的语言,它具有十分强大的功能,但是你知道Python常用模块I的内置模块中常用内置函数都包括哪些具体的函数吗?以下的文章就是对Python常用模块I的内置模块的常用内置 ...
- MySQL学习笔记_7_MySQL常用内置函数
MySQL常用内置函数 说明: 1)可以用在SELECT/UPDATE/DELETE中,及where,orderby,having中 2)在函数里将字段名作为参数,变量的值就是字段所对应的每一行的值. ...
- PYTHON语言之常用内置函数
一 写在开头本文列举了一些常用的python内置函数.完整详细的python内置函数列表请参见python文档的Built-in Functions章节. 二 python常用内置函数请注意,有关内置 ...
- SqlServer常用内置函数
--======================================= -- SQL常用内置函数 --======================================= --判 ...
- Python的常用内置函数介绍
Python的常用内置函数介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.取绝对值(abs) #!/usr/bin/env python #_*_coding:utf-8_ ...
- python中的运算符及表达式及常用内置函数
知识内容: 1.运算符与表达式 2.for\while初步了解 3.常用内置函数 一.运算符与表达式 python与其他语言一样支持大多数算数运算符.关系运算符.逻辑运算符以及位运算符,并且有和大多数 ...
- python第十八课——常用内置函数
常用内置函数:round(): print(round(3.14),round(3.99)) print(round(3145.926,-2),round(413.575,2)) abs(): pri ...
- php2go - Go 实现 PHP 常用内置函数
[转]http://www.syyong.com/Go/php2go-Use-Golang-to-implement-PHP-s-common-built-in-functions.html 使用Go ...
- Python基础(二)——常用内置函数
1. 常用内置函数 (1)isinstance(object, classinfo) 用于判断一个对象是否为某一类型. object 是实例对象 classinfo 是基本类型如 int, floa ...
随机推荐
- Kafka入门之broker-消息设计
消息设计 1.消息格式 Kafka的实现方式本质上是使用java NIO的ByteBuffer来保存消息,同时依赖文件系统提供的页缓存机制,而非依靠java的堆缓存. 2.版本变迁 0.11.0.0版 ...
- 【五校联考1day2】JZOJ2020年8月12日提高组T1 对你的爱深不见底
[五校联考1day2]JZOJ2020年8月12日提高组T1 对你的爱深不见底 题目 Description 出乎意料的是,幸运E 的小R 居然赢了那个游戏.现在欣喜万分的小R 想要写一张明信片给小Y ...
- JS代码下载百度文库纯文本文档
下载百度文库纯文本文档流程 1.按 F12 或 Ctrl+Shift+I打开后台(或点击右键,在点击检查)[建议使用谷歌浏览器] 2.切换到控制台,赋值粘贴以下js代码,回车后,浏览器将自动下载保存 ...
- 记一次MongoDB的失败导出
MongoDB用的是阿里云的,今天想着把原来的数据导出进行一次去重处理,整理下数据.操作了好几个小时,还是未能成功导出. MongoDB用的是阿里云的专有网络连接,本想通过公网直接访问,申请了公网地址 ...
- python核心高级学习总结7---------正则表达式
正则表达式在爬虫项目中应用很广泛,主要方面就是在字符串处理方面,经常会涉及到字符串格式的校验,用起来经常要查看文档才能完成,所以抽了个时间将正则的内容复习了一下. Start re---导入re模块使 ...
- Python中import模块时报SyntaxError: (unicode error)utf-8 codec can not decode 错误的解决办法
老猿有个通过UE编辑(其他文本编辑器一样有类似问题)的bmi.py文件,在Python Idle环境打开文件执行时没有问题,但import时报错: SyntaxError: (unicode erro ...
- PyQt(Python+Qt)学习随笔:怎么在QScrollArea滚动区域中展示子部件的超长内容?
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 滚动区域可以针对部署在其上的子部件在不可见时进行滚动展示,但这种滚动展示仅只能展示内容层可见范围的子 ...
- PyQt(Python+Qt)学习随笔:设定toolButton弹出菜单的方法
在Qt Designer中toolButton可以通过popupMode设定菜单弹出的模式,但并不能在Qt Designer中指定toolButton的弹出菜单,toolButton只能通过代码来指定 ...
- PyQt(Python+Qt)学习随笔:快速理解Qt 中Action是什么
一.引言 Qt中Action这个词接触很久了,一直以来没去学习,今天终于准备学习了,查了些资料,初步总结为: Action为界面操作的抽象,应用程序可以通过菜单,工具栏按钮以及键盘快捷键来调用通用的命 ...
- Python Flask后端异步处理(三)
前一篇博文我们已经将基础知识和环境配置进行了介绍:https://www.cnblogs.com/Cl0ud/p/13192925.html,本篇博文在实际应用场景中使用Celery,对Flask后端 ...