CS50 - Lec 1 Notes
CS50 - Lec 1 Notes
Functions are verbs or actions that the computer or computer language will already
know how to perform.
In your hello.py program, the print function knows how to print to the terminal
window.
The print function takes arguments. In this case, "hello, world" are the arguments that
the print function takes.
Bugs
Bugs are a natural part of coding. These are mistakes, problems for you to solve!
Don’t get discouraged! This is part of the process of becoming a great programmer.
Imagine in our hello.py program that accidentally typed print("hello, world" notice that
we missed the final ) required by the compiler. If I purposefully make this mistake,
you’ll the compiler will output an error in the terminal window!
Often, the error messages will inform you of your mistake and provide you clues on
how to fix them. However, there will be many times that the compiler is not this kind.
Improving Your First Python Program
We can personalize your first Python program.
In our text editor in hello.py we can add another function. input is a function that takes
a prompt as an argument. We can edit our code to say
input("What's your name? ")
print("hello, world")
This edit alone, however, will not allow your program to output what your user
inputs. For that, we will need to introduce you to variables
Variables
Notice that this equal = sign in the middle of name = input("What's your name? ") has a
special role in programming. This equal sign literally assigns what is on the right to
what is on the left. Therefore, the value returned by input("What's your name? ") is
assigned to name.
Comments are a way for programmers to track what they are doing in their programs
and even inform others about their intentions for a block of code. In short, they are
notes for yourself and others that will see your code!
You can add comments to your program to be able to see what it is that your program
is doing. You might edit your code as follows:
# Ask the user for their name
name = input("What's your name? ")
print("hello,")
print(name)
Comments can also serve as to-do list for you.
Pseudocode
Pseudocode is an important type of comment that becomes a special type of to-do list,
especially when you don’t understand how to accomplish a coding task. For example,
in your code, you might edit your code to say:
# Ask the user for their name
name = input("What's your name? ")
# Print hello
print("hello,")
# Print the name inputted
print(name)
Further Improving Your First Python Program
We can further edit our code as follows:
# Ask the user for their name
name = input("What's your name? ")
# Print hello and the inputted name
print("hello, " + name)
It turns out that some functions take many arguments.
We can use a comma , to pass in multiple arguments by editing our code as follows:
# Ask the user for their name
name = input("What's your name? ")
# Print hello and the inputted name
print("hello,", name)
The output in the terminal, if we typed “David” we would be hello, David. Success.
Strings and Paremeters
A string, known as a str in Python, is a sequence of text.
Rewinding a bit in our code back to the following, there was a visual side effect of
having the result appear on multiple lines:
# Ask the user for their name
name = input("What's your name? ")
print("hello,")
print(name)
Functions take arguments that influence their behavior. If we look at the
documentation for print you’ll notice we can learn a lot about the arguments that the
print function takes.
Looking at this documentation, you’ll learn that the print function automatically
include a piece of code end='\n'. This \n indicates that the print function will automatically
create a line break when run. The print function takes an argument called end` and the default
is to create a new line.
However, we can technically provide an argument for end ourselves such that a new
line is not created!
We can modify our code as follows:
# Ask the user for their name
name = input("What's your name? ")
print("hello,", end="")
print(name)
By providing end="" we are over-writing the default value of end such that it never
creates a new line after this first print statement. Providing the name as “David”, the
output in the terminal window will be hello, David.
Notice the f in print(f"hello, {name}"). This f is a special indicator to Python to treat this
string a special way, different than previous approaches we have illustrated in this
lecture. Expect that you will be using this style of strings quite frequently in this
course.
More on Strings
You should never expect your user will cooperate as intended. Therefore, you will
need to ensure that the input of your user is corrected or checked.
It turns out that built into strings is the ability to remove whitespace from a string.
By utilizing the method strip on name as name = name.strip(), it will strip all the
whitespaces on the left and right of the users input. You can modify your code to be:
# Ask the user for their name
name = input("What's your name? ")
# Remove whitespace from the str
name = name.strip()
# Print the output
print(f"hello, {name}")
Rerunning this program, regardless of how many spaces you type before or after the
name, it will strip off all the whitespace.
Using the title method, it would title case the user’s name:
# Ask the user for their name
name = input("What's your name? ")
# Remove whitespace from the str
name = name.strip()
# Capitalize the first letter of each word
name = name.title()
# Print the output
print(f"hello, {name}")
By this point, you might be very tired of typing python repeatedly in the terminal
window. You cause us the up arrow of your keyboard to recall the most recent
terminal commands you have made.
Notice that you can modify your code to be more efficient:
# Ask the user for their name
name = input("What's your name? ")
# Remove whitespace from the str and capitalize the first letter of each word
name = name.strip().title()
# Print the output
print(f"hello, {name}")
Naturally, when we run python calculator.py we get the result in the terminal window
of 3. We can make this more interactive using the input function.
x = input("What's x? ")
y = input("What's y? ")
z=x+y
print(z)
Running this program, we discover that the output is incorrect as 12. Why might this
be?
Prior, we have seen how the + sign concatenates two strings. Because your input from
your keyboard on your computer comes into the compiler as text, it is treated a string.
We, therefore, need to convert this input from a string to an integer. We can do so as
follows:
x = input("What's x? ")
y = input("What's y? ")
z = int(x) + int(y)
print(z)
The result is now correct. The use of int(x), is called “casting” where a value is
temporarily changed from one type of variable (in this case a string) to another (here,
an integer).
This illustrates that you can run functions on functions. The most inner function is run
first, and then the outer one is run. First, the input function is run. Then,
the int function.
This change allows your user to enter 1.2 and 3.4 to present a total of 4.6.
Let’s imagine, however, that you want to round the total to the nearest integer.
Looking at the Python documentation for round you’ll see that the available arguments
are round(number[n, ndigits]). Those square brackets indicate that something optional
can be specified by the programmer. Therefore, you could do round(n) to round a digit
to its nearest integer. Alternatively, you could code as follows:
# Get the user's input
x = float(input("What's x? "))
y = float(input("What's y? "))
# Create a rounded result
z = round(x + y)
# Print the result
print(z)
What if we wanted to format the output of long numbers? For example, rather than
seeing 1000, you may wish to see 1,000. You could modify your code as follows:
# Get the user's input
x = float(input("What's x? "))
y = float(input("What's y? "))
# Create a rounded result
z = round(x + y)
# Print the formatted result
print(f"{z:,}")
Though quite cryptic, that print(f"{z:,}") creates a scenario where the outputted z will
include commas where the result could look like 1,000 or 2,500.
More on Floats
How can we round floating point values? First, modify your code as follows:
# Get the user's input
x = float(input("What's x? "))
y = float(input("What's y? "))
# Calculate the result
z=x/y
# Print the result
print(z)
Let’s imagine that we want to round this down, we could modify our code as follows:
# Get the user's input
x = float(input("What's x? "))
y = float(input("What's y? "))
# Calculate the result and round
z = round(x / y, 2)
# Print the result
print(z)
As we might expect, this will round the result to the nearest two decimal points.
This cryptic fstring code displays the same as our prior rounding strategy.
We can better our code to create our own special function that says “hello” for us!
Erasing all our code in our text editor, let’s start from scratch:
name = input("What's your name? ")
hello()
print(name)
Attempting to run this code, your compiler will throw an error. After all, there is no
defined function for hello.
Notice that everything under def hello() is indented. Python is an indented language. It
uses indentation to understand what is part of the above function. Therefore,
everything in the hello function must be indented. When something is not indented, it
treats it as if it is not inside the hello function. Running python hello.py in the terminal
window, you’ll see that your output is not exactly as you may want.
Here, in the first lines, you are creating your hello function. This time, however, you
are telling the compiler that this function takes a single parameter: a variable called to.
Therefore, when you call hello(name) the computer passes name into the hello function
as to. This is how we pass values into functions. Very useful! Running python
hello.py in the terminal window, you’ll see that the output is much closer to our ideal
presented earlier in this lecture.
Test out your code yourself. Notice how the first hello will behave as you might
expect and the second hello, which is not passed a value, will by default output hello,
world.
We don’t have to have our function at the start of our program. We can move it down,
but we need to tell the compiler that we have a main function and we have a
separate hello function.
def main():
# Output using our own function
name = input("What's your name? ")
hello(name)
# Output without passing the expected arguments
hello()
# Create our own function
def hello(to="world"):
print("hello,", to)
This alone, however, will create an error of sorts. If we run python hello.py nothing
happens! The reason for this is that nothing in this code is actually calling
the main function and bringing our program to life.
The following very small modification will call the main function and restore our
program to working order:
def main():
# Output using our own function
name = input("What's your name? ")
hello(name)
# Output without passing the expected arguments
hello()
# Create our own function
def hello(to="world"):
print("hello,", to)
main()
Returning Values
You can imagine many scenarios where you don’t just want a function to perform an
action, but also to return a value back to the main function. For example, rather than
simply printing the calculation of x + y, you may want a function to return the value of
this calculation back to another part of your program. This “passing back” of a value
we call a return value.
Returning to our calculator.py code by typing code calculator.py. Erase all code there.
Rework the code as follows:
def main():
x = int(input("What's x? "))
print("x squared is", square(x))
def square(n):
return n * n
main()