Python中的最小值或最大值赋值运算符[关闭]

Posted

技术标签:

【中文标题】Python中的最小值或最大值赋值运算符[关闭]【英文标题】:Min or Max assignment operator in Python [closed] 【发布时间】:2015-03-02 02:57:11 【问题描述】:

给定:

variableX = 5
someValueY = 6

假设您要分配给variableX variableXsomeValueY 的最大值:

variableX = max(variableX, someValueY)

我不止一次认为有这样的东西会很好:

variableX max= someValueY

类似于+= 和其他赋值运算符。

这是个好主意吗?它已经存在了吗?这不是 Pythonic 吗?

【问题讨论】:

为什么这是个好主意?存在增强操作以使左侧对象有机会进行就地更改max() 永远不会改变它的操作数。这与max() 不是运算符这一事实完全不同。它是一个函数,它需要更多可选参数,如果它是运算符,则无法传入。 Downvote 不是我的,但“为什么我最喜欢的复合赋值运算符不是语言 X 的一部分”不是很有建设性。这样一个“Pythonic”的运算符看起来也很主观。 我没有投票,但 good ideaPythonic 部分显然是主观的(因此偏离主题)。我个人认为这种表示法并不直观,除了几次击键外,我看不出它会买什么。至于是否存在,恐怕答案是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 我认为以“我怀疑 ++ 和 -- 运算符为了一致性和简单性而被排除在外”然后继续讨论的部分在这里是相关的 - 并不是说​​它是 一模一样,只是说相似,有助于理解我的答案 但是这些论点都与本案无关。如果此处存在解析歧义,则您的答案不会对此进行扩展。 “更简单的语言”段落涵盖了与本案完全无关的历史。 ++valval++ 的副作用问题不适用。你已经有效地说过“假设你真的想知道别的东西,你的答案就在这个other castle”中。您提供的唯一参数(额外工作)在其他答案中根本没有引用

以上是关于Python中的最小值或最大值赋值运算符[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

赋值最大最小

关于memset的赋值(最大值最小值的选择)

Python新手学习基础之运算符——赋值与逻辑运算

学习python的第五天

C 或 C++ 中是不是存在用于常见数学运算(例如最小值、最大值和平均值)的可导入库? [关闭]

找出三个数中的最大值或者最小值