1.1 The Different Types of Data
1.2 Introducing the Python Programming Language
1.3 Representing Data in Python
1.4 Storing Data in Variables
1.5 Building Up Data with Comprehensions
1.6 Application: Representing Colour
2.1 Python’s Built-In Functions
2.2 Defining Our Own Functions
2.3 Local Variables and Function Scope
2.4 Importing Modules
2.5 The Function Design Recipe
2.6 Testing Functions I: doctest and pytest
2.7 Type Conversion Functions
2.8 Application: Representing Text
3.1 Propositional Logic
3.2 Predicate Logic
3.3 Filtering Collections
3.4 Conditional Execution
3.5 Simplifying If Statements
3.6 if __name__ == '__main__'
3.7 Function Specification
3.8 Richer Type Annotations
3.9 Working With Definitions
3.10 Testing Functions II: hypothesis
3.11 Working with Multiple Quantifiers
4.1 Tabular Data
4.2 Defining Our Own Data Types, Part 1
4.3 Defining Our Own Data Types, Part 2
4.4 Repeated Execution: Loops
4.5 For Loop Variations
4.6 Index-Based For loops
4.7 Nested For Loops
5.1 Variable Reassignment and Object Mutation
5.2 Operations on Mutable Data Types
5.3 The Full Python Memory Model: Introduction
5.4 Aliasing and “Mutation at a Distance”
5.5 The Full Python Memory Model: Function Calls
5.6 Testing Functions III: Testing Mutation
6.1 An Introduction to Number Theory
6.2 Proofs with Number Theory
6.3 Proofs and Algorithms I: Primality Testing
6.4 Proof by Cases and Disproofs
6.5 Greatest Common Divisor
6.6 Proofs and Algorithms II: Computing the Greatest Common Divisor
6.7 Modular Arithmetic
7.1 Introduction to Cryptography
7.2 The One-Time Pad and Perfect Secrecy
7.3 Computing Shared Secret Keys
7.4 The RSA Cryptosystem
7.5 Implementing RSA in Python
7.6 Application: Securing Online Communications
8.1 An Introduction to Running Time
8.2 Comparing Asymptotic Function Growth with Big-O
8.3 Big-O, Omega, Theta
8.4 Analyzing Algorithm Running Time
8.5 Analyzing Comprehensions and While Loops
8.6 Analyzing Built-In Data Type Operations
8.7 Worst-Case Running Time Analysis
8.8 Testing Functions IV: Efficiency
9.1 An Introduction to Abstraction
9.2 Defining Our Own Data Types, Part 3
9.3 Data Types, Abstract and Concrete
9.4 Stacks
9.5 Exceptions as a Part of the Public Interface
9.6 Queues
9.7 Priority Queues
9.8 Defining a Shared Public Interface with Inheritance
9.9 The object Superclass
10.1 The Problem Domain: Food Delivery Networks
10.2 Object-Oriented Modelling of Our Problem Domain
10.3 A “Manager” Class
10.4 Food Delivery Events
10.5 Creating a Discrete-Event Simulation
A.1 Python Built-In Function Reference
A.2 Python Built-In Data Types Reference
A.3 Python Special Method Reference
A.4 Python Exceptions Reference
A.5 Python Syntax Diagrams
B.1 doctest
B.2 pytest
B.3 python-ta
B.4 typing
B.5 pdb
C.1 Summations and Products
C.2 Inequalities

These notes draw heavily from existing videos from CSC108 Introduction to Computer Programming (made by Jen Campbell and Paul Gries), course notes from CSC148 Introduction to Computer Science (co-authored by Diane Horton and David Liu) and CSC165 Mathematical Expression and Reasoning for Computer Science (co-authored by Toniann Pitassi and David Liu). We have linked to related CSC108 videos throughout the sections in these notes.
We were also assisted by a team of undergraduate students: Shannon Komguem, Oleksandr Kozin, Callum Cassidy-Nolan, Amy Peng, and Evan Kanter.
Cover artwork by Clémence Koh.
If you encounter any typos or errors in these notes, please let us know by email at csc110-2020-09@cs.toronto.edu.