python-10 异常处理、推导式、生成器

python-10 异常处理、推导式、生成器

一、异常处理

1、代码错误类型

1)语法错误:SyntaxError

2)除以0(分母为0)错误:ZeroDivisionError

3)列表下标越界:IndexError

4)类型错误:TypeError

5) 访问变量不存在:NameError

6)字典关键字不存在:KeyError

7)未知的变量属性:AttributeError

2、捕捉错误

  以上这些错误会引起程序中止退出, 如果希望掌控意外,就需要在可能出错误的地方设置陷阱捕捉错误,以防止出现意料之外的程序终止。

1)try-finally语句

1
2
3
4
5
6
7
8
9
10
try:     
<检测语句>
except <错误类型> [as e]:
<处理异常>
finally:
<语句块>

#解析
finally: 无论出错否,都执行的代码;
如果try语句块运行时没有出现错误,会跳过except 语句块执行finally语句块的内容。

2)else语句

1
2
3
4
5
6
7
8
9
try:     
<检测语句>
except <错误类型> [as e]:
<处理异常>
else:
<语句块>

#解析
else: 没有出错时执行的代码

二、推导式

1、什么是推导式

  推导式是从一个或者多个迭代器快速简洁地创建数据结构的一种方法;是一种将循环和条件判断结合,从而避免语法冗长的代码;可以用来生成列表、字典和集合。

2、推导式基本语法

  下述推导式中,若if <逻辑条件>不成立,就不会去计算表达式。

1)列表推导式

1
[<表达式> for <变量> in <可迭代对象> if <逻辑条件>]

2)字典推导式

1
{<键值表达式>:<元素表达式> for <变量> in <可迭代对象> if <逻辑条件>}

3)集合推导式(集合的特点是无序,且每个元素不重复)

1
{<元素表达式> for <变量> in <可迭代对象> if <逻辑条件>}

4)实例

1
2
3
4
5
#计算数字0~9的平方,结果存到列表中
print([x*x for x in range(10)])

#结果
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

5)实例

1
2
3
'k%d'%(x,) 意思是k和x组成字符串
x**3 表示的是x的3次方
集合里没有重复元素,但是列表里有

1w0ilT.png

3、 生成器推导式

与推导式一样语法:

1
(<元素表达式> for <变量> in <可迭代对象> if <逻辑条件>)

  返回一个生成器对象,也是可迭代对象;但生成器并不立即产生全部元素,仅在要用到元素的时候才生成,可以极大节省内存。

实例,如下图,用到元素的时候才生成。

1w2cE8.png

4、实例

编写一个推导式,生成包含100以内所有勾股数(i,j,k)的列表。

1
2
3
4
5
>>> [(i,j,k) for i in range(1,100) for j in range(1,100) for k in range(1,100) if (i*i+j*j==k*k)&(i<j<k)]

#结果
[(3, 4, 5), (5, 12, 13), (6, 8, 10), (7, 24, 25), (8, 15, 17), (9, 12, 15), (9, 40, 41), (10, 24, 26), (11, 60, 61), (12, 16, 20), (12, 35, 37), (13, 84, 85), (14, 48, 50), (15, 20, 25), (15, 36, 39), (16, 30, 34), (16, 63, 65), (18, 24, 30), (18, 80, 82), (20, 21, 29), (20, 48, 52), (21, 28, 35), (21, 72, 75), (24, 32, 40), (24, 45, 51), (24, 70, 74), (25, 60, 65), (27, 36, 45), (28, 45, 53), (30, 40, 50), (30, 72, 78), (32, 60, 68), (33, 44, 55), (33, 56, 65), (35, 84, 91), (36, 48, 60), (36, 77, 85), (39, 52, 65), (39, 80, 89), (40, 42, 58), (40, 75, 85), (42, 56, 70), (45, 60, 75), (48, 55, 73), (48, 64, 80), (51, 68, 85), (54, 72, 90), (57, 76, 95), (60, 63, 87), (65, 72, 97)]
>>>

三、生成器

1、什么是生成器

  生成器(generator)是用来创建Python序 列的一个对象 ,使用它可以迭代庞大的序列,且不需要在内存中创建和存储整个序列。通常生成器是为迭代器产生数据,是迭代器的一种实现。

2、生成器函数

  如果要创建一个比较大的序列,生成器推导式将会比较复杂,一行表达式无法容纳, 这时可以定义生成器函数。生成器函数的定义与普通函数相同,只是将return 换成了yield。

3、yield与return

1)yield语句:立即返回一个值,下一次迭代生成器函数时,从yield语句后的语句继续执行,直到再次yield返回,或终止。

2)return语句:终止函数的执行,下次调用会重新执行函数。

3)协同程序:可以运行的独立函数调用,函数可以暂停或挂起,并在需要的时候从离开的地方继续或重新开始。

4、实例

  如下图中,语句每执行到yield处立即返回一个值,而不是全执行完生成0、2、4、6、8后一起返回的。

1wbkjO.png

  如下图,加sleep函数可以验证,每过5秒则print一个数字,而不是过了25秒后一股脑print所有数字。这说明yield语句立即返回一个值,下一次迭代生成器函数时,从yield语句后的语句继续执行,直到再次yield返回,或终止。

1
2
3
4
5
6
7
8
9
10
from time import sleep
def even_number(max):
n=0
while n<max:
yield n
sleep(5)
n+=2

for i in even_number(10):
print(i)

1wOHZF.png

欢迎打赏,谢谢
------ 本文结束------
0%