====== Computer Lab 06, modules, namespaces, conventions ======
Prepare for the midterm test! Its content may be based on all the topics covered so far.
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 name 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
==== Built-in Modules ====
=== random ===
import random
# create random number generator object
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 uniformly from a range [0, 1)
float_0_1 = rng.random()
# randomly shuffle list
cards = [0, 1, 2, 3, 4, 5, 6]
rng.shuffle(cards)
print(f"{dice_throw}; {odd_number}; {float_0_1}; {cards}")
=== math ===
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)
===== Exercises =====
* **task 1:** Simulate throwing a dice 6000 times. Produce a list (of length 6) with frequency of each outcome (1-6).
* **task 2:** Evaluate $f(x)= \sin(2x) \cos(2x) - \tan(x/2)$ for $x=45$ degrees.
* **task 3:** Evaluate $\sqrt{x^2+y^2}$ for $x=2$, $y=100$.
* **task 4:** 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}}$
===== 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}$
{{:courses:be5b33prg:labs:aproximations.png?nolink&600|}}
* 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.
def get_trig_series(lst):
"""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.
===== Graded Homework 03 =====
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.