Python中的最小值或最大值赋值运算符[关闭]
Posted
技术标签:
【中文标题】Python中的最小值或最大值赋值运算符[关闭]【英文标题】:Min or Max assignment operator in Python [closed] 【发布时间】:2015-03-02 02:57:11 【问题描述】:给定:
variableX = 5
someValueY = 6
假设您要分配给variableX
variableX
和someValueY
的最大值:
variableX = max(variableX, someValueY)
我不止一次认为有这样的东西会很好:
variableX max= someValueY
类似于+=
和其他赋值运算符。
这是个好主意吗?它已经存在了吗?这不是 Pythonic 吗?
【问题讨论】:
为什么这是个好主意?存在增强操作以使左侧对象有机会进行就地更改。max()
永远不会改变它的操作数。这与max()
不是运算符这一事实完全不同。它是一个函数,它需要更多可选参数,如果它是运算符,则无法传入。
Downvote 不是我的,但“为什么我最喜欢的复合赋值运算符不是语言 X 的一部分”不是很有建设性。这样一个“Pythonic”的运算符看起来也很主观。
我没有投票,但 good idea 和 Pythonic 部分显然是主观的(因此偏离主题)。我个人认为这种表示法并不直观,除了几次击键外,我看不出它会买什么。至于是否存在,恐怕答案是no。
@jonrsharpe 错了。 foo = foo + bar
也以相同的方式读取,但我们仍然有 foo += bar
G++ used to have operators that did this but removed them,可能是因为 C++ 添加了其他计算最小值和最大值的方法:“G++ 最小和最大运算符(<?
和 >?
)及其复合形式(<?=
)和>?=
) 已被弃用,现在已从 G++ 中删除。使用这些运算符的代码应修改为使用 std::min 和 std::max。"
【参考方案1】:
根据language reference,“增强分配”:
是二元运算和赋值语句在单个语句中的组合
(强调我的)。 max
不是二元运算(它需要任意数量的位置参数加上 key
关键字参数),因此您建议的运算符与现有套件不一致。你大概也想要min=
,但是the other built-in functions呢?
请注意,在实现层面上,该提议意味着为 Python 代码的解析增加一整层复杂性;如果名称恰好是 max
(或 min
,或您想要提供的任何其他内容)或 any 名称将被以相同方式处理,则解析有一些例外,即:
foo func= bar
只是语法糖:
foo = func(foo, bar)
(或func(bar, foo)
;如果函数不是commutative怎么办?)
在 cmets 中,您提到 x max= y, z
将变为 x = max(x, y, z)
,因此第二个参数是一个被解包的元组,例如:
foo func= bar
将被翻译成:
foo = func(foo, *bar)
(这意味着单个值需要尾随逗号:x max= y,
),或者我们正在实现更多新语法。
这是在实现、测试和维护方面的大量努力(更不用说初学者在阅读 Python 代码之前要学习的另一件事)。向语言添加新语法必须始终具有非常强的大小写,并且根据the Zen of Python (import this
):
应该有一种——最好只有一种——显而易见的方法。
“一种明显的方式” 是现有的语法,foo = func(foo, bar)
。根据relevant PEP
Python 中增强赋值背后的想法是,它不仅仅是 一种更简单的方法来编写存储结果的常见做法 左手操作数中的二元运算,但也是一种方法 有问题的左手操作数知道它应该在 它自己”,而不是创建自己的修改副本。
为了适用于max=
,我们现在必须允许对象实现,例如__imax__
(c.f. __iadd__
for +=
),这意味着也有一个常规的__max__
方法,并可能导致任意的__func__
和__ifunc__
方法,这是另一种蠕虫。我越想这个想法就越糟糕……
在类中,您可以使用描述符来实现这一点,以设置特定属性的最大值和最小值;参见例如Implementing a decorator to limit setters.
【讨论】:
【参考方案2】:你的要求基本上是一样的:
为什么我们不能通过 x++
来增加 x
?
答案也基本相同:
我们可以,但所带来的好处不值得付出所需的工作量和可维护性。
--
更新:回答您的问题部分它是否已经存在? - 否。
【讨论】:
这是对一个完全不同的问题的出色而全面的回答! @jonrsharpe 完全不同的问题实际上是相似的,因为它涉及对相似概念的类似询问 链接的答案很好地解释了为什么++
特别是没有在 Python 中使用。它不涵盖添加新语法的任何一般问题,包括您的答案所表达的观点。它实际上并不支持您的论点(并不是说它无效)。
@jonrsharpe 我认为以“我怀疑 ++ 和 -- 运算符为了一致性和简单性而被排除在外”然后继续讨论的部分在这里是相关的 - 并不是说它是 一模一样,只是说相似,有助于理解我的答案
但是这些论点都与本案无关。如果此处存在解析歧义,则您的答案不会对此进行扩展。 “更简单的语言”段落涵盖了与本案完全无关的历史。 ++val
与 val++
的副作用问题不适用。你已经有效地说过“假设你真的想知道别的东西,你的答案就在这个other castle”中。您提供的唯一参数(额外工作)在其他答案中根本没有引用。以上是关于Python中的最小值或最大值赋值运算符[关闭]的主要内容,如果未能解决你的问题,请参考以下文章