From fd531e607d9cf0465fa5125c6cb82b51ccc1faa7 Mon Sep 17 00:00:00 2001 From: Chris Lo Date: Wed, 7 Aug 2024 13:45:29 -0700 Subject: [PATCH] w1 --- 01-intro-to-computing.Rmd | 143 ++++++++++++++++++++++++++++++++++-- images/function_machine.png | Bin 0 -> 21758 bytes 2 files changed, 135 insertions(+), 8 deletions(-) create mode 100644 images/function_machine.png diff --git a/01-intro-to-computing.Rmd b/01-intro-to-computing.Rmd index 3c0bfab..f888d1a 100644 --- a/01-intro-to-computing.Rmd +++ b/01-intro-to-computing.Rmd @@ -30,9 +30,7 @@ More importantly: **How we organize ideas \<-\> Instructing a computer to do som ## A programming language has following elements: {#a-programming-language-has-following-elements} -- Grammar structure to construct expressions - -- Combining expressions to create more complex expressions +- Grammar structure to construct expressions; combining expressions to create more complex expressions - Encapsulate complex expressions via **functions** to create modular and reusable tasks @@ -50,7 +48,7 @@ Today, we will pay close attention to: - Notebook: in the central panel of the website, you will see Python code interspersed with word document text. This is called a Python Notebook (other similar services include Jupyter Notebook, iPython Notebook), which has chunks of plain text *and* Python code, and it helps us understand better the code we are writing. -- Variable Enviornment: Open it by clicking on the "{x}" button on the left-hand panel. Often, your code will store information in the Variable Environment, so that information can be reused. For instance, we often load in data and store it in the Variable Environment, and use it throughout rest of your Python code. +- Variable Environment: Open it by clicking on the "{x}" button on the left-hand panel. Often, your code will store information in the Variable Environment, so that information can be reused. For instance, we often load in data and store it in the Variable Environment, and use it throughout rest of your Python code. The first thing we will do is see the different ways we can run Python code. You can do the following: @@ -68,9 +66,7 @@ Python Notebook is great for data science work, because: - It encourages excellent documentation, as you can have code, output from code, and prose combined together. -- It is flexible to other programming languages, such as R. - -### +- It is flexible to use other programming languages, such as R. Now, we will get to the basics of programming grammar. @@ -78,7 +74,7 @@ Now, we will get to the basics of programming grammar. - **Expressions** are be built out of **operations** or **functions**. -- Operations and functions take in **data types**, do something with them, and return another data type. +- Functions and operations take in **data types**, do something with them, and return another data type. - We can combine multiple expressions together to form more complex expressions: an expression can have other expressions nested inside it. @@ -91,3 +87,134 @@ max(18 + 21, 65) 18 + (21 + 65) len("ATCG") ``` + +Here, our input **data types** to the operation are **integer** in lines 1-4 and our input data type to the function is **string** in line 5. We will go over common data types shortly. + +Operations are just functions in hiding. We could have written: + +```{python} +from operator import add + +add(18, 21) +add(18, add(21, 65)) +``` + +Remember that the Python language is supposed to help us understand what we are writing in code easily, lending to *readable* code. Therefore, it is sometimes useful to come up with operations that is easier to read. (Because the `add()` function isn't typically used, it is not automatically available, so we used the import statement to load it in.) + +### Data types + +Here are some common data types we will be using in this course. + +| Data type name | **Data type shorthand** | **Examples** | +|----------------|:-----------------------:|:-----------------------:| +| Integer | int | 2, 4 | +| Float | float | 3.5, -34.1009 | +| String | str | "hello", "234-234-8594" | +| Boolean | bool | True, False | + +A nice way to summarize this first grammar structure is using the function machine schema, way back from algebra class: + +![Function machine from algebra class.](images/function_machine.png) + +Here are some aspects of this schema to pay attention to: + +- A programmer should not need to know how the function is implemented in order to use it - this emphasizes abstraction and modular thinking, a foundation in any programming language. + +- A function can have different kinds of inputs and outputs - it doesn't need to be numbers. In the `len()` function, the input is a String, and the output is an Integer. We will see increasingly complex functions with all sorts of different inputs and outputs. + +## Grammar Structure 2: Storing data types in the Variable Environment + +To build up a computer program, we need to store our returned data type from our expression somewhere for downstream use. We can assign a variable to it as follows: + +```{python} +x = 18 + 21 +``` + +If you enter this in the Console, you will see that in the Variable Environment, the variable `x` has a value of `39`. + +### Execution rule for variable assignment + +> Evaluate the expression to the right of `=`. +> +> Bind variable to the left of `=` to the resulting value. +> +> The variable is stored in the Variable Environment. + +The Variable Environment is where all the variables are stored, and can be used for an expression anytime once it is defined. Only one unique variable name can be defined. + +The variable is stored in the working memory of your computer, Random Access Memory (RAM). This is temporary memory storage on the computer that can be accessed quickly. Typically a personal computer has 8, 16, 32 Gigabytes of RAM. When we work with large datasets, if you assign a variable to a data type larger than the available RAM, it will not work. More on this later. + +Look, now `x` can be reused downstream: + +```{python} +x - 2 +y = x * 2 +``` + +It is quite common for programmers to not know what data type a variable is while they are coding. To learn about the data type of a variable, use the `type()` function on any variable in Python: + +```{python} +type(y) +``` + +We should give useful variable names so that we know what to expect! Consider `num_sales` instead of `y`. + +## Grammar Structure 3: Evaluation of Functions + +Let's look at functions a little bit more formally: A function has a **function name**, **arguments**, and **returns** a data type. + +### Execution rule for functions: + +> Evaluate the function by its arguments, and if the arguments are functions or contains operations, evaluate those functions or operations first. +> +> The output of functions is called the **returned value**. + +Often, we will use multiple functions, in a nested way, or use parenthesis to change the order of operation. Being able to read nested operations, nested functions, and parenthesis is very important. Think about what the Python is going to do step-by--step in the line of code below: + +```{python} +(len("hello") + 4) * 2 +``` + +If we don't know how to use a function, such as `pow()` we can ask for help: + +```{python} +?pow +``` + +This shows the function takes in three input arguments: `base`, `exp`, and `mod=None`. When an argument has an assigned value of `mod=None`, that means the input argument already has a value, and you don't need to specify anything, unless you want to. + +The following ways are equivalent ways of using the `pow()` function: + +```{python} +pow(2, 3) +pow(base=2, exp=3) +pow(exp=3, base=2) +``` + +but this will give you something different: + +```{python} +pow(3, 2) +``` + +And there is an operational equivalent: + +```{python} +2 ** 3 +``` + +## Tips on writing your first code + +`Computer = powerful + stupid` + +Even the smallest spelling and formatting changes will cause unexpected output and errors! + +- Write incrementally, test often + +- Check your assumptions, especially using new functions, operations, and new data types. + +- Live environments are great for testing, but not great for reproducibility. + +- Ask for help! + +To get more familiar with the errors Python gives you, take a look at this [summary of Python error messages](https://betterstack.com/community/guides/scaling-python/python-errors/). diff --git a/images/function_machine.png b/images/function_machine.png new file mode 100644 index 0000000000000000000000000000000000000000..2bb7d9fe2d3c07a0fb0a1766683bc60367e5b816 GIT binary patch literal 21758 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 literal 0 HcmV?d00001