在列表中有“and”命令

2024-09-29 19:35:32 发布

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

我不明白这段源代码在第3行做了什么,res = [...];我试图通过在python控制台中用伪变量和res = ['raj' / 'esh'];一样的语法格式进行测试来理解它,它给出了错误;如果用res = ['raj' and 'esh'];测试,我总是返回第二个字符串'esh',所以我不明白为什么要在行中使用'and'。语法p/o也让我困惑

def _get_files(parent, p, f, extensions):
    p = Path(p)  #.relative_to(parent)
    res = [p/o for o in f if not o.startswith('.')
           and (extensions is None or f'.{o.split(".")[-1].lower()}' in extensions)]
    return res

参数p解析为文件路径(字符串),参数f解析为f = [o.name for o in os.scandir(path) if o.is_file()];其中,此语法行中的路径是文件路径。能帮我理解第三行吗


Tags: and文件字符串in路径for参数if
2条回答

['raj' and 'esh']是一个单元素数组,其唯一元素是'raj''esh'的结果and如果是falsy,则计算第一个操作数,否则计算第二个操作数。因为第一个操作数不是假操作数,所以得到'esh'

代码中的行不是一个简单的数组,它是一个理解——基本上是编写构造数组的循环的短方法。理解的一般语法是

[x for y in z if p]

如果y将循环遍历iterable z的所有元素,请检查p是否为true,如果为true,请将x添加到结果中。在您的例子中,条件(p)是

not o.startswith('.')
and
(extensions is None or f'.{o.split(".")[-1].lower()}' in extensions)

对于f的每个元素o(可能是一个文件名的iterable),如果这个条件为真,结果列表将获得一个元素,该元素由路径p与文件名o(如果乍一看很惊讶,那么/是一个自然的路径连接运算符)组成

代码段中显示的错误命名使问题更加复杂。考虑一下重写:

def _hidden(filename):
    return filename.startswith('.')

def _extension(filename):
    return '.' + filename.split(".")[-1].lower()

def _extension_ok(filename, allowed_extensions=None):
    return allowed_extensions is None
           or _extension(filename) in allowed_extensions

def _get_files(parent, path, filenames, allowed_extensions=None):
    path = Path(path)
    good_paths = [path/filename for filename in filenames
                  if not _hidden(filename)
                     and _extension_ok(filename, allowed_extensions)]
    return good_paths

现在,它读起来几乎像英语,并且非常清楚它在做什么(唯一不可靠的部分是path/filename,几乎任何人都可以通过与UNIX路径的类比猜到这可能是什么)

它是一个list comprehension

res = [p/o for o in f if not o.startswith('.')
       and (extensions is None or f'.{o.split(".")[-1].lower()}' in extensions)]

res = []
for o in f:
    if not o.startswith('.') and (extensions is None or f'.{o.split(".")[-1].lower()}' in extensions):
        res.append(p/o)

相关问题 更多 >

    热门问题