切片即取一個list 或者 tuple 的部分元素python
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同理app
迭代即使利某個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中用來生成listspa
#生成內容爲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()]
生成器可使得在循環的過程當中不斷推算出後面元素,而沒必要建立完整的list,從而能夠節省空間code
生成器有兩種:列表生成式構造的生成器、由函數構造的生成器對象
1)列表生成式構造的生成器:將列表生成式的 [ ] 改爲 ( ) 便可blog
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下方繼續執行generator
#例子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)it
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")