Skip to main content

Practice 10 — Intro to Python

Skills: 8​

Introduction to Python​

We've learned the basics in Pyret—expressions, functions, and data. Today, we will transition to Python, which uses different notation but similar concepts.

Function Definitions and Types​

Basic Function Translation​

Pyret Version:

fun celsius-to-fahrenheit(temp :: Number) -> Number:
doc: "convert Celsius temperature to Fahrenheit"
(temp * 9/5) + 32
end

Python Version:

def celsius_to_fahrenheit(temp: float) -> float:
"""convert Celsius temperature to Fahrenheit"""
return (temp * 9/5) + 32

Key Differences:

  • def vs fun
  • Underscores vs hyphens in names
  • Colons for type annotations
  • Explicit return statement required
  • Triple quotes for documentation
  • Indentation instead of end

What happens if you forget the return statement in Python?

Practice​

Convert this Pyret function to Python:

fun calculate-tip(bill :: Number, percentage :: Number) -> Number:
doc: "calculate tip amount for a restaurant bill"
bill * (percentage / 100)
end

Conditionals in Python​

If-Else Translation​

Pyret Version:

fun letter-grade(score :: Number) -> String:
doc: "convert numeric score to letter grade"
if score >= 90:
"A"
else if score >= 80:
"B"
else if score >= 70:
"C"
else if score >= 60:
"D"
else:
"F"
end
end

Python Version:

def letter_grade(score: float) -> str:
"""convert numeric score to letter grade"""
if score >= 90:
return "A"
elif score >= 80:
return "B"
elif score >= 70:
return "C"
elif score >= 60:
return "D"
else:
return "F"

Key Differences:

  • elif instead of else if
  • Each branch needs its own return
  • Indentation determines code blocks

Practice​

Write a Python function for shipping cost:

  • Orders under $25: $5 shipping
  • Orders $25-$75: $3 shipping
  • Orders over $75: free shipping

Python Lists vs Pyret Lists​

Creating and Basic Operations​

Pyret vs Python Comparison:

Pyret:

my-list = [list: "red", "green", "blue", "yellow"]
first-color = my-list.first
rest-colors = my-list.rest
list-size = length(my-list)

Python:

my_list = ["red", "green", "blue", "yellow"]
first_color = my_list[0]
rest_colors = my_list[1:]
list_size = len(my_list)

Point out indexing differences (0-based vs first/rest) and built-in len() function.

Filter and Map Operations​

Pyret Version:

import lists as L

numbers = [list: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
evens = L.filter(lam(n): num-modulo(n, 2) == 0 end, numbers)
squares = L.map(lam(n): n * n end, numbers)

Python Version:

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
evens = list(filter(lambda n: n % 2 == 0, numbers))
squares = list(map(lambda n: n * n, numbers))

Key Differences:

  • Square brackets vs [list: ...]
  • lambda instead of lam
  • Must wrap filter and map with list() in Python

Testing in Python​

Pyret where vs Python pytest​

Pyret Testing:

fun double(n :: Number) -> Number:
doc: "double the input number"
n * 2
where:
double(5) is 10
double(0) is 0
double(-3) is -6
end

Python Testing:

import pytest

def double(n: float) -> float:
"""double the input number"""
return n * 2

def test_double():
assert double(5) == 10
assert double(0) == 0
assert double(-3) == -6

# For floating-point comparisons:
def test_double_approx():
assert double(3.3) == pytest.approx(6.6)

Need to run the file with pytest; running with python alone won't run tests.

Key Differences:

  • Separate test functions instead of where blocks
  • assert statements for testing

Practice​

Write tests for your shipping cost function.

For Loops and List Processing​

Pyret (for each):

fun sum-numbers(numbers :: List<Number>) -> Number:
doc: "sum all numbers in a list"
var total = 0
for each(n from numbers):
total := total + n
end
total
end

Python:

def sum_numbers(numbers: list) -> float:
"""sum all numbers in a list"""
total = 0
for n in numbers:
total = total + n
return total

Key Differences:

  • No var keyword needed
  • Regular assignment = instead of :=
  • Simpler for loop syntax

Wrap-Up​

  • What are the main syntax differences between Pyret and Python?
  • When might you choose one language over the other?