以下代码过滤图像,现在我想逐个为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')
]
答案 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
关键字定义,而不是语句的延续。如您所见,您的代码可以转换为:
# ...
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')
]