Wprowadzenie do Pythona

Wprowadzenie

Witamy w samouczku online Pythona od Google. Jest ono oparte na wprowadzającym kursie Pythona oferowanym wewnętrznie. Jak wspomniano na stronie konfiguracji, te materiały dotyczą Pythona 3.

Jeśli szukasz kursu MOOC, wypróbuj kursy z Udacity i Coursera (wprowadzenie do programowania [dla początkujących] lub wprowadzenie do Pythona). Jeśli chcesz uczyć się we własnym tempie bez oglądania filmów, wypróbuj te wymienione na końcu tego posta. Możesz w nich poćwiczyć poszczególne cechy i interaktywne tłumacze języka Python. Co to za „tłumacz”? W następnej sekcji dowiesz się, jak to zrobić.

Wprowadzenie do języka

Python to dynamiczny, interpretowany (skompilowany w bajtkod) język. W źródłowym kodzie nie ma deklaracji typów zmiennych, parametrów, funkcji ani metod. Dzięki temu kod jest krótki i elastyczny, ale tracimy możliwość sprawdzania typu kodu źródłowego w czasie kompilacji. Python śledzi typy wszystkich wartości w czasie wykonywania i oznacza kod, który nie ma sensu podczas działania.

Aby zobaczyć, jak działa kod Pythona, uruchom interpreter tego języka i wpisz bezpośrednio w nim kod. Jeśli kiedykolwiek pojawi się pytanie w stylu „Co się stanie, jeśli dodam int do list?”, wpisanie go w interpreterze Pythona będzie najszybszym i najlepszym sposobem na sprawdzenie, co się stanie. (poniżej znajdziesz informacje o tym, co się naprawdę 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)

Dwie linie, które python wypisuje po wpisaniu python i przed promptem >>>, informują o wersji pythona, której używasz, oraz o miejscu, w którym została ona skompilowana. Jeśli pierwszą wydrukowaną rzeczą jest „Python 3”, te przykłady powinny działać.

Jak widać powyżej, łatwo eksperymentować z zmiennymi i operatorami. Ponadto, jeśli kod próbuje odczytać zmienną, która nie ma przypisanej wartości, tłumacz zgłasza (czyli „podnosi” w jęz. Pythona błąd środowiska wykonawczego. Tak jak w językach C++ i Java, w języku Python wielkość liter ma znaczenie, więc „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 obejmują cały wiersz.

Kod źródłowy Pythona

Pliki źródłowe w Pythonie mają rozszerzenie „.py” i są nazywane „modułami”. W przypadku modułu Pythona hello.py najłatwiej uruchomić go za pomocą polecenia powłoki „python hello.py Alice”, które wywołuje interpreter Pythona, aby wykonać kod w hello.py, przekazując mu argument wiersza poleceń „Alice”. Zapoznaj się z oficjalną stroną dokumentacji, aby poznać wszystkie opcje, które masz do dyspozycji podczas uruchamiania Pythona w wierszu poleceń.

Oto bardzo prosty program hello.py (zwróć uwagę, że bloki kodu są oddzielone wcięciem, a nie nawiasami klamrowymi – więcej na ten temat 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()

Uruchamianie 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

Importowanie, argumenty wiersza poleceń i len()

Najbardziej zewnętrzne instrukcje w pliku Pythona, czyli „module”, wykonują jednorazowe ustawienie. Instrukcje te są wykonywane od góry do dołu za każdym razem, gdy moduł jest importowany, konfigurując jego zmienne i funkcje. Moduł Pythona można uruchomić bezpośrednio (jak wyżej: python3 hello.py Bob) lub zaimportować i wykorzystać w innym module. Gdy plik Pythona jest uruchamiany bezpośrednio, specjalna zmienna „__name__” jest ustawiana na „__main__”. Dlatego często stosuje się wyżej pokazany fragment kodu if __name__ ==..., aby wywołać funkcję main(), gdy moduł jest uruchamiany bezpośrednio, ale nie wtedy, gdy jest importowany przez inny moduł.

W standardowym programie Pythona lista sys.argv zawiera parametry wiersza poleceń w standardowy sposób, gdzie sys.argv[0] to sam program, sys.argv[1] to pierwszy argument itd. Jeśli znasz funkcję argc lub liczbę argumentów, możesz po prostu zażądać tej wartości w Pythonie za pomocą funkcji len(sys.argv), tak jak to zrobiliśmy w powyższym interaktywnym kodzie interpretera podczas żądania długości ciągu znaków. Ogólnie funkcja len() informuje o długości ciągu znaków, liczbie elementów na listach i krotkach (inna struktura danych przypominająca tablicę) oraz o liczbie par klucz-wartość w słowniku.

Funkcje zdefiniowane przez użytkownika

Funkcje w Pythonie definiuje się 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 wyrażenie if są grupowane według tego samego poziomu wcięcia. Przedstawiliśmy też 2 sposoby powtarzania ciągów znaków. Operator + jest bardziej przyjazny dla użytkownika. Symbol * działa też, ponieważ jest to operator „powtórz” w Pythonie, co oznacza, że '-' * 10 daje '----------' w prosty sposób na utworzenie ekranowej „linii”. W komentarzu do kodu wspomnieliśmy, że znak * działa szybciej niż znak +. Dzieje się tak dlatego, że znak * oblicza rozmiar wynikowego obiektu raz, a w przypadku znaku + – przy każdym wywołaniu znaku +. Zarówno +, jak i * są nazywane „operatorami przeciążonymi”, ponieważ w przypadku liczb i ciągów znaków (oraz innych typów danych) mają inne znaczenie.

Kluczowe słowo def definiuje funkcję z jej parametrami w nawiasach i zawija kod. Pierwszym wierszem funkcji może być ciąg dokumentacji („docstring”), który opisuje działanie funkcji. Opis może być jednowierszowy lub wielowierszowy, jak w powyższym przykładzie. (Tak, to są „potrójne cudzysłowy”, funkcja charakterystyczna dla Pythona) Zmienne zdefiniowane w funkcji są dla niej lokalne, więc „wynik” w powyższej funkcji jest oddzielony od zmiennej „wynik” w innej funkcji. Instrukcja return może przyjąć argument. W takim przypadku jest to wartość zwracana elementowi wywołującemu.

Oto kod, który wywołuje funkcję repeat() i wypisuje jej wartość zwracaną:

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

W czasie wykonywania funkcje muszą zostać zdefiniowane przez wykonanie instrukcji „def” przed ich wywołaniem. Zwykle definicja funkcji main() znajduje się na dole pliku, a funkcje wywoływane przez nią – powyżej.

wcięcie,

Jedną z nietypowych cech Pythona jest to, że wcięcie białych znaków w kodzie wpływa na jego znaczenie. Blok logiczny instrukcji, np. bloki tworzące funkcję, powinien mieć ten sam odstęp, który jest ustawiany na podstawie odstępu funkcji nadrzędnej lub instrukcji „if” (jeśli) itp. Jeśli jeden z wierszy w grupie ma inny odstęp, jest oznaczany jako błąd składni.

Początkowo używanie przez Pythona spacji wydaje się trochę dziwne, ale jest to logiczne i bardzo szybko się do tego przyzwyczaiłem. Unikaj stosowania znaku tabulacji, ponieważ znacznie komplikuje on schemat wcięć (nie wspominając o tym, że znak tabulacji może oznaczać różne rzeczy na różnych platformach). Ustaw edytor tak, aby wstawiał spacje zamiast tabulacji w kodzie Pythona.

Początkujący często zadają pytanie: „Ile spacji mam wstawić?”. Zgodnie z oficjalnym przewodnikiem po stylu Pythona (PEP 8) należy stosować wcięcie o 4 spacje. (Ciekawostka: wewnętrzne wytyczne Google dotyczące stylu nakazują wcięcie o 2 spacje).

Sprawdzanie kodu w czasie działania

Python wykonuje bardzo niewiele sprawdzania w czasie kompilacji, odkładając prawie wszystkie sprawdzania typu, nazwy itp. na czas wykonania danego wiersza. Załóżmy, że funkcja main() wywołuje funkcję repeat() w ten sposób:

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

W instrukcji if występuje oczywisty błąd, ponieważ funkcja repeat() została przypadkowo wpisana jako repeeeet(). Co ciekawe, w Pythonie ten kod kompiluje się i działa prawidłowo, o ile nazwa w czasie wykonywania nie jest „Guido”. Dopiero gdy skrypt spróbuje wykonać funkcję repeeeet(), zauważy, że nie ma takiej funkcji, i wygeneruje błąd. W tym fragmencie kodu występuje też drugi błąd. Nazwa nie została przypisana do wartości przed porównaniem z „Guido”. Jeśli spróbujesz oszacować nieprzypisaną zmienną, Python zgłosi błąd „NameError”. Oto kilka przykładów pokazujących, że gdy po raz pierwszy uruchomisz program Python, niektóre z pierwszych błędów, które zobaczysz, będą zwykłymi literówkami lub niezainicjowanymi zmiennymi. Jest to jeden z obszarów, w którym języki o bardziej szczegółowym systemie, takim jak Java, mają przewagę nad innymi. Mogą wychwytywać takie błędy w czasie kompilowania (ale oczywiście musisz przechowywać wszystkie tego typu informacje, ale to dopiero kompromis).

W Pythonie 3 wprowadzono wskazówki dotyczące typów. Wskazówki dotyczące typu pozwalają określić typ każdego argumentu w funkcji, a także typ obiektu zwracanego przez funkcję. Na przykład w funkcja z komentarzem def is_positive(n: int) -> bool: argument n ma typ int, a zwracana wartość ma typ bool. Omówimy to później. Wskazówki dotyczące typu są jednak całkowicie opcjonalne. Coraz więcej kodu będzie używać podpowiedzi typów, ponieważ niektóre edytory, takie jak cider-v i VS.code, mogą przeprowadzać kontrole, aby sprawdzić, czy funkcje są wywoływane z odpowiednimi typami argumentów. Mogą nawet sugerować i weryfikować argumenty podczas edytowania kodu. W tym samouczku nie omawiamy podpowiedzi dotyczących typów, ale chcemy, abyś wiedział(-a) o nich, jeśli usłyszysz lub zobaczysz je w innym miejscu.

Nazwy zmiennych

Zmienne w Pythonie nie mają określonego typu w kodzie źródłowym, dlatego warto nadawać im znaczące nazwy, aby wiedzieć, co się dzieje. Użyj więc słowa „name” (nazwa), jeśli jest to pojedyncza nazwa, „names” (nazwy), jeśli jest to lista nazw, i „tuples” (tuple), jeśli jest to lista tupla. Wiele podstawowych błędów w Pythonie wynika z zapominania, jaki typ wartości jest w każdej zmiennej, więc używaj nazw zmiennych (to wszystko, co masz), aby zachować porządek.

Jeśli chodzi o nazewnictwo, w niektórych językach preferuje się podkreślone_części w przypadku nazw zmiennych złożonych z „więcej niż jednego słowa”, ale w innych preferuje się pisownię z dużą litery w pierwszej literze. Ogólnie w Pythonie preferuje metodę z podkreślnikiem, ale zaleca deweloperom stosowanie stylu CamelCase, jeśli jest on używany w dotychczasowym kodzie Pythona. Czytelność ma znaczenie. Więcej informacji znajdziesz w sekcji poświęconej konwencjom nazewnictwa w PEP 8.

Jak się zapewne domyślasz, słów kluczowych takich jak „if” czy „while” nie można używać jako nazw zmiennych, ponieważ spowoduje to błąd składni. Pamiętaj jednak, aby nie używać wbudowanych funkcji jako nazw zmiennych. Na przykład nazwy „str”, „lista” i „print” mogą wydawać się dobrymi nazwami, ale te zmienne systemowe zostaną zastąpione. Wbudowane funkcje nie są słowami kluczowymi, więc mogą być przypadkowo używane przez nowych programistów Pythona.

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

Załóżmy, że masz moduł „binky.py”, który zawiera funkcję „def foo()”. Pełna nazwa funkcji foo to „binky.foo”. Dzięki temu różne moduły Pythona mogą nadawać funkcjom i zmiennym dowolne nazwy, a nazwy zmiennych nie będą ze sobą kolidować – module1.foo różni się od module2.foo. W słownictwie Pythona można powiedzieć, że binky, module1 i module2 mają swoje własne „przestrzenie nazw”, które, jak można się domyślić, są powiązane z nazwami zmiennych.

Mamy na przykład standardowy moduł „sys”, który zawiera niektóre standardowe funkcje systemowe, takie jak lista argv i funkcja exit(). Dzięki poleceniu „import sys” możesz uzyskać dostęp do definicji w module sys i uzyskać do nich dostęp za pomocą ich pełnej nazwy, np. sys.exit(). (Tak, moduł „sys” też ma przestrzeń nazw).

  import sys

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

Inny format importowania wygląda tak: „from sys import argv, exit”. Dzięki temu argv i exit() są dostępne pod swoimi krótkimi nazwami. Zalecamy jednak pierwotną formę z pełnymi nazwami, ponieważ znacznie łatwiej jest wtedy określić, skąd pochodzi dana funkcja lub atrybut.

Istnieje wiele modułów i pakietów dostępnych w ramach standardowej instalacji interpretera Pythona, więc nie musisz nic robić, aby z nich korzystać. Są one zbiorczo nazywane „standardową biblioteką w języku Python”. Często używane moduły lub pakiety to:

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

Dokumentację wszystkich modułów i pakietów standardowej biblioteki znajdziesz na stronie http://docs.python.org/library.

Pomoc online, help() i dir()

Istnieje wiele sposobów uzyskania pomocy dotyczącej Pythona.

  • Przeprowadź wyszukiwanie w Google, zaczynając od słowa „python”, na przykład „lista języka Python” lub „małe litery ciągu w języku Python”. Pierwszy wynik często jest odpowiedzią. Z niejakiego powodu ta metoda działa lepiej w przypadku Pythona niż w przypadku innych języków.
  • Na oficjalnej stronie dokumentacji Pythona (docs.python.org) znajdziesz wysokiej jakości dokumenty. Jednak często szybciej jest wpisać kilka słów w wyszukiwarce Google.
  • Jest też oficjalna lista adresowa Tutor, która jest przeznaczona dla osób, które dopiero zaczynają swoją przygodę z Pythonem lub programowaniem.
  • Wiele pytań (i odpowiedzi) znajdziesz na stronach StackOverflow i Quora.
  • Użyj funkcji help() i dir() (patrz poniżej).

W tłumaczu Pythona funkcja help() wyświetla ciągi dokumentacji dotyczące różnych modułów, funkcji i metod. Te ciągi dokumentów są podobne do plików javadoc w języku Java. Funkcja dir() podaje atrybuty obiektu. Oto kilka sposobów wywołania funkcji help() i dir() z tłumaczacza:

  • help(len) – ciąg pomocy dla wbudowanej funkcji len(); zwróć uwagę, że jest to „len”, a nie „len()”, co jest wywołaniem funkcji, czego nie chcemy.
  • help(sys) – ciąg pomocy dla modułu sys (najpierw musisz utworzyć ciąg import sys).
  • dir(sys)dir() jest podobny do help(), ale zawiera tylko listę zdefiniowanych symboli, czyli „atrybutów”.
  • help(sys.exit) – ciąg znaków pomocy dla funkcji exit() w module sys
  • help('xyz'.split) – ciąg tekstowy pomocy dla metody split() obiektów typu string. Możesz wywołać funkcję help() z tym obiektem lub przykładem tego obiektu oraz jego atrybutem. Na przykład wywołanie help('xyz'.split) jest takie samo jak wywołanie help(str.split).
  • help(list) – ciąg pomocy dla obiektów list
  • dir(list) – wyświetla atrybuty obiektu list, w tym jego metody
  • help(list.append) – ciąg pomocy dla metody append() w przypadku obiektów list