【问题标题】:unexpected function return different type / number only checker意外函数返回不同类型/仅数字检查器
【发布时间】:2021-01-27 07:02:05
【问题描述】:

我正在尝试创建一个快速简单的函数来检查输入的值是否为 int/bool。我快速浏览了一下,甚至其他地方的解决方案也遇到了同样的问题。

我的测试脚本中有这个,它似乎可以工作,但是当将确切的代码复制到我的主程序时,它会返回输入的第一个值(比如我输入的是 hello 而不是一个数字,它会在之后以“hello”退出输入一个数字并将其保存到文件中)。

一个函数调用另一个函数会导致它失败吗?

我可以稍后发布我的实际代码,其中有很多调用,所以可能会很长。将首先尝试使用这些简短的示例,如果我们无法确定我可以发布长示例。

#option 1
import json

with open("settings.json", "r") as f:
    pref_file = json.load(f)

def float_check(t):
    if t.isdigit():
        global prompt
        prompt = float(t)
        return #I have tried 'return prompt' too
    else:
        prompt = input ("Enter numerical value only:\n")
        float_check(prompt)

prompt = input ("Enter a number: ")

float_check(prompt)

#I'm saving the value to JSON file.
#\\ settings.json
#{
#    "o2_percent": 0.0
#}

pref_file["o2_percent"] = prompt
with open("settings.json", "w") as f:
    json.dump(pref_file, f, indent=4)

在选项 2 中,我尝试从函数调用函数,因为我认为这是问题所在。但这似乎也有效。

#option 2
import json
def num_check(t):
    if t.isdigit():
        global prompt
        prompt = float(t) 
        pref_file["o2_percent"] = prompt
        with open("settings.json", "w") as f:
            json.dump(pref_file, f, indent=4)
        runit()
    else:
        prompt = input ("Enter numerical numer only:\n")
        num_check(prompt)

def runit():
    prompt = input ("enter a number: ")
    num_check(prompt)

runit()

我找到了这个解决方案 (How to validate a users input to Numbers only?) 并对其进行了一些调整,但我遇到了完全相同的问题 - 我的主代码将在退出循环时返回输入的第一个值而不是数字。

输入号码:你好
输入数字:大象
输入号码:为什么
输入数字:5
将值保存到 settings.json "hello"

另外为什么第一个打印返回float,而第二个是str,我没有做进一步的处理?我对这一切都很陌生 - 如果在函数中使用变量,即使声明为全局变量,也会有一些奇怪的事情吗?

def mk_float(answer):
    while True:
        try:
           answer = float(answer)
           print (type(answer)) #returns float
           break
        except ValueError:
           answer = input ("Enter number!")

answer = input ("number: ")

mk_float(answer)

print (type(answer)) #returns int

我准备好翻桌了。

编辑
这是我删除的评论,因为 Prune 指出这是一个单独的问题。但会将其放在编辑中,以便人们知道它所指的内容。

def t_check(prompt):
    while True:
        try:
            prompt = int(prompt)
            return int(prompt)
            break
        except ValueError:
            prompt = input ("Enter a number only: ")        
            continue


prompt = input ("enter something: ")
t_check(prompt)

print (prompt)
print (type(prompt))

【问题讨论】:

标签: python


【解决方案1】:

表面问题是因为,当您重复请求有效输入时,不是使用简单的loop-until-valid 方法,而是使用递归。当您在最终返回时回退堆栈时,您可以轻松获得所需数据的反转。

下一个问题是使用全局变量。使用参数作为函数的输入;返回结果。全局变量通常表明设计不佳。

注意print 返回None,而不是浮点数。

最后,您应该使用简单的print 命令跟踪程序的执行以及中间结果。这是最简单、最直接有效的调试工具。

这对你有帮助吗?

【讨论】:

  • 嘿 Prune(不知道如何标记您)感谢您的回复。如果您查看第三种情况,请尝试这就是我正在尝试的(不是双关语)。我会更多地研究你链接的那个,看看我是否能让它更好地工作。只是让我感到困惑,因为它在一个代码中工作并在另一个代码中爆炸。唯一的区别是在 if 语句中。
  • 这看起来像是另一个问题,而不是评论。至少,将其编辑到您的问题中,而不是在这里。如您所见,cmets 真的不适合发布代码——尤其是 Python 的空白语义。
  • 我删除了之前的评论 - 是的,这是一个评论的灾难 - 我在这里是全新的(并在 20 年后重新开始编程)仍在解决问题,所以为所有人道歉菜鸟。那就是说我想我已经想通了。我的天,hugest facepalm 我调用函数是错误的......我会调用函数,然后我会尝试在单独的行上使用 return。这个 'pref_file["o2_percent"] = float_check(entered)' 完美运行!感谢所有的帮助。我正在使用 while true 循环。
  • 明白。请记住,我们都曾在某个时候成为过你。即使是 Ada Byron Lovelace 也必须学习编程,即使她必须先发明它。
【解决方案2】:

我不确定我是否可以帮助您处理代码的 json 部分,但是您可以使用此功能要求用户输入一个数字(浮点数或整数):

def input_number():
    try:
        return float(input ("Enter numerical value only:\n"))
    except ValueError:
        return input_number()

当用户输入内容时,input_number 将尝试将输入作为浮点数返回(涵盖int 类型)。 如果转换为浮点数失败,则会捕获 ValueError 并且input_number 将要求用户再次输入该值。

在您的非常特定情况下,您可以使用pref_file["o2_percent"] = input_number()

编辑:

看看 Prune 的答案,递归可能不是最好的解决方案。 ^_^

【讨论】:

  • 幸运的是 JSON 实际上工作正常!您直接调用的想法可能会删除另外几行,因为我之前一直在调用输入请求并将变量传递给检查器。我会试试这个。谢谢你的建议:)
猜你喜欢
  • 2021-12-23
  • 1970-01-01
  • 2012-08-02
  • 2020-12-11
  • 2015-01-17
  • 1970-01-01
  • 2015-07-20
  • 2011-06-27
  • 1970-01-01
相关资源
最近更新 更多