Python中的管道字符

131

我在一个函数调用中看到了一个“管道”字符 (|):

res = c1.create(go, come, swim, "", startTime, endTime, "OK", ax|bx)

ax|bx中的竖线的含义是什么?


这对你来说应该很有趣:https://dev59.com/nV4c5IYBdhLWcg3wJnf8 - Alfredo Lozano
7个回答

201

这也是并集运算符

set([1,2]) | set([2,3])

这将导致 set([1, 2, 3])


18
这很可能比位运算更为普遍。 - jpmc26

92

它是整数的按位或运算。例如,如果axbx中有一个或两个都为1,则结果为1,否则为0。它也可以用于其他整数,例如15 | 128 = 143,即二进制下的00001111 | 10000000 = 10001111


7
Python没有逻辑或运算符。 - Ignacio Vazquez-Abrams
2
5 = 101,7 = 111,101 | 111 = 111 = 7。 - Paul R
21
Python没有逻辑或运算符?!那么你称 or 为什么? - jscs
25
正确。与其总是返回"True"或"False", "and"和"or"始终返回它们的一个操作数,因此称为"合并"而不是"逻辑"。 - Ignacio Vazquez-Abrams
7
Mike说的。更一般地说,它调用第一个操作数的__or__方法与第二个操作数进行或运算,因此您可以为自己的类定义其行为。 - Dawn Drescher
显示剩余4条评论

34

是的,以上所有答案都是正确的。

虽然您可能会发现"| "有更多奇特的用例,但如果它是一个类使用的重载运算符,例如

https://github.com/twitter/pycascading/wiki#pycascading

input = flow.source(Hfs(TextLine(), 'input_file.txt'))
output = flow.sink(Hfs(TextDelimited(), 'output_folder'))

input | map_replace(split_words, 'word') | group_by('word', native.count()) | output
在这种特定的用例中,管道符“|”可以被看作是Unix管道符。但是我同意,在Python中,“|”更常用于按位操作符和并集运算符。

33
Python 3.9 - PEP 584 - Add Union Operators To dict规范部分中,解释了该运算符。竖线被增强以合并(联合)字典。
>>> d = {'spam': 1, 'eggs': 2, 'cheese': 3}
>>> e = {'cheese': 4, 'nut': 5}
>>> d | e
{'spam': 1, 'eggs': 2, 'cheese': 4, 'nut': 5} # comment 1
>>> e | d
{'cheese': 3, 'nut': 5, 'spam': 1, 'eggs': 2} # comment 2

注释 1 如果一个键在两个操作数中都出现了,那么最后出现的值(即右操作数中的值)将获胜 --> 'cheese':4 而不是'cheese':3

注释 2 cheese出现了两次,所以选择第二个值,因此d [cheese] = 3


我遇到了一个来自SqlAlchemy的导入语句:S = Session | scoped_session。这表明它甚至可以与类一起使用。 - Gabor

14

7
这是按位或运算。
Python中所有运算符的文档可以在Python文档的索引-符号页面中找到。

1
总结和扩展之前的回答: | 运算符最初用于执行位或操作。这里有一个关于位运算的教程。
f'{0b1100 | 0b1010 :04b}' == '1110'

另一方面,Python运算符可以通过重载它们的等效运算符函数来进行重载。特别地,|可以通过实现函数__or__(和__ror__来进行重载。任何Python库,无论是标准库还是用户库,都可以重载任何运算符(例如,存档的PyCascading)。
Python内置类型,如setdict,通过重载|来定义并集和合并操作。特别是在Python 3.9PEP 584中,对dict和其他标准库类型引入了重载的|和其他运算符。
# sets; | does union of sets
#  the order does not matter, i.e., the operation is commutative
{1, 2} | {2, 3} == {1, 2, 3}

{2, 3} | {1, 2} == {1, 2, 3}


# dicts; | does "merging" of dicts
#   the order does matter, i.e., the operation is NOT commutative
{'a': 1, 'b': 2} | {'b': 99, 'c': 3} == {'a': 1, 'b': 99, 'c': 3}

{'b': 99, 'c': 3} | {'a': 1, 'b': 2} == {'a': 1, 'b': 2, 'c': 3}

最近,一个流行的重载和使用 | 运算符的例子是在 Python LangChain 库 中用于 链式/管道操作。这是 LangChain 如何重载该运算符的精确代码
# LangChain chained sequence of components
chain = prompt | model | output_parser

1
+1 for langchain,我一直在努力弄清楚它如何使用管道运算符,却错过了可运行的东西。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接