42 Pytania i odpowiedzi dotyczące wywiadu w Pythonie w czasie rzeczywistym [2022]

Spis treści:

Szykujesz się do rozmów rekrutacyjnych z Pythona? A może po prostu chcesz zweryfikować swoją wiedzę o tym języku? Nie ma problemu! W tym opracowaniu omówimy najczęściej pojawiające się zagadnienia w formie pytań i odpowiedzi.

Ten artykuł pomoże Ci zorientować się, jakie kwestie mogą być poruszane podczas rozmów kwalifikacyjnych. Stanowi też doskonałe narzędzie do samooceny Twoich umiejętności w Pythonie. Zanim przejrzysz nasze propozycje odpowiedzi, spróbuj samodzielnie rozwiązać wszystkie pytania. To pozwoli Ci realnie ocenić poziom Twojej wiedzy. Przejdźmy zatem do meritum.

Zestaw pytań został usystematyzowany w sekcje, z uwzględnieniem zakresu tematycznego. Każdy dział zawiera pytania wraz z przykładowymi odpowiedziami. Zachęcamy do modyfikowania tych odpowiedzi, tak aby brzmiały naturalnie i odzwierciedlały Twój sposób myślenia. Unikniesz tym samym wrażenia, że czytasz z kartki.

Podstawy języka Python

#1. Czym jest Python?

Python to interpretowany język programowania wysokiego poziomu, o szerokim spektrum zastosowań. Za pomocą Pythona, wykorzystując zewnętrzne biblioteki i frameworki, można tworzyć różnorodne aplikacje. Jest to jeden z najpopularniejszych języków w zaawansowanych dziedzinach technologii, takich jak sztuczna inteligencja (AI) czy analiza danych (Data Science).

#2. Jaka jest fundamentalna różnica między interpreterem a kompilatorem?

Interpreter przetwarza pojedynczą instrukcję na kod maszynowy, natomiast kompilator transformuje cały kod źródłowy do postaci kodu maszynowego za jednym razem.

#3. Czy Python to język statycznie czy dynamicznie typowany?

Python to język dynamicznie typowany.

#4. Co rozumiemy przez pojęcie „język dynamicznie typowany”?

W językach dynamicznie typowanych sprawdzanie typów zmiennych odbywa się w czasie wykonywania programu. Do tej kategorii zaliczamy m.in. Pythona, JavaScript oraz Ruby.

Bonus: W językach statycznie typowanych weryfikacja typów zmiennych ma miejsce w trakcie kompilacji. Przykłady języków statycznie typowanych to C++, C czy Java.

#5. Wymień kilka zastosowań Pythona.

Python cechuje się czytelną i łatwą do opanowania składnią, która przypomina język angielski. Posiada bardzo dużą społeczność użytkowników. Dostępnych jest wiele zewnętrznych bibliotek, które wspierają rozwój różnorodnych aplikacji. Python wykorzystywany jest przy tworzeniu aplikacji webowych, GUI (graficznych interfejsów użytkownika), a także aplikacji CLI (interfejsów wiersza poleceń).

Jednym z popularnych zastosowań Pythona jest automatyzacja. Możemy z łatwością tworzyć skrypty automatyzujące rutynowe zadania, takie jak czyszczenie dysku, wysyłanie e-maili czy pobieranie danych o cenach produktów.

Python jest również jednym z wiodących języków w obszarze Data Science.

#6. Jakie aplikacje stworzyłeś przy użyciu Pythona?

Napisałem szereg skryptów automatyzujących, aby wyeliminować powtarzalne i nużące zadania. Tworzyłem również skrypty do pobierania informacji o cenach produktów i ich dostępności.

Pracowałem także z frameworkami Django i Flask, przy budowie aplikacji internetowych. Wykorzystywałem oba frameworki do tworzenia różnych serwisów.

Uwaga: To jest tylko przykład. Twoja odpowiedź może być zupełnie inna. Skup się na różnych obszarach, w których wykorzystywałeś Pythona. Jeśli to możliwe, zaprezentuj konkretne projekty.

Typy Danych

#7. Jakie wbudowane typy danych istnieją w Pythonie?

Python oferuje szeroki zakres wbudowanych typów danych, takich jak: int (liczby całkowite), float (liczby zmiennoprzecinkowe), complex (liczby zespolone), bool (wartości logiczne), list (listy), tuple (krotki), set (zbiory), dict (słowniki), oraz str (łańcuchy znaków).

Uwaga: Nie musisz wymieniać wszystkich typów. Skoncentruj się na tych, z których najczęściej korzystasz. Osoba prowadząca rozmowę może dopytywać o szczegóły na podstawie Twojej odpowiedzi.

#8. Jaka jest różnica pomiędzy listą a krotką (tuple)?

Zarówno listy, jak i krotki służą do przechowywania kolekcji obiektów. Kluczowa różnica polega na tym, że lista jest obiektem mutowalnym, a krotka niemutowalnym.

#9. Czym są mutowalne i niemutowalne typy danych?

Mutowalne typy danych mogą być modyfikowane po ich utworzeniu. Przykłady mutowalnych obiektów w Pythonie to list, set i dict.

Niemutowalne typy danych nie mogą być zmieniane po ich utworzeniu. Przykłady niemutowalnych obiektów w Pythonie to str i tuple.

#10. Opisz wybrane metody listy.

1. append – służy do dodawania elementu na koniec listy.

>>> a = [1, 2]
>>> a.append(3)
>>> a
[1, 2, 3]

2. pop – służy do usuwania elementu z listy. Domyślnie usuwa ostatni element, ale można podać indeks, aby usunąć element z konkretnej pozycji.

>>> a = [1, 2, 3, 4, 5]
>>> a.pop()
5
>>> a
[1, 2, 3, 4]
>>> a.pop(1)
2
>>> a
[1, 3, 4]

3. remove – służy do usuwania pierwszego wystąpienia podanego elementu z listy.

>>> a = [1, 2, 2, 3, 4]
>>> a = [1, 2, 3, 2, 4]
>>> a.remove(1)
>>> a
[2, 3, 2, 4]
>>> a.remove(2)
>>> a
[3, 2, 4]

4. sort – sortuje elementy listy w porządku rosnącym lub malejącym.

>>> a = [3, 2, 4, 1]
>>> a.sort()
>>> a
[1, 2, 3, 4]
>>> a.sort(reverse=True)
>>> a
[4, 3, 2, 1]

5. reverse – odwraca kolejność elementów w liście.

>>> a = [3, 2, 4, 1]
>>> a.reverse()
>>> a
[1, 4, 2, 3]

Uwaga: Istnieją również inne metody, takie jak clear, insert, count, itp. Nie musisz omawiać wszystkich. Wystarczy zaprezentować dwie lub trzy najczęściej używane przez Ciebie metody.

#11. Opisz wybrane metody łańcuchów znaków (string).

1. split – dzieli łańcuch znaków w określonych miejscach, zwracając listę. Domyślnie dzieli łańcuch po spacjach. Można podać separator jako argument.

>>> a = "To jest newsblog.pl"
>>> a.split()
['To', 'jest', 'newsblog.pl']
>>> a = "1, 2, 3, 4, 5, 6"
>>> a.split(", ")
['1', '2', '3', '4', '5', '6']

2. join – łączy listę łańcuchów znaków w jeden łańcuch, używając podanego separatora.

>>> a = ['To', 'jest', 'newsblog.pl']
>>> ' '.join(a)
'To jest newsblog.pl'
>>> ', '.join(a)
'To, jest, newsblog.pl'

Uwaga: Istnieje wiele innych metod, takich jak capitalize, isalnum, isalpha, isdigit, lower, upper, center, itp.

#12. Na czym polega indeksowanie ujemne w listach?

Indeksowanie służy do uzyskiwania dostępu do elementów listy. Indeksowanie standardowe zaczyna się od 0.

Indeksowanie ujemne umożliwia dostęp do elementów od końca listy. Ostatni element ma indeks -1, przedostatni -2 i tak dalej, aż do początku listy.

>>> a = [1, 2, 3, 4, 5]
>>> a[-1]
5
>>> a[-3]
3
>>> a[-5]
1

#13. Opisz wybrane metody słowników (dict).

1. items – zwraca pary klucz-wartość w postaci listy krotek.

>>> a = {1: 'newsblog.pl', 2: 'newsblog.pl Tools', 3: 'newsblog.pl Online Compiler'}
>>> a.items()
dict_items([(1, 'Geekflare'), (2, 'Geekflare Tools'), (3, 'Geekflare Online Compiler')])

2. pop – służy do usuwania pary klucz-wartość ze słownika, przyjmując klucz jako argument.

>>> a = {1: 2, 2: 3}
>>> a.pop(2)
3
>>> a
{1: 2}

Uwaga: Dostępne są również inne metody, takie jak get, keys, values, clear, itp.

#14. Czym jest „slicing” w Pythonie?

„Slicing” umożliwia dostęp do fragmentu sekwencji danych. Zwraca podzbiór danych z sekwencji na podstawie podanych argumentów, zachowując typ danych oryginalnej sekwencji.

Slicing przyjmuje trzy argumenty: indeks początkowy, końcowy i krok. Składnia to: `zmienna[start:end:step]`. Argumenty nie są wymagane. Użycie pustego dwukropka (:) zwróci całą sekwencję.

>>> a = [1, 2, 3, 4, 5]
>>> a[:]
[1, 2, 3, 4, 5]
>>> a[:3]
[1, 2, 3]
>>> a[3:]
[4, 5]
>>> a[0:5:2]
[1, 3, 5]

#15. Na jakich typach danych można stosować „slicing”?

„Slicing” można stosować na typach danych list, tuple i str.

#16. Czym są operatory rozpakowywania w Pythonie? Jak z nich korzystać?

Operatory `*` i `**` są operatorami rozpakowywania w Pythonie.

Operator `*` służy do przypisywania wielu wartości z sekwencji do pojedynczych zmiennych.

>>> items = [1, 2, 3]
>>> a, b, c = items
>>> a
1
>>> b
2
>>> c
3
>>> a, *b = items
>>> a
1
>>> b
[2, 3]

Operator `**` stosowany jest z typem danych dict. Rozpakowywanie słowników działa inaczej niż w przypadku sekwencji.

Rozpakowywanie słowników jest najczęściej używane do kopiowania par klucz-wartość z jednego słownika do drugiego.

>>> a = {1:2, 3:4}
>>> b = {**a}
>>> b
{1: 2, 3: 4}
>>> c = {3:5, 5:6}
>>> b = {**a, **c}
>>> b
{1: 2, 3: 5, 5: 6}

Uwaga: Zachęcamy do zapoznania się z dodatkowymi materiałami, aby zgłębić ten temat.

Instrukcje Warunkowe i Pętle

#17. Czy Python posiada instrukcję switch?

Nie, Python nie ma wbudowanej instrukcji `switch`.

#18. Jak zaimplementować funkcjonalność instrukcji switch w Pythonie?

Funkcjonalność `switch` można zaimplementować za pomocą instrukcji `if` i `elif`.

>>> if a == 1:
...     print(...)
... elif a == 2:
...     print(....)

#19. Czym są instrukcje `break` i `continue`?

`break` – instrukcja `break` przerywa wykonanie aktualnej pętli. Program przechodzi do wykonywania kodu po pętli.

>>> for i in range(5):
...     if i == 3:
...             break
...     print(i)
...
0
1
2

`continue` – instrukcja `continue` pomija resztę kodu w aktualnej iteracji pętli i przechodzi do następnej iteracji.

>>> for i in range(5):
...     if i == 3:
...             continue
...     print(i)
...
0
1
2
4

#20. Kiedy kod w bloku `else` jest wykonywany z pętlami `while` i `for`?

Kod w bloku `else` po pętlach `while` i `for` jest wykonywany po zakończeniu wszystkich iteracji. Kod w bloku `else` nie jest wykonywany, gdy pętla zostanie przerwana instrukcją `break`.

#21. Czym są list comprehension i dict comprehension?

List comprehension (wyrażenia listowe) i dict comprehension (wyrażenia słownikowe) to skrócony zapis pętli `for`.

>>> a = [i for i in range(10)]
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> a = {i: i + 1 for i in range(10)}
>>> a
{0: 1, 1: 2, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}
>>>

#22. Jak działa funkcja `range`?

Funkcja `range` zwraca sekwencję liczb z określonego zakresu, z opcjonalnym krokiem. Składnia funkcji to `range(start, stop[, step])`.

Argument `stop` jest obowiązkowy. Argumenty `start` i `step` są opcjonalne. Domyślne wartości to 0 dla `start` i 1 dla `step`.

>>> list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list(range(1, 10))
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list(range(1, 10, 2))
[1, 3, 5, 7, 9]
>>>

Funkcje

#23. Czym są parametry i argumenty?

Parametry to nazwy zmiennych wymienione w definicji funkcji.

Argumenty to wartości przekazywane do funkcji podczas jej wywołania.

#24. Jakie są rodzaje argumentów w Pythonie?

Istnieją cztery główne rodzaje argumentów: argumenty pozycyjne, argumenty domyślne, argumenty słów kluczowych i argumenty arbitralne.

Argumenty pozycyjne: Są to standardowe argumenty, które definiujemy w funkcji. Wszystkie argumenty pozycyjne są wymagane podczas wywoływania funkcji.

>>> def add(a, b):
...     return a + b
...
>>> add(1, 2)
3
>>> add(1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: add() missing 1 required positional argument: 'b'
>>>

Argumenty domyślne: Podczas definiowania funkcji możemy przypisać domyślną wartość argumentom. Jeśli użytkownik nie przekaże wartości argumentu, użyta zostanie wartość domyślna.

>>> def add(a, b=3):
...     return a + b
...
>>> add(1, 2)
3
>>> add(1)
4

Argumenty słów kluczowych: Możemy określić nazwę argumentu podczas wywołania funkcji i przypisać mu wartość. Argumenty słów kluczowych pozwalają na uniknięcie konieczności zachowania kolejności argumentów, jak w przypadku argumentów pozycyjnych.

>>> def add(a, b):
...     print("a ", a)
...     print("b ", b)
...     return a + b
...
>>> add(b=4, a=2)
a  2
b  4
6

Argumenty arbitralne: Używamy argumentów arbitralnych, gdy nie wiemy, ile argumentów zostanie przekazanych do funkcji. W definicji funkcji stosujemy operatory `*` i `**` do zbierania argumentów.

>>> def add(*args):
...     return sum(args)
...
>>> add(1, 2, 3, 4, 5)
15
>>> def dict_args(**kwargs):
...     print(kwargs)
...
>>> dict_args(a="newsblog.pl", b='newsblog.pl Tools', c="newsblog.pl Online Compiler")
{'a': 'newsblog.pl', 'b': 'newsblog.pl Tools', 'c': 'newsblog.pl Online Compiler'}

#25. Czym jest funkcja lambda?

Funkcje lambda to małe, anonimowe funkcje w Pythonie. Mają postać pojedynczego wyrażenia i mogą przyjmować wiele argumentów.

>>> add = lambda a, b: a + b
>>> add(1, 3)
4

#26. Jaka jest różnica między funkcją standardową a funkcją lambda?

Funkcje standardowe i lambda mają podobną funkcjonalność. Jednak funkcje standardowe wymagają więcej kodu niż funkcje lambda, aby osiągnąć to samo.

Funkcje lambda są przydatne w przypadku prostych, pojedynczych wyrażeń.

#27. Do czego służy słowo kluczowe `pass`?

Słowo kluczowe `pass` służy do oznaczenia pustego bloku kodu. Python nie pozwala na pozostawienie bloków bez zawartości. Instrukcja `pass` umożliwia zdefiniowanie pustego bloku, który można wypełnić kodem w przyszłości.

>>> def add(*args):
...
...
  File "<stdin>", line 3

    ^
IndentationError: expected an indented block
>>> def add(*args):
...     pass
...
>>>

#28. Czym jest funkcja rekurencyjna?

Funkcja rekurencyjna to funkcja, która wywołuje samą siebie.

Czym są operatory pakowania w Pythonie? Jak z nich korzystać?

Operatory pakowania służą do gromadzenia wielu argumentów w funkcjach. Są znane również jako argumenty arbitralne.

Uwaga: Zachęcamy do zapoznania się z dodatkowymi materiałami, aby uzyskać więcej informacji na temat operatorów pakowania.

Programowanie Obiektowe w Pythonie (OOP)

#29. Jakie słowo kluczowe służy do tworzenia klas w Pythonie?

Słowo kluczowe `class` służy do tworzenia klas w Pythonie. Zgodnie z konwencją, nazwy klas powinny być zapisywane w notacji PascalCase.

>>> class Car:
...     pass
...

#30. Jak utworzyć instancję klasy w Pythonie?

Instancję klasy tworzymy poprzez jej wywołanie, podobnie jak funkcję. Możemy przekazać argumenty do obiektu w taki sam sposób, jak do funkcji.

>>> class Car:
...     def __init__(self, color):
...             self.color = color
...
>>> red_car = Car('red')
>>> red_car.color
'red'
>>> green_car = Car('green')
>>> green_car.color
'green'
>>>

#31. Czym jest `self` w Pythonie?

`self` reprezentuje instancję (obiekt) klasy. Pozwala na dostęp do atrybutów i metod obiektu wewnątrz klasy.

#32. Czym jest metoda `__init__`?

`__init__` to metoda konstruktora, podobna do konstruktorów w innych językach OOP. Jest wykonywana automatycznie podczas tworzenia obiektu klasy. Służy do inicjalizacji początkowych danych obiektu.

#33. Czym jest docstring w Pythonie?

Docstring (ciąg dokumentacyjny) służy do dokumentowania bloków kodu. Może być również używany jako komentarz wieloliniowy.

Docstring w metodach klasy opisuje działanie danej metody. Można go wyświetlić za pomocą funkcji `help`.

>>> class Car:
...     def __init__(self, color):
...             self.color = color
...
...     def change_color(self, updated_color):
...             """Ta metoda zmienia kolor samochodu"""
...             self.color = updated_color
...
>>> car = Car('red')
>>> help(car.change_color)
Help on method change_color in module __main__:

change_color(updated_color) method of __main__.Car instance
    Ta metoda zmienia kolor samochodu

>>>

#34. Czym są metody dunder lub magiczne?

Metody, których nazwy zaczynają się i kończą dwoma znakami podkreślenia, są nazywane metodami dunder lub magicznymi. Służą one głównie do przeciążania operatorów. Przykłady metod, które możemy nadpisać w klasach to __str__, __len__, __setitem__, __getitem__, itp.

>>> class Car:
...     def __str__(self):
...             return "To jest klasa Car"
...
>>> car = Car()
>>> print(car)
To jest klasa Car
>>>

Uwaga: Istnieje wiele innych metod, które można nadpisać. Przydają się, gdy chcemy szczegółowo dostosować działanie kodu. Zachęcamy do zapoznania się z dokumentacją.

#35. Jak zaimplementować dziedziczenie w Pythonie?

Klasę nadrzędną przekazujemy jako argument do definicji klasy potomnej. W klasie potomnej możemy wywołać metodę `__init__` klasy nadrzędnej.

>>> class Animal:
...     def __init__(self, name):
...             self.name = name
...
>>> class Animal:             e):
...     def __init__(self, name):
...             self.name = name
...
...     def display(self):
...             print(self.name)
>>> class Dog(Animal):        e):ame)
...     def __init__(self, name):
...             super().__init__(name)
...
>>> doggy = Dog('Tommy')
>>> doggy.display()
Tommy
>>>

#36. Jak uzyskać dostęp do klasy nadrzędnej w klasie potomnej w Pythonie?

Możemy użyć funkcji `super()`, która odnosi się do klasy nadrzędnej wewnątrz klasy potomnej. Umożliwia ona dostęp do atrybutów i metod klasy nadrzędnej.

Różne

#37. Jak używać komentarzy jedno- i wieloliniowych w Pythonie?

Komentarze jednowierszowe zaczynają się od znaku `#`. Komentarze wieloliniowe umieszczamy pomiędzy potrójnymi pojedynczymi cudzysłowami (`”’komentarz”’`) lub potrójnymi podwójnymi cudzysłowami (`”””komentarz”””`).

#38. Czym jest obiekt w Pythonie?

Wszystko w Pythonie jest obiektem. Wszystkie typy danych, funkcje i klasy są obiektami.

#39. Jaka jest różnica między `is` i `==`?

Operator `==` sprawdza, czy dwa obiekty mają tę samą wartość. Operator `is` sprawdza, czy dwa obiekty odnoszą się do tego samego miejsca w pamięci.

>>> a = []
>>> b = []
>>> c = a
>>> a == b
True
>>> a is b
False
>>> a is c
True
>>>

#40. Czym jest kopia płytka (shallow copy) i głęboka (deep copy)?

Kopia płytka: tworzy kopię obiektu, ale bez kopiowania referencji obiektów. Zarówno kopia, jak i oryginał odnoszą się do tych samych referencji. Zmiana jednego obiektu wpłynie więc na drugi.

Do utworzenia płytkiej kopii używamy funkcji `copy` z modułu `copy`.

>>> from copy import copy
>>> a = [1, [2, 3]]
>>> b = copy(a)
>>> a[1].append(4)
>>> a
[1, [2, 3, 4]]
>>> b
[1, [2, 3, 4]]

Kopia głęboka: kopiuje wartości oryginalnego obiektu rekursywnie do nowego obiektu. Aby utworzyć głęboką kopię, należy użyć funkcji `deepcopy` z modułu `copy` lub zastosować slicing.

>>> from copy import deepcopy
>>> a = [1, [2, 3]]
>>> b = deepcopy(a)
>>> a[1].append(4)
>>> a
[1, [2, 3, 4]]
>>> b
[1, [2, 3]]
>>> b[1].append(5)
>>> a
[1, [2, 3, 4]]
>>> b
[1, [2, 3, 5]]
>>>

#41. Czym są iteratory?

Iteratory to obiekty w Pythonie, które pamiętają swój stan iteracji. Inicjują dane metodą `__iter__` i zwracają kolejny element metodą `__next__`.

Do pobrania kolejnego elementu z iteratora, należy wywołać funkcję `next(iterator)`. Typ danych sekwencyjnych można przekształcić w iterator za pomocą wbudowanej metody `iter`.

>>> a = [1, 2]
>>> iterator = iter(a)
>>> next(iterator)
1
>>> next(iterator)
2
>>> next(iterator)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>>

#42. Czym są generatory?

Generatory to funkcje, które zwracają iterator w postaci obiektu generatora. Używają słowa kluczowego `yield` do generowania danych.

>>> def numbers(n):
...     for i in range(1, n + 1):
...             yield i
...
>>> _10 = numbers(10)
>>> next(_10)
1
>>> next(_10)
2
>>> next(_10)
3
>>> next(_10)
4

Podsumowanie 👨‍💻

Pytania rekrutacyjne nie ograniczają się do tych, które zostały przedstawione w tym artykule. Nasze opracowanie ma na celu pokazanie, jak mogą wyglądać różnorodne pytania z różnych tematów związanych z Pythonem. Warto jednak pamiętać, że zakres potencjalnych pytań jest znacznie szerszy.

Jednym z efektywnych sposobów na przygotowanie się do rozmowy kwalifikacyjnej jest zadawanie sobie pytań z różnych dziedzin. Staraj się formułować pytania w oparciu o poznane koncepcje i samodzielnie na nie odpowiadać. Dzięki temu unikniesz zaskoczenia podczas rozmowy rekrutacyjnej. Zachęcamy również do ćwiczenia kodu z pomocą internetowych kompilatorów Pythona.

Życzymy powodzenia na zbliżającej się rozmowie kwalifikacyjnej z Pythona!


newsblog.pl