Изменение глобальных переменных внутри функции

Я новичок в программировании, и я ищу несколько советов о том, что делать. Программа, которую я пытаюсь написать, будет нуждаться в нескольких числах от пользователя. Я хочу использовать функцию для проверки, если пользователь вводит число или нет для каждого из введенных значений. Если ввод не число, я хочу, чтобы функция продолжала запрашивать число, пока оно не будет введено. Я хочу знать, есть ли лучший способ передать значение в глобальную переменную, кроме явного объявления каждой переменной в функции как глобальной. Я не уверен, есть ли лучший способ сделать это...

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

Я надеюсь, что вас совсем не смутило, поскольку я немного отвлекся от своего ответа, просто пытаясь помочь, так как я сам новичок и нашел такое объяснение полезным, когда я изучил эти темы

Другие вопросы по тегам