Python 类型错误:';非类型';对象没有属性'__获取项目';
嗨,我创建了一个名为runloopg(x,y,z)的函数,它生成一个列表,但我不能调用列表中的项目:Python 类型错误:';非类型';对象没有属性'__获取项目';,python,Python,嗨,我创建了一个名为runloopg(x,y,z)的函数,它生成一个列表,但我不能调用列表中的项目: p=runloopg(10,0.1,6) <generator object rtpairs at 0x000000000BAF1F78> [(0,0,0,0,0,1), (0.01,0,0,0,0,1), (0.0062349,0.00781831,0,0,0,1), (-0.00222521,0.00974928,0,0,0,1), (-0.00900969,0.00433884
p=runloopg(10,0.1,6)
<generator object rtpairs at 0x000000000BAF1F78>
[(0,0,0,0,0,1), (0.01,0,0,0,0,1), (0.0062349,0.00781831,0,0,0,1), (-0.00222521,0.00974928,0,0,0,1), (-0.00900969,0.00433884,0,0,0,1), (0.0549583,-0.0712712,0,0,0,1), (0.0627244,-0.0645419,0,0,0,1), (0.0696727,-0.0569711,0,0,0,1), (0.0757128,-0.0486577,0,0,0,1), (0.0807659,-0.0397099,0,0,0,1), (0.084766,-0.0302444,0,0,0,1), (0.0876611,-0.0203847,0,0,0,1), (0.0894134,-0.0102592,0,0,0,1)]
您没有发布相关代码(函数的定义),但很明显,此函数返回
None
edit:您发布的
runloopg
片段中的Ok确实返回了一个列表,因此问题出在别处。我看到您的代码段以一个注释掉的print
语句开始,该语句打印调用rtuniform
的返回值,这与您发布的交互式会话相匹配。我猜您正在执行一个旧版本的函数,该函数刚刚打印并立即退出(隐式返回None
),然后您编辑了代码,但未能正确重新加载函数 返回一个生成器对象。一旦你使用了发电机,它就耗尽了,你不能再使用它
但您可以将其所有值作为一个列表:
p = list(runloopg(10,0.1,6))
由于您的方法返回生成器,因此需要使用它:
for i in runloopg(10,0.1,6):
print(i)
p = list(runloopg(10,0.1,6))
# If you just want the first item:
first_item = next(runloopg(10,0.1,6))
您的
runloopg
函数似乎缺少一个return
。所以,它是这样做的:
def runloopg():
[(0,0,0,0,0,1), (0.01,0,0,0,0,1), (0.0062349,0.00781831,0,0,0,1)] # and the rest
或者这个:
def runloop():
x = [(0,0,0,0,0,1), (0.01,0,0,0,0,1), (0.0062349,0.00781831,0,0,0,1)] # and the rest
与此相反:
def runloopg():
return [(0,0,0,0,0,1), (0.01,0,0,0,0,1), (0.0062349,0.00781831,0,0,0,1)] # and the rest
在第一个版本中,运行该行,然后立即丢弃其结果,函数继续。在第二种情况下,结果存储在变量中,函数继续。在这两种情况下,函数都会从末尾掉下来,Python会在这种情况下为您返回
None
。在上一个版本中,您计算的结果被返回,并最终被分配到p
-因此p
将是一个列表,而p[0]
将起作用。您的函数在列表中不返回生成器对象,因此循环遍历它并获得所需的值。只需调试代码并尝试dir(您的对象),然后查看,它返回的是什么,我的意思是查看方法和属性,找出你拥有的对象类型。@MairajKhan错误已经准确地说明了p
是什么类型的对象-NoneType
(因此,p
是None
)我给出了类似的答案,但不知何故,我并不认为这是问题所在。不幸的是,当我键入p=list(runloopg(10,0.1,6))时,我得到了错误“NoneType”对象不可iterable。虽然这是真的,但它实际上并不能解释OP的错误-生成器不会产生None
,更不用说以某种方式变成None
,在它耗尽之后-它变成了一个空的iterable(即,每当你尝试迭代它时,它会立即引发StopIteration
)。不幸的是,当我键入p=list(runloopg(10,0.1,6))时,我得到了错误“NoneType”对象不iterable。我在原始帖子中添加了函数定义。你能找出问题并找到解决方案吗?将函数的返回值传递到列表
不会有任何改变,因为你的函数已经返回了一个列表。回答否决,因为这显然不是解释(也不是解决方案)。我在原始帖子中添加了函数的定义。你能确定问题以及如何解决它吗?抱歉,不能-你的函数实际上返回了一个列表,所以问题在别处。嗨,Ivc。我的函数定义中已经有了“return”。除此之外,我还在原来的帖子中添加了函数定义。你能看看问题出在哪里吗?
def runloop():
x = [(0,0,0,0,0,1), (0.01,0,0,0,0,1), (0.0062349,0.00781831,0,0,0,1)] # and the rest
def runloopg():
return [(0,0,0,0,0,1), (0.01,0,0,0,0,1), (0.0062349,0.00781831,0,0,0,1)] # and the rest