Python 为什么即使我没有';t在函数中命中yield关键字
在上面的函数中,数据类型应该是一个列表,作为参数batchsize=None。 但在这两种情况下,此函数都返回生成器。Python 为什么即使我没有';t在函数中命中yield关键字,python,database,python-3.x,postgresql,psycopg2,Python,Database,Python 3.x,Postgresql,Psycopg2,在上面的函数中,数据类型应该是一个列表,作为参数batchsize=None。 但在这两种情况下,此函数都返回生成器。 如果我对函数的其他部分进行注释,那么它将返回一个列表。啊,我明白你的意思了。你在问: 为什么即使我没有在get_data()中点击yield关键字,我仍然会收到生成器 问题是,至少包含一个yield语句的函数是一个生成器。因此,您的get_data()函数是一个生成器。因此,您总是从get\u data()接收生成器对象 在生成器中,return的含义与普通函数略有不同。在生成
如果我对函数的其他部分进行注释,那么它将返回一个列表。啊,我明白你的意思了。你在问: 为什么即使我没有在
get_data()
中点击yield
关键字,我仍然会收到生成器
问题是,至少包含一个yield
语句的函数是一个生成器。因此,您的get_data()
函数是一个生成器。因此,您总是从get\u data()
接收生成器对象
在生成器中,return
的含义与普通函数略有不同。在生成器中,任何return x
语句都相当于raise StopIteration(x)
当您用else
注释掉部分时,您注释掉yield
语句,因此get_data()
成为一个普通函数。因此,它会像您期望的那样返回一个列表
相关SO帖子:好的,那么这里的问题是什么?你想实现什么?我希望这个函数在batchsize=None时返回一个列表,在batchsize不是None时返回一个生成器。但现在我只为这两种情况准备发电机。我是不是遗漏了什么?是的,你说得对,谢谢你的解释。更新问题
def get_data(batchsize=None):
conn = psycopg2.connect('database parameter')
cursor = conn.cursor()
query = 'select * from table'
cursor.execute(query)
if not batchsize:
result = cursor.fetchall()
return result
else:
while True:
result = cursor.fetchmany(batchsize)
if not result:
break
yield result
if __name__ == '__main__':
data = get_data()