文章目录
一、选择与循环
条件表达式
单个常量、变量或者任意合法表达式【不包含逻辑运算符】都可以作为条件表达式如果它们非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
说明:
- 选择结构支持嵌套
- 表达式为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程序设计、百度百科