SICP taught in Python 3
http://www-inst.eecs.berkeley.edu/~cs61a/sp12/book/index.html
Chapter 1: Building Abstractions with Functions
-
- 1.1 Introduction
- 1.2 The Elements of Programming
- 1.2.1 Expressions
- 1.2.2 Call Expressions
- 1.2.3 Importing Library Functions
- 1.2.4 Names and the Environment
- 1.2.5 Evaluating Nested Expressions
- 1.2.6 Function Diagrams
- 1.3 Defining New Functions
- 1.3.1 Environments
- 1.3.2 Calling User-Defined Functions
- 1.3.3 Example: Calling a User-Defined Function
- 1.3.4 Local Names
- 1.3.5 Practical Guidance: Choosing Names
- 1.3.6 Functions as Abstractions
- 1.3.7 Operators
- 1.4 Practical Guidance: The Art of the Function
- 1.4.1 Docstrings
- 1.4.2 Default Argument Values
- 1.5 Control
- 1.5.1 Statements
- 1.5.2 Compound Statements
- 1.5.3 Defining Functions II: Local Assignment
- 1.5.4 Conditional Statements
- 1.5.5 Iteration
- 1.5.6 Practical Guidance: Testing
- 1.6 Higher-Order Functions
- 1.6.1 Functions as Arguments
- 1.6.2 Functions as General Methods
- 1.6.3 Defining Functions III: Nested Definitions
- 1.6.4 Functions as Returned Values
- 1.6.5 Lambda Expressions
- 1.6.6 Example: Newton's Method
- 1.6.7 Abstractions and First-Class Functions
- 1.6.8 Function Decorators
Chapter 2: Building Abstractions with Objects
-
- 2.1 Introduction
- 2.1.1 The Object Metaphor
- 2.1.2 Native Data Types
- 2.2 Data Abstraction
- 2.2.1 Example: Arithmetic on Rational Numbers
- 2.2.2 Tuples
- 2.2.3 Abstraction Barriers
- 2.2.4 The Properties of Data
- 2.3 Sequences
- 2.3.1 Nested Pairs
- 2.3.2 Recursive Lists
- 2.3.3 Tuples II
- 2.3.4 Sequence Iteration
- 2.3.5 Sequence Abstraction
- 2.3.6 Strings
- 2.3.7 Conventional Interfaces
- 2.4 Mutable Data
- 2.4.1 Local State
- 2.4.2 The Benefits of Non-Local Assignment
- 2.4.3 The Cost of Non-Local Assignment
- 2.4.4 Lists
- 2.4.5 Dictionaries
- 2.4.6 Example: Propagating Constraints
- 2.5 Object-Oriented Programming
- 2.5.1 Objects and Classes
- 2.5.2 Defining Classes
- 2.5.3 Message Passing and Dot Expressions
- 2.5.4 Class Attributes
- 2.5.5 Inheritance
- 2.5.6 Using Inheritance
- 2.5.7 Multiple Inheritance
- 2.5.8 The Role of Objects
- 2.6 Implementing Classes and Objects
- 2.6.1 Instances
- 2.6.2 Classes
- 2.6.3 Using Implemented Objects
- 2.7 Generic Operations
- 2.7.1 String Conversion
- 2.7.2 Multiple Representations
- 2.7.3 Generic Functions
- 2.1 Introduction
Chapter 3: The Structure and Interpretation of Computer Programs
-
- 3.1 Introduction
- 3.1.1 Programming Languages
- 3.2 Functions and the Processes They Generate
- 3.2.1 Recursive Functions
- 3.2.2 The Anatomy of Recursive Functions
- 3.2.3 Tree Recursion
- 3.2.4 Example: Counting Change
- 3.2.5 Orders of Growth
- 3.2.6 Example: Exponentiation
- 3.3 Recursive Data Structures
- 3.3.1 Processing Recursive Lists
- 3.3.2 Hierarchical Structures
- 3.3.3 Sets
- 3.4 Exceptions
- 3.4.1 Exception Objects
- 3.5 Interpreters for Languages with Combination
- 3.5.1 Calculator
- 3.5.2 Parsing
- 3.6 Interpreters for Languages with Abstraction
- 3.6.1 The Logo Language
- 3.6.2 Structure
- 3.6.3 Environments
- 3.6.4 Data as Programs
- 3.1 Introduction
Chapter 4: Distributed and Parallel Computing
-
- 4.1 Introduction
- 4.2 Distributed Computing
- 4.2.1 Client/Server Systems
- 4.2.2 Peer-to-peer Systems
- 4.2.3 Modularity
- 4.2.4 Message Passing
- 4.2.5 Messages on the World Wide Web
- 4.3 Parallel Computing
- 4.3.1 The Problem with Shared State
- 4.3.2 Correctness in Parallel Computation
- 4.3.3 Protecting Shared State: Locks and Semaphores
- 4.3.4 Staying Synchronized: Condition variables
- 4.3.5 Deadlock