哪里最好把generator.close()?

时间:2016-01-07 16:06:37

标签: python python-3.x generator

我今天早上打造这个课程,它很好用而且很紧,但是因为每次我担心我都会把一个新的发电机召唤起来,所以我会留下一堆记忆。我很乐意在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)

2 个答案:

答案 0 :(得分:4)

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

相反,您可以像这样有效地编写 foreach (AnalystField field in analyst.Script.Normalize.NormalizedFields) { field.NormalizedHigh = 1.0; field.NormalizedLow = 0.0; } 函数,而无需任何开销:

enter

答案 1 :(得分:2)

根据你的代码风格来判断,我说你是Java程序员,让python成为一种旋风。

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

关于python的一个非常酷的事情是你很少需要关注内存泄漏。 python使用引用计数来确保无法访问的对象被垃圾收集。

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

    调用
  • gen(self,dis),返回生成器对象
  • next(gen)将生成器移动到下一个yield语句yield input("Entry: ")并返回生成的值。 请注意,导致生成器退出,因为它尚未到达返回或函数结束。再次拨打下一个(gen)会执行此操作(并提升StopIteration
  • 返回值绑定到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

一般来说,编写idiomatically

时,python最好