def square100():
d = {f"{x}" : f"{x**2}" for x in range(101)}
print(d)
if __name__ == "__main__":
quadrado100()
Эта функция возвращает значения в порядке возрастания.
def square100():
d = {f"{x} : {x**2}" for x in range(101)}
print(d)
if __name__ == "__main__":
quadrado100()
Но эта функция, которая должна делать то же самое, отображается в случайном порядке. Кто-нибудь знает, почему?
Здесь нечего сказать
@AdrienDerouene Поскольку словари версии 3.8 сохраняют свой порядок вставки.
Ваш второй пример - это не словарь, это набор строк x : y. Наборы не запоминают свой порядок.
В вашем коде нет списков. Понимание списка, как и обычный список, находится внутри [], а не {}.
@Barmar: гарантия фактически началась с 3.7 (хотя все существующие интерпретаторы, совместимые с 3.6, CPython и PyPy, используют dict с порядком вставки в качестве детали реализации).
Последнее является set пониманием, а не dict пониманием (ни одно из них не является list пониманием); разница в том, что нет : (на верхнем уровне, вне строковых кавычек и т.п.), отделяющего ключ от значения в set литерале или понимании, в то время как в dict литерале или понимании есть один.
Sets имеют произвольный порядок (фактически случайный для строк; он будет меняться между разными запусками Python и может меняться даже в рамках одного запуска Python в зависимости от порядка добавления и удаления элементов), а dicts (в 3.6 как деталь реализации, а в версии 3.7+ в качестве языковой гарантии) упорядочены по вставке. Таким образом, ваш первый фрагмент кода (понимание dict) сохраняет порядок, а второй, основанный на sets, — нет.
В Python словари неупорядочены. Иногда это может быть напечатано в правильном порядке, но не каждый раз!