Почему мне не нужно определять переменную в цикле for с помощью range (), а мне нужно в цикле while в Python? - PullRequest
5 голосов
/ 28 мая 2019

У меня есть следующий код, использующий цикл for:

    total = 0
    for num in range(101):
       total = total + num
       print(total)

Теперь тот же результат, используя цикл while:

    num = 0
    total = 0
    while num <= 99:
         num = num + 1
         total = total + num
         print(total)

Почему мне не нужно определять num в первом случае, но я должен определить его во втором? Они оба не переменные?

Ответы [ 6 ]

3 голосов
/ 28 мая 2019

Ну, for - это специальный оператор, который автоматически определяет переменную для вас.Было бы излишним требовать, чтобы вы объявили переменную заранее.

while - это конструкция цикла общего назначения.Условие для оператора while даже не должно включать переменную;например

while True: 

или

while my_function() > 0:
2 голосов
/ 28 мая 2019

Я бы хотел подойти к этому вопросу с несколько иной точки зрения.

Если мы посмотрим на официальную грамматическую спецификацию Python , мы увидим, что (приблизительно говоря), оператор while принимает test, тогда как оператор for принимает exprlist и testlist.

Таким образом, в концептуальном плане мы можем понять, что для выражения while требуется одна вещь: выражение, которое оно может повторно вычислять.

С другой стороны, для оператора for необходимо два : набор выражений для оценки, а также ряд имен для привязки результатов этих вычислений.

Имея это в виду, имеет смысл, что оператор while не будет автоматически создавать временную переменную, поскольку он также может принимать литералы. И наоборот, оператор for должен связываться с некоторыми именами.

(Строго говоря, с точки зрения грамматики Python допустимо помещать литерал там, где вы ожидаете имя в выражении for, но контекстуально это не имеет смысла, поэтому язык запрещает его.)

2 голосов
/ 28 мая 2019

В python в большинстве случаев нет необходимости определять / объявлять переменные.

Правило состоит в том, что если вы пишете (присваиваете) переменную, то эта переменная является локальной переменной функции; если вы только читаете это вместо этого, то это глобально.

Переменные, назначенные на верхнем уровне (вне какой-либо функции), являются глобальными ... так, например:

x = 12     # this is an assignment, and because we're outside functions x
           # is deduced to be a global

def foo():
    print(x)     # we only "read" x, thus we're talking of the global

def bar():
    x = 3        # this is an assignment inside a function, so x is local
    print(x)     # will print 3, not touching the global

def baz():
    x += 3       # this will generate an error: we're writing so it's a
                 # local, but no value has been ever assigned to it so it
                 # has "no value" and we cannot "increment" it

def baz2():
    global x     # this is a declaration, even if we write in the code
                 # x refers to the global
    x += 3       # Now fine... will increment the global

Оператор for - это просто цикл, который записывает в переменную: если объявление не присутствует, то переменная будет считаться локальной; если существует объявление global или nonlocal, то используемая переменная будет иметь соответствующую область видимости (nonlocal используется для записи в локальную переменную включающей функции из кода во вложенной функции: она не очень часто используется в Python ).

1 голос
/ 28 мая 2019

Для цикла повторяет каждый элемент из списка до заданного диапазона. Так что нет необходимости в какой-либо переменной для проверки условия.

Пока цикл повторяется до тех пор, пока данное условие не станет истинным. Здесь нам нужна переменная или значение для проверки условия, поэтому перед циклом используется переменная num.

1 голос
/ 28 мая 2019

Если вы пришли из других языков программирования, таких как C, C++ или Java, не путайте с for in петлей Python.

В питоне цикл for in выбирает один элемент из списка и делает что-то с помощью выбранного элемента.

0 голосов
/ 28 мая 2019

Python for циклы присваивают переменную и позволяют вам использовать ее. Мы можем преобразовать цикл for в цикл while, чтобы понять, как на самом деле это делает Python (подсказка: он использует итераторы!):

iterator = iter(iterable)  # fresh new iterator object
done = False
while not done:
    try:
        item = next(iterator)
        # inside code of a for loop, we can use `item` here
    except StopIteration:
        done = True
...