以下代码中使用'或'关键字有什么用?

plx*_*plx 2 python reduce

我无法理解or以下代码中的关键字的使用,该代码取自本网站答案,该答案显示了使用reduce以下方法对列表进行分区的方法:

 def partition(l, p):
     return reduce(lambda x, y: x[not p(y)].append(y) or x, l, ([], []))
Run Code Online (Sandbox Code Playgroud)

我知道如果条件为真,代码将附加到第一个列表,否则它将附加到第二个列表.这部分or x做什么?我试着把它留下来,但我最后说错了TypeError: 'NoneType' object is not subscriptable

Mar*_*ers 5

有人打码打高尔夫球.list.append() 总是返回None,这是一个假值.通过使用,or他们可以lambda返回第二个表达式的结果; None or ... 总是返回结果....

您可以lambda使用完整的函数定义替换它:

def func(x, y): 
    x[not p(y)].append(y)
    return x
Run Code Online (Sandbox Code Playgroud)

无论是lambda和上述重新定义返回x参数,它是累积值reduce()中的每个调用传递.在这种情况下,它是一个元组,有两个列表,其中收集了分区值.

就个人而言,我只是使用了一个循环:

def partition(l, p):
    a, b = [], []
    for v in l:
        target = a if not p(v) else b
        target.append(v)
    return a, b
Run Code Online (Sandbox Code Playgroud)

毕竟,可读性至关重要.此外,因为它避免了额外的函数调用(输入列表中每个值一次额外调用),所以它也快得多:

>>> import timeit
>>> import random
>>> testdata = [random.randrange(1000) for _ in range(10 ** 4)]
>>> predicate = lambda v: v % 2 == 0
>>> def partition_lambda(l, p):
...     return reduce(lambda x, y: x[not p(y)].append(y) or x, l, ([], []))
...
>>> def partition_readable(l, p):
...     a, b = [], []
...     for v in l:
...         target = a if not p(v) else b
...         target.append(v)
...     return a, b
...
>>> timeit.timeit('part(l, p)', 'from __main__ import partition_lambda as part, testdata as l, predicate as p', number=10**3)
2.5286515180487186
>>> timeit.timeit('part(l, p)', 'from __main__ import partition_readable as part, testdata as l, predicate as p', number=10**3)
1.6824414430302568
Run Code Online (Sandbox Code Playgroud)

因此,对于分区10k项目列表1000次,可读版本仅占用reduce()版本所用时间的2/3 .