问题 TypeError:'generator'对象不可调用


我有一个像这样定义的生成器:

def lengths(x):
    for k, v in x.items():
        yield v['time_length']

它起作用,称之为

for i in lengths(x):
    print i

生产:

3600
1200
3600
300

这是正确的数字。

但是,当我这样称呼时:

somefun(lengths(x))

哪里 somefun() 定义为:

def somefun(lengths):
    for length in lengths():  # <--- ERROR HERE
        if not is_blahblah(length): return False

我收到此错误消息:

TypeError: 'generator' object is not callable

我有什么误会?


5229
2017-08-22 13:53


起源



答案:


你不需要打电话给你的发电机,删除 () 括号。

您可能会对函数内部变量使用相同名称作为生成器名称这一事实感到困惑;以下内容也适用:

def somefun(lengen):
    for length in lengen:
        if not is_blahblah(length): return False

传递给的参数 somefun 然后将函数绑定到本地 lengen 变量而不是 lengths,明确表示该局部变量与该变量不同 lengths() 您在别处定义的功能。


14
2017-08-22 13:55



那么简单吧...... :-D - Prof. Falken
@AmigableClarkKant,将括号放在首位的逻辑是什么? - unkulunkulu
@unkulunkulu:可能与生成生成器的函数名称混淆。 - Martijn Pieters♦
@AmigableClarkKant,:)逻辑对于初学者来说是一个很棒的工具。我的意思是,函数的参数接近'替换'。所以,如果你更换了你的 lengths 你提供给函数的参数(lengths(x)),那么你会得到 for length in lengths(x)(): 线,看起来很奇怪吧:) - unkulunkulu
@AmigableClarkKant,然后我们欢迎你来到python的温暖土地,逻辑工作和程序员都很高兴。 - unkulunkulu


答案:


你不需要打电话给你的发电机,删除 () 括号。

您可能会对函数内部变量使用相同名称作为生成器名称这一事实感到困惑;以下内容也适用:

def somefun(lengen):
    for length in lengen:
        if not is_blahblah(length): return False

传递给的参数 somefun 然后将函数绑定到本地 lengen 变量而不是 lengths,明确表示该局部变量与该变量不同 lengths() 您在别处定义的功能。


14
2017-08-22 13:55



那么简单吧...... :-D - Prof. Falken
@AmigableClarkKant,将括号放在首位的逻辑是什么? - unkulunkulu
@unkulunkulu:可能与生成生成器的函数名称混淆。 - Martijn Pieters♦
@AmigableClarkKant,:)逻辑对于初学者来说是一个很棒的工具。我的意思是,函数的参数接近'替换'。所以,如果你更换了你的 lengths 你提供给函数的参数(lengths(x)),那么你会得到 for length in lengths(x)(): 线,看起来很奇怪吧:) - unkulunkulu
@AmigableClarkKant,然后我们欢迎你来到python的温暖土地,逻辑工作和程序员都很高兴。 - unkulunkulu