2017年7月2日 星期日

[Python]the-python-iterator-and-list-generator

1.
python可以在給定一個list , tuple或者dict,使用"for"來遍歷所有的item,這叫做送代(iteration),類似C/C++/Jave等近代語言那樣
ex: dict={'a':1, 'b':2,'c':3}
這是字典,有key跟value,要遍歷他的item可用

for key in dict:
   print(key)  c

不過注意,字典形式並非按照list的方法排列,所以可以能輸出的順序不一樣
上述的方法只輸出key,要輸出value的話可以改寫為:

for value in dict.values():
     print(value)  # 2 1 3

當然要同時輸出key:value的形式,則是改為

for key,value in dict.items():
     print(key,value)
# b 2
   a 1
   c 3


但是跟前面講的一樣,輸出的順序會不同,因為dict裡面並非跟list排列順序相同,可能會看到不一樣的結果,如果想要照"順序"的輸出,可以使用關鍵字 "enumerate",因此改寫成這樣
for key,value in enumerate(dict):
     print(key,value)
#
a 1
b 2
c 3

另外這種方法可以用在送代string上,因為學過C/C++的可以知道,string是ch array,在python中也是
ex:
string = 'abcdefg'
for ch in string:
   print(ch)

a
b
c
d
e
f
g

要判斷物件是否可以使用for進行送代
必須要import函式庫
from collections import Iterable
>>>isinstance('abc',Iterable)
True
>>>isinstance(1,Iterable)
False

2.
python中最常使用的莫過於List了,方便,好用,生成快速
python中有許許多多的方法可以生成list

例如手動生成
L1=[1,2,3,4,5,6,7,8,9,10]
或者一行建立
L1=[list(range(1,11)] #[1,2,3,4,5,6,7,8,9,10]
range的特定前面有講過,這邊再說一次,range(start,end),而end是不包含的,也就是說range(1,10),輸出只會1~9

輸出特定值
L=[]
for x in range(1,11):
   L.append(x*x)

print(L) #[1,4,9,16,25,36,49,64,81,100]

其中看到輸出特定值,寫太多行真的很煩,也不太符合python的宗旨
因此python的強大就出來了,所謂的一行輸出可以這樣用

[x*x for x in range(1,11)] #[1,4,9,16,25,36,49,64,81,100]

也會輸出一樣的結果,更棒的是你只寫一行
如果還需要判斷的話,可以這樣添加

[x*x for x in range(1,11) if x%2==0] #[4,16,36,64,100]

什麼意思? 首先透過range輸出 element的平方(x*x),但要判斷輸出值是不是整除2
就是 if x%2==0,因此最終的結果就是綠字

3.
輸出os的目錄

import os
[d for d in os.listdir(".")]

這根據你目前所在的資料夾位置不同,輸出的內容會不同,這邊的輸出就略過不貼
這是輸出當下目錄的目錄名稱跟文件檔名

4.
轉換為list
有一個字典d = {'x': 'A', 'y': 'B', 'z': 'C' }
透過 [k + '=' + v for k, v in d.items()]的方法,可以轉成
['y=B', 'x=A', 'z=C']


所以來一個題目:

L1=['Hello','World',18,55,[1,2,3],None]

如果建立一個lower的小寫陣列,但是包含整數跟list,單單使用[x.lower() for x in L1]一定會報錯,以下是自己的參考範例

from collections import Iterable
L2=[x.lower() for x in L1 if isinstance(x,str)]
print(L2) #['hello','world']

為什麼?首先 from collections import Iterable
這個引用,引入了isinstance這個lib,就是上面提到的,這用來判斷參數的型態,只有true的才會被填入L2的list中,透過"str"這個指定的參數,讓isinstance判斷輸入值"x"是不是符合指定的型態"str"



沒有留言:

張貼留言

[Python] Partial function

在Python中有許多偏函數( Partial function)可以使用,常見的就是string的轉換 ex : int('50') #50 這個例子就是把string type的50轉換成int的50,而且是10進制 那好,問題來了,能不能變成8...