【问题标题】:NoneType-Error with yield in PythonPython中的NoneType-Error与yield
【发布时间】:2018-08-10 08:06:40
【问题描述】:

我在 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:“打印”在这里让我跟踪过程

我的问题:

第一个循环完美运行,数组打印出数组中大约 100 个(不同的)值,没有 None。

然而,第二个循环在第一次迭代后中断。

错误信息:

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-error?我就是想不通。

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

另外,快速解释:数据在文本文件中,所以我用 GetValue() 打开文本文件。有时传感器太慢并返回一个 None 值,因此 WithoutNull() 摆脱了它。

数据采用这种形式“var1, var2, var3, var4 - timestamp”。所以我需要用 UebergabeWert() 将值与字符串分开。通常我不会从中得到空响应,所以这有点奇怪。

【问题讨论】:

  • 错误信息表明函数 UebergabeWert() 返回 None 而不是预期的元组。
  • 看起来不像。 “CompleteValue, Datum = UebergabeWert()”是给出错误的行。它隐式地尝试解包 UebergabeWert() 返回的元组 (a,b),但在这种情况下,函数返回 None。
  • 请添加到您的问题代码UebergabeWert
  • 您是否始终在同一行上遇到相同的错误?尝试用 temp = UebergabeWert() 替换 CompleteValue, Datum = UebergabeWert() 并打印 temp
  • Mittelwert 是单个值,因此不可迭代。 'getitem' 错误只是表示无法在 None 上建立索引 ([0])。

标签: python iteration yield nonetype


【解决方案1】:

问题出在...

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

它返回 None 因为没有调用 Yield。要获得产量值,必须使用 next()。

更新版本....

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

返回值并且不返回错误。

【讨论】:

    猜你喜欢
    • 2018-01-27
    • 2018-11-20
    • 2014-03-11
    • 1970-01-01
    • 2010-12-14
    • 2016-11-05
    • 2016-06-01
    • 2017-11-14
    • 2017-10-20
    相关资源
    最近更新 更多