====== Computer Lab 06, modules, namespaces, conventions ====== Different **namespaces** in Python: * built-in namespace * global namespace * local namespace **Python variable scope**: A scope is the portion of a program from where a namespace can be accessed directly without any prefix. At any given moment, there are at least three nested scopes. * Scope of the current function which has local names * Scope of the module which has global names * Outermost scope which has built-in names When a reference is made inside a function, the name is searched in the local namespace, then in the global namespace and finally in the built-in namespace. # Python program processing # global vs local variable count = 5 def some_method(): count = 10 print(count) return some_method() print(count) # local function shadowing a built-in one. # REALLY BAD PRACTICE # You should NEVER shadow a built-in function. def abs(val): print("My abs() function") if val >= 0: return val else: return -val print(abs(-5)) PREFERRED SOLUTION: USE/WRITE YOUR OWN MODULE INSTEAD OF SHADOWING BUILT-IN FUNCTIONS! //main.py// import mymath print(abs(-4)) print(mymath.abs(-4)) //mymath.py// def abs(val): print("My abs() function") if val >= 0: return val else: return -val ===== Weekly homework 06 - trigonometric functions ===== * Write a module ''mymath'' (file ''mymath.py'') with 2 functions: def cos(x): """Returns an approximate value of cos(x). :param x: float, input value for which the cosine function is computed :return: float, approximate value of cos(x) """ def sin(x): """Returns an approximate value of sin(x). :param x: float, input value for which the sine function is computed :return: float, approximate value of sin(x) """ * Use the following approximation of the sine and cosine function: $\cos(x)=1-\frac{x^2}{2}+\frac{x^4}{24}$ $\sin(x)=x-\frac{x^3}{6}+\frac{x^5}{120}$ * Create a file/module ''main.py'' and a function called ''get_trig_series(lst)'' inside it. Implement this function so that it receives a list of floats and outputs 2 lists - a list of approximate cosines of the values in the input list and a list of approximate sines of the values in the input list. Make use of the functions in the ''mymath'' module. """Return lists of cosines and sines of the values in the input list :param lst: list of floats, input values for this cos and sin functions are to be computed :return: list of floats, approximate cosines :return: list of floats, approximate sines Example: >>> cs, sn = get_trig_series([0, 0.1]) >>> print(cs, sn) [1.0, 0.9950041666666667] [0.0, 0.09983341666666667] """ * Pack both 'mymath.py' and 'main.py' in a single **zip file** and upload it to the BRUTE system. Place both files in the root directory of the zip file, that is, do NOT zip a folder containing the .py files. Zip them directly. ==== Built-in modules ==== import random rng = random.Random() # integer in range [1,6] dice_throw = rng.randrange(1,7) # odd integer in range [1, 199] odd_number = rng.randrange(1,200,2) # float drawn uniformy from a range [0, 1) float_0_1 = rng.random() # randomly shuffle list shuffled_card_list = rng.shuffle(card_list) # Simulate throwing a dice 6000 times. # Produce a list (of length 6) with frequency of each outcome (1-6). import math # constants math.pi math.e # square root of 9 math.sqrt(9) # degrees <-> radians conversion math.radians(90) math.degrees(3.14) # sin, cos, tan, ... math.sin(math.radians(90)) # inverse trigonometric functions math.asin(1.0) # natural logarithm math.log(math.e) # base-10 logarithm math.log10(1000) * **task 1:** Evaluate $f(x)= \sin(2x) \cos(2x) - \tan(x/2)$ for $x=45$ degrees. * **task 2:** Evaluate $\sqrt{x^2+y^2}$ for $x=2$, $y=100$. * **task 3:** The radioisotope strontium-90 has a half-life of 38.1 years. A sample contains 100 mg of Sr-90. Calculate the remaining milligrams of Sr-90 after 100 years. $m(t)=m_o e^{- \ln(2)*t/T_{1/2}}$ ===== homework ===== Solve homework [[courses:be5b33prg:homework:regular:03_vector_library|03 - vectorlib - functions for working with vectors]] and submit it via Upload system in time! Check the deadline in Upload system.