减少代码,提高效率
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()