为什么Python中yield语句在游标下会这样表现?

0 投票
1 回答
2742 浏览
提问于 2025-04-17 16:55

我有以下代码(我知道怎么让它正常工作并且风格正确,但引用它只是为了问一个问题,想了解哪里出错了):

import MySQLdb
import MySQLdb.cursors
connection = MySQLdb.connect(
        host=host, port=port, user=username, passwd=password, db=database, 
        cursorclass=MySQLdb.cursors.SSCursor)
cursor = connection.cursor()
sql = 'SELECT * FROM EXAMPLE_TABLE'
cursor.execute(sql)

def gen():
    yield cursor.fetchmany(5)

for i in gen():
    print i

还有第二个例子:

def gen():
    yield 'spam'

for i in gen():
    print i

# Process finished with exit code 0

我不明白为什么第二个例子只执行一次并且正常结束,而第一个例子却执行了一次后就卡住了,什么也不做。为什么它没有以退出代码0结束呢?

奇怪的行为: 如果在第二个例子中,在循环之前添加以下几行,它也会打印“spam”,然后“卡住”:

connection = MySQLdb.connect(
        host=host, port=port, user=username, passwd=password, db=database, 
        cursorclass=MySQLdb.cursors.SSCursor)
cursor = connection.cursor()
sql = 'SELECT * FROM EXAMPLE_TABLE'
cursor.execute(sql)

更新 回答:Python不会退出程序,直到它的时间连接关闭。

1 个回答

1

我觉得在第一种情况下,你应该这样做:

result = cursor.fetchmany(5)

for item in result:
    yield item

fetchmany 方法会获取查询结果的下一组行,并返回一个元组的列表。

当没有更多的行可用时,它会返回一个 空列表

撰写回答