generator.close() 放在哪里最好?

Where best to put the generator.close()?

我今天早上构建了这个 class,它工作得很好而且很紧凑,但是因为每次我担心它都会调用一个新的生成器来工作,我会在内存中留下一堆。我很乐意在 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)

每个生成器对象都有大量开销用于管理状态和所有内容。除非你出于正当理由需要发电机,否则你应该避免使用它们。在你的情况下,你只生产一个项目,你的生成器不能生产更多,并且一个值可以立即免费获得。所以这里使用生成器是完全错误的。

相反,您可以像这样高效地编写 enter 函数而无需任何开销:

def enter(self):
    for ea in range(self.Entries):
        print("\nPlease input a", self.keyName, "then a", self.valueName)
        x = input("\nEnter a " + self.keyName + ":")
        y = input("\nEnter a " + self.valueName + ":")
        self.Dict[x] = y
    return self.Dict

从你的代码风格来看,我认为你是一个 Java 程序员 python 试一试。

欢迎使用python,您选择了正确的版本:)

python 的一个非常酷的事情是您很少需要担心内存泄漏。 python 使用引用计数确保无法访问的对象得到垃圾回收。

x = next(self.gen("\nEnter a " + self.keyName + ":")) 中发生了 3 件重要的事情:

  • gen(self,dis) 被调用,return生成一个生成器对象
  • next(gen) 将生成器移动到下一个 yield 语句 yield input("Entry: ") 和 returns 产生的值。 请注意,它 不会 导致生成器退出,因为它尚未到达 return 或函数结束。再次调用 next(gen) 会这样做(并提高 StopIteration
  • returned 值绑定到 x,而生成器对象变得不可访问(它没有绑定到它的变量)。因此,生成器对象被 python 垃圾收集器删除。

这就是说,我同意其他人的说法,即生成器不适合此应用程序。不是因为开销——我非常怀疑生成器实例化会在大多数应用程序中引起任何明显的开销——而是因为应用程序非常简单。

此外,如果简化为

,代码将更易于阅读
def gen(self,dis):
        print(dis)
        return input("Entry: ")

def enter(self):
    for ea in range(self.Entries):
        print("\nPlease input a", self.keyName, "then a", self.valueName)
        x = self.gen("\nEnter a " + self.keyName + ":")
        y = self.gen("\nEnter a " + self.valueName + ":")
        self.Dict.update({x:y})
    retrun self.Dict

一般python最好写成idiomatically