这是我从头开始的第一个小型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()的非整数时,我收到此消息。
答案 0 :(得分:0)
执行if digits == int:
后,您需要将变量digits
(包含由raw_input
返回的字符串)与类型int
进行比较。这种比较永远不会成立,因为字符串和类型永远不会相等。大多数情况下,不同类型的物体将不相等。数字是重要的例外,其中等效的int
和float
个实例将相等(例如1.0 == 1
)。
您可能想要检查digits
变量是否包含实际的整数值,在这种情况下,您可以使用isinstance
:if isinstance(digits, int):
。但我们知道digits
是一个字符串,因为这是raw_input
唯一会返回的内容。即使数字字符串仍然是字符串,而不是整数。
您想要检查digits
字符串中的所有字符是否实际为数字,以便您可以成功将值传递给int
以获取数字而不是字符串。为此,您可能希望在字符串isdigit
上调用if digits.isdigit():
方法。
但那是&#34;先看你跳过&#34; (LBYL)解决将用户输入转换为数字的问题。使用try
和except
的第二个解决方案采用的方法称为“#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
euler
)
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
我坚信实例可以补充概念,所以希望这会有所帮助!