使用生成器函数python

2024-05-15 01:52:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我在python中练习使用生成器函数,因此定义了如下函数:

def MySQL_product():
   #Establish connection to database
   try:
       connection = msql.connect(host = 'localhost', user = 'max', passwd = 'password', db = 'schools')
   except:
       pass

   #Iterate through each product and insert them in database
   with connection:
       cursor = connection.cursor()
       cursor.execute("SELECT name, age, gender, school
                    WHERE GroupId = 'student' AND Exchange = 'foreign'")
       for product in cursor.fetchall():
           yield product

def main():
    for column in range (0, number_of_schools):
        for product in MySQL_product():
            print product

但是,当我运行这段代码时,我看到的输出是generator object at ...我正在尝试打印数据库中找到的内容。而且,MySQL_product()中的print语句都不会执行。生成器的要点是,它不应该返回数据库中所有行的列表,而是应该逐个返回它。然后我想访问/打印这些项目。如何修复此代码?在


Tags: 函数代码in数据库for定义defmysql
3条回答

是的,生成器就是这样工作的——它总是返回一个迭代器,然后可以与for语句一起使用。您可能需要将main()函数改为如下所示:

def main():
    for column in range (0, number_of_schools):
        for student in MySQL_product():
            print student

还可以使用^{}函数获得迭代器生成的下一个结果,但一般来说,您应该更喜欢直接使用for item in iterator: # ...进行迭代(因为您的代码将更容易阅读,并且在您执行类似于从生成器函数切换回返回列表的常规函数的情况下不那么脆弱)。在

我的第一个答案是不正确的,其他人已经给出了最好的解决方案,所以我将陈述备选方案和一个潜在的用例。如果您需要一次迭代两个生成器项,或者以任何其他自定义方式,那么next方法可能很有用。在

def gen():
    for i in range(20):
        yield i

for i in gen():
    print "Center", str(i).center(10)

a = gen()    
for i in range(10):
    left = str(a.next()).ljust(10)
    right = str(a.next()).rjust(10)

如果你在做一个游标.fetchall(),这意味着您要将所有可用的结果从SQL server复制到python的内存中。所以在这种情况下,生成器不能提供任何东西。在

如果你用cursor.fetchmany()或游标.fetchone(),唯一的好处是Python的内存消耗,因为一次只处理“一些”或“一个”结果。在SQL端,服务器仍然会缓存结果集(消耗SQL服务器上的宝贵资源)

但是,最终-如果你真的处理结果是块-因为你会在一个循环中:

while there_are_more_results:
    results = cursor.fetchmany(10)
    for result in results:
        do_something(result)

拥有一个生成器并不会给你带来真正的好处,因为当你从mysql获得更多的结果时,你必须阻止它。在

但是,回答你的问题

要使现有代码生效,您需要做的是:

^{pr2}$

当你异步地做事情时,生成器是非常有用的——基本上,如果一个生成器还没有准备好——你只需跳过它,让其他的事情工作。在

相关问题 更多 >

    热门问题