我想知道如果我循环遍历一堆文件来操作它们会更好。
1)在函数内发送了一个路径和循环:
def convert_png_to_jpg(path_to_images):
all_images = os.listdir(path_to_images)
for image in all_images:
# open file
# do something with my file
2)或者在函数外部进行循环并每次调用函数:
def convert_png_to_jpg(image):
# do something with my image
all_images = os.listdir(path_to_images)
for image in all_images:
# open file
convert_png_to_jpg(image)
对于第二种情况,最好是在函数内部或外部打开图像,如示例所示?
清洁代码方面哪个更好?
答案 0 :(得分:3)
我的观点是,它取决于你想要达到的封装程度。
在这里,您可以将文件和图像转换工作封装在单个函数中,这很好。现在,考虑一下SOLID原则,这里的单一责任在哪里?最好将此功能拆分为2:
这就是为什么我更喜欢选项2d,但是,让我们更进一步。
在第二种情况下,您提取了一个从流中转换图像的逻辑(无论来源是什么),这是好的。保持这种方式。
现在,您列出每个文件,打开并传递给转换函数。这听起来像是一个单独的3个动作吗?如果不再重复使用此代码,您可以在此处停止。
如果您想在任何时候重复使用图像转换逻辑,可以将其移至单独的类或helper
。
我在这里看到两个better
/其他选项:
def convert_png_to_jpg(image):
# do something with my image
def convert_to_jpg(filepath):
# open file
convert_png_to_jpg(image)
all_images = os.listdir(path_to_images) for image in all_images:
convert_to_jpg(image) for image in all_images
提取转换器并在需要的地方使用它。
class PngToJpgConverter(object):
def convert(image):
pass
def convert_from_file(filepath):
# open file
return self.convert(image)
converter = PngToJpgConverter()
all_images = os.listdir(path_to_images)
for image in all_images:
converter.convert_from_file(image)
答案 1 :(得分:1)
我会说专注于可读性。如果你的功能很简单,只有几行,就把它放在循环中。否则,单独的函数使代码更容易阅读。
Others have answered similar questions here.
And here is an explanation of why the loop might be faster in a loop如果您对低级别的表现感兴趣。
答案 2 :(得分:0)
第二种选择似乎更好"正如MrPyCharm所评论的那样。
在任何情况下,您最终都可以创建一个包装函数,该函数接受一个列表并将每个元素提供给该函数以进行一些批处理
def batch_convert_png_to_jpg(path_to_images):
files = os.listdir(path_to_images)
for image in path_to_images:
# do the work