Гарантирован ли порядок выполнения при переборе строки?

Гарантируется ли, что приведенная ниже программа всегда выдает один и тот же результат?

s = 'fgvhlsdagfcisdghfjkfdshfsal'
for c in s:
    print(c)

person Superbest    schedule 02.05.2017    source источник


Ответы (5)


Да, это так. Это связано с тем, что тип str является неизменяемой последовательностью. Последовательности представляют собой конечный упорядоченный набор элементов (см. Последовательности в главу Модель данных Справочного руководства).

Итерация по заданной строке (любой последовательности) гарантированно всегда дает одни и те же результаты в одном и том же порядке для разных запусков интерпретатора CPython, версий CPython и реализаций Python.

person Dimitris Fasarakis Hilliard    schedule 02.05.2017

Да. Внутри строка, которая у вас есть, хранится в массиве стиля c (в зависимости от реализации интерпретатора), являясь последовательным массивом данных, можно создать итератор. Чтобы использовать синтаксис for ... in ..., вы должны иметь возможность итерировать по объекту после in. Строка предоставляет свой собственный итератор, который позволяет анализировать ее с помощью синтаксиса for in в последовательном порядке, как выполнить все последовательности Python.

То же самое верно для списков и даже настраиваемых объектов, которые вы создаете. Однако не все итерируемые объекты python обязательно будут в порядке или представляют значения, которые они хранят, ярким примером этого является словарь. Итерация словаря дает ключи, которые могут быть или не быть в том порядке, в котором вы их добавили (в зависимости от версии Python, которую вы используете среди прочего, поэтому не предполагайте, что она упорядочена, если вы не используете OrderedDict) вместо последовательных значений, таких как список кортежей и нить.

person Krupip    schedule 02.05.2017

Да, это так. Над строкой цикл for перебирает символы по порядку. Это также верно для списков и кортежей — цикл for будет перебирать элементы по порядку.

Возможно, вы думаете о наборах и словарях. Они не определяют конкретный порядок, поэтому:

for x in {"a","b","c"}:  # over a set
    print(x)

for key in {"x":1, "y":2, "z":3}:  # over a dict
    print(key)

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

Посмотрите этот ответ Stack Overflow для получения дополнительной информации о том, какие гарантии даются в отношении заказ словарей и комплектов.

person K. A. Buhr    schedule 02.05.2017

Да. Цикл for является последовательным.

person Jeremy Winfree    schedule 02.05.2017

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

person Archmede    schedule 02.05.2017