python - TypeError: * 之后的类型对象参数必须是一个序列,而不是生成器

标签 python generator typeerror

为什么以下 Python 代码会引发错误
TypeError: * 之后的类型对象参数必须是一个序列,而不是生成器
而如果我评论生成器 f 中的第一行(无用的),一切正常吗?

from itertools import izip

def z():
    for _ in range(10): 
        yield _

def f(z):
    for _ in z: pass    # if I comment this line it works! (??)
    for x in range(10):
        yield (x,10*x,100*x,1000*x)

iterators =  izip(*f(z))
for it in iterators:
    print list(it)

注意我实际上想做的是,使用单个生成器返回多个迭代器(与我将作为参数传递给生成器的迭代器一样多)。我发现这样做的唯一方法是生成元组并对它们使用 izip() - 对我来说是黑魔法。

最佳答案

这很有趣:当您将它传递给 f 时,您忘记调用 z:

iterators =  izip(*f(z()))

因此 f 尝试迭代一个函数对象:

for _ in z: pass  # z is a function

这引发了 TypeError:

TypeError: 'function' object is not iterable

Python 内部人员捕获了它并重新提出了一条令人困惑的错误消息。

# ceval.c

static PyObject *
ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
{
 ...

            t = PySequence_Tuple(stararg);
            if (t == NULL) {
                if (PyErr_ExceptionMatches(PyExc_TypeError)) {
                    PyErr_Format(PyExc_TypeError,
                                 "%.200s%.200s argument after * "
                                 "must be a sequence, not %200s",
                                 PyEval_GetFuncName(func),
                                 PyEval_GetFuncDesc(func),
                                 stararg->ob_type->tp_name);
 ...

关于python - TypeError: * 之后的类型对象参数必须是一个序列,而不是生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15559829/

相关文章:

python - Django 两个模型字段,相同的数据库列

python - 如何正确使用 scikit-learn 的高斯过程进行 2D 输入、1D 输出回归?

python - 为什么sorted()把9放在84和878后面?

python - 生成器仅执行 12 次迭代 - 无论批量大小如何

javascript - 使用函数生成器将值返回到 GraphQL Mutation 中的输出字段

python - pandas 稀疏数据帧 value_counts 不起作用

python - 如何从 Python 中的另一个项目导入模块?

python - 如何从 python 中的两个列表创建生成器?

javascript - 在设计 Javascript API 时,我应该引发 TypeError 还是忽略控制台消息?

python - 在Python中,如何模拟c扩展类?