社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

方法返回None,即使在python 3中value不是None[duplicate]

Vanjith • 5 年前 • 1458 次点击  

这个问题已经有了答案:

我在运行时得到输入。如果第一次尝试自己纠正给定的输入意味着我没有得到错误。否则它会显示 无法打开不可读取的 错误。

我能看到它在发送 None 如果递归方法调用一次。即使在返回之前它也会打印值,但在接收之后它不会显示任何值。

class Game:
    def set_val(self):
        try:
            p1=input("Enter player 1 name:")
            p2=input("Enter player 2 name:")
            goal=int(input("Enter a number to set goal:"))
            if p1 is None or p2 is None or goal is None:
                print("Please give proper input")
                self.set_val()
            else:
                print(p1,p2,goal)
                return p1,p2,goal
        except:
            print("Please give proper input")
            self.set_val()
G=Game()

p1,p2,goal=G.set_val()
print(p1,p2,goal)

输出:

Enter player 1 name:s
Enter player 2 name:c
Enter a number to set goal:s
Please give proper input
Enter player 1 name:s
Enter player 2 name:v
Enter a number to set goal:2
s v 2
Traceback (most recent call last):
  File "D:\test.py", line 18, in <module>
    p1,p2,goal=G.set_val()
TypeError: cannot unpack non-iterable NoneType object

我可以假设它是因为递归调用,但无法找出原因。请解释给出一个解决方案,以获得所有输入值没有错误。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/49410
 
1458 次点击  
文章 [ 2 ]  |  最新文章 5 年前
Error - Syntactical Remorse
Reply   •   1 楼
Error - Syntactical Remorse    5 年前

1)永远不要做一般的例外来捕捉所有的东西。

2)用户输入不能使用递归。它无缘无故地消耗堆栈。就用一个 while 循环基本上递归并不是为了在失败时保持重复。它被设计成潜入某物并最终返回。

3)确保代码空间正确。这并没有引起问题,但确实使代码难以阅读。你应该有一个前后运算符的空格(即。 = )逗号后的空格,包含多个元素(即。 (1, 2, 3) )

也就是说,当进行递归时,需要返回递归调用:

class Game:
    def set_val(self):
        try:
            p1 = input("Enter player 1 name:")
            p2 = input("Enter player 2 name:")
            goal = int(input("Enter a number to set goal:"))
            if p1 is None or p2 is None or goal is None:
                print("Please give proper input")
                return self.set_val()
            else:
                print(p1, p2, goal)
                return p1, p2, goal
        except:
            print("Please give proper input")
            return self.set_val()
G = Game()

p1, p2, goal = G.set_val()
print(p1, p2, goal)

还有你的 if 可以缩短为:

if p1 and p2 and goal:
Mark Tolonen
Reply   •   2 楼
Mark Tolonen    5 年前

递归有它的用途,但使用它重新开始不是其中之一。光着身子也不好。

如果需要循环,请使用循环。

如果需要捕获异常,请捕获 预期 例外。这样,如果发生意外异常,您就可以看到并处理该bug。

例子:

class Game:
    def set_val(self):
        while True:
            p1=input("Enter player 1 name:")
            if p1: break
        while True:
            p2=input("Enter player 2 name:")
            if p2: break

        # Loop until good input
        # int() will throw ValueError if input is not convertible to int.
        while True:
            try:
                goal=int(input("Enter a number to set goal:"))
                break # break from the loop if no exception
            except ValueError:
                print("Please give proper input")

        return p1,p2,goal

G=Game()

p1,p2,goal=G.set_val()
print(p1,p2,goal)