Python条件和循环
写一手简洁易读的条件与循环代码,对提高程序整体的质量至关重要。
条件语句
在进行条件判断时,不少人喜欢省略判断条件,写成下面的格式
if s:
xxx
关于省略判断条件的常见用法,有如下总结:
数据类型 | 结果 |
---|---|
string | 空字符串解析为False,其余为True |
int | 0解析为False,其余解析为True |
Bool | True解析为True,False解析为False |
list/tuple/dict/set | iterable为空解析为False,其余解析为True |
Object | None解析为False,其余为True |
不过,在实际工程当中,我们建议除了boolean类型的数据,判断条件最好是显式的,而不是只写出变量名,这样方便我们写出好的判断。
循环语句
遍历可迭代的(iterable)数据结构,比如列表、集合,可以通过下面的方式
for item in <iterable>:
...
对于字典只有键是可以迭代的,如果要遍历它的值或者是键值对,需要通过内置的函数values()或者items()实现。其中,values()返回字典的值得集合,items()返回键值对的集合。
>>> d = {'name': 'jason', 'dob': '2000-01-01', 'gender': 'male'}
>>> for k in d:
... print(k)
...
name
dob
gender
>>> for v in d.values():
... print(v)
...
jason
2000-01-01
male
>>> for k, v in d.items():
... print('key: {},value: {}'.format(k, v))
...
key: name,value: jason
key: dob,value: 2000-01-01
key: gender,value: male
使用range()函数,拿到索引,再去遍历访问集合中的元素。
>>> l = [1, 2, 3, 4, 5, 6, 7]
>>> for index in range(0, len(l)):
... if index < 5:
... print(l[index])
...
1
2
3
4
5
当我们要同时索引和元素时,可以通过python内置的函数enumerate()。用它可以来遍历集合,不仅可以返回每个元素,并且返回其对应的索引。
>>> l = [1, 2, 3, 4, 5, 6, 7]
>>> for index, item in enumerate(l):
... if index < 5:
... print(item)
...
1
2
3
4
5
循环语句中,continue和break
continue久石让程序跳过当前这层循环,继续执行下面的循环;
break就是完全跳出所在的整个循环体
可以看下面一个简单的实例
# cat continue_1.py
# 我们要找出价格小于1000,并且颜色不是红色的所有产品名称和颜色的组合。
# name_price: 产品名称(str) 到价格(int) 的映射字典
# name_color: 产品名字(str) 到颜色(list of str)的映射字典
for name, price in name_price.items():
if price >= 1000:
continue
if name not in name_color:
print('name: {}, color: {}'.format(name, 'None'))
continue
for color in name_color[name]:
if color == 'red'
continue
print('name: {}, color: {}'.format(name, color))
for循环和while循环可以互相转换,下面是一个while循环的例子.
>>> l = [1, 2, 3, 4]
>>> index = 0
>>> while index < len(l):
... print(l[index])
... index += 1
...
1
2
3
4
遍历一个已知集合,找出满足条件的元素并且做出对应操作,使用for循环即可。
如果是需要在满足某个条件之前,需要不停地重复操作,并且没有特定的集合需要去遍历,一般使用while循环。
条件和循环的复用
讲很多条件和循环并做一行操作
expression1 if condition else expression2 for item in iterable
上面的示列分解开来就是下面的嵌套结构
for item in iterable:
if condition:
expression1
else:
expression2
给定集合x的数据点,计算y = 2*|x| + 5的数据集合
y = [value * 2 + 5 if value > 0 else -value * 2 + 5 for value in x]
将文件中逐行读取一个完整语句,按照逗号分隔单词,去掉首行的空字符,并且过滤掉长度小于等于3的单词,最后返回由单词组成的列表。
>>> text_list = [s.strip() for s in text.split(',') if len(s.strip()) > 3]
>>> print(text_list)
['Todya', '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))
思考题
有两个列表a和b,要求针对b中每一组子列表value,输出其和a中的键对应后的字典,最后返回字典组成的列表。
a = ['name', 'dob', 'gender']
b = [['jason', '2000-01-01', 'male'],
['mike', '1999-01-01', 'male'],
['nancy', '2001-02-01', 'female']
]
# expected outout:
[{'name': 'jason', 'dob': '2000-01-01', 'gender': 'male'},
{'name': 'mike', 'dob': '1999-01-01', 'gender': 'male'},
{'name': 'nancy', 'dob': '2001-02-01', 'gender': 'female'}]
多行实现
>>> for value in b:
... d = {}
... for i in range(3):
... d[a[i]] = value[i]
... l.append(d)
一行实现
[dict(zip(a, v)) for v in value b]