【问题标题】:function returns none instead of a tuple函数返回无而不是元组
【发布时间】:2019-04-25 10:04:15
【问题描述】:

我正在使用 python 2.7。我写了一个代码来生成密码。为此,我使用了 random 模块来生成用于生成给定长度的密码的不同类型(大写、小写、特殊和数字)的字符数。当 a 为此编写函数时,它应该返回一个元组,但它返回 None。为什么会这样?

我尝试了随意的调试方法,将打印语句放在中间并找出出错的地方。一切正常,除了它返回无。

def passlen(a):
    """Gives length of different characters to be put into passwords"""
    uplen=random.randrange(0, a)
    lwlen=random.randrange(0, a)
    speclen=random.randrange(0, a)
    nmbrlen=random.randrange(0, a)
    if uplen+lwlen+speclen+nmbrlen==a:
        print (uplen, lwlen, speclen, nmbrlen)
        return(uplen, lwlen, speclen, nmbrlen)
    else:
        passlen(a)

x=input("how many characters in the password?")

print(passlen(x))

预期的结果是 4 元组,但它给出的是 None。

【问题讨论】:

  • 您的return 声明在哪里? o_0
  • else 声明的正上方
  • 所以......大多数时候它没有被执行,因此该函数返回None
  • 但是函数不应该只在return 语句的末尾返回吗?如果没有找到return 语句,则返回None
  • 所以,大多数时候你的函数没有到达 end 语句。仅当总和等于 a 时。当函数在没有明确的 return 语句的情况下退出时,你有 None 。这听起来比仅仅猜测你真正想要返回的内容要好。

标签: python tuples nonetype


【解决方案1】:

感谢 Kamiccolo 的帮助。

函数应该如下所示:

def passlen(a):
    """Gives length of different characters to be put into passwords"""
    uplen=int(random.randrange(0, a))
    lwlen=int(random.randrange(0, a))
    speclen=int(random.randrange(0, a))
    nmbrlen=int(random.randrange(0, a))
    bab=(uplen, lwlen, speclen, nmbrlen)
    if uplen+lwlen+speclen+nmbrlen==a:
        return bab
    else:
        return passlen(a)

duplicate thread 也帮助了我。

【讨论】:

  • 这是有问题的。对于足够大的a 值,您可以使用此代码期待 StackOverflowError,因为您不是简单地循环直到获得合适的结果,而是继续递归调用相同的函数。而且您实际上根本不需要循环。
【解决方案2】:

所以你想要四个随机数加到a?当然,您可以尝试选择四个随机数,直到找到一个加起来为 a 的集合,但对于较大的 a 值,这可能需要一段时间(而且您绝对不想递归地这样做)。

最好在0a之间选择三个分割点:

def passlen(a):
    splits = sorted([random.randrange(0,a) for _ in range(3)])
    uplen = splits[0]
    lwlen = splits[1] - uplen
    speclen = splits[2] - uplen - lwlen
    nmbrlen = a - uplen - lwlen - speclen
    return uplen, lwlen, speclen, nmbrlen

【讨论】:

    猜你喜欢
    • 2013-05-16
    • 1970-01-01
    • 2016-08-20
    • 2018-06-21
    • 2017-03-10
    • 1970-01-01
    • 1970-01-01
    • 2021-10-17
    • 2018-01-23
    相关资源
    最近更新 更多