2016-08-14 90 views
1

下面的代碼過濾了圖片,現在我想逐個調用for循環中的每個圖片的兩個函數;第一個check_image_size,然後是binarization。我無法找出正確的語法。在python for循環中調用多個函數

import os, sys 

check_image_size(pic) 
binarization(pic) 

folder = '../6'   
names = [check_image_size(os.path.join(folder, name)) 
     for name in os.listdir(folder) 
     if not name.endswith('bin.png') 
     if not name.endswith('.jpg') 
     if not name.endswith('.nrm.png') 
     ] 

回答

1

你在這裏做什麼不是定義for循環的實際方法。你使用的是列表理解。

什麼是列表理解?

列表理解用於快速等價循環的值。例如:

x = [] 
for i in range(10): 
    if i % 2 == 0: 
     x.append(i) 

等同於:

x = [i for i in range(10) if i % 2 == 0] 

雙方將給出值:

>>> x 
[0, 2, 4, 6, 8] 

好吧......那麼如何for循環定義?

for循環的定義在語句的開頭使用for關鍵字,而不是語句的延續。正如你可以在上面看到,您的代碼可以轉換成類似:

# ... 
names = [] 
for name in os.listdir(folder): 
    if not name.endswith('bin.png') if not name.endswith('.jpg') if not name.endswith('.nrm.png'): 
     names.append(check_image_size(os.path.join(folder, name))) 

現在,你會看到,你可以保持相同的縮進級別check_image_size(os.path.join(folder, name))後,加入更多行:

# ... 
names = [] 
for name in os.listdir(folder): 
    if not name.endswith('bin.png') if not name.endswith('.jpg') if not name.endswith('.nrm.png'): 
     names.append(check_image_size(os.path.join(folder, name))) 
     # Add more things here 
     my_other_function_to_run(x) 
     more_other_functions(y) 

我代碼仍然無法運行!

這是因爲在if語句中不能有多於一個if。使用and來表示嚴格的真實關係。

# ... 
names = [] 
for name in os.listdir(folder): 
    if not name.endswith('bin.png') and not name.endswith('.jpg') and not name.endswith('.nrm.png'): 
     names.append(check_image_size(os.path.join(folder, name))) 
     # Add more things here 
     my_other_function_to_run(x) 
     more_other_functions(y) 

當然,你可以做嵌套if報表,但他們是不是很漂亮:

# ... 
names = [] 
for name in os.listdir(folder): 
    if not name.endswith('bin.png') 
     if not name.endswith('.jpg') 
      if not name.endswith('.nrm.png'): 
       names.append(check_image_size(os.path.join(folder, name))) 
       # Add more things here 
       my_other_function_to_run(x) 
       more_other_functions(y) 

最後一個音符

正如我前面所說,你不應該有一個以上的if聲明中的if關鍵字。這同樣適用於列表理解。所以你的原代碼應該是:

# ... 
names = [check_image_size(os.path.join(folder, name)) 
     for name in os.listdir(folder) 
     if not name.endswith('bin.png') 
     and not name.endswith('.jpg') 
     and not name.endswith('.nrm.png') 
     ] 
+0

好吧,但有關調用for循環內的多個函數的任何想法。我很感謝你的迴應。 –

+0

@AnayBose看我最近的編輯。 –