【问题标题】:unpack non-iterable NoneType object解压不可迭代的 NoneType 对象
【发布时间】:2021-06-27 15:17:56
【问题描述】:

这是我的代码:

signal = np.load('signal_glitches.npy')
#print(signal[:, 0])
fig,ax = plt.subplots(figsize = (10,5))
print(type(signal))
def t0_t(arr, n):
    arr = list(arr)
    for i in range (n):
        if arr[i] <= np.mean(arr):
            t = int(arr.index(max(arr)))
            #print(t)
            delta_t = abs(arr.index(max(arr)) - i - 1)
            return (delta_t, t)
        break
for i in range (len(signal[:, 0])):
    ax.plot(signal[i,:], '--') 

print(len(signal[235, :]))
def exp_model(time, a, tau_0, tau_1, c):
    S = a * (1 - np.exp((time)/tau_0)) * np.exp((time)/tau_1) + c
for i in range (len(signal[:, 0])):
    arr = signal[i,:]
    n = len(signal[i,:])
    time, t = t0_t(arr, n)
    if time == None:
        time = 199
    #print(time)
ax.set_title(label = 'run7det88' + ',' + str(len(signal[:,0])) + 'glitches', y = 1.02, fontsize = 18)
plt.xlabel('ADC', fontsize = 30)
plt.ylabel('I(nA)', fontsize = 30)
plt.tight_layout()
plt.tick_params(axis = 'x', labelsize = 18, which = 'major', pad = 18)
plt.tick_params(axis = 'y', labelsize = 18, which = 'major', pad = 18)
plt.tick_params(which = 'both', width = 3)
plt.tick_params(which = 'major', length = 8)
plt.tick_params(which = 'minor', length = 4)
#axes = fig.add_subplot(111)

蟒蛇注意到:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-154-e3826bc92d95> in <module>
     21     arr = signal[i,:]
     22     n = len(signal[i,:])
---> 23     (time, t) = t0_t(arr, n)
     24     if time == None:
     25         time = 199

TypeError: cannot unpack non-iterable NoneType object

我试图打印出delta_t和t,它们都返回值,我不知道如何修复它 而且我还返回整数值:199 和 200,它仍然注意到相同

【问题讨论】:

  • 听起来arr 中的第一项大于平均值。这将导致if 无法执行,将您直接带到break,这将隐式返回None
  • 您的函数t0_t() 正在返回None,可能是因为n 为零。

标签: python function return


【解决方案1】:

在python中,如果函数结束时没有显式返回值,则默认返回值为None

例如这段代码:

def func():
    num = 7
print(func())

将输出None,因为func 没有返回任何值。

在您的代码中,t0_t 正在返回 None,然后您尝试将其解包

(time, t) = t0_t(arr, n)

您无法解压缩 Nonetype,因此会出现错误。

尝试将函数重写为

def t0_t(arr, n):
    arr = list(arr)
    for i in range (n):
        if arr[i] <= np.mean(arr):
            t = int(arr.index(max(arr)))
            #print(t)
            delta_t = abs(arr.index(max(arr)) - i - 1)
            return (delta_t, t)
        break

    return (None, None)

这确保函数将始终返回一个可以解包的 2 元组。

【讨论】:

    【解决方案2】:

    看起来t0_t 有可能在没有明确返回某些内容的情况下从函数末尾脱落,因此 Python 将其视为您说过 return None。您应该添加更多代码来涵盖这种情况。

    【讨论】:

    • 我也这么认为。但是当我尝试返回确定的值时:199 和 200。同样的问题出现了
    猜你喜欢
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    • 2016-02-08
    • 2020-05-06
    相关资源
    最近更新 更多