#### 切片
在Python中常見的操作是取一個list或tuple的一部分,比如一個list如下:
~~~
L = ['red','yellow','black','orange','white','green','blue']
~~~
取前三個元素的操作,除了用循環,還可以用切片:
~~~
L[0:3]
#表示從索引0開始取,直到索引3為止,但不包括索引3。即索引0,1,2,正好是3個元素
print(L[-2:])
#表示取倒數后兩個
~~~
實例:
~~~
#定義從1到100的序列
L = list(range(100))
#取前十個,同時隔一個數取一個
print(L[:10:2])
~~~
#### 迭代
一般程序語言的迭代使用for。Python的for循環不僅可以用在list或tuple上,還可以作用在其他可迭代對象上。?
除了list這種有下標的數據類型,還有例如dict這樣的無下標的,也可以使用for迭代。
~~~
d = {'funny':1,'lucky':2,'daddy':3}
for key in d:
print(key)
#因為dict的存儲不是按照list的方式順序排列,所以,迭代出的結果順序很可能不一樣。
~~~
同時value也可以迭代。
~~~
for values in d.values():
print(values)
~~~
如何判斷一個對象是可迭代對象呢?方法是通過collections模塊的Iterable類型判斷:
~~~
>>> from collections import Iterable
>>> isinstance('abc', Iterable) # str是否可迭代
True
>>> isinstance([1,2,3], Iterable) # list是否可迭代
True
>>> isinstance(123, Iterable) # 整數是否可迭代
False
~~~
#### 列表生成式(List Comprehensions)
python內置了功能強大的列表生成式。?
實例:
~~~
l = list(range(1,11))
print(l)
~~~
輸出:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]?
實例:輸出1-10 的平方
~~~
L = []
for x in range(1,11):
L.append(x*x)
~~~
練習:?
L1 = [‘Hello’, ‘World’, 18, ‘Apple’, None]?
期待輸出: [‘hello’, ‘world’, ‘apple’]?
code:
~~~
L1 = ['Hello', 'World', 18, 'Apple', None]
L2 = []
for x in L1:
if isinstance(x,str):
L2.append(x.lower())
print(L2)
~~~
#### 生成器
在Python中,一邊循環一邊計算的機制,稱為生成器:generator,即只計算出要使用的數,節省空間。?
要創建一個generator,有很多種方法。第一種方法很簡單,只要把一個列表生成式的[]改成(),就創建了一個generator:
~~~
L = [x * x for x in range(10)]
L
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
g = (x * x for x in range(10))
g
<generator object <genexpr> at 0x1022ef630>
~~~
打印generator:
~~~
g = (x*x for x in range(10))
for x in g:
print(x)
~~~
練習
楊輝三角定義如下:?
1?
1 1?
1 2 1?
1 3 3 1?
1 4 6 4 1?
1 5 10 10 5 1?
把每一行看做一個list,試寫一個generator,不斷輸出下一行的list.
~~~
def triangles():
L = [1]
while True:
yield L
L1 = L[:]
L = []
i = 0
while i < len(L1) - 1:
L.append(L1[i] + L1[i+1])
i = i + 1
L.insert(0, 1)
L.append(1)
n = 0
for t in triangles():
print(t)
n = n + 1
if n == 10:
break
~~~