python选择与循环、异常测试、反射,相关概念

本文介绍了Python中的选择结构(if/elif/else)、循环结构(for/while)、异常处理(try/except/else/finally)以及断言和反射机制。通过实例展示了如何优雅地处理条件判断、异常捕获和动态调用对象成员。此外,还探讨了自定义异常和使用assert进行条件验证的方法。
摘要由CSDN通过智能技术生成



一、选择与循环

条件表达式

单个常量、变量或者任意合法表达式【不包含逻辑运算符】都可以作为条件表达式如果它们非0,非空,那它们的布尔值为True。

逻辑运算符:and/or

A and B A和B都为True此条件表达式才为True
A or B A或B只要两者之一为true则表达式为True

关于逻辑运算符还需要注意它的特殊用法:
惰性赋值,永远被覆盖,下面看示例

s=1 and 0
print(s)#0
s1=1 and 3
print(s1)#3
s2=1 or 0
print(s2)#1
s3=2 or 1
print(s3)#2
print(0 or False)#False

上面这种使用方式在某种方面可以代替if- else结构,虽然不被允许。

选择结构

if 表达式1:
    语句块1
elif 表达式2:
    语句块2
else:
    语句块4

说明:

  1. 选择结构支持嵌套
  2. 表达式为True执行其对应下面的语句块,如表达式1为True则执行语句块1.如果所有表达式均不满足则执行else下面的语句块。

选择结构的应用

我们有个需求:用户输入一个0-5的数,当输入1时,启动A函数,输入2启动B函数,……输入5,启动E函数。这个需求很简单用if-elif-else完全可以解决基本需求,但是这样分支太多不够优雅而且不利于修改,即会让你显得很low。这时可以用到字典。

def A():
    print("A")
def B():
    print("B")
def C():
    print("C")
def D():
    print("D")
def E():
    print("E")
Choicesdict={1:A,2:B,3:C,4:D,5:E}
choice=int(input("请做出你的选择:"))
if choice in Choicesdict:
    Choicesdict[choice]()
else:
    print("选择无法识别")

循环结构

For循环

for 变量 in 可迭代对象:
	语句
else:
	正常结束循环时执行【使用continue,可以执行】

while循环

变量(?嵌套必须是常量)
while 条件:
    循环体
    变量靠近语句【Ctrl+C强行退出执行】
else:
	正常结束循环时执行【在循环中使用continue,可以执行。使用break不执行】

break:退出所在层次的循环
continue:结束此次循环,开始下一循环

exit_flag=False #标志位
for i in range(10):
    if i<5:
        continue
    print(i)
    for j in range(10):
        print("layer",j)
        if j==6:
            exit_flag=True
            break
    if exit_flag:
        break

异常处理

格式

try: 
<语句> #运行的代码
 except <错误类型名字> as e:
 <语句> #如果在try部份引发了'指定错误类型name'异常则自动执行此语句,其中e表示是错误信息【Exception所有异常,有特殊处理,Execption,往往放在最下面】
else: <语句> #如果没有异常发生
finally :不管出不出错都要执行

对应异常处理的一些应用

处理多个异常

我们时常会遇到一段代码抛出多个异常,要求处理时无需重复创建代码,即必须优雅。

try:
    client_obj.get_url(url)
except (URLError,ValueError,SocketTimeout):
    pass

创建自定义异常

创建新的异常很简单继承异常类如Exception。

class MYerror(Exception):
    def __init__(self,):
        self.name="error"
    def __str__(self):
        return self.name
try:
    raise MYerror
except MYerror as e:
    print(e)# error

断言assert

一般格式:assert 条件
条件不满足就报错,一般不捕获。

使用需求示例

  • List item通过引发异常来响应另一个异常,我们想引发一个异常作为捕获另一个异常的响应,但是希望在traceback回溯中同时获得两个异常的有关信息。
def example():
    try:
        int("T")
    except ValueError as e:
        raise RuntimeError("运行错误") from e
example()
'''
Traceback (most recent call last):
  File "C:/Users/xx/PycharmProjects/pythonProject4/烹饪食谱.py", line 1847, in example
    int("T")
ValueError: invalid literal for int() with base 10: 'T'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "C:/Users/xx/PycharmProjects/pythonProject4/烹饪食谱.py", line 1850, in <module>
    example()
  File "C:/Users/xx/PycharmProjects/pythonProject4/烹饪食谱.py", line 1849, in example
    raise RuntimeError("运行错误") from e
RuntimeError: 运行错误

'''
  • 我们在expect中捕获一个异常,希望可以将它重新抛出,只需要单独使用raise即可。
def example():
    try:
        int("T")
    except ValueError as e:
        print(e)#invalid literal for int() with base 10: 'T'
        raise
example()
'''

Traceback (most recent call last):
  File "C:/Users/xx/PycharmProjects/pythonProject4/烹饪食谱.py", line 1851, in <module>
    example()
  File "C:/Users/xx/PycharmProjects/pythonProject4/烹饪食谱.py", line 1847, in example
    int("T")
ValueError: invalid literal for int() with base 10: 'T'


'''

反射

通过字符串的形式操作对象中的成员。
主要有三种方法:

  • getatter利用字符串获取东西。
  • hasatter检测内容
  • setatter建立内容
class Foo:
    def __init__(self,name,age):
        self.name=name
        self.age=age
obj=Foo("Tom",189)
v=getattr(obj,"name")#去xx里面获取xx内容
print(v)

扩展

通过字符串动态导入模块

import importlib
m=importlib.import_module("模块名或模块路径")
func=getattr(m,str)str为m指定模块下的方法·

概念补充

回溯

回溯是一个报告,其中包含在你的代码中某个特定点上执行的函数调用。当你的程序引发一个异常时,Python将打印当前回溯信息以帮助你知道哪里出错了。
参考书籍:python程序设计、百度百科

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值