def printme(str):
"""Funkcja wyświetlająca string"""
print(str)
return
printme("abc")
print(printme.__doc__)
abc
Funkcja wyświetlająca string
Ale trzeba pamiętać podział typów:
## TypeError: printme() missing 1 required
positional argument: 'str'
/
oznacza, że wcześniejsze argumenty są pozycyjne*
oznacza, że późniejszej argumenty są typu keywordLink do dokumentacji https://docs.python.org/3/library/math.html
Skąd nazwa? https://pl.wikipedia.org/wiki/Rachunek_lambda
Wyrażenie
zapisujemy jako
lambda x: x
Jeśli uruchomimy to w konsoli, to możemy wywołać
To tzw. przykład funkcji anonimowej.
By uruchomić to też w skrypcie, to potrzebujemy argumentu:
lub
Możemy też tworzyć złożenia funkcji (funkcje wyższych rzędów):
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
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
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]
W Pythonie callable to termin odnoszący się do obiektów, które można “wywołać” (ang. call) jako funkcje. W praktyce oznacza to, że obiekt może być użyty z nawiasami okrągłymi i potencjalnie przyjmować argumenty.
Przykład prosty:
yield
- leniwe wyrzucanieSłowo kluczowe yield
jest używane w funkcjach generatorów. Generator to specjalny rodzaj iteratora, który pozwala na iterowanie (przechodzenie) przez sekwencję wartości w sposób leniwy, co oznacza, że wartości są generowane na żądanie, a nie na początku. (leniwe wyrzucanie)
Gdy generator napotyka słowo kluczowe yield, zwraca wartość po yield i wstrzymuje wykonywanie, pamiętając swój stan. Wywołanie funkcji next() na iteratorze sprawia, że generator wznowi działanie od miejsca, w którym się zatrzymał, aż napotka kolejne słowo kluczowe yield lub zakończy działanie.
import math
def is_prime(num):
if num <= 1:
return False
for i in range(2, int(math.sqrt(num)) + 1):
if num % i == 0:
return False
return True
def prime_number_generator():
num = 2
while True:
if is_prime(num):
yield num
num += 1
# Użycie generatora
primes = prime_number_generator()
for _ in range(10): # Wypiszemy pierwsze 10 liczb pierwszych
print(next(primes))
2
3
5
7
11
13
17
19
23
29
type hinting
Typowanie tzw. calli
Typowanie generatorów:
Kilka różnych typów: