The first step in learning how to program is to understand the basic Python data types: integers (whole numbers), floating point numbers (numbers with a decimal point), and strings. All programs use these (and other) data types, so it is important to have a good grasp of their basic uses.
Strings, in particular, are used in so many different kinds of programs that Python provides a tremendous amount of support for them. In this chapter, we’ll just introduce the bare basics of strings, and then we’ll return to them in a later chapter.
We’ll also introduce the important concept of a programming variable. Variables are used to store and manipulate data, and it’s hard to write a useful program without employing at least a few of them.
Just like learning how to play the piano or speak a foreign language, the best way to learn how to program is to practice. Thus, we’ll introduce all of this using the interactive command shell IDLE, and ideally you should follow along on your own computer by typing the examples as we go.
Let’s see how to interact with the Python shell. Start IDLE; you should find it listed as a program in your Start menu on Windows. On Mac or Linux you should be able to run it directly from a command line by typing python. The window that pops up is the Python interactive command shell, and it looks something like what’s shown in Figure 2.1.
Example 2.1. What you should see when you first launch the Python interactive command shell. The top two lines tell you what version of Python you are running. The version you see here is Python 3.0b1, and it was created a little before 3 p.m. on Thursday, June 19, 2008 (not that the creation date matters to us!).
Python 3.0b1 (r30b1:64403M, Jun 19 2008, 14:56:09) [MSC v.1500 32 bit (Intel)] on win32 Type "copyright", "credits" or "license()" for more information. **************************************************************** Personal firewall software may warn about the connection IDLE makes to its subprocess using this computer's internal loopback interface. This connection is not visible on any external interface and no data is sent to or received from the Internet. **************************************************************** IDLE 3.0b1 >>>
In a Python transcript, >>>
is the Python shell prompt. A >>>
marks a line of input from you, the user, while lines without a >>>
are generated by Python. Thus it is easy to distinguish at a glance what is from Python and what is from you.
An integer is a whole number, such as 25, −86, or 0. Python supports the four basic arithmetic operations: +
(addition), −
(subtraction), *
(multiplication), and / (division). Python also uses **
for exponentiation and %
to calculate remainders (for example, 25 % 7
is 4 because 7 goes into 25 three times, with 4 left over). For example:
>>> 5 + 9 14 >>> 22 - 6 16 >>> 12 * 14 168 >>> 22 / 7 3.1428571428571428 >>> 2 ** 4 16 >>> 25 % 7 4 >>> 1 + 2 * 3 7 >>> (1 + 2) * 3 9
Python also has an integer division operator, //
. It works like /
, except that it always returns an integer. For example, 7 // 3
evaluates to the integer 2; the digits after the decimal are simply chopped off (//
does no rounding!).
Table 2.1 summarizes Python’s basic arithmetic operators. They are grouped from lowest precedence to highest precedence. For example, when Python evaluates the expression 1 + 2 * 3
, it does *
before +
because *
has higher precedence (so it evaluates to 7—not 9!). Operators at the same level of precedence are evaluated in the order they are written. You can use round brackets, ()
, to change the order of evaluation—so, for example, (1 + 2) * 3
evaluates to 9. In other words, Python arithmetic follows the same evaluation rules as regular arithmetic.
Unlike most other programming languages, Python puts no limit on the size of an integer. You can do calculations involving numbers with dozens (or hundreds, or thousands) of digits:
>>> 27 ** 100 1368914790585883759913260273820883159664 6369562533743647148019007836899717749907 6593800206155688941388250484440597994042 813512732765695774566001
Floating point arithmetic is done with floating point numbers, which in Python are numbers that contain a decimal point. For instance, −3.1, 2.999, and −4.0 are floating point numbers. We’ll call them floats for short.
All the basic arithmetic operations that work with integers also work with floats, even %
(remainder) and //
(integer division). See Figure 2.2 for some examples.
Example 2.2. Examples of basic floating point arithmetic using the Python command shell. Notice that approximation errors are quite common, so exact values are rarely printed.
>>> 3.8 + -43.2 -39.400000000000006 >>> 12.6 * 0.5 6.2999999999999998 >>> 12.6 + 0.01 12.609999999999999 >>> 365.0 / 12 30.416666666666668 >>> 8.8 ** -5.4 7.939507629591553e-06 >>> 5.6 // 1.2 4.0 >>> 5.6 % 3.2 2.3999999999999995
Very large or small floats are often written in scientific notation:
>>> 8.8 ** -5.4 7.939507629591553e-06
The e-06
means to multiply the preceding number by 10−6. You can use scientific notation directly if you like:
>>> 2.3e02 230.0
Python is quite forgiving about the use of decimal points:
>>> 3. 3.0 >>> 3.0 3.0
You can write numbers like 0.5 with or without the leading 0:
>>> .5 0.5 >>> 0.5 0.5
Unlike integers, floating point numbers have minimum and maximum values that, if exceeded, will cause overflow errors. An overflow error means you’ve tried to calculate a number that Python cannot represent as a float, because it is either too big or too small (Figure 2.3). Overflow errors can be silent errors, meaning that Python may just do the calculation incorrectly without telling you that anything bad has happened. Generally speaking, it is up to you, the programmer, to avoid overflow errors.
Precision (that is, accuracy) is a fundamental difficulty with floats on all computers. Numbers are represented in binary (base 2) in a computer, and it turns out that not all floating point numbers can be represented precisely in binary. Even the simplest examples can have problems:
>>> 1 / 3 0.33333333333333331
This should have an infinite number of 3s after the decimal, but there are only (!) 17 digits here. Plus, the last digit is wrong (the 1 should be a 3).
These small errors are not usually a problem: 17 digits after the decimal is enough for most programs. However, little errors have a nasty habit of becoming big errors when you are doing lots of calculations. If you are, say, computing the stresses on a newly designed bridge, it is necessary to take these floating point approximations into account to ensure that they don’t balloon into significant errors.
Python has built-in support for complex numbers—that is, numbers that involve the square root of −1. In Python, 1j
denotes the square root of −1:
>>> 1j 1j >>> 1j * 1j (-1+0j)
Complex numbers are useful in certain engineering and scientific calculations; we won’t be using them again in this book.
Python comes with many different modules of prewritten code, including the math
module. Table 2.2 lists some of the most commonly used math
module functions.
Table 2.2. Some math Module Functions
NAME | DESCRIPTION |
---|---|
ceil(x) | Ceiling of x |
cos(x) | Cosine of x |
degrees(x) | Converts x from radians to degrees |
exp(x) | e to the power of x |
factorial(n) | Calculates n! = 1*2*3*...*n n must be an integer |
log(x) | Base e logarithm of x |
log(x, b) | Base b logarithm of x |
pow(x, y) | x to the power of y |
radians(x | Converts x from degrees to radians |
sin(x) | Sine of x |
sqrt(x) | Square root of x |
tan(x) | Tangent of x |
We say that these functions return a value. That means they evaluate to either an integer or a floating point number, depending on the function.
You can use these functions anywhere that you can use a number. Python automatically evaluates the function and replaces it with its return value.
To use the math
module, or any existing Python module, you must first import it:
>>> import math
You can now access any math function by putting math.
in front of it:
>>> math.sqrt(5) 2.2360679774997898 >>> math.sqrt(2) * math.tan(22) 0.012518132023611912
An alternative way of importing a module is this:
>>> from math import *
Now you can call all the math module functions without first appending math.
:
>>> log(25 + 5) 3.4011973816621555 >>> sqrt(4) * sqrt(10 * 10) 20.0
When using the from math import *
style of importing, if you have functions with the same name as any of the functions in the math
module, the math
functions will overwrite them!
Thus, it’s generally safer to use the import math
style of importing. This will never overwrite existing functions.
You can also import specific functions from the math
module. For example, from math import sqrt, tan
imports just the sqrt
and tan
functions.
A string is a sequence of one or more characters, such as "cat!"
, "567-45442"
, and "Up and Down"
. Characters include letters, numbers, punctuation, plus hundreds of other special symbols and unprintable characters.
Python lets you indicate string literals in three main ways:
Single quotes, such as 'http'
, 'open house'
, or 'cat'
Double quotes, such as "http"
, "open house"
, or "cat"
Triple quotes, such as """http"""
, or multiline strings, such as
""" Me and my monkey Have something to hide """
Many Python programmers prefer using single quotes to indicate strings, simply because they involve less typing than double quotes (which require pressing the Shift key).
One of the main uses of single and double quotes is to conveniently handle "
and '
characters inside strings:
"It's great" 'She said "Yes!"'
You’ll get an error if you use the wrong kind of quote within a string.
Triple quotes are useful when you need to create long, multiline strings. They can also contain "
and '
characters at the same time.
To determine the number of characters in a string, use the len(s)
function:
>>> len('pear') 4 >>> len('up, up, and away') 16 >>> len("moose") 5 >>> len("") 0
The last example uses the empty string, usually denoted by ''
or ""
. The empty string has zero characters in it.
Since len
evaluates to (that is, returns) an integer, we can use len
anywhere that an integer is allowed—for example:
>>> 5 + len('cat') * len('dog') 14
You can create new strings by “adding” together old strings:
>>> 'hot ' + 'dog' 'hot dog' >>> 'Once' + " " + 'Upon' + ' ' + "a Time" 'Once Upon a Time'
This operation is known as concatenation.
There’s a neat shortcut for concatenating the same string many times:
>>> 10 * 'ha' 'hahahahahahahahahaha' >>> 'hee' * 3 'heeheehee' >>> 3 * 'hee' + 2 * "!" 'heeheehee!!'
The result of string concatenation is always another string, so you can use concatenation anywhere that requires a string:
>>> len(12 * 'pizza pie!') 120 >>> len("house" + 'boat') * '12' '121212121212121212'
Python is a largely self-documenting language. Most functions and modules come with brief explanations to help you figure out how to use them without resorting to a book or Web site.
Once you’ve imported a module, you can list all of its functions using the dir(m)
function:
>>> import math >>> dir(math) ['__doc__', '__name__', '__package__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'exp', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'hypot', 'isinf', 'isnan', 'ldexp', 'log', 'log10', 'log1p', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'sum', 'tan', 'tanh', 'trunc']
This gives you a quick overview of the functions in a module, and many Python programmers use dir(m)
all the time.
For now, you can ignore the names beginning with a double underscore __
; they are used only in more advanced Python programming.
To see a list of all the built-in functions in Python, type dir(__builtins__)
at the command prompt.
An alternative way to see the doc string for a function f
is to use the help(f)
function.
You can run the Python help utility by typing help()
at a prompt. This will provide you with all kinds of useful information, such as a list of all available modules, help with individual functions and keywords, and more.
You can also get help from the Python documentation (www.python.org/doc/). There you’ll find helpful tutorials, plus complete details of all the Python language and standard modules.
Another useful trick is to print a function’s documentation string (doc string for short):
>>> print(math.tanh.__doc__) tanh(x) Return the hyperbolic tangent of x.
Most built-in Python functions, along with most functions in Python’s standard modules (such as math
), have short doc strings you can access in this way.
As another example, here’s the doc string for the built-in function bin
:
>>> print(bin.__doc__) bin(number) -> string Return the binary representation of an integer or long integer. >>> bin(25) '0b11001'
Converting from one type of data to another is a common task, and Python provides a number of built-in functions to make this easy.
To convert the number 3 to a float, use the float(x)
function:
>>> float(3) 3.0
Converting a string to a float is similar:
>>> float('3.2') 3.2000000000000002 >>> float('3') 3.0
The str(n)
function converts any number to a corresponding string:
>>> str(85) '85' >>> str(-9.78) '-9.78'
This is a little tricky because you must decide how to handle any digits after the decimal in your float. The int(x)
function simply chops off extra digits, while round(x)
does the usual kind of rounding off:
>>> int(8.64) 8 >>> round(8.64) 9 >>> round(8.5) 8
This is easily done with the int(s)
and float(s)
functions:
>>> int('5') 5 >>> float('5.1') 5.0999999999999996
For most applications, you should be able to handle numeric conversions using int(x)
, float(x)
, and round(x)
. However, for more specific conversions, the Python math
module has a number of functions for removing digits after decimals: math.trunc(x)
, math.ceil(x)
, and math.floor(x)
.
The int(s)
and float(s)
conversions from strings to floats/integers assume that the string s
“looks” like a Python float/integer. If not, you’ll get an error message saying the conversion could not be done.
Variables are one of the most important concepts in all of programming: In Python, variables label, or point to, a value.
For example:
>>> fruit = "cherry" >>> fruit 'cherry'
Here, fruit
is a variable name, and it points to the string value "cherry"
. Notice that variables are not surrounded by quotation marks.
The line fruit = "cherry"
is called an assignment statement. The =
(equals sign) is called the assignment operator and is used to make a variable point to a value.
When Python encounters a variable, it replaces it with the value it points to. Thus:
>>> cost = 2.99 >>> 0.1 * cost 0.29900000000000004 >>> 1.06 * cost + 5.99 9.1594000000000015
Variable names must follow a few basic rules (see Table 2.3 for some examples):
A variable name can be of any length, although the characters in it must be either letters, numbers, or the underscore character (_
). Spaces, dashes, punctuation, quotation marks, and other such characters are not allowed.
The first character of a variable name cannot be a number; it must be a letter or an underscore character.
Python is case sensitive—it distinguishes between uppercase and lowercase letters. Thus TAX
, Tax
, and tax
are three completely different variable names.
You cannot use Python keywords as variable names. For example, if
, else
, while
, def
, or
, and
, not
, in
, and is
are some of Python’s keywords (we’ll learn what these are used for later in the book). If you try to use one as a variable, you’ll get an error (Figure 2.4).
Assignment statements have three main parts: a left-hand side, an assignment operator, and a right-hand side (Figure 2.5). Assignment statements have two purposes: They define new variable names, and they make already-defined variables point to values. For instance:
>>> x = 5 >>> 2 * x + 1 11 >>> x = 99
The first assignment statement, x = 5
, does double duty: It is an initialization statement. It tells Python that x
is a variable and that it should be assigned the value 5. We can now use x
anywhere an integer can be used.
The second assignment statement, x = 99
, reassigns x
to point to a different value. It does not create x
, because x
was already created by the previous assignment statement.
If you don’t initialize a variable, Python complains with an error:
>>> 2 * y + 1
Traceback (most recent call last):
File "<pyshell#6>", line 1, in <module>
2 * y + 1
NameError: name 'y' is not defined
This error message tells you that the variable y
has not been defined, and so Python does not know what value to replace it with in the expression 2 * y + 1
.
A variable can be assigned any value, even if it comes from other variables. Consider this sequence of assignments:
>>> x = 5 >>> x 5 >>> y = 'cat' >>> y 'cat' >>> x = y >>> x 'cat' >>> y 'cat'
When Python sees an assignment statement x = expr
, it treats it like the following command: Make x
point to the value that expr
evaluates to.
Keep in mind that expr
can be any Python expression that evaluates to a value.
There’s a nice way of drawing diagrams to help understand sequences of assignments. For example, after the assignment rate = 0.04
, you can imagine that RAM looks like Figure 2.6. Then, after rate_2008 = 0.06
, we get Figure 2.7. Finally, rate = rate_2008
gives us Figure 2.8.
When a value no longer has any variable pointing to it (for example, 0.04 in Figure 2.7), Python automatically deletes it. In general, Python keeps track of all values and automatically deletes them when they are no lingered referenced by a variable. This is called garbage collection, and so Python programmers rarely need to worry about deleting values themselves.
It’s essential to understand that assignment statements don’t make a copy of the value they point to. All they do is label, and relabel, existing values. Thus, no matter how big or complex the object a variable points to, assignment statements are always exceedingly efficient.
An important feature of Python numbers and strings is that they are immutable—that is, they cannot be changed in any way, ever. Whenever it seems that you are modifying a number or string, Python is in fact making a modified copy (Figure 2.9).
Example 2.9. Whenever it appears that you are modifying a string, Python is in fact making a copy of the string. There is no way to modify a number or a string. Thus, Python stops you from doing crazy things like setting the value of 5 to be 1.
>>> s = 'apple' >>> s + 's' 'apples' >>> s 'apple' >>> 5 = 1 SyntaxError: can't assign to literal (<pyshell#3>, line 1)
Python has a convenient trick that lets you assign more than one variable at a time:
>>> x, y, z = 1, 'two', 3.0
>>> x
1
>>> y
'two'
>>> z
3.0
>>> x, y, z
(1, 'two', 3.0)
As the last statement shows, you can also display multiple values on one line by writing them as a tuple. Tuples always begin with an open round bracket ((
) and end with a closed round bracket ()
).
A useful trick you can do with multiple assignment is to swap the values of two variables:
>>> a, b = 5, 9
>>> a, b
(5, 9)
>>> a, b = b, a
>>> a, b
(9, 5)
The statement a, b = b, a
is said to assign values to a
and b
in parallel. Without using multiple assignment, the standard way to swap variables is like this:
>>> a, b = 5, 9 >>> temp = a >>> a = b >>> b = temp >>> a, b (9, 5)
Multiple assignment doesn’t do anything you can’t already do with regular assignment. It is just a convenient shorthand that we will sometimes be using.
3.144.232.71