抛出异常对象是指在抛出后,代码将不再运行,由外层接收错误信息。
语法:
raise...............(参数)
class SexException(Exception):
def __init__(self,msg,value):
self.msg = msg
self.value = value
def f1():
sex = input('请输入性别')
if sex!= '男' and sex != '女' :
raise SexException('性别只能输入男或者女',sex) #定义错误信息,将信息抛出,由函数f2接收
print('f1........over')
def f2():
f1()
print('f2......over')
def main():
try:
f2()
except :
raise #将函数f2中的错误抛出,由外层接收
print('main.....over')
try:
main()
except Exception as ex:
print(ex)
在MVC框架中,异常处理应在最外层进行,提高运行效率
浅拷贝与深拷贝:
浅拷贝是对一个对象的顶层拷贝,只拷贝了引用,并没有拷贝内容。
a = [1,2,3,4]
b = a
print(id(a))
print(id(b))
a.append(5)
print(a)
print(b)
>>6695560
>>6695560
>>[1, 2, 3, 4, 5]
>>[1, 2, 3, 4, 5]
深拷贝通过导入copy,对对象进行拷贝,开辟一个新的储存空间,前后地址不一样。
import copy
a = [1,2,3,4]
b = copy.deepcopy(a)
print(id(a))
print(id(b))
a.append(5)
print(a)
print(b)
>>12621768
>>12620168
>>[1, 2, 3, 4, 5]
>>[1, 2, 3, 4]
如果对象不可变,深拷贝 = 浅拷贝
#对象为列表时,使用copy拷贝
import copy
a = [1,2,3,4]
b = copy.copy(a)
print(id(a))
print(id(b))
a.append(5)
print(a)
print(b)
>>18651656
>>18244552
>>[1, 2, 3, 4, 5]
>>[1, 2, 3, 4]
#对象为元组时,使用deepcopy拷贝
import copy
a = (1,2,3,4)
b = copy.deepcopy(a)
print(id(a))
print(id(b))
print(a)
print(b)
print(b)
>>7833624
>>7833624
>>(1, 2, 3, 4)
>>(1, 2, 3, 4)
>>(1, 2, 3, 4)
生成器:
在Python中,这种一边循环一边计算的机制,称为生成器:generator。
方法一:
G = ( x for x in range(5))
next(G) #调用生成器
一般使用for循环或while来调用
i = 0
while i<19:
next(G)
i+=1
print(next(G))
#print(G.__next__())
方法二:
yield 值
1、调用函数,得到一个生成器对象。这个函数没有执行
2、next调用1得到的对象,如果遇到了yield,代码会阻塞,next的返回值就yield后的值
def f(num):
print('1...')
yield num
print('2...')
ge = f(100)
print(type(ge))
ret1 = next(ge)
print(ret1)
ret1 = next(ge)
print(ret1)
>>1...
>>100
>>2...
方法三:
第一种和第二种,一旦生成器确定,算法不能改变。
这里的例子,定义了变量(temp),可以使用send发送参数,发给这里变量。
根据这个变量的值的不同,可以改变算法的逻辑。
所以,这种写法的作用:在运行过程中,可以改变算法。
def gen():
i = 0
while i<1000:
temp = yield i
if temp==True:
#逻辑代码
print('执行A计划')
i+1
else:
#逻辑代码
print('执行B计划')
i+=2
myGenerator = gen()
ret = next(myGenerator)
print(ret)
#1、为当前停止的代码的左侧变量赋值 2、生成器往下走一个行,返回yield值
ret = myGenerator.send(True)
print(ret)
ret = myGenerator.send(False)
print(ret)
>>0
>>执行A计划
>>0
执行B计划
>>2