Что осталось как в Python
Хорошая новость для питониста: большая часть того, что вы уже умеете, переносится в Mojo дословно. Эта глава — про то, что менять в голове не придётся.
Один пример вместо десяти абзацев
Заголовок раздела «Один пример вместо десяти абзацев»Вот программа, в которой нет ни одной конструкции, специфичной для Mojo. Питонист читает её без словаря:
def greet(name: String, greeting: String = "Привет") -> String: """Собирает приветствие. Значение по умолчанию — как в Python.""" return greeting + ", " + name + "!"
def main(): # Функции, значения по умолчанию и именованные аргументы print(greet("Мир")) print(greet(name="Mojo", greeting="Здравствуй"))
# Списки и генераторы списков var squares: List[Int] = [i * i for i in range(5)] for value in squares: print(value, end=" ") print()
# Словари доступны без импорта var ages = Dict[String, Int]() ages["Аня"] = 30 ages["Борис"] = 25 print("людей в словаре:", len(ages))
# Циклы, условия, break и continue var total = 0 for i in range(10): if i % 2 == 0: continue if i > 7: break total += i print("сумма нечётных до 7:", total)
# Кортежи и множественное присваивание var left, right = 1, 2 print("слева", left, "справа", right)Привет, Мир! Здравствуй, Mojo! 0 1 4 9 16 людей в словаре: 2 сумма нечётных до 7: 16 слева 1 справа 2
Дальше — по пунктам, что именно здесь работает как в Python.
Оформление кода
Заголовок раздела «Оформление кода»Отступы вместо скобок. Блоки задаются отступом, двоеточие открывает блок, пустые строки ни на что не влияют. Всё как вы привыкли.
Комментарии — через #.
Докстринги — тройные кавычки первой строкой в теле функции. Более того, расширение Mojo для VS Code умеет работать с примерами кода внутри докстрингов: подсвечивает их и проверяет.
def add(a: Int, b: Int) -> Int: """Складывает два числа.""" return a + bФункции
Заголовок раздела «Функции»Значения по умолчанию, именованные аргументы, возврат значения — без отличий:
def greet(name: String, greeting: String = "Привет") -> String: return greeting + ", " + name + "!"greet("Мир") # позиционноgreet(name="Mojo", greeting="Здравствуй") # по именамПравило «обязательные аргументы идут перед аргументами со значением по умолчанию» тоже сохранилось.
Управляющие конструкции
Заголовок раздела «Управляющие конструкции»if / elif / else, for ... in, while, break, continue — всё
на месте. Даже редкая питоновская конструкция for ... else работает:
def main(): for i in range(2): print(i) else: print("цикл завершился без break")range() ведёт себя привычно: range(5), range(2, 10), range(0, 10, 2).
Списки и словари
Заголовок раздела «Списки и словари»Литералы списков и генераторы списков (list comprehensions):
var squares: List[Int] = [i * i for i in range(5)]Словари доступны сразу, без импорта:
var ages = Dict[String, Int]()ages["Аня"] = 30Конкатенация, повторение, привычные методы:
def main(): print("ab" + "cd") # abcd print("-" * 5) # ----- print("Привет".upper()) # ПРИВЕТ print(" x ".strip()) # xКортежи и множественное присваивание
Заголовок раздела «Кортежи и множественное присваивание»var left, right = 1, 2var point = (10, 20)var x = point[0]Ошибки и файлы
Заголовок раздела «Ошибки и файлы»try / except / finally и менеджеры контекста работают привычно:
# внутри функции, помеченной raiseswith open("data.txt", "w") as f: f.write("привет")try: risky()except e: print("поймали:", e)Единственное отличие — функцию, которая может бросить исключение, нужно
пометить словом raises. Об этом — в следующей
главе.
Декораторы
Заголовок раздела «Декораторы»Синтаксис @имя над объявлением — тот же. Набор декораторов другой
(@fieldwise_init, @staticmethod, @parameter), но выглядит всё привычно.
Модули и импорты
Заголовок раздела «Модули и импорты»from std.collections.optional import OptionalФорма from ... import ... знакома, отличается только состав стандартной
библиотеки. Часть типов — Int, Float64, Bool, String, List, Dict,
SIMD, Tuple — доступна вообще без импорта.
Даже Python можно вызвать прямо из Mojo
Заголовок раздела «Даже Python можно вызвать прямо из Mojo»Если библиотеки на Mojo ещё нет, берите питоновскую:
from std.python import Python
def main() raises: var math = Python.import_module("math") print(math.sqrt(16))4.0
Это не «мостик на будущее», а рабочий механизм: доступны NumPy, pandas, matplotlib и всё остальное, что установлено в вашем окружении. Подробно — в главе Вызов Python из Mojo.
🎯 Проверь себя
Почему `List` требует указания типа, а в Python список — нет?
Список в Python хранит ссылки на объекты, и объекты могут быть любыми.
В Mojo список хранит сами значения подряд в памяти, поэтому компилятору
нужно знать, сколько байт занимает элемент. Отсюда List[Int]
вместо просто list.
Что из этого списка НЕ работает в Mojo: генераторы списков, for/else, f-строки, `with open`?
Не работают только f-строки. Остальное — генераторы списков, for ... else
и менеджеры контекста — переносится из Python без изменений.
Что дальше
Заголовок раздела «Что дальше»Теперь — самое важное отличие: что придётся делать иначе и почему.
Тексты курса — CC BY-NC-SA 4.0, код примеров — Apache 2.0