
图|一张顾巷
文|一张顾巷
条件判断
条件判断就是 根据一条或多条条件的执行结果(True/False) 来决定执行对应区域的代码。 //条件判断三巨头//三巨头:if、else、elif
含义就是字面意思,不多加赘述了。示例如下:
# 单分支(只有一个if),如果代码块只有一条语句,可以和if语句写到一行company = 'i-search' print("所属公司为艺赛旗") # 双分支(if-else)sex = "女"if sex == '男': print("一枚男娃娃")else: print("一枚女娃娃") # 多分支(if-elif-else)age= 26if 0 <= age< 18: print("未成年!")elif 18 <= age print("大好年华,造作呀!")elif 25 <= age< 60: print("中年社畜!")else: print("脱离苦海!") # 运行结果如下:所属公司为艺赛一枚女娃娃中年社畜!
// 条件表达式 //
一个 简化版的 if-else ,常在赋值时使用。 以“将两个值中较大值赋值给一个变量”为例。示例如下:a, b = 1, 2c = a if a > b else bprint('c = %d' % c)# 输出结果如下c = 2
循环
// for循环 // 当我们需要重复执行某行或某个代码块的时候可以使用循环。 举个栗子? : 若不使用循环结构计算1加到100,你可能会写出这样的代码:sum = 1 + 2 + 3 + 4 +... + 100
如果要你加到1000,或者10000呢?光枚举就可能写满一本书,繁琐且不实际。 如果有了循环,你只需下面这样一段代码:sum = 0for i in range(1,101): sum += iprint("输出1-100的求和结果:" % sum)# 运行结果如下:输出1-100的求和结果:5050
// while循环 //
另外一种循环结构while。
把上面for循环的示例改为while循环:
sum = 0index = 1while index <= 100: sum += index index += 1print("输出1-100的求和结果:" % sum)# 运行结果如下:输出1-100的求和结果:5050
如果while后的判断条件返回值为True,执行循环体中的代码,否则退出循环。可以搭配else一起使用,当循环执行完后执行某段代码,可选但非必须,for循环也可以用else。
// 循环控制姐妹花 //
python为我们提供了两个循环控制关键字 break 和 continue 。二者区别就是break会终止循环,continue不终止循环。 break 用于 终止整个循环 ,示例如下:for i in range(7): if i == 2: break print(i) # 运行结果如下:01
continue : 跳过本次循环,执行下一次循环 ,示例如下:for i in range(7): if i == 2: continue print(i) # 运行结果如下:013456
// 循环嵌套 //
循环嵌套就是 循环里面有另一个循环。 举个最经典的例子,打印9*9乘法表,示例如下:print("打印九九乘法表:")i = 1while i <= 9: j = 1 while j <= i: print('%d * %d = %d' % (i, j, i * j), end='\t') j += 1 print() i += 1# 运行结果如下:打印九九乘法表:1 * 1 = 1 2 * 1 = 2 2 * 2 = 4 3 * 1 = 3 3 * 2 = 6 3 * 3 = 9 4 * 1 = 4 4 * 2 = 8 4 * 3 = 12 4 * 4 = 16 5 * 1 = 5 5 * 2 = 10 5 * 3 = 15 5 * 4 = 20 5 * 5 = 25 6 * 1 = 6 6 * 2 = 12 6 * 3 = 18 6 * 4 = 24 6 * 5 = 30 6 * 6 = 36 7 * 1 = 7 7 * 2 = 14 7 * 3 = 21 7 * 4 = 28 7 * 5 = 35 7 * 6 = 42 7 * 7 = 49 8 * 1 = 8 8 * 2 = 16 8 * 3 = 24 8 * 4 = 32 8 * 5 = 40 8 * 6 = 48 8 * 7 = 56 8 * 8 = 64 9 * 1 = 9 9 * 2 = 18 9 * 3 = 27 9 * 4 = 36 9 * 5 = 45 9 * 6 = 54 9 * 7 = 63 9 * 8 = 72 9 * 9 = 81
// 死循环 //
死循环就是由于程序的逻辑问题,导致循环结构中的代码块一直执行, 循环的条件永远为True , 导致无法跳出循环,所以写代码的时候需要调试,确保程序的逻辑正确性。 当然,死循环也不是一无是处的, 在执行一些 轮询操作 时经常用到,等满足某个条件再break退出这个循环。异常
了解异常前,先要区分下 语法错误与运行时异常语法错误:连编译器都过不了的错误,如if后漏掉冒号: 程序都跑不起来;
运行时错误:程序运行后,因为程序的业务逻辑问题引起的程序崩溃,比如除以0;
// 常见异常 // Exception类 是所有异常类的父类,又称万能异常,可以用于捕获任何异常!Python中的常见异常如下表所示:异常 | 描述信息 |
AssertionError | 断言语句失败 |
AttributeError | 尝试访问未知的对象属性 |
IndexError | 索引超出序列的范围 |
keyError | 字典中查找一个不存在的Key |
NameError | 尝试访问一个不存在的变量 |
OSError | 操作系统产生的异常,比如FileNotFoundError |
SyntaxError | Python语法错误 |
TypeError | 不同类型间的无效操作 |
ZeroDivisionError | 除数为0 |
IOError | 输入输出错误 |
ValueError | 函数传参类型错误 |
try: result = 1 / 0except: print("捕获到异常了!")# 运行结果如下:捕获到异常了!
② : 捕获特定类型try: result = 1 / 0except ZeroDivisionError: print("捕获到除数为零的错误")# 运行结果如下:捕获到除数为零的错误
③ : 针对不同的异常设置多个excepttry: sum = 1 + '2' result = 1 / 0except TypeError as reason: print("类型出错:" + str(reason))except ZeroDivisionError as reason: print("除数为0:" + str(reason))# 运行结果如下:类型出错:unsupported operand type(s) for +: 'int' and 'str'
④ : 对多个异常统一处理try: result = 1 / 0 sum = 1 + '2'except (TypeError, ZeroDivisionError) as reason: print(str(reason))# 运行结果如下:division by zero
⑤ : 当没有检测到异常时才执行的代码块,可以用elsetry: result = 4 / 2except ZeroDivisionError as reason: print(str(reason))else: print("没有发生异常,输出结果:%d" % result)# 运行结果如下:没有发生异常,输出结果:2
⑥ : 无论是否发生异常都会执行的一段代码块try: result = 4 / 2except ZeroDivisionError as reason: print(str(reason))else: print("没有发生异常,输出结果:%d" % result)finally: print("无论是否发生异常都会执行~")# 运行结果如下:没有发生异常,输出结果:2无论是否发生异常都会执行~
// 异常抛出 //
Python为我们提供的都是异常都是在特定条件下才会触发的。而在一些特定的场景,某些操作可能会引起我们的业务异常,
比如让用户输入一串手机号码,手机号码由一串0-9的数字构成,而如果用户输入了其他字符,显然是不合理的。
我们可以通过正则对输入的手机号码进行校验,如果是手机号码就打印出来,不是的话则利用Python提供的 raise关键字 显式抛出一个ValueError异常。示例如下:
import re# 注:这段正则你只需要知道是用来匹配电话号码的,正则详细讲解见上上期phone_compile =re.compile(r'(?)number = input("请输入一串手机号码:")if phone_compile.match(number) is not None: print("您输入的手机号码是:%s" % number)else: raise ValueError# 运行结果如下:请输入一串手机号码:123456787Traceback (most recent call last): File "G:/okfuGit/demo.py", line 12, in raise ValueErrorValueError
// 自定义异常 //
上面通过raise关键字显式的抛出了一个内置的ValueError异常。如果程序里除了这个号码验证还有邮箱验证,我们又抛出一个这样的异常的话,会不利于异常的定位,异常是哪个地方引起的?
对此,我们可以自定义异常,根据不同的错误抛出对应的异常。我们自定义一个非手机号码异常,代码示例如下:
# 自定义异常class PhoneNumberException(Exception): def __init__(self, message): Exception.__init__(self) self.message = messageif __name__ == '__main__': phone_compile = re.compile(r'(?) number = input("请输入一串手机号码:") if phone_compile.match(number) is not None: print("您输入的手机号码是:%s" % number) else: raise PhoneNumberException("非法的手机号码!")# 运行结果如下:请输入一串手机号码:1234Traceback (most recent call last): File "G:/okfuGit/demo.py", line 19, in raise PhoneNumberException("非法的手机号码!")__main__.PhoneNumberException
// sys.exc_info()函数 //
除了前面介绍的获取异常信息的方式外,还可以通过sys模块里的exc_info()函数来获得,使用代码示例如下:import systry: result = 1 / 0except: tuple_exception = sys.exc_info()# 输出结果依次是:异常类,类示例,跟踪记录对象for i in tuple_exception: print(i)# 运行结果如下:'ZeroDivisionError'>division by zeroobject at 0x000001E079360288>
断言
当 assert关键字 后面的判断条件为假时,程序自动崩溃并抛出AssertionErro异常。一般测试程序时用到:需要 确保某个条件为真程序才能正常工作 的时候使用。需与异常进行区分:异常处理:用于对程序发生异常情况的处理,以增加程序健壮性和容错性。
断言:用来检查非法情况,以帮助开发者快速定位问题位置。
Python中关于断言assert的常见用法有两种:
assert 判断条件:如果判断条件为false,就raise一个AssertionError。
assert 判断条件,异常描述:如果判断条件为false,就raise一个带描述信息的AssertionError。
阿巷推荐|点击阅读

python基础 | 语法常识

python基础 | 正则扫盲