如何处理函数中的多个参数?

2024-05-29 01:59:54 发布

您现在位置:Python中文网/ 问答频道 /正文

从函数中过滤数据的正确方法是什么?我应该尽量压缩所有内容(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)

Tags: pathinforsearchifosquerylower
3条回答

没有一种适合所有人的“正确”方法来做这样的事情。另一种选择是生成单独的函数,或者这个函数作为包装器调用的私有子函数。你知道吗

在您的具体情况下,有一些方法可以优化您想做的事情,以使其更清楚。你知道吗

你做了很多

x = []
for i in y:
    if cond(i):
        x.append(i)
y = x

这被称为过滤器,python在一行中提供了几种方法

y = list(filter(cond, y))  # the 'functional' style

或者

y = [i for i in y if cond(i)]  # comprehension

让事情变得更清楚。在您编写的映射中也有类似的情况:

x = []
for i in y:
        x.append(func(i))
y = x

# instead do:
y = list(map(func, y))  # functional 
# or
y = [func(i) for i in y]  # comprehension

我们还可以组合地图和过滤器:

x = list(map(func, filter(cond, y)))
x = [func(i) for i in y if cond(i)]

使用这些,我们可以建立许多过滤器和地图在一行,同时保持非常清楚我们在做什么。这是functional programming的优点之一。你知道吗


我已将您的代码修改为使用generator expressions,当我们调用list(results)时,它只会在末尾计算,从而节省了每次创建新列表所浪费的大量时间:

def search_query2(query, path, extensions_only=False, case_sensitive=False):

    results = (os.path.join(path, f) for f in os.listdir(path))

    if extensions_only:
        results = (part for part in results if part.endswith(query))
    elif case_sensitive:  # I'm pretty sure this is actually the logic you want
        results = (part for part in results if query in part)
    else:
        results = (part for part in results if query.lower() in part.lower())

    return list(results)

是否要筛选所有相同类型的文件?您可以使用glob模块来实现这一点。 例如

import glob

# Gets all the images in the specified directory.
print(glob.glob(r"E:/Picture/*/*.jpg"))

# Gets all the .py files from the parent directory.
print glob.glob(r'../*.py') 

我喜欢在一开始就“准备”我的条件,使事情变得整洁,并使以后变得容易些。确定不同参数对代码的影响。在本例中,“区分大小写”定义是否使用f.lower(),而“扩展名”定义比较方法。 在这种情况下,我会这样写。你知道吗

def search_query(query, path, extensions_only=False, case_sensitive=False):
results = []

for f in os.listdir(path):
    if case_sensitive is True:
        fCase=f.lower()
        queryCase = query.lower()
    elif case sensitive is False:
        fCase = f
        queryCase = query

if extensions_only is True:
    if f.endswith(query):
                results.append(os.path.join(path, f))
elif extensions_only is False:
    if query in f:
            results.append(os.path.join(path, f))
return results

results = search_query("_c", my_path)
print(results)

这使我能够定义每个结果在不同级别上对函数的影响,而不必嵌套它们,也不必为跟踪它们而头疼!你知道吗

相关问题 更多 >

    热门问题