【发布时间】:2020-08-03 14:31:14
【问题描述】:
我有一个定义属性 (self.b) 的方法 (dosomething)。下面的虚拟代码:
class foo:
def __init__(self):
self.a = 1
def dosomething(self, i):
self.b = 2 * self.a + i
return self.b ** 2
testobj = foo()
属性 a 可以改变 - 因此在给定 a 的当前值的情况下调用 dosomething 来确定 b。
我想写一个像下面这样的列表理解。除了,我需要调用 dosomething 来改变 b 。下面的虚拟代码只会重复 self.b 的当前值 20 次。
[testobj.b for i in range(20)] # pass i to dosomething then store self.b
快速的方法是只返回 self.b 但是,return 语句专注于另一个更复杂的值。如果我可以返回 self.b,那么以下语句将起作用:
[testobj.dosomething(i) for i in range(20)]
属性 b 只是我想要访问的中间值。是否有针对这种情况的单行列表理解?我正在考虑在返回 self.b 的方法中定义一个函数,但是我不确定如何正确访问它。所以像 foo().dosomething(1).getb() 这样的东西不会起作用,因为 dosomething(1) 的计算结果是一个数字。
class foo:
def __init__(self):
self.a = 1
def dosomething(self, i):
self.b = 2 * self.a + i
def getb():
return self.b
return self.b ** 2
我想我还应该补充一点,我不想返回不同值的数据结构。它会影响我在其他地方的大部分代码。
【问题讨论】:
-
只写一个常规循环。会更清楚。
-
您通常不希望您的列表理解执行副作用,并且在 任何 情况下,列表理解的整个 point 是提供一种可读的方式来表达对可迭代对象的映射/过滤操作。如果没有明显的方法,这是一个很好的迹象,您不应该使用列表推导式。
-
你看过房产吗?因为在我看来,您希望
b成为foo的属性,并在每次需要时重新计算其值。或者将a设为属性并在a更改时更新b- 这可能甚至接近您的需要,因为您对dosomething的调用将始终考虑其中任何一个的最新值。 -
注意,你可以做一些可怕的事情,比如
[(obj,do_something(i), obj.b)[1] for i in range(10)]或其他什么,但是为什么?只需使用 for 循环。 -
@tryingtocode101 短代码只有在提高可读性或在某些情况下提高性能时才会更好。但是,除非您正在玩代码高尔夫,否则永远不要将简洁本身视为目标。
标签: python function oop methods list-comprehension