#set document(title: "5.2 For loop", author: "OpenStax / XYZ Homework") #set page(width: 8.5in, height: auto, margin: 1in) #import "@preview/cetz:0.5.2" #set text(font: ("STIX Two Text", "Libertinus Serif", "New Computer Modern"), size: 10.5pt, lang: "en") #show math.equation: set text(font: ("STIX Two Math", "New Computer Modern Math")) #set par(justify: true, leading: 0.62em, spacing: 0.9em) #set enum(spacing: 1.1em) // room between list items so tall inline fractions don't collide #set list(spacing: 1.1em) #set table(stroke: 0.5pt + rgb("#c7ccd3")) #let BLUE = rgb("#183B6F") // brand navy — section bars + example/solution labels (white on navy 11.09:1) #let ORANGE = rgb("#A94509") // brand primary-700 — AA-safe deep orange for TEXT (5.93:1 on white; raw brand #F37021 is 2.94:1 and must never carry text) #let RED = rgb("#DC2626") // brand error-600 #let GREEN = rgb("#059669") // brand success-600 (decoration only; small green text uses green-text #007942) #show heading.where(level: 1): it => block(width: 100%, above: 0pt, below: 16pt, fill: gradient.linear(BLUE, rgb("#2C5AA0")), inset: (x: 14pt, y: 12pt), radius: 3pt, text(fill: white, weight: "bold", size: 19pt, it.body)) #show heading.where(level: 2): it => block(width: 100%, above: 18pt, below: 10pt, fill: BLUE, inset: (x: 10pt, y: 6pt), radius: 2pt, text(fill: white, weight: "bold", size: 12pt, it.body)) #show heading.where(level: 3): it => text(fill: ORANGE, weight: "bold", size: 12.5pt, it.body) #show heading.where(level: 4): it => text(fill: BLUE, weight: "bold", size: 10.5pt, it.body) #let examplebox(label, title, body) = block(width: 100%, breakable: true, fill: rgb("#EFF1F5"), stroke: 0.5pt + rgb("#CFDDF0"), radius: 4pt, inset: 10pt, above: 12pt, below: 12pt)[ #block(below: 6pt)[#box(fill: BLUE, inset: (x: 6pt, y: 2pt), radius: 2pt, text(fill: white, weight: "bold", size: 8.5pt, label)) #h(0.4em) #strong[#title]] #body] // rail = decorative left rule (raw brand token); labelcolor = AA-safe label text shade #let notebox(label, rail, labelcolor, tint, body) = block(width: 100%, breakable: true, fill: tint, stroke: (left: 3pt + rail), inset: (left: 10pt, rest: 8pt), radius: (right: 4pt), above: 11pt, below: 11pt)[ #text(fill: labelcolor, weight: "bold", size: 7.5pt, tracking: 0.5pt)[#upper(label)] #linebreak() #body] #let solutionbox(body) = block(above: 4pt, below: 8pt)[ #text(fill: BLUE, weight: "bold", size: 8.5pt)[Solution] #linebreak() #body] #let figph(msg) = block(width: 100%, height: 60pt, fill: rgb("#f6f7f9"), stroke: (paint: rgb("#c7ccd3"), dash: "dashed"), radius: 4pt, inset: 10pt)[ #align(center + horizon, text(fill: rgb("#889"), style: "italic", size: 9pt, msg))] // Standardize inlined figure sizes: measure the natural CeTZ canvas, then scale to a // consistent envelope (aspect-aware; see build_typst.py FIG_* constants). Unlike the // print preamble, dimensions are FLOORED: in an editor a user can trim a figure to a // degenerate 1-D shape (a bare line), and w/h or tw/w would then divide by zero. #let _STD_W = 3.5 #let _WIDE_W = 5.6 #let _MAX_H = 3.4 #let _ASPECT_WIDE = 2.2 #let _UPSCALE_MAX = 1.15 #let stdfig(body) = context { let m = measure(body) let w = calc.max(m.width / 1in, 0.01) let h = calc.max(m.height / 1in, 0.01) let tw = if w / h > _ASPECT_WIDE { _WIDE_W } else { _STD_W } let s = calc.min(tw / w, _MAX_H / h, _UPSCALE_MAX) align(center, box(scale(x: s * 100%, y: s * 100%, reflow: true, body))) } #show figure: set block(breakable: false) #set figure(gap: 8pt) #show figure.caption: set text(size: 8.5pt, fill: rgb("#555")) == 5.2#h(0.6em)For loop === Learning objectives By the end of this section you should be able to - Explain the for loop construct. - Use a for loop to implement repeating tasks. === For loop In Python, a #strong[container] can be a range of numbers, a string of characters, or a list of values. To access objects within a container, an iterative loop can be designed to retrieve objects one at a time. A #strong[for loop] iterates over all elements in a container. Ex: Iterating over a class roster and printing students' names. #notebox("Note", rgb("#8a94a6"), rgb("#556666"), rgb("#f7f8fa"))[ #emph[For loop example for iterating over a container object] #link("https://www.openstax.org/r/for-loop-iterating")[For loop example for iterating over a container object; ch 5, video 3] ] #notebox("Note", rgb("#8a94a6"), rgb("#556666"), rgb("#f7f8fa"))[ #emph[For loop over a string container] A string variable can be considered a container of multiple characters, and hence can be iterated on. Given the following code, answer the questions. str\_var = "A string" count = 0 for c in str\_var:   count += 1 print(count) ] === Range() function in for loop A for loop can be used for iteration and counting. The range() function is a common approach for implementing counting in a for loop. A #strong[range()] function generates a sequence of integers between the two numbers given a step size. This integer sequence is inclusive of the start and exclusive of the end of the sequence. The range() function can take up to three input values. Examples are provided in the table below. #figure(table( columns: 4, align: left, inset: 6pt, [Range function], [Description], [Example], [Output], [range(end)], [Generates a sequence beginning at 0 until end. Step size: 1], [range(4)], [0, 1, 2, 3], [range(start, end)], [Generates a sequence beginning at start until end. Step size: 1], [range(0, 3)], [0, 1, 2], [range(2, 6)], [2, 3, 4, 5], [], [], [range(-13, -9)], [-13, -12, -11, -10], [], [], [range(start, end, step)], [Generates a sequence beginning at start until end. Step size: step], [range(0, 4, 1)], [0, 1, 2, 3], [range(1, 7, 2)], [1, 3, 5], [], [], [range(3, -2, -1)], [3, 2, 1, 0, -1], [], [], [range(10, 0, -4)], [10, 6, 2], [], [], )) #examplebox("Example 1")[Two programs printing all integer multiples of 5 less than 50 (Notice the compactness of the for construction compared to the while)][ #figure(table( columns: 2, align: left, inset: 6pt, [\# For loop condition using \# range() function to print \# all multiples of 5 less than 50 for i in range(0, 50, 5):   print(i)], [\# While loop implementation of printing \# multiples of 5 less than 50 \# Initialization i = 0 \# Limiting the range to be less than 50 while i \< 50:     print(i)     i+=5], )) ] #notebox("Note", rgb("#8a94a6"), rgb("#556666"), rgb("#f7f8fa"))[ #emph[For loop using a range() function] ] #notebox("Note", rgb("#8a94a6"), rgb("#556666"), rgb("#f7f8fa"))[ #emph[Counting spaces] Write a program using a for loop that takes in a string as input and counts the number of spaces in the provided string. The program must print the number of spaces counted. Ex: If the input is "Hi everyone", the program outputs 1. usr\_in = input() \# TODO: counting the number of space characters in usr\_in ] #notebox("Note", rgb("#8a94a6"), rgb("#556666"), rgb("#f7f8fa"))[ #emph[Sequences] Write a program that reads two integer values, n1 and n2, with n1 \< n2, and performs the following tasks: + Prints all even numbers between the two provided numbers (inclusive of both), in ascending order. + Prints all odd numbers between the two provided numbers (exclusive of both), in descending order. Input: 2 8 Prints: 2 4 6 8 7 5 3 Note: the program should return an error message if the second number is smaller than the first. n1 = int(input("Enter an integer: ")) n2 = int(input("Enter another integer larger than the first one: ")) \# TODO: printing even numbers in increasing order (inclusive) \# TODO: printing odd numbers in decreasing order (exclusive) ]