前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python内置(7)map、聚合、iter、迭代方法、slice

Python内置(7)map、聚合、iter、迭代方法、slice

作者头像
一只大鸽子
发布2022-12-06 14:39:01
6890
发布2022-12-06 14:39:01
举报

map and filter: Functional primitives

Python中一切都是对象,但不意味着必须面向对象编程,你也可以写函数式代码。函数式编程的基本想法是通过函数实现功能,而没有对象、继承等概念。函数式编程中两个真正常见的概念是映射(map)和过滤器(filter),Python为它们提供了内置函数:

map

map是一个“高阶函数”,这只是意味着它是一个将另一个函数作为参数的函数。

map真正要做的是从一组值映射到另一组值。一个非常简单的例子是平方映射:

代码语言:javascript
复制
>>> 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 filtermap非常相似,只是它不会将每个值都映射到新值,而是根据条件筛选值序列。一个非常简单的例子是从结果中过滤掉奇数:

代码语言:javascript
复制
>>> items = [13, 10, 25, 8]
>>> evens = list(filter(lambda num: num % 2 == 0, items))
>>> evens
[10, 8]

有些人可能已经意识到,这些函数本质上与列表理解做同样的事情,你是对的!列表理解基本上是一种更Pythonic,更具可读性的方式来编写这些完全相同的东西:

代码语言:javascript
复制
>>> def square(x):
...     return x * x
...
>>> numbers = [8, 4, 6, 5]
>>> [square(num) for num in numbers]
[64, 16, 36, 25]
代码语言:javascript
复制
>>> items = [13, 10, 25, 8]
>>> evens = [num for num in items if num % 2 == 0]
>>> evens
[10, 8]

你可以选择更熟悉的方式。

len, max, min and sum: 聚合函数

Python有几个聚合函数:将值集合组合成单个结果的函数。

我认为只要一个小小的代码示例就足以解释这四个:

代码语言:javascript
复制
>>> numbers = [30, 10, 20, 40]
>>> len(numbers)
4
>>> max(numbers)
40
>>> min(numbers)
10
>>> sum(numbers)
100

除了sum外的三个可以实际采用任何容器数据类型,如集合,字典甚至字符串。

iter and next: Advanced iteration

iternext 定义了for 循环的机制。你可能很熟悉下面的for循环:

代码语言:javascript
复制
for item in mylist:
    print(item)

它的内部实现类似于:

代码语言:javascript
复制
mylist_iterable = iter(mylist)
while True:
    try:
        item = next(mylist_iterable)

        print(item)

    except StopIteration:
        break

Python中的for循环是一个巧妙伪装的while循环。当您迭代列表或支持迭代的任何其他数据类型时,它只是意味着它理解iter函数,并返回一个“迭代器(iterator)”对象。Python 中的迭代器对象执行两项操作:

  • • 每次将它们传递给时next,它们都会产生新的值
  • • 当迭代器用完值时,它们会引发内置异常StopIteration。顺便说一句,生成器也遵循迭代器协议。
代码语言:javascript
复制
>>> 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个参数,返回一个可迭代的整数序列。 enumeratezip也很有用。 enumerate非常适合在需要访问列表中元素的索引和值时使用。

代码语言:javascript
复制
>>> menu = ['eggs', 'spam', 'bacon']
>>> for index, item in enumerate(menu, start=1):
...     print(f'{index}: {item}')
...
1: eggs
2: spam
3: bacon

zip可以同时迭代多个对象:

代码语言:javascript
复制
>>> 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)]

代码语言:javascript
复制
>>> 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]
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-10-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 一只大鸽子 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • map and filter: Functional primitives
  • len, max, min and sum: 聚合函数
  • iter and next: Advanced iteration
  • range, enumerate and zip: 方便地迭代
  • slice
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档