在 python 中使用行程运算符可以不赋值吗?

Is it okay to use itinerary operators in python without assignment?

因此,请考虑我必须根据条件向数组添加值的情况。 我意识到使用没有赋值的三元运算符也可以。 考虑案例:

req_array = []
req_dict={'a':1,'b':2,'c':3}

我必须根据条件向 req_array 添加值。可以有两种方式:

if req_dict.get("a"):
    req_array.append(req_dict['a'])
if req_dict.get("d"):
    req_array.append(req_dict['d'])
if req_dict.get("c"):
    req_array.append(req_dict['c'])

另一种方法是:

req_array.append(req_dict['a']) if req_dict.get('a') else None
req_array.append(req_dict['d']) if req_dict.get('d') else None
req_array.append(req_dict['c']) if req_dict.get('c') else None

它们都可以正常工作。但是,我很好奇在这些情况下推荐的方法是什么?

正如您所指出的,这两种选择都有效,所以主要是个人风格问题。

就我个人而言,我发现这样的三元表达式更难阅读 - 他们开始时声明某些内容将附加到列表中,但当您继续阅读时,您会发现它可能不是由于某些条件。我肯定会接受明确的 if 方法。

有很多方法可以实现这一点,具体取决于您要查找的内容。 条件总是一样的吗?然后你可以定义一个键列表并迭代它。

keys = ['a', 'b', 'c']
req_array = []
req_dict={'a':1,'b':2,'c':3}
for key in keys:
    val = req_dict.get(key)
    if val:  # your condition here
        req_array.append(val)

或一班:

req_array += [req_dict[key] for key in keys if req_dict.get(key)]

合适的方法有很多。有些只是偏好问题。

如果所有键的条件都不同,那么我会选择显式 if,因为这样可读性更强,而且视觉上可以立即识别出模式。

我认为对 side-effects 使用条件运算符与对 side-effects 使用列表理解大致相同。这些表达式旨在产生某种东西,而您正在使用它们来做其他事情而忽略产生的东西(在这种情况下总是 None)。

如果你真的需要one-line它,你随时都可以

if req_dict.get('a'): req_array.append(req_dict['a'])

虽然仍然不是很好的风格(两行更具可读性),但完全合法,不那么冗长(添加 :,删除 else None),并且并不意味着产生未使用的值,即使 if 失败。在 3.8 中,海象运算符甚至可以让您免于执行两次查找,同时仍然允许您 one-line it:

if val := req_dict.get('a'): req_array.append(val)