Python之条件与循环
# 一、条件语句
先来看一个简单的示例,如下:
if x > 0:
x = 1
else:
x = 0
2
3
4
这就是一个简单的条件语句,旨在判断 x 的值,如果大于 0,将 x 重新赋值为 1,反之赋值为 0。值得注意的是,在 python 中条件是不需要括号包起来的,如下是不允许的:
if (x>1):
.....
2
还有一点,那就是条件语句的条件后是需要加":",这是 python 的语法要求。
在 python 中是没有 switch 语句的,如果需要实现类似的效果就需要 if...elif...else 来实现,如下:
if id = 1:
print("登录1")
elif id = 2:
print("登录2")
elif id = 3:
print("登录3")
else:
print("不存在")
2
3
4
5
6
7
8
条件语句是顺序执行的,也就是说如果 id=1 满足要求,则后续的 id=2 等等就不再执行,反之,就会执行下面的 elif 语句,直到条件满足,如果所有的 elif 语句都不满足,则最后执行 else 语句。
注意:if 语句是可以单独使用的,但是 elif 和 else 都必须和 if 配对。
在实际运用中,我们还会使用如下的写法:
if a:
....
2
这种省略用法 a 的结果是 True 或者 False,一般是满足如下要求:
数据类型 | 数据结果 |
---|---|
String | 空字符串为 False,其他为 True |
Int | 0 为 False,其他为 True |
Bool | True 为 True,False 为 False |
List/Tuple/Dic/Set | 空为 False,其他为 True |
Object | null 为 False,其他为 True |
在实际应用中,建议除了 Bool 类型的,其他的都建议写完整表达式,这样更直观的显示输出,方便调试。
# 二、循环语句
循环语句的本质上是遍历集合中的元素,python 中的循环有 for 和 while 循环,如下示例:
li = [1,2,3,4]
for i in li:
print(i)
j = 0
while j < len(li):
print(j)
2
3
4
5
6
7
在 python 中,只要数据结构是可迭代的(interable),比如列表、集合,都可以使用以下方面来遍历元素:
for i in [1,2,3,4]:
print(i)
for j in (5,6,7,8):
print(j)
2
3
4
5
需要注意的是:如果是字典,字段的键本身是可迭代的,所以直接循环得到是键而不是值,如果需要得到键值对,就需要其内置方法 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
我们也可以通过集合中的索引来获取数据,这时候我们通常会使用 range()函数来获取索引,拿到索引,再去获取元素,如下:
li = [1,2,3,4]
for i in range(len(li)):
print(li[i])
2
3
当我们同时需要索引和元素的时候,还可以借助 python 的内置函数 enumerate(),用来遍历集合,不仅返回元素,还返回索引,如下:
li = [1,2,3,4,5]
for i, v in enumerate(li):
... print(i,v)
...
0 1
1 2
2 3
3 4
4 5
2
3
4
5
6
7
8
9
在循环中,我们通常会搭配 break,continue 来使用。continue 是让程序跳出当前循环,继续执行下一次循环,break 是让程序结束循环。如下示例:
## name_price: 产品名称 (str) 到价格 (int) 的映射字典
## name_color: 产品名字 (str) 到颜色 (list of str) 的映射字典
name_price = {'a': 999, 'b': 1999}
name_color = ('a': 'red', 'b': 'yellow')
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))
2
3
4
5
6
7
8
9
10
11
12
13
14
15
前面讲了很多 for 循环,其实 while 循环也是一样的,for 和 while 循环有时候是可以相互转换的,但是它们也有各自的使用场景,如下:
如果只是遍历一个已知的集合找出满足条件的元素,并进行相应的操作,这时候使用 for 循环更加简洁。但是如果是不断的循环执行操作直到一个条件结束循环或者不断的循环则用 while 循环。如下示例使用 while 循环:
while True:
try:
text = input('Please enter your questions, enter "q" to exit')
if text == 'q':
print('Exit system')
break
...
...
print(response)
except as err:
print('Encountered error: {}'.format(err))
break
2
3
4
5
6
7
8
9
10
11
12
13
for 和 while 的效率比较,如下示例:
## for 循环
for i in range(0,10000):
print(i)
## while 循环
j = 0
while j < 10000:
print(i)
j += 1
2
3
4
5
6
7
8
9
上面两种使用方式达到的效果是一样的,但是对于 for 循环,由于 range()函数是直接调用 C 语言写的,调用它的速度非常快,而对于 while 循环,循环中的 j+=1 是需要通过 python 解释器去调用底层的 C 语言,并且这个表达式又涉及对象的创建和删除,因为 j 是整型,j+=1 相当于 j = new int(j + 1),所以 for 循环会快一些。
# 三、条件和循环的复用
我们经常会看到一些循环和条件代码并为一行的操作,如下:
expression1 if condition else expression2 for item in iterable
上面这个例子等同于:
for item in iterable:
if condition:
expression1
else:
expression2
2
3
4
5
如果没有 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]
再比如,我们要处理文本字符串时,将文本逐行读出,然后按都好分割单词,去掉首尾的空字符串,并过滤长度小于 3 的单词,再返回单词组的列表,如下:
text = ' Today, is, Sunday'
text_list = [s.strip() for s in text.split(',') if len(s.strip()) > 3]
print(text_list)
['Today', 'Sunday']
2
3
4
当然,这样的复用不局限一个循环,比如,给定两个列表 x,y,需要返回所有 x,y 的元素对组成的元组,相等情况除外,可以用以下方式:
[(xx, yy) for xx in x for yy in y if xx != yy]
# 四、总结
(1)、在条件语句中,if 语句可以单独执行,而 elif 和 else 必须和 if 配对使用,而 if 语句的判断,除了 bool 类型的,其他的都建议显示判断;
(2)、在 for 循环中,如果需要同时获得索引和值,可以使用 enumerate()函数来简化代码;
(3)、写条件循环的时候,合理利用 continue 和 break,可以很大程度上简化代码;
(4)、要注意条件与循环的复用,简单功能往往可以用一行直接完成,极大的提高代码质量和效率。
作者:
本文链接:https://jokerbai.com
版权声明:本博客所有文章除特别声明外,均采用 署名-非商业性-相同方式共享 4.0 国际 (CC-BY-NC-SA-4.0) 许可协议。转载请注明出处!
- 02
- 使用Zadig从0到1实现持续交付平台07-19
- 03
- 基于Jira的运维发布平台07-19