【问题标题】:What is the term for this expression r = (1 if v in c.values() else 0)这个表达式的术语是什么 r = (1 if v in c.values() else 0)
【发布时间】:2018-12-08 17:12:56
【问题描述】:

这个表达式r = (1 if v in c.values() else 0) 在计算机科学中有一个特定的术语/名称吗?

def Query(queries):
    from collections import Counter

    c=Counter()
    result=[]

    for k,v in queries:
        if k==1:
            c[v]+=1


        elif k==2 and v in c:
            c[v]-=1

        elif k==3:

            r = (1 if v in c.values() else 0)
            result+=[r]

    return result

【问题讨论】:

  • 三元或条件表达式?
  • @sacul 是的 - 但要清楚,条件表达式是一个子集(一种)三元表达式。 “三元”只是意味着技术上有 3 个操作数,与 C 语言中的 ?: 相同

标签: python-3.x function counter


【解决方案1】:

Python 将 表达式statements(指令)区分开来,后者计算出一个值。任何表达式都可以用作 Python 中的语句(作为表达式语句),在这种情况下,值会被简单地丢弃。其他类型的语句可能包含表达式,表达式可能包含子表达式。

r = (1 if v in c.values() else 0) 不是表达式,甚至不是表达式语句。这是一个赋值语句

在它的右边,这个赋值语句包含一个conditional expression(1 if v in c.values() else 0),包含三个子表达式,

比较计算为布尔值,并且比简单的算术运算符具有更复杂的计算规则,因为它们可以链接起来。此比较仅使用单个运算符 in,并包含两个子表达式,

  • 一个identifier原子v,和
  • 一个比较器,一个电话:c.values()

调用表达式包含一个属性引用 primary c.values。这被认为是调用表达式的子表达式。

您可以通过使用 ast 模块准确了解 Python 是如何解析它的。

>>> import ast
>>> print(ast.dump(compile('r = (1 if v in c.values() else 0)', '<str>', 'exec', ast.PyCF_ONLY_AST)))
Module(body=[Assign(targets=[Name(id='r', ctx=Store())], value=IfExp(test=Compare(left=Name(id='v', ctx=Load()), ops=[In()], comparators=[Call(func=Attribute(value=Name(id='c', ctx=Load()), attr='values', ctx=Load()), args=[], keywords=[])]), body=Num(n=1), orelse=Num(n=0)))])

这在一行上有点难以阅读。在这里重新格式化。我还剥离了编译创建的模块包装器,这与本次讨论无关。

Assign(
    targets=[Name(id="r", ctx=Store())],
    value=IfExp(
        test=Compare(
            left=Name(id="v", ctx=Load()),
            ops=[In()],
            comparators=[
                Call(
                    func=Attribute(
                        value=Name(id="c", ctx=Load()), attr="values", ctx=Load()
                    ),
                    args=[],
                    keywords=[],
                )
            ],
        ),
        body=Num(n=1),
        orelse=Num(n=0),
    ),
)

【讨论】:

    猜你喜欢
    • 2015-06-02
    • 2018-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多