Используйте эстетику 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")
Да, существует огромная разница между while и for.
Оператор for выполняет итерацию по коллекции или итерируемому объекту или функции-генератору.
112018], а оператор просто зацикливается, пока условие не станет ложным.
Это не предпочтение. Вопрос в том, какие у вас структуры данных.
Часто мы представляем значения, которые хотим обработать, в виде диапазона
(фактический список) или xrange
(который генерирует ценности). Это дает нам структуру данных, специально созданную для оператора for .
Обычно, однако, у нас есть готовая коллекция: набор, кортеж, список, карта или даже строка уже является итерируемая коллекция, поэтому мы просто используем цикл for .
В некоторых случаях нам может потребоваться выполнение некоторой обработки функционального программирования за нас, в этом случае мы можем применить это преобразование как часть итерации. Функции sorted
и enumerate
применяют преобразование к итерации, которое естественным образом согласуется с оператором for .
Если у вас нет аккуратной структуры данных чтобы выполнить итерацию, или у вас нет функции генератора, которая управляет обработкой, вы должны использовать , а .
, а
полезен в сценариях, где условие прерывания логически не зависит от какой-либо последовательности. Например, рассмотрим непредсказуемые взаимодействия:
while user_is_sleeping():
wait()
Конечно, вы могли бы написать соответствующий итератор, чтобы инкапсулировать это действие и сделать его доступным через для
- но как это будет способствовать удобочитаемости? ¹
Во всех остальных случаях в Python используйте для
(или соответствующую функцию высшего порядка, которая инкапсулирует цикл).
¹ предполагая, что функция user_is_sleeping
возвращает False
, когда false, пример кода можно переписать следующим образом для цикла
:
for _ in iter(user_is_sleeping, False):
wait()
для
является более питоническим выбором для итерации списка, поскольку его проще и легче читать.
Например, этот:
for i in range(11):
print i
намного проще и легче читать, чем это:
i = 0
while i <= 10:
print i
i = i + 1
Прежде всего, есть различия между циклом for в Python и других языках. В то время как в python он выполняет итерацию по списку значений (например: для значения в [4,3,2,7]), в большинстве других языков (C / C ++, Java, PHP и т. Д.) Он действует как цикл while, но проще для чтения.
Циклы For обычно используются, когда известно количество итераций (например, длина массива), а циклы while используются, когда вы не знаете, сколько времени это займет (например, алгоритм пузырьковой сортировки , который повторяется, пока значения не отсортированы)
Циклы 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
Учитывать итерации обработки. Вы можете сделать это с помощью цикла for
:
for i in mylist:
print i
Или вы можете сделать это с помощью цикла while
:
it = mylist.__iter__()
while True:
try:
print it.next()
except StopIteration:
break
Оба этих блока кода в основном делают то же самое в принципиально так же. Но цикл for
скрывает создание итератора и обработку исключения StopIteration
, так что вам не нужно разбираться с ними самостоятельно.
Единственный раз, когда я могу подумайте о том, что вы бы использовали цикл while
для обработки итерации, если бы вам по какой-то причине нужен прямой доступ к итератору, например, вам нужно было пропустить элементы в списке при некоторых обстоятельствах.