【问题标题】:Defining a Function in python 3.6 and expecting True or False but returning None [closed]在 python 3.6 中定义一个函数并期望 True 或 False 但返回 None [关闭]
【发布时间】:2018-07-14 08:35:54
【问题描述】:

定义性别():

创建一个应该返回 True 或 False 的函数

    gener = input('Choose \"1\" for Male or \"2\" for Female: ') 

“gener”应该接收“1”或“2”作为字符串

    if gener == '1':
        print('You selected Male')
        return True
    elif gener == '2':
        print('You selected Female')
        return False
    else:

这就是问题所在。它应该再次执行函数gender(),以便用户可以正确地重新插入“1”或“2”

        print('Invalid character')
        gender()

但是在打印函数gender()时,即使再次执行gender()以接收新值,它也会返回“None”,继续Else语句的值

print(gender())

【问题讨论】:

  • 递归调用函数通常是个坏主意,除非你真的有一些递归算法。对于您的问题,请查看Asking the user for input until they give a valid response 以获取建议。
  • @ThierryLathuille 这是一篇非常好的帖子。
  • from itertools import repeat, dropwhile; gender = next(dropwhile(lambda x: x not in ('1', '2'), (input() for _ in repeat(None))))
  • 问题中存在重现错误所需的所有代码。这个问题并不完全是关于“如何在有效之前要求输入?”而是关于为什么这个代码returns None - 请参阅答案以了解原因。

标签: python python-3.x function if-statement boolean


【解决方案1】:

在 python 中,如果你不返回任何东西,每个函数都会返回None。检查您的 if .. .elif ... else - else 在哪里返回任何内容?

它没有——它只是调用gender()(然后隐式返回None

更改它以返回该函数调用的返回值:

 if gener == '1':
    print('You selected Male')
    return True
elif gener == '2':
    print('You selected Female')
    return False
else:
    print('Invalid character')
    return gender()

这将修复您的代码,使其更好地不要使用递归。


使用无限制递归将始终将新数据打包到调用堆栈中。您可以使用循环而不是递归来优化它:

def gender():
    """Choose Male or Femal, return True for Male and False for Female"""

    gener = ""   # prepare an invalid input
    while gener not in ['1','2']:  # loop until input gets valid
        gener = input('Choose "1" for Male or "2" for Female: ')

    if gener == '1':
        print('You selected Male')
        return True
    # elif gener == '2':
    #    print('You selected Female')
    #    return False
    else: # no need for explicit check, it can only be 1 or 2 
        print('You selected Female')
        return False

print(gender())

政治正确的旁注:

  • 并非地球上的所有人类都将自己称为男性或女性
  • 并非地球上的所有人都不想让这个决定为人所知
  • 性别可能会随着时间的推移而改变

【讨论】:

  • 感谢您的反馈,不过很想知道如何让它变得更好。
猜你喜欢
  • 1970-01-01
  • 2020-06-25
  • 1970-01-01
  • 1970-01-01
  • 2021-07-02
  • 2017-01-14
  • 1970-01-01
  • 2016-04-16
  • 2012-03-18
相关资源
最近更新 更多