先重温一下迭代(Iteration)、迭代器对象(iterable)、迭代器(iterator )的概念:

Iteration是计算机科学的通用术语,它是指对一组元素执行一项操作,一次执行一个元素。一个很好的例子是循环 - 它适用于每个单独的项目,直到整个项目集运行完毕为止。

Iterable是可以遍历的对象(译者注:在Python中所有东西都是object, 比如说变量,容器,类),iterable是可以产生iterator的object。

iterator是表示数据流的对象,它一次返回一个元素的数据。它还会记住其在迭代过程中的位置。本质上,它控制应如何迭代可迭代对象。

map()的用法

map()函数以迭代的方式将提供的功能应用于每个项目,结果是作为迭代器的map对象。语法:

map(func, *iterables)

如果没有map(),我们将不得不编写复杂的代码以在多个项目上“循环”给定的函数。以一个整洁的小实验为例:我们有一个10个单词的列表。

test_list = ["effort", "circle", "yearly", "woolen", "accept", "lurker",

"island", "faucet", "glossy", "evader"]

我们怀疑其中一些可能是abcderian(按字母顺序出现的)。我们编写一个函数is_abecedarian来检查给定的单词是否为abcderian:

def is_abecedarian(input_word):

index = 0

for letter in input_word[0:-1]:

if ord(input_word[index]) > ord(input_word[index + 1]):

return False

else:

index += 1

return True

现在,我们想将函数应用于单词列表,并创建一个将包含True和False值的新列表,以表明某些单词是否确实是abcderian。

下面方法涉及初始化一个新列表,然后使用for循环遍历列表元素:

value_list = []

for item in test_list:

value = is_abecedarian(item)

value_list.append(value)

输出:

[True, False, False, False, True, False, False, False, True, False]

如果用map(),我们可以将上面的代码简化为一个简洁的小代码:

map(is_abecedarian, test_list)

请注意map()不会返回列表,而是返回一个map对象。

译者注:map()函数在python2中返回的是列表。

你可能很好奇哪个词实际上是abcderian的字母-让我们编写这个问题的答案:

for item in test_list:

if is_abecedarian(item):

print(f"The word '{item}' is abecedarian. :)")

else:

print(f"The word '{item}' is not abecedarian. (")

输出:

The word 'effort' is abecedarian. :)

The word 'circle' is not abecedarian.

The word 'yearly' is not abecedarian.

The word 'woolen' is not abecedarian.

The word 'accept' is abecedarian. :)

The word 'lurker' is not abecedarian.

The word 'island' is not abecedarian.

The word 'faucet' is not abecedarian.

The word 'glossy' is abecedarian. :)

The word 'evader' is not abecedarian.

我们还可以用可视化的方式形象地解释,以帮助您更好地理解它:

这张图也有助于定义 map 和mapping-我们可以使用Allen B. Downey在他的《Think Python》书中提供的定义:

映射操作(map):一种遍历一个序列并对每个元素执行操作的处理模式。

映射(mapping):一个集合中的每个元素对应另一个集合中的一个元素的关系

将map()转换为列表,元组和集合

由于map()不返回列表/元组/集合,因此我们需要采取额外的步骤来转换生成的map对象:

def capitalize_word(input_word):

return input_word.capitalize()

map_object = map(capitalize_word, ['strength', 'agility', 'intelligence'])

test_list = list(map_object)

print(test_list)

map_object = map(capitalize_word, ['health', 'mana', 'gold'])

test_set = set(map_object)

print(test_set)

map_object = map(capitalize_word, ['armor', 'weapon', 'spell'])

test_tuple = tuple(map_object)

print(test_tuple)

输出:

['Strength', 'Agility', 'Intelligence']

{'Mana', 'Health', 'Gold'}

('Armor', 'Weapon', 'Spell')

将map()与Lambda表达式结合

Lambda表达式是对我们的工具库的一个很好的补充:将Lambda表达式与map()代码相结合可使您的Python程序更小,更精确。

Lambda表达式可以创建匿名函数,即未约定特定标识符的函数。相反,通过def关键字创建函数会将函数绑定到其唯一标识符(例如def my_function创建标识符my_function)。

但是,lambda表达式也有一系列限制:它们每个只能做一件事情,只能在一个地方使用,通常与其他功能结合使用。我们看看lambda表达式如何map()同时使用:

cities = ["caracas", "bern", "oslo", "ottawa", "bangkok"]

def capitalize_word(input_word):

return input_word.capitalize()

capitalized_cities = map(capitalize_word, cities)

更简洁的版本:

cities = ["caracas", "bern", "oslo", "ottawa", "bangkok"]

capitalized_cities = map(lambda s: s.capitalize(), cities)

需要注意:map()和lambda表达式提供了凝聚多行代码成一行的能力。

尽管此功能非常出色,但我们需要牢记编程的黄金法则之一:代码读取比写入更频繁。这意味着map()和lambda表达式都可以提高代码的简洁性,但是却牺牲了代码的清晰度。遗憾的是,对于代码的可读性,实际上并没有明确的指导方针- 随着编程经验的增长,大家将逐渐明白这一点。

使用map()遍历字典

map()也非常适合遍历字典

假设有一个包含苹果,梨和樱桃价格的字典,我们需要通过应用15%的折扣来更新价格表。方法如下:

price_list = {

"pear": 0.60,

"cherries": 0.90,

"apple": 0.35,

}

def calulates_discount(item_price):

return (item_price[0], round(item_price[1] * 0.85, 2))

new_price_list = dict(map(calulates_discount, price_list.items()))

输出:

{'pear': 0.51, 'cherries': 0.77, 'apple': 0.3}

将map()与Lambda表达式组合遍历字典

当开始组合多个功能时,编程特别有趣,一个很好的例子是map()配合使用和lambda表达式来遍历字典。在下面的代码中,我们初始化字典列表,并将每个字典作为参数传递给lambda函数。

list_of_ds = [{'user': 'Jane', 'posts': 18}, {'user': 'Amina', 'posts': 64}]

map(lambda x: x['user'], list_of_ds) # Output: ['Jane', 'Amina']

map(lambda x: x['posts'] * 10, list_of_ds) # Output: [180, 640]

map(lambda x: x['user'] == "Jane", list_of_ds) # Output: [True, False]

map()替代方法:列表解析

像所有技术/产品/方法等等一样,一些Python开发人员认为map()函数在某种程度上不是Python风格(即未遵循应如何构建Python程序的精神和设计理念)。他们建议改用列表解析,比如:

map(f, iterable)

变成

[f(x) for x in iterable]

在速度和性能方面,map()与列表理析大致相等,因此不可能看到执行时间显着减少 - 经验丰富的Python开发者Wesley Chun在其演讲Python 103:Memory Model&Best Practices中解决了这个问题,有兴趣的同学可移步:

https://conferences.oreilly.com/oscon/oscon2013/public/schedule/detail/29374

By Denis Kryukov

本文由博客一文多发平台 OpenWrite 发布!

python中map函数运行原理_Python中map函数的解释和可视化相关推荐

  1. python中嵌套循环的运行原理_python中while嵌套循环的执行流程问题?

    1. while x < 3: print("x的当前值为%d" % x) y = 0 while y < 3: print("y的当前值为%d" ...

  2. Python基础_第5章_Python中的数据序列

    Python基础_第5章_Python中的数据序列 文章目录 Python基础_第5章_Python中的数据序列 Python中的数据序列 一.字典--Python中的==查询==神器 1.为什么需要 ...

  3. Python基础_第3章_Python中的循环结构

    Python基础_第3章_Python中的循环结构 文章目录 Python基础_第3章_Python中的循环结构 Python中的循环结构 一.回顾分支练习题 1.判断是否为一个合法三角形 2.求世界 ...

  4. python中all函数的用法_python中map、any、all函数用法分析

    这篇文章主要介绍了 python 中 map . any . all 函数用法 , 实例分析了 map . any . all 函数 的相关使用技巧 , 具有一定参考借鉴价值 , 需要的朋友可以参考下 ...

  5. python中sorted函数的用法_Python中map,reduce,filter和sorted函数的使用方法

    map map(funcname, list) python的map 函数使得函数能直接以list的每个元素作为参数传递到funcname中, 并返回响应的新的list 如下: def sq(x): ...

  6. python中map的返回值_python中map函数是什么?怎么用?

    下面给大家介绍关于map函数的使用,给大家分为几大实用类型模块,具体内容请看下文哦~ map()函数简介 Python 的map()方法,作为输入提供的迭代器的所有元素应用函数. 例如,迭代器可以是列 ...

  7. python中map用法详解_Python:map函数用法详解

    一个简单的例子:将一个list中所有元素平方,常规的做法如下图所示,虽然实现了这个功能,但并没有给人一目了然的感觉.若换成map来实现,则会好很多. 常规方法 map函数 1.map函数介绍及其简单使 ...

  8. python中迭代器的实现原理_Python 进阶应用教程

    Python 中的迭代器实现原理 在数学中,集合表示由一个或多个确定的元素所构成的整体.在 Python 中,列表.元组.集合可以用于表示数学中的集合. 例如,分别使用列表.元组.集合表示了一个包含 ...

  9. python匿名函数的作用_Python中的匿名函数及递归思想简析

    匿名函数 前言 上次咱们基本说了一下函数的定义及简单使用,Python中的基本函数及其常用用法简析,现在咱们整点进阶一些的.同样都是小白,咱也不知道实际需要不,但是对于函数的执行顺序以及装饰器的理解还 ...

最新文章

  1. 堆实战(动态数据流求top k大元素,动态数据流求中位数)
  2. C++基本序列式容器 vector (一)
  3. 表空间迁移(transport tablespace)测试案例
  4. java连接phpstudy_PHPStudy快速自动搞定所有配置文件
  5. pthread_once()
  6. webstorm 创建react组件_webstorm的下载以及React环境搭建
  7. 正确理解 AsyncTask,Looper,Handler三者之间的关系(基于android 4.0)
  8. linux中找到最耗CPU的那段Java代码
  9. 【分治】LeetCode 50. Pow(x, n)
  10. SQL Server 视图 语句
  11. Eviews做ARIMA模型
  12. Word在生成PDF后,PDF左侧导航书签没有目录
  13. H.264之几种开源解码器的对比评测
  14. day10、2 - 小小综合实验升级
  15. 让你的工作更高效!快来看看如何使用内网穿透
  16. Spring Cloud Alibaba
  17. HZNUOJ 2689 阅兵
  18. 【Hack The Box】windows练习-- Silo
  19. 心跳之旅——iOS用手机摄像头检测心率(PPG)
  20. excel切片器_给我1分钟,让你的Excel表格好看些,再好看些!

热门文章

  1. java I/O思维导图
  2. LeetCode Rotate Image(矩阵的旋转)
  3. Java中的初始化顺序
  4. 网络编程学习笔记(shutdown函数)
  5. 题目1164:旋转矩阵
  6. base64格式的图片上传阿里云
  7. 苹果 的硬件架构和普通PC有区别吗? 有什么区别?
  8. 学习lulu之——tips 提示
  9. 封装CoreGraphics的API简化绘图操作
  10. 通过圆的颜色并结合霍夫变换检测目标圆的OpenCV代码