在Python中使用yield产生NoneType-Error

时间:2018-08-10 08:06:40

标签: python iteration yield nonetype

我在Python中使用yield和generator时遇到了问题,希望您能知道解决方法

这是我的代码(非常简化)

!/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:这里有“照片”供我跟踪过程

我的问题:

第一个循环工作正常,该数组在没有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

为什么突然会出现NoneType错误?我只是想不通。

编辑: 人们指出,问题在于代码的先前功能,因此我将其添加到代码中。

另外,快速解释:数据在文本文件中,因此我使用GetValue()打开文本文件。有时,传感器速度太慢,并且会返回None值,因此WithoutNull()会摆脱这种情况。

数据的格式为“ var1,var2,var3,var4-时间戳”。因此,我需要使用UebergabeWert()从字符串中分离值。通常,我不会从中得到空响应,所以有点奇怪。

1 个答案:

答案 0 :(得分:1)

问题出在...

xx = MinutenWert()
    for x in xx:
        print x

由于未调用Yield,它返回None。要获得Yield值,必须使用next()。

更新的版本。...

xx = Minutenwert()
while 1:
   y = next(xx)
   print y

返回值,并且不返回错误。