当前位置: 首页 > 后端技术 > Python

Python中map函数的解释和可视化

时间:2023-03-26 01:18:28 Python

让我们回顾一下Iteration、iterable、iterator的概念:Iteration是计算机科学中的一个通用术语,指的是对一组元素执行操作,一次一个元素。一个很好的例子是循环-它适用于每个单独的项目,直到整个项目集运行完毕。Iterable是可以遍历的对象(译者注:Python中一切都是对象,变量、容器、类等),iterable是可以生成迭代器的对象。迭代器是表示数据流的对象,它一次返回一个元素的数据。它还会记住它在迭代期间的位置。本质上,它控制着迭代器应该如何被迭代。map()用法map()函数迭代地将提供的功能应用于每个项目,结果是一个地图对象,它是一个迭代器。语法:map(func,*iterables)如果没有map(),我们将不得不编写复杂的代码来在多个项目上“循环”一个给定的函数。做一个简洁的小实验:我们有一个包含10个单词的列表。test_list=["effort","circle","yearly","woolen","accept","lurker","island","faucet","glossy","evader"]我们怀疑其中一些可能是abcderian(按字母顺序排列)。我们写了一个函数is_abecedarian来检查给定的单词是否是abcderian:defis_abecedarian(input_word):index=0forletterininput_word[0:-1]:iford(input_word[index])>ord(input_word[index+1]):returnFalseelse:index+=1returnTrue现在,我们要将函数应用于单词列表并创建一个新列表,该列表将包含True和False值以指示某些单词是否确实是abcderian。以下方法涉及初始化一个新列表,然后使用for循环遍历列表元素:value_list=[]foritemintest_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()不返回列表,但是一个地图对象。译者注:在python2中map()函数返回的是一个列表。你可能很好奇哪个词实际上是一个初学者字母——让我们写下这个问题的答案:foritemintest_list:ifis_abecedarian(item):print(f"Theword'{item}'isabecedarian.:)")else:print(f"'{item}'这个词不是初学者。(")“羊毛”这个词不是初学者。“接受”这个词是初学者的。:)“潜伏者”这个词不是初学者。“岛”这个词不是初学者。“水龙头”这个词不是初学者。“有光泽”这个词是初学者的。:)“逃避者”这个词不是初学者。我们也可以形象地解释一下,帮助大家更好的理解:这张图也有助于定义map和mapping——我们可以使用B.Downey在他的书中提供的AllenDefinition《Think Python》:Mapoperation(map):Aprocessingpatternthattraversees一个序列并对每个元素执行操作。映射:一个集合中的每个元素对应另一个集合中的元素的关系将map()转换为列表、元组和集合由于map()不返回列表/元组/集合,我们需要采取额外的步骤来转换结果地图对象:defcapitalize_word(input_word):returninput_word.capitalize(),['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)output:['Strength','Agility','Intelligence']{'Mana','Health','Gold'}('Armor','Weapon','Spell')组合map()使用Lambda表达式Lambda表达式是对我们武器库的重要补充:将Lambda表达式与map()代码相结合可以使您的Python程序更小、更高效、更准确。Lambda表达式可以创建匿名函数,即不同意特定标识符的函数。相反,通过def关键字创建函数会将函数绑定到它的唯一标识符(例如defmy_function创建标识符my_function)。然而,lambda表达式也有一些局限性:它们每个只能做一件事并且只能用在一个地方,通常与其他函数结合使用。看看lambda表达式map()是如何同时使用的:cities=["caracas","bern","oslo","ottawa","bangkok"]defcapitalize_word(input_word):returninput_word.capitalize()capitalized_cities=map(capitalize_word,cities)的更简洁版本:cities=["caracas","bern","oslo","ottawa","bangkok"]capitalized_cities=map(lambdas:s.capitalize(),cities)需要注意:map()和lambda表达式提供了将多行代码压缩为一行的能力。虽然这个功能很棒,但我们需要牢记编程的黄金法则之一:阅读代码的次数多于编写代码的次数。这意味着map()和lambda表达式都可以提高代码的简洁性,但会牺牲代码的清晰度。不幸的是,对于代码可读性确实没有明确的指导方针——随着你的编程经验的增长,你会逐渐理解这一点。使用map()迭代字典map()也非常适合迭代字典假设有一个包含苹果、梨和樱桃价格的字典,我们需要通过应用15%的折扣来更新价目表。方法如下:price_list={"pear":0.60,"cherry":0.90,"apple":0.35,}defcalculates_discount(item_price):return(item_price[0],round(item_price[1]*0.85,2))new_price_list=dict(map(calculates_discount,price_list.items()))output:{'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(lambdax:x['user'],list_of_ds)#输出:['Jane','Amina']map(lambdax:x['posts']*10,list_of_ds)#输出:[180,640]map(lambdax:x['user']=="Jane",list_of_ds)#输出:[True,False]map()备选方案:列表理解Python程序应该如何构建的设计哲学)。他们建议改用列表推导,例如:map(f,iterable)变成[f(x)forxiniterable]在速度和性能方面,map()大致等于列表推导,所以看不到执行时间大幅减少——经验丰富的Python开发者WesleyChun在演讲Python103:MemoryModel&BestPractices中解决了这个问题,感兴趣的同学可以移步:https://conferences.oreilly.c...ByDenisKryukovhttps://blog。soshace.com/pyth...本文由博客多发帖平台OpenWrite发布!