NoneType-Error with yield in Python
NoneType-Error with yield in Python
我在 Python 中遇到了产量和生成器方面的问题,希望您可能知道解决方案
这是我的代码(非常简单)
!/usr/bin/env
import sys
import time
import subprocess
from Tkinter import *
import numpy
import threading
CDatei = subprocess.Popen("/home/pi/meinc++/Spi")
print("Hallo")
i = 0
x = 0
def GetValue():
with open("/home/pi/meinc++/BeispielDatei.txt","r") as Datei:
for line in Datei:
time.sleep(0.1)
return line
def WithoutNull(input):
ReturnValue = input
while ReturnValue is None:
ReturnValue = GetValue()
return ReturnValue
def UebergabeWert():
while x == 0:
WholeString = WithoutNull(GetValue())
StringVar, DatumVar = WholeString.strip().split(' - ')
IntStringVar = [int(v) for v in StringVar.split()]
return IntStringVar,DatumVar
def MinutenWert():
ArrayValue = []
ZeitStart = time.time()
i = 0
while 1:
CompleteValue, Datum = UebergabeWert()
ArrayValue.insert(i,CompleteValue[0])
i = i + 1
ZeitEnde = time.time()
if (ZeitEnde-ZeitStart >= 10):
LaengeArray = len(ArrayValue)
print ArrayValue
ArrayValue = []
i = 0
break
while i <= LaengeArray:
CompleteValue, Datum = UebergabeWert()
ArrayValue.insert(i,CompleteValue[0])
i = i + 1
ArraySumme = numpy.sum(ArrayValue)
LaengeArray = len(ArrayValue)
Mittelwert = ArraySumme/LaengeArray
print ArrayValue
print ArraySumme
print LaengeArray
yield Mittelwert
if i == LaengeArray:
i = 0
xx = MinutenWert()
for x in xx:
print x
代码的快速解释:
我有一个传感器,我正在从 UebergabeWert() 读取数据。但是因为我想取一分钟的平均值,所以我开始执行以下操作:我将数据放在一个数组中 60 秒(在代码中是 10 秒,因为我不想等那么久)然后我对数组求和并将其除以数组的长度。
第一个 while 循环是设置总数组长度(因为我不能让我的主循环从时间开始依赖,因为当传感器较慢时,它会弄乱数据),第二个循环是使平均的。这个想法是:当数组到达末尾时,它将擦除第一个值并插入最新的值。循环应该无限期进行,我将很快实现线程,以便它在后台运行。
PS: "prints" 是来帮我跟进进程的
我的问题:
第一个循环完美运行,数组在没有 None 的情况下打印出大约 100 个(不同的)值。
然而,第二个循环在第一次迭代后中断。
错误消息:
Traceback (most recent call last):
line 87, in <module>
for x in xx:
line 54, in MinutenWert
CompleteValue, Datum = UebergabeWert()
TypeError: 'NoneType' object is not iterable
为什么突然出现None类型错误?我就是想不通。
编辑:
人们指出问题出在代码的先前功能上,因此我将其添加到代码中。
另外,快速解释一下:数据在一个文本文件中,所以我用 GetValue() 打开文本文件。有时传感器太慢并返回一个 None 值,因此 WithoutNull() 摆脱了它。
数据是这种形式"var1, var2, var3, var4 - timestamp"。所以我需要使用 UebergabeWert() 将值与字符串分开。通常我不会从中得到空响应,所以有点奇怪。
问题出在...
xx = MinutenWert()
for x in xx:
print x
它 returns None 因为没有调用 Yield。要获得产量值,必须使用 next()。
更新版本....
xx = Minutenwert()
while 1:
y = next(xx)
print y
returns 值并且不返回错误。
我在 Python 中遇到了产量和生成器方面的问题,希望您可能知道解决方案
这是我的代码(非常简单)
!/usr/bin/env
import sys
import time
import subprocess
from Tkinter import *
import numpy
import threading
CDatei = subprocess.Popen("/home/pi/meinc++/Spi")
print("Hallo")
i = 0
x = 0
def GetValue():
with open("/home/pi/meinc++/BeispielDatei.txt","r") as Datei:
for line in Datei:
time.sleep(0.1)
return line
def WithoutNull(input):
ReturnValue = input
while ReturnValue is None:
ReturnValue = GetValue()
return ReturnValue
def UebergabeWert():
while x == 0:
WholeString = WithoutNull(GetValue())
StringVar, DatumVar = WholeString.strip().split(' - ')
IntStringVar = [int(v) for v in StringVar.split()]
return IntStringVar,DatumVar
def MinutenWert():
ArrayValue = []
ZeitStart = time.time()
i = 0
while 1:
CompleteValue, Datum = UebergabeWert()
ArrayValue.insert(i,CompleteValue[0])
i = i + 1
ZeitEnde = time.time()
if (ZeitEnde-ZeitStart >= 10):
LaengeArray = len(ArrayValue)
print ArrayValue
ArrayValue = []
i = 0
break
while i <= LaengeArray:
CompleteValue, Datum = UebergabeWert()
ArrayValue.insert(i,CompleteValue[0])
i = i + 1
ArraySumme = numpy.sum(ArrayValue)
LaengeArray = len(ArrayValue)
Mittelwert = ArraySumme/LaengeArray
print ArrayValue
print ArraySumme
print LaengeArray
yield Mittelwert
if i == LaengeArray:
i = 0
xx = MinutenWert()
for x in xx:
print x
代码的快速解释:
我有一个传感器,我正在从 UebergabeWert() 读取数据。但是因为我想取一分钟的平均值,所以我开始执行以下操作:我将数据放在一个数组中 60 秒(在代码中是 10 秒,因为我不想等那么久)然后我对数组求和并将其除以数组的长度。
第一个 while 循环是设置总数组长度(因为我不能让我的主循环从时间开始依赖,因为当传感器较慢时,它会弄乱数据),第二个循环是使平均的。这个想法是:当数组到达末尾时,它将擦除第一个值并插入最新的值。循环应该无限期进行,我将很快实现线程,以便它在后台运行。
PS: "prints" 是来帮我跟进进程的
我的问题:
第一个循环完美运行,数组在没有 None 的情况下打印出大约 100 个(不同的)值。
然而,第二个循环在第一次迭代后中断。
错误消息:
Traceback (most recent call last):
line 87, in <module>
for x in xx:
line 54, in MinutenWert
CompleteValue, Datum = UebergabeWert()
TypeError: 'NoneType' object is not iterable
为什么突然出现None类型错误?我就是想不通。
编辑: 人们指出问题出在代码的先前功能上,因此我将其添加到代码中。
另外,快速解释一下:数据在一个文本文件中,所以我用 GetValue() 打开文本文件。有时传感器太慢并返回一个 None 值,因此 WithoutNull() 摆脱了它。
数据是这种形式"var1, var2, var3, var4 - timestamp"。所以我需要使用 UebergabeWert() 将值与字符串分开。通常我不会从中得到空响应,所以有点奇怪。
问题出在...
xx = MinutenWert()
for x in xx:
print x
它 returns None 因为没有调用 Yield。要获得产量值,必须使用 next()。
更新版本....
xx = Minutenwert()
while 1:
y = next(xx)
print y
returns 值并且不返回错误。