【问题标题】:Get TypeError when call the function from second time从第二次调用函数时获取 TypeError
【发布时间】:2018-08-06 00:16:33
【问题描述】:

我的问题是错误消息仅在我第二次调用该函数后发生 numLen, phoneMask = numberLen(3) TypeError: 'NoneType' 对象不可迭代

这是我的代码。 如果我在第一次运行脚本时输入了正确的扩展名,例如 71023,则没有问题。 如果我第一次输入了错误的扩展名,第二次输入了正确的扩展名,它会返回 typeerror 消息,我可以看到 numberlen(i) 没有返回。

提前谢谢你。

import sys


def numAssign(t):

  maskList = ['02694406XX',  '02693710XX']
  extList = ['706XX',  '710XX']
  i = 0
  while i < len(extList) :
    if t != extList[i] :
        i = i + 1
    else :
        return True, maskList[i]

  print('''The extension you entered is not in the indial range.''')        
  return False, ' '




def numberLen(i):

    t = input('Please enter the extnsion : ')
    T = len(t)
    isNum = t.isdecimal()
    patternConvert = t[0:3] + 'XX'

    if T == 5 and isNum == True :
        valid, mask = numAssign(patternConvert)
        print(mask)
        print(i)
        if valid == True:
            print(numAssign(patternConvert))
            return True, mask
        else :
            if i == 0 :
                print('''The number you entered was not valid.
                         It has to be 5 digits.''')
            else :
                print('Please try again')
                print(i)
                numberLen(i-1)

    else :
        if i == 0 :
            print('Your entering is invalid, we will terminiate the programe')
            exit()
        else :
            numberLen(i-1)


if __name__ == '__main__':

    numLen, phoneMask = numberLen(3)
    print(phoneMask)enter code here

【问题讨论】:

  • 跟踪的完整错误是什么?
  • numberLen 并不总是返回任何东西;事实上,在大多数情况下它什么都不返回。在它不返回的情况下,numLen, phoneMask = numberLen(3) 将导致该错误。

标签: python


【解决方案1】:

您的numberLen() 函数仅在用户第一次进行有效输入时返回调用者期望的元组;否则会递归调用自身,不返回返回值,导致函数默认返回None,导致调用者试图将其解包为序列时出现异常。

您应该更改以下两种情况:

numberLen(i-1)

到:

return numberLen(i-1)

【讨论】:

  • 另外,valid and i == 0 的情况看起来会导致类似的问题。
  • @chunxu 很高兴能帮上忙。如果您认为此答案正确,您能否将其标记为已接受?
  • 这是否意味着“返回”它实际上再次调用了该函数?没有这个关键字,它只是回到自己而不调用它?
  • @chunxu 你已经用numberLen(i-1) 再次调用了这个函数。 return 所做的只是简单地将 numberLen(i-1) 的返回值返回给当前函数的调用者,这最终是你的主程序,需要一个序列。
猜你喜欢
  • 1970-01-01
  • 2016-10-03
  • 1970-01-01
  • 1970-01-01
  • 2015-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多