写点什么

十四、深入 Python 条件和循坏

用户头像
刘润森
关注
发布于: 2020 年 10 月 17 日
十四、深入Python条件和循坏

@Author:By Runsen


条件控制


简单来说:当判断的条件为真时,执行某种代码逻辑,这就是条件控制。


那么在讲条件控制之前,可以给大家讲一个程序员当中流传的比较真实的一个例子


说有一天一个程序员,他的媳妇让他去出去买两个包子,那出去之前,他媳妇这么跟他说的,说老公你出去给我买两个包子

,如果看见卖西瓜的就买一个回来。


结果这个程序员回来了,买一个包子。结果媳妇给他一顿揍。


然后问他为啥,你为啥就买一个包子回来?,他回答他媳妇说我看见了卖西瓜的,所以买了一个包子。


其实这个就是条件控制一个典型的,一个生活化的一个说明场景



条件语句


条件控制就是我们常见的的 if else


# y = |x|if x < 0:    y = -xelse:    y = x
复制代码

在条件语句后面加上 冒号:


python 不支持 switch 语句,但是支持 elif


if condition_1:    statement_1elif condition_2:    statement_2...elif condition_i:    statement_ielse:    statement_n
复制代码

不少人喜欢省略半段的条件,就像这样


if s: # s is a string    ...if l: # l is a list    ...if i: # i is an int    ...... 
复制代码



循环语句


一般通过 for 循环和 while 循环实现


l = [1, 2, 3, 4]for item in l:    print(item)1234
复制代码


在 python 数据结构只要时可迭代对象,如列表,集合,等等,就可以遍历

for item in <iterable>:    ...
复制代码


但是字典本身只有键时课迭代的,如何要遍历字典的值和键值对,要通过内置的函数 values() 和 items() 实现


d = {'name': 'jason', 'dob': '2000-01-01', 'gender': 'male'}for k in d: # 遍历字典的键    print(k)namedobgender
for v in d.values(): # 遍历字典的值 print(v)jason2000-01-01male
for k, v in d.items(): # 遍历字典的键值对 print('key: {}, value: {}'.format(k, v))key: name, value: jasonkey: dob, value: 2000-01-01key: gender, value: male
复制代码


当然可以通过索引来遍历元素


l = [1, 2, 3, 4, 5, 6, 7]for index in range(0, len(l)):    if index < 5:        print(l[index])                12345
复制代码

别忘了还有一个更重要的 enumerate() 函数


l = [1, 2, 3, 4, 5, 6, 7]for index, item in enumerate(l):    if index < 5:        print(item)                12345
复制代码

在循环语句中,要通过 continue 或 break 一起使用


continue,就是让程序跳过当前这层循环,继续执行下面的循环


break 则是指完全跳出所在的整个循环体


现在找出价格小于 1000,颜色不是红色的产品名称和颜色组合,如果不用 continue


# name_price: 产品名称 (str) 到价格 (int) 的映射字典# name_color: 产品名字 (str) 到颜色 (list of str) 的映射字典for name, price in name_price.items():    if price < 1000:        if name in name_color:            for color in name_color[name]:                if color != 'red':                    print('name: {}, color: {}'.format(name, color))        else:            print('name: {}, color: {}'.format(name, 'None'))
复制代码

共用了 5 层 for 或 if 的嵌套


加上了 continue,只有 3 层

# 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'))    for color in name_color[name]:        if color == 'red':            continue        print('name: {}, color: {}'.format(name, color))
复制代码


while


l = [1, 2, 3, 4]index = 0while index < len(l):    print(l[index])    index += 1
复制代码


那么在什么场合使用 for 和 continue


如果只是遍历已知的集合,找出满足条件的元素,使用 for 更加的简洁


如果需要在满足某个条件前,要不停的重复操作,并且没有特定的集合来遍历


例如

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 
复制代码


for 循环和 while 循环的效率问题


i = 0while i < 1000000    i += 1
for i in range(0, 1000000): pass

复制代码

range()函数直接时 C 语言写的,调用的速度非常快,for 循环的效率更高


对于有些大神直接写成一行操作


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 的函数图像


只需一行

y = [value * 2 + 5 if x > 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']
复制代码

给定两个列表 x、y,要求返回 x、y 中所有元素对组成的元组


[(xx, yy) for xx in x for yy in y if x != y]
复制代码


l = []for xx in x:    for yy in y:        if x != y:            l.append((x, y))
复制代码


参考:https://time.geekbang.org/column/article/94972


本文已收录 GitHub,传送门~ ,里面更有大厂面试完整考点,欢迎 Star。


发布于: 2020 年 10 月 17 日阅读数: 36
用户头像

刘润森

关注

刘润森 2018.09.17 加入

17年就读于东莞XX学院化学工程与工艺专业,GitChat作者。Runsen的微信公众号是"Python之王",关注后回复「小白」即可免费获取原创的Python学习资料;喜欢的微信搜索:「Python之王」。个人微信号:RunsenLiu

评论

发布
暂无评论
十四、深入Python条件和循坏