Wprowadzenie do Pythona

Wprowadzenie

Witamy w internetowym samouczku Google Python. Opieramy się na wewnętrznym kursie Pythona dla początkujących. Jak wspomnieliśmy na stronie konfiguracji, ten materiał dotyczy Pythona 3.

Jeśli szukasz dodatkowego kursu MOOC, skorzystaj z kursów Udacity i Coursera (wprowadzenie do programowania [początkujący] lub wprowadzenie do Pythona). Jeśli chcesz poćwiczyć w trybie online bez oglądania filmów, wypróbuj te, które znajdziesz na końcu tego posta. Znajdziesz w nich materiały edukacyjne oraz interaktywne tłumacza Pythona, z którym możesz poćwiczyć. O czym nazywamy „tłumaczenie”? Dowiesz się tego w następnej sekcji.

Wprowadzenie do języka

Python to dynamiczny język interpretowany (z skompilowanym kodem bajtowym). W kodzie źródłowym nie ma deklaracji typu zmiennych, parametrów, funkcji ani metod. Dzięki temu kod źródłowy jest krótki i elastyczny, a Ty tracisz możliwość sprawdzania typu kodu źródłowego w czasie kompilacji. Python śledzi typy wszystkich wartości w czasie działania i koduje kod flag, który nie ma sensu w trakcie jego działania.

Doskonałym sposobem na to, aby zobaczyć, jak działa kod w Pythonie, jest uruchomienie interpretera Pythona i wpisanie bezpośrednio w nim kodu. Jeśli masz jakieś pytanie, na przykład „Co się stanie, gdy dodam int do list?”. Wystarczy, że wpiszesz je w Tłumaczu w Pythonie. To szybki i prawdopodobnie najlepszy sposób na sprawdzenie, co się stanie. (Poniżej dowiesz się, co tak naprawdę się dzieje).

$ python3        ## Run the Python interpreter
Python 3.X.X (XXX, XXX XX XXXX, XX:XX:XX) [XXX] on XXX
Type "help", "copyright", "credits" or "license" for more information.
>>> a = 6       ## set a variable in this interpreter session
>>> a           ## entering an expression prints its value
6
>>> a + 2
8
>>> a = 'hi'    ## 'a' can hold a string just as well
>>> a
'hi'
>>> len(a)      ## call the len() function on a string
2
>>> a + len(a)  ## try something that doesn't work
Traceback (most recent call last):
  File "", line 1, in 
TypeError: can only concatenate str (not "int") to str
>>> a + str(len(a))  ## probably what you really wanted
'hi2'
>>> foo         ## try something else that doesn't work
Traceback (most recent call last):
  File "", line 1, in 
NameError: name 'foo' is not defined
>>> ^D          ## type CTRL-d to exit (CTRL-z in Windows/DOS terminal)

Dwa wiersze w Pythonie są wyświetlane po wpisaniu tego języka, a przed znakiem zapytania >>> informują o używanej wersji tego języka i miejscu jego utworzenia. Te przykłady powinny Ci się spodobać, o ile najpierw wydrukujesz „Python 3”.

Jak widać powyżej, łatwo jest eksperymentować ze zmiennymi i operatorami. Dodatkowo, jeśli kod próbuje odczytać zmienną, której nie przypisano wartości, interpreter zgłasza błąd w języku Python (tzw. „raises”) – błąd środowiska wykonawczego. Podobnie jak w językach C++ i Java, w Pythonie wielkość liter jest rozróżniana, więc litery „a” i „A” to różne zmienne. Koniec wiersza oznacza koniec instrukcji, więc w przeciwieństwie do C++ i Javy Python nie wymaga średnika na końcu każdej instrukcji. Komentarze zaczynają się od znaku „#” i kończą na końcu wiersza.

Kod źródłowy Pythona

Pliki źródłowe Pythona mają rozszerzenie „.py” i są nazywane „modułami”. Jeśli używasz modułu Pythona hello.py, najprostszym sposobem jego uruchomienia jest polecenie powłoki „python hello.py Alice”, które wywołuje interpreter Pythona w celu wykonania kodu w hello.py i przekazuje mu argument wiersza poleceń „Alice”. Informacje o wszystkich opcjach dostępnych podczas uruchamiania Pythona z wiersza poleceń znajdziesz na oficjalnej stronie dokumentacji.

Oto bardzo prosty program w hello.py (pamiętaj, że bloki kodu są rozdzielane tylko za pomocą wcięć, a nie nawiasów klamrowych – o tym więcej dowiesz się później):

#!/usr/bin/python3

# import modules used here -- sys is a very standard one
import sys

# Gather our code in a main() function
def main():
    print('Hello there', sys.argv[1])
    # Command line args are in sys.argv[1], sys.argv[2] ...
    # sys.argv[0] is the script name itself and can be ignored

# Standard boilerplate to call the main() function to begin
# the program.
if __name__ == '__main__':
    main()

Uruchomienie tego programu z poziomu wiersza poleceń wygląda tak:

$ python3 hello.py Guido
Hello there Guido
$ ./hello.py Alice  ## without needing 'python3' first (Unix)
Hello there Alice

Importy, argumenty wiersza poleceń i len()

Najbardziej zewnętrzne instrukcje w pliku (czyli „module” Pythona) przeprowadzają swoją jednorazową konfigurację – uruchamiają się one od góry do dołu podczas pierwszego importowania modułu, konfigurując zmienne i funkcje. Moduł Pythona można uruchomić bezpośrednio – tak jak powyżej python3 hello.py Bob – lub zaimportować go i używać przez inny moduł. W przypadku bezpośredniego uruchamiania pliku Pythona specjalna zmienna „__name__” jest ustawiona na „__main__”. Często widoczny powyżej kod if __name__ ==... służy do wywoływania funkcji main() w przypadku, gdy moduł jest uruchamiany bezpośrednio, ale nie w przypadku importu przez inny moduł.

W standardowym programie w Pythonie lista sys.argv zawiera argumenty wiersza poleceń w standardowy sposób, gdzie sys.argv[0] to sam program, sys.argv[1] pierwszym argumentem itd. Jeśli znasz właściwość argc, czyli liczbę argumentów, możesz po prostu zażądać tej wartości od Pythona za pomocą len(sys.argv), tak jak w przypadku żądania długości ciągu znaków w interaktywnym kodzie interpretacyjnym powyżej. Ogólnie funkcja len() informuje o długości ciągu, liczbie elementów na listach i kropkach (innej strukturze danych przypominającej tablicę) oraz o liczbie par klucz-wartość w słowniku.

Funkcje zdefiniowane przez użytkownika

Funkcje w Pythonie są definiowane w ten sposób:

# Defines a "repeat" function that takes 2 arguments.
def repeat(s, exclaim):
    """
    Returns the string 's' repeated 3 times.
    If exclaim is true, add exclamation marks.
    """

    result = s + s + s # can also use "s * 3" which is faster (Why?)
    if exclaim:
        result = result + '!!!'
    return result

Zwróć też uwagę na to, że wiersze tworzące funkcję lub instrukcję if są grupowane według tego samego poziomu wcięcia. Zaprezentowaliśmy też 2 różne sposoby powtarzania ciągów znaków – operator + jest łatwiejszy w użyciu, ale * działa też, bo jest to operator „Powtórz” w Pythonie, co oznacza, że '-' * 10 zapewnia '----------', czyli wygodny sposób na tworzenie „wiersza” na ekranie. W komentarzu do kodu wskazaliśmy, że * działa szybciej niż +, bo znak * oblicza wielkość wynikowego obiektu raz, natomiast użycie znaku + powoduje wykonanie obliczenia przy każdym wywołaniu +. Zarówno operatory „+”, jak i „*” są nazywane „przeciążonymi”, ponieważ mają różne znaczenie w przypadku liczb, a różne w przypadku ciągów tekstowych (i innych typów danych).

Słowo kluczowe def definiuje funkcję, dodając jej parametry w nawiasach kwadratowych i stosując wcięcie kodu. Pierwszy wiersz funkcji może być ciągiem dokumentacji („docstring”), który opisuje jej funkcję. Ciąg dokumentu może być pojedynczym wierszem lub wielowierszowym opisem, jak w przykładzie powyżej. (Tak, to „potrójne cudzysłowy” – funkcja dostępna tylko w Pythonie). Zmienne zdefiniowane w funkcji są lokalne dla tej funkcji, więc „wynik” w powyższej funkcji jest oddzielony od zmiennej „result” w innej funkcji. Instrukcja return może przyjmować argument. W takim przypadku jest to wartość zwrócona elementowi wywołującemu.

Oto kod, który wywołuje powyższą funkcjęRepeat(), drukując zwracaną wartość:

def main():
    print(repeat('Yay', False))      ## YayYayYay
    print(repeat('Woo Hoo', True))   ## Woo HooWoo HooWoo Hoo!!!

W czasie działania funkcje muszą być zdefiniowane przez wykonanie polecenia „def”, zanim zostaną wywołane. Jest to typowa definicja funkcji main() umieszczonej w dolnej części pliku przez funkcje wywoływane nad nią.

Wcięcie

Jedną z nietypowych funkcji Pythona jest to, że wcięcie fragmentu kodu wpływa na jego znaczenie. Logiczny blok instrukcji, takich jak te, które składają się na funkcję, powinien mieć takie samo wcięcie ustawione na podstawie wcięcia funkcji nadrzędnej lub parametru „if”. Jeśli jeden z wierszy w grupie ma inne wcięcie, jest oznaczany jako błąd składni.

Sposób użycia odstępów w Pythonie wydaje się na początku dziwny, ale jest to logiczne i szybko udało mi się do tego przyzwyczaić. Unikaj korzystania z kart, ponieważ znacznie komplikują one schemat wcięcia (nie wspominając o kartach, które mogą oznaczać różne rzeczy na różnych platformach). Skonfiguruj edytor tak, aby w kodzie Pythona wstawiał spacje zamiast tabulatorów.

Początkujący twórcy często zastanawiają się, ile spacji należy dodać do tabeli. Zgodnie z oficjalnym przewodnikiem po stylu Python (PEP 8) wcięcie należy dodać do 4 spacji. (Ciekawostka: wewnętrzne wytyczne Google dotyczące stylu wymagają wcięcia tekstu o 2 spacje).

Kod sprawdzony w środowisku wykonawczym

Python wykonuje bardzo mało kontroli podczas kompilacji, odroczając niemal wszystkie typy, nazwy itp. do każdego wiersza, dopóki ten wiersz nie zostanie uruchomiony. Załóżmy, że powyższa funkcja main() wywołuje funkcję powtórzenia w następujący sposób:

def main():
    if name == 'Guido':
        print(repeeeet(name) + '!!!')
    else:
        print(repeat(name))

Instrukcja if zawiera oczywisty błąd, w wyniku którego funkcja powtórzenia została przypadkowo wpisana jako repeeeet(). Co zabawne w Pythonie ... ten kod kompiluje się i działa prawidłowo, o ile nazwa w czasie działania to nie „Guido”. Dopiero gdy uruchomienie rzeczywiście spróbuje wykonać repeeeet(), zauważy, że nie ma takiej funkcji, i zgłosi błąd. Ten fragment zawiera też drugi błąd. do nazwy nie przypisano wartości przed jej porównaniem z „Guido”. Jeśli spróbujesz ocenić nieprzypisaną zmienną, Python zwróci błąd „NameError”. Oto kilka przykładów pokazujących, że przy pierwszym uruchomieniu programu w Pythonie niektóre z pierwszych błędów, które zobaczysz, będą proste literówki lub niezainicjowane zmienne, takie jak te. Jest to jeden z obszarów, w których języki z bardziej szczegółowym systemem typów (np. Java) mają tę przewagę. Mogą wychwytywać takie błędy podczas kompilacji (oczywiście trzeba zachować wszystkie informacje tego typu – to kompromis).

W Pythonie 3 wprowadzono wskazówki dotyczące typu. Wskazówki dotyczące typu pozwalają wskazać typ każdego argumentu funkcji oraz typ obiektu zwracanego przez funkcję. Na przykład w funkcji def is_positive(n: int) -> bool: z adnotacjami argument n to int, a wartość zwracana to bool. Znaczenie tych typów omówimy później. Wskazówki dotyczące typu są jednak całkowicie opcjonalne. Coraz więcej wskazówek dotyczących typu przystosowania kodu do kodu, ponieważ jeśli ich używasz, niektóre edytory (np. cider-v czy VS.code) mogą uruchamiać testy w celu sprawdzenia, czy funkcje są wywoływane z użyciem odpowiednich typów argumentów. Mogą nawet sugerować i weryfikować argumenty podczas edytowania kodu. Ten samouczek nie obejmuje wskazówek dotyczących typów, ale chcemy mieć pewność, że o nich słyszysz lub natykasz się na łonie natury.

Nazwy zmiennych

W kodzie źródłowym nie określono żadnego typu zmiennych Pythona, warto więc nadawać im zrozumiałe nazwy, aby przypomnieć sobie, co się dzieje. Dlatego użyj słowa „name”, jeśli jest to pojedyncza nazwa, i „nazw”, jeśli jest to lista nazw, lub „kropek”, jeśli jest to lista krotek. Wiele podstawowych błędów Pythona wynika z zapomnienia typu wartości zawartej w każdej zmiennej, dlatego używaj nazw zmiennych (w tym celu wszystko, co naprawdę masz).

Jeśli chodzi o faktyczne nazewnictwo, niektóre języki wolą używać znaku podkreślenia w przypadku nazw zmiennych składających się z „więcej niż jednego słowa”, ale w przypadku innych języków wolimy używać wielbłądów. Ogólnie rzecz biorąc, w Pythonie w języku Python preferowana jest metoda podkreślania, ale w przypadku integracji z dotychczasowym kodem w Pythonie, który już korzysta z tego stylu, zalecam deweloperom odwracanie się do CamelCasing. Liczy się czytelność. Więcej informacji znajdziesz w sekcji poświęconej konwencjom nazewnictwa na PEP 8.

Jak łatwo się domyślić, słów kluczowych takich jak „if” i „gdy” nie można używać jako nazw zmiennych – w takiej sytuacji pojawi się błąd składni. Pamiętaj jednak, aby nie używać wbudowanych nazw zmiennych. Na przykład nazwy „str”, „lista” i „print” mogą wydawać się dobrymi nazwami, jednak te zmienne systemowe są zastąpione. Wbudowane rozszerzenia nie są słowami kluczowymi, więc mogą zostać przypadkowo wykorzystane przez nowych programistów Pythona.

Więcej informacji o modułach i ich przestrzeniach nazw

Załóżmy, że masz moduł „binky.py” zawierający funkcję „def foo()”. Pełna nazwa tej funkcji foo to „binky.foo”. Dzięki temu różne moduły Pythona mogą dowolnie nazywać swoje funkcje i zmienne, a nazwy zmiennych nie będą się kolidować – parametr mode1.foo różni się od parametru „module2.foo”. W słowniczce Pythona zapowiedzieliśmy, że binky, module1 i module2 mają swoje własne „przestrzenie nazw”, które jak się domyślasz, są wiązaniami zmiennych nazwa-obiekt.

Mamy na przykład standardowy moduł „sys”, który zawiera standardowe opcje systemowe, takie jak lista argv i funkcja exit(). Instrukcja „import sys” pozwala uzyskać dostęp do definicji w module Sys i udostępnić je pod ich pełną i jednoznaczną nazwą, np. sys.exit(). (Tak, „sys” też ma przestrzeń nazw!)

  import sys

  # Now can refer to sys.xxx facilities
  sys.exit(0)

Istnieje inny formularz importu, który wygląda tak: „z polecenia importu sys-import, wyjdź”. Dzięki temu argumenty argv i exit() są dostępne w krótkich nazwach. Zalecamy jednak wersję oryginalną z pełnymi nazwami, ponieważ dużo łatwiej jest określić, skąd pochodzą funkcje lub atrybuty.

Wiele modułów i pakietów jest dostarczanych do standardowej instalacji interpretera Pythona, więc nie trzeba niczego robić, aby z nich korzystać. Biblioteki te są łącznie nazywane „standardową biblioteką w Pythonie”. Najczęściej używane moduły/pakiety to:

  • sys – dostęp do wyjścia(), argv, stdin, stdout, ...
  • re – wyrażenia regularne
  • system operacyjny – interfejs systemu operacyjnego, system plików

Dokumentację wszystkich modułów i pakietów standardowej biblioteki można znaleźć na stronie http://docs.python.org/library.

Pomoc online, help() i dir()

Pomoc dotyczącą Pythona możesz uzyskać na różne sposoby.

  • Przeprowadź wyszukiwanie w Google, zaczynając od słowa „python”, np. „lista python” lub „małe litery w ciągu python”. Odpowiedzią często jest pierwsze trafienie. Z jakiegoś powodu ta technika działa lepiej w przypadku Pythona niż w przypadku innych języków.
  • Oficjalna strona z dokumentami Pythona – docs.python.org – zawiera dokumenty wysokiej jakości. Mimo to często znajduję w Google kilka słów, które przyspieszają ten proces.
  • Dostępna jest też oficjalna lista adresowa Tutor przeznaczona dla osób, które dopiero zaczynają przygodę z Pythonem lub programowaniem.
  • Wiele pytań i odpowiedzi znajdziesz na stronach StackOverflow i Quora.
  • Użyj funkcji help() i dir() (patrz poniżej).

Wewnątrz interpretera Pythona funkcja help() pobiera ciągi dokumentacji dotyczące różnych modułów, funkcji i metod. Te ciągi dokumentów są podobne do plików javadoc. Funkcja dir() informuje, jakie są atrybuty obiektu. Poniżej znajdziesz kilka sposobów na wywoływanie funkcji help() i dir() w interpreterze:

  • help(len) – ciąg pomocy dla wbudowanej funkcji len(); pamiętaj, że to „len”, a nie „len()”, co jest wywołaniem funkcji, a nie chcemy
  • help(sys) – ciąg pomocy dla modułu sys (najpierw musisz wykonać import sys).
  • dir(sys)dir() jest podobny do help(), ale zawiera tylko krótką listę zdefiniowanych symboli, czyli „atrybutów”.
  • help(sys.exit) – ciąg pomocy dla funkcji exit() w module sys.
  • help('xyz'.split) – ciąg znaków pomocy dotyczący metody split() dla obiektów ciągów znaków. Możesz wywołać funkcję help() samodzielnie lub z jego przykładem wraz z jego atrybutem. Na przykład wywołanie help('xyz'.split) jest równoznaczne z wywołaniem help(str.split).
  • help(list) – ciąg pomocy dla list obiektów,
  • dir(list) – wyświetla list atrybutów obiektu, w tym jego metody
  • help(list.append) – ciąg pomocy dla metody append() dla obiektów list.