任何想法为什么else语句不处理这个?

时间:2017-12-15 00:15:14

标签: python python-2.7 input eulers-number

这是我从头开始的第一个小型Python项目。想法是获取用户输入并返回具有指定位数的“e”,由用户的输入指定。这绝对是一种非Pythonic的做事方式,但我的目标是在没有任何外界帮助的情况下尝试解决它:)

我正在使用Python 2.7,你可以看到。

/// <summary>
/// Gets a strongly typed (double) value from the Console
/// </summary>
/// <param name="prompt">The initial message to display to the user</param>
/// <returns>User input converted to a double</returns>
public static double GetDoubleFromUser(string prompt = "Enter a number: ", 
    double minValue = double.MinValue, double maxValue = double.MaxValue)
{
    double value;

    // Write the prompt text and get input from user
    Console.Write(prompt);

    while (!double.TryParse(Console.ReadLine(), out value)
           || value < minValue || value > maxValue)
    {
        // If input can't be converted to a double, keep trying
        Console.WriteLine("ERROR: Invalid value!");
        Console.Write(prompt);
    }

    // Return converted input value
    return value;
}

我希望“else”语句能够解决非整数输入问题。但是我收到了一条错误消息(ValueError)。

double decoration = GetDoubleFromUser("Please Choose decoration 1 or 2: ", 1, 2);

我决定重新审视错误和异常,并意识到我可以使用“try / except / finally”等等。

euler = 2.71828

digits = raw_input('Please enter the desired digit: ')

digitsError = 'Error: Please enter an integer'

euler_str = str(euler)

这可能是一个非常简单的问题,但我重新审视了我用来学习Python的材料,但无法确定问题。非常感谢你!

编辑: 上面提到的错误消息:

def digitsCheck():
    if digits == int:
        return digits
    else:
        return digitsError

digitsCheck()

当我使用带有raw_input()的非整数时,我收到此消息。

2 个答案:

答案 0 :(得分:0)

执行if digits == int:后,您需要将变量digits(包含由raw_input返回的字符串)与类型int进行比较。这种比较永远不会成立,因为字符串和类型永远不会相等。大多数情况下,不同类型的物体将不相等。数字是重要的例外,其中等效的intfloat个实例将相等(例如1.0 == 1)。

您可能想要检查digits变量是否包含实际的整数值,在这种情况下,您可以使用isinstanceif isinstance(digits, int):。但我们知道digits是一个字符串,因为这是raw_input唯一会返回的内容。即使数字字符串仍然是字符串,而不是整数。

您想要检查digits字符串中的所有字符是否实际为数字,以便您可以成功将值传递给int以获取数字而不是字符串。为此,您可能希望在字符串isdigit上调用if digits.isdigit():方法。

但那是&#34;先看你跳过&#34; (LBYL)解决将用户输入转换为数字的问题。使用tryexcept的第二个解决方案采用的方法称为“#34;更容易请求宽恕而不是权限”#34; (EAFP),在许多Python程序员很容易做到的情况下,它通常比LBYL风格更受欢迎。如果您只是学习Python编程,那么在两种样式中编写代码绝对值得学习,因为有时候一种风格比另一种风格更容易解决特定问题。

答案 1 :(得分:0)

您在这里遇到的问题与名为范围的概念有关。在编程方面,范围是系统在执行程序期间使用变量的方式。为简单起见,我们将讨论两个变量:

  • 全球:一切都看得见
  • 本地:只看一些事情

当一个程序执行一个函数,并且在该函数中初始化一个变量(例如myVar)时,它会被抛出到堆栈中。函数完成执行后,局部变量将从堆栈中弹出,不再能够在内存空间中引用。相反,全局变量在程序运行时被抛出堆栈,并且可以在程序完成之前随时引用,因为它将一直保留在堆栈上。 一般规则是全局变量很少是首选,只需使用局部变量并依赖函数作用域。

如果您没有参加计算机体系结构课程,这看起来有点复杂,所以:

global myVar # technically program starts here, allocates memory on the stack for 'myVar'

def local(): # Notice there are no function parameters
    print (myVar) # myVar is accessible outside this local function

def change(): # Again, no parameters
    myVar = 'World' # Again, accessible
    local()

# Program starts here
myVar = 'Hello'
local()
change()

# Outputs:
# 'Hello'
# 'World'

现在,如果我尝试使用局部变量:

def local():
    print (myVar)

def change():
    myVar = 'World'
    local()

myVar = 'Hello'
local()
change()

# Outputs:    
# Will not output, will thrown error saying `myVar` is not defined

它不起作用的原因是因为local()中没有名为myVar的变量;该变量在函数的范围之外定义。为了解决这个问题,我们传递变量,从而进入所需函数的范围:

def local(var): # var == myVar
    print (var)

def change(var): # var == myVar
    var = 'World'
    local(var)

myVar = 'Hello' # Start with a main local variable
local(myVar) # Give it to 'local()'
change(myVar) # Give it to 'change()'

# Outputs:    
# 'Hello'
# 'World'

最后,我们可以看看你的情况:

def digitsCheck(): # This is a local function
    if digits == int: # Interpreter is wondering "What is digits?"
        return digits
    else:
        return digitsError # Interpreter is wondering "What is digitsError?"

euler = 2.71828 # Constant
digits = raw_input('Please enter the desired digit: ') # Local variable
digitsError = 'Error: Please enter an integer' # Local variable
euler_str = str(euler) # Local variable

digitsCheck() # Call to local function [but this also returns, how do you capture?]

几点说明:

  • raw_input返回str
  • 在文件顶部和CAPS
  • 中声明常量(euler
  • 可能有点高级,但你的digistError已经是一个内置异常(ValueError
  • 您的digitsCheck()return来电,但您没有捕获回复
  • 您的digitsCheck()尝试digits == int,但根本无法使用

我会做什么:

EULER = 2.71828

def digitsCheck():
    # You don't even need this!

while True:
    try:
        digits = int(raw_input('Please enter the desired digit: ')
        break
    except ValueError:
        print('Error: Please enter an integer')

euler_str = str(EULER) # For whatever you use this for

# Rest of your program below

我坚信实例可以补充概念,所以希望这会有所帮助!