常用的 if 语句如下,if 后面接个条件语句,如果为 True 且不为空,就执行 if 后续代码,如果不符合,就不执行。
if 后面如果直接传 True 或者返回结果为 True 的条件语句时,会执行 if 内的代码。
if 后面如果传某个对象如数字、字符串、列表、字典等,如果对方非空,会执行 if 内的代码。
相对应的,如果 if 后面传 False 或者返回结果为 False 的条件语句,或者传入空值、空列表以及None,都不会执行 if 后续的代码。
name = ''
age = 17
sign = False
if True:
print('目标为 True,执行if后的代码')
if age < 18:
print('条件语句返回为 True,执行 if 后的代码')
if sign:
print('目标为 False,if 后的代码不执行')
if name:
print('目标为空值,if 后的代码不执行')
if None:
print('目标为 None,if 后的代码不执行')
words = '已成年' if age >= 18 else '未成年' # 单行if语句
print(words)
输出结果为:
目标为 True,执行if后的代码
条件语句返回为 True,执行 if 后的代码
未成年
如果符合 if 的条件,就执行 if 后面的代码,如果不符合,就执行 else 后面的代码。
备注:如果出现异常报错,属于额外情况,不属于“不符合 if 条件”,执行 else 语句。
age = 17
if age >= 18: # if-else语句
print('已成年')
else:
print('未成年')
输出结果为:
未成年
在 if-elif-else 语句中,elif 可以多加,变成 if-elif-elif-else 模式、if-elif-elif-elif-else 模式都可以。
else 可以不要,变成 if-elif 或者 if-elif-elif 的模式
age = 17
if age > 18: # if-elif-else语句,elif可以多加,else可以不要
print('已成年')
elif age == 18:
print('刚成年')
else:
print('未成年')
输出结果为:
未成年
if 语句是可以多层嵌套的,简单的嵌套用法示例如下:
age = 17
if age >= 18: # 嵌套if语句
if age == 18:
print('刚成年')
else:
print('已成年')
else:
print('未成年')
输出结果为:
未成年
if 语句和与、或、非的结合用法示例如下,非常实用:
if 3 < 5 and 7 < 9: # 多条件判断,与
print('3小于5 且 7小于9')
if 3 < 5 or 7 > 9: # 多条件判断,或
print('3小于5 或 7小于9')
if not 3 > 5: # 非
print('3不大于5')
输出结果为:
3小于5 且 7小于9
3小于5 或 7小于9
3不大于5
if 语句和 is、in 结合,用于条件判断,很常用。
age = 17
age2 = age
if 'a' in 'abc': # if语句和in结合,可以加not
print('True')
if age is age2: # if语句和is结合,可以加not
print('age 和 age2 是一个对象')
输出结果为:
True
age 和 age2 是一个对象
使用 for 循环,可以对对象内容进行遍历,包括字符串,列表等。
遍历 range() 函数、字符串、列表:
for num in range(1, 4): # 遍历range()函数
print(num)
for char in 'Ok': # 遍历字符串
print(char)
colors = ['red', 'green', 'blue']
for color in colors: # 遍历列表
print(color)
输出结果为:
1
2
3
O
k
red
green
blue
遍历字典:
infor = {'name': 'Weiyan', 'age': 17, 'city': 'shenzhen'}
print('遍历字典的键:')
for key in infor.keys(): # 遍历字典的键
print(key)
print('遍历字典的值:')
for value in infor.values(): # 遍历字典的值
print(value)
print('遍历字典的键值对:')
for key, value in infor.items(): # 遍历字典的键值对
print(key, value)
输出结果为:
遍历字典的键:
name
age
city
遍历字典的值:
Weiyan
17
shenzhen
遍历字典的键值对:
name Weiyan
age 17
city shenzhen
使用 zip() 函数,可以同时遍历多个字对象。
如果两个对象的长度不同,则当短的那个遍历完成,整个遍历就结束。
names = ['Weiyan', 'Youzi']
ages = [16, 17]
for name, age in zip(names, ages): # 遍历多个序列
print(name, age)
输出结果为:
Weiyan 16
Youzi 17
for 循环是可以多层嵌套的,一个简单的生成九九乘法表的示例如下:
for i in range(1, 10): # for循环中嵌套for循环
for j in range(1, i+1):
print(f"{j}×{i}={j*i}", end=' ')
print('')
输出结果为:
1×1=1
1×2=2 2×2=4
1×3=3 2×3=6 3×3=9
1×4=4 2×4=8 3×4=12 4×4=16
1×5=5 2×5=10 3×5=15 4×5=20 5×5=25
1×6=6 2×6=12 3×6=18 4×6=24 5×6=30 6×6=36
1×7=7 2×7=14 3×7=21 4×7=28 5×7=35 6×7=42 7×7=49
1×8=8 2×8=16 3×8=24 4×8=32 5×8=40 6×8=48 7×8=56 8×8=64
1×9=9 2×9=18 3×9=27 4×9=36 5×9=45 6×9=54 7×9=63 8×9=72 9×9=81
算是一个比较经典的练习题,很多人初学时应该都试着做过吧。
当 for 循环与 else 结合,如果循环中途没有 break,则循环结束后,会运行 else 中的代码
for i in range(1, 6): # for循环和else结合,如果中途没有break的话,循环结束后执行
print('循环进行中,此时i=', i)
if i == 5:
break
else:
print('循环结束,此时i=', i)
输出结果为:
循环进行中,此时i= 1
循环进行中,此时i= 2
循环进行中,此时i= 3
循环进行中,此时i= 4
循环进行中,此时i= 5
当 for 循环中,遇到 pass 时,什么也不会发生,遇到 continue 时,当前一轮循环直接结束,进入下一轮循环。
如果是遇到 break,则整个循环终止。
一个简单的示例如下,遇到7就跳过的游戏:
for i in range(1, 1000): # 使用continue跳过当前一轮循环,继续下一轮循环,使用break终止循环
if i % 7 == 0 or '7' in str(i):
continue
elif i >= 16:
break
else:
pass
print(i)
输出结果为:
1
2
3
4
5
6
8
9
10
11
12
13
15
num = 0
while num <= 3: # 基本的while循环
num += 1
print(num)
输出结果为:
1
2
3
4
当 while 循环与 else 结合,如果循环中途没有 break,则循环结束后,会运行 else 中的代码
num = 0
while num <= 10:
num += 1
else:
print(num)
输出结果为:
11
while 循环条件设置为 True 或者返回为 True 的的判断语句时,将进入无限循环,需要使用 break 来退出循环。
num = 0
while True:
num = num + 1
if num < 5:
print('循环继续,此时num=', num)
continue
elif num == 5:
print('循环将中断,此时num=', num)
break
输出结果为:
循环继续,此时num= 1
循环继续,此时num= 2
循环继续,此时num= 3
循环继续,此时num= 4
循环将中断,此时num= 5
用 while 循环处理用户输入,可以设定正确输入条件,如果不符合,就让用户重新输入,如果符合,就把循环 break 掉。
while True: # 常见的用while循环处理用户输入
name = input('输入名称:')
if name.lower() == 'weiyan':
print('welcome,', name.lower(), '!')
break
else:
print('名称不符,请重新输入。')
输出结果为:
输入名称:123
名称不符,请重新输入。
输入名称:yes
名称不符,请重新输入。
输入名称:Weiyan
welcome, weiyan !
while 循环中,遇到 pass,什么也不会发生,遇到 continue,会跳过当前一轮循环剩下的代码,直接进入下一轮循环,遇到 break 则整个循环终止。
备注:pass 语句是一个空操作,它仅仅用来占位。它和 continue 的区别是,当前一轮的循环中,pass 之后的代码也会执行,而 continue 之后的代码不会执行
i = 0
while True:
i = i + 1
if i == 10:
break
elif i % 2 == 0:
pass
elif i % 2 == 1:
continue
print('此时i是偶数,i =', i)
输出结果为:
此时i是偶数,i = 2
此时i是偶数,i = 4
此时i是偶数,i = 6
此时i是偶数,i = 8
while 循环的嵌套用法其实和 for 循环差不多,每层循环条件的设置是重点,它将决定循环中变量的变化顺序。
依然以九九乘法表为例,这里使用 while 循环去实现:
i = 1
while i <= 9: # while循环中嵌套while循环,
j = 1
while j <= i:
print(f'{j}×{i}={i*j}', end=' ')
j = j + 1
print('')
i = i + 1
输出结果为:
1×1=1
1×2=2 2×2=4
1×3=3 2×3=6 3×3=9
1×4=4 2×4=8 3×4=12 4×4=16
1×5=5 2×5=10 3×5=15 4×5=20 5×5=25
1×6=6 2×6=12 3×6=18 4×6=24 5×6=30 6×6=36
1×7=7 2×7=14 3×7=21 4×7=28 5×7=35 6×7=42 7×7=49
1×8=8 2×8=16 3×8=24 4×8=32 5×8=40 6×8=48 7×8=56 8×8=64
1×9=9 2×9=18 3×9=27 4×9=36 5×9=45 6×9=54 7×9=63 8×9=72 9×9=81
我们使用 try 来运行一串有可能报异常的代码,然后在 except 中预估好可能出现什么异常,以及对应的处理方式。
基本用法,这里对字符类型错误的 TypeError 异常进行捕获和处理:
try:
num = '2' + 3
print(num)
except TypeError:
print('字符类型错误')
输出结果为:
字符类型错误
当然,一个 try 后面,可以接多个 except,来捕获多个不同的异常,并分别处理。
try:
num = '2' + 3
print(num)
except TypeError:
print('字符类型错误')
except SyntaxError:
print('语法错误')
输出结果为:
字符类型错误
可以在系统报错后,获取异常报错信息,然后把信息存入日志或者打印出来,有利于我们了解程序运行中的情况。
try:
num = '2' + 3
print(num)
except TypeError as te:
print(f'异常报错:', te)
输出结果为:
异常报错: can only concatenate str (not "int") to str
也许会有人觉得,如果程序可能出现的异常总类很多,每种都单独处理岂不是太麻烦?
也有可以捕获所有异常的办法。示例如下:
try:
num = '2' + 3
print(num)
except:
print('字符类型错误')
输出结果为:
字符类型错误
但是并不建议这样做,因为会隐藏具体异常信息,不方便了解程序运行情况。比如上面这串代码,它无论出现什么异常,都会呆头呆脑的报”字符类型错误“,这显然不合适。
但是并非它就没有意义,我们可以在捕获所有异常后,把系统报出的异常信息打印出来,这样,在调试代码的时候,会非常方便。
try:
num = '2' + 3
print(num)
except Exception as Error:
print('报错内容:', Error)
输出结果为:
报错内容: can only concatenate str (not "int") to str
当然,正式生产环境中仍不建议这样做,因为会使一些你没想到的异常信息被忽略,从而异常不能正确处理,导致后续代码都出现 bug。
try-except 和 else 组合使用,如果异常没有触发,循环结束后,就会运行 else 中的代码。
try:
num = '2' + 3
except TypeError as te:
print(f'异常报错:', te)
else:
print(num)
输出结果为:
异常报错: can only concatenate str (not "int") to str
try-except 和 finally 组合使用,无论异常是否发生,都会执行 finally 中代码。
try:
num = '2' + 3
except TypeError as te:
print(f'异常报错:', te)
finally:
print('run finally')
输出结果为:
异常报错: can only concatenate str (not "int") to str
run finally
可以自己创建一个类来继承 Exception,然后在需要的时候,让代码抛出自己创建的异常。
class Error1(Exception):
pass
try:
num = 2 + 3
raise Error1('自定义异常1报错详细内容。')
except Error1 as E1:
print(f'异常报错:', E1)
输出结果为:
异常报错: 自定义异常1报错详细内容。
有时候遇到异常,处理后,还是希望把这个异常抛出。
try:
num = '2' + 3
except TypeError as te:
print(f'异常报错:', te)
raise
输出结果为:
Traceback (most recent call last):
File "E:\python_scripts\isli_tools\base\base.py", line 570, in <module>
num = '2' + 3
TypeError: can only concatenate str (not "int") to str
当业务流程有多个步骤都可能触发同一种异常,而你又希望给它们分别定制报错文本,就可以考虑这个方式。
这里我为了把每种情况都展示一下,在外层加了 while 循环。
while True:
try:
age = int(input('输入年龄:'))
try:
height = int(input('输入身高(厘米):'))
except ValueError:
print('请输入正确的身高。\n')
else:
print(f'你的年龄是:{age} 岁,身高是:{height} 厘米。')
break
except ValueError:
print('请输入正确的年龄。')
输出结果为:
输入年龄:aaa
请输入正确的年龄。
输入年龄:17
输入身高(厘米):bbb
请输入正确的身高。
输入年龄:17
输入身高(厘米):170
你的年龄是:17 岁,身高是:170 厘米。
try-except 和 with 组合,在处理资源文件时很实用。
try:
with open('file.txt', 'r') as f:
content = f.read()
print(content)
except FileNotFoundError as fe:
print('文件不存在:', fe)
输出结果为:
文件不存在: [Errno 2] No such file or directory: 'file.txt'
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。