Mojo quickstart
This page quickly teaches you Mojo's syntax by focusing on code.
For more explanation of the language features, see the Mojo get started tutorial or Mojo language basics.
Project setup
You can install Mojo using any Python or Conda package manager,
but we recommend either pixi or uv.
- uv
- pixi
- pip
- conda
-
If needed, install
uv:curl -LsSf https://astral.sh/uv/install.sh | sh -
Create a project and install Mojo:
uv init temperature-analyzer && cd temperature-analyzer
uv venv && source .venv/bin/activate
uv pip install mojo --extra-index-url https://modular.gateway.scarf.sh/simple/
-
If needed, install
pixi:curl -fsSL https://pixi.sh/install.sh | sh -
Create a project and install Mojo:
pixi init temperature-analyzer \
-c https://conda.modular.com/max-nightly/ -c conda-forge
cd temperature-analyzer
pixi add mojo
pixi shell
Create a project and install Mojo:
mkdir temperature-analyzer && cd temperature-analyzer
python3 -m venv .venv && source .venv/bin/activate
pip install mojo --extra-index-url https://modular.gateway.scarf.sh/simple/
- macOS
- Linux
-
If needed, install Conda:
brew install miniconda
conda init zsh
source ~/.zshrc # Or other shell rc file -
Create a project and install Mojo:
conda create -n temperature-analyzer
conda activate temperature-analyzer
conda install -c conda-forge -c https://conda.modular.com/max/ mojo
-
If needed, install Conda:
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
bash Miniconda3-latest-Linux-x86_64.sh
conda init bash
source ~/.bashrc # Or other shell rc file -
Create a project and install Mojo:
conda create -n temperature-analyzer
conda activate temperature-analyzer
conda install -c conda-forge -c https://conda.modular.com/max/ mojo
Try Mojo agent skills
Use Mojo agent skills with your AI tools to generate more accurate Mojo code while learning Mojo:
npx skills add modular/skills
Hello Mojo
Create analyzer.mojo in your favorite IDE or editor.
Add this to analyzer.mojo:
def main():
print("Temperature Analyzer")
Run it:
mojo analyzer.mojo
Insights:
- If you see "Temperature Analyzer", your setup works.
- All Mojo executables use
main()as their entry point.
Variables and data
Update your file to add temperature data:
def main():
print("Temperature Analyzer")
# Square brackets tell Mojo the `List` type at compile time
var temps: List[Float64] = [20.5, 22.3, 19.8, 25.1]
print("Recorded", len(temps), "temperatures")
Loops
Print each temperature. Add to main() under the print statement:
def main():
# ... existing code ...
for index in range(len(temps)): # The range is [0, len(temps))
print(" Day {}: {}°C".format(index + 1, temps[index]))
Insights:
- The day is offset by 1 because the range uses zero-based indexing.
Functions
Add this function above main() to calculate the average temperature:
def calculate_average(temps: List[Float64]) -> Float64:
var total: Float64 = 0.0
for index in range(len(temps)):
total += temps[index]
return total / Float64(len(temps))
def main():
# ... existing code ...
Add to the end of main() to call the function:
var avg = calculate_average(temps)
print("Average: {}°C".format(avg))
Conditionals
Classify the average temperature. Add to the end of main():
if avg > 25.0:
print("Status: Hot week")
elif avg > 20.0:
print("Status: Comfortable week")
else:
print("Status: Cool week")
Raise errors
Handle empty data by updating calculate_average. Now the function
can raise an error.
def calculate_average(temps: List[Float64]) raises -> Float64:
if len(temps) == 0: # Empty list of temperatures
raise Error("No temperature data")
var total: Float64 = 0.0
for index in range(len(temps)):
total += temps[index]
return total / Float64(len(temps))
What changed:
- You add
raisesbefore the return arrow. - You add the check for an empty list.
- You raise an
Errorif it's empty.
Handle errors
In main(), wrap your code in try-except for error handling:
try:
var avg = calculate_average(temps)
print("Average: {}°C".format(avg))
if avg > 25.0:
print("Status: Hot week")
elif avg > 20.0:
print("Status: Comfortable week")
else:
print("Status: Cool week")
except e:
print("Error:", e)
To test the error, replace temps with List[Float64]().
Confirm that your app errors with "No temperature data".
Python integration
Add statistics with Python's numpy. First, install it:
- uv
- pixi
- pip
- conda
uv pip install numpy
pixi add numpy
pip install numpy
conda install numpy
Then, add the following imports at the top of your file:
from std.python import Python, PythonObject
Now, calculate Python stats at the end of the try block in main():
var np = Python.import_module("numpy")
var pytemps: PythonObject = [20.5, 22.3, 19.8, 25.1]
print("Temperature standard deviation:", np.std(pytemps))
Final code
Your complete analyzer.mojo:
from std.python import Python, PythonObject
def calculate_average(temps: List[Float64]) raises -> Float64:
if len(temps) == 0:
raise Error("No temperature data")
var total: Float64 = 0.0
for index in range(len(temps)):
total += temps[index]
return total / Float64(len(temps))
def main():
print("Temperature Analyzer")
var temps: List[Float64] = [20.5, 22.3, 19.8, 25.1]
print("Recorded", len(temps), "temperatures")
for index in range(len(temps)):
print(" Day {}: {}°C".format(index + 1, temps[index]))
try:
var avg = calculate_average(temps)
print("Average: {}°C".format(avg))
if avg > 25.0:
print("Status: Hot week")
elif avg > 20.0:
print("Status: Comfortable week")
else:
print("Status: Cool week")
var np = Python.import_module("numpy")
var pytemps: PythonObject = [20.5, 22.3, 19.8, 25.1]
print("Temperature standard deviation:", np.std(pytemps))
_ = pytemps^ # Allow the Python object to deallocate
except e:
print("Error:", e)
What you touched
Mojo variables, lists, loops, functions, conditionals, error handling, and Python integration, all in one working program.
Build something bigger: Tutorial: Game of Life Language guide: Mojo Manual API docs: Standard Library
Read about learning Mojo with AI Agent skills.