在python for循环中调用多个函数

时间:2016-08-14 03:57:30

标签: python

以下代码过滤图像,现在我想逐个为for循环中的每个图像调用两个函数;先是check_image_size,然后是binarization。我无法弄清楚正确的语法。

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 个答案:

答案 0 :(得分: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')
         ]