【问题标题】:Is it possible to return a value while still modifying it?是否可以在仍然修改它的同时返回一个值?
【发布时间】:2018-11-23 06:29:03
【问题描述】:

老实说,对我来说这个问题的标题并不容易,基本上有办法修改函数的返回值,同时在同一行中返回它。

示例 - 可迭代类的自定义实现

我想替换这个:

def __next__(self):
    if self.count <= 0:
        raise StopIteration
     r = self.count
     self.count -= 1
     return r

有了这个:

def __next__(self):
    if self.count <= 0:
        raise StopIteration
    return self.count -= 1

老实说,我知道这可能看起来很轻浮(可能是这样),但我之所以这样做,是因为我是单行字的粉丝,这归结为使即使像这样简单的过程在逻辑上更具可读性;另外,根据实现的不同,它将取消必须将值 r 保存在内存中(我知道我知道,消除对 r 的需要并没有显着的收益,但嘿我只是问这是否可能)。

我知道我只举了一个例子,但这恰好是我能想到的唯一一个需要这样的例子。 Python 是一种美妙的语言,充满了许多特殊的东西,比如 +=__iadd__ 的“包装器”,我的问题是我错过了什么吗?或者这是否可能......为什么必须将其用作单行而不是与 return 语句一起使用,因为它不会返回其更改后的值?

【问题讨论】:

  • “根据实现的不同,它会取消必须在内存中保存值 r” - 你真的不应该尝试基于这样的推测进行优化。事实上,不,它不会阻止必须将值保存在内存中,即使存在这样的语法。 (另外,在我知道return x -= y 语法存在的每种语言中,返回的值是减法之后的值,而不是之前的值。)
  • 另外,Python 3 上的方法是__next__
  • 基本上,为什么val += i 不能返回它的改变值呢?在我看来这应该是可行的。
  • 单行被高估了。在 Python 中,赋值不是表达式,所以你不能做那种事情。这是一个深思熟虑的设计决定,以防止 C 允许的难以阅读的嵌套赋值。
  • 但是,我喜欢那些嵌套的作业。越短越好。无论哪种方式,我都没有兴趣,我只是更喜欢在更简单的任务上使用更短的代码

标签: python python-3.x


【解决方案1】:

这是因为-= 修改了变量,并且对它做任何事情,(就像现在你返回的那样)会引发错误。

演示:

>>> a=3
>>> a+(a+=1)
SyntaxError: invalid syntax
>>> # also to show that it does modify the variable:
>>> a=3
>>> a+=1
>>> a
4
>>> 

更新:

你做了两行:

def f(a):
    if a<=0:raise StopIteration
        a-=1;return a

【讨论】:

  • 好的,现在我更喜欢这样,看看它的简单性
  • @Jaba 很高兴为您提供帮助,:-),???,(刚刚回到 stackoverflow)
  • @Jaba 还没有像承诺的那样回复:-),你可以随时回答,哈哈:D,?
【解决方案2】:
return foobar -= 1

>>> a = 3
>>> b = (a += 1)
  File "<stdin>", line 1
    b = (a += 1)
            ^
SyntaxError: invalid syntax

在 Python 中是不可能的。

虽然第一个解决方案需要为这个时间步再存储一个变量(或多做一个操作),但引用Python Zen:可读性很重要。

【讨论】:

  • 我知道return foo-=1 是不可能的,我想问是否有办法做到这一点,而不像我的第一个例子那样冗长。我只是觉得return foo-=1 易于阅读,但没有后者那么冗长
猜你喜欢
  • 1970-01-01
  • 2018-09-02
  • 1970-01-01
  • 1970-01-01
  • 2014-10-31
  • 2019-06-17
  • 1970-01-01
  • 2018-06-07
  • 1970-01-01
相关资源
最近更新 更多