Изменение глобальных переменных внутри функции
Я новичок в программировании, и я ищу несколько советов о том, что делать. Программа, которую я пытаюсь написать, будет нуждаться в нескольких числах от пользователя. Я хочу использовать функцию для проверки, если пользователь вводит число или нет для каждого из введенных значений. Если ввод не число, я хочу, чтобы функция продолжала запрашивать число, пока оно не будет введено. Я хочу знать, есть ли лучший способ передать значение в глобальную переменную, кроме явного объявления каждой переменной в функции как глобальной. Я не уверен, есть ли лучший способ сделать это...
rowNum = None
def numTest(c, d):
x = False
while x is not True:
try:
c = raw_input(d)
c = float(c)
x = True
except:
print "The value you entered isn't a valid number, please try again."
global rowNum
rowNum = c
numTest(rowNum, "Enter number of rows: ")
print rowNum
# I want to use the numTest function on several variables...
# e.g.
# numTest(contourLevel, "Enter number of contour levels: ")
# numTest(cellSize, "Enter cell size: ")
# numTest(labelSize, "Enter label size: ")
2 ответа
Просто сделайте это функцией, которая будет возвращать что-то вместо манипулирования глобальным, гораздо проще в обслуживании!
def get_num(msg):
while True:
try:
return int(raw_input(msg)) # number of rows should be int
except ValueError:
print "The value you entered isn't a valid number, please try again."
num_rows = get_num("Enter number of rows: ")
print num_rows
Вместо чего-то вроде numTest(cellSize, "Enter cell size: ")
что вы упомянули, вы должны делать cellSize = get_num("Enter cell size: ")
, Лучше возвращать значения.
Вы можете сделать эту функцию более общей для int
а также float
вот так:
def get_num(msg, type_=int):
while True:
try:
return type_(raw_input(msg))
except ValueError:
print "The value you entered isn't a valid number, please try again."
Теперь вы также можете иметь:
x = get_num("test") # normal int
x = get_num("foo", float)
У меня недостаточно повторений, поэтому я не могу комментировать, но: @Schack, думайте о возврате как о внутреннем операторе печати (вы не можете видеть, что возвращается, но интерпретатор Python может читать и использовать / хранить / манипулировать это значение.) Оператор print показывает вывод на экран (для людей), хотя ничего не делает для вычислений / выполнения вашей программы, а оператор return отправляет вывод интерпретатору python (для программы), хотя на экране ничего не показывает для люди читать.
например, если функция возвращает строку, вы можете сохранить этот вывод как переменную, указав: variable1 = function1(args)
который будет хранить любую строку, возвращаемую функцией function1 (на основе ввода аргументов), как variable1.
Это невероятно полезно для организации кода и означает, что вам не нужно возиться с глобальными переменными.
Важно отметить, что как только функция возвращает значение, никакой другой код не выполняется.
Так, например:
def example(a, b):
for n in range(1, 30):
if a**n == b**4:
return
break
else:
return False
Операторы break и else являются избыточными, потому что после того, как функция выполнит оператор return, никакой другой код не будет выполнен. Лучший способ написать это было бы:
def example(a, b):
for n in range(1, 30):
if a**n == b**4:
return n
return False
Я надеюсь, что вас совсем не смутило, поскольку я немного отвлекся от своего ответа, просто пытаясь помочь, так как я сам новичок и нашел такое объяснение полезным, когда я изучил эти темы