作为语言中最具代表性的_Pythonic_语法之一,我相信每个人都听说过或已经使用过列表理解法。

但是你知道吗,在这门语言中还有三种类型的理解式?

在这篇文章中,我将讨论什么是_Python_中的理解式,以及为什么要使用它们。我还将讨论什么情况下使用理解式会对代码的可读性产生不利影响。

什么是 Python 中的理解力?

从本质上讲,_Python_中的理解力是一种语法,用于通过对另一个迭代对象进行操作来创建一个新的序列。

在_Python_中有四种类型的理解力。

  1. 列表理解
  2. Dict 汇编
  3. 集合理解法
  4. 生成器理解

大多数初学者对理解力有一个常见的误解,那就是初始迭代对象需要和理解力的类型相同。然而,情况并非如此,例如,如果你正在使用一个_dict编译器_,那么初始迭代器也可以是一个列表。

名称中提到的类型是指从理解力中返回的序列的类型。

为什么要在 Python 中使用理解力?

我们在代码中使用理解力,因为使用它更具有_Python 的_特点,也更具有可读性。然而,在某些情况下使用它们时需要小心,因为有些时候它们会产生相反的效果。

列表理解

列表_理解是_Python 中最常见的理解类型,它遵循简单的语法。

# Not using conditional in list comprehension.
[<expression> for <variable> in <iterable>]# Using standard condition in list comprehension.
[<expression> for <variable> in <iterable> if <condition>]# Using if and else in a list comprehension.
[<expression>  if <condition> else <expression> for <variable> in <iterable>]

正如我们在这里看到的,条件是完全可选的,但是如果你使用它,取决于你是否使用_else_子句,它在_列表_理解中的位置将发生变化。

我们还可以看到,它们非常容易使用,在减少for循环的使用方面相当方便,使代码更加简洁。

掌握它的最好方法是自己玩玩它们,了解它们的限制。下面是一个真实的使用例子,给你一个概念。

original_list = ["hello", "and", "welcome", "to", "list", "comprehensions"]# Not using conditional in list comprehension.
new_list = [item.capitalize() for item in original_list]
print(new_list)
# ['Hello', 'And', 'Welcome', 'To', 'List', 'Comprehensions']# Using standard condition in list comprehension.
new_list = [item.capitalize() for item in original_list if item not in ["and", "to"]]
print(new_list)
# ['Hello', 'Welcome', 'List', 'Comprehensions']# Using if and else in a list comprehension.
new_list = [item.capitalize() if item not in ["and", "to"] else item for item in original_list]
print(new_list)
# ['Hello', 'and', 'Welcome', 'to', 'List', 'Comprehensions']

Dict理解

正如我前面提到的,理解力名称中提到的_类型_是指它所创建的序列的类型,而不是理解力中使用的迭代器的类型。

head -n 10 us.txtThe syntax for a dictionary comprehension is:
new_dictionary = {<key>:<value> for <item> in <iterable> if <condition>}

再说一次,这里的条件是可选的。

你可以在许多不同的场景中使用它,例如,设想你希望能够根据员工在公司中的职位来比较所获得的工资,而你有一长串的字典,包含了每个员工的各种信息。

事实上,你也许可以用它来工作,但如果你只关心职位和工资,那么有很多信息是不需要的,因此我们可以用字典理解法来轻松地创建一个只包含我们想要的信息的新字典。

employee_list = [{'name': 'Peter','surname': 'Pan','position': 'Full-stack Developer','salary': 60000},{'name': 'Molly','surname': 'Weasley','position': 'Front-End Developer','salary': 50000},{'name': 'Harry','surname': 'Potter','position': 'Data Scientist','salary': 55000},{'name': 'Hermione','surname': 'Granger','position': 'Data Engineer','salary': 50000},{'name': 'Ronald','surname': 'Weasley','position': 'Junior Developer','salary': 40000}
]# Dict Comprehension without condition.position_dict = {position['position']: position['salary'] for position in employee_list}
print(position_dict)
# {'Full-stack Developer': 60000, 'Front-End Developer': 50000, 'Data Scientist': 55000, 'Data Engineer': 50000, 'Junior Developer': 40000}# Dict Comprehension with condition.position_dict = {position['position']: position['salary'] for position in employee_list if "Developer" in position['position']}
print(position_dict)
# {'Full-stack Developer': 60000, 'Front-End Developer': 50000, 'Junior Developer': 40000}

正如你在上面所看到的,我们可以用一个字典的理解力在一行中非常容易和干净地实现这个目标*。*

集合理解

_集合_理解的功能与_列表_理解类似,只是它具有集合的所有优点,即集合中的项目不能重复,而且数值不按顺序排列。

除了使用大括号而不是方括号外,它还使用了与_列表_理解类似的语法。

# Not using conditional in set comprehension.
{<expression> for <variable> in <iterable>}# Using standard condition in set comprehension.
{<expression> for <variable> in <iterable> if <condition>}# Using if and else in a set comprehension.
{<expression>  if <condition> else <expression> for <variable> in <iterable>}

在有些时候,这可能是有用的,但是你必须记住要小心,因为如果需要对结果进行排序的话,集合的有利方面可能会导致问题,如下所示。


original_list = ["hello", "and", "welcome", "to", "set", "comprehensions", "set", "comprehensions"]# Not using conditional in set comprehension.
new_set = {item.capitalize() for item in original_list}
print(new_set)
# {'To', 'Hello', 'Set', 'And', 'Welcome', 'Comprehensions'}# Using standard condition in set comprehension.
new_set = {item.capitalize() for item in original_list if item not in ["and", "to"]}
print(new_set)
# {'Set', 'Comprehensions', 'Hello', 'Welcome'}# Using if and else in a set comprehension.
new_set = {item.capitalize() if item not in ["and", "to"] else item for item in original_list}
print(new_set)
# {'Hello', 'Set', 'and', 'to', 'Welcome', 'Comprehensions'}

生成器理解法

生成器_理解是我们在_Python 中最不为人所知的理解类型。

_生成器_是一个返回对象(迭代器)的函数,我们可以逐个迭代,它是Python中一种独特的语法,通常由一个带有yield关键字的函数生成。

生成器的语法和其他所有的语法一样简单。

# Not using conditional in generator comprehension.
(<expression> for <variable> in <iterable>)# Using standard condition in generator comprehension.
(<expression> for <variable> in <iterable> if <condition>)# Using if and else in a generator comprehension.
(<expression>  if <condition> else <expression> for <variable> in <iterable>)

使用生成器的好处是,我们可以通过使用内置的函数**next()**来一步步地对它进行迭代。

generator = (i*2 if i%2 else i**2 for i in range(0,10))
for _ in range(10):print(next(generator), end=' ')# 0 2 4 6 16 10 36 14 64 18 

什么时候不应该使用编译器?

在阅读了这里的所有内容之后,似乎不需要考虑总是使用理解式,对吗?

其实不然。

python中的理解式可以用上述所有的方式来创建可读的代码,但是当我们使用_嵌套_的理解式时,我们需要小心,因为它可能导致代码的可读性变差。

嵌套式理解力

_嵌套_式理解是一个术语,我们用来指在其他理解中进行的理解。

虽然这是一个非常强大的功能,但它也会在可读性方面产生相反的效果。

例如,下面的两个脚本都创建了下面的金字塔。

# method 1for row in range(0, number_of_rows):for _ in range(0, row + 1):print("#", end='')print("\n")    # Method 2print('\n'.join([''.join(['#' for _ in range(1, row + 1)]) for row in range(0, number_of_rows)]))
#
##
###
####
#####
######
#######

我们可以看到,虽然这是一个相当基本的例子,但如果没有嵌套的理解力,它的可读性已经很高了,而且随着复杂性的增加,用这些来保持可读性就越难。

通过这篇文章和对理解性的理解,我们不能完全理解它们给语言带来的力量,但同时,我们需要注意不要滥用它们,因为当逻辑不简单的时候,很快就会对可读性产生不利影响。

每当我自己开始嵌套理解力时,我总是喜欢记住这句简单的话。

代码应该解释注释,而不是由注释来解释代码。

然后再决定是否最好把逻辑写出来,而不写理解性。

使用理解力的好处在于,如果使用得当,它可以帮助你产生高效的可读代码。

我希望你喜欢阅读并继续学习

关于Python技术储备

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

朋友们如果需要这份完整的资料可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】

一、Python学习大纲

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

二、Python必备开发工具

三、入门学习视频

四、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

五、python副业兼职与全职路线

Python理解力是什么?为什么要使用它们?相关推荐

  1. Python 中的理解力。它们是什么?为什么要使用它们?

    作为语言中最具代表性的Pythonic语法之一,我相信每个人都听说过或已经使用过列表理解法. 但是你知道吗,在这门语言中还有三种类型的理解式? 在这篇文章中,我将讨论什么是Python中的理解式,以及 ...

  2. 年底送点福利,包邮送55本!Python、大数据、人工智能任你挑!

    有名人说过:"说不清是哪本书影响了我的追求和命运,唯有感恩,感恩于那个时候读到的每一本书." 在此给大家送一波福利,这次联系了好友一起给各位送书,每个号送 5本,还包邮哦,具体书籍 ...

  3. 包邮送书 | 中科院博士推荐的50本高质量Python、数据分析书籍

    阿广来给大家送一波福利,这次联系了 9个好友一起给各位送书,每个号送 5本,一共 50本,还包邮哦,具体书籍种类.介绍信息文中有详细介绍,确实是几本精选书籍.这10个公众号,也是在Python.AI. ...

  4. 为增进理解力而奋斗终身

    一 我记得小时候自己总会有很多想不明白的问题,等慢慢长大了,答案才开始逐个明了. 比如小时候我总会不停的问老大,电视里的那谁谁是不是坏人,那谁谁又是不是好人,我已经忘记老大怎么回答了,但是这个问题我一 ...

  5. python学习手册翻译很差吗-为什么要翻译?值得坚持下去么?

    自从去年 12 月翻译了第一篇文章以来,我累计翻译了 14 篇文章. 这个数字说多不多,说少也不少,本来没有什么特殊意义,但是在阶段性回顾时,却显得耐人寻味--勉强可以凑出这个数字:1.55555 篇 ...

  6. 学习python课程_想学习Python吗? 这是我们的免费4小时互动课程

    学习python课程 Python is a popular, versatile and easy-to-learn language. It's the go-to language for AI ...

  7. python用字典统计单词出现次数_python - 如何使用字典理解来计算文档中每个单词的出现次数...

    我有一个用python编写的列表,其中充满了文本.就像每个文档中的固定单词.所以对于每个文档,我都有一个列表,然后在列表中列出所有文档. 所有列表只包含唯一的单词.我的目的是计算完整文档中每个单词的出 ...

  8. 薪资不如 Java、C,BAT 需求大,揭秘 Python 程序员跳槽现状!

    作者 | 雨蹊 本文经授权转载自100offer(ID:im100offer) 「人生苦短,快用Python」,这话曾是不少选择投入Python麾下的「码农」们的一句调侃和自我标榜. 与敏捷开发.大数 ...

  9. python自学-Python 应该怎么学?

    0714更新: 之前说过骆昊 (jackfrued) 的"从新手到大师"的百天之路!今天给大家分享一个主学习路线的干货图谱,话不多说,直接上图! 这个图谱是按照[专业基础][数据分 ...

最新文章

  1. VS-OpenCV三种加载图片的方式
  2. 【迁移学习(Transfer L)全面指南】基于迁移学习完成图像分类任务(Pytorch)
  3. 深度学习核心技术精讲100篇(二十七)-如何利用NLP技术对ASR的query文本进行预处理纠错?
  4. axios基础和封装
  5. java 字符串排列组合_Java 程序计算列出字符串的所有排列组合
  6. 浙江大学远程教育学院计算机考试,浙江大学远程教育学院机试题 Windows操作题(共15分,若有做错请酌情 ....docx...
  7. 【渝粤教育】 国家开放大学2020年春季 1009离散数学(本) 参考试题
  8. java学习(39):九九乘法表
  9. 上传本地项目到git
  10. 时间管理,从洗碗开始
  11. java getrequest_Java Target.getRequest方法代码示例
  12. struts文件上传 java_Struts上传文件
  13. 隐式类型转换与转换操作符operator T
  14. 《Algorithms》Comparable 实现选择排序
  15. 用svn进行多人合作开发
  16. 小程序二维码(扫描二维码到小程序页面)
  17. 2017 十款最佳iPhone渗透APP及工具
  18. CC2430基础——外部中断分析
  19. Linux 教你如何预防删库到跑路
  20. 通俗地讲一下庞加莱猜想是怎么回事(from 鼓浪)

热门文章

  1. linux文件描述符 0 1 2,文件描述符
  2. 掉价最快的手机排行榜_目前降价最厉害的四款手机,每款都是超高性价比,你入手了吗?...
  3. 改计算机高级设置吃鸡,吃鸡低配置怎么优化 绝地求生大逃杀低配置优化方法...
  4. 简约风博客bootstrap实现
  5. 这世上没有什么是理所当然的
  6. 蹭clubhouse热度加大IPO步伐,年轻的TT语音靠Z世代能掘金多少?
  7. 基于LabVIEW的虚拟电子琴设计
  8. 这个情人节如何过得不一样?快来看哪个国家才是全球浪漫目的地 | 美通社头条...
  9. “微天气”微信小程序实战开发过程
  10. [Effective Objective] 熟悉Objective-C