Wizualizacja danych
- Wykład 5

Funkcje

Funkcje

def functionname( parameters ):
   "function_docstring"
   function_suite
   return [expression]
def printme(str):
    """Funkcja wyświetlająca string"""
    print(str)
    return


printme("abc")
print(printme.__doc__)
abc
Funkcja wyświetlająca string

Przekazywanie przez referencję

def changeme(lista):
    print("Przed zmianą: ", lista)
    lista[2] = 50
    print("Po zmianie: ", lista)
    return


mylist = [10, 20, 30]
changeme(mylist)
print("Poza funkcją: ", mylist)
Przed zmianą:  [10, 20, 30]
Po zmianie:  [10, 20, 50]
Poza funkcją:  [10, 20, 50]
def changeme(lista):
    lista = [2, 3, 4]
    print("Wewnątrz funkcji: ", lista)
    return


lista = [10, 20, 30]
changeme(lista)
print("Poza funkcją: ", lista)
Wewnątrz funkcji:  [2, 3, 4]
Poza funkcją:  [10, 20, 30]
def changeme():
    global lista
    lista = [2, 3, 4]
    print("Wewnątrz funkcji: ", lista)
    return


changeme()
print("Poza funkcją: ", lista)
Wewnątrz funkcji:  [2, 3, 4]
Poza funkcją:  [2, 3, 4]

Obowiązkowy argument (ang. positional argument)

def printme(str):
    print(str)
    return


printme()
## TypeError: printme() missing 1 required 
positional argument: 'str'

Keyword argument

def kwadrat(a):
    return a*a


print(kwadrat(a=4))
16

Domyślny argument

def sumsub(a, b, c=0, d=0):
    return a - b + c - d


print(sumsub(12, 4))
print(sumsub(3, 4, 5, 7))
8
-3
def srednia(first, *values):
    return (first + sum(values)) / (1 + len(values))


print(srednia(2, 3, 4, 6))
print(srednia(45))
3.75
45.0
def f(**kwargs):
    print(kwargs)


f()
f(pl="Polish", en="English")
{}
{'pl': 'Polish', 'en': 'English'}

Inne symbole

  • symbol / oznacza, że wcześniejsze argumenty są pozycyjne
  • symbol * oznacza, że późniejszej argumenty są typu keyword
def f(a, b, /, c, d, *, e, f):
    print(a, b, c, d, e, f)


f(10, 20, 30, d=40, e=50, f=60)
10 20 30 40 50 60

Funkcje matematyczne

Link do dokumentacji https://docs.python.org/3/library/math.html

import math

a=0
b=math.sin(2*math.pi)
print(b)
print(math.isclose(a,b, rel_tol=1e-09, abs_tol=1e-09))
-2.4492935982947064e-16
True

Wyrażenia lambda

Skąd nazwa? https://pl.wikipedia.org/wiki/Rachunek_lambda

Wyrażenie

def identity(x):
    return x

zapisujemy jako

lambda x: x

Jeśli uruchomimy to w konsoli, to możemy wywołać

_(5)

To tzw. przykład funkcji anonimowej.

By uruchomić to też w skrypcie, to potrzebujemy argumentu:

print((lambda x: x + 1)(2))

lub

add_one = lambda x: x + 1
print(add_one(2))

Możemy też tworzyć złożenia funkcji (funkcje wyższych rzędów):

high_ord_func = lambda x, func: x + func(x)
print(high_ord_func(2, lambda x: x * x))
print(high_ord_func(2, lambda x: x + 3))
6
7

Możemy również skorzystać z różnych opcji argumentów jak dla funkcji:

print((lambda x, y, z: x + y + z)(1, 2, 3))
print((lambda x, y, z=3: x + y + z)(1, 2))
print((lambda x, y, z=3: x + y + z)(1, y=2))
print((lambda *args: sum(args))(1,2,3))
print((lambda **kwargs: sum(kwargs.values()))(one=1, two=2, three=3))
print((lambda x, *, y=0, z=0: x + y + z)(1, y=2, z=3))
6
6
6
6
6
6

Typ

string = 'abc'
print(lambda string: string)
<function <lambda> at 0x0000017D75EF1120>

Różnice względem zwykłej funkcji:

def cube(y):
    print(f"Finding cube of number:{y}")
    return y * y * y
  
lambda_cube = lambda num: num ** 3
print("invoking function defined with def keyword:")
print(cube(30))
print("invoking lambda function:", lambda_cube(30))
invoking function defined with def keyword:
Finding cube of number:30
27000
invoking lambda function: 27000

Przykłady praktyczne

r = lambda a: a + 15
print(r(10))
r = lambda x, y: x * y
print(r(12, 4))
25
48
subject_marks = [('English', 88), ('Science', 90), ('Maths', 97), ('Social sciences', 82)]
print("Original list of tuples:")
print(subject_marks)
subject_marks.sort(key=lambda x: x[1])
print("\nSorting the List of Tuples:")
print(subject_marks)
Original list of tuples:
[('English', 88), ('Science', 90), ('Maths', 97), ('Social sciences', 82)]

Sorting the List of Tuples:
[('Social sciences', 82), ('English', 88), ('Science', 90), ('Maths', 97)]
nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print("Original list of integers:")
print(nums)
print("\nEven numbers from the said list:")
even_nums = list(filter(lambda x: x % 2 == 0, nums))
print(even_nums)
print("\nOdd numbers from the said list:")
odd_nums = list(filter(lambda x: x % 2 != 0, nums))
print(odd_nums)
Original list of integers:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Even numbers from the said list:
[2, 4, 6, 8, 10]

Odd numbers from the said list:
[1, 3, 5, 7, 9]
array_nums1 = [1, 2, 3, 5, 7, 8, 9, 10]
array_nums2 = [1, 2, 4, 8, 9]
print("Original arrays:")
print(array_nums1)
print(array_nums2)
result = list(filter(lambda x: x in array_nums1, array_nums2))
print("\nIntersection of the said arrays: ", result)
Original arrays:
[1, 2, 3, 5, 7, 8, 9, 10]
[1, 2, 4, 8, 9]

Intersection of the said arrays:  [1, 2, 8, 9]

“Obiektowość”

Programowanie obiektowe w Pythonie

Lego jako model programowanie obiektowego

class Employee:
    """Common base class for all employees"""
    empCount = 0

    def __init__(self, name, salary):
        self.name = name
        self.salary = salary
        Employee.empCount += 1

    def displayCount(self):
        print("Total Employee %d" % Employee.empCount)

    def displayEmployee(self):
        print("Name : ", self.name, ", Salary: ",
              self.salary)


emp1 = Employee("John", 2000)
emp2 = Employee("Anna", 5000)
emp1.displayEmployee()
emp2.displayEmployee()
Name :  John , Salary:  2000
Name :  Anna , Salary:  5000