Py学习  »  Python

函数调用期间未调用Python input()

sovietcitrus • 3 年前 • 1479 次点击  

这是我为提高Python技能而编写的一个基于文本的简单游戏的代码片段。 我打算用 input_check() 为了简化我稍后将在项目中编写的许多代码,但我目前无法使其正常工作。我在最新的VS主代码上运行它,扩展名为Pylance,它不会在我的代码中标记任何错误。我已经进行了多次测试以确保 输入检查() 这就是问题所在,删除它并简单地多次运行代码就可以了。

import time

def rules():
  print("The rules of this game are:")
  time.sleep(0.5)
  print("rules")
  time.sleep(0.5)
  print("rules")
  time.sleep(0.5)
  print("rules")
  time.sleep(0.5)
  print("rules")
  time.sleep(0.5)
  print("rules")
  time.sleep(0.5)
  input_check("Do you understand?\n", rules(), "Ok. Starting game...")
  
def input_check(question: str, function, confirmation: str):  
  yes_no = input(question)

  if yes_no.lower() == "n" or "no":
    function
  elif yes_no.lower() == "y" or "yes":
    print(confirmation)
    time.sleep(1)
  else:
    print("Invalid input.")
    input_check(question, function, confirmation)


input_check("Do you know the rules?\n", rules(), "Ok. Starting game...") 

我几乎是Python的新手,所以我不知道 function 参数,然后将其作为函数运行 输入检查() 行不行,但这不是问题所在。

应该有一个提示运行来定义 yes_no 具有 input() 但它从来没有达到这个程度。相反,它似乎跳到了跑步的前面 rules() (只有在用户输入“否”或“n”时才会发生这种情况),以及 规则() 连续运行直到停止,完全跳过 输入检查() .

我的问题是:

  1. 为什么 输入检查() 完全被忽视?
  2. 你能按原样运行作为参数的代码吗 作用 参数)或者我需要额外的步骤来运行它吗?
  3. 有没有更好/更有效的方法?(例如,一个解析输入的软件包,可以避免生成自己的函数)
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/129819
 
1479 次点击  
文章 [ 5 ]  |  最新文章 3 年前
FMc
Reply   •   1 楼
FMc    3 年前

对于代码的当前行为,您得到了很多解释,但没有 关于如何做我认为你想做的事情,有很多实用的建议。你没有 需要来回传递规则函数。你需要最重要的 获取用户输入的工具:while true循环。

def game():
    if not yesno('Do you know the rules'):
        rules()
    print("Ok. Starting game ...")

def rules():
    while True:
        print("The rules of this game are ... BLAH BLAH")
        if yesno('Do you understand'):
            break

def yesno(question):  
    while True:
        yn = input(f'{question}? [yes/no]: ').lower()
        if yn in ('y', 'yes'):
            return True
        elif yn in ('n', 'no'):
            return False
        else:
            print("Invalid input.")

Max Cheever
Reply   •   2 楼
Max Cheever    3 年前

除了其他答案之外,我还发现了另一个语义错误:第一个if语句的计算结果总是true,因为它将计算“no”的布尔值,如下所示

if yes_no.lower() == 'n' or 'no' == True:

由于非空字符串的计算结果为true,因此将始终执行此语句。你可以添加

yes_no.lower() == 'no'

给你

if yes_no.lower() == "n" or yes_no.lower() == "no":

只有当yes_no.lower是'n'或'no'时,才能使该语句计算为true

如需进一步澄清,请参阅

Why is my python if statement not working?

Toan Nguyen Phuoc
Reply   •   3 楼
Toan Nguyen Phuoc    3 年前
  1. 问题是你习惯了 rules() 就像传递函数的参数一样。您需要更改为: inputCheck("Do you know the rules?\n", rules, "Ok. Starting game...") .

规则():将调用函数规则()

规则:函数可以作为参数传递给另一个函数。

您可以来这里获取更多信息:

What is the difference between calling function with parentheses and without in python? .

笔记 :我看到你的示例代码有很多错误(当使用 def rules() 例如一个对象或函数)。你应该学习如何调试,它将帮助你有效地修复错误

I-am-developer-9
Reply   •   4 楼
I-am-developer-9    3 年前
inputCheck("Do you know the rules?\n", rules(), "Ok. Starting game...")

在运行函数时,不需要在规则之后使用任何paranthese(),而需要将函数作为参数传递。这样写:-

inputCheck("Do you know the rules?\n", rules, "Ok. Starting game...") 

这里还有:-

if yes_no.lower() == "n" or "no":
   function

您需要在函数后添加(),写:-

if yes_no.lower() == "n" or "no":
  function()

让我知道它是否解决了问题

Tim Roberts
Reply   •   5 楼
Tim Roberts    3 年前

看看这句话:

input_check("Do you know the rules?\n", rules(), "Ok. Starting game...")

当您这样做时,Python将调用 rules 立即运行,以便将结果传递给 input_check 你的 规则 函数打印出一堆东西,然后有完全相同的行,这将调用 rules() 一次又一次,一次又一次,一次又一次。。。它从来没有机会打电话 输入检查 .它还在处理参数。

如果要传递函数对象但不调用它,请不要使用参数:

input_check("Do you know the rules?\n", rules, "Ok. Starting game...")

请注意 输入检查 函数将继续调用传入的函数。你不需要在里面再打电话 规则 .

改善效果追踪

这和你想的不一样:

  if yes_no.lower() == "n" or "no":

解析为:

  if (yes_no.lower() == "n")   or "no":

既然“不”是真的,那么if将永远被接受。您应该使用以下选项之一:

  if yes_no.lower() in ("n" or "no"):
  if yes_no.lower()[0] == "n":

接下来,你有这个:

  if yes_no.lower() == "n" or "no":
    function

在这里,您确实想调用函数,因此需要添加参数:

  if yes_no.lower()[0] == "n":
    function()