Python高级特性

 

减少代码,提高效率

1.切片

取一个序列的部分元素

L [ start : end : step ]  含头不含尾

1 #!/usr/bin/python3
2 # -*- coding:utf-8 -*-
3 
4 L = [ 1, 3, 6, 9, 45, 66]
5 
6 print ( L[:4] )   #等同于L[0:4] 切片下标为 0 ~ 3 
7 print ( L[-2:] )  #倒数切片 从倒数第2开始往后切 倒数第二、倒数第一
8 print ( L[:5:2] )  #前5个数,每2个取一个
9 print ( L[::5] )  #所有数,每5个取一个

L[ : : -1]     倒切

 

 2.迭代

在Python中,迭代是通过 for...in 来完成的,而很多语言迭代 list 是通过下标完成的。

无论有无下标都可以迭代,如dict

dict不是按顺序排列存储,迭代出的结果顺序很可能不一样

dict默认迭代 key 如要要迭代 value:

同时迭代 key 和 value :

判断是否可以迭代

 

3.迭代器

迭代是Python最强大的功能之一,是访问集合元素的一种方式。

凡是可作用于for循环的对象都是Iterable类型,即迭代对象

凡是可作用于next()函数的对象都是Iterator类型,即迭代器,表示一个惰性计算的序列(只有在需要返回下一个数据时它才会计算)

迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。

迭代器有两个基本的方法:iter() 和 next()

集合数据类型如list、dict、str等是迭代对象,但不是迭代器,可通过 iter() 函数获得一个迭代器对象

字符串,列表或元组对象都可用于创建迭代器

迭代器对象可以使用常规for语句进行遍历:

1 #!/usr/bin/python3
2 # -*- coding:utf-8 -*-
3 
4 list = [1, 2, 3, 4]
5 it = iter(list)  #创建迭代器对象
6 
7 for x in it:
8     print(x, end=" ")  #不换行输出

也可以使用 next() 函数:

1 #!/usr/bin/python3
2 # -*- coding:utf-8 -*-
3 
4 list = [1, 2, 3, 4]
5 it = iter(list)  #创建迭代器对象
6 
7 while True:
8     print (next(it))

StopIteration

StopIteration 异常用于标识迭代的完成,防止出现无限循环的情况

 

4.列表生成式

简单却强大的可用来创建list的生成式

如:生成一个列表 [1x1,  2x2,  3x3,  ...,  10x10]

用循环做

 

1 #!/usr/bin/python3
2 # -*- coding:utf-8 -*-
3 
4 L = []
5 for x in range(1,11):
6     L.append(x*x)
7 for i in L[:]:
8     print (i, end = " ")

用列表生成式做

1 #!/usr/bin/python3
2 # -*- coding:utf-8 -*-
3 
4 L = [ x*x for x in range(1,11)]
5 
6 for i in L[:]:
7     print (i, end = " ")

列表生成式内还可加 if 判断

1 #!/usr/bin/python3
2 # -*- coding:utf-8 -*-
3 
4 L = [ x*x for x in range(1,11) if x%2 == 0 ]
5 #筛选出仅偶数的平方
6 for i in L[:]:
7     print (i, end = " ")

还可使用两层循坏,如生成一个全排列

1 #!/usr/bin/python3
2 # -*- coding:utf-8 -*-
3 
4 L = [ m+n for m in 'ABC' for n in 'XYZ' ]
5 for i in L[:]:
6     print (i, end = " ")

 

5.生成器

通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。

所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。

在 Python 中,使用了 yield 的函数被称为生成器(generator)。

跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。

在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。

调用一个生成器函数,返回的是一个迭代器对象。

以下实例使用 yield 实现斐波那契数列:

 1 #!/usr/bin/python3
 2 import sys
 3 
 4 def fibonacci(n): # 生成器函数 - 斐波那契
 5     a, b, counter = 1, 1, 0
 6     while True:
 7         if (counter > n):
 8             return
 9         yield a
10         a, b = b, a + b
11         counter += 1
12         
13 f = fibonacci(10) # f 是一个迭代器,由生成器返回生成
14 while True:
15     try:
16         print (next(f), end=" ")
17     except StopIteration:
18         sys.exit()

 

posted @ 2019-04-19 14:30  北风吹沙  阅读(278)  评论(0编辑  收藏  举报