【问题标题】:Printing with Quotes [closed]带引号打印[关闭]
【发布时间】:2014-02-25 21:19:31
【问题描述】:

为什么当我使用下面的程序时,我总是在引号中得到“y”,而不是 y 定义的值,这将是用户输入的字符串

def main():
    x = (input("Give me a boolean: ").lower() == 'true')     
    y = str(input("Give me a string: "))
    z = int(input("Give me a number: "))
    if x == True:
        print (y)
        print ("\"",y,"\"",sep="")
    else:
        print (z*2)



main()

【问题讨论】:

  • 什么?我不明白这个问题......你能解释一下吗?顺便说一句,你的or true 是错误的,没用的。
  • 好的,如果用户为“给我一个布尔值”输入“true”或“True”,我希望它打印字符串(y)两次,一次带引号,一次不带引号
  • 只是一个提示.. 字符串"False" 是True。也许x 应该是input("boolean: ").lower() == "true"
  • @adsmith 除非true 已定义。如果true 是True,那么if 条件将始终得到满足,如果true 是False,那么条件的or 部分不会执行任何操作。
  • 我打算做一个 {if} [else] 语句,我只是没有在代码中做到那么远,我只是想在我写 else 语句之前弄清楚报价问题

标签: python string input integer boolean


【解决方案1】:

让我们谈谈布尔值,因为这实际上是这里的问题。

x = bool(input("Give me a boolean: "))
# x is ALWAYS True unless the user enters an empty string

这里的问题是所有非空字符串都是布尔值True。 "Hello" 是 True,"TRUE" 是 True,"False" 是 True。计算结果为False 的唯一字符串是""。因此,当您在此处提示输入,然后稍后进行测试时,您总是会通过该测试,除非用户只是绕过测试。让我们继续...

y = str(input("Give me a string: ")) # good here, though no need to call str()
z = int(input("Give me a number: ")) # uh oh...

如果我为 z 输入 ajkldfj,它将抛出一个 ValueError。通常的处理方式是try/except,例如:

z = input("Give me a number: ")
try:
    int(z)
except ValueError as e:
    # handle it

接下来...

if x == True or true:

这与很多人都有同样的问题。 if foo == 1 or 2 并不是你认为的那样,它实际上是指if (foo == 1 is True) or (2 is True)。要做你想做的事,你应该做if x == "True" or x == "true",但更好的是if x.lower() == "true",更好的是if x.casefold() == 'true',但BEST YET只是if x。请记住,当您提示输入时,您已经将其转换为bool。当然,您可以通过放弃bool() 调用来更改它,然后在此处对其进行测试,在这种情况下,我推荐if x.lower() == 'true' 或if x.casefold() == 'true'。您会经常看到的另一个代码是 if x in ('true','True'),但因为我们可以只使用小写来消除所有歧义:DO IT!

现在到您的打印声明:

    print (y)     # prints the value in y
    print ('"y"') # prints "y"

如果这不是您想要做的,您可以使用字符串格式或其他任何东西来正确格式化它。让我知道你想做什么,我们可以进一步讨论!

【讨论】:

  • 好吧,我刚刚更新了我的程序并把它放在了最前面,我现在唯一的问题是如果我打印“true”或“false”,当我这样做时,它表示 true 和 false 都未定义
  • true 和 false 均未定义。 True 是布尔值 True,False 是布尔值 false。大写很重要。此外,"true" 和"false" 是字符串,但您需要将它们用引号括起来以表明这一点。有点令人困惑(正如我在第一段中提到的那样),所有不为空的字符串(例如,"" 是长度为零的字符串)评估为True,因此"false" 评估为True。跨度>
  • @user3331010 也是,重要的是,在你学习编程的未来两到三年内绝对不会出现eval 做任何事情的正确方法。从您的代码 tout suite 中删除它!
  • 相反,如果您希望x 成为布尔值True 当且仅当用户输入"True","true","TRUE", etc... 时,请执行x = input("Give me a boolean: ").lower() == 'true'。 == 运算符返回 True 或 False,在此处执行操作将提示用户输入,将其转换为小写,并与字符串 "true" 进行检查。
  • 好的,非常感谢,你帮了很多忙,但出于好奇,为什么 [eval] 如此糟糕,我的 cs 老师在转换 blooeans 和数字输入的示例中经常使用它
【解决方案2】:

您必须使用下面的行仅打印 y

print(y)

及以下为带括号的y

print( "(" + y + ")")  

Warning:在你的代码中如果 X==False 然后 python 给你下面的错误

NameError: name 'true' is not defined

【讨论】:

    【解决方案3】:

    您可以在打印的同时使用format。

    print("({0})".format(y))
    

    0 引用传递给 format 的第一个参数,1 引用第二个参数,依此类推。另外,你在做x == True or true,or true 是错误的,应该被删除。还有bool("True") == bool("False") == True,因为字符串(长度> 0)在Python中是True,你可能想要类似

    x = str(input("True/False? "))
    y = str(input("Input string: "))
    z = int(input("Number: "))
    if x.lower() == "true":
        print("({0})".format(y))
    

    编辑:示例会话

    >>> def main():
        x = str(input("True/False? "))
        y = str(input("Input string: "))
        z = int(input("Number: "))
        if x.lower() == "true":
            print("({0})".format(y))
    
    >>> main()
    True/False? false
    Input string: dog
    Number: 2
    
    >>> main()
    True/False? true
    Input string: dog
    Number: 2
    (dog)
    

    【讨论】:

    • 我不使用 [if] [elise] 语句,我还没有完成代码,所以我没有做到那么远,我试图在处理 Else 之前解决报价问题:声明
    • 不使用 if-else 语句是什么意思?
    • @hkpeprah 如果您只是格式化一个单词,那么拨打昂贵的str.format 电话通常是不值得的。只需print("(" + str(y) + ")")
    • @adsmith 他想格式化括号中的字符串,所以str(y) 不会删掉它。 "(" + y + ")"、"(%s)"%y 或 "({0})".format(y)。 OP 似乎不是为了性能,但他们当然在那里。
    猜你喜欢
    • 2014-11-23
    • 1970-01-01
    • 2021-03-17
    • 1970-01-01
    • 2015-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多