Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么即使我没有';t在函数中命中yield关键字_Python_Database_Python 3.x_Postgresql_Psycopg2 - Fatal编程技术网

Python 为什么即使我没有';t在函数中命中yield关键字

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的含义与普通函数略有不同。在生成

在上面的函数中,数据类型应该是一个列表,作为参数batchsize=None。 但在这两种情况下,此函数都返回生成器。
如果我对函数的其他部分进行注释,那么它将返回一个列表。

啊,我明白你的意思了。你在问:

为什么即使我没有在
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()