#set document(title: "6.4 Parameters", 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")) == 6.4#h(0.6em)Parameters === Learning objectives By the end of this section you should be able to - Identify a function's arguments and parameters. - Describe how mutability affects how a function can modify arguments. === Arguments and parameters What if a programmer wants to write a function that prints the contents of a list? Good practice is to pass values directly to a function rather than relying on global variables. A function #strong[argument] is a value passed as input during a function call. A function #strong[parameter] is a variable representing the input in the function definition. Note: The terms "argument" and "parameter" are sometimes used interchangeably in conversation and documentation. #notebox("Note", rgb("#8a94a6"), rgb("#556666"), rgb("#f7f8fa"))[ #emph[Global and local variables in a program with a function] #link("https://www.openstax.org/r/more-global-and-local-variables")[More global and local variables in a program with a function; ch 6, video 9] ] #notebox("Note", rgb("#8a94a6"), rgb("#556666"), rgb("#f7f8fa"))[ #emph[Arguments and parameters] Consider the following: def print\_welcome(name):   print(f"Welcome {name}!") username = int(input("Enter new username: ")) print\_welcome(username) ] === Multiple arguments and parameters Functions can have multiple parameters. Ex: A function uses two parameters, length and width, to compute the square footage of a room. Function calls must use the correct order and number of arguments to avoid undesired behavior and errors (unless using optional or keyword arguments as discussed later). #examplebox("Example 1")[Using multiple arguments in a function call][ def print\_div(op\_1, op\_2):   """ Prints division operation """   print(f"{op\_1}/{op\_2} = {op\_1/op\_2}") num\_1 = 6 num\_2 = 3 print\_div(num\_1, num\_2) \# Prints "6/3 = 2.0" print\_div(num\_2, num\_1) \# Prints "3/6 = 0.5" print\_div(num\_1) \# Error: Missing argument: op\_2 ] #notebox("Note", rgb("#8a94a6"), rgb("#556666"), rgb("#f7f8fa"))[ #emph[Multiple arguments and parameters] Consider the following: def calc\_distance(x1, y1, x2, y2):   dist = math.sqrt((x2-x1)\*\*2 + (y2-y1)\*\*2)   print(dist) p1\_x =int(input("Enter point 1's x: ")) p1\_y =int(input("Enter point 1's y: ")) p2\_x =int(input("Enter point 2's x: ")) p2\_y =int(input("Enter point 2's y: ")) calc\_distance(p1\_x, p1\_y, p2\_x, p2\_y) ] === Modifying arguments and mutability In Python, a variable is a name that refers to an object stored in memory, aka an object reference, so Python uses a #strong[pass-by-object-reference] system. If an argument is changed in a function, the changes are kept or lost depending on the object's mutability. A #strong[mutable] object can be modified after creation. A function's changes to the object then appear outside the function. An #strong[immutable] object cannot be modified after creation. So a function must make a local copy to modify, and the local copy's changes don't appear outside the function. Programmers should be cautious of modifying function arguments as these side effects can make programs difficult to debug and maintain. #examplebox("Example 2")[Converting temperatures][ What are the values of weekend\_temps and type after convert\_temps() finishes? def convert\_temps(temps, unit):   if unit == "F":     for i in range(len(temps)):       temps\[i\] = (temps\[i\]-32) \* 5/9     unit = "C"   else:     for i in range(len(temps)):       temps\[i\] = (temps\[i\]\*9/5) + 32     unit = "F" \# Weekend temperatures in Fahrenheit. wknd\_temps = \[49.0, 51.0, 44.0\] deg\_sign = u"\\N{DEGREE SIGN}" \# Unicode metric = "F" \# Convert from Fahrenheit to Celsius. convert\_temps(wknd\_temps, metric) for temp in wknd\_temps:   print(f"{temp:.2f}{deg\_sign}{metric}", end=" ") The output is 9.44°F 10.56°F 6.67°F. type was changed to "C" in the function but didn't keep the change outside of the function. Why is the list argument change kept and not the string argument change? (Hint: A list is mutable. A string is immutable.) ] #notebox("Note", rgb("#8a94a6"), rgb("#556666"), rgb("#f7f8fa"))[ #emph[Exploring a faulty function] #link("https://www.openstax.org/r/faulty-function")[Exploring a faulty function; ch 6, video 10] ] #notebox("Note", rgb("#8a94a6"), rgb("#556666"), rgb("#f7f8fa"))[ #emph[Mutability and function arguments] ] #notebox("Note", rgb("#8a94a6"), rgb("#556666"), rgb("#f7f8fa"))[ #emph[Printing right triangle area] Write a function, print\_area(), that takes in the base and height of a right triangle and prints the triangle's area. The area of a right triangle is #math.equation(block: false, alt: "the fraction b h over 2")[$frac(b h, 2)$], where b is the base and h is the height. Given input: 3 4 The output is: Triangle area: 6.0 \# Define print\_area() base = float(input()) height = float(input()) print\_area(base, height) ] #notebox("Note", rgb("#8a94a6"), rgb("#556666"), rgb("#f7f8fa"))[ #emph[Curving scores] Write a function, print\_scores(), that takes in a list of test scores and a number representing how many points to add. For each score, print the original score and the sum of the score and bonus. Make sure not to change the list. Given function call: print\_scores(\[67, 68, 72, 71, 69\], 10) The output is: 67 would be updated to 77 68 would be updated to 78 72 would be updated to 82 71 would be updated to 81 69 would be updated to 79 \# Define print\_scores() print\_scores(\[67, 68, 72, 71, 69\], 10) print() \# Print newline print\_scores(\[67, 68, 72, 71, 69\], 5) ]