【发布时间】:2016-01-07 16:06:37
【问题描述】:
我今天早上构建了这个类,它工作得很好而且很紧凑,但是因为每次我担心我会在内存中留下一堆东西时,它都会调用一个新的生成器来工作。我很想在最后的 yield 语句之后立即执行此操作。看起来会干净一些。
class Enter:
def __init__(self,Entries, container=[], keyName = "Key", valueName = "Value"):
self.Dict = {}
self.Entries = Entries
self.container = container
self.keyName = keyName
self.valueName = valueName
def gen(self,dis):
print(dis)
yield input("Entry: ")
def enter(self):
for ea in range(self.Entries):
print("\nPlease input a", self.keyName, "then a", self.valueName)
x = next(self.gen("\nEnter a " + self.keyName + ":"))
y = next(self.gen("\nEnter a " + self.valueName + ":"))
self.Dict.update({x:y})
retrun self.Dict
def enterList(self):
lst = []
for ea in range(self.Entries):
print("\nSome Message")
x = next(self.gen("\nEnter: "))
lst.append(x)
if self.container == ():
lst = tuple(lst)
return lst
Dictionary = Enter(Entries = 2, keyName = "First Name", valueName="LastName").enter()
print(Dictionary)
output = Enter(Entries = 3, container= () ).enterList()
print(output)
【问题讨论】:
-
使用生成器有点奇怪。为什么没有常规的函数调用和返回语句?
-
像每个对象一样,一旦没有指向它的引用,生成器就会被垃圾回收器释放。由于您只在每个生成器上调用
next(),因此您没有引用,因此它们不会无限期地留在内存中。他们最终会被释放。不过,您正在为这些生成器节省大量样板内存。如果您只有一个值,请不要使用生成器。 -
多少样板?我又做了一些工作,将它重命名为 Entry,现在它只返回一个列表、元组或字典,只需要一个小方法。我只向 def init 添加了一个参数。我是新手,所以我还没有看到其他任何东西可以用这么少的代码做到这一点。我还是想取出indiv。手动生成生成器,但如果涉及的样板规模太大和/或有明显更好的东西,我想澄清一下。
标签: python python-3.x generator