Python内置(7)map、聚合、iter、迭代方法、slice
map and filter: Functional primitives
Python中一切都是对象,但不意味着必须面向对象编程,你也可以写函数式代码。函数式编程的基本想法是通过函数实现功能,而没有对象、继承等概念。函数式编程中两个真正常见的概念是映射(map)和过滤器(filter),Python为它们提供了内置函数:
map
map
是一个“高阶函数”,这只是意味着它是一个将另一个函数作为参数的函数。
map
真正要做的是从一组值映射到另一组值。一个非常简单的例子是平方映射:
>>> def square(x):
... return x * x
...
>>> numbers = [8, 4, 6, 5]
>>> list(map(square, numbers))
[64, 16, 36, 25]
>>> for squared in map(square, numbers):
... print(squared)
...
64
16
36
25
map
采用两个参数:函数和序列。它只是以每个元素作为输入来运行该函数,并将所有输出存储在新列表中。map(square, numbers)
取每个数字并返回一个平方数字列表。注意,map
返回的是一个迭代器,惰性生成结果。
filter
filter
与map
非常相似,只是它不会将每个值都映射到新值,而是根据条件筛选值序列。一个非常简单的例子是从结果中过滤掉奇数:
>>> items = [13, 10, 25, 8]
>>> evens = list(filter(lambda num: num % 2 == 0, items))
>>> evens
[10, 8]
有些人可能已经意识到,这些函数本质上与列表理解做同样的事情,你是对的!列表理解基本上是一种更Pythonic,更具可读性的方式来编写这些完全相同的东西:
>>> def square(x):
... return x * x
...
>>> numbers = [8, 4, 6, 5]
>>> [square(num) for num in numbers]
[64, 16, 36, 25]
>>> items = [13, 10, 25, 8]
>>> evens = [num for num in items if num % 2 == 0]
>>> evens
[10, 8]
你可以选择更熟悉的方式。
len, max, min and sum: 聚合函数
Python有几个聚合函数:将值集合组合成单个结果的函数。
我认为只要一个小小的代码示例就足以解释这四个:
>>> numbers = [30, 10, 20, 40]
>>> len(numbers)
4
>>> max(numbers)
40
>>> min(numbers)
10
>>> sum(numbers)
100
除了sum
外的三个可以实际采用任何容器数据类型,如集合,字典甚至字符串。
iter and next: Advanced iteration
iter
和next
定义了for 循环的机制。你可能很熟悉下面的for循环:
for item in mylist:
print(item)
它的内部实现类似于:
mylist_iterable = iter(mylist)
while True:
try:
item = next(mylist_iterable)
print(item)
except StopIteration:
break
Python中的for循环是一个巧妙伪装的while循环。当您迭代列表或支持迭代的任何其他数据类型时,它只是意味着它理解iter
函数,并返回一个“迭代器(iterator)”对象。Python 中的迭代器对象执行两项操作:
- • 每次将它们传递给时
next
,它们都会产生新的值 - • 当迭代器用完值时,它们会引发内置异常
StopIteration
。顺便说一句,生成器也遵循迭代器协议。
>>> gen = (x**2 for x in range(1, 4))
>>> next(gen)
1
>>> next(gen)
4
>>> next(gen)
9
>>> next(gen)
Error: StopIteration
range, enumerate and zip: 方便地迭代
你应该很熟悉range
了, range
接收3个参数,返回一个可迭代的整数序列。 enumerate
和zip
也很有用。 enumerate
非常适合在需要访问列表中元素的索引和值时使用。
>>> menu = ['eggs', 'spam', 'bacon']
>>> for index, item in enumerate(menu, start=1):
... print(f'{index}: {item}')
...
1: eggs
2: spam
3: bacon
zip
可以同时迭代多个对象:
>>> students = ['Jared', 'Brock', 'Jack']
>>> marks = [65, 74, 81]
>>> for student, mark in zip(students, marks):
... print(f'{student} got {mark} marks')
...
Jared got 65 marks
Brock got 74 marks
Jack got 81 marks
slice
slice
是当你对Python可迭代对象进行切片时背后调用的方法。例如my_list[1:3]
内部的1:3
实际上创建了一个slice
对象。也就是说my_list[1:3]
实际上是my_list[slice(1,3)]
>>> my_list = [10, 20, 30, 40]
>>> my_list[1:3]
[20, 30]
>>> my_list[slice(1, 3)]
[20, 30]
>>> nums = list(range(10))
>>> nums
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> nums[1::2]
[1, 3, 5, 7, 9]
>>> s = slice(1, None, 2) # Equivalent to `[1::2]`
>>> s
slice(1, None, 2)
>>> nums[s]
[1, 3, 5, 7, 9]
相关文章
- Python绘制时间演变图工具汇总(附代码)
- python求逆矩阵的方法,Python 如何求矩阵的逆「建议收藏」
- python中创建列表的方法_python中readlines
- python中pygame怎么安_Python中pygame安装方法图文详解
- python qt是什么_初识Python与Qt「建议收藏」
- python进制转换函数-Python中进制转换函数的使用
- Python 画图常用颜色 – 单色、渐变色、混色 – 够用
- Python快速编程入门课后习题答案「建议收藏」
- java和python哪个值得学-学java好还是Python好?
- 【黄啊码】MySQL入门—5、掌握这些数据筛选技能比你学python还有用-2
- scrapy爬虫案例_Python爬虫 | 一条高效的学习路径
- 手机python 3.8解释器_Python 3.8 解释器安装教程
- Python 技巧篇-pip卸载python库实例演示,查看pip命令大全方法[通俗易懂]
- 【说站】python类如何自定义实例化
- Python修改文件后缀_python重命名文件名
- python的threading模块
- python新手程序_怎么用微信小程序练字
- selenium+webdriver_python爬虫安装
- Python数据类型(列表)
- pycharm如何调试python程序_Pycharm断点调试Python程序的步骤方法
- Python-基础-循环语句快速入门
- 【测试开发】python系列教程:Python注释和解释器
- 软件测试|Python的流程控制,你真的会了吗?(一)
- Python基础语法-基本数据类型-字符串的格式化
- python-Python与PostgreSQL数据库-PostgreSQL数据库的基本知识(二)
- Python dict字典keys()、values()和items()方法
- Linux与Python:开拓者的新时代(linux和python)
- Linux查看Python版本的有效方法(linux查看python版本)
- Linux下开发Python:Cython使用指南(cythonlinux)
- Linux系统下安装Python模块指南(linux安装python模块)
- 从Redis中取出Map一步搞定(从redis中取map)
- 使用Oracle Map方法开启新视野(oracle map方法)