Когда использовать “в то время как” или “для” в Python

Используйте эстетику group в вызове ggplot(). Это гарантирует, что все слои уложены одинаково.

series <- data.frame(
  time = c(rep(1, 4),rep(2, 4), rep(3, 4), rep(4, 4)),
  type = rep(c('a', 'b', 'c', 'd'), 4),
  value = rpois(16, 10)
)

ggplot(series, aes(time, value, group = type)) +
  geom_col(aes(fill = type)) +
  geom_text(aes(label = type), position = "stack")
32
задан wjandrea 5 June 2017 в 01:42
поделиться

6 ответов

Да, существует огромная разница между while и for.

Оператор for выполняет итерацию по коллекции или итерируемому объекту или функции-генератору.

112018], а оператор просто зацикливается, пока условие не станет ложным.

Это не предпочтение. Вопрос в том, какие у вас структуры данных.

Часто мы представляем значения, которые хотим обработать, в виде диапазона (фактический список) или xrange (который генерирует ценности). Это дает нам структуру данных, специально созданную для оператора for .

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

В некоторых случаях нам может потребоваться выполнение некоторой обработки функционального программирования за нас, в этом случае мы можем применить это преобразование как часть итерации. Функции sorted и enumerate применяют преобразование к итерации, которое естественным образом согласуется с оператором for .

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

62
ответ дан 27 November 2019 в 19:51
поделиться

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

 while user_is_sleeping():
     wait()

Конечно, вы могли бы написать соответствующий итератор, чтобы инкапсулировать это действие и сделать его доступным через для - но как это будет способствовать удобочитаемости? ¹

Во всех остальных случаях в Python используйте для (или соответствующую функцию высшего порядка, которая инкапсулирует цикл).

¹ предполагая, что функция user_is_sleeping возвращает False , когда false, пример кода можно переписать следующим образом для цикла :

for _ in iter(user_is_sleeping, False):
    wait()
21
ответ дан 27 November 2019 в 19:51
поделиться

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

Например, этот:

for i in range(11):
    print i

намного проще и легче читать, чем это:

i = 0
while i <= 10:
    print i
    i = i + 1
13
ответ дан 27 November 2019 в 19:51
поделиться

Прежде всего, есть различия между циклом for в Python и других языках. В то время как в python он выполняет итерацию по списку значений (например: для значения в [4,3,2,7]), в большинстве других языков (C / C ++, Java, PHP и т. Д.) Он действует как цикл while, но проще для чтения.

Циклы For обычно используются, когда известно количество итераций (например, длина массива), а циклы while используются, когда вы не знаете, сколько времени это займет (например, алгоритм пузырьковой сортировки , который повторяется, пока значения не отсортированы)

4
ответ дан 27 November 2019 в 19:51
поделиться

Циклы For обычно проясняют, что делает итерация. Вы не всегда можете использовать их напрямую, но в большинстве случаев логику итераций с циклом while можно обернуть внутри функции генератора. Например:

def path_to_root(node):
    while node is not None:
        yield node
        node = node.parent

for parent in path_to_root(node):
    ...

Вместо

parent = node
while parent is not None:
    ...
    parent = parent.parent
2
ответ дан 27 November 2019 в 19:51
поделиться

Учитывать итерации обработки. Вы можете сделать это с помощью цикла for :

for i in mylist:
   print i

Или вы можете сделать это с помощью цикла while :

it = mylist.__iter__()
while True:
   try:
      print it.next()
   except StopIteration:
      break

Оба этих блока кода в основном делают то же самое в принципиально так же. Но цикл for скрывает создание итератора и обработку исключения StopIteration , так что вам не нужно разбираться с ними самостоятельно.

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

3
ответ дан 27 November 2019 в 19:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: