美文网首页
2017.7.13总结(异常抛出、浅拷贝与深拷贝、生成器)

2017.7.13总结(异常抛出、浅拷贝与深拷贝、生成器)

作者: Irlans | 来源:发表于2017-07-13 20:43 被阅读0次

抛出异常对象是指在抛出后,代码将不再运行,由外层接收错误信息。
语法:
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

相关文章

网友评论

      本文标题:2017.7.13总结(异常抛出、浅拷贝与深拷贝、生成器)

      本文链接:https://www.haomeiwen.com/subject/sgdghxtx.html