Post on 15-Jul-2020
Lists, While & For Loops,Dictionaries & String Slicing(plus some miscellaneous)
John K. BennettIWKS 2300Fall 2019
While Loops
A while loop checks its condition before executing its code block.
After execution, the condition is tested again, etc. Code repeats while
the condition is True.
i = 1
while(i <= 10):
print(i,"Hello, World")
i = i + 1
How many time will this snippet of code print "Hello, World"?
While Loops
A while loop checks its condition before executing its code block.
After execution, the condition is tested again, etc. Code repeats while
the condition is True.
i = 1
while(i <= 10):
print(i,"Hello, World")
i = i + 1
How many time will this snippet of code print "Hello, World"?
10 times
Comparing if and while
The difference between while and if is that
● if executes its code body once if condition is True,
● While repeats its body while the condition is True.
i = 1
if i <= 10:
i = i + 1
# i is now ??
i = 1
while i <= 10:
i = i + 1
# i is now ??
Comparing if and while
The difference between while and if is that
● if executes its code body once if condition is True,
● While repeats its body while the condition is True.
i = 1
if i <= 10:
i = i + 1
# i is now ??
i = 1
while i <= 10:
i = i + 1
# i is now ??
2
Comparing if and while
The difference between while and if is that
● if executes its code body once if condition is True,
● While repeats its body while the condition is True.
i = 1
if i <= 10:
i = i + 1
# i is now ??
i = 1
while i <= 10:
i = i + 1
# i is now ??
2 11
Loop Control: Continue
A continue statement allows you to go to the next iteration.
i = 1
while (i <= 3):
i = i + 1
if (i == 2):
continue # skip to the top of the loop
print("i is not 2, it is", i)
What gets printed?
Loop Control: Continue
A continue statement allows you to go to the next iteration.
i = 1
while (i <= 3):
i = i + 1
if (i == 2):
continue # skip to the top of the loop
print("i is not 2, it is", i)
i is not 2, it is 3
i is not 2, it is 4
Loop Control: BreakA break statement allows you to stop iterating immediately.
i = 1
while(i < 100):
num = int(input("Enter a number, or 0 to exit"))
if (num == 0):
break # stop the loop immediately
i = i + num
print("Okay, bye!")
What gets printed?
Loop Control: BreakA break statement allows you to stop iterating immediately.
i = 1
while(i < 100):
num = int(input("Enter a number, or 0 to exit"))
if (num == 0):
break # stop the loop immediately
i = i + num
print("Okay, bye!")
Enter a number, or 0 to exit: 3
Enter a number, or 0 to exit: 0
Okay, bye!
Loop Control: Pass
A pass statement does nothing. It can be used when you might want a
placeholder (e.g., as you are writing new code). No action results.
i = 1
while(i < 5):
i = i + 1
if (i == 2):
pass # do nothing
print("Number is ", i)
What gets printed?
Loop Control: Pass
A pass statement does nothing. It can be used when you might want a
placeholder (e.g., as you are writing new code). No action results.
i = 1
while(i < 5):
i = i + 1
if (i == 2):
pass # do nothing
print("Number is ", i)
Number is 5
There is no "Do While" in Python
Unlike some other languages, Python does not have a do while loop. Its
functionality can be obtained with a while True and break.
do(
# loop body
) while condition
i = 1
while True:
# loop body
if not condition:
break
Notes:
1. A while True loop will execute at least once.
2. Make sure the loop stops executing somehow!
List Indexed Assignment
Lists can change once they’re created. Assign to the list the desired index.
my_list = [5, 6, 7]
My_list[2] = 8
print(my_list) What gets printed from this line?
However, assignments to indices not currently in the list is not allowed. This example will result in an error.
My_list[3] = 9 # This is illegal, 3 is out of range.
List Indexed Assignment
Lists can change once they’re created. Assign to the list the desired index.
my_list = [5, 6, 7]
My_list[2] = 8
print(my_list) What gets printed from this line?
[5, 6, 8]
However, assignments to indices not currently in the list is not allowed. This example will result in an error.
My_list[3] = 9 # This is illegal, 3 is out of range.
List Concatenation
Similar to strings, lists can be concatenated using the + operator:
a = [5, 6, 7]
b = ["eight", "nine", "ten"]
c = a + b
print(a)
print(b)
print(c)
[5, 6, 7]
["eight", "nine", "ten"]
[5, 6, 7, "eight", "nine", "ten"]
Lists in Lists
List can store data of any type; including other lists
print(nested[0][0])
nested[0][0] = nested[1][0]
print(nested)
What gets printed?
Accessing and indexing is done by using another set of brackets
nested = [[1, 2, 3],[4, 5, 6]]
Lists in Lists
List can store data of any type; including other lists
print(nested[0][0])
nested[0][0] = nested[1][0]
print(nested)
1
[[4, 2, 3], [4, 5, 6]]
Accessing and indexing is done by using another set of brackets
nested = [[1, 2, 3],[4, 5, 6]]
List Methods
● Adding elements to lists○ append(x)○ extend([x])○ insert(i, x)
Python provides several functions to interact with lists (this is more than you need to know now):
● Modifying Elements○ sort()○ reverse()
● Removing Elements from lists○ remove(x)○ pop()○ pop(i)
● Miscellaneous○ index()○ count()
Iterating Over a List using a while
With a while loop, we can iterate over a list using a counter variable.
my_list = [1, 2, "three"]
i = 0
while i < len(my_list):
print(my_list[i]) # print will run 3 times
i = i + 1
1
2
three
While Loop PracticeFirst, trace the loop by hand and determine the output.
Then, run the loop in Python IDLE to see if you were correct.
x = 1
i = 2
while x < 10:
x = x + i
i = i + 2
print(x, i)
print("Python!")
While Loop PracticeFirst, trace the loop by hand and determine the output.
Then, run the loop in Python IDLE to see if you were correct.
x = 1
i = 2
while x < 10:
x = x + i
i = i + 2
print(x, i)
print("Python!")
3 4
7 6
13 8
Python!
While Loop Practice
First, trace the loop by hand and determine the output.
Then, run the loop in Python IDLE to see if you were correct.
i = 0
while i < 2:
i = i + 2
j = 0
while j < 3:
j = j + 1
print(i, j)
print("Okay!")
While Loop PracticeFirst, trace the loop by hand and determine the output.
Then, run the loop in Python IDLE to see if you were correct.
i = 0
while i < 2:
i = i + 2
j = 0
while j < 3:
j = j + 1
print(i, j)
print("Okay!")
2 1
2 2
2 3
Okay!
While Loop PracticeFirst, trace the loop by hand and determine the output.
Then, run the loop in Python IDLE to see if you were correct.
i = 0
while i < 20:
if i % 3 == 0:
print(i)
i = i + 1
While Loop PracticeFirst, trace the loop by hand and determine the output.
Then, run the loop in Python IDLE to see if you were correct.
i = 0
while i < 20:
if i % 3 == 0:
print(i)
i = i + 1
0
3
6
9
12
15
18
Review of Python for Loops:Iterating Over a List
Python provides a range-based construct for iterables called for.
for var_name in iterable:
# do something
for item in my_list:
print(item) # print each item in list
1
2
three
Suppose we have the following list:my_list = [1, 2, "three"]
The range() function can be used to generate a sequence of numbers. The syntax is
range(start, stop, step)
start is the start number (defaults to 0)stop is the stop number (exclusive)step is the increment value (defaults to 1)
for i in range(0, 3, 1):
print(i) # print each item in list
0
1
2
Review of Python for Loops:Generating Ranges
If you do not provide a step in the range function, Python assumes one.
Here’s the previous example w/out the step
argument.
Review of Python for Loops:Range: step is Optional
for i in range(0, 3):
print(i) # print each item in list
0
1
2
If you do not provide a start in the range function, Python assumes zero.
Here’s the previous example w/out the step or
start arguments.
Review of Python for Loops:Range: start is Optional
for i in range(3):
print(i) # print each item in list
0
1
2
You can repeat something n times with a range
based loop:n = 3
for i in range(n):
print("Python is awesome!")
"Python is awesome!"
"Python is awesome!"
"Python is awesome!"
Review of Python for Loops:Repeat n times
n = 3
for i in range(n):
print("Python is awesome!")
"Python is awesome!"
"Python is awesome!"
"Python is awesome!"
Review of Python for Loops:How Would You Make Range
Inclusive?
n = 3
for i in range(n+1):
print("Python is awesome!")
"Python is awesome!"
"Python is awesome!"
"Python is awesome!"
"Python is awesome!"
Review of Python for Loops:How Would You Make Range
Inclusive?
Python Range Summary
The range() function can take between 1 – 3 parameters, e.g.:
range (7)
range (0, 7)
range (0, 7, 1)
Besides the number of parameters, what execution differences, if
any, will be observed if these ranges are used?
Other Example Code (note end)
What does the end = " " do?
For Loop PracticeFirst, trace the loop by hand and determine the output.
Then, run the loop in Python IDLE to see if you were correct.
for i in range(3):
for j in range(2):
print(i, j)
For Loop PracticeFirst, trace the loop by hand and determine the output.
Then, run the loop in Python IDLE to see if you were correct.
for i in range(3):
for j in range(2):
print(i, j)
0 0
0 1
1 0
1 1
2 0
2 1
For Loop Practice
First, trace the loop by hand and determine the output.
Then, run the loop in Python IDLE to see if you were correct.
favnums = [4, 3, 1]
stats = ["my new favorite", "okay", "boring"]for num in favnums:
for stat in stats:
print(num, "is", stat)print("Tomorrow . . .")
print("I’m sticking with", favnums[1])
For Loop Practice
4 is my new favorite
4 is okay
4 is boring
Tomorrow . . .
3 is my new favorite
3 is okay
3 is boring
Tomorrow . . .
1 is my new favorite
1 is okay
1 is boring
Tomorrow . . .
I’m sticking with 3
Dictionaries● A Python dictionary is a collection of key-value pairs.
● Keys must be unique.
● Values can be almost any object.
## Creating an empty dictionary:dict = {}## Creating an initialized dictionary:dict = {
"make": "Ferrari","model": "250 GTO","year": 1963
}
Dictionaries
Dictionary type can be int, float, list, etc., e.g.:dict = {}dict["for loops"] = [43, 48, 50]dict["functions"] = [65, 66]dict["lists"] = [30, 31, 32]dict["while loops"] = [44, 49, 51]print (dict)
DictionariesWe can look up values using the key, e.g.:
dict = {"make": "Ferrari","model": "250 GTO","year": 1963
}my_car_make = dict["make"]my_car_model = dict["model"]
DictionariesWe can look up values using the key, e.g.:
dict = {"make": "Ferrari","model": "250 GTO","year": 1963
}my_car_make = dict["make"]my_car_model = dict["model"]## we can also use get, e.g.:my_car_year = dict.get(“year")
DictionariesWe can change values using the key, e.g.:
dict = {"Bobs": 1,"Carols": 2,"Teds": 0
}dict["Bobs"] += 1dict["Carols"] -= 1dict["Teds"] = 1print(dict)
DictionariesWe can change values using the key, e.g.:
dict = {"Bobs": 1,"Carols": 2,"Teds": 0
}dict["Bobs"] += 1dict["Carols"] -= 1dict["Teds"] = 1print(dict)-----------------------------------------------------------------------------{'Bobs': 2, 'Carols': 1, 'Teds': 1}
DictionariesWe can loop through dictionary keys, e.g.:
dict = {"Bobs": 1,"Carols": 2,"Teds": 0
}for x in dict:print(x)
-----------------------------------------------------------------------------BobsCarolsTeds
DictionariesWe can loop through dictionary keys or values, e.g.:
dict = {"Bobs": 1,"Carols": 2,"Teds": 4
}for x in dict.values(): ## this works for dict.keys as wellprint(x)
-----------------------------------------------------------------------------124
DictionariesWe can loop through both keys and values using the items() function:, e.g.:
dict = {"Bobs": 1, "Carols": 2, "Teds": 4}for x, y in dict.items():print(x, y)
-----------------------------------------------------------------------------Bobs 1Carols 2Teds 4
DictionariesTo determine if a specified key is present in a dictionary use the in keyword:##dict = {
"make": "Ferrari","model": "250 GTO","year": 1963
}if "model" in dict:
print("Yes, 'model' is one of the keys in the dict dictionary")
DictionariesTo determine how many items (key-value pairs) a dictionary has, use the len() method.:##dict = {
"make": "Ferrari","model": "250 GTO","year": 1963
}print(len(dict))-----------------------------------------------------------------3
String SlicingThe Python string data type is a sequence made up of one or more
individual characters that could consist of letters, numbers, whitespace
characters, or symbols. Because a string is a sequence, it can be
accessed in the same ways that other sequence-based data types are,
through indexing and slicing.
Recall how strings are indexed:
P y t h o n R u l e s
0 1 2 3 4 5 6 7 8 9 10 11
-12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1
String Slicing
s = ‘Python Rules’
slice1 = s [3]
slice2 = s [-4]
print(slice1)
print(slice2)
P y t h o n R u l e s
0 1 2 3 4 5 6 7 8 9 10 11
-12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1
String Slicing
s = "Python Rules"
slice1 = s [4:6]
slice2 = s [-5:-1]
print(slice1) ## prints "on"
print(slice2) ## prints "Rule"
P y t h o n R u l e s
0 1 2 3 4 5 6 7 8 9 10 11
-12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1
String Slice Syntax
[start(inclusive) : stop (exclusive) : step]
default: default: def:
0 end 1
Any omitted value is replaced with the
default value.
String Slicing
s = "Python Rules"
slice1 = s [:6]
slice2 = s [7:]
print(slice1) ## prints "Python"
print(slice2) ## prints "Rules"
P y t h o n R u l e s
0 1 2 3 4 5 6 7 8 9 10 11
-12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1
String Slicing
s = "Python Rules"
slice1 = s [-12:-6]
slice2 = s [-5:]
print(slice1) ## prints "Python"
print(slice2) ## prints "Rules"
P y t h o n R u l e s
0 1 2 3 4 5 6 7 8 9 10 11
-12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1
String Slicing
s = "Python Rules"
slice1 = s [::4]
slice2 = s [::-1]
print(slice1) ## prints "Pou"
print(slice2) ## prints "seluR nohtyP"
P y t h o n R u l e s
0 1 2 3 4 5 6 7 8 9 10 11
-12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1
String Slicing
s = "Python Rules"
slice1 = s [::-2]
slice2 = s [::-4]
print(slice1) ## prints "slRnhy"
print(slice2) ## prints "sRh"
P y t h o n R u l e s
0 1 2 3 4 5 6 7 8 9 10 11
-12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1
A Few Miscellaneous Thoughts
● Assignment Shorthand
● Debugging Python Programs
Shorthand Assignment and Op
Normally, to increment i by 1, we write:
i = i + 1
We can use shorthand notation instead:
i += 1
To increment i by 3, we write:
i += 3
i += a is equivalent to i = i + a
Shorthand Notation and Other Operators
i += a is equivalent to i = i + a
i –= a is equivalent to i = i – a
i *= a is equivalent to i = i * a
i /= a is equivalent to i = i / a
i **= a is equivalent to i = i ** a
Shorthand Notation : Common Use
Practice: What is the final value of i?
i = 4
i += 2
i -= 3
i *= 3
i **= 2
print(i)
Practice: What is the final value of i?
i = 4
i += 2
i -= 3
i *= 3
i **= 2
print(i)
-------------------------------------------------------------81
Practice: What is the final value of x?
x = 2
x /= 2
x += 1
x **= 2
x **= 2
print(x)
-------------------------------------------------------------
Practice: What is the final value of x?
x = 2
x /= 2
x += 1
x **= 2
x **= 2
print(x)
-------------------------------------------------------------16.0
Debugging Python ProgramsDebugging is a mileage sport. The more code you write and make work, the better you will be at debugging code. Here are a few suggestions:
While writing your code
● Use comments extensively. Use multiline comments at the beginning of your program (or in each file of your program) to explain the overall rationale of that section of code. Use in-line comments to clarify what your code is actually doing.
● Avoid being clever for the sake of cleverness. If there is a performance win, ok, be clever, but explain what you are doing in comments. The more clever (obtuse) your code, the more time you need to spend explaining things.
● Develop and use a consistent style for variable names, comments, etc. Write code as if your personal reputation depends upon its quality. It might.
Debugging Python ProgramsRunning your code
● Use lots of print statements to see what is happening. You can remove them later, or wrap them in a “if debug:”, where debug is a Boolean flag you set at the top of your code.
● Program incrementally. Write a little bit of code and test it, then add a little bit more code and test that. Repeat, continuing to build out from a working foundation.
● Use the built in IDLE debugger to set breakpoints and inspect program operation while it is running. Here is a good IDLE debugger tutorial: https://www.cs.uky.edu/~keen/help/debug-tutorial/debug.html
Use Multi-line comments
# We are accustomed to one line comments.
# But, for longer comments that span multiple lines, this can
# be very inefficient, which is why multi-line comments exist.
"""
Multi-line comments are used when a comment spans multiple lines.
They make it easier for other people to read and use your code.
Nice to use to give a descriptive explanation about a large
chunk of code."""
Validating Credit Card Numbers (Luhn)• Since the 1970’s, credit cards have become a ubiquitous method for
paying for purchases and discharging debts.
• All such cards have a numerical sequence of digits that uniquely identify
the card and it owner. In most cases, having a credit or debit card is as
good as having cash.
• This exercise explores how credit/debit card numbers are generated and
validated.
• Validation, (testing for being a valid credit card number), is distinct from
authentication and authorization, (ensuring that the user of the card is its
rightful owner, and that they are allowed to make a specific purchase).
• We will not consider authentication or authorization in this exercise.
Validating Credit Card Numbers (Luhn)
Different card companies use different length numbers:
• American Express - fifteen digits
• Visa and MasterCard - sixteen digits
Credit card companies also use unique identifying
prefixes in their numbers, e.g.:
• American Express - start with 34 or 37
• MasterCard - start with 51, 52, 53, 54, or 55
• Visa - start with a 4
Validating Credit Card Numbers (Luhn)
• Most credit card numbers use a built-in “checksum.”
• The checksum algorithm used by most credit card companies (and by several
governments and many non-financial industries) is called the “Luhn Algorithm,”
named for its inventor, an IBM scientist named Hans Peter Luhn.
• Luhn patented this algorithm (or rather, an invention that implemented this
algorithm in a handheld mechanical device intended to be used by merchants)
in 1960 (U.S. Patent No. 2,950,048, Computer for Verifying Numbers; filed in
1954), but the patent has since lapsed into the public domain.
• The Luhn algorithm is intended only to protect against accidental errors, i.e.,
mistyped numbers; it offers little protection from malicious cryptographic
attack.
Luhn’s CC# Validation Algorithm
1. Starting with the second to last digit (from the right) of the
number, multiply every other digit by 2, recording each answer
separately.
2. Sum all of the individual digits of all the products (not the
products themselves) from Step 1.
3. To the sum obtained in Step 2, add all of the digits that were not
multiplied by 2 in Step 1.
4. If the last digit of the resulting sum is zero, (i.e., the total modulo
10 is equal to 0), the number is valid.
Luhn Example (part 1)
Let’s try an example using a possible number that we created for this purpose:
4735672384163216
First, if valid, we know this is a Visa card because it starts with a “4”.
To make things easier, let’s underline every other digit, starting with the
number’s second-to-last digit (the other digits are highlighted in yellow):
4935672384163216
Now multiply each of the underlined digits by 2, as shown here:
1•2 ; 3•2 ; 1•2 ; 8•2 ; 2•2 ; 6•2 ; 3•2 ; 4•2
That gives us:
2 ; 6 ; 2 ; 16 ; 4 ; 12 ; 6 ; 8
Luhn Example (part 2)
Now add those products’ digits (not the products
themselves) together (the braces show how we have
separated the digits of the two-digit numbers):
2 + 6 + 2 + [1 + 6] + 4 + [1 + 2] + 6 + 8 = 38
Now add this sum (38) to the sum of the digits that were
not multiplied by 2 (the ones highlighted in yellow), starting
from the right and working left:
38 + 6 + 2 + 6 + 4 + 3 + 7 + 5 + 9 = 80
The last digit in the resulting sum (80) is a zero, so this card
number is valid (please do not try to use it)!
Your Task (Option a.)
a. (If you are less comfortable with this assignment) Write a Python program that asks for a credit
card number (input as a string without hyphens or spaces, not as a number), and reports the card
type (American Express, MasterCard, or Visa), and whether the card is valid. So, for the example
above (4735672384163216), your program should output “4735672384163216--------VISA: VALID”,
i.e., the number as a string, 8 hyphens, and “VISA: VALID.” If the entered number is anything other
than a valid CC number, your program should output the number as a string, eight hyphens, and
“INVALID NUMBER.” In addition to your working code, you should submit a plain text file with one
answer per line, for each of the following twenty CC numbers (which include valid and invalid credit
card numbers of each type):
4735672384163216
…
You may manually enter these numbers one at a time, or (better) read them from a file that you
create.
Your Task (Option b.)
b. (If you are more comfortable with this assignment)
Write a Python program that reads a text file of
candidate CC numbers, one number (as a string) per line,
and outputs a file with the results described above for
each CC number, one per line. The CC numbers the file
(of about 700 numbers) may be of any type in any order.
Test your program on the file testCCNums.txt, and
submit the results with your working code.
Luhn IsValid Function (1)
def isValidCC(num):length = len(num)## list of digits to be multiplied by 2list1 = []str1 = ""for i in range(length-2, -1, -2):
list1.append(str(2 * int(num[i])))for number in list1:
str1 += numbersum1 = 0str1 = str1.strip()for ch in str1:
sum1 += int(ch)
## the other digits…
Luhn IsValid Function (2)
## the other digitslist2 = []str2 = ""for i in range(length-1, 0, -2):
list2.append(num[i])for number in list2:
str2 += numbersum2 = 0str2 = str2.strip()for ch in str2:
sum2 += int(ch)## do the sum…
Luhn IsValid Function (3)
## do the sumccsum = str(sum1 + sum2)lastdig = int(ccsum[len(ccsum)-1])if lastdig == 0:
return (True) ## valid cardelse:
return (False)
Luhn Main Program## Main Programf = open('Luhn_Part_a.txt', 'r')g = open('Luhn_a_out.txt', 'w')for num in f:
num = num.strip();typeDig = num[0]if typeDig == '4':
ccType = 'VISA'elif ((typeDig == '3') and ((num[1] == '4') or (num[1] == '7'))):
ccType = 'MASTERCARD'elif ((typeDig == '5') and ((int(num[1]) >= 1) and (int(num[1]) <=5))):
ccType = 'AMEX'else:
ccType = 'BOGUS'
if isValidCC(num): outstr = num + "--------" + ccType + ":VALID\n"
else:outstr = "INVALID NUMBER\n"
g.write(outstr)
f.close()g.close()