Python条件和循环

2019-06-18  本文已影响0人  慕慕她爸

写一手简洁易读的条件与循环代码,对提高程序整体的质量至关重要。

条件语句

在进行条件判断时,不少人喜欢省略判断条件,写成下面的格式

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]
上一篇 下一篇

猜你喜欢

热点阅读