Lecture 04
Lecture 04
Control Statements
Identi ers
• A sequence of letters, digits, or underscores, but…
• Also includes unicode "letters", spacing marks, and decimals (e.g. Σ)
• Must begin with a letter or underscore (_)
• Why not a number?
• Case sensitive (a is different from A)
• Conventions:
- Identi ers beginning with an underscore (_) are reserved for system use
- Use underscores (a_long_variable), not camel-case (aLongVariable)
- Keep identi er names less than 80 characters
• Cannot be reserved words
Types
• Don't worry about types, but think about types
• Variables can "change types"
- a = 0
a = "abc"
a = 3.14159
• Actually, the name is being moved to a different value
• You can nd out the type of the value stored at a variable v using type(v)
• Some literal types are determined by subtle differences
- 1 vs 1. (integer vs. oat)
- 1.43 vs 1.43j ( oat vs. imaginary)
• Can do explicit type conversion (int, str, float)
D. Koop, CSCI 503/490, Spring 2023 3
fi
fl
fl
Assignment
• The = operator: a = 34; c = (a + b) ** 2
• Python variables are actually pointers to objects
• Also, augmented assignment: +=, -=, *=, /=, //=, **=
x = x + 1
x = 42
y = x
x 42
x 42 43
Assignment 1
• Due Tonight
• Get acquainted with Python using notebooks
• Make sure to follow instructions
- Name the submitted le a1.ipynb
- Put your name and z-id in the rst cell
- Label each part of the assignment using markdown
- Make sure to produce output according to speci cations
• ipynb les are in a JSON format. Please maintain the .ipynb extension!
• Questions?
fi
fi
fi
Assignment 2
• Out soon
if and else
• Blocks (suites) only executed if the
condition is satis ed • if a < 34:
• if <boolean expression>: b = 5
<then-block> else:
b = a - 34
• if <boolean expression>:
<then-block>
else:
<else-block>
• Remember colon (:)
• Remember indentation
elif is a shortcut
• if a < 10: • if a < 10:
print("Small") print("Small")
else: elif a < 100:
if a < 100: print("Medium")
print("Medium") elif a < 1000:
else: print("Large")
if a < 1000: else:
print("Large") print("X-Large")
else:
print("X-Large")
pass
• pass is a no-op
• Python doesn't allow an empty block so pass helps with this
• Used when commenting out code blocks
• if a < 10:
print("Small")
elif a < 100:
print("Medium")
elif a < 1000:
# print("Large") <- block would be empty (comments don't count)
pass
else:
print("X-Large")
while
• while repeats the execution of the block
• while <boolean expression>:
<loop-block>
• Condition is checked at the beginning and before each repeat
• If condition is False, loop will never execute
• Don't use a while loop to iterate (use for loop instead)
• Example:
- d = 100
while d > 0:
a = get_next_input()
d -= a
"…I became convinced that the go to statement should be abolished from all
'higher level' programming languages… The go to statement as it stands is
just too primitive; it is too much an invitation to make a mess of one's
program."
[Dijkstra, 1968]
D. Koop, CSCI 503/490, Spring 2023 16
I have yet to see a single study grams using a program with GOTOs is Imore
flag to indicate introduce GOTOs to untangle
('The firstall-zero All
that supported the supposition when an all-zero row wasIn found.
complex.” each deeply
short, the belief that nested mess of code, rowis I, i-l); me to
that GOTOs are harmful (I pre- (The other twoGOTOs programs are were I haveto found that the number
harmful appears part fro
The Go To Statement Debate
ming, Three
sumeofthis the isgroup regularly nobody
not because By either
any measureincorrecthave notorintention-
far more com- of lines of code After drops
often reviewingby the various
become a religious doctrine, program
tool. used has GOTOs tried).in-their work. They
Nonetheless, people ally biased plex.) The against GOTOs,is the
following typical of 20-25 percent, GOTO-less
with a smallversions,
de- I was able to
unassailable by evidence. prove
knives producedseem seven-line
to need to programs
believe that two GOTO-less
the programs programs
produced: are more crease in the eliminate
total number the offlag, and reduce the
vari-
I do not know if I can do any-
cut nearlyavoiding
identicalGOTOs to this:will automati- complex than the program using ables. I conclude programthat to nine
the matrixlines:
thing that will dislodge such
must for callyi :=I make ton programs cheap and GOTOs. Aside from fewer lines of example here i:=l;is not an odd case,
i :=I; deeply entrenched dogma. At least
s, dobegin reliable. They will accept any code,repeat
the program with GOTOs but discus-
typical of the repeat improvements
I can attempt to reopen the The
nts forjstatement:=ltondoaffirming that belief, has onlyj 13 :=I; operators, compared to that using GOTOs j can
:= 1; accomplish.
sion by showing ,a clearcut in- P.O
s sub- ifandx[i,dismiss j]<>Oany statement oppos-21 and allzero 19 for the :=true;
GOTO-less pro- I am aware that some
while(j<=n) awful pro-
stance where GOTOs significantly Wap
GOTO- ingthengoto
it. reject; grams, whileand only(j<=n)andallzero
41 total tokens, grams have been and (x[i, using
written j] =0) do
reduce program complexity.
d cost- writelnIt has gone so far that some peo-compared dobeginto 74 and 66 for the GOTOs. This is j :=thej+l; fault of
often
if x[i, j]OO
I posed the following problem to i :=i+l;it lacks
.fy. ('The plefirstall-zero
have devised program com- other programs. More impor- the language (because
row is I, i thenallzero a group of := expert
false; computer pro- until(i>n)or (j>n);
eady plexity metrics penalizing GOTOstantly, the programmers who used other constructs), or the text edi-
break; j :=j+l; grammers: “Let X be an N x N ma- ifj>n
of dol- so heavily that any program with GOTOs took less time to arrive at tor (because it lacks a block
reject: end; end; lrix of integers. Write a program thenwriteln REFERE
and a GOT0 is ipso facto rated more their solutions. move). With a ('The proper firstall-zero
language 1. Dijks
i :=i+l; that will print the number of the harm
hid- complex than even
The other ten programmers nor- the clumsiest In recent
until years I
(i>n) first have taken
or all-zero and
allzero; row of X, if any.” editor, and adequate instruc-
row is' , i-l); 147-1
devel- mallyGOTO-less
avoided GOTOs. program.Eight Thenof they over ifi<=na number of programs that tion in the use of GOTO, this
ources. them turn around 13and
produced or say, “See,
14-line pro-the were written without GOTOs. As
thenwriteln should not be a consideration.
study gramsprogram using awith GOTOs
flag to indicateis more I introduce
('The GOTOs firstall-zeroto untangle All of my experiences compel
n whencomplex.”
an all-zeroIn row short,was belief that each deeply 196
thefound. nested mess rowis of code,
I, i-l); me to conclude that it is time to
Communications of the ACM M
pre- (The GOTOs other two areprograms
harmful were appears to I have found that the number part from the dogma of GOTO-less
After reviewing the various
body eitherhave becomeor afarreligious
incorrect more com- doctrine, of lines of code often drops by programming. It has failed to
GOTO-less versions, I was able to
ple "All of my experiences compel me to conclude that it is time to part from the
plex.)unassailable
The followingby is evidence.
typical of 20-25 percent, with a small de-
eliminate the flag, and reduce the
know if I can do any- crease in the total number of vari-
I do notproduced:
prove its merit.
the programs
ati- dogma of GOTO-less programming. It has failed to prove its merit"
thing that will dislodge such
program to nine lines:
ables. I conclude that the matrix
and i :=I; deeply entrenched dogma. At least examplei:=l; here is not an odd case,
Frank Rubin
ny repeatI can attempt to reopen the discus-but typical repeat of the improvements [Rubin, 1987]
j :=GOTOs The Contest Center
ef, sion by showing ,a clearcut in-
j :=I; that using 1; can accomplish.
D. Koop, CSCI 503/490, Spring 2023 while(j<=n) P.O. Box 1660 17
oppos- stance where
allzero :=true; GOTOs significantly I am aware that some awful pro-
Programming Principles: break, continue, goto
• ACM the published a number of critiques of Rubin's letter, Dijkstra also wrote
some notes on this: bugs, maybe the language is bad…
• Most computer scientists agree that the problem was over-use, not that the
statement is never useful
• Break and continue are more structured gotos because they apply only to the
current block
• Breaks and continues at the top of a loop are better
• Multi-level breaks are annoying (compare with return statements in functions)
Loop Styles
• Loop-and-a-Half
d = get_data() # priming rd
while check(d):
# do stuff
d = get_data() • Better way?
• In nite-Loop-Break
while True:
d = get_data()
if not check(d):
break
# do stuff
Loop Styles
• Loop-and-a-Half
d = get_data() # priming rd
while check(d):
# do stuff
d = get_data() • Assignment Expression (Walrus)
• In nite-Loop-Break while check(d := get_data()):
while True: # do stuff
d = get_data()
if check(d):
break
# do stuff
do-while
• do-while loops always execute at least once
• There is no do-while loop construct in Python
• Can set the condition so that it is always True rst time through the loop
• …or move the break to the end of the loop
fi
Looping Errors
• # while loop - summing the numbers 1 to 10
n = 10
cur_sum = 0
# sum of n numbers
i = 0
while i <= n:
i = i + 1
cur_sum = cur_sum + i
Range
• Python has lists which allow enumeration of all possibilities: [0,1,2,3,4]
• Can use these in for loops
• for i in [0,1,2,3,4]:
print(i) # 0 1 2 3 4
• but this is less ef cient than range (which is a generator)
• for i in range(5):
print(i) # 0 1 2 3 4
• List must be stored, range doesn't require storage
• Printing a range doesn't work as expected:
- print(range(5)) # prints "range(0, 5)"
- print(list(range(5)) # prints "[0, 1, 2, 3, 4]"
Range
• Different method signatures
- range(n) → 0, 1, …, n-1
- range(start, end) → start, start + 1, …, end - 1
- range(start, end, step)
→ start, start + step, … < end
• Negative steps:
- range(0,4,-1) # <nothing>
- range(4,0,-1) # 4 3 2 1
• Floating-point arguments are not allowed
Looping Errors
• # for loop - summing the numbers 1 to 10
n = 10
cur_sum = 0
for i in range(n):
cur_sum += i