条件与循环的复用
你好,我是悦创。
前面两部分讲了条件与循环的一些基本操作,接下来,我们重点来看它们的进阶操作,让程序变得更简洁高效。
在阅读代码的时候,你应该常常会发现,有很多将条件与循环并做一行的操作,例如:
expression1 if condition else expression2 for item in iterable
将这个表达式分解开来,其实就等同于下面这样的嵌套结构:
for item in iterable: if condition: expression1 else: expression2
而如果没有 else 语句,则需要写成:
expression for item in iterable if condition
举个例子,比如我们要绘制 y = 2*|x| + 5 的函数图像,给定集合 x 的数据点,需要计算出 y 的数据集合,那么只用一行代码,就可以很轻松地解决问题了:
y = [value * 2 + 5 if value > 0 else -value * 2 + 5 for value in x
再比如我们在处理文件中的字符串时,常常遇到的一个场景:将文件中逐行读取的一个完整语句,按逗号分割单词,去掉首位的空字符,并过滤掉长度小于等于 5 的单词,最后返回由单词组成的列表。这同样可以简洁地表达成一行:
text = ' Today, is, Sunday' text_list = [s.strip() for s in text.split(',') if len(s.strip()) > 5] print(text_list) ['Today', 'Sunday']
当然,这样的复用并不仅仅局限于一个循环。比如,给定两个列表 x、y,要求返回 x、y 中所有元素对组成的元祖,相等情况除外。那么,你也可以很容易表示出来:
[(xx, yy) for xx in x for yy in y if xx != yy]
这样的写法就等价于:
l = [] for xx in x: for yy in y: if xx != yy: l.append((xx, yy))
熟练之后,你会发现这种写法非常方便。当然,如果遇到逻辑很复杂的复用,你可能会觉得写成一行难以理解、容易出错。那种情况下,用正常的形式表达,也不失为一种好的规范和选择。
总结
-
在条件语句中,if 可以单独使用,但是 elif 和 else 必须和 if 同时搭配使用;而 If 条件语句的判断,除了 boolean 类型外,其他的最好显示出来。
-
在 for 循环中,如果需要同时访问索引和元素,你可以使用 enumerate() 函数来简化代码。
-
写条件与循环时,合理利用 continue 或者 break 来避免复杂的嵌套,是十分重要的。
-
要注意条件与循环的复用,简单功能往往可以用一行直接完成,极大地提高代码质量与效率。