从函数中过滤数据的正确方法是什么?我应该尽量压缩所有内容(search\u query)还是每次需要包含新参数时都要过滤列表(search\u query2)。我争论得越多,我就越容易弄不清楚如何处理这个问题。示例:
import os
query = ""
my_path = os.getcwd()
def search_query(query, path, extensions_only=False, case_sensitive=False):
results = []
if extensions_only is True:
for f in os.listdir(path):
if case_sensitive:
if f.endswith(query):
results.append(os.path.join(path, f))
else:
if f.endswith(query):
results.append(os.path.join(path, f).lower())
elif case_sensitive is not True:
for f in os.listdir(path):
if query.lower() in f.lower():
results.append(os.path.join(path, f))
return results
results = search_query("_c", my_path)
print(results)
# Alternative way to deal with this
def search_query2(query, path, extensions_only=False, case_sensitive=False):
results = []
for f in os.listdir(path):
results.append(os.path.join(path, f))
if extensions_only:
filtered_lst = []
for part in results:
if part.endswith(query):
filtered_lst.append(part)
results = filtered_lst
if case_sensitive:
filtered_lst = []
for part in results:
if query in part:
filtered_lst.append(part)
results = filtered_lst
elif not case_sensitive:
filtered_lst = []
for part in results:
if query.lower() in part.lower():
filtered_lst.append(part)
results = filtered_lst
print(results)
return results
search_query2("pyc", my_path, case_sensitive=True)
没有一种适合所有人的“正确”方法来做这样的事情。另一种选择是生成单独的函数,或者这个函数作为包装器调用的私有子函数。你知道吗
在您的具体情况下,有一些方法可以优化您想做的事情,以使其更清楚。你知道吗
你做了很多
这被称为过滤器,python在一行中提供了几种方法
或者
让事情变得更清楚。在您编写的映射中也有类似的情况:
我们还可以组合地图和过滤器:
使用这些,我们可以建立许多过滤器和地图在一行,同时保持非常清楚我们在做什么。这是functional programming的优点之一。你知道吗
我已将您的代码修改为使用generator expressions,当我们调用
list(results)
时,它只会在末尾计算,从而节省了每次创建新列表所浪费的大量时间:是否要筛选所有相同类型的文件?您可以使用glob模块来实现这一点。 例如
我喜欢在一开始就“准备”我的条件,使事情变得整洁,并使以后变得容易些。确定不同参数对代码的影响。在本例中,“区分大小写”定义是否使用f.lower(),而“扩展名”定义比较方法。 在这种情况下,我会这样写。你知道吗
这使我能够定义每个结果在不同级别上对函数的影响,而不必嵌套它们,也不必为跟踪它们而头疼!你知道吗
相关问题 更多 >
编程相关推荐