python进阶学习笔记3-异常

本文深入探讨Python中的异常处理机制及动态类型的特性,通过具体示例解释如何使用try-except语句捕获并处理异常,同时介绍了Python中对象与引用的概念,以及不同数据类型的可变性和不可变性。

作者:Vamei 出处:http://www.cnblogs.com/vamei

08、异常

re=iter(range(5))
try:
    for i in range(100):
        print(re.__next__())

except StopIteration:
    print('here is end',i)

re只会遍历0~4,当遍历到5时抛出异常!

异常的完整语法结构如下:

try:
    pass
except Exception1:
    pass
except Exception2:  
    pass
else:
    pass
finally:
    pass

如果try中没有异常,那么except部分将跳过,执行else中的语句。
finally是无论是否有异常,最后都要做的一些事情。

流程如下,
try->异常->except->finally
try->无异常->else->finally

如果try中有异常发生时,将执行异常的归属,执行except。异常层层比较,看是否是exception1, exception2…,直到找到其归属,执行相应的except中的语句。如果except后面没有任何参数,那么表示所有的exception都交给这段程序处理。比如:

try:
    print(a*2)
except TypeError:
    print("TypeError")
except:
    print("Not Type Error & Error noted")

由于a没有定义,所以是NameError。异常最终被except:部分的程序捕捉。

09、动态类型

在我们接触的对象中,有一类特殊的对象,是用于存储数据的。常见的该类对象包括各种数字,字符串,表,词典。

我们在程序中写的对象名,只是指向这一对象的引用。

引用和对象分离,是动态类型的核心。引用可以随时指向一个新的对象:

a=3
a='at'

第一个语句中,3是储存在内存中的一个整数对象。通过赋值,引用a指向对象3。

第二个语句中,内存中建立对象‘at’,是一个字符串(string)。引用a指向了’at’。此时,对象3不再有引用指向它。Python会自动将没有引用指向的对象销毁(destruct),释放相应内存。

但注意以下情况:

L1 = [1,2,3]
L2 = L1
L1[0] = 10
print L2

在该情况下,我们不再对L1这一引用赋值,而是对L1所指向的表的元素赋值。结果是,L2也同时发生变化。

原因何在呢?因为L1,L2的指向没有发生变化,依然指向那个表。表实际上是包含了多个引用的对象(每个引用是一个元素,比如L1[0],L1[1]…, 每个引用指向一个对象,比如1,2,3), 。而L1[0] = 10这一赋值操作,并不是改变L1的指向,而是对L1[0], 也就是表对象的一部份(一个元素),进行操作,所以所有指向该对象的引用都受到影响。

列表可以通过引用其元素,改变对象自身(in-place change)。这种对象类型,称为可变数据对象(mutable object),词典也是这样的数据类型。

注:列表的对象就是指整个列表,包含了指向各个元素的引用。一个元素,即一个引用,只是列表的组成部分。由于组成部分可变,所以列表包含的数据发生了变化,但列表的id不变。所以说,列表是可变数据类型。

而像之前的数字和字符串,不能改变对象本身,只能改变引用的指向,称为不可变数据对象(immutable object)。

我们之前学的元组(tuple),尽管可以调用引用元素,但不可以赋值,因此不能改变对象自身,所以也算是immutable object.

  • 从动态类型看函数的参数传递

函数的参数传递,本质上传递的是引用。比如说:

def f(x):   #此处x指向a
    x = 100 #此处x又指向了100,对a并没有影响
    print x

a = 1
f(a)
print a

输出:
100
1

参数x是一个新的引用,指向a所指的对象。如果参数是不可变(immutable)的对象,a和x引用之间相互独立。对参数x的操作不会影响引用a。这样的传递类似于C语言中的值传递。

如果传递的是可变(mutable)的对象,那么改变函数参数,有可能改变原对象。所有指向原对象的引用都会受影响,编程的时候要对此问题留心。比如说:

def ff(x):
    x[0]=100
    print(x)
    print("id x[1] ",id(x[1]))

a=[1,2,3]
ff(a)

print(a)
print("id a[1] ",id(a[1]))

输出:
[100, 2, 3]
id x[1] 1527886944
[100, 2, 3]
id a[1] 1527886944

由id可知a[1]与x[1]是同一对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值