我想知道如果我循环处理一堆文件来操作它们,什么会更好。
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)
对于第二种情况,是像示例中那样在函数内部还是外部打开图像更好?
在干净的代码方面,什么更好?
我的观点是,这取决于您想要实现的封装级别。
第一种情况
在这里,您可以将文件和图像转换封装在一个函数中,这很好。现在,想想SOLID原则,这里的单一责任在哪里?最好将此函数拆分为2:
- 获取流
- 将图像流转换为所需格式
这就是为什么我更喜欢选项2d,不过,让我们走得更远。
第二种情况
在第二种情况下,您从流中提取转换图像的逻辑(无论源是什么),这是好的。保持这种状态。
现在,列出每个文件,在中打开并传递给转换函数。这听起来像三个单独的动作吗?如果不打算重用此代码,您可以在此停止。
如果在任何时候想要重用图像转换逻辑,可以将其移动到一个单独的类或helper
中。
我在这里看到两个better
/其他选项:
选项#1
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
选项#2
提取转换器并在需要的地方使用。
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)
我想说的是,要专注于可读性。如果你的函数很简单,只有几行,就把它放在循环中。否则,单独的函数会使代码更易于阅读。
其他人也在这里回答了类似的问题。
如果您对低级别的性能感兴趣,这里解释了为什么循环在循环中可能更快。
正如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