標籤:abc 建立 pytho 3.3 return set 實現 ict yield
3.進階特性3.1切片
L = list(range(100))
L[0:3]表示,從索引0開始取,直到索引3為止,但不包括索引3
如果第一個索引是0,還可以省略 L[:3]
也支援取倒數元素 L[-2:] 取L集合的倒數2位元素
L[10:20] 取前11-20個數:
L[:10:2]取前10個數,每兩個取一個
L[::5] 所有數,每五個取1個
‘ABCDEFG‘[:3]
Python沒有針對字串的截取函數,只需要切片一個操作就可以完成,非常簡單
3.2 迭代
python中不管迭代對象有無下標,都可以進行迭代
那麼如何判斷一個對象是否可迭代呢?from collections import Iterable
isinstance(‘abc‘, Iterable) ;
在Java裡可以迭代下標,python裡可以使用enumerate 函數迭代索引和元素的
for i, value in enumerate([‘A‘, ‘B‘, ‘C‘]):
... print(i, value)
3.3 列表產生,是Python內建的非常簡單卻強大的可以用來建立list的產生式。
L = []
>>> for x in range(1, 11):
... L.append(x * x)#使用迴圈
#使用列表產生式
[x*x for x in range(1,11)if x%2 == 0] #要產生的元素x*x放置前面
#使用2層迴圈,產生全排列
[m+n for m in ‘ABC‘ for n in ‘XYZ‘]
import os # 匯入os模組,模組的概念後面講到
>>> [d for d in os.listdir(‘.‘)] # os.listdir可以列出檔案和目錄
#for迴圈其實可以同時使用兩個甚至多個變數,比如dict的items()可以同時迭代key和value:
d = {‘x‘: ‘A‘, ‘y‘: ‘B‘, ‘z‘: ‘C‘ }
>>> for k, v in d.items():
... print(k, ‘=‘, v)
#列表產生式也可以使用兩個變數來產生list:
d = {‘x‘: ‘A‘, ‘y‘: ‘B‘, ‘z‘: ‘C‘ }
>>> [k + ‘=‘ + v for k, v in d.items()]
[‘y=B‘, ‘x=A‘, ‘z=C‘]
#list中所有的字串變成小寫:
L = [‘Hello‘, ‘World‘, 18, ‘Apple‘, None]
>>> [s.lower() for s in L if isinstance(s,str) == True]
3.4 產生器
列表的空間是有限的,在python中,一邊迴圈一邊計算的機制 generator
g = (x * x for x in range(10))
for n in g:
print(n)
#著名的斐波拉契數列(Fibonacci),除第一個和第二個數外,任意一個數都可由前兩個數相加得到:1, 1, 2, 3, 5, 8, 13, 21, 34, ...
def fib(max):
n, a, b = 0, 0, 1
while n < max:
print(b)
a, b = b, a + b
n = n + 1
return ‘done‘
#上面的函數和generator僅一步之遙。要把fib函數變成generator,只需要把print(b)改為yield b就可以了:
#generator函數 在執行過程中,遇到yield就中斷,下次又繼續執行。
##楊輝三角
def triangles():
L = [1] #定義一個list[1]
while True:
yield L
L = [L[i] + L[i + 1] for i in range(len(L) - 1)]
L.insert(0,1)
L.append(1)
if(len(L)>10):
break
#產生一個generator對象,然後通過for迴圈迭代輸出每一行
a=triangles(10)
for i in a:
print(i)
3.5迭代器
直接作用於for迴圈的資料類型有以下幾種:
一類是集合資料類型,如list、tuple、dict、set、str等;
一類是generator,包括產生器和帶yield的generator function。
Iterable 這些可以直接作用於for迴圈的對象統稱為可迭代對象:Iterable。
可以使用isinstance()判斷一個對象是否是Iterable對象:
isinstance({}, Iterable) #True
Iterator 可以被next()函數調用並不斷返回下一個值的對象稱為迭代器:Iterator
可以使用isinstance()判斷一個對象是否是Iterator對象:
isinstance((x for x in range(10)), Iterator) #True
isinstance(‘abc‘, Iterator) #False
-------------------------------------------------------------
是因為Python的Iterator對象表示的是一個資料流,Iterator對象可以被next()函數調用並不斷返回
下一個資料,直到沒有資料時拋出StopIteration錯誤。可以把這個資料流看做是一個有序序列,
但我們卻不能提前知道序列的長度,只能不斷通過next()函數實現按需計算下一個資料,
所以Iterator的計算是惰性的,只有在需要返回下一個資料時它才會計算。
-------------------------------------------
集合資料類型如list、dict、str等是Iterable但不是Iterator,不過可以通過iter()函數獲得一個Iterator對象。
Python之進階特性