高级特性
切片
切片即取一个list 或者 tuple 的部分元素
L= ["abc", "bcd", "efg", 123, 666] L[0 : 3] #取前3个元素,左闭右开 L[ : 3] #取前3个元素,左端索引为0可省略 L[-2 : ] #取倒数第2个一直到末尾 L[-3: -1] #取倒数第3和第2个,注意倒数第一个元素的索引是-1 L[ :10 :2] #取前10个数,每2个取1个 L[:] #原样复制一个list
注:tuple也可切片,结果仍是tuple; str同理
迭代
迭代即便利某个list或者tuple,或者str
#dict 迭代key d = {'a': 1, 'b': 2, 'c': 3} for key in d: print(key) #dict默认迭代key,若要迭代value for val in d.values(): print(val) #同时迭代key 和 value for k, v in d.items(): print(k, v) #如果在迭代list时想要下标,可使用 enumerate 函数把list变成索引-元素对 for i, val in enumerate(['A', 'B', 'C']) print(i, val)
列表生成式
列表生成式在python中用来生成list
#生成内容为1到10的list list( range(1, 11) ) #生成从1到10的平方的列表,先把x*x写在前面,列表生成式则用for循环的形式 L = [x*x for x in range(1, 11) ] #可以在for循环后加上if,筛选出偶数的平方 L = [x*x for x in range(1, 11) if x % 2 == 0] #使用双层嵌套循环,生成全排列 [s1 + s2 for s1 in 'ABC' for s2 in 'XYZ'] #遍历字典生成全排列 d = {'x': 'A', 'y': 'B', 'z': 'C' } [k + '=' + 'v' for k, v in d.items()]
生成器 generator
生成器可以使得在循环的过程中不断推算出后面元素,而不必创建完整的list,从而可以节省空间
生成器有两种:列表生成式构造的生成器、由函数构造的生成器
1)列表生成式构造的生成器:将列表生成式的 [ ] 改成 ( ) 即可
L = [x * x for x in range(10)] #普通的列表生成式 g = (x*x for x in range(10)) #g是一个生成器 print(next(g)) #用next()函数可以获得generator的下一个返回值,没有元素时继续调用next() 会抛出StopIteration错误 g = (x*x for x in range(10)) #g是一个生成器 for i in g: #生成器也是可迭代对象,因此可以用for循环 print(i)
2)由函数构造的生成器:使用yield
#例子1 def odd(): #函数中包含yield关键字,则函数不再是普通函数,而是generator print('step 1') yield 1 print('step 2') yield 3 print('step 3') yield 5 myOdd = odd() #这也不是普通的函数调用,而是生成了一个generator对象 next(myOdd) #用next() 函数不断获得下一个返回值
yield:函数执行到yield之后就进行返回,等到下次next()执行时,从上次返回的yield下方继续执行
#例子2,输出杨辉三角:将每一行看作一个list,写一个generator,使得能不断输出下一行的list def triang(): L = [1] while True: yield L lens = len(L) L = [ L[n] + L[n+1] for n in range(0, lens - 1)]#生成每行除了一头一尾的所有数字 L.insert(0, 1) #添加开头的1 L.append(1) #添加末尾的1
注意:1.杨辉三角的第n+1行每一个元素都是第n行的上面两个数的和(除了一头一尾的两个1)
2.while True 很常用
迭代器
可迭代对象 Iterable:可以直接作用于for循环的对象称为可迭代对象,如 list、tuple、dict、set、str等;可使用isinstance() 判断一个对象是否是Iterable对象
isinstance([], Iterable) #判断是否是可迭代对象 isinstance('abc', Iterable) isinstance((x for x in range(10)), Iterable)
迭代器对象 Iterator:可以被next() 函数调用并不断返回下一个值的对象称为迭代器对象;可使用isinstance() 判断对象是否是Iterator对象;
isinstance((x for x in range(10)), Iterator) #生成器既是可迭代对象,又是迭代器对象 iter([1,2,3]) #iter() 函数可以把可迭代对象变成迭代器对象 iter("abcdef")