Python 3 - szybki przewodnik
Moduł __future__
Python 3.x wprowadził pewne słowa kluczowe i funkcje niezgodne z Pythonem 2, które można zaimportować za pomocą wbudowanego modułu __future__ w Pythonie 2. Zaleca się używanie importu __future__, jeśli planujesz obsługę języka Python 3.x dla swojego kodu.
Na przykład, jeśli chcemy, aby w Pythonie 2 zachodziło dzielenie liczb całkowitych w Pythonie 3.x, dodaj następującą instrukcję import.
from __future__ import division
Funkcja drukowania
Najbardziej zauważalną i najbardziej znaną zmianą w Pythonie 3 jest sposób, w jaki printfunkcja jest używana. Używanie nawiasów () z funkcją drukowania jest teraz obowiązkowe. W Pythonie 2 było to opcjonalne.
print "Hello World" #is acceptable in Python 2
print ("Hello World") # in Python 3, print must be followed by ()
Funkcja print () domyślnie wstawia nowy wiersz na końcu. W Pythonie 2 można to ukryć, umieszczając na końcu znak „,”. W Pythonie 3 "end = ''" dodaje spację zamiast nowej linii.
print x, # Trailing comma suppresses newline in Python 2
print(x, end=" ") # Appends a space instead of a newline in Python 3
Czytanie danych wejściowych z klawiatury
Python 2 ma dwie wersje funkcji wejściowych, input() i raw_input(). Funkcja input () traktuje odebrane dane jako ciąg znaków, jeśli są one zawarte w cudzysłowie '' lub "", w przeciwnym razie dane są traktowane jako liczba.
W Pythonie 3 funkcja raw_input () jest przestarzała. Ponadto odebrane dane są zawsze traktowane jako ciąg.
In Python 2
>>> x = input('something:')
something:10 #entered data is treated as number
>>> x
10
>>> x = input('something:')
something:'10' #entered data is treated as string
>>> x
'10'
>>> x = raw_input("something:")
something:10 #entered data is treated as string even without ''
>>> x
'10'
>>> x = raw_input("something:")
something:'10' #entered data treated as string including ''
>>> x
"'10'"
In Python 3
>>> x = input("something:")
something:10
>>> x
'10'
>>> x = input("something:")
something:'10' #entered data treated as string with or without ''
>>> x
"'10'"
>>> x = raw_input("something:") # will result NameError
Traceback (most recent call last):
File "<pyshell#3>", line 1, in
<module>
x = raw_input("something:")
NameError: name 'raw_input' is not defined
Dzielenie całkowite
W Pythonie 2 wynik dzielenia dwóch liczb całkowitych jest zaokrąglany do najbliższej liczby całkowitej. W rezultacie 3/2 pokaże 1. Aby uzyskać dzielenie zmiennoprzecinkowe, licznik lub mianownik musi być jawnie używany jako liczba zmiennoprzecinkowa. W związku z tym albo 3,0 / 2, albo 3 / 2,0 lub 3,0 / 2,0 da wynik 1,5
Python 3 domyślnie ocenia 3/2 jako 1,5, co jest bardziej intuicyjne dla nowych programistów.
Reprezentacja Unicode
Python 2 wymaga, abyś oznaczył ciąg za pomocą au, jeśli chcesz zapisać go jako Unicode.
Python 3 domyślnie przechowuje ciągi znaków jako Unicode. Mamy ciągi Unicode (utf-8) i 2 klasy bajtowe: tablice bajtowe i bajtowe.
Funkcja xrange () została usunięta
W Pythonie 2 funkcja range () zwraca listę, a xrange () zwraca obiekt, który w razie potrzeby wygeneruje elementy z zakresu, oszczędzając pamięć.
W Pythonie 3 funkcja range () została usunięta, a nazwa xrange () została zmieniona na range (). Ponadto obiekt range () obsługuje wycinanie w Pythonie 3.2 i nowszych.
zgłosić wyjątek
Python 2 akceptuje obie notacje, składnię „starą” i „nową”; Python 3 zgłasza błąd SyntaxError, jeśli nie umieścimy argumentu wyjątku w nawiasach.
raise IOError, "file error" #This is accepted in Python 2
raise IOError("file error") #This is also accepted in Python 2
raise IOError, "file error" #syntax error is raised in Python 3
raise IOError("file error") #this is the recommended syntax in Python 3
Argumenty w wyjątkach
W Pythonie 3 argumenty do wyjątku powinny być deklarowane za pomocą słowa kluczowego „as”.
except Myerror, err: # In Python2
except Myerror as err: #In Python 3
Funkcja next () i metoda .next ()
W Pythonie 2 next () jako metoda obiektu generatora jest dozwolona. W Pythonie 2 akceptowana jest również funkcja next () do iteracji po obiekcie generatora. Jednak w Pythonie 3 metoda next (0 jako metoda generująca jest przerywana i wywołuje AttributeError.
gen = (letter for letter in 'Hello World') # creates generator object
next(my_generator) #allowed in Python 2 and Python 3
my_generator.next() #allowed in Python 2. raises AttributeError in Python 3
Narzędzie 2to3
Wraz z interpreterem Pythona 3, skrypt 2to3.py jest zwykle instalowany w folderze tools / scripts. Czyta kod źródłowy Python 2.xi stosuje serię naprawiających, aby przekształcić go w prawidłowy kod Python 3.x.
Here is a sample Python 2 code (area.py):
def area(x,y = 3.14):
a = y*x*x
print a
return a
a = area(10)
print "area",a
To convert into Python 3 version:
$2to3 -w area.py
Converted code :
def area(x,y = 3.14): # formal parameters
a = y*x*x
print (a)
return a
a = area(10)
print("area",a)
Python to interpretowany, interaktywny i zorientowany obiektowo język skryptowy wysokiego poziomu. Python został zaprojektowany tak, aby był bardzo czytelny. Często używa angielskich słów kluczowych, podczas gdy inne języki używają interpunkcji. Ma mniej konstrukcji syntaktycznych niż inne języki.
Python is Interpreted- Python jest przetwarzany w czasie wykonywania przez interpreter. Nie musisz kompilować programu przed jego wykonaniem. Jest to podobne do PERL i PHP.
Python is Interactive - Możesz faktycznie usiąść przy zachęcie Pythona i bezpośrednio komunikować się z interpreterem, aby pisać programy.
Python is Object-Oriented - Python obsługuje styl zorientowany obiektowo lub technikę programowania, która hermetyzuje kod w obiektach.
Python is a Beginner's Language - Python jest świetnym językiem dla początkujących programistów i wspiera rozwój szerokiej gamy aplikacji, od prostego przetwarzania tekstu, przez przeglądarki WWW, po gry.
Historia Pythona
Python został opracowany przez Guido van Rossuma na przełomie lat osiemdziesiątych i dziewięćdziesiątych w holenderskim National Research Institute for Mathematics and Computer Science.
Python wywodzi się z wielu innych języków, w tym z powłoki ABC, Modula-3, C, C ++, Algol-68, SmallTalk i Unix oraz innych języków skryptowych.
Python jest chroniony prawami autorskimi. Podobnie jak Perl, kod źródłowy Pythona jest teraz dostępny na licencji GNU General Public License (GPL).
Python jest obecnie obsługiwany przez główny zespół programistów w instytucie, chociaż Guido van Rossum nadal odgrywa kluczową rolę w kierowaniu jego postępami.
Python 1.0 został wydany w listopadzie 1994. W 2000 został wydany Python 2.0. Python 2.7.11 to najnowsza edycja Pythona 2.
W międzyczasie Python 3.0 został wydany w 2008 roku. Python 3 nie jest wstecznie kompatybilny z Pythonem 2. W Pythonie 3 nacisk położono na usunięcie zduplikowanych konstrukcji i modułów programistycznych, tak aby „Powinien istnieć jeden - a najlepiej tylko jeden - oczywisty sposób na zrobienie tego ”. Python 3.5.1 to najnowsza wersja Pythona 3.
Funkcje Pythona
Funkcje Pythona obejmują -
Easy-to-learn- Python ma kilka słów kluczowych, prostą strukturę i jasno określoną składnię. Pozwala to uczniowi szybko przyswoić język.
Easy-to-read - Kod Pythona jest wyraźniej zdefiniowany i bardziej widoczny dla oczu.
Easy-to-maintain - Kod źródłowy Pythona jest dość łatwy w utrzymaniu.
A broad standard library - Większość biblioteki Pythona jest bardzo przenośna i kompatybilna z różnymi platformami w systemach UNIX, Windows i Macintosh.
Interactive Mode - Python obsługuje tryb interaktywny, który umożliwia interaktywne testowanie i debugowanie fragmentów kodu.
Portable - Python może działać na wielu różnych platformach sprzętowych i ma ten sam interfejs na wszystkich platformach.
Extendable- Możesz dodać moduły niskiego poziomu do interpretera Pythona. Moduły te umożliwiają programistom dodawanie lub dostosowywanie ich narzędzi, aby były bardziej wydajne.
Databases - Python zapewnia interfejsy do wszystkich głównych komercyjnych baz danych.
GUI Programming - Python obsługuje aplikacje GUI, które można tworzyć i przenosić do wielu wywołań systemowych, bibliotek i systemów Windows, takich jak Windows MFC, Macintosh i system X Window w systemie Unix.
Scalable - Python zapewnia lepszą strukturę i obsługę dużych programów niż skrypty powłoki.
Oprócz wyżej wymienionych funkcji, Python ma dużą listę dobrych funkcji. Kilka z nich jest wymienionych poniżej -
Obsługuje funkcjonalne i strukturalne metody programowania, a także OOP.
Może być używany jako język skryptowy lub może być skompilowany do kodu bajtowego do tworzenia dużych aplikacji.
Zapewnia dynamiczne typy danych bardzo wysokiego poziomu i obsługuje dynamiczne sprawdzanie typów.
Obsługuje automatyczne zbieranie śmieci.
Można go łatwo zintegrować z C, C ++, COM, ActiveX, CORBA i Java.
Python 3 jest dostępny dla systemów Windows, Mac OS i większości odmian systemu operacyjnego Linux. Mimo że Python 2 jest dostępny dla wielu innych systemów operacyjnych, obsługa Python 3 albo nie została dla nich udostępniona, albo została porzucona.
Konfiguracja środowiska lokalnego
Otwórz okno terminala i wpisz „python”, aby dowiedzieć się, czy jest już zainstalowany i która wersja jest zainstalowana.
Pobieranie Pythona
Platforma Windows
Pliki binarne najnowszej wersji Pythona 3 (Python 3.5.1) są dostępne na tej stronie pobierania
Dostępne są następujące różne opcje instalacji.
- Plik zip z możliwością osadzenia systemu Windows x86-64
- Instalator plików wykonywalnych Windows x86-64
- Instalator sieciowy Windows x86-64
- Plik zip z możliwością osadzenia systemu Windows x86
- Instalator plików wykonywalnych Windows x86
- Instalator sieciowy Windows x86
Note- Aby zainstalować Python 3.5.1, minimalne wymagania systemu operacyjnego to Windows 7 z dodatkiem SP1. W wersjach od 3.0 do 3.4.x Windows XP jest akceptowalny.
Platforma Linux
Różne wersje Linuksa używają różnych menedżerów pakietów do instalacji nowych pakietów.
W systemie Ubuntu Linux Python 3 jest instalowany za pomocą następującego polecenia z terminala.
$sudo apt-get install python3-minimal
Instalacja ze źródła
Pobierz archiwum ze źródłami Gzipped z adresu URL pobierania Pythona - https://www.python.org/ftp/python/3.5.1/Python-3.5.1.tgz
Extract the tarball
tar xvfz Python-3.5.1.tgz
Configure and Install:
cd Python-3.5.1
./configure --prefix = /opt/python3.5.1
make
sudo make install
System operacyjny Mac
Pobierz instalatory systemu Mac OS z tego adresu URL - https://www.python.org/downloads/mac-osx/
- Instalator 64-bitowego / 32-bitowego systemu Mac OS X - python-3.5.1-macosx10.6.pkg
- Instalator 32-bitowego systemu Mac OS X i386 / PPC - python-3.5.1-macosx10.5.pkg
Kliknij dwukrotnie ten plik pakietu i postępuj zgodnie z instrukcjami kreatora, aby zainstalować.
Najbardziej aktualny i aktualny kod źródłowy, pliki binarne, dokumentacja, wiadomości itp. Są dostępne na oficjalnej stronie Pythona -
Python Official Website - https://www.python.org/
Dokumentację języka Python można pobrać z następującej witryny. Dokumentacja jest dostępna w formatach HTML, PDF i PostScript.
Python Documentation Website- www.python.org/doc/
Konfigurowanie PATH
Programy i inne pliki wykonywalne mogą znajdować się w wielu katalogach. Dlatego systemy operacyjne zapewniają ścieżkę wyszukiwania, która zawiera listę katalogów, w których szuka plików wykonywalnych.
Ważne cechy to -
Ścieżka jest przechowywana w zmiennej środowiskowej, która jest nazwanym ciągiem obsługiwanym przez system operacyjny. Ta zmienna zawiera informacje dostępne dla powłoki poleceń i innych programów.
Zmienna ścieżki nosi nazwę PATH w systemie Unix lub Path w Windows (Unix rozróżnia wielkość liter, Windows nie).
W systemie Mac OS instalator obsługuje szczegóły ścieżki. Aby wywołać interpreter języka Python z dowolnego katalogu, musisz dodać katalog Python do swojej ścieżki.
Ustawienie ścieżki w Unix / Linux
Aby dodać katalog Pythona do ścieżki dla określonej sesji w systemie Unix -
In the csh shell - wpisz setenv PATH "$ PATH: / usr / local / bin / python3" i naciśnij Enter.
In the bash shell (Linux) - wpisz export PYTHONPATH = / usr / local / bin / python3.4 i naciśnij Enter.
In the sh or ksh shell - wpisz PATH = "$ PATH: / usr / local / bin / python3" i naciśnij Enter.
Note - / usr / local / bin / python3 to ścieżka do katalogu Pythona.
Ustawianie ścieżki w systemie Windows
Aby dodać katalog Python do ścieżki dla określonej sesji w systemie Windows -
At the command prompt - wpisz path% path%; C: \ Python i naciśnij Enter.
Note - C: \ Python to ścieżka do katalogu Pythona
Zmienne środowiskowe Pythona
Oto ważne zmienne środowiskowe, które są rozpoznawane przez Pythona -
Sr.No. | Zmienna i opis |
---|---|
1 | PYTHONPATH Pełni rolę podobną do PATH. Ta zmienna informuje interpreter języka Python, gdzie ma znajdować się pliki modułów zaimportowane do programu. Powinien zawierać katalog biblioteki źródłowej Pythona i katalogi zawierające kod źródłowy Pythona. PYTHONPATH jest czasami wstępnie ustawiana przez instalator Pythona. |
2 | PYTHONSTARTUP Zawiera ścieżkę do pliku inicjalizacyjnego zawierającego kod źródłowy Pythona. Jest wykonywany za każdym razem, gdy uruchamiasz tłumacza. Nazywa się .pythonrc.py w systemie Unix i zawiera polecenia, które ładują narzędzia lub modyfikują PYTHONPATH. |
3 | PYTHONCASEOK Jest używany w systemie Windows do poinstruowania Pythona, aby znalazł pierwsze dopasowanie bez uwzględniania wielkości liter w instrukcji importu. Ustaw tę zmienną na dowolną wartość, aby ją aktywować. |
4 | PYTHONHOME Jest to alternatywna ścieżka wyszukiwania modułu. Zwykle jest osadzony w katalogach PYTHONSTARTUP lub PYTHONPATH, aby ułatwić przełączanie bibliotek modułów. |
Uruchamianie Pythona
Istnieją trzy różne sposoby uruchomienia Pythona -
Interaktywny tłumacz
Możesz uruchomić Pythona z systemu Unix, DOS lub dowolnego innego systemu, który udostępnia interpreter wiersza poleceń lub okno powłoki.
Wchodzić python wiersz poleceń.
Rozpocznij kodowanie od razu w interaktywnym tłumaczu.
$python # Unix/Linux
or
python% # Unix/Linux
or
C:>python # Windows/DOS
Oto lista wszystkich dostępnych opcji wiersza poleceń -
Sr.No. | Opcja i opis |
---|---|
1 | -d dostarcza dane wyjściowe debugowania |
2 | -O generuje zoptymalizowany kod bajtowy (w wyniku czego powstają pliki .pyo) |
3 | -S nie uruchamiaj witryny importu w celu wyszukania ścieżek Pythona podczas uruchamiania |
4 | -v szczegółowe dane wyjściowe (szczegółowe śledzenie instrukcji importu) |
5 | -X wyłącz wbudowane wyjątki oparte na klasach (użyj po prostu ciągów znaków); przestarzałe począwszy od wersji 1.6 |
6 | -c cmd uruchom skrypt Pythona wysłany jako ciąg cmd |
7 | file uruchom skrypt Pythona z podanego pliku |
Skrypt z wiersza poleceń
Skrypt w języku Python można wykonać w wierszu poleceń, wywołując interpreter w aplikacji, jak pokazano w poniższym przykładzie.
$python script.py # Unix/Linux
or
python% script.py # Unix/Linux
or
C:>python script.py # Windows/DOS
Note - Upewnij się, że tryb uprawnień do plików umożliwia wykonanie.
Zintegrowane środowisko programistyczne
Możesz również uruchomić język Python ze środowiska graficznego interfejsu użytkownika (GUI), jeśli masz aplikację GUI w systemie, która obsługuje język Python.
Unix - IDLE jest pierwszym IDE Uniksa dla Pythona.
Windows - PythonWin jest pierwszym interfejsem Windows dla Pythona i jest IDE z GUI.
Macintosh - Wersja Pythona dla komputerów Macintosh wraz z IDLE IDE jest dostępna z głównej strony internetowej, do pobrania jako pliki MacBinary lub BinHex'd.
Jeśli nie jesteś w stanie poprawnie skonfigurować środowiska, możesz skorzystać z pomocy administratora systemu. Upewnij się, że środowisko Python jest poprawnie skonfigurowane i działa idealnie.
Note - Wszystkie przykłady podane w kolejnych rozdziałach są wykonywane w wersji Python 3.4.1 dostępnej dla systemów Windows 7 i Ubuntu Linux.
Stworzyliśmy już środowisko programowania Python online, abyś mógł wykonać wszystkie dostępne przykłady online podczas nauki teorii. Zapraszam do modyfikowania dowolnego przykładu i wykonywania go online.
Język Python ma wiele podobieństw do Perl, C i Java. Istnieją jednak pewne wyraźne różnice między językami.
Pierwszy program w Pythonie
Wykonajmy programy w różnych trybach programowania.
Programowanie w trybie interaktywnym
Wywołanie interpretera bez przekazywania pliku skryptu jako parametru powoduje wyświetlenie następującego monitu -
$ python
Python 3.3.2 (default, Dec 10 2013, 11:35:01)
[GCC 4.6.3] on Linux
Type "help", "copyright", "credits", or "license" for more information.
>>>
On Windows:
Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:43:06) [MSC v.1600 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>>
Wpisz następujący tekst w zachęcie Pythona i naciśnij Enter -
>>> print ("Hello, Python!")
Jeśli używasz starszej wersji Pythona (Python 2.x), użyj nawiasów jako inprintfunkcja jest opcjonalna. Daje to następujący wynik -
Hello, Python!
Programowanie w trybie skryptowym
Wywołanie interpretera z parametrem skryptu rozpoczyna wykonywanie skryptu i trwa do jego zakończenia. Po zakończeniu skryptu interpreter nie jest już aktywny.
Napiszmy w skrypcie prosty program w języku Python. Pliki Python mają rozszerzenie.py. Wpisz następujący kod źródłowy w pliku test.py -
print ("Hello, Python!")
Zakładamy, że masz ustawiony interpreter Pythona PATHzmienna. Teraz spróbuj uruchomić ten program w następujący sposób -
On Linux
$ python test.py
Daje to następujący wynik -
Hello, Python!
On Windows
C:\Python34>Python test.py
Daje to następujący wynik -
Hello, Python!
Wypróbujmy inny sposób wykonania skryptu w Pythonie w systemie Linux. Oto zmodyfikowany plik test.py -
#!/usr/bin/python3
print ("Hello, Python!")
Zakładamy, że masz dostępny interpreter Pythona w katalogu / usr / bin. Teraz spróbuj uruchomić ten program w następujący sposób -
$ chmod +x test.py # This is to make file executable $./test.py
Daje to następujący wynik -
Hello, Python!
Identyfikatory Pythona
Identyfikator Pythona to nazwa używana do identyfikacji zmiennej, funkcji, klasy, modułu lub innego obiektu. Identyfikator zaczyna się od litery od A do Z lub od a do z lub znaku podkreślenia (_), po którym następuje zero lub więcej liter, znaków podkreślenia i cyfr (od 0 do 9).
Python nie zezwala na znaki interpunkcyjne, takie jak @, $ i% w identyfikatorach. Python to język programowania uwzględniający wielkość liter. A zatem,Manpower i manpower to dwa różne identyfikatory w Pythonie.
Oto konwencje nazewnictwa identyfikatorów Pythona -
Nazwy klas rozpoczynają się od dużej litery. Wszystkie inne identyfikatory zaczynają się od małej litery.
Rozpoczęcie identyfikatora pojedynczym początkowym podkreśleniem wskazuje, że identyfikator jest prywatny.
Rozpoczęcie identyfikatora dwoma wiodącymi podkreśleniami wskazuje na silny identyfikator prywatny.
Jeśli identyfikator kończy się również dwoma końcowymi podkreśleniami, jest to nazwa specjalna zdefiniowana w języku.
Zastrzeżone słowa
Poniższa lista przedstawia słowa kluczowe języka Python. Są to słowa zastrzeżone i nie można ich używać jako stałych lub zmiennych ani żadnych innych nazw identyfikatorów. Wszystkie słowa kluczowe Pythona zawierają tylko małe litery.
i | exec | nie |
tak jak | Wreszcie | lub |
zapewniać | dla | przechodzić |
przerwa | od | wydrukować |
klasa | światowy | podnieść |
kontyntynuj | gdyby | powrót |
pok | import | próbować |
del | w | podczas |
elif | jest | z |
jeszcze | lambda | wydajność |
z wyjątkiem |
Linie i wcięcia
Python nie używa nawiasów klamrowych ({}) do wskazywania bloków kodu dla definicji klas i funkcji lub sterowania przepływem. Bloki kodu są oznaczone wcięciami linii, które są sztywno wymuszane.
Liczba spacji w wcięciach jest zmienna, ale wszystkie instrukcje w bloku muszą mieć wcięcie tej samej wielkości. Na przykład -
if True:
print ("True")
else:
print ("False")
Jednak następujący blok generuje błąd -
if True:
print ("Answer")
print ("True")
else:
print "(Answer")
print ("False")
W ten sposób w Pythonie wszystkie ciągłe linie wcięte z taką samą liczbą spacji utworzyłyby blok. Poniższy przykład zawiera różne bloki instrukcji -
Note- Nie próbuj zrozumieć logiki w tym momencie. Po prostu upewnij się, że rozumiesz różne bloki, nawet jeśli nie mają nawiasów klamrowych.
#!/usr/bin/python3
import sys
file_finish = "end"
file_text = ""
contents=[]
file_name=input("Enter filename: ")
if len(file_name) == 0:
print("Please enter filename")
sys.exit()
try:
# open file stream
file = open(file_name, "w")
except IOError:
print ("There was an error writing to", file_name)
sys.exit()
print ("Enter '", file_finish,)
print ("' When finished")
while file_text != file_finish:
file_text = input("Enter text: ")
contents.append(file_text)
if file_text == file_finish:
# close the file
file.close()
break
print(contents)
data = ' '.join([str(elem) for elem in contents])
print(data)
file.write(data)
file.close()
file_name = input("Enter filename: ")
if len(file_name) == 0:
print ("Next time please enter something")
sys.exit()
try:
file = open(file_name, "r")
except IOError:
print ("There was an error reading file")
sys.exit()
file_text = file.read()
file.close()
print (file_text)
Wyciągi wielowierszowe
Instrukcje w Pythonie zwykle kończą się nową linią. Jednak Python pozwala na użycie znaku kontynuacji wiersza (\) do oznaczenia, że linia powinna być kontynuowana. Na przykład -
total = item_one + \
item_two + \
item_three
Instrukcje zawarte w nawiasach [], {} lub () nie muszą używać znaku kontynuacji wiersza. Na przykład -
days = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
Cytat w Pythonie
Python akceptuje pojedyncze ('), podwójne (") i potrójne (' '' lub" "") cudzysłowy w celu oznaczenia literałów łańcuchowych, o ile ten sam typ cudzysłowu zaczyna i kończy ciąg.
Potrójne cudzysłowy są używane do łączenia ciągu w wiele linii. Na przykład wszystkie poniższe są legalne -
word = 'word'
sentence = "This is a sentence."
paragraph = """This is a paragraph. It is
made up of multiple lines and sentences."""
Komentarze w Pythonie
Znak krzyżyka (#), który nie znajduje się wewnątrz literału ciągu, jest początkiem komentarza. Wszystkie znaki po znaku #, aż do końca fizycznej linii, są częścią komentarza i interpreter Pythona ignoruje je.
#!/usr/bin/python3
# First comment
print ("Hello, Python!") # second comment
Daje to następujący wynik -
Hello, Python!
Możesz wpisać komentarz w tym samym wierszu po instrukcji lub wyrażeniu -
name = "Madisetti" # This is again comment
Python nie ma funkcji komentowania wielowierszowego. Musisz skomentować każdą linię osobno w następujący sposób -
# This is a comment.
# This is a comment, too.
# This is a comment, too.
# I said that already.
Korzystanie z pustych linii
Linia zawierająca tylko białe znaki, prawdopodobnie z komentarzem, jest nazywana pustą linią i Python całkowicie ją ignoruje.
W sesji interaktywnego interpretera należy wprowadzić pusty wiersz fizyczny, aby zakończyć instrukcję wielowierszową.
Czekam na użytkownika
W następnym wierszu programu wyświetlany jest monit i oświadczenie „Naciśnij klawisz Enter, aby wyjść”, a następnie czeka, aż użytkownik wykona akcję -
#!/usr/bin/python3
input("\n\nPress the enter key to exit.")
Tutaj "\ n \ n" służy do tworzenia dwóch nowych linii przed wyświetleniem aktualnej linii. Gdy użytkownik naciśnie klawisz, program się kończy. To fajna sztuczka, aby pozostawić otwarte okno konsoli, dopóki użytkownik nie skończy z aplikacją.
Wiele instrukcji w jednym wierszu
Średnik (;) zezwala na wiele instrukcji w jednym wierszu, pod warunkiem, że żadna instrukcja nie rozpoczyna nowego bloku kodu. Oto przykładowy wycinek ze średnikiem -
import sys; x = 'foo'; sys.stdout.write(x + '\n')
Wiele grup instrukcji jako zestawów
Wywoływane są grupy pojedynczych instrukcji, które tworzą pojedynczy blok kodu suitesw Pythonie. Instrukcje złożone lub złożone, takie jak if, while, def i class wymagają wiersza nagłówka i zestawu.
Linie nagłówka rozpoczynają instrukcję (słowem kluczowym) i kończą się dwukropkiem (:), a po nich następuje jedna lub więcej linii tworzących zestaw. Na przykład -
if expression :
suite
elif expression :
suite
else :
suite
Argumenty wiersza poleceń
Można uruchomić wiele programów, aby uzyskać podstawowe informacje o tym, jak powinny być uruchamiane. Python umożliwia to za pomocą -h -
$ python -h
usage: python [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-c cmd : program passed in as string (terminates option list)
-d : debug output from parser (also PYTHONDEBUG=x)
-E : ignore environment variables (such as PYTHONPATH)
-h : print this help message and exit
[ etc. ]
Możesz także zaprogramować swój skrypt w taki sposób, aby akceptował różne opcje. Argumenty wiersza poleceń to temat zaawansowany. Pozwól nam to zrozumieć.
Zmienne to nic innego jak zarezerwowane miejsca w pamięci do przechowywania wartości. Oznacza to, że kiedy tworzysz zmienną, rezerwujesz trochę miejsca w pamięci.
Na podstawie typu danych zmiennej interpreter przydziela pamięć i decyduje, co może być przechowywane w zarezerwowanej pamięci. Dlatego przypisując różne typy danych do zmiennych, można przechowywać w tych zmiennych liczby całkowite, dziesiętne lub znaki.
Przypisywanie wartości do zmiennych
Zmienne Pythona nie wymagają jawnej deklaracji, aby zarezerwować miejsce w pamięci. Deklaracja jest wykonywana automatycznie po przypisaniu wartości do zmiennej. Znak równości (=) służy do przypisywania wartości zmiennym.
Operand po lewej stronie operatora = to nazwa zmiennej, a operand po prawej stronie operatora = to wartość przechowywana w zmiennej. Na przykład -
#!/usr/bin/python3
counter = 100 # An integer assignment
miles = 1000.0 # A floating point
name = "John" # A string
print (counter)
print (miles)
print (name)
W tym przypadku 100, 1000,0 i „John” to wartości przypisane odpowiednio do zmiennych licznika, mil i nazw. Daje to następujący wynik -
100
1000.0
John
Przydział wielokrotny
Python umożliwia jednoczesne przypisanie jednej wartości do kilku zmiennych.
Na przykład -
a = b = c = 1
Tutaj tworzony jest obiekt typu integer o wartości 1, a wszystkie trzy zmienne są przypisywane do tej samej lokalizacji pamięci. Możesz także przypisać wiele obiektów do wielu zmiennych. Na przykład -
a, b, c = 1, 2, "john"
Tutaj dwa obiekty typu integer o wartościach 1 i 2 są przypisane odpowiednio do zmiennych a i b, a jeden obiekt typu string o wartości „john” jest przypisany do zmiennej c.
Standardowe typy danych
Dane przechowywane w pamięci mogą być różnego rodzaju. Na przykład wiek osoby jest przechowywany jako wartość liczbowa, a jej adres jako znaki alfanumeryczne. Python ma różne standardowe typy danych, które są używane do definiowania możliwych na nich operacji i metod przechowywania dla każdego z nich.
Python ma pięć standardowych typów danych -
- Numbers
- String
- List
- Tuple
- Dictionary
Liczby w Pythonie
Typy danych liczbowych przechowują wartości liczbowe. Obiekty liczbowe są tworzone, gdy przypisujesz im wartość. Na przykład -
var1 = 1
var2 = 10
Możesz również usunąć odwołanie do obiektu liczbowego przy użyciu rozszerzenia delkomunikat. Składniadel oświadczenie to -
del var1[,var2[,var3[....,varN]]]]
Możesz usunąć pojedynczy obiekt lub wiele obiektów przy użyciu rozszerzenia del komunikat.
Na przykład -
del var
del var_a, var_b
Python obsługuje trzy różne typy liczbowe -
- int (liczby całkowite ze znakiem)
- float (zmiennoprzecinkowe wartości rzeczywiste)
- zespolone (liczby zespolone)
Wszystkie liczby całkowite w Pythonie3 są reprezentowane jako długie liczby całkowite. W związku z tym nie ma tak długiego oddzielnego typu liczb.
Przykłady
Oto kilka przykładów liczb -
int | pływak | złożony |
---|---|---|
10 | 0.0 | 3.14j |
100 | 15.20 | 45.j |
-786 | -21,9 | 9.322e-36j |
080 | 32,3 + e18 | .876j |
-0490 | -90. | -,6545 + 0J |
-0x260 | -32,54e100 | 3e + 26J |
0x69 | 70,2-E12 | 4.53e-7j |
Liczba zespolona składa się z uporządkowanej pary rzeczywistych liczb zmiennoprzecinkowych oznaczonych przez x + yj, gdzie x i y są liczbami rzeczywistymi, a j jest jednostką urojoną.
Ciągi Pythona
Ciągi znaków w Pythonie są identyfikowane jako ciągły zestaw znaków przedstawionych w cudzysłowie. Python pozwala na używanie pary pojedynczych lub podwójnych cudzysłowów. Podzbiory łańcuchów można pobrać za pomocą operatora wycinka ([] i [:]) z indeksami zaczynającymi się od 0 na początku łańcucha i przesuwającymi się od -1 do końca.
Znak plus (+) to operator konkatenacji ciągów, a gwiazdka (*) to operator powtórzenia. Na przykład -
#!/usr/bin/python3
str = 'Hello World!'
print (str) # Prints complete string
print (str[0]) # Prints first character of the string
print (str[2:5]) # Prints characters starting from 3rd to 5th
print (str[2:]) # Prints string starting from 3rd character
print (str * 2) # Prints string two times
print (str + "TEST") # Prints concatenated string
To da następujący wynik -
Hello World!
H
llo
llo World!
Hello World!Hello World!
Hello World!TEST
Listy w Pythonie
Listy są najbardziej wszechstronnymi ze złożonych typów danych Pythona. Lista zawiera elementy oddzielone przecinkami i zawarte w nawiasach kwadratowych ([]). Do pewnego stopnia listy są podobne do tablic w C. Jedną z różnic między nimi jest to, że wszystkie elementy należące do listy mogą mieć różne typy danych.
Dostęp do wartości przechowywanych na liście można uzyskać za pomocą operatora wycinka ([] i [:]) z indeksami zaczynającymi się od 0 na początku listy i prowadzącymi do końca -1. Znak plus (+) to operator konkatenacji listy, a gwiazdka (*) to operator powtórzenia. Na przykład -
#!/usr/bin/python3
list = [ 'abcd', 786 , 2.23, 'john', 70.2 ]
tinylist = [123, 'john']
print (list) # Prints complete list
print (list[0]) # Prints first element of the list
print (list[1:3]) # Prints elements starting from 2nd till 3rd
print (list[2:]) # Prints elements starting from 3rd element
print (tinylist * 2) # Prints list two times
print (list + tinylist) # Prints concatenated lists
Daje to następujący wynik -
['abcd', 786, 2.23, 'john', 70.200000000000003]
abcd
[786, 2.23]
[2.23, 'john', 70.200000000000003]
[123, 'john', 123, 'john']
['abcd', 786, 2.23, 'john', 70.200000000000003, 123, 'john']
Krotki Pythona
Krotka to inny typ danych sekwencji, który jest podobny do listy. Krotka składa się z szeregu wartości oddzielonych przecinkami. Jednak w przeciwieństwie do list krotki są ujęte w nawiasach.
Główną różnicą między listami a krotkami jest - Listy są ujęte w nawiasy kwadratowe ([]), a ich elementy i rozmiar można zmieniać, podczas gdy krotki są zawarte w nawiasach (()) i nie można ich aktualizować. Krotki można traktować jakoread-onlylisty. Na przykład -
#!/usr/bin/python3
tuple = ( 'abcd', 786 , 2.23, 'john', 70.2 )
tinytuple = (123, 'john')
print (tuple) # Prints complete tuple
print (tuple[0]) # Prints first element of the tuple
print (tuple[1:3]) # Prints elements starting from 2nd till 3rd
print (tuple[2:]) # Prints elements starting from 3rd element
print (tinytuple * 2) # Prints tuple two times
print (tuple + tinytuple) # Prints concatenated tuple
Daje to następujący wynik -
('abcd', 786, 2.23, 'john', 70.200000000000003)
abcd
(786, 2.23)
(2.23, 'john', 70.200000000000003)
(123, 'john', 123, 'john')
('abcd', 786, 2.23, 'john', 70.200000000000003, 123, 'john')
Poniższy kod jest nieprawidłowy w przypadku krotki, ponieważ próbowaliśmy zaktualizować krotkę, co jest niedozwolone. Podobny przypadek jest możliwy w przypadku list -
#!/usr/bin/python3
tuple = ( 'abcd', 786 , 2.23, 'john', 70.2 )
list = [ 'abcd', 786 , 2.23, 'john', 70.2 ]
tuple[2] = 1000 # Invalid syntax with tuple
list[2] = 1000 # Valid syntax with list
Słownik Pythona
Słowniki Pythona są rodzajami tablic mieszających. Działają jak tablice asocjacyjne lub skróty występujące w Perlu i składają się z par klucz-wartość. Klucz słownika może być prawie dowolnego typu w Pythonie, ale zwykle są to liczby lub łańcuchy. Z drugiej strony wartościami mogą być dowolne obiekty w Pythonie.
Słowniki są ujęte w nawiasy klamrowe ({}), a wartości mogą być przypisywane i otwierane za pomocą nawiasów kwadratowych ([]). Na przykład -
#!/usr/bin/python3
dict = {}
dict['one'] = "This is one"
dict[2] = "This is two"
tinydict = {'name': 'john','code':6734, 'dept': 'sales'}
print (dict['one']) # Prints value for 'one' key
print (dict[2]) # Prints value for 2 key
print (tinydict) # Prints complete dictionary
print (tinydict.keys()) # Prints all the keys
print (tinydict.values()) # Prints all the values
Daje to następujący wynik -
This is one
This is two
{'name': 'john', 'dept': 'sales', 'code': 6734}
dict_keys(['name', 'dept', 'code'])
dict_values(['john', 'sales', 6734])
Słowniki nie mają koncepcji porządku między elementami. Nieprawidłowe jest stwierdzenie, że elementy są „niesprawne”; są po prostu nieuporządkowane.
Konwersja typu danych
Czasami może być konieczne wykonanie konwersji między typami wbudowanymi. Aby dokonać konwersji między typami, wystarczy użyć nazw typów jako funkcji.
Istnieje kilka wbudowanych funkcji do przeprowadzania konwersji z jednego typu danych na inny. Te funkcje zwracają nowy obiekt reprezentujący przekonwertowaną wartość.
Sr.No. | Opis funkcji |
---|---|
1 | int(x [,base]) Konwertuje x na liczbę całkowitą. Baza określa podstawę, jeśli x jest łańcuchem. |
2 | float(x) Konwertuje x na liczbę zmiennoprzecinkową. |
3 | complex(real [,imag]) Tworzy liczbę zespoloną. |
4 | str(x) Konwertuje obiekt x na reprezentację w postaci ciągu. |
5 | repr(x) Konwertuje obiekt x na ciąg wyrażenia. |
6 | eval(str) Oblicza ciąg i zwraca obiekt. |
7 | tuple(s) Konwertuje s na krotkę. |
8 | list(s) Konwertuje s na listę. |
9 | set(s) Konwertuje s na zbiór. |
10 | dict(d) Tworzy słownik. d musi być sekwencją krotek (klucz, wartość). |
11 | frozenset(s) Konwertuje s na zamrożony zestaw. |
12 | chr(x) Konwertuje liczbę całkowitą na znak. |
13 | unichr(x) Konwertuje liczbę całkowitą na znak Unicode. |
14 | ord(x) Konwertuje pojedynczy znak na jego wartość całkowitą. |
15 | hex(x) Konwertuje liczbę całkowitą na ciąg szesnastkowy. |
16 | oct(x) Konwertuje liczbę całkowitą na ciąg ósemkowy. |
Operatory to konstrukcje, które mogą manipulować wartością operandów. Rozważmy wyrażenie 4 + 5 = 9. Tutaj, 4 i 5 nazywane są operandami, a + nazywamy operatorem.
Typy operatorów
Język Python obsługuje następujące typy operatorów -
- Operatory arytmetyczne
- Operatory porównania (relacyjne)
- Operatory przypisania
- Operatory logiczne
- Operatory bitowe
- Operatorzy członkostwa
- Operatory tożsamości
Przyjrzyjmy się kolejno wszystkim operatorom.
Operatory arytmetyczne w Pythonie
Przyjmij zmienną a przechowuje wartość 10 i zmienną b ma wartość 21, a następnie -
Pokaż przykład
Operator | Opis | Przykład |
---|---|---|
+ Dodatek | Dodaje wartości po obu stronach operatora. | a + b = 31 |
- Odejmowanie | Odejmuje operand po prawej stronie od operandu po lewej stronie. | a - b = -11 |
* Mnożenie | Mnoży wartości po obu stronach operatora | a * b = 210 |
/ Podział | Dzieli operand lewej ręki przez operand prawej ręki | b / a = 2,1 |
% Modułu | Dzieli operand po lewej stronie przez operand po prawej stronie i zwraca resztę | b% a = 1 |
** Wykładnik | Wykonuje obliczenia wykładnicze (potęgowe) na operatorach | a ** b = 10 do potęgi 20 |
// | Podział piętra - dzielenie argumentów, których wynikiem jest iloraz, w którym usuwane są cyfry po przecinku. Ale jeśli jeden z operandów jest ujemny, wynik jest zmienny, tj. Zaokrąglony od zera (w kierunku ujemnej nieskończoności): | 9 // 2 = 4 i 9,0 // 2,0 = 4,0, -11 // 3 = -4, -11,0 // 3 = -4,0 |
Operatory porównania w Pythonie
Te operatory porównują wartości po obu stronach i decydują o relacji między nimi. Nazywa się je również operatorami relacyjnymi.
Przyjmij zmienną a przechowuje wartość 10 i zmienną b ma wartość 20, a następnie -
Pokaż przykład
Operator | Opis | Przykład |
---|---|---|
== | Jeśli wartości dwóch operandów są równe, warunek staje się prawdziwy. | (a == b) nie jest prawdą. |
! = | Jeśli wartości dwóch operandów nie są równe, warunek staje się prawdziwy. | (a! = b) jest prawdą. |
> | Jeśli wartość lewego operandu jest większa niż wartość prawego operandu, warunek staje się prawdziwy. | (a> b) nie jest prawdą. |
< | Jeśli wartość lewego operandu jest mniejsza niż wartość prawego operandu, warunek staje się prawdziwy. | (a <b) jest prawdą. |
> = | Jeśli wartość lewego operandu jest większa lub równa wartości prawego operandu, warunek staje się prawdziwy. | (a> = b) nie jest prawdą. |
<= | Jeśli wartość lewego operandu jest mniejsza lub równa wartości prawego operandu, warunek staje się prawdziwy. | (a <= b) jest prawdą. |
Operatory przypisania w Pythonie
Przyjmij zmienną a przechowuje wartość 10 i zmienną b ma wartość 20, a następnie -
Pokaż przykład
Operator | Opis | Przykład |
---|---|---|
= | Przypisuje wartości z operandów po prawej stronie do operandów po lewej stronie | c = a + b przypisuje wartość a + b do c |
+ = Dodaj I | Dodaje prawy operand do lewego operandu i przypisuje wynik do lewego operandu | c + = a jest równoważne c = c + a |
- = Odejmij AND | Odejmuje prawy operand od lewego operandu i przypisuje wynik lewemu operandowi | c - = a jest równoważne c = c - a |
* = Pomnóż AND | Mnoży prawy operand z lewym operandem i przypisuje wynik do lewego operandu | c * = a jest równoważne c = c * a |
/ = Dzielenie AND | Dzieli lewy operand z prawym operandem i przypisuje wynik lewemu operandowi | c / = a jest równoważne c = c / ac / = a jest równoważne c = c / a |
% = Moduł AND | Pobiera moduł używając dwóch operandów i przypisuje wynik do lewego operandu | c% = a jest równoważne c = c% a |
** = wykładnik AND | Wykonuje obliczenia wykładnicze (potęgowe) na operatorach i przypisuje wartość do lewego operandu | c ** = a jest równoważne c = c ** a |
// = Podział piętra | Dokonuje podziału na operatorów i przypisuje wartość do lewego operandu | c // = a jest równoważne c = c // a |
Operatory bitowe Pythona
Operator bitowy działa na bitach i wykonuje operacje bit po bicie. Załóżmy, że a = 60; i b = 13; Teraz w formacie binarnym będą one następujące -
a = 0011 1100
b = 0000 1101
-----------------
a & b = 0000 1100
a | b = 0011 1101
a ^ b = 0011 0001
~ a = 1100 0011
Wbudowana funkcja Pythona bin () może służyć do uzyskania binarnej reprezentacji liczby całkowitej.
Następujące operatory bitowe są obsługiwane przez język Python -
Pokaż przykład
Operator | Opis | Przykład |
---|---|---|
& Binarne AND | Operator kopiuje trochę do wyniku, jeśli istnieje w obu operandach | (a i b) (oznacza 0000 1100) |
| Binarny OR | Kopiuje trochę, jeśli istnieje w którymkolwiek operandzie. | (a | b) = 61 (oznacza 0011 1101) |
^ Binarny XOR | Kopiuje bit, jeśli jest ustawiony w jednym operandzie, ale nie w obu. | (a ^ b) = 49 (oznacza 0011 0001) |
~ Uzupełnienie binarne | Jest jednoargumentowy i powoduje „przerzucanie” bitów. | (~ a) = -61 (oznacza 1100 0011 w postaci uzupełnienia do 2 ze względu na liczbę binarną ze znakiem. |
<< Binarne przesunięcie w lewo | Wartość lewego operandu jest przesuwana w lewo o liczbę bitów określoną przez prawy operand. | a << 2 = 240 (oznacza 1111 0000) |
>> Binarny prawy Shift | Wartość lewego operandu jest przesuwana w prawo o liczbę bitów określoną przez prawy operand. | a >> 2 = 15 (oznacza 0000 1111) |
Operatory logiczne Pythona
Poniższe operatory logiczne są obsługiwane przez język Python. Przyjmij zmiennąa posiada Prawdę i zmienną b trzyma wtedy Fałsz -
Pokaż przykład
Operator | Opis | Przykład |
---|---|---|
i logiczne AND | Jeśli oba operandy są prawdziwe, warunek staje się prawdziwy. | (a i b) jest fałszywe. |
lub logiczne LUB | Jeśli którykolwiek z dwóch operandów jest niezerowy, warunek staje się prawdziwy. | (a lub b) jest Prawdą. |
nie logiczne NIE | Służy do odwracania stanu logicznego argumentu. | Nie (a i b) jest prawdą. |
Operatory członkostwa w Pythonie
Operatory członkostwa w Pythonie sprawdzają członkostwo w sekwencji, takiej jak łańcuchy, listy lub krotki. Istnieją dwa operatory członkostwa, jak wyjaśniono poniżej -
Pokaż przykład
Operator | Opis | Przykład |
---|---|---|
w | Zwraca wartość true, jeśli znajdzie zmienną w określonej kolejności lub false w przeciwnym razie. | x in y, tutaj w wynikach 1, jeśli x jest członkiem ciągu y. |
nie w | Zwraca wartość true, jeśli nie znajdzie zmiennej w określonej kolejności lub false w przeciwnym razie. | x nie w y, tutaj nie w wynikach w 1, jeśli x nie jest członkiem ciągu y. |
Operatory tożsamości w Pythonie
Operatory tożsamości porównują lokalizacje pamięci dwóch obiektów. Istnieją dwa operatory tożsamości, jak wyjaśniono poniżej -
Pokaż przykład
Operator | Opis | Przykład |
---|---|---|
jest | Zwraca wartość true, jeśli zmienne po obu stronach operatora wskazują na ten sam obiekt, aw przeciwnym razie - false. | x jest y, tutaj is daje w wyniku 1, jeśli id (x) jest równe id (y). |
nie jest | Zwraca wartość false, jeśli zmienne po obu stronach operatora wskazują ten sam obiekt, aw przeciwnym razie - true. | x nie jest y, tutaj is not daje 1, jeśli id (x) nie jest równe id (y). |
Pierwszeństwo operatorów Pythona
W poniższej tabeli wymieniono wszystkie operatory od najwyższego do najniższego priorytetu.
Pokaż przykład
Sr.No. | Operator i opis |
---|---|
1 | ** Potęgowanie (podniesienie do potęgi) |
2 | ~ + - Dopełnienie, jednoargumentowy plus i minus (nazwy metod dla ostatnich dwóch to + @ i - @) |
3 | * / % // Mnożenie, dzielenie, dzielenie modulo i piętro |
4 | + - Dodawanie i odejmowanie |
5 | >> << Przesunięcie bitowe w prawo iw lewo |
6 | & Bitowe „AND” |
7 | ^ | Wyłączne bitowo „OR” i zwykłe „OR” |
8 | <= < > >= Operatory porównania |
9 | <> == != Operatory równości |
10 | = %= /= //= -= += *= **= Operatory przypisania |
11 | is is not Operatory tożsamości |
12 | in not in Operatorzy członkostwa |
13 | not or and Operatory logiczne |
Podejmowanie decyzji to przewidywanie warunków występujących podczas realizacji programu i określonych działań podejmowanych zgodnie z warunkami.
Struktury decyzyjne oceniają wiele wyrażeń, które dają wynik PRAWDA lub FAŁSZ. Musisz określić, które działanie należy podjąć i które instrukcje wykonać, jeśli wynik jest PRAWDA lub FAŁSZ w przeciwnym razie.
Poniżej przedstawiono ogólną formę typowej struktury podejmowania decyzji występującej w większości języków programowania -
Język programowania Python zakłada dowolne pliki non-zero i non-null wartości PRAWDA i dowolne zero lub null values jako wartość FALSE.
Język programowania Python udostępnia następujące typy instrukcji decyzyjnych.
Sr.No. | Oświadczenie i opis |
---|---|
1 | jeśli oświadczenia Na if statement składa się z wyrażenia logicznego, po którym następuje co najmniej jedna instrukcja. |
2 | if ... else oświadczenia Na if statement może następować opcjonalnie else statement, który jest wykonywany, gdy wyrażenie boolowskie ma wartość FALSE. |
3 | zagnieżdżone instrukcje if Możesz użyć jednego if lub else if oświadczenie wewnątrz innego if lub else if sprawozdania). |
Przeanalizujmy szybko każde oświadczenie decyzyjne.
Pakiety z pojedynczym wyciągiem
Jeśli zestaw if klauzula składa się tylko z jednego wiersza, może znajdować się w tym samym wierszu, co instrukcja nagłówka.
Przykład
Oto przykład pliku one-line if klauzula -
#!/usr/bin/python3
var = 100
if ( var == 100 ) : print ("Value of expression is 100")
print ("Good bye!")
Wynik
Wykonanie powyższego kodu daje następujący wynik -
Value of expression is 100
Good bye!
Ogólnie instrukcje są wykonywane sekwencyjnie - pierwsza instrukcja funkcji jest wykonywana jako pierwsza, po niej następuje druga i tak dalej. Może zaistnieć sytuacja, w której trzeba będzie kilkakrotnie wykonać blok kodu.
Języki programowania zapewniają różne struktury kontrolne, które pozwalają na bardziej skomplikowane ścieżki wykonywania.
Instrukcja pętli umożliwia wielokrotne wykonanie instrukcji lub grupy instrukcji. Poniższy diagram ilustruje instrukcję pętli -
Język programowania Python udostępnia następujące typy pętli do obsługi wymagań dotyczących pętli.
Sr.No. | Typ i opis pętli |
---|---|
1 | pętla while Powtarza instrukcję lub grupę instrukcji, gdy dany warunek ma wartość TRUE. Testuje warunek przed wykonaniem treści pętli. |
2 | dla pętli Wykonuje sekwencję instrukcji wiele razy i skraca kod zarządzający zmienną pętli. |
3 | pętle zagnieżdżone Możesz użyć jednej lub więcej pętli wewnątrz dowolnej innej pętli while lub for. |
Instrukcje sterowania pętlą
Instrukcje sterujące Loop zmieniają wykonanie z jego normalnej sekwencji. Gdy wykonanie opuszcza zakres, wszystkie automatyczne obiekty, które zostały utworzone w tym zakresie, są niszczone.
Python obsługuje następujące instrukcje sterujące.
Sr.No. | Oświadczenie i opis kontroli |
---|---|
1 | instrukcja break Kończy instrukcję pętli i przenosi wykonanie do instrukcji bezpośrednio po pętli. |
2 | kontynuuj oświadczenie Powoduje, że pętla pomija pozostałą część swojego ciała i natychmiast ponownie testuje swój stan przed ponownym powtórzeniem. |
3 | instrukcja pass Instrukcja pass w Pythonie jest używana, gdy instrukcja jest wymagana składniowo, ale nie chcesz, aby żadne polecenie ani kod były wykonywane. |
Przyjrzyjmy się pokrótce instrukcjom sterującym pętli.
Iterator i generator
Iteratorto obiekt, który umożliwia programiście przechodzenie przez wszystkie elementy kolekcji, niezależnie od jej konkretnej implementacji. W Pythonie obiekt iteratora implementuje dwie metody,iter() i next().
Obiekty typu String, List lub Tuple mogą służyć do tworzenia Iteratora.
list = [1,2,3,4]
it = iter(list) # this builds an iterator object
print (next(it)) #prints next available element in iterator
Iterator object can be traversed using regular for statement
!usr/bin/python3
for x in it:
print (x, end=" ")
or using next() function
while True:
try:
print (next(it))
except StopIteration:
sys.exit() #you have to import sys module for this
ZA generator to funkcja, która tworzy lub zwraca sekwencję wartości przy użyciu metody uzysku.
Gdy wywoływana jest funkcja generatora, zwraca ona obiekt generatora nawet bez rozpoczynania wykonywania funkcji. Gdy metoda next () jest wywoływana po raz pierwszy, funkcja rozpoczyna wykonywanie do momentu osiągnięcia instrukcji yield, która zwraca otrzymaną wartość. Wydajność śledzi, tj. Pamięta ostatnie wykonanie, a drugie wywołanie next () jest kontynuowane od poprzedniej wartości.
Przykład
Poniższy przykład definiuje generator, który generuje iterator dla wszystkich liczb Fibonacciego.
#!usr/bin/python3
import sys
def fibonacci(n): #generator function
a, b, counter = 0, 1, 0
while True:
if (counter > n):
return
yield a
a, b = b, a + b
counter += 1
f = fibonacci(5) #f is iterator object
while True:
try:
print (next(f), end=" ")
except StopIteration:
sys.exit()
Typy danych liczbowych przechowują wartości liczbowe. Są to niezmienne typy danych. Oznacza to, że zmiana wartości typu danych liczbowych powoduje powstanie nowo przydzielonego obiektu.
Obiekty liczbowe są tworzone, gdy przypisujesz im wartość. Na przykład -
var1 = 1
var2 = 10
Możesz również usunąć odwołanie do obiektu liczbowego przy użyciu rozszerzenia delkomunikat. Składniadel oświadczenie to -
del var1[,var2[,var3[....,varN]]]]
Możesz usunąć pojedynczy obiekt lub wiele obiektów przy użyciu rozszerzenia delkomunikat. Na przykład -
del var
del var_a, var_b
Python obsługuje różne typy liczbowe -
int (signed integers) - Często nazywane są po prostu liczbami całkowitymi lub ints. Są dodatnimi lub ujemnymi liczbami całkowitymi bez kropki dziesiętnej. Liczby całkowite w Pythonie 3 mają nieograniczony rozmiar. Python 2 ma dwa typy liczb całkowitych - int i long. Nie ma 'long integer'już w Pythonie 3.
float (floating point real values)- Nazywane również liczbami zmiennoprzecinkowymi, reprezentują liczby rzeczywiste i są zapisywane z kropką dziesiętną dzielącą liczbę całkowitą i części ułamkowe. Pływaki mogą być również w notacji naukowej, gdzie E lub e wskazują potęgę 10 (2,5e2 = 2,5 x 10 2 = 250).
complex (complex numbers)- mają postać a + bJ, gdzie a i b są liczbami zmiennoprzecinkowymi, a J (lub j) reprezentuje pierwiastek kwadratowy z -1 (który jest liczbą urojoną). Część rzeczywistą liczby to a, a częścią urojoną jest b. Liczby zespolone nie są zbytnio używane w programowaniu w Pythonie.
Możliwe jest przedstawienie liczby całkowitej w postaci szesnastkowej lub ósemkowej
>>> number = 0xA0F #Hexa-decimal
>>> number
2575
>>> number = 0o37 #Octal
>>> number
31
Przykłady
Oto kilka przykładów liczb.
int | pływak | złożony |
---|---|---|
10 | 0.0 | 3.14j |
100 | 15.20 | 45.j |
-786 | -21,9 | 9.322e-36j |
080 | 32,3 + e18 | .876j |
-0490 | -90. | -,6545 + 0J |
-0 × 260 | -32,54e100 | 3e + 26J |
0 × 69 | 70,2-E12 | 4.53e-7j |
Liczba zespolona składa się z uporządkowanej pary rzeczywistych liczb zmiennoprzecinkowych oznaczonych a + bj, gdzie a jest częścią rzeczywistą, a b jest częścią urojoną liczby zespolonej.
Konwersja typu liczb
Python wewnętrznie konwertuje liczby w wyrażeniu zawierającym typy mieszane do wspólnego typu w celu oceny. Czasami trzeba jawnie przekształcić liczbę z jednego typu na inny, aby spełnić wymagania operatora lub parametru funkcji.
Rodzaj int(x) aby przekonwertować x na zwykłą liczbę całkowitą.
Rodzaj long(x) aby przekonwertować x na długą liczbę całkowitą.
Rodzaj float(x) aby przekonwertować x na liczbę zmiennoprzecinkową.
Rodzaj complex(x) przekonwertować x na liczbę zespoloną z częścią rzeczywistą x i częścią urojoną zero.
Rodzaj complex(x, y)przekonwertować x i y na liczbę zespoloną z częścią rzeczywistą x i częścią urojoną y. x i y to wyrażenia numeryczne
Funkcje matematyczne
Python zawiera następujące funkcje, które wykonują obliczenia matematyczne.
Sr.No. | Funkcja i zwroty (opis) |
---|---|
1 | abs (x) Wartość bezwzględna x: (dodatnia) odległość między x a zerem. |
2 | sufit (x) Pułap x: najmniejsza liczba całkowita nie mniejsza niż x. |
3 | cmp(x, y) -1 jeśli x <y, 0 jeśli x == y lub 1 jeśli x> y. Deprecated w Pythonie 3. Zamiast tego użyj return (x>y)-(x<y). |
4 | exp (x) Wykładniczy z x: e x |
5 | fabs (x) Wartość bezwzględna x. |
6 | piętro (x) Podłoga x: największa liczba całkowita nie większa niż x. |
7 | log (x) Logarytm naturalny x dla x> 0. |
8 | log10 (x) Logarytm dziesiętny z x dla x> 0. |
9 | max (x1, x2, ...) Największy z jego argumentów: wartość najbliższa dodatniej nieskończoności |
10 | min (x1, x2, ...) Najmniejszy z jego argumentów: wartość najbliższa ujemnej nieskończoności. |
11 | modf (x) Ułamkowe i całkowite części x w krotce składającej się z dwóch elementów. Obie części mają ten sam znak co x. Część całkowita jest zwracana jako liczba zmiennoprzecinkowa. |
12 | pow (x, y) Wartość x ** y. |
13 | round (x [, n]) xzaokrąglone do n cyfr od przecinka. Python zaokrągla od zera jako rozstrzygający remis: runda (0,5) to 1,0, a runda (-0,5) to -1,0. |
14 | sqrt (x) Pierwiastek kwadratowy z x dla x> 0. |
Funkcje liczb losowych
Liczby losowe są używane w grach, symulacjach, testach, zabezpieczeniach i aplikacjach do ochrony prywatności. Python zawiera następujące powszechnie używane funkcje.
Sr.No. | Opis funkcji |
---|---|
1 | wybór (kolejność) Losowy element z listy, krotki lub ciągu. |
2 | randrange ([start,] stop [, krok]) Losowo wybrany element z zakresu (start, stop, step). |
3 | losowy() Losowy zmiennoprzecinkowy r, taki że 0 jest mniejsze lub równe r i r jest mniejsze niż 1 |
4 | ziarno ([x]) Ustawia całkowitą wartość początkową używaną podczas generowania liczb losowych. Wywołaj tę funkcję przed wywołaniem jakiejkolwiek innej losowej funkcji modułu. Zwraca brak. |
5 | shuffle (lst) Losuje pozycje listy w miejscu. Zwraca brak. |
6 | jednolity (x, y) Losowy zmiennoprzecinkowy r, taki, że x jest mniejsze lub równe r i r jest mniejsze niż y. |
Funkcje trygonometryczne
Python zawiera następujące funkcje, które wykonują obliczenia trygonometryczne.
Sr.No. | Opis funkcji |
---|---|
1 | acos (x) Zwraca arcus cosinus z x w radianach. |
2 | asin (x) Zwraca arcus sinus z x w radianach. |
3 | atan (x) Zwróć styczną łuku dla x w radianach. |
4 | atan2 (y, x) Zwraca atan (y / x) w radianach. |
5 | cos (x) Zwróć cosinus x radianów. |
6 | hypot (x, y) Zwróć normę euklidesową, sqrt (x * x + y * y). |
7 | sin (x) Zwraca sinus z x radianów. |
8 | opalenizna (x) Zwraca tangens x radianów. |
9 | stopnie (x) Konwertuje kąt x z radianów na stopnie. |
10 | radiany (x) Konwertuje kąt x ze stopni na radiany. |
Stałe matematyczne
Moduł definiuje również dwie stałe matematyczne -
Sr.No. | Stałe i opis |
---|---|
1 | pi Matematyczna stała pi. |
2 | e Stała matematyczna e. |
Ciągi znaków należą do najpopularniejszych typów w Pythonie. Możemy je tworzyć po prostu umieszczając znaki w cudzysłowach. Python traktuje pojedyncze cudzysłowy tak samo, jak podwójne cudzysłowy. Tworzenie ciągów jest tak proste, jak przypisanie wartości do zmiennej. Na przykład -
var1 = 'Hello World!'
var2 = "Python Programming"
Dostęp do wartości w ciągach
Python nie obsługuje typów znaków; są one traktowane jako ciągi o długości jeden, dlatego też są traktowane jako podciąg.
Aby uzyskać dostęp do podciągów, użyj nawiasów kwadratowych do cięcia wraz z indeksem lub indeksami, aby uzyskać podciąg. Na przykład -
#!/usr/bin/python3
var1 = 'Hello World!'
var2 = "Python Programming"
print ("var1[0]: ", var1[0])
print ("var2[1:5]: ", var2[1:5])
Wykonanie powyższego kodu daje następujący wynik -
var1[0]: H
var2[1:5]: ytho
Aktualizowanie ciągów
Możesz „zaktualizować” istniejący ciąg poprzez (ponowne) przypisanie zmiennej do innego ciągu. Nowa wartość może być powiązana z jej poprzednią wartością lub zupełnie innym ciągiem. Na przykład -
#!/usr/bin/python3
var1 = 'Hello World!'
print ("Updated String :- ", var1[:6] + 'Python')
Wykonanie powyższego kodu daje następujący wynik -
Updated String :- Hello Python
Znaki ucieczki
Poniższa tabela zawiera listę znaków zmiany znaczenia lub znaków niedrukowalnych, które można przedstawić za pomocą notacji z ukośnikiem odwrotnym.
Znak ucieczki jest interpretowany; w ciągach pojedynczych i podwójnych cudzysłowów.
Notacja z ukośnikiem odwrotnym | Znak szesnastkowy | Opis |
---|---|---|
\za | 0x07 | Dzwonek lub alert |
\b | 0x08 | Backspace |
\ cx | Control + x | |
\ Cx | Control + x | |
\mi | 0x1b | Ucieczka |
\fa | 0x0c | Formfeed |
\ M- \ Cx | Meta-Control-x | |
\ n | 0x0a | Nowa linia |
\ nnn | Notacja ósemkowa, gdzie n mieści się w zakresie 0,7 | |
\ r | 0x0d | Powrót karetki |
\ s | 0x20 | Przestrzeń |
\ t | 0x09 | Patka |
\ v | 0x0b | Zakładka pionowa |
\ x | Postać x | |
\ xnn | Zapis szesnastkowy, gdzie n mieści się w zakresie 0,9, af lub AF |
Operatory specjalne łańcuchów
Załóż zmienną łańcuchową a zawiera „Hello” i zmienną b zawiera „Python”, a następnie -
Operator | Opis | Przykład |
---|---|---|
+ | Konkatenacja - dodaje wartości po obu stronach operatora | a + b da HelloPython |
* | Powtórzenie - tworzy nowe ciągi, łącząc wiele kopii tego samego ciągu | a * 2 da -HelloHello |
[] | Slice - podaje znak z podanego indeksu | a [1] da e |
[:] | Fragment zakresu - podaje znaki z podanego zakresu | a [1: 4] da łokieć |
w | Członkostwo - zwraca wartość true, jeśli znak istnieje w podanym ciągu | H w a da 1 |
nie w | Członkostwo - zwraca wartość true, jeśli znak nie istnieje w podanym ciągu | M nie da 1 |
r / R | Surowy ciąg - pomija rzeczywiste znaczenie znaków ucieczki. Składnia nieprzetworzonych łańcuchów jest dokładnie taka sama, jak w przypadku zwykłych ciągów, z wyjątkiem surowego operatora łańcucha, litery „r”, która poprzedza cudzysłowy. Litera „r” może być małą (r) lub wielką (R) i musi zostać umieszczona bezpośrednio przed pierwszym cudzysłowem. | print r '\ n' drukuje \ n i drukuje R '\ n'prints \ n |
% | Format - wykonuje formatowanie ciągów | Zobacz w następnej sekcji |
Operator formatowania łańcucha
Jedną z najfajniejszych funkcji Pythona jest operator formatu ciągu znaków%. Ten operator jest unikalny dla łańcuchów i stanowi pakiet funkcji z rodziny printf () języka C. Oto prosty przykład -
#!/usr/bin/python3
print ("My name is %s and weight is %d kg!" % ('Zara', 21))
Wykonanie powyższego kodu daje następujący wynik -
My name is Zara and weight is 21 kg!
Oto lista pełnego zestawu symboli, których można używać wraz z% -
Sr.No. | Formatuj symbol i konwersję |
---|---|
1 | %c postać |
2 | %s konwersja ciągów przez str () przed formatowaniem |
3 | %i liczba całkowita dziesiętna ze znakiem |
4 | %d liczba całkowita dziesiętna ze znakiem |
5 | %u liczba całkowita dziesiętna bez znaku |
6 | %o ósemkowa liczba całkowita |
7 | %x liczba szesnastkowa całkowita (małe litery) |
8 | %X liczba szesnastkowa całkowita (wielkie litery) |
9 | %e notacja wykładnicza (z małą literą „e”) |
10 | %E notacja wykładnicza (z WIELKĄ LITERĄ „E”) |
11 | %f zmiennoprzecinkowa liczba rzeczywista |
12 | %g krótszy z% f i% e |
13 | %G krótszy z% f i% E |
Inne obsługiwane symbole i funkcje są wymienione w poniższej tabeli -
Sr.No. | Symbol i funkcjonalność |
---|---|
1 | * argument określa szerokość lub precyzję |
2 | - lewe uzasadnienie |
3 | + wyświetlić znak |
4 | <sp> pozostaw puste miejsce przed liczbą dodatnią |
5 | # dodaj wiodące zero ósemkowe („0”) lub wiodące szesnastkowe „0x” lub „0X”, w zależności od tego, czy użyto „x” czy „X”. |
6 | 0 wypełnij od lewej zerami (zamiast spacji) |
7 | % „%%” pozostawia pojedynczy literał „%” |
8 | (var) mapowanie zmiennej (argumenty słownikowe) |
9 | m.n. m to minimalna całkowita szerokość, an to liczba cyfr do wyświetlenia po przecinku (jeśli ma to zastosowanie). |
Potrójne cytaty
Potrójne cudzysłowy w Pythonie przychodzą na ratunek, pozwalając ciągom na rozciąganie wielu wierszy, w tym dosłowne znaki NEWLINE, TAB i inne znaki specjalne.
Składnia potrójnych cudzysłowów składa się z trzech następujących po sobie single or double cytaty.
#!/usr/bin/python3
para_str = """this is a long string that is made up of
several lines and non-printable characters such as
TAB ( \t ) and they will show up that way when displayed.
NEWLINEs within the string, whether explicitly given like
this within the brackets [ \n ], or just a NEWLINE within
the variable assignment will also show up.
"""
print (para_str)
Wykonanie powyższego kodu daje następujący wynik. Zwróć uwagę, jak każdy pojedynczy znak specjalny został przekonwertowany do postaci drukowanej, aż do ostatniego znaku NEWLINE na końcu ciągu między „w górę”. i zamykające potrójne cudzysłowy. Zwróć też uwagę, że znaki NEWLINE występują albo z jawnym powrotem karetki na końcu wiersza, albo z jego kodem ucieczki (\ n) -
this is a long string that is made up of
several lines and non-printable characters such as
TAB ( ) and they will show up that way when displayed.
NEWLINEs within the string, whether explicitly given like
this within the brackets [
], or just a NEWLINE within
the variable assignment will also show up.
Surowe łańcuchy w ogóle nie traktują ukośnika odwrotnego jako znaku specjalnego. Każdy znak, który umieścisz w nieprzetworzonym łańcuchu, pozostaje taki, jaki został napisany -
#!/usr/bin/python3
print ('C:\\nowhere')
Wykonanie powyższego kodu daje następujący wynik -
C:\nowhere
Skorzystajmy teraz z surowego łańcucha. Włożylibyśmy wyrazr'expression' w następujący sposób -
#!/usr/bin/python3
print (r'C:\\nowhere')
Wykonanie powyższego kodu daje następujący wynik -
C:\\nowhere
Ciąg Unicode
W Pythonie 3 wszystkie łańcuchy są reprezentowane w Unicode, w Pythonie 2 są przechowywane wewnętrznie jako 8-bitowe ASCII, dlatego wymagane jest dołączenie litery „u”, aby uzyskać Unicode. Nie jest to już konieczne.
Wbudowane metody łańcuchowe
Python zawiera następujące wbudowane metody do manipulowania ciągami znaków -
Sr.No. | Metody i opis |
---|---|
1 | skapitalizować() Zamienia pierwszą literę ciągu na wielką literę |
2 | środek (szerokość, znak wypełnienia) Zwraca ciąg wypełniony znakiem fillchar z oryginalnym ciągiem wyśrodkowanym do łącznej szerokości kolumn. |
3 | count (str, beg = 0, end = len (string)) Oblicza, ile razy str występuje w ciągu lub w podłańcuchu ciągu, jeśli podano początkowy indeks początkowy i końcowy koniec indeksu. |
4 | dekodować (kodowanie = „UTF-8”, błędy = „ścisłe”) Dekoduje ciąg przy użyciu kodeka zarejestrowanego do kodowania. encoding domyślnie na domyślne kodowanie ciągów. |
5 | encode (kodowanie = „UTF-8”, błędy = „ścisłe”) Zwraca zakodowaną wersję ciągu znaków; w przypadku błędu domyślnie powoduje zgłoszenie błędu ValueError, chyba że dla błędu podano „ignoruj” lub „zamień”. |
6 | endwith (sufiks, początek = 0, koniec = len (ciąg)) Określa, czy łańcuch lub podłańcuch łańcucha (jeśli podano początek indeksu początek i koniec indeksu koniec) kończy się sufiksem; zwraca wartość true, jeśli tak, i false, jeśli jest inaczej |
7 | expandtabs (tabsize = 8) Rozwija tabulatory w łańcuchu do wielu spacji; domyślnie 8 spacji na tabulator, jeśli nie podano rozmiaru tabulacji. |
8 | find (str, beg = 0 end = len (string)) Określić, czy str występuje w łańcuchu lub w podłańcuchu łańcucha, jeśli podano indeks początkowy początek i koniec indeksu, zwraca indeks, jeśli zostanie znaleziony, a -1 w przeciwnym razie. |
9 | index (str, beg = 0, end = len (string)) To samo co find (), ale zgłasza wyjątek, jeśli nie znaleziono ciągu. |
10 | isalnum () Zwraca wartość true, jeśli łańcuch ma co najmniej 1 znak, a wszystkie znaki są alfanumeryczne, aw przeciwnym razie - fałsz. |
11 | isalpha () Zwraca wartość true, jeśli łańcuch ma co najmniej 1 znak, a wszystkie znaki są alfabetyczne, aw przeciwnym razie - fałsz. |
12 | isdigit () Zwraca wartość true, jeśli ciąg zawiera tylko cyfry, lub false, jeśli jest inaczej. |
13 | islower () Zwraca wartość true, jeśli łańcuch ma co najmniej 1 znak wielkości liter, a wszystkie znaki pisane są małymi literami, aw przeciwnym razie - fałsz. |
14 | isnumeric () Zwraca wartość true, jeśli ciąg znaków Unicode zawiera tylko znaki numeryczne, lub false, jeśli jest inaczej. |
15 | isspace () Zwraca wartość true, jeśli ciąg zawiera tylko białe znaki, lub false, jeśli jest inaczej. |
16 | istitle () Zwraca wartość „prawda”, jeśli ciąg znaków zawiera poprawnie „tytuł”, a fałsz, jeśli jest inaczej. |
17 | isupper () Zwraca wartość true, jeśli łańcuch ma co najmniej jeden znak wielkości liter, a wszystkie znaki wielkości liter są duże, aw przeciwnym razie - fałsz. |
18 | dołącz (kolejność) Łączy (łączy) ciągi reprezentujące elementy w sekwencji sekwencyjnej w ciąg z ciągiem separującym. |
19 | len (ciąg) Zwraca długość ciągu |
20 | ljust (width [, fillchar]) Zwraca ciąg uzupełniony spacjami z oryginalnym ciągiem wyrównanym do lewej do łącznej szerokości kolumn. |
21 | niższy() Konwertuje wszystkie wielkie litery w ciągu na małe litery. |
22 | lstrip () Usuwa wszystkie wiodące spacje w ciągu. |
23 | maketrans () Zwraca tabelę tłumaczeń do użycia w funkcji tłumaczenia. |
24 | max (str) Zwraca maksymalny znak alfabetyczny z ciągu str. |
25 | min (str) Zwraca min znak alfabetyczny z ciągu str. |
26 | zastąp (stary, nowy [, maks.]) Zastępuje wszystkie wystąpienia starego w łańcuchu nowymi lub co najwyżej max wystąpieniami, jeśli podano max. |
27 | rfind (str, beg = 0, end = len (string)) To samo, co find (), ale przeszukuje wstecz w ciągu. |
28 | rindex (str, beg = 0, end = len (string)) To samo co index (), ale przeszukuje wstecz w ciągu. |
29 | rjust (width, [, fillchar]) Zwraca ciąg uzupełniony spacjami z oryginalnym ciągiem wyrównanym do prawej do łącznej szerokości kolumn. |
30 | rstrip () Usuwa wszystkie końcowe spacje ciągu. |
31 | split (str = "", num = string.count (str)) Dzieli łańcuch zgodnie z separatorem (spacja, jeśli nie podano) i zwraca listę podciągów; podziel na co najwyżej num podciągów, jeśli podano. |
32 | splitlines (num = string.count ('\ n')) Dzieli ciąg na wszystkich (lub w liczbie) NEWLINEs i zwraca listę wszystkich wierszy z usuniętymi NEWLINEs. |
33 | beginwith (str, beg = 0, end = len (string)) Określa, czy łańcuch lub podłańcuch łańcucha (jeśli podano początkowy indeks początkowy i końcowy indeks końcowy) zaczyna się od podłańcucha str; zwraca wartość true, jeśli tak, i false, jeśli jest inaczej |
34 | strip ([znaki]) Wykonuje na łańcuchu zarówno lstrip (), jak i rstrip () |
35 | swapcase () Odwraca wielkość liter dla wszystkich liter w ciągu. |
36 | tytuł() Zwraca wersję ciągu oznaczoną „tytułem”, czyli wszystkie słowa zaczynają się od wielkich liter, a pozostałe są małymi literami. |
37 | przetłumacz (tabela, deletechars = "") Tłumaczy ciąg zgodnie z tabelą translacji str (256 znaków), usuwając te z łańcucha del. |
38 | górny() Konwertuje małe litery w ciągu na duże. |
39 | zfill (szerokość) Zwraca oryginalny łańcuch z odstępami zerowymi do całkowitej liczby znaków szerokości; przeznaczona dla liczb, zfill () zachowuje każdy podany znak (pomniejszony o jedno zero). |
40 | isdecimal () Zwraca wartość true, jeśli ciąg znaków Unicode zawiera tylko znaki dziesiętne, lub false, jeśli jest inaczej. |
Najbardziej podstawową strukturą danych w Pythonie jest sequence. Każdy element sekwencji ma przypisany numer - jego pozycję lub indeks. Pierwszy indeks to zero, drugi to jeden i tak dalej.
Python ma sześć wbudowanych typów sekwencji, ale najczęściej są to listy i krotki, które zobaczylibyśmy w tym samouczku.
Są pewne rzeczy, które możesz zrobić ze wszystkimi typami sekwencji. Te operacje obejmują indeksowanie, wycinanie, dodawanie, mnożenie i sprawdzanie członkostwa. Ponadto Python ma wbudowane funkcje do znajdowania długości sekwencji oraz znajdowania jej największych i najmniejszych elementów.
Listy w Pythonie
Lista jest najbardziej wszechstronnym typem danych dostępnym w Pythonie, który można zapisać jako listę wartości oddzielonych przecinkami (elementów) w nawiasach kwadratowych. Ważną rzeczą związaną z listą jest to, że pozycje na liście nie muszą być tego samego typu.
Tworzenie listy jest tak proste, jak umieszczanie różnych wartości oddzielonych przecinkami w nawiasach kwadratowych. Na przykład -
list1 = ['physics', 'chemistry', 1997, 2000];
list2 = [1, 2, 3, 4, 5 ];
list3 = ["a", "b", "c", "d"];
Podobnie jak w przypadku indeksów łańcuchowych, indeksy list zaczynają się od 0, a listy można kroić, łączyć i tak dalej.
Dostęp do wartości w listach
Aby uzyskać dostęp do wartości na listach, użyj nawiasów kwadratowych do wycinania wraz z indeksem lub indeksami, aby uzyskać wartość dostępną w tym indeksie. Na przykład -
#!/usr/bin/python3
list1 = ['physics', 'chemistry', 1997, 2000]
list2 = [1, 2, 3, 4, 5, 6, 7 ]
print ("list1[0]: ", list1[0])
print ("list2[1:5]: ", list2[1:5])
Wykonanie powyższego kodu daje następujący wynik -
list1[0]: physics
list2[1:5]: [2, 3, 4, 5]
Aktualizowanie list
Możesz aktualizować jeden lub wiele elementów list, podając wycinek po lewej stronie operatora przypisania, a możesz dodawać elementy do listy za pomocą metody append (). Na przykład -
#!/usr/bin/python3
list = ['physics', 'chemistry', 1997, 2000]
print ("Value available at index 2 : ", list[2])
list[2] = 2001
print ("New value available at index 2 : ", list[2])
Note - Metoda append () została omówiona w następnej sekcji.
Wykonanie powyższego kodu daje następujący wynik -
Value available at index 2 : 1997
New value available at index 2 : 2001
Usuń elementy listy
Aby usunąć element listy, możesz użyć rozszerzenia deloświadczenie, jeśli dokładnie wiesz, które elementy usuwasz. Możesz użyć metody remove (), jeśli nie wiesz dokładnie, które elementy usunąć. Na przykład -
#!/usr/bin/python3
list = ['physics', 'chemistry', 1997, 2000]
print (list)
del list[2]
print ("After deleting value at index 2 : ", list)
Wykonanie powyższego kodu daje następujący wynik -
['physics', 'chemistry', 1997, 2000]
After deleting value at index 2 : ['physics', 'chemistry', 2000]
Note - metodę remove () omówiono w dalszej części.
Podstawowe operacje na listach
Listy reagują na operatory + i *, podobnie jak łańcuchy; tutaj również mają na myśli konkatenację i powtórzenie, z wyjątkiem tego, że wynikiem jest nowa lista, a nie ciąg.
W rzeczywistości listy odpowiadają wszystkim ogólnym operacjom na sekwencjach, których używaliśmy na łańcuchach w poprzednim rozdziale.
Wyrażenie Pythona | Wyniki | Opis |
---|---|---|
len ([1, 2, 3]) | 3 | Długość |
[1, 2, 3] + [4, 5, 6] | [1, 2, 3, 4, 5, 6] | Powiązanie |
[„Cześć!”] * 4 | [„Cześć!”, „Cześć!”, „Cześć!”, „Cześć!”] | Powtórzenie |
3 w [1, 2, 3] | Prawdziwe | Członkostwo |
for x in [1,2,3]: print (x, end = '') | 1 2 3 | Iteracja |
Indeksowanie, wycinanie i macierze
Ponieważ listy są sekwencjami, indeksowanie i krojenie działają w taki sam sposób w przypadku list, jak w przypadku łańcuchów.
Zakładając następujące dane wejściowe -
L = ['C++'', 'Java', 'Python']
Wyrażenie Pythona | Wyniki | Opis |
---|---|---|
L [2] | 'Pyton' | Przesunięcia zaczynają się od zera |
L [-2] | 'Jawa' | Negatywne: policz od prawej |
L [1:] | [„Java”, „Python”] | Cięcie na plasterki pobiera sekcje |
Wbudowane funkcje i metody list
Python zawiera następujące funkcje listowe -
Sr.No. | Opis funkcji |
---|---|
1 | len (lista) Podaje całkowitą długość listy. |
2 | max (lista) Zwraca pozycję z listy o maksymalnej wartości. |
3 | min (lista) Zwraca pozycję z listy o wartości minimalnej. |
4 | list (seq) Konwertuje krotkę na listę. |
Python zawiera następujące metody list -
Sr.No. | Metody i opis |
---|---|
1 | list.append (obj) Dołącza obiekt obj do listy |
2 | list.count (obj) Zwraca liczbę, ile razy obj występuje na liście |
3 | list.extend (seq) Dołącza zawartość seq do listy |
4 | list.index (obj) Zwraca najniższy indeks na liście, który pojawia się obj |
5 | list.insert (indeks, obj) Wstawia obiekt obj do listy pod indeksem offsetu |
6 | list.pop (obj = list [-1]) Usuwa i zwraca ostatni obiekt lub obiekt z listy |
7 | list.remove (obj) Usuwa obiekt obj z listy |
8 | list.reverse () Odwraca obiekty listy w miejscu |
9 | list.sort ([func]) Sortuje obiekty na liście, jeśli podano, użyj funkcji porównania |
Krotka to zbiór obiektów, które są uporządkowane i niezmienne. Krotki to sekwencje, podobnie jak listy. Główna różnica między krotkami a listami polega na tym, że krotki nie mogą być zmieniane w przeciwieństwie do list. Krotki używają nawiasów, podczas gdy listy używają nawiasów kwadratowych.
Tworzenie krotki jest tak proste, jak umieszczanie różnych wartości oddzielonych przecinkami. Opcjonalnie możesz również umieścić te wartości oddzielone przecinkami w nawiasach. Na przykład -
tup1 = ('physics', 'chemistry', 1997, 2000)
tup2 = (1, 2, 3, 4, 5 )
tup3 = "a", "b", "c", "d"
Pusta krotka jest zapisywana jako dwa nawiasy zawierające nic -
tup1 = ();
Aby napisać krotkę zawierającą pojedynczą wartość, musisz dołączyć przecinek, nawet jeśli jest tylko jedna wartość -
tup1 = (50,)
Podobnie jak indeksy łańcuchowe, indeksy krotek zaczynają się od 0 i mogą być dzielone, łączone i tak dalej.
Dostęp do wartości w krotkach
Aby uzyskać dostęp do wartości w krotce, użyj nawiasów kwadratowych do wycinania wraz z indeksem lub indeksami, aby uzyskać wartość dostępną w tym indeksie. Na przykład -
#!/usr/bin/python3
tup1 = ('physics', 'chemistry', 1997, 2000)
tup2 = (1, 2, 3, 4, 5, 6, 7 )
print ("tup1[0]: ", tup1[0])
print ("tup2[1:5]: ", tup2[1:5])
Wykonanie powyższego kodu daje następujący wynik -
tup1[0]: physics
tup2[1:5]: (2, 3, 4, 5)
Aktualizowanie krotek
Krotki są niezmienne, co oznacza, że nie można aktualizować ani zmieniać wartości elementów krotki. Możesz wziąć fragmenty istniejących krotek, aby utworzyć nowe krotki, jak pokazano w poniższym przykładzie -
#!/usr/bin/python3
tup1 = (12, 34.56)
tup2 = ('abc', 'xyz')
# Following action is not valid for tuples
# tup1[0] = 100;
# So let's create a new tuple as follows
tup3 = tup1 + tup2
print (tup3)
Wykonanie powyższego kodu daje następujący wynik -
(12, 34.56, 'abc', 'xyz')
Usuń elementy krotki
Usunięcie pojedynczych elementów krotki nie jest możliwe. Nie ma oczywiście nic złego w składaniu kolejnej krotki z odrzuconymi niepożądanymi elementami.
Aby jawnie usunąć całą krotkę, po prostu użyj delkomunikat. Na przykład -
#!/usr/bin/python3
tup = ('physics', 'chemistry', 1997, 2000);
print (tup)
del tup;
print ("After deleting tup : ")
print (tup)
Daje to następujący wynik.
Note- Zgłoszono wyjątek. To dlatego, że podel tup, krotka już nie istnieje.
('physics', 'chemistry', 1997, 2000)
After deleting tup :
Traceback (most recent call last):
File "test.py", line 9, in <module>
print tup;
NameError: name 'tup' is not defined
Podstawowe operacje na krotkach
Krotki reagują na operatory + i *, podobnie jak łańcuchy; tutaj również mają na myśli konkatenację i powtarzanie, z tym wyjątkiem, że wynikiem jest nowa krotka, a nie ciąg.
W rzeczywistości krotki odpowiadają na wszystkie ogólne operacje sekwencyjne, których użyliśmy na łańcuchach w poprzednim rozdziale.
Wyrażenie Pythona | Wyniki | Opis |
---|---|---|
len ((1, 2, 3)) | 3 | Długość |
(1, 2, 3) + (4, 5, 6) | (1, 2, 3, 4, 5, 6) | Powiązanie |
(„Cześć!”,) * 4 | („Cześć!”, „Cześć!”, „Cześć!”, „Cześć!”) | Powtórzenie |
3 w (1, 2, 3) | Prawdziwe | Członkostwo |
for x in (1,2,3): print (x, end = '') | 1 2 3 | Iteracja |
Indeksowanie, wycinanie i macierze
Ponieważ krotki są sekwencjami, indeksowanie i krojenie działają w taki sam sposób w przypadku krotek, jak w przypadku łańcuchów, przy założeniu, że dane wejściowe -
T=('C++', 'Java', 'Python')
Wyrażenie Pythona | Wyniki | Opis |
---|---|---|
T [2] | 'Pyton' | Przesunięcia zaczynają się od zera |
T [-2] | 'Jawa' | Negatywne: policz od prawej |
T [1:] | („Java”, „Python”) | Cięcie na plasterki pobiera sekcje |
Brak ograniczników otaczających
Żaden otaczający separator nie jest żadnym zestawem wielu obiektów, oddzielonych przecinkami, zapisanymi bez identyfikujących symboli, tj. Nawiasy dla list, nawiasy dla krotek itp., Domyślnie są to krotki, jak wskazano w tych krótkich przykładach.
Wbudowane funkcje krotki
Python zawiera następujące funkcje krotek -
Sr.No. | Opis funkcji |
---|---|
1 | cmp (tuple1, tuple2) Porównuje elementy obu krotek. |
2 | len (krotka) Podaje całkowitą długość krotki. |
3 | max (krotka) Zwraca element z krotki o maksymalnej wartości. |
4 | min (krotka) Zwraca element z krotki o wartości minimalnej. |
5 | krotka (kolejność) Konwertuje listę na krotkę. |
Każdy klucz jest oddzielony od swojej wartości dwukropkiem (:), elementy oddzielone przecinkami, a całość ujęta jest w nawiasy klamrowe. Pusty słownik bez żadnych elementów jest zapisywany za pomocą tylko dwóch nawiasów klamrowych, na przykład: {}.
Klucze są unikalne w słowniku, a wartości nie mogą. Wartości słownika mogą być dowolnego typu, ale klucze muszą być niezmiennym typem danych, takim jak łańcuchy, liczby lub krotki.
Dostęp do wartości w słowniku
Aby uzyskać dostęp do elementów słownika, możesz użyć znanych nawiasów kwadratowych wraz z kluczem, aby uzyskać jego wartość. Oto prosty przykład -
#!/usr/bin/python3
dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}
print ("dict['Name']: ", dict['Name'])
print ("dict['Age']: ", dict['Age'])
Wykonanie powyższego kodu daje następujący wynik -
dict['Name']: Zara
dict['Age']: 7
Jeśli spróbujemy uzyskać dostęp do elementu danych za pomocą klucza, który nie jest częścią słownika, otrzymujemy następujący błąd -
#!/usr/bin/python3
dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'};
print ("dict['Alice']: ", dict['Alice'])
Wykonanie powyższego kodu daje następujący wynik -
dict['Zara']:
Traceback (most recent call last):
File "test.py", line 4, in <module>
print "dict['Alice']: ", dict['Alice'];
KeyError: 'Alice'
Aktualizowanie słownika
Słownik można zaktualizować, dodając nowy wpis lub parę klucz-wartość, modyfikując istniejący wpis lub usuwając istniejący wpis, jak pokazano na prostym przykładzie podanym poniżej.
#!/usr/bin/python3
dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}
dict['Age'] = 8; # update existing entry
dict['School'] = "DPS School" # Add new entry
print ("dict['Age']: ", dict['Age'])
print ("dict['School']: ", dict['School'])
Wykonanie powyższego kodu daje następujący wynik -
dict['Age']: 8
dict['School']: DPS School
Usuń elementy słownika
Możesz usunąć poszczególne elementy słownika lub wyczyścić całą zawartość słownika. Możesz także usunąć cały słownik w jednej operacji.
Aby jawnie usunąć cały słownik, po prostu użyj delkomunikat. Oto prosty przykład -
#!/usr/bin/python3
dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}
del dict['Name'] # remove entry with key 'Name'
dict.clear() # remove all entries in dict
del dict # delete entire dictionary
print ("dict['Age']: ", dict['Age'])
print ("dict['School']: ", dict['School'])
Daje to następujący wynik.
Zgłaszany jest wyjątek, ponieważ after del dict, słownik już nie istnieje.
dict['Age']:
Traceback (most recent call last):
File "test.py", line 8, in <module>
print "dict['Age']: ", dict['Age'];
TypeError: 'type' object is unsubscriptable
Note - Metoda del () została omówiona w kolejnej sekcji.
Właściwości kluczy słownikowych
Wartości słownikowe nie mają ograniczeń. Mogą to być dowolne obiekty Pythona, obiekty standardowe lub obiekty zdefiniowane przez użytkownika. Jednak to samo nie dotyczy kluczy.
Istnieją dwie ważne kwestie, o których należy pamiętać o klawiszach słownika
(a)Więcej niż jeden wpis na klucz jest niedozwolony. Oznacza to, że żaden zduplikowany klucz nie jest dozwolony. W przypadku napotkania zduplikowanych kluczy podczas przypisywania wygrywa ostatnie przypisanie. Na przykład -
#!/usr/bin/python3
dict = {'Name': 'Zara', 'Age': 7, 'Name': 'Manni'}
print ("dict['Name']: ", dict['Name'])
Wykonanie powyższego kodu daje następujący wynik -
dict['Name']: Manni
(b)Klucze muszą być niezmienne. Oznacza to, że możesz używać łańcuchów, liczb lub krotek jako kluczy słownika, ale coś takiego jak ['klucz'] jest niedozwolone. Oto prosty przykład -
#!/usr/bin/python3
dict = {['Name']: 'Zara', 'Age': 7}
print ("dict['Name']: ", dict['Name'])
Wykonanie powyższego kodu daje następujący wynik -
Traceback (most recent call last):
File "test.py", line 3, in <module>
dict = {['Name']: 'Zara', 'Age': 7}
TypeError: list objects are unhashable
Wbudowane funkcje i metody słownika
Python zawiera następujące funkcje słownikowe -
Sr.No. | Opis funkcji |
---|---|
1 | cmp (dict1, dict2) Nie jest już dostępny w Pythonie 3. |
2 | len (dict) Podaje całkowitą długość słownika. Byłoby to równe liczbie pozycji w słowniku. |
3 | str (dict) Tworzy drukowalną reprezentację słownika w postaci ciągu |
4 | typ (zmienna) Zwraca typ przekazanej zmiennej. Jeśli przekazaną zmienną jest słownik, to zwróci typ słownika. |
Python zawiera następujące metody słownikowe -
Sr.No. | Metoda i opis |
---|---|
1 | dict.clear () Usuwa wszystkie elementy słowniku dict |
2 | dict.copy () Zwraca płytkie kopia słowniku dict |
3 | dict.fromkeys () Utwórz nowy słownik z kluczami od seq i wartościami ustawionymi na wartość . |
4 | dict.get (key, default = None) W przypadku klucza klucz zwraca wartość lub wartość domyślną, jeśli klucza nie ma w słowniku |
5 | dict.has_key (klucz) Usunięte, należy użyć w pracy zamiast. |
6 | dict.items () Returns a list of dict's (key, value) tuple pairs |
7 | dict.keys() Returns list of dictionary dict's keys |
8 | dict.setdefault(key, default = None) Similar to get(), but will set dict[key] = default if key is not already in dict |
9 | dict.update(dict2) Adds dictionary dict2's key-values pairs to dict |
10 | dict.values() Returns list of dictionary dict's values |
A Python program can handle date and time in several ways. Converting between date formats is a common chore for computers. Python's time and calendar modules help track dates and times.
What is Tick?
Time intervals are floating-point numbers in units of seconds. Particular instants in time are expressed in seconds since 12:00am, January 1, 1970(epoch).
There is a popular time module available in Python which provides functions for working with times, and for converting between representations. The function time.time() returns the current system time in ticks since 12:00am, January 1, 1970(epoch).
Example
#!/usr/bin/python3
import time; # This is required to include time module.
ticks = time.time()
print ("Number of ticks since 12:00am, January 1, 1970:", ticks)
This would produce a result something as follows −
Number of ticks since 12:00am, January 1, 1970: 1455508609.34375
Date arithmetic is easy to do with ticks. However, dates before the epoch cannot be represented in this form. Dates in the far future also cannot be represented this way - the cutoff point is sometime in 2038 for UNIX and Windows.
What is TimeTuple?
Many of the Python's time functions handle time as a tuple of 9 numbers, as shown below −
Index | Field | Values |
---|---|---|
0 | 4-digit year | 2016 |
1 | Month | 1 to 12 |
2 | Day | 1 to 31 |
3 | Hour | 0 to 23 |
4 | Minute | 0 to 59 |
5 | Second | 0 to 61 (60 or 61 are leap-seconds) |
6 | Day of Week | 0 to 6 (0 is Monday) |
7 | Day of year | 1 to 366 (Julian day) |
8 | Daylight savings | -1, 0, 1, -1 means library determines DST |
For Example −
import time
print (time.localtime());
This would produce a result as follows −
time.struct_time(tm_year = 2016, tm_mon = 2, tm_mday = 15, tm_hour = 9,
tm_min = 29, tm_sec = 2, tm_wday = 0, tm_yday = 46, tm_isdst = 0)
The above tuple is equivalent to struct_time structure. This structure has following attributes −
Index | Attributes | Values |
---|---|---|
0 | tm_year | 2016 |
1 | tm_mon | 1 to 12 |
2 | tm_mday | 1 to 31 |
3 | tm_hour | 0 to 23 |
4 | tm_min | 0 to 59 |
5 | tm_sec | 0 to 61 (60 or 61 are leap-seconds) |
6 | tm_wday | 0 to 6 (0 is Monday) |
7 | tm_yday | 1 to 366 (Julian day) |
8 | tm_isdst | -1, 0, 1, -1 means library determines DST |
Getting current time
To translate a time instant from seconds since the epoch floating-point value into a timetuple, pass the floating-point value to a function (e.g., localtime) that returns a time-tuple with all valid nine items.
#!/usr/bin/python3
import time
localtime = time.localtime(time.time())
print ("Local current time :", localtime)
This would produce the following result, which could be formatted in any other presentable form −
Local current time : time.struct_time(tm_year = 2016, tm_mon = 2, tm_mday = 15,
tm_hour = 9, tm_min = 29, tm_sec = 2, tm_wday = 0, tm_yday = 46, tm_isdst = 0)
Getting formatted time
You can format any time as per your requirement, but a simple method to get time in a readable format is asctime() −
Live Demo#!/usr/bin/python3
import time
localtime = time.asctime( time.localtime(time.time()) )
print ("Local current time :", localtime)
Dałoby to następujący wynik -
Local current time : Mon Feb 15 09:34:03 2016
Otrzymuję kalendarz na miesiąc
Moduł kalendarza oferuje szeroki wachlarz metod gry z kalendarzami rocznymi i miesięcznymi. Tutaj drukujemy kalendarz na dany miesiąc (styczeń 2008) -
#!/usr/bin/python3
import calendar
cal = calendar.month(2016, 2)
print ("Here is the calendar:")
print (cal)
Dałoby to następujący wynik -
Here is the calendar:
February 2016
Mo Tu We Th Fr Sa Su
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29
Moduł czasu
Jest popularny timemoduł dostępny w Pythonie, który udostępnia funkcje do pracy z czasami i do konwersji między reprezentacjami. Oto lista wszystkich dostępnych metod.
Sr.No. | Opis funkcji |
---|---|
1 | time.altzone Przesunięcie lokalnej strefy czasowej DST, w sekundach na zachód od czasu UTC, jeśli takie zostało zdefiniowane. Jest to wartość ujemna, jeśli lokalna strefa czasowa DST znajduje się na wschód od czasu UTC (jak w Europie Zachodniej, w tym w Wielkiej Brytanii). Użyj tego, jeśli światło dzienne jest niezerowe. |
2 | time.asctime ([tupletime]) Akceptuje krotkę czasu i zwraca czytelny 24-znakowy ciąg, na przykład „Tue Dec 11 18:07:14 2008”. |
3 | zegar( ) Zwraca bieżący czas procesora jako zmiennoprzecinkową liczbę sekund. Aby zmierzyć koszty obliczeniowe różnych podejść, wartość time.clock jest bardziej użyteczna niż wartość time.time (). |
4 | time.ctime ([sek.]) Jak asctime (localtime (secs)) i bez argumentów jest jak asctime () |
5 | time.gmtime ([sek.]) Akceptuje moment wyrażony w sekundach od epoki i zwraca krotkę czasu t z czasem UTC. Uwaga - t.tm_isdst ma zawsze wartość 0 |
6 | time.localtime ([sek.]) Akceptuje moment wyrażony w sekundach od epoki i zwraca krotkę czasu t z czasem lokalnym (t.tm_isdst wynosi 0 lub 1, w zależności od tego, czy czas letni ma zastosowanie do chwilowych sekund według reguł lokalnych). |
7 | time.mktime (tupletime) Akceptuje moment wyrażony jako krotka czasowa w czasie lokalnym i zwraca wartość zmiennoprzecinkową z chwilą wyrażoną w sekundach od epoki. |
8 | time.sleep (sek.) Zawiesza wątek wywołujący na sekundę. |
9 | time.strftime (fmt [, tupletime]) Akceptuje moment obrotowy wyrażony jako krotka czasowa w czasie lokalnym i zwraca ciąg znaków reprezentujący chwilę określoną przez string fmt. |
10 | time.strptime (str, fmt = '% a% b% d% H:% M:% S% Y') Analizuje str zgodnie z ciągiem formatu fmt i zwraca moment w formacie krotki czasu. |
11 | czas czas( ) Zwraca bieżącą chwilę czasu, zmiennoprzecinkową liczbę sekund od epoki. |
12 | time.tzset () Resetuje reguły konwersji czasu używane przez procedury biblioteczne. Zmienna środowiskowa TZ określa, jak to się robi. |
W module czasu dostępne są dwa ważne atrybuty. Oni są -
Sr.No. | Atrybut i opis |
---|---|
1 | time.timezone Atrybut time.timezone to przesunięcie w sekundach lokalnej strefy czasowej (bez czasu letniego) od czasu UTC (> 0 w obu Amerykach; <= 0 w większości krajów Europy, Azji i Afryki). |
2 | time.tzname Atrybut time.tzname to para ciągów zależnych od ustawień regionalnych, które są nazwami lokalnej strefy czasowej, odpowiednio, bez i z czasem letnim. |
Moduł kalendarza
Moduł kalendarza udostępnia funkcje związane z kalendarzem, w tym funkcje drukowania kalendarza tekstowego na dany miesiąc lub rok.
Domyślnie kalendarz przyjmuje poniedziałek jako pierwszy dzień tygodnia, a niedzielę jako ostatni. Aby to zmienić, zadzwoń docalendar.setfirstweekday() funkcjonować.
Oto lista funkcji dostępnych z calendar moduł -
Sr.No. | Opis funkcji |
---|---|
1 | calendar.calendar(year,w = 2,l = 1,c = 6) Zwraca wielowierszowy ciąg z kalendarzem na rok sformatowany w trzech kolumnach oddzielonych spacjami. w jest szerokością w znakach każdej daty; każda linia ma długość 21 * w + 18 + 2 * c. l to liczba wierszy na każdy tydzień. |
2 | calendar.firstweekday( ) Zwraca bieżące ustawienie dla dnia tygodnia rozpoczynającego się każdego tygodnia. Domyślnie, gdy kalendarz jest importowany po raz pierwszy, jest to 0, co oznacza poniedziałek. |
3 | calendar.isleap(year) Zwraca wartość Prawda, jeśli rok jest rokiem przestępnym; w przeciwnym razie False. |
4 | calendar.leapdays(y1,y2) Zwraca całkowitą liczbę dni przestępnych w latach w zakresie (y1, y2). |
5 | calendar.month(year,month,w = 2,l = 1) Zwraca wielowierszowy ciąg z kalendarzem na miesiąc miesiąc rok rok, jeden wiersz na tydzień oraz dwa wiersze nagłówka. w jest szerokością w znakach każdej daty; każda linia ma długość 7 * w + 6. l to liczba wierszy na każdy tydzień. |
6 | calendar.monthcalendar(year,month) Zwraca listę list int. Każda podlista oznacza tydzień. Dni poza miesiącem rokiem ustawiane są na 0; dni w miesiącu są ustawione na dzień miesiąca, 1 i nowsze. |
7 | calendar.monthrange(year,month) Zwraca dwie liczby całkowite. Pierwsza z nich to kod dnia tygodnia pierwszego dnia miesiąca miesiąc w roku; druga to liczba dni w miesiącu. Kody dni roboczych to 0 (poniedziałek) do 6 (niedziela); numery miesięcy to od 1 do 12. |
8 | calendar.prcal(year,w = 2,l = 1,c = 6) Podobnie jak drukowanie kalendarza. Kalendarz (rok, w, l, c). |
9 | calendar.prmonth(year,month,w = 2,l = 1) Podobnie jak drukowanie kalendarza. Miesiąc (rok, miesiąc, w, l). |
10 | calendar.setfirstweekday(weekday) Ustawia pierwszy dzień każdego tygodnia na kod dnia tygodnia. Kody dni tygodnia to 0 (poniedziałek) do 6 (niedziela). |
11 | calendar.timegm(tupletime) Odwrotność time.gmtime: akceptuje moment czasowy w postaci krotki czasowej i zwraca ten sam moment, co zmiennoprzecinkowa liczba sekund od epoki. |
12 | calendar.weekday(year,month,day) Zwraca kod dnia tygodnia dla podanej daty. Kody dni roboczych to 0 (poniedziałek) do 6 (niedziela); numery miesięcy to od 1 (styczeń) do 12 (grudzień). |
Inne moduły i funkcje
Jeśli jesteś zainteresowany, tutaj znajdziesz listę innych ważnych modułów i funkcji do zabawy z datą i godziną w Pythonie -
- Moduł datetime
- Moduł pytz
- Moduł dateutil
Funkcja to blok zorganizowanego kodu wielokrotnego użytku, który służy do wykonywania jednej, powiązanej czynności. Funkcje zapewniają lepszą modułowość aplikacji i wysoki stopień ponownego wykorzystania kodu.
Jak już wiesz, Python oferuje wiele wbudowanych funkcji, takich jak print () itp., Ale możesz także tworzyć własne funkcje. Te funkcje są nazywane funkcjami zdefiniowanymi przez użytkownika.
Definiowanie funkcji
Możesz zdefiniować funkcje, aby zapewnić wymaganą funkcjonalność. Oto proste zasady definiowania funkcji w Pythonie.
Bloki funkcyjne zaczynają się od słowa kluczowego def po którym następuje nazwa funkcji i nawiasy (()).
Wszelkie parametry wejściowe lub argumenty należy umieścić w tych nawiasach. Możesz także zdefiniować parametry w tych nawiasach.
Pierwsza deklaracja funkcji może być opcjonalnie zestawienie - ciąg dokumentacja funkcji lub docstring .
Blok kodu w każdej funkcji zaczyna się od dwukropka (:) i jest wcięty.
Instrukcja return [wyrażenie] kończy funkcję, opcjonalnie przekazując z powrotem wyrażenie do wywołującego. Instrukcja return bez argumentów jest tym samym, co instrukcja return None.
Składnia
def functionname( parameters ):
"function_docstring"
function_suite
return [expression]
Domyślnie parametry zachowują się pozycyjnie i należy je informować w tej samej kolejności, w jakiej zostały zdefiniowane.
Przykład
Poniższa funkcja przyjmuje ciąg jako parametr wejściowy i wyświetla go na standardowym ekranie.
def printme( str ):
"This prints a passed string into this function"
print (str)
return
Wywołanie funkcji
Zdefiniowanie funkcji nadaje jej nazwę, określa parametry, które mają być zawarte w funkcji oraz strukturyzuje bloki kodu.
Po sfinalizowaniu podstawowej struktury funkcji można ją wykonać, wywołując ją z innej funkcji lub bezpośrednio z zachęty Pythona. Poniżej znajduje się przykład wywołaniaprintme() funkcja -
#!/usr/bin/python3
# Function definition is here
def printme( str ):
"This prints a passed string into this function"
print (str)
return
# Now you can call printme function
printme("This is first call to the user defined function!")
printme("Again second call to the same function")
Wykonanie powyższego kodu daje następujący wynik -
This is first call to the user defined function!
Again second call to the same function
Przekaż przez odniesienie a wartość
Wszystkie parametry (argumenty) w języku Python są przekazywane przez odniesienie. Oznacza to, że jeśli zmienisz to, do czego odnosi się parametr w funkcji, zmiana ta będzie również odzwierciedlać z powrotem w funkcji wywołującej. Na przykład -
#!/usr/bin/python3
# Function definition is here
def changeme( mylist ):
"This changes a passed list into this function"
print ("Values inside the function before change: ", mylist)
mylist[2]=50
print ("Values inside the function after change: ", mylist)
return
# Now you can call changeme function
mylist = [10,20,30]
changeme( mylist )
print ("Values outside the function: ", mylist)
Tutaj utrzymujemy odniesienie do przekazanego obiektu i dołączamy wartości w tym samym obiekcie. Dlatego dałoby to następujący wynik -
Values inside the function before change: [10, 20, 30]
Values inside the function after change: [10, 20, 50]
Values outside the function: [10, 20, 50]
Jest jeszcze jeden przykład, w którym argument jest przekazywany przez referencję, a referencja jest nadpisywana wewnątrz wywoływanej funkcji.
#!/usr/bin/python3
# Function definition is here
def changeme( mylist ):
"This changes a passed list into this function"
mylist = [1,2,3,4] # This would assi new reference in mylist
print ("Values inside the function: ", mylist)
return
# Now you can call changeme function
mylist = [10,20,30]
changeme( mylist )
print ("Values outside the function: ", mylist)
Parametr mylistjest lokalna dla funkcji changeme. Zmiana mylisty w ramach funkcji nie wpływa na mylistę. Funkcja nic nie robi i ostatecznie dałaby następujący wynik -
Values inside the function: [1, 2, 3, 4]
Values outside the function: [10, 20, 30]
Argumenty funkcji
Możesz wywołać funkcję, używając następujących typów argumentów formalnych -
- Wymagane argumenty
- Argumenty słów kluczowych
- Domyślne argumenty
- Argumenty o zmiennej długości
Wymagane argumenty
Wymagane argumenty to argumenty przekazywane do funkcji w prawidłowej kolejności pozycyjnej. Tutaj liczba argumentów w wywołaniu funkcji powinna być dokładnie zgodna z definicją funkcji.
Aby wywołać funkcję printme(), zdecydowanie musisz przekazać jeden argument, w przeciwnym razie spowoduje to następujący błąd składni -
#!/usr/bin/python3
# Function definition is here
def printme( str ):
"This prints a passed string into this function"
print (str)
return
# Now you can call printme function
printme()
Wykonanie powyższego kodu daje następujący wynik -
Traceback (most recent call last):
File "test.py", line 11, in <module>
printme();
TypeError: printme() takes exactly 1 argument (0 given)
Argumenty słów kluczowych
Argumenty słów kluczowych są powiązane z wywołaniami funkcji. Gdy używasz argumentów słów kluczowych w wywołaniu funkcji, obiekt wywołujący identyfikuje argumenty za pomocą nazwy parametru.
Pozwala to na pominięcie argumentów lub umieszczenie ich w niewłaściwej kolejności, ponieważ interpreter języka Python jest w stanie użyć podanych słów kluczowych, aby dopasować wartości do parametrów. Możesz także wywoływać słowa kluczowe doprintme() działają w następujący sposób -
#!/usr/bin/python3
# Function definition is here
def printme( str ):
"This prints a passed string into this function"
print (str)
return
# Now you can call printme function
printme( str = "My string")
Wykonanie powyższego kodu daje następujący wynik -
My string
Poniższy przykład daje jaśniejszy obraz. Zauważ, że kolejność parametrów nie ma znaczenia.
#!/usr/bin/python3
# Function definition is here
def printinfo( name, age ):
"This prints a passed info into this function"
print ("Name: ", name)
print ("Age ", age)
return
# Now you can call printinfo function
printinfo( age = 50, name = "miki" )
Wykonanie powyższego kodu daje następujący wynik -
Name: miki
Age 50
Argumenty domyślne
Argument domyślny to argument, który przyjmuje wartość domyślną, jeśli wartość nie została podana w wywołaniu funkcji dla tego argumentu. Poniższy przykład daje pomysł na domyślne argumenty, wyświetla domyślny wiek, jeśli nie zostanie przekazany -
#!/usr/bin/python3
# Function definition is here
def printinfo( name, age = 35 ):
"This prints a passed info into this function"
print ("Name: ", name)
print ("Age ", age)
return
# Now you can call printinfo function
printinfo( age = 50, name = "miki" )
printinfo( name = "miki" )
Wykonanie powyższego kodu daje następujący wynik -
Name: miki
Age 50
Name: miki
Age 35
Argumenty o zmiennej długości
Może zaistnieć potrzeba przetworzenia funkcji dla większej liczby argumentów niż określono podczas definiowania funkcji. Argumenty te nazywane są argumentami o zmiennej długości i nie są nazywane w definicji funkcji, w przeciwieństwie do argumentów wymaganych i domyślnych.
Składnia funkcji z argumentami zmiennymi niebędącymi słowami kluczowymi jest podana poniżej -
def functionname([formal_args,] *var_args_tuple ):
"function_docstring"
function_suite
return [expression]
Gwiazdka (*) jest umieszczana przed nazwą zmiennej, która zawiera wartości wszystkich argumentów zmiennych niebędących słowami kluczowymi. Ta krotka pozostaje pusta, jeśli podczas wywołania funkcji nie zostaną określone żadne dodatkowe argumenty. Oto prosty przykład -
#!/usr/bin/python3
# Function definition is here
def printinfo( arg1, *vartuple ):
"This prints a variable passed arguments"
print ("Output is: ")
print (arg1)
for var in vartuple:
print (var)
return
# Now you can call printinfo function
printinfo( 10 )
printinfo( 70, 60, 50 )
Wykonanie powyższego kodu daje następujący wynik -
Output is:
10
Output is:
70
60
50
Funkcje anonimowe
Te funkcje są nazywane anonimowymi, ponieważ nie są deklarowane w standardowy sposób przy użyciu defsłowo kluczowe. Możesz użyćlambda słowo kluczowe do tworzenia małych anonimowych funkcji.
Formy lambda mogą przyjmować dowolną liczbę argumentów, ale zwracają tylko jedną wartość w postaci wyrażenia. Nie mogą zawierać poleceń ani wielu wyrażeń.
Funkcja anonimowa nie może być bezpośrednim wywołaniem drukowania, ponieważ lambda wymaga wyrażenia.
Funkcje lambda mają własną lokalną przestrzeń nazw i nie mogą uzyskać dostępu do zmiennych innych niż te na ich liście parametrów i te w globalnej przestrzeni nazw.
Chociaż wydaje się, że wyrażenia lambda są jednowierszową wersją funkcji, nie są one równoważne instrukcjom wbudowanym w C lub C ++, których celem jest przydzielanie stosu przez przekazywanie funkcji podczas wywołania ze względu na wydajność.
Składnia
Składnia lambda funkcje zawierają tylko jedną instrukcję, która jest następująca -
lambda [arg1 [,arg2,.....argn]]:expression
Poniżej znajduje się przykład pokazujący, jak to zrobić lambda forma działania funkcji -
#!/usr/bin/python3
# Function definition is here
sum = lambda arg1, arg2: arg1 + arg2
# Now you can call sum as a function
print ("Value of total : ", sum( 10, 20 ))
print ("Value of total : ", sum( 20, 20 ))
Wykonanie powyższego kodu daje następujący wynik -
Value of total : 30
Value of total : 40
Instrukcja return
Instrukcja return [wyrażenie] kończy funkcję, opcjonalnie przekazując z powrotem wyrażenie do wywołującego. Instrukcja return bez argumentów jest tym samym, co instrukcja return None.
Wszystkie przykłady podane poniżej nie zwracają żadnej wartości. Możesz zwrócić wartość z funkcji w następujący sposób -
#!/usr/bin/python3
# Function definition is here
def sum( arg1, arg2 ):
# Add both the parameters and return them."
total = arg1 + arg2
print ("Inside the function : ", total)
return total
# Now you can call sum function
total = sum( 10, 20 )
print ("Outside the function : ", total )
Wykonanie powyższego kodu daje następujący wynik -
Inside the function : 30
Outside the function : 30
Zakres zmiennych
Wszystkie zmienne w programie mogą nie być dostępne we wszystkich lokalizacjach w tym programie. To zależy od tego, gdzie zadeklarowałeś zmienną.
Zakres zmiennej określa część programu, w której można uzyskać dostęp do określonego identyfikatora. W Pythonie istnieją dwa podstawowe zakresy zmiennych -
- Zmienne globalne
- Zmienne lokalne
Zmienne globalne a zmienne lokalne
Zmienne zdefiniowane w treści funkcji mają zasięg lokalny, a te zdefiniowane na zewnątrz mają zasięg globalny.
Oznacza to, że dostęp do zmiennych lokalnych można uzyskać tylko wewnątrz funkcji, w której zostały zadeklarowane, podczas gdy do zmiennych globalnych można uzyskać dostęp w całym ciele programu przez wszystkie funkcje. Kiedy wywołujesz funkcję, zmienne zadeklarowane w niej są przenoszone do zakresu. Oto prosty przykład -
#!/usr/bin/python3
total = 0 # This is global variable.
# Function definition is here
def sum( arg1, arg2 ):
# Add both the parameters and return them."
total = arg1 + arg2; # Here total is local variable.
print ("Inside the function local total : ", total)
return total
# Now you can call sum function
sum( 10, 20 )
print ("Outside the function global total : ", total )
Wykonanie powyższego kodu daje następujący wynik -
Inside the function local total : 30
Outside the function global total : 0
Moduł umożliwia logiczne organizowanie kodu w Pythonie. Grupowanie powiązanego kodu w moduł ułatwia jego zrozumienie i użycie. Moduł to obiekt Pythona z dowolnie nazwanymi atrybutami, które można wiązać i odwoływać.
Po prostu moduł to plik składający się z kodu Pythona. Moduł może definiować funkcje, klasy i zmienne. Moduł może również zawierać kod, który można uruchomić.
Przykład
Kod Pythona dla modułu o nazwie aname zwykle znajduje się w pliku o nazwie aname.py. Oto przykład prostego modułu, support.py -
def print_func( par ):
print "Hello : ", par
return
Instrukcja import
Możesz użyć dowolnego pliku źródłowego Pythona jako modułu, wykonując instrukcję importu w innym pliku źródłowym Pythona. Plikimport ma następującą składnię -
import module1[, module2[,... moduleN]
Gdy interpreter napotka instrukcję importu, importuje moduł, jeśli jest on obecny na ścieżce wyszukiwania. Ścieżka wyszukiwania to lista katalogów, które interpreter przeszukuje przed zaimportowaniem modułu. Na przykład, aby zaimportować moduł hello.py, musisz umieścić następujące polecenie u góry skryptu -
#!/usr/bin/python3
# Import module support
import support
# Now you can call defined function that module as follows
support.print_func("Zara")
Wykonanie powyższego kodu daje następujący wynik -
Hello : Zara
Moduł jest ładowany tylko raz, niezależnie od tego, ile razy był importowany. Zapobiega to powtarzaniu się wykonywania modułu w przypadku wielu importów.
Instrukcja from ... import
Pythona fromInstrukcja umożliwia importowanie określonych atrybutów z modułu do bieżącej przestrzeni nazw. Plikfrom...import ma następującą składnię -
from modname import name1[, name2[, ... nameN]]
Na przykład, aby zaimportować funkcję fibonacci z modułu fib, użyj następującej instrukcji -
#!/usr/bin/python3
# Fibonacci numbers module
def fib(n): # return Fibonacci series up to n
result = []
a, b = 0, 1
while b < n:
result.append(b)
a, b = b, a + b
return result
>>> from fib import fib
>>> fib(100)
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
Ta instrukcja nie importuje całego modułu fib do bieżącej przestrzeni nazw; po prostu wprowadza element fibonacci z modułu fib do globalnej tablicy symboli modułu importującego.
Instrukcja from ... import *
Możliwe jest również zaimportowanie wszystkich nazw z modułu do bieżącej przestrzeni nazw za pomocą następującej instrukcji importu -
from modname import *
Zapewnia to łatwy sposób importowania wszystkich elementów z modułu do bieżącej przestrzeni nazw; jednakże tego stwierdzenia należy używać oszczędnie.
Wykonywanie modułów jako skryptów
Wewnątrz modułu nazwa modułu (jako ciąg znaków) jest dostępna jako wartość zmiennej globalnej __name__. Kod w module zostanie wykonany tak, jakbyś go zaimportował, ale z __name__ ustawionym na „__main__”.
Dodaj ten kod na końcu modułu -
#!/usr/bin/python3
# Fibonacci numbers module
def fib(n): # return Fibonacci series up to n
result = []
a, b = 0, 1
while b < n:
result.append(b)
a, b = b, a + b
return result
if __name__ == "__main__":
f = fib(100)
print(f)
Po uruchomieniu powyższego kodu zostaną wyświetlone następujące dane wyjściowe.
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
Lokalizowanie modułów
Podczas importowania modułu interpreter języka Python wyszukuje moduł w następujących sekwencjach -
Bieżący katalog.
Jeśli moduł nie zostanie znaleziony, Python przeszukuje każdy katalog w zmiennej powłoki PYTHONPATH.
Jeśli wszystko inne zawiedzie, Python sprawdza domyślną ścieżkę. W systemie UNIX ta domyślna ścieżka to zwykle / usr / local / lib / python3 /.
Ścieżka wyszukiwania modułu jest przechowywana w systemie modułów sys jako plik sys.pathzmienna. Zmienna sys.path zawiera bieżący katalog, PYTHONPATH i wartość domyślną zależną od instalacji.
Zmienna PYTHONPATH
PYTHONPATH to zmienna środowiskowa, składająca się z listy katalogów. Składnia zmiennej PYTHONPATH jest taka sama, jak zmiennej powłoki PATH.
Oto typowa PYTHONPATH z systemu Windows -
set PYTHONPATH = c:\python34\lib;
A oto typowa PYTHONPATH z systemu UNIX -
set PYTHONPATH = /usr/local/lib/python
Przestrzenie nazw i zakresy
Zmienne to nazwy (identyfikatory), które odwzorowują obiekty. Nazw jest słownikiem nazw zmiennych (klawisze) i odpowiadających im obiektów (wartości).
Instrukcja Pythona może uzyskać dostęp do zmiennych w lokalnej przestrzeni nazw oraz w globalnej przestrzeni nazw . Jeśli zmienna lokalna i globalna mają taką samą nazwę, zmienna lokalna przesłania zmienną globalną.
Każda funkcja ma własną lokalną przestrzeń nazw. Metody klasowe podlegają tej samej zasadzie określania zakresu, co zwykłe funkcje.
Python zgaduje, czy zmienne są lokalne czy globalne. Zakłada, że każda zmienna, której przypisano wartość w funkcji, jest lokalna.
Dlatego, aby przypisać wartość zmiennej globalnej w ramach funkcji, należy najpierw użyć instrukcji global.
- Instrukcja global VarName mówi Pythonowi, że VarName jest zmienną globalną. Python przestaje przeszukiwać lokalną przestrzeń nazw dla zmiennej.
Na przykład definiujemy zmienną Money w globalnej przestrzeni nazw. W funkcji Money przypisujemy Money wartość, dlatego Python przyjmuje Money jako zmienną lokalną.
Jednak uzyskaliśmy dostęp do wartości zmiennej lokalnej Money przed jej ustawieniem, więc wynikiem jest UnboundLocalError. Usunięcie komentarzy z instrukcji globalnej rozwiązuje problem.
#!/usr/bin/python3
Money = 2000
def AddMoney():
# Uncomment the following line to fix the code:
# global Money
Money = Money + 1
print (Money)
AddMoney()
print (Money)
Funkcja dir ()
Funkcja wbudowana dir () zwraca posortowaną listę ciągów zawierających nazwy zdefiniowane przez moduł.
Lista zawiera nazwy wszystkich modułów, zmiennych i funkcji, które są zdefiniowane w module. Oto prosty przykład -
#!/usr/bin/python3
# Import built-in module math
import math
content = dir(math)
print (content)
Wykonanie powyższego kodu daje następujący wynik -
['__doc__', '__file__', '__name__', 'acos', 'asin', 'atan',
'atan2', 'ceil', 'cos', 'cosh', 'degrees', 'e', 'exp',
'fabs', 'floor', 'fmod', 'frexp', 'hypot', 'ldexp', 'log',
'log10', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh',
'sqrt', 'tan', 'tanh']
W tym przypadku specjalna zmienna łańcuchowa __name__ to nazwa modułu, a __file__ to nazwa pliku, z którego moduł został załadowany.
Funkcje globals () i locals ()
Plik globals() i locals() funkcje mogą służyć do zwracania nazw w globalnej i lokalnej przestrzeni nazw w zależności od lokalizacji, z której są wywoływane.
Gdyby locals() jest wywoływana z funkcji, zwróci wszystkie nazwy, do których można uzyskać dostęp lokalnie z tej funkcji.
Gdyby globals() jest wywoływana z funkcji, zwróci wszystkie nazwy, do których można uzyskać globalny dostęp z tej funkcji.
Typ zwracany przez obie te funkcje to słownik. Dlatego nazwy można wyodrębnić przy użyciu rozszerzeniakeys() funkcjonować.
Funkcja reload ()
Gdy moduł jest importowany do skryptu, kod znajdujący się w górnej części modułu jest wykonywany tylko raz.
Dlatego jeśli chcesz ponownie wykonać kod najwyższego poziomu w module, możesz użyć funkcji reload () . Funkcja reload () ponownie importuje wcześniej zaimportowany moduł. Składnia funkcji reload () jest następująca -
reload(module_name)
Tutaj nazwa_modułu to nazwa modułu, który chcesz przeładować, a nie ciąg znaków zawierający nazwę modułu. Na przykład, aby ponownie załadować moduł hello, wykonaj następujące czynności -
reload(hello)
Pakiety w Pythonie
Pakiet jest hierarchiczną strukturą katalogów plików, która definiuje pojedyncze środowisko aplikacji Pythona, które składa się z modułów, podpakietów i podpakietów itd.
Rozważ plik Pots.py dostępny w katalogu Phone. Ten plik zawiera następujący wiersz kodu źródłowego -
#!/usr/bin/python3
def Pots():
print ("I'm Pots Phone")
Podobnie mamy dwa inne pliki, które mają różne funkcje i mają taką samą nazwę jak powyżej. Oni są -
Plik Phone / Isdn.py z funkcją Isdn ()
Plik Phone / G3.py z funkcją G3 ()
Teraz utwórz jeszcze jeden plik __init__.py w katalogu Telefon -
- Phone/__init__.py
Aby wszystkie funkcje były dostępne po zaimportowaniu Phone, musisz umieścić wyraźne instrukcje importu w __init__.py w następujący sposób -
from Pots import Pots
from Isdn import Isdn
from G3 import G3
Po dodaniu tych wierszy do __init__.py wszystkie te klasy będą dostępne podczas importowania pakietu Phone.
#!/usr/bin/python3
# Now import your Phone Package.
import Phone
Phone.Pots()
Phone.Isdn()
Phone.G3()
Wykonanie powyższego kodu daje następujący wynik -
I'm Pots Phone
I'm 3G Phone
I'm ISDN Phone
W powyższym przykładzie wzięliśmy przykład pojedynczej funkcji w każdym pliku, ale możesz zachować wiele funkcji w swoich plikach. Możesz także zdefiniować różne klasy Pythona w tych plikach, a następnie możesz tworzyć pakiety z tych klas.
W tym rozdziale omówiono wszystkie podstawowe funkcje we / wy dostępne w języku Python 3. Więcej funkcji można znaleźć w standardowej dokumentacji języka Python.
Drukowanie na ekranie
Najprostszym sposobem uzyskania wyniku jest użycie instrukcji print , w której można przekazać zero lub więcej wyrażeń oddzielonych przecinkami. Ta funkcja konwertuje przekazane wyrażenia na ciąg i zapisuje wynik na standardowe wyjście w następujący sposób -
#!/usr/bin/python3
print ("Python is really a great language,", "isn't it?")
Daje to następujący wynik na ekranie standardowym -
Python is really a great language, isn't it?
Czytanie danych z klawiatury
Python 2 ma dwie wbudowane funkcje do odczytu danych ze standardowego wejścia, które domyślnie pochodzi z klawiatury. Te funkcje sąinput() i raw_input()
W Pythonie 3 funkcja raw_input () jest przestarzała. Ponadto funkcje input () odczytują dane z klawiatury jako ciąg znaków, niezależnie od tego, czy są one ujęte w cudzysłów („” lub „”), czy nie.
Funkcja wejściowa
Plik input([prompt]) function jest równoważne z raw_input, z tą różnicą, że zakłada, że dane wejściowe są prawidłowym wyrażeniem Pythona i zwraca oszacowany wynik do Ciebie.
#!/usr/bin/python3
>>> x = input("something:")
something:10
>>> x
'10'
>>> x = input("something:")
something:'10' #entered data treated as string with or without ''
>>> x
"'10'"
Otwieranie i zamykanie plików
Do tej pory czytałeś i zapisywałeś na standardowe wejście i wyjście. Teraz zobaczymy, jak używać rzeczywistych plików danych.
Python domyślnie udostępnia podstawowe funkcje i metody niezbędne do manipulowania plikami. Większość operacji na plikach można wykonać za pomocą rozszerzeniafile obiekt.
Otwarta funkcja
Zanim będziesz mógł odczytać lub zapisać plik, musisz go otworzyć za pomocą wbudowanej funkcji open () języka Python. Ta funkcja tworzy plikfile obiekt, który zostałby użyty do wywołania innych powiązanych z nim metod obsługi.
Składnia
file object = open(file_name [, access_mode][, buffering])
Oto szczegóły parametrów -
file_name - Argument nazwa_pliku to ciąg znaków zawierający nazwę pliku, do którego chcesz uzyskać dostęp.
access_mode- access_mode określa tryb, w jakim plik ma zostać otwarty, tj. Czytać, zapisywać, dołączać itp. Pełna lista możliwych wartości jest podana poniżej w tabeli. Jest to parametr opcjonalny, a domyślnym trybem dostępu do plików jest odczyt (r).
buffering- Jeśli wartość buforowania jest ustawiona na 0, buforowanie nie jest wykonywane. Jeśli wartość buforowania wynosi 1, buforowanie linii jest wykonywane podczas dostępu do pliku. Jeśli określisz wartość buforowania jako liczbę całkowitą większą niż 1, operacja buforowania zostanie wykonana ze wskazanym rozmiarem buforu. Jeśli wartość ujemna, rozmiar bufora jest domyślnym systemem (zachowanie domyślne).
Oto lista różnych trybów otwierania pliku -
Sr.No. | Tryb i opis |
---|---|
1 | r Otwiera plik tylko do odczytu. Wskaźnik pliku jest umieszczany na początku pliku. To jest tryb domyślny. |
2 | rb Otwiera plik do odczytu tylko w formacie binarnym. Wskaźnik pliku jest umieszczany na początku pliku. To jest tryb domyślny. |
3 | r+ Otwiera plik do odczytu i zapisu. Wskaźnik pliku umieszczony na początku pliku. |
4 | rb+ Otwiera plik do odczytu i zapisu w formacie binarnym. Wskaźnik pliku umieszczony na początku pliku. |
5 | w Otwiera plik tylko do zapisu. Zastępuje plik, jeśli istnieje. Jeśli plik nie istnieje, tworzy nowy plik do zapisu. |
6 | wb Otwiera plik do zapisu tylko w formacie binarnym. Zastępuje plik, jeśli istnieje. Jeśli plik nie istnieje, tworzy nowy plik do zapisu. |
7 | w+ Otwiera plik do zapisu i odczytu. Zastępuje istniejący plik, jeśli plik istnieje. Jeśli plik nie istnieje, tworzy nowy plik do odczytu i zapisu. |
8 | wb+ Otwiera plik do zapisu i odczytu w formacie binarnym. Zastępuje istniejący plik, jeśli plik istnieje. Jeśli plik nie istnieje, tworzy nowy plik do odczytu i zapisu. |
9 | a Otwiera plik do dołączenia. Wskaźnik pliku znajduje się na końcu pliku, jeśli plik istnieje. Oznacza to, że plik jest w trybie dołączania. Jeśli plik nie istnieje, tworzy nowy plik do zapisu. |
10 | ab Otwiera plik do dołączenia w formacie binarnym. Wskaźnik pliku znajduje się na końcu pliku, jeśli plik istnieje. Oznacza to, że plik jest w trybie dołączania. Jeśli plik nie istnieje, tworzy nowy plik do zapisu. |
11 | a+ Otwiera plik do dołączania i odczytu. Wskaźnik pliku znajduje się na końcu pliku, jeśli plik istnieje. Plik otwiera się w trybie dołączania. Jeśli plik nie istnieje, tworzy nowy plik do odczytu i zapisu. |
12 | ab+ Otwiera plik do dołączania i odczytu w formacie binarnym. Wskaźnik pliku znajduje się na końcu pliku, jeśli plik istnieje. Plik otwiera się w trybie dołączania. Jeśli plik nie istnieje, tworzy nowy plik do odczytu i zapisu. |
Plik Object Attributes
Po otwarciu pliku i utworzeniu jednego obiektu pliku można uzyskać różne informacje związane z tym plikiem.
Oto lista wszystkich atrybutów związanych z obiektem pliku -
Sr.No. | Atrybut i opis |
---|---|
1 | file.closed Zwraca true, jeśli plik jest zamknięty, false w przeciwnym razie. |
2 | file.mode Zwraca tryb dostępu, w którym plik został otwarty. |
3 | file.name Zwraca nazwę pliku. |
Note - atrybut softspace nie jest obsługiwany w Pythonie 3.x
Przykład
#!/usr/bin/python3
# Open a file
fo = open("foo.txt", "wb")
print ("Name of the file: ", fo.name)
print ("Closed or not : ", fo.closed)
print ("Opening mode : ", fo.mode)
fo.close()
Daje to następujący wynik -
Name of the file: foo.txt
Closed or not : False
Opening mode : wb
Metoda close ()
Metoda close () obiektu plikowego usuwa wszelkie niepisane informacje i zamyka obiekt plik, po czym nie można już pisać.
Python automatycznie zamyka plik, gdy obiekt odniesienia pliku zostanie ponownie przypisany do innego pliku. Dobrą praktyką jest używanie metody close () do zamykania pliku.
Składnia
fileObject.close();
Przykład
#!/usr/bin/python3
# Open a file
fo = open("foo.txt", "wb")
print ("Name of the file: ", fo.name)
# Close opened file
fo.close()
Daje to następujący wynik -
Name of the file: foo.txt
Czytanie i pisanie plików
Obiekt file zapewnia zestaw metod dostępu, które ułatwiają nam życie. Zobaczylibyśmy, jak używaćread() i write() metody odczytu i zapisu plików.
Metoda write ()
Plik write()metoda zapisuje dowolny ciąg do otwartego pliku. Należy zauważyć, że łańcuchy znaków Pythona mogą zawierać dane binarne, a nie tylko tekst.
Metoda write () nie dodaje znaku nowego wiersza („\ n”) na końcu ciągu -
Składnia
fileObject.write(string);
Tutaj przekazany parametr to treść, która ma zostać zapisana do otwartego pliku.
Przykład
#!/usr/bin/python3
# Open a file
fo = open("foo.txt", "w")
fo.write( "Python is a great language.\nYeah its great!!\n")
# Close opend file
fo.close()
Powyższa metoda utworzyłaby plik foo.txt i zapisze określoną zawartość w tym pliku, a na koniec zamknie ten plik. Gdybyś otworzył ten plik, miałby następującą zawartość -
Python is a great language.
Yeah its great!!
Metoda read ()
Plik read()odczytuje ciąg z otwartego pliku. Należy zauważyć, że łańcuchy znaków Pythona mogą zawierać dane binarne. oprócz danych tekstowych.
Składnia
fileObject.read([count]);
Tutaj przekazywany parametr to liczba bajtów do odczytania z otwartego pliku. Ta metoda zaczyna czytać od początku pliku i jeśli brakuje count , wtedy próbuje odczytać jak najwięcej, być może do końca pliku.
Przykład
Weźmy plik foo.txt , który stworzyliśmy powyżej.
#!/usr/bin/python3
# Open a file
fo = open("foo.txt", "r+")
str = fo.read(10)
print ("Read String is : ", str)
# Close opened file
fo.close()
Daje to następujący wynik -
Read String is : Python is
Plik Pozycje
Metoda tell () informuje o bieżącej pozycji w pliku; innymi słowy, następny odczyt lub zapis nastąpi z taką liczbą bajtów od początku pliku.
Metoda seek (offset [, from]) zmienia bieżącą pozycję pliku. Plikoffsetargument wskazuje liczbę bajtów do przeniesienia. Plikfrom argument określa położenie odniesienia, z którego mają zostać przeniesione bajty.
Jeśli from jest ustawione na 0, początek pliku jest używany jako pozycja odniesienia. Jeśli jest ustawiony na 1, aktualna pozycja jest używana jako pozycja odniesienia. Jeśli jest ustawiony na 2, to koniec pliku będzie traktowany jako punkt odniesienia.
Przykład
Weźmy plik foo.txt , który stworzyliśmy powyżej.
#!/usr/bin/python3
# Open a file
fo = open("foo.txt", "r+")
str = fo.read(10)
print ("Read String is : ", str)
# Check current position
position = fo.tell()
print ("Current file position : ", position)
# Reposition pointer at the beginning once again
position = fo.seek(0, 0)
str = fo.read(10)
print ("Again read String is : ", str)
# Close opened file
fo.close()
Daje to następujący wynik -
Read String is : Python is
Current file position : 10
Again read String is : Python is
Zmiana nazwy i usuwanie plików
Pyton os Moduł udostępnia metody ułatwiające wykonywanie operacji przetwarzania plików, takich jak zmiana nazwy i usuwanie plików.
Aby użyć tego modułu, musisz go najpierw zaimportować, a następnie możesz wywołać wszelkie powiązane funkcje.
Metoda rename ()
Plik rename() Metoda przyjmuje dwa argumenty, bieżącą nazwę pliku i nową nazwę pliku.
Składnia
os.rename(current_file_name, new_file_name)
Przykład
Poniżej znajduje się przykład zmiany nazwy istniejącego pliku test1.txt -
#!/usr/bin/python3
import os
# Rename a file from test1.txt to test2.txt
os.rename( "test1.txt", "test2.txt" )
Metoda remove ()
Możesz użyć remove() metodę usuwania plików, podając jako argument nazwę pliku do usunięcia.
Składnia
os.remove(file_name)
Przykład
Poniżej znajduje się przykład usuwania istniejącego pliku test2.txt -
#!/usr/bin/python3
import os
# Delete file test2.txt
os.remove("text2.txt")
Katalogi w Pythonie
Wszystkie pliki są zawarte w różnych katalogach, a Python nie ma problemu z ich obsługą. Plikos moduł ma kilka metod, które pomagają tworzyć, usuwać i zmieniać katalogi.
Metoda mkdir ()
Możesz użyć mkdir() metoda osmoduł do tworzenia katalogów w bieżącym katalogu. Musisz podać argument do tej metody, który zawiera nazwę katalogu, który ma zostać utworzony.
Składnia
os.mkdir("newdir")
Przykład
Poniżej znajduje się przykład tworzenia testu katalogu w bieżącym katalogu -
#!/usr/bin/python3
import os
# Create a directory "test"
os.mkdir("test")
Metoda chdir ()
Aby zmienić bieżący katalog, możesz użyć metody chdir () . Metoda chdir () przyjmuje argument, którym jest nazwa katalogu, który ma być katalogiem bieżącym.
Składnia
os.chdir("newdir")
Przykład
Poniżej znajduje się przykład przejścia do katalogu „/ home / newdir” -
#!/usr/bin/python3
import os
# Changing a directory to "/home/newdir"
os.chdir("/home/newdir")
Metoda getcwd ()
Plik getcwd() metoda wyświetla bieżący katalog roboczy.
Składnia
os.getcwd()
Przykład
Poniżej znajduje się przykład, aby podać bieżący katalog -
#!/usr/bin/python3
import os
# This would give location of the current directory
os.getcwd()
Metoda rmdir ()
Plik rmdir() metoda usuwa katalog, który jest przekazywany jako argument w metodzie.
Przed usunięciem katalogu należy usunąć całą jego zawartość.
Składnia
os.rmdir('dirname')
Przykład
Poniżej znajduje się przykład usuwania katalogu „/ tmp / test”. Wymagane jest podanie w pełni kwalifikowanej nazwy katalogu, w przeciwnym razie szukałby tego katalogu w bieżącym katalogu.
#!/usr/bin/python3
import os
# This would remove "/tmp/test" directory.
os.rmdir( "/tmp/test" )
Metody związane z plikami i katalogami
Istnieją trzy ważne źródła, które zapewniają szeroką gamę metod narzędziowych do obsługi plików i katalogów w systemach operacyjnych Windows i Unix oraz do manipulowania nimi. Są następujące -
Metody obiektów plików
Plik file obiekt zapewnia funkcje do manipulowania plikami.
Metody obiektów systemu operacyjnego
Zapewnia metody przetwarzania plików i katalogów.
Python zapewnia dwie bardzo ważne funkcje do obsługi wszelkich nieoczekiwanych błędów w programach w języku Python i dodawania do nich funkcji debugowania -
Exception Handling- Będzie to omówione w tym samouczku. Oto lista standardowych wyjątków dostępnych w Pythonie - Standardowe wyjątki .
Assertions- Zostanie to omówione w samouczku Assertions in Python 3 .
Standardowe wyjątki
Oto lista wyjątków standardowych dostępnych w Pythonie. -
Sr.No. | Nazwa i opis wyjątku |
---|---|
1 | Exception Klasa podstawowa dla wszystkich wyjątków |
2 | StopIteration Wywoływane, gdy metoda next () iteratora nie wskazuje na żaden obiekt. |
3 | SystemExit Wywołane przez funkcję sys.exit (). |
4 | StandardError Klasa podstawowa dla wszystkich wbudowanych wyjątków z wyjątkiem StopIteration i SystemExit. |
5 | ArithmeticError Klasa podstawowa dla wszystkich błędów występujących w obliczeniach numerycznych. |
6 | OverflowError Podnoszone, gdy obliczenie przekracza maksymalny limit dla typu liczbowego. |
7 | FloatingPointError Podnoszone, gdy obliczenia zmiennoprzecinkowe nie powiodły się. |
8 | ZeroDivisonError Podnoszony, gdy dla wszystkich typów liczbowych ma miejsce dzielenie lub modulo przez zero. |
9 | AssertionError Podnoszone w przypadku niepowodzenia instrukcji Assert. |
10 | AttributeError Podniesione w przypadku niepowodzenia odniesienia do atrybutu lub przypisania. |
11 | EOFError Wywoływane, gdy nie ma danych wejściowych z funkcji raw_input () lub input () i osiągnięto koniec pliku. |
12 | ImportError Wywoływane, gdy instrukcja importu nie powiedzie się. |
13 | KeyboardInterrupt Wywoływane, gdy użytkownik przerywa wykonywanie programu, zwykle naciskając Ctrl + c. |
14 | LookupError Klasa bazowa dla wszystkich błędów wyszukiwania. |
15 | IndexError Podnoszone, gdy indeks nie zostanie znaleziony w sekwencji. |
16 | KeyError Wywoływane, gdy określony klucz nie zostanie znaleziony w słowniku. |
17 | NameError Wywoływane, gdy identyfikator nie zostanie znaleziony w lokalnej lub globalnej przestrzeni nazw. |
18 | UnboundLocalError Wywoływane podczas próby uzyskania dostępu do zmiennej lokalnej w funkcji lub metodzie, ale nie została do niej przypisana żadna wartość. |
19 | EnvironmentError Klasa podstawowa dla wszystkich wyjątków, które występują poza środowiskiem Pythona. |
20 | IOError Wywoływane, gdy operacja wejścia / wyjścia nie powiedzie się, na przykład instrukcja print lub funkcja open () podczas próby otwarcia pliku, który nie istnieje. |
21 | OSError Zgłaszane z powodu błędów związanych z systemem operacyjnym. |
22 | SyntaxError Wywoływane, gdy występuje błąd w składni Pythona. |
23 | IndentationError Wywoływane, gdy wcięcie nie jest poprawnie określone. |
24 | SystemError Wywoływane, gdy interpreter napotka wewnętrzny problem, ale po napotkaniu tego błędu interpreter Pythona nie kończy pracy. |
25 | SystemExit Wywoływane, gdy interpreter Pythona jest zamykany za pomocą funkcji sys.exit (). Jeśli nie jest obsługiwane w kodzie, powoduje zakończenie pracy interpretera. |
26 | TypeError Wywoływane, gdy podjęto próbę wykonania operacji lub funkcji, która jest nieprawidłowa dla określonego typu danych. |
27 | ValueError Wywoływane, gdy funkcja wbudowana dla typu danych ma prawidłowy typ argumentów, ale argumenty mają określone nieprawidłowe wartości. |
28 | RuntimeError Wywoływane, gdy wygenerowany błąd nie należy do żadnej kategorii. |
29 | NotImplementedError Wywoływane, gdy metoda abstrakcyjna, która musi zostać zaimplementowana w klasie dziedziczonej, nie jest faktycznie zaimplementowana. |
Asercje w Pythonie
Asercja to sprawdzenie poczytalności, które możesz włączyć lub wyłączyć po zakończeniu testowania programu.
Najłatwiejszym sposobem myślenia o asercji jest porównanie jej do a raise-if(a dokładniej mówiąc, podnieś, jeśli nie). Wyrażenie jest testowane i jeśli wynik okaże się fałszywy, zgłaszany jest wyjątek.
Asercje są wykonywane przez instrukcję assert, najnowsze słowo kluczowe języka Python, wprowadzone w wersji 1.5.
Programiści często umieszczają potwierdzenia na początku funkcji, aby sprawdzić poprawność danych wejściowych, i po wywołaniu funkcji, aby sprawdzić poprawność danych wyjściowych.
Instrukcja assert
Kiedy napotyka instrukcję assert, Python ocenia towarzyszące jej wyrażenie, które, miejmy nadzieję, jest prawdą. Jeśli wyrażenie jest fałszywe, Python zgłasza wyjątek AssertionError .
Składnia assert to -
assert Expression[, Arguments]
Jeśli asercja się nie powiedzie, Python używa ArgumentExpression jako argumentu dla AssertionError. Wyjątki AssertionError można przechwytywać i obsługiwać jak każdy inny wyjątek, używając instrukcji try-except. Jeśli nie zostaną obsłużone, zakończą działanie programu i utworzą śledzenie.
Przykład
Oto funkcja, która przekształca zadaną temperaturę ze stopni Kelvina na stopnie Fahrenheita. Ponieważ 0 ° K jest tak zimne, jak się robi, funkcja wyskakuje, jeśli zobaczy ujemną temperaturę -
#!/usr/bin/python3
def KelvinToFahrenheit(Temperature):
assert (Temperature >= 0),"Colder than absolute zero!"
return ((Temperature-273)*1.8)+32
print (KelvinToFahrenheit(273))
print (int(KelvinToFahrenheit(505.78)))
print (KelvinToFahrenheit(-5))
Wykonanie powyższego kodu daje następujący wynik -
32.0
451
Traceback (most recent call last):
File "test.py", line 9, in <module>
print KelvinToFahrenheit(-5)
File "test.py", line 4, in KelvinToFahrenheit
assert (Temperature >= 0),"Colder than absolute zero!"
AssertionError: Colder than absolute zero!
Co to jest wyjątek?
Wyjątkiem jest zdarzenie, które występuje podczas wykonywania programu, które zakłóca normalny przepływ instrukcji programu. Ogólnie rzecz biorąc, kiedy skrypt w Pythonie napotyka sytuację, z którą nie może sobie poradzić, zgłasza wyjątek. Wyjątkiem jest obiekt Pythona, który reprezentuje błąd.
Kiedy skrypt w Pythonie zgłasza wyjątek, musi albo natychmiast obsłużyć wyjątek, w przeciwnym razie kończy działanie i kończy pracę.
Obsługa wyjątku
Jeśli masz podejrzany kod, który może wywołać wyjątek, możesz chronić swój program, umieszczając podejrzany kod w plikutry:blok. Po wykonaniu try: block dołącz plikexcept: instrukcja, po której następuje blok kodu, który rozwiązuje problem tak elegancko, jak to tylko możliwe.
Składnia
Oto prosta składnia try .... z wyjątkiem bloków ... else -
try:
You do your operations here
......................
except ExceptionI:
If there is ExceptionI, then execute this block.
except ExceptionII:
If there is ExceptionII, then execute this block.
......................
else:
If there is no exception then execute this block.
Oto kilka ważnych punktów dotyczących wyżej wymienionej składni -
Pojedyncza instrukcja try może mieć wiele instrukcji oprócz. Jest to przydatne, gdy blok try zawiera instrukcje, które mogą generować różne typy wyjątków.
Możesz również podać ogólną klauzulę except, która obsługuje każdy wyjątek.
Po klauzuli (-ach) else można dołączyć klauzulę else. Kod w bloku else jest wykonywany, jeśli kod w bloku try: nie zgłosi wyjątku.
Blok else to dobre miejsce na kod, który nie potrzebuje ochrony try: block.
Przykład
Ten przykład otwiera plik, zapisuje zawartość w pliku i wychodzi z wdziękiem, ponieważ nie ma żadnego problemu -
#!/usr/bin/python3
try:
fh = open("testfile", "w")
fh.write("This is my test file for exception handling!!")
except IOError:
print ("Error: can\'t find file or read data")
else:
print ("Written content in the file successfully")
fh.close()
Daje to następujący wynik -
Written content in the file successfully
Przykład
Ten przykład próbuje otworzyć plik, w którym nie masz uprawnień do zapisu, więc zgłasza wyjątek -
#!/usr/bin/python3
try:
fh = open("testfile", "r")
fh.write("This is my test file for exception handling!!")
except IOError:
print ("Error: can\'t find file or read data")
else:
print ("Written content in the file successfully")
Daje to następujący wynik -
Error: can't find file or read data
Klauzula wyjątkiem bez wyjątków
Możesz również użyć instrukcji except bez wyjątków zdefiniowanych w następujący sposób -
try:
You do your operations here
......................
except:
If there is any exception, then execute this block.
......................
else:
If there is no exception then execute this block.
Ten rodzaj try-exceptinstrukcja przechwytuje wszystkie wyjątki, które występują. Używanie tego rodzaju instrukcji try-except nie jest jednak uważane za dobrą praktykę programistyczną, ponieważ wyłapuje wszystkie wyjątki, ale nie powoduje, że programiści identyfikują główną przyczynę problemu, który może wystąpić.
Klauzula except z wieloma wyjątkami
Możesz również użyć tej samej instrukcji except do obsługi wielu wyjątków w następujący sposób -
try:
You do your operations here
......................
except(Exception1[, Exception2[,...ExceptionN]]]):
If there is any exception from the given exception list,
then execute this block.
......................
else:
If there is no exception then execute this block.
Klauzula próby ostatecznej
Możesz użyć finally: blok wraz z try:blok. Plikfinally:blok to miejsce, w którym można umieścić dowolny kod, który musi zostać wykonany, niezależnie od tego, czy blok try zgłosił wyjątek, czy nie. Składnia instrukcji try-last jest następująca -
try:
You do your operations here;
......................
Due to any exception, this may be skipped.
finally:
This would always be executed.
......................
Note- Możesz podać klauzulę (y) z wyjątkiem lub klauzulę końcową, ale nie obie. Nie możesz używać klauzuli else razem z klauzulą last.
Przykład
#!/usr/bin/python3
try:
fh = open("testfile", "w")
fh.write("This is my test file for exception handling!!")
finally:
print ("Error: can\'t find file or read data")
fh.close()
Jeśli nie masz uprawnień do otwierania pliku w trybie do zapisu, da to następujący wynik -
Error: can't find file or read data
Ten sam przykład można zapisać jaśniej w następujący sposób -
#!/usr/bin/python3
try:
fh = open("testfile", "w")
try:
fh.write("This is my test file for exception handling!!")
finally:
print ("Going to close the file")
fh.close()
except IOError:
print ("Error: can\'t find file or read data")
Daje to następujący wynik -
Going to close the file
Gdy wyjątek zostanie zgłoszony w bloku try , wykonanie natychmiast przechodzi do ostatniego bloku. Po wszystkie oświadczenia w końcu bloku są wykonywane, wyjątek jest ponownie podniesione i jest obsługiwana w wyjątkiem oświadczenia, jeżeli występuje w następnej warstwy wyższej w try-oprócz oświadczenia.
Argument wyjątku
Wyjątek może mieć argument będący wartością dostarczającą dodatkowych informacji o problemie. Zawartość argumentu różni się w zależności od wyjątku. Przechwytujesz argument wyjątku, podając zmienną w klauzuli except w następujący sposób -
try:
You do your operations here
......................
except ExceptionType as Argument:
You can print value of Argument here...
Jeśli napiszesz kod obsługujący pojedynczy wyjątek, możesz ustawić zmienną po nazwie wyjątku w instrukcji except. W przypadku zalewkowania wielu wyjątków za krotką wyjątku może podążać zmienna.
Ta zmienna otrzymuje wartość wyjątku zawierającego głównie przyczynę wyjątku. Zmienna może otrzymać jedną wartość lub wiele wartości w postaci krotki. Ta krotka zwykle zawiera ciąg błędu, numer błędu i lokalizację błędu.
Przykład
Poniżej znajduje się przykład pojedynczego wyjątku -
#!/usr/bin/python3
# Define a function here.
def temp_convert(var):
try:
return int(var)
except ValueError as Argument:
print ("The argument does not contain numbers\n", Argument)
# Call above function here.
temp_convert("xyz")
Daje to następujący wynik -
The argument does not contain numbers
invalid literal for int() with base 10: 'xyz'
Zgłaszanie wyjątku
Możesz zgłaszać wyjątki na kilka sposobów, używając instrukcji raise. Ogólna składnia dlaraise oświadczenie jest następujące -
Składnia
raise [Exception [, args [, traceback]]]
Tutaj Exception jest typem wyjątku (na przykład NameError), a argument jest wartością argumentu wyjątku. Argument jest opcjonalny; jeśli nie zostanie podany, argument wyjątku to Brak.
Ostatni argument, traceback, jest również opcjonalny (i rzadko używany w praktyce), a jeśli jest obecny, jest obiektem śledzenia używanym w wyjątku.
Przykład
Wyjątkiem może być ciąg znaków, klasa lub obiekt. Większość wyjątków wywoływanych przez rdzeń języka Python to klasy z argumentem będącym instancją klasy. Definiowanie nowych wyjątków jest dość łatwe i można to zrobić w następujący sposób -
def functionName( level ):
if level <1:
raise Exception(level)
# The code below to this would not be executed
# if we raise the exception
return level
Note- Aby przechwycić wyjątek, klauzula „oprócz” musi odwoływać się do tego samego wyjątku zgłoszonego jako obiekt klasy lub jako prosty ciąg. Na przykład, aby uchwycić powyższy wyjątek, musimy napisać klauzulę except w następujący sposób -
try:
Business Logic here...
except Exception as e:
Exception handling here using e.args...
else:
Rest of the code here...
Poniższy przykład ilustruje użycie zgłaszania wyjątku -
#!/usr/bin/python3
def functionName( level ):
if level <1:
raise Exception(level)
# The code below to this would not be executed
# if we raise the exception
return level
try:
l = functionName(-10)
print ("level = ",l)
except Exception as e:
print ("error in level argument",e.args[0])
Spowoduje to następujący wynik
error in level argument -10
Wyjątki zdefiniowane przez użytkownika
Python umożliwia również tworzenie własnych wyjątków poprzez wyprowadzanie klas z wbudowanych wyjątków standardowych.
Oto przykład związany z RuntimeError . Tutaj tworzona jest klasa, która jest podklasą z RuntimeError . Jest to przydatne, gdy chcesz wyświetlić bardziej szczegółowe informacje, gdy zostanie przechwycony wyjątek.
W bloku try wyjątek zdefiniowany przez użytkownika jest zgłaszany i przechwytywany w bloku except. Zmienna e służy do tworzenia instancji klasy Networkerror .
class Networkerror(RuntimeError):
def __init__(self, arg):
self.args = arg
Więc po zdefiniowaniu powyższej klasy możesz zgłosić wyjątek w następujący sposób -
try:
raise Networkerror("Bad hostname")
except Networkerror,e:
print e.args
Python był językiem zorientowanym obiektowo od samego początku. Dzięki temu tworzenie i używanie klas i obiektów jest wręcz łatwe. Ten rozdział pomoże Ci stać się ekspertem w korzystaniu z obsługi programowania obiektowego w języku Python.
Jeśli nie masz żadnego doświadczenia z programowaniem obiektowym (OO), możesz skorzystać z kursu wprowadzającego lub przynajmniej jakiegoś samouczka, aby zrozumieć podstawowe pojęcia.
Jednak tutaj jest małe wprowadzenie do programowania obiektowego (OOP), aby pomóc -
Przegląd terminologii OOP
Class- Prototyp zdefiniowany przez użytkownika dla obiektu, który definiuje zestaw atrybutów charakteryzujących dowolny obiekt klasy. Atrybuty to elementy składowe danych (zmienne klas i zmienne instancji) oraz metody, do których można uzyskać dostęp za pomocą notacji kropkowej.
Class variable- Zmienna wspólna dla wszystkich instancji klasy. Zmienne klasy są zdefiniowane w klasie, ale poza żadną z metod klasy. Zmienne klas nie są używane tak często, jak zmienne instancji.
Data member - Zmienna klasy lub zmienna instancji, która przechowuje dane powiązane z klasą i jej obiektami.
Function overloading- Przypisanie więcej niż jednego zachowania do określonej funkcji. Wykonywana operacja różni się w zależności od typów obiektów lub argumentów.
Instance variable - Zmienna zdefiniowana wewnątrz metody i należąca tylko do aktualnego wystąpienia klasy.
Inheritance - Przeniesienie cech klasy do innych klas, które z niej pochodzą.
Instance- indywidualny przedmiot określonej klasy. Na przykład obiekt obj należący do klasy Circle jest instancją klasy Circle.
Instantiation - Tworzenie instancji klasy.
Method - Specjalny rodzaj funkcji zdefiniowany w definicji klasy.
Object- Unikalna instancja struktury danych zdefiniowana przez jej klasę. Obiekt zawiera zarówno elementy członkowskie danych (zmienne klas i zmienne instancji), jak i metody.
Operator overloading - Przypisanie więcej niż jednej funkcji do konkretnego operatora.
Tworzenie klas
Instrukcja class tworzy nową definicję klasy. Nazwa klasy następuje bezpośrednio po słowie kluczowym class, po którym następuje dwukropek w następujący sposób -
class ClassName:
'Optional class documentation string'
class_suite
Klasa zawiera ciąg dokumentacji, do którego można uzyskać dostęp za pośrednictwem ClassName.__doc__.
Plik class_suite składa się ze wszystkich instrukcji komponentów definiujących elementy klasy, atrybuty danych i funkcje.
Przykład
Poniżej znajduje się przykład prostej klasy Pythona -
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)
Zmienna empCount jest zmienną klasową, której wartość jest wspólna dla wszystkich instancji zmiennej a w tej klasie. Dostęp do tego można uzyskać jako Employee.empCount z poziomu klasy lub spoza niej.
Pierwsza metoda __init __ () to specjalna metoda, nazywana konstruktorem klasy lub metodą inicjalizacji, którą Python wywołuje podczas tworzenia nowej instancji tej klasy.
Deklarujesz inne metody klas, takie jak zwykłe funkcje, z wyjątkiem tego, że pierwszym argumentem każdej metody jest self . Python dodaje argument self do listy za Ciebie; nie musisz go dołączać podczas wywoływania metod.
Tworzenie obiektów instancji
Aby utworzyć instancje klasy, wywołujesz klasę używając nazwy klasy i przekazujesz wszystkie argumenty , które akceptuje jej metoda __init__ .
This would create first object of Employee class
emp1 = Employee("Zara", 2000)
This would create second object of Employee class
emp2 = Employee("Manni", 5000)
Dostęp do atrybutów
Dostęp do atrybutów obiektu uzyskuje się za pomocą operatora kropki z obiektem. Dostęp do zmiennej klasy można uzyskać za pomocą nazwy klasy w następujący sposób -
emp1.displayEmployee()
emp2.displayEmployee()
print ("Total Employee %d" % Employee.empCount)
Teraz łącząc wszystkie koncepcje razem -
#!/usr/bin/python3
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)
#This would create first object of Employee class"
emp1 = Employee("Zara", 2000)
#This would create second object of Employee class"
emp2 = Employee("Manni", 5000)
emp1.displayEmployee()
emp2.displayEmployee()
print ("Total Employee %d" % Employee.empCount)
Wykonanie powyższego kodu daje następujący wynik -
Name : Zara ,Salary: 2000
Name : Manni ,Salary: 5000
Total Employee 2
Możesz dodawać, usuwać lub modyfikować atrybuty klas i obiektów w dowolnym momencie -
emp1.salary = 7000 # Add an 'salary' attribute.
emp1.name = 'xyz' # Modify 'age' attribute.
del emp1.salary # Delete 'age' attribute.
Zamiast używać zwykłych instrukcji do uzyskiwania dostępu do atrybutów, możesz użyć następujących funkcji -
Plik getattr(obj, name[, default]) - aby uzyskać dostęp do atrybutu obiektu.
Plik hasattr(obj,name) - aby sprawdzić, czy atrybut istnieje, czy nie.
Plik setattr(obj,name,value)- ustawić atrybut. Jeśli atrybut nie istnieje, zostanie utworzony.
Plik delattr(obj, name) - aby usunąć atrybut.
hasattr(emp1, 'salary') # Returns true if 'salary' attribute exists
getattr(emp1, 'salary') # Returns value of 'salary' attribute
setattr(emp1, 'salary', 7000) # Set attribute 'salary' at 7000
delattr(emp1, 'salary') # Delete attribute 'salary'
Wbudowane atrybuty klas
Każda klasa Pythona śledzi wbudowane atrybuty i można uzyskać do nich dostęp za pomocą operatora kropki, jak każdy inny atrybut -
__dict__ - Słownik zawierający przestrzeń nazw klasy.
__doc__ - Łańcuch dokumentacji klasy lub brak, jeśli jest niezdefiniowany.
__name__ - Nazwa klasy.
__module__- Nazwa modułu, w którym zdefiniowana jest klasa. W trybie interaktywnym ten atrybut to „__main__”.
__bases__ - Prawdopodobnie pusta krotka zawierająca klasy bazowe, w kolejności ich występowania na liście klas bazowych.
W przypadku powyższej klasy spróbujmy uzyskać dostęp do wszystkich tych atrybutów -
#!/usr/bin/python3
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("Zara", 2000)
emp2 = Employee("Manni", 5000)
print ("Employee.__doc__:", Employee.__doc__)
print ("Employee.__name__:", Employee.__name__)
print ("Employee.__module__:", Employee.__module__)
print ("Employee.__bases__:", Employee.__bases__)
print ("Employee.__dict__:", Employee.__dict__ )
Wykonanie powyższego kodu daje następujący wynik -
Employee.__doc__: Common base class for all employees
Employee.__name__: Employee
Employee.__module__: __main__
Employee.__bases__: (<class 'object'>,)
Employee.__dict__: {
'displayCount': <function Employee.displayCount at 0x0160D2B8>,
'__module__': '__main__', '__doc__': 'Common base class for all employees',
'empCount': 2, '__init__':
<function Employee.__init__ at 0x0124F810>, 'displayEmployee':
<function Employee.displayEmployee at 0x0160D300>,
'__weakref__':
<attribute '__weakref__' of 'Employee' objects>, '__dict__':
<attribute '__dict__' of 'Employee' objects>
}
Niszczenie obiektów (zbieranie śmieci)
Python automatycznie usuwa niepotrzebne obiekty (typy wbudowane lub instancje klas), aby zwolnić miejsce w pamięci. Proces, w którym Python okresowo odzyskuje bloki pamięci, które nie są już używane, jest określany jako wyrzucanie elementów bezużytecznych.
Moduł odśmiecania pamięci Pythona działa podczas wykonywania programu i jest wyzwalany, gdy liczba odwołań do obiektu osiągnie zero. Liczba odwołań do obiektu zmienia się wraz ze zmianą liczby aliasów wskazujących na obiekt.
Liczba odwołań do obiektu wzrasta, gdy zostanie mu przypisana nowa nazwa lub zostanie umieszczony w kontenerze (liście, krotce lub słowniku). Liczba odwołań do obiektu zmniejsza się, gdy jest on usuwany za pomocą polecenia del , jego odwołanie jest ponownie przypisywane lub jego odwołanie wykracza poza zakres. Gdy liczba odwołań do obiektu osiągnie zero, Python zbiera je automatycznie.
a = 40 # Create object <40>
b = a # Increase ref. count of <40>
c = [b] # Increase ref. count of <40>
del a # Decrease ref. count of <40>
b = 100 # Decrease ref. count of <40>
c[0] = -1 # Decrease ref. count of <40>
Zwykle nie zauważysz, kiedy garbage collector niszczy osieroconą instancję i odzyskuje jej miejsce. Jednak klasa może implementować specjalną metodę __del __ () , nazywaną destruktorem, która jest wywoływana, gdy instancja ma zostać zniszczona. Ta metoda może służyć do czyszczenia wszelkich zasobów innych niż pamięć używanych przez wystąpienie.
Przykład
Ten niszczyciel __del __ () wyświetla nazwę klasy instancji, która ma zostać zniszczona -
#!/usr/bin/python3
class Point:
def __init__( self, x=0, y=0):
self.x = x
self.y = y
def __del__(self):
class_name = self.__class__.__name__
print (class_name, "destroyed")
pt1 = Point()
pt2 = pt1
pt3 = pt1
print (id(pt1), id(pt2), id(pt3)) # prints the ids of the obejcts
del pt1
del pt2
del pt3
Wykonanie powyższego kodu daje następujący wynik -
140338326963984 140338326963984 140338326963984
Point destroyed
Note- Najlepiej byłoby zdefiniować swoje klasy w oddzielnym pliku, a następnie zaimportować je do głównego pliku programu za pomocą instrukcji import .
W powyższym przykładzie przy założeniu, że definicja klasy Point jest zawarta w pliku point.py i nie ma w nim żadnego innego kodu wykonywalnego.
#!/usr/bin/python3
import point
p1 = point.Point()
Dziedziczenie klas
Zamiast zaczynać od zera, możesz utworzyć klasę, wyprowadzając ją z wcześniej istniejącej klasy, wymieniając klasę nadrzędną w nawiasach po nowej nazwie klasy.
Klasa potomna dziedziczy atrybuty swojej klasy nadrzędnej i możesz używać tych atrybutów tak, jakby były zdefiniowane w klasie potomnej. Klasa potomna może również przesłonić składowe danych i metody z rodzica.
Składnia
Klasy pochodne są deklarowane podobnie jak ich klasa nadrzędna; jednakże lista klas bazowych do dziedziczenia jest podana po nazwie klasy -
class SubClassName (ParentClass1[, ParentClass2, ...]):
'Optional class documentation string'
class_suite
Przykład
#!/usr/bin/python3
class Parent: # define parent class
parentAttr = 100
def __init__(self):
print ("Calling parent constructor")
def parentMethod(self):
print ('Calling parent method')
def setAttr(self, attr):
Parent.parentAttr = attr
def getAttr(self):
print ("Parent attribute :", Parent.parentAttr)
class Child(Parent): # define child class
def __init__(self):
print ("Calling child constructor")
def childMethod(self):
print ('Calling child method')
c = Child() # instance of child
c.childMethod() # child calls its method
c.parentMethod() # calls parent's method
c.setAttr(200) # again call parent's method
c.getAttr() # again call parent's method
Wykonanie powyższego kodu daje następujący wynik -
Calling child constructor
Calling child method
Calling parent method
Parent attribute : 200
W podobny sposób możesz kierować klasą z wielu klas nadrzędnych w następujący sposób -
class A: # define your class A
.....
class B: # define your calss B
.....
class C(A, B): # subclass of A and B
.....
Możesz użyć funkcji issubclass () lub isinstance (), aby sprawdzić relacje dwóch klas i instancji.
Plik issubclass(sub, sup) funkcja boolowska zwraca True, jeśli dana podklasa sub jest rzeczywiście podklasą nadklasy sup.
Plik isinstance(obj, Class)funkcja boolowska zwraca True, jeśli obj jest instancją klasy Class lub instancją podklasy Class
Metody zastępujące
Zawsze możesz zastąpić metody klasy nadrzędnej. Jednym z powodów zastępowania metod rodzica jest to, że możesz chcieć mieć specjalną lub inną funkcjonalność w swojej podklasie.
Przykład
#!/usr/bin/python3
class Parent: # define parent class
def myMethod(self):
print ('Calling parent method')
class Child(Parent): # define child class
def myMethod(self):
print ('Calling child method')
c = Child() # instance of child
c.myMethod() # child calls overridden method
Wykonanie powyższego kodu daje następujący wynik -
Calling child method
Podstawowe metody przeciążania
W poniższej tabeli wymieniono niektóre ogólne funkcje, które można zastąpić we własnych klasach -
Sr.No. | Metoda, opis i przykładowa rozmowa |
---|---|
1 | __init__ ( self [,args...] ) Konstruktor (z dowolnymi opcjonalnymi argumentami) Przykładowe wywołanie: obj = className (args) |
2 | __del__( self ) Destructor, usuwa obiekt Przykładowe wywołanie: del obj |
3 | __repr__( self ) Szacunkowa reprezentacja ciągu Przykładowe wywołanie: repr (obj) |
4 | __str__( self ) Reprezentacja ciągu do druku Przykładowe wywołanie: str (obj) |
5 | __cmp__ ( self, x ) Porównanie obiektów Przykładowe wywołanie: cmp (obj, x) |
Operatory przeciążenia
Załóżmy, że utworzyłeś klasę Vector do reprezentowania wektorów dwuwymiarowych. Co się dzieje, gdy dodajesz je za pomocą operatora plus? Najprawdopodobniej Python będzie na ciebie krzyczał.
Możesz jednak zdefiniować metodę __add__ w swojej klasie, aby wykonywać dodawanie wektorów, a następnie operator plus zachowywałby się zgodnie z oczekiwaniami -
Przykład
#!/usr/bin/python3
class Vector:
def __init__(self, a, b):
self.a = a
self.b = b
def __str__(self):
return 'Vector (%d, %d)' % (self.a, self.b)
def __add__(self,other):
return Vector(self.a + other.a, self.b + other.b)
v1 = Vector(2,10)
v2 = Vector(5,-2)
print (v1 + v2)
Wykonanie powyższego kodu daje następujący wynik -
Vector(7,8)
Ukrywanie danych
Atrybuty obiektu mogą, ale nie muszą być widoczne poza definicją klasy. Musisz nazwać atrybuty przedrostkiem z podwójnym podkreśleniem, a wtedy te atrybuty nie będą bezpośrednio widoczne dla osób z zewnątrz.
Przykład
#!/usr/bin/python3
class JustCounter:
__secretCount = 0
def count(self):
self.__secretCount += 1
print (self.__secretCount)
counter = JustCounter()
counter.count()
counter.count()
print (counter.__secretCount)
Wykonanie powyższego kodu daje następujący wynik -
1
2
Traceback (most recent call last):
File "test.py", line 12, in <module>
print counter.__secretCount
AttributeError: JustCounter instance has no attribute '__secretCount'
Python chroni tych członków, zmieniając wewnętrznie nazwę, tak aby zawierała nazwę klasy. Możesz uzyskać dostęp do takich atrybutów, jak object._className__attrName . Jeśli chcesz zamienić ostatnią linię następującą linią, to działa dla Ciebie -
.........................
print (counter._JustCounter__secretCount)
Wykonanie powyższego kodu daje następujący wynik -
1
2
2
Wyrażenie regularne jest specjalnym ciągiem znaków, który pomaga dopasować lub znaleźć inne ciągi lub zestawy strun przy użyciu specjalistycznego składni przechowywanych w strukturze. Wyrażenia regularne są szeroko stosowane w świecie UNIX.
Moduł rezapewnia pełne wsparcie dla wyrażeń regularnych podobnych do Perla w Pythonie. Plikre moduł zgłasza wyjątek re.error jeśli wystąpi błąd podczas kompilowania lub używania wyrażenia regularnego.
Omówilibyśmy dwie ważne funkcje, które byłyby używane do obsługi wyrażeń regularnych. Niemniej jednak najpierw mała rzecz: istnieją różne znaki, które miałyby specjalne znaczenie, gdy są używane w wyrażeniach regularnych. Aby uniknąć nieporozumień podczas korzystania z wyrażeń regularnych, używamy nieprzetworzonych ciągów jakor'expression'.
Podstawowe wzorce pasujące do pojedynczych znaków
Sr.No. | Wyrażenie i dopasowania |
---|---|
1 | a, X, 9, < zwykłe postacie po prostu dokładnie do siebie pasują. |
2 | . (a period) dopasowuje dowolny pojedynczy znak z wyjątkiem nowej linii „\ n” |
3 | \w dopasowuje znak „słowa”: literę, cyfrę lub podkreślenie [a-zA-Z0-9_]. |
4 | \W dopasowuje dowolny znak niebędący słowem. |
5 | \b granica między słowem a nie-słowem |
6 | \s dopasowuje pojedynczy znak spacji - spację, nową linię, powrót, tabulator |
7 | \S dopasowuje dowolny znak niebędący białymi znakami. |
8 | \t, \n, \r tab, nowa linia, powrót |
9 | \d cyfra dziesiętna [0–9] |
10 | ^ dopasowuje początek łańcucha |
11 | $ dopasuj koniec łańcucha |
12 | \ hamują „specjalność” postaci. |
Flagi kompilacji
Flagi kompilacji pozwalają modyfikować niektóre aspekty działania wyrażeń regularnych. Flagi są dostępne w module re pod dwiema nazwami, długą nazwą, taką jakIGNORECASE i krótki jednoliterowy formularz, na przykład I.
Sr.No. | Flaga i znaczenie |
---|---|
1 | ASCII, A Dopasowuje kilka znaków specjalnych, takich jak \ w, \ b, \ s i \ d, tylko do znaków ASCII z odpowiednią właściwością. |
2 | DOTALL, S Twórz, dopasowuj dowolny znak, w tym znaki nowej linii |
3 | IGNORECASE, I Dopasuj bez rozróżniania wielkości liter |
4 | LOCALE, L Wykonaj dopasowanie uwzględniające język |
5 | MULTILINE, M Dopasowywanie wielowierszowe, wpływające na ^ i $ |
6 | VERBOSE, X (for ‘extended’) Włącz szczegółowe RE, które można uporządkować w bardziej przejrzysty i zrozumiały sposób |
Funkcja dopasowania
Ta funkcja próbuje dopasować wzorzec RE do łańcucha z opcjonalnymi flagami .
Oto składnia tej funkcji -
re.match(pattern, string, flags = 0)
Oto opis parametrów -
Sr.No. | Parametr i opis |
---|---|
1 | pattern To jest wyrażenie regularne do dopasowania. |
2 | string To jest ciąg, który byłby przeszukiwany w celu dopasowania do wzorca na początku łańcucha. |
3 | flags Możesz określić różne flagi za pomocą bitowego OR (|). Są to modyfikatory wymienione w poniższej tabeli. |
Funkcja re.match zwraca plikmatch sprzeciw wobec sukcesu, Nonena niepowodzenie. Używamy grupę (Lb) lub grupy () Funkcjąmatch obiekt, aby uzyskać dopasowane wyrażenie.
Sr.No. | Dopasuj metodę i opis obiektu |
---|---|
1 | group(num = 0) Ta metoda zwraca całe dopasowanie (lub numer określonej podgrupy) |
2 | groups() Ta metoda zwraca wszystkie pasujące podgrupy w krotce (puste, jeśli nie było żadnych) |
Przykład
#!/usr/bin/python3
import re
line = "Cats are smarter than dogs"
matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I)
if matchObj:
print ("matchObj.group() : ", matchObj.group())
print ("matchObj.group(1) : ", matchObj.group(1))
print ("matchObj.group(2) : ", matchObj.group(2))
else:
print ("No match!!")
Wykonanie powyższego kodu daje następujący wynik -
matchObj.group() : Cats are smarter than dogs
matchObj.group(1) : Cats
matchObj.group(2) : smarter
Funkcja wyszukiwania
Ta funkcja wyszukuje pierwsze wystąpienie wzorca RE w ciągu z opcjonalnymi flagami .
Oto składnia tej funkcji -
re.search(pattern, string, flags = 0)
Oto opis parametrów -
Sr.No. | Parametr i opis |
---|---|
1 | pattern To jest wyrażenie regularne do dopasowania. |
2 | string To jest ciąg, który byłby przeszukiwany w celu dopasowania wzorca w dowolnym miejscu w ciągu. |
3 | flags Możesz określić różne flagi za pomocą bitowego OR (|). Są to modyfikatory wymienione w poniższej tabeli. |
Funkcja re.search zwraca plikmatch sprzeciw wobec sukcesu, nonena niepowodzenie. Używamy grupę (Lb) lub grupy () Funkcjąmatch obiekt, aby uzyskać dopasowane wyrażenie.
Sr.No. | Dopasuj metodę i opis obiektu |
---|---|
1 | group(num = 0) Ta metoda zwraca całe dopasowanie (lub numer określonej podgrupy) |
2 | groups() Ta metoda zwraca wszystkie pasujące podgrupy w krotce (puste, jeśli nie było żadnych) |
Przykład
#!/usr/bin/python3
import re
line = "Cats are smarter than dogs";
searchObj = re.search( r'(.*) are (.*?) .*', line, re.M|re.I)
if searchObj:
print ("searchObj.group() : ", searchObj.group())
print ("searchObj.group(1) : ", searchObj.group(1))
print ("searchObj.group(2) : ", searchObj.group(2))
else:
print ("Nothing found!!")
Wykonanie powyższego kodu daje następujący wynik -
matchObj.group() : Cats are smarter than dogs
matchObj.group(1) : Cats
matchObj.group(2) : smarter
Dopasowywanie a wyszukiwanie
Python oferuje dwie różne prymitywne operacje oparte na wyrażeniach regularnych: match sprawdza dopasowanie tylko na początku łańcucha, podczas gdy search sprawdza dopasowanie w dowolnym miejscu łańcucha (domyślnie robi to Perl).
Przykład
#!/usr/bin/python3
import re
line = "Cats are smarter than dogs";
matchObj = re.match( r'dogs', line, re.M|re.I)
if matchObj:
print ("match --> matchObj.group() : ", matchObj.group())
else:
print ("No match!!")
searchObj = re.search( r'dogs', line, re.M|re.I)
if searchObj:
print ("search --> searchObj.group() : ", searchObj.group())
else:
print ("Nothing found!!")
Wykonanie powyższego kodu daje następujący wynik -
No match!!
search --> matchObj.group() : dogs
Wyszukaj i zamień
Jeden z najważniejszych re metody używające wyrażeń regularnych to sub.
Składnia
re.sub(pattern, repl, string, max=0)
Metoda ta zastępuje wszystkie wystąpienia RE wzór w ciąg z repl , zastępując wszystkie wystąpienia chyba max jest świadczona. Ta metoda zwraca zmodyfikowany ciąg.
Przykład
#!/usr/bin/python3
import re
phone = "2004-959-559 # This is Phone Number"
# Delete Python-style comments
num = re.sub(r'#.*$', "", phone)
print ("Phone Num : ", num)
# Remove anything other than digits
num = re.sub(r'\D', "", phone)
print ("Phone Num : ", num)
Wykonanie powyższego kodu daje następujący wynik -
Phone Num : 2004-959-559
Phone Num : 2004959559
Modyfikatory wyrażeń regularnych: flagi opcji
Literały wyrażeń regularnych mogą zawierać opcjonalny modyfikator do kontrolowania różnych aspektów dopasowywania. Modyfikatory są określane jako opcjonalna flaga. Możesz podać wiele modyfikatorów za pomocą wyłącznego LUB (|), jak pokazano wcześniej i mogą być reprezentowane przez jeden z nich -
Sr.No. | Modyfikator i opis |
---|---|
1 | re.I Dopasowuje bez rozróżniania wielkości liter. |
2 | re.L Interpretuje słowa zgodnie z aktualnym językiem. Ta interpretacja wpływa na grupę alfabetyczną (\ w i \ W), a także na zachowanie granic słów (\ b i \ B). |
3 | re.M Sprawia, że $ pasuje do końca linii (nie tylko do końca ciągu) i sprawia, że ^ dopasowuje początek dowolnego wiersza (nie tylko początek ciągu). |
4 | re.S Sprawia, że kropka (kropka) pasuje do dowolnego znaku, w tym do nowej linii. |
5 | re.U Interpretuje litery zgodnie z zestawem znaków Unicode. Ta flaga wpływa na zachowanie \ w, \ W, \ b, \ B. |
6 | re.X Zezwala na „ładniejszą” składnię wyrażeń regularnych. Ignoruje białe spacje (z wyjątkiem wewnątrz zestawu [] lub gdy jest poprzedzony odwrotnym ukośnikiem) i traktuje bez znaku # jako znacznik komentarza. |
Wzorce wyrażeń regularnych
Z wyjątkiem znaków sterujących, (+ ? . * ^ $ ( ) [ ] { } | \), wszystkie postacie pasują do siebie. Znaku sterującego można zmienić, poprzedzając go ukośnikiem odwrotnym.
Poniższa tabela zawiera listę składni wyrażeń regularnych, które są dostępne w Pythonie -
Sr.No. | Parametr i opis |
---|---|
1 | ^ Pasuje do początku wiersza. |
2 | $ Pasuje do końca linii. |
3 | . Dopasowuje dowolny pojedynczy znak z wyjątkiem nowej linii. Użycie opcji m pozwala dopasować również znak nowej linii. |
4 | [...] Dopasowuje dowolny pojedynczy znak w nawiasach. |
5 | [^...] Dopasowuje dowolny pojedynczy znak nie w nawiasach |
6 | re* Dopasowuje 0 lub więcej wystąpień poprzedniego wyrażenia. |
7 | re+ Dopasowuje 1 lub więcej wystąpień poprzedniego wyrażenia. |
8 | re? Dopasowuje 0 lub 1 wystąpienie poprzedniego wyrażenia. |
9 | re{ n} Dopasowuje dokładnie n liczbę wystąpień poprzedniego wyrażenia. |
10 | re{ n,} Dopasowuje n lub więcej wystąpień poprzedniego wyrażenia. |
11 | re{ n, m} Pasuje do co najmniej n i co najwyżej m wystąpień poprzedniego wyrażenia. |
12 | a|b Pasuje do a lub b. |
13 | (re) Grupuje wyrażenia regularne i zapamiętuje dopasowany tekst. |
14 | (?imx) Tymczasowo włącza opcje i, m lub x w wyrażeniu regularnym. Jeśli podano w nawiasach, dotyczy to tylko tego obszaru. |
15 | (?-imx) Tymczasowo wyłącza opcje i, m lub x w wyrażeniu regularnym. Jeśli podano w nawiasach, dotyczy to tylko tego obszaru. |
16 | (?: re) Grupuje wyrażenia regularne bez zapamiętywania dopasowanego tekstu. |
17 | (?imx: re) Tymczasowo włącza opcje i, m lub x w nawiasach. |
18 | (?-imx: re) Tymczasowo wyłącza opcje i, m lub x w nawiasach. |
19 | (?#...) Komentarz. |
20 | (?= re) Określa położenie za pomocą wzoru. Nie ma zakresu. |
21 | (?! re) Określa pozycję za pomocą negacji wzoru. Nie ma zakresu. |
22 | (?> re) Dopasowuje niezależny wzorzec bez cofania. |
23 | \w Dopasowuje znaki słowne. |
24 | \W Dopasowuje znaki inne niż słowa. |
25 | \s Pasuje do białych znaków. Odpowiednik [\ t \ n \ r \ f]. |
26 | \S Dopasowuje bez białych znaków. |
27 | \d Dopasowuje cyfry. Odpowiednik [0-9]. |
28 | \D Dopasowuje niecyfry. |
29 | \A Dopasowuje początek łańcucha. |
30 | \Z Dopasowuje koniec łańcucha. Jeśli istnieje nowa linia, pasuje ona tuż przed nową linią. |
31 | \z Dopasowuje koniec łańcucha. |
32 | \G Mecze to miejsce, w którym zakończył się ostatni mecz. |
33 | \b Dopasowuje granice wyrazów poza nawiasami. Dopasowuje znak Backspace (0x08) wewnątrz nawiasów. |
34 | \B Dopasowuje granice inne niż słowa. |
35 | \n, \t, etc. Dopasowuje znaki nowej linii, powroty karetki, tabulatory itp. |
36 | \1...\9 Pasuje do n-tego zgrupowanego wyrażenia podrzędnego. |
37 | \10 Pasuje do n-tego zgrupowanego wyrażenia podrzędnego, jeśli zostało już dopasowane. W przeciwnym razie odnosi się do ósemkowej reprezentacji kodu znaku. |
Przykłady wyrażeń regularnych
Dosłowne znaki
Sr.No. | Przykład i opis |
---|---|
1 | python Dopasuj „python”. |
Klasy postaci
Sr.No. | Przykład i opis |
---|---|
1 | [Pp]ython Dopasuj „Python” lub „python” |
2 | rub[ye] Dopasuj „ruby” lub „rube” |
3 | [aeiou] Dopasuj dowolną małą samogłoskę |
4 | [0-9] Dopasuj dowolną cyfrę; tak samo jak [0123456789] |
5 | [a-z] Dopasuj dowolną małą literę ASCII |
6 | [A-Z] Dopasuj dowolną wielką literę ASCII |
7 | [a-zA-Z0-9] Dopasuj dowolne z powyższych |
8 | [^aeiou] Dopasuj wszystko inne niż mała samogłoska |
9 | [^0-9] Dopasuj wszystko inne niż cyfra |
Specjalne klasy postaci
Sr.No. | Przykład i opis |
---|---|
1 | . Dopasuj dowolny znak z wyjątkiem nowej linii |
2 | \d Dopasuj cyfrę: [0–9] |
3 | \D Dopasuj niecyfrę: [^ 0-9] |
4 | \s Dopasuj biały znak: [\ t \ r \ n \ f] |
5 | \S Dopasuj bez białych znaków: [^ \ t \ r \ n \ f] |
6 | \w Dopasuj pojedynczy znak słowa: [A-Za-z0-9_] |
7 | \W Dopasuj znak niebędący słowem: [^ A-Za-z0-9_] |
Przypadki powtórzeń
Sr.No. | Przykład i opis |
---|---|
1 | ruby? Dopasuj „rub” lub „ruby”: y jest opcjonalne |
2 | ruby* Dopasuj „rub” plus 0 lub więcej ys |
3 | ruby+ Dopasuj „rub” plus 1 lub więcej ys |
4 | \d{3} Dopasuj dokładnie 3 cyfry |
5 | \d{3,} Dopasuj 3 lub więcej cyfr |
6 | \d{3,5} Dopasuj 3, 4 lub 5 cyfr |
Nongreedy powtórzenie
To pasuje do najmniejszej liczby powtórzeń -
Sr.No. | Przykład i opis |
---|---|
1 | <.*> Chciwe powtórzenie: dopasowuje „<python> perl>” |
2 | <.*?> Nongreedy: dopasowuje „<python>” w „<python> perl>” |
Grupowanie z nawiasami
Sr.No. | Przykład i opis |
---|---|
1 | \D\d+ Brak grupy: + powtarza \ d |
2 | (\D\d)+ Zgrupowane: + powtórzenia \ D \ d para |
3 | ([Pp]ython(,)?)+ Dopasuj „Python”, „Python, python, python” itp. |
Backreferences
To ponownie pasuje do poprzednio dopasowanej grupy -
Sr.No. | Przykład i opis |
---|---|
1 | ([Pp])ython&\1ails Dopasuj python & pails lub Python & Pails |
2 | (['"])[^\1]*\1 Ciąg w pojedynczym lub podwójnym cudzysłowie. \ 1 pasuje do dopasowanej pierwszej grupy. \ 2 pasuje do dopasowanej 2. grupy itd. |
Alternatywy
Sr.No. | Przykład i opis |
---|---|
1 | python|perl Dopasuj „python” lub „perl” |
2 | rub(y|le) Dopasuj „rubin” lub „rubel” |
3 | Python(!+|\?) „Python”, po którym następuje jeden lub więcej! czy jeden? |
Kotwice
To musi określić pozycję dopasowania.
Sr.No. | Przykład i opis |
---|---|
1 | ^Python Dopasuj „Python” na początku łańcucha lub linii wewnętrznej |
2 | Python$ Dopasuj „Python” na końcu ciągu lub linii |
3 | \APython Dopasuj „Python” na początku łańcucha |
4 | Python\Z Dopasuj „Python” na końcu łańcucha |
5 | \bPython\b Dopasuj „Python” na granicy słowa |
6 | \brub\B \ B nie jest granicą słów: dopasuj „rub” w „rube” i „ruby”, ale nie samodzielnie |
7 | Python(?=!) Dopasuj „Python”, jeśli następuje po nim wykrzyknik. |
8 | Python(?!!) Dopasuj „Python”, jeśli nie następuje po nim wykrzyknik. |
Specjalna składnia z nawiasami
Sr.No. | Przykład i opis |
---|---|
1 | R(?#comment) Pasuje do „R”. Cała reszta to komentarz |
2 | R(?i)uby Podczas dopasowywania „uby” bez rozróżniania wielkości liter |
3 | R(?i:uby) Tak samo jak powyżej |
4 | rub(?:y|le)) Grupuj tylko bez tworzenia \ 1 odwołania wstecznego |
Common Gateway Interface (CGI) to zestaw standardów definiujących sposób wymiany informacji między serwerem WWW a niestandardowym skryptem. Specyfikacje CGI są obecnie utrzymywane przez NCSA.
Co to jest CGI?
Interfejs Common Gateway Interface (CGI) jest standardem dla zewnętrznych programów bram do łączenia się z serwerami informacyjnymi, takimi jak serwery HTTP.
Obecna wersja to CGI / 1.1, a CGI / 1.2 jest w trakcie opracowywania.
Przeglądanie sieci
Aby zrozumieć koncepcję CGI, zobaczmy, co się dzieje, gdy klikamy hiperłącze w celu przeglądania określonej strony internetowej lub adresu URL.
Twoja przeglądarka kontaktuje się z serwerem HTTP i żąda adresu URL, tj. Nazwy pliku.
Serwer sieci Web analizuje adres URL i szuka nazwy pliku. Jeśli znajdzie ten plik, odeśle go z powrotem do przeglądarki, w przeciwnym razie wysyła komunikat o błędzie wskazujący, że zażądałeś niewłaściwego pliku.
Przeglądarka internetowa pobiera odpowiedź z serwera WWW i wyświetla otrzymany plik lub komunikat o błędzie.
Możliwe jest jednak takie skonfigurowanie serwera HTTP, aby za każdym razem, gdy zażądano pliku w określonym katalogu, plik ten nie był odsyłany; zamiast tego jest wykonywany jako program i cokolwiek ten program wyprowadza, jest wysyłane z powrotem do przeglądarki do wyświetlenia. Ta funkcja nosi nazwę Common Gateway Interface lub CGI, a programy nazywane są skryptami CGI. Te programy CGI mogą być Python Script, PERL Script, Shell Script, C lub C ++ program itp.
Diagram architektury CGI
Obsługa i konfiguracja serwera WWW
Przed przystąpieniem do programowania CGI upewnij się, że serwer WWW obsługuje CGI i jest skonfigurowany do obsługi programów CGI. Wszystkie programy CGI, które mają być wykonywane przez serwer HTTP, są przechowywane we wstępnie skonfigurowanym katalogu. Ten katalog nosi nazwę Katalog CGI i zgodnie z konwencją nosi nazwę / var / www / cgi-bin. Zgodnie z konwencją, pliki CGI mają rozszerzenie.cgi, ale możesz zachować swoje pliki z rozszerzeniem Python .py także.
Domyślnie serwer Linux jest skonfigurowany do uruchamiania tylko skryptów z katalogu cgi-bin w / var / www. Jeśli chcesz określić inny katalog do uruchamiania skryptów CGI, skomentuj następujące wiersze w pliku httpd.conf -
<Directory "/var/www/cgi-bin">
AllowOverride None
Options ExecCGI
Order allow,deny
Allow from all
</Directory>
<Directory "/var/www/cgi-bin">
Options All
</Directory>
W tym przypadku zakładamy, że masz poprawnie uruchomiony serwer sieciowy i możesz uruchomić dowolny inny program CGI, taki jak Perl lub Shell itp.
Pierwszy program CGI
Oto prosty link, który jest powiązany ze skryptem CGI o nazwie hello.py . Ten plik jest przechowywany w katalogu / var / www / cgi-bin i ma następującą zawartość. Przed uruchomieniem programu CGI upewnij się, że masz zmianę trybu pliku za pomocąchmod 755 hello.py Polecenie UNIX, aby uczynić plik wykonywalnym.
#!/usr/bin/python
print ("Content-type:text/html\r\n\r\n")
print ('<html>')
print ('<head>')
print ('<title>Hello Word - First CGI Program</title>')
print ('</head>')
print ('<body>')
print ('<h2>Hello Word! This is my first CGI program</h2>')
print ('</body>')
print ('</html>')
Note- Pierwsza linia w skrypcie musi być ścieżką do pliku wykonywalnego Pythona. W Linuksie powinien to być #! / Usr / bin / python3
Wprowadź następujący adres URL w przeglądarce
http://localhost:8080/cgi-bin/hello.py
Hello Word! To jest mój pierwszy program CGI |
Ten hello.py skrypt jest prostym skryptem w Pythonie, który zapisuje swoje dane wyjściowe w pliku STDOUT, tj. Screen. Dostępna jest jedna ważna i dodatkowa funkcja, czyli pierwsza linia do wydrukowaniaContent-type:text/html\r\n\r\n. Ta linia jest wysyłana z powrotem do przeglądarki i określa typ zawartości, która ma być wyświetlana na ekranie przeglądarki.
Do tej pory musisz już zrozumieć podstawową koncepcję CGI i możesz pisać wiele skomplikowanych programów CGI w języku Python. Ten skrypt może współdziałać z dowolnym innym systemem zewnętrznym również w celu wymiany informacji, takich jak RDBMS.
Nagłówek HTTP
Linia Content-type:text/html\r\n\r\njest częścią nagłówka HTTP, który jest wysyłany do przeglądarki w celu zrozumienia treści. Cały nagłówek HTTP będzie miał następującą postać -
HTTP Field Name: Field Content
For Example
Content-type: text/html\r\n\r\n
Istnieje kilka innych ważnych nagłówków HTTP, których będziesz często używać w programowaniu CGI.
Sr.No. | Nagłówek i opis |
---|---|
1 | Content-type: Ciąg MIME określający format zwracanego pliku. Przykład: Typ treści: tekst / html |
2 | Expires: Date Data utraty informacji. Jest używany przez przeglądarkę do decydowania, kiedy strona wymaga odświeżenia. Prawidłowy ciąg daty ma format 01 Jan 1998 12:00:00 GMT. |
3 | Location: URL Adres URL, który jest zwracany zamiast żądanego adresu URL. Możesz użyć tego pola, aby przekierować żądanie do dowolnego pliku. |
4 | Last-modified: Date Data ostatniej modyfikacji zasobu. |
5 | Content-length: N Długość zwracanych danych w bajtach. Przeglądarka używa tej wartości do raportowania szacowanego czasu pobierania pliku. |
6 | Set-Cookie: String Ustaw plik cookie przekazany przez ciąg |
Zmienne środowiskowe CGI
Wszystkie programy CGI mają dostęp do następujących zmiennych środowiskowych. Te zmienne odgrywają ważną rolę podczas pisania dowolnego programu CGI.
Sr.No. | Nazwa i opis zmiennej |
---|---|
1 | CONTENT_TYPE Typ danych treści. Używane, gdy klient wysyła załączoną zawartość na serwer. Na przykład przesyłanie plików. |
2 | CONTENT_LENGTH Długość informacji o zapytaniu. Jest dostępny tylko dla żądań POST. |
3 | HTTP_COOKIE Zwraca ustawione pliki cookie w postaci pary klucz-wartość. |
4 | HTTP_USER_AGENT Pole nagłówka żądania agenta użytkownika zawiera informacje o kliencie użytkownika, który wysłał żądanie. Jest to nazwa przeglądarki internetowej. |
5 | PATH_INFO Ścieżka do skryptu CGI. |
6 | QUERY_STRING Informacje zakodowane w adresie URL, które są wysyłane z żądaniem metody GET. |
7 | REMOTE_ADDR Adres IP zdalnego hosta wysyłającego żądanie. Jest to przydatne do logowania lub do uwierzytelniania. |
8 | REMOTE_HOST W pełni kwalifikowana nazwa hosta wysyłającego żądanie. Jeśli te informacje nie są dostępne, można użyć REMOTE_ADDR do uzyskania adresu IR. |
9 | REQUEST_METHOD Metoda użyta do wysłania żądania. Najpopularniejsze metody to GET i POST. |
10 | SCRIPT_FILENAME Pełna ścieżka do skryptu CGI. |
11 | SCRIPT_NAME Nazwa skryptu CGI. |
12 | SERVER_NAME Nazwa hosta lub adres IP serwera |
13 | SERVER_SOFTWARE Nazwa i wersja oprogramowania, na którym działa serwer. |
Oto mały program CGI do wyszczególnienia wszystkich zmiennych CGI. Kliknij to łącze, aby zobaczyć wynik Pobierz środowisko
#!/usr/bin/python
import os
print ("Content-type: text/html\r\n\r\n");
print ("<font size=+1>Environment</font><\br>");
for param in os.environ.keys():
print ("<b>%20s</b>: %s<\br>" % (param, os.environ[param]))
Metody GET i POST
Musiałeś spotkać się z wieloma sytuacjami, w których musisz przekazać pewne informacje z przeglądarki na serwer WWW, a ostatecznie do programu CGI. Najczęściej przeglądarka używa dwóch metod przekazywania tych informacji do serwera WWW. Te metody to metoda GET i metoda POST.
Przekazywanie informacji metodą GET
Metoda GET wysyła zakodowane informacje o użytkowniku dołączone do żądania strony. Strona i zakodowane informacje są oddzielone znakiem? znak w następujący sposób -
http://www.test.com/cgi-bin/hello.py?key1=value1&key2=value2
Metoda GET jest domyślną metodą przekazywania informacji z przeglądarki do serwera WWW i tworzy długi ciąg, który pojawia się w polu Lokalizacja: przeglądarki. Nigdy nie używaj metody GET, jeśli masz hasło lub inne poufne informacje do przekazania na serwer. Metoda GET ma ograniczenie rozmiaru: w ciągu żądania można wysłać tylko 1024 znaki. Metoda GET wysyła informacje przy użyciu nagłówka QUERY_STRING i będzie dostępna w programie CGI poprzez zmienną środowiskową QUERY_STRING.
Możesz przekazywać informacje, po prostu łącząc pary klucz i wartość wraz z dowolnym adresem URL lub możesz użyć tagów HTML <FORM>, aby przekazać informacje za pomocą metody GET.
Prosty przykład adresu URL: metoda pobierania
Oto prosty adres URL, który przekazuje dwie wartości do programu hello_get.py przy użyciu metody GET.
/cgi-bin/hello_get.py?first_name=ZARA&last_name=ALIPoniżej jest hello_get.pyskrypt do obsługi danych wejściowych podawanych przez przeglądarkę internetową. Będziemy używaćcgi moduł, który bardzo ułatwia dostęp do przekazywanych informacji -
#!/usr/bin/python
# Import modules for CGI handling
import cgi, cgitb
# Create instance of FieldStorage
form = cgi.FieldStorage()
# Get data from fields
first_name = form.getvalue('first_name')
last_name = form.getvalue('last_name')
print ("Content-type:text/html\r\n\r\n")
print ("<html>")
print ("<head>")
print ("<title>Hello - Second CGI Program</title>")
print ("</head>")
print ("<body>")
print ("<h2>Hello %s %s</h2>" % (first_name, last_name))
print ("</body>")
print ("</html>")
Dałoby to następujący wynik -
Witam ZARA ALI |
Prosty przykład FORMULARZA: GET Method
W tym przykładzie dwie wartości są przekazywane przy użyciu formularza HTML i przycisku przesyłania. Używamy tego samego skryptu CGI hello_get.py do obsługi tego wejścia.
<form action = "/cgi-bin/hello_get.py" method = "get">
First Name: <input type = "text" name = "first_name"> <br />
Last Name: <input type = "text" name = "last_name" />
<input type = "submit" value = "Submit" />
</form>
Oto rzeczywiste dane wyjściowe powyższego formularza. Wpisz Imię i Nazwisko, a następnie kliknij przycisk Prześlij, aby zobaczyć wynik.
Przekazywanie informacji metodą POST
Generalnie bardziej niezawodną metodą przekazywania informacji do programu CGI jest metoda POST. Spowoduje to pakowanie informacji dokładnie w taki sam sposób, jak metody GET, ale zamiast wysyłać je jako ciąg tekstowy po znaku? w adresie URL wysyła go jako oddzielną wiadomość. Ta wiadomość pojawia się w skrypcie CGI w postaci standardowego wejścia.
Poniżej znajduje się ten sam skrypt hello_get.py, który obsługuje metodę GET i POST.
#!/usr/bin/python
# Import modules for CGI handling
import cgi, cgitb
# Create instance of FieldStorage
form = cgi.FieldStorage()
# Get data from fields
first_name = form.getvalue('first_name')
last_name = form.getvalue('last_name')
print "Content-type:text/html\r\n\r\n"
print "<html>"
print "<head>"
print "<title>Hello - Second CGI Program</title>"
print "</head>"
print "<body>"
print "<h2>Hello %s %s</h2>" % (first_name, last_name)
print "</body>"
print "</html>"
Weźmy ponownie ten sam przykład co powyżej, który przekazuje dwie wartości za pomocą HTML FORM i przycisku przesyłania. Używamy tego samego skryptu CGI hello_get.py do obsługi tego wejścia.
<form action = "/cgi-bin/hello_get.py" method = "post">
First Name: <input type = "text" name = "first_name"><br />
Last Name: <input type = "text" name = "last_name" />
<input type = "submit" value = "Submit" />
</form>
Oto rzeczywisty wynik powyższego formularza. Wpisz Imię i Nazwisko, a następnie kliknij przycisk Prześlij, aby zobaczyć wynik.
Przekazywanie danych pola wyboru do programu CGI
Pola wyboru są używane, gdy wymagane jest wybranie więcej niż jednej opcji.
Oto przykładowy kod HTML formularza z dwoma polami wyboru -
<form action = "/cgi-bin/checkbox.cgi" method = "POST" target = "_blank">
<input type = "checkbox" name = "maths" value = "on" /> Maths
<input type = "checkbox" name = "physics" value = "on" /> Physics
<input type = "submit" value = "Select Subject" />
</form>
Wynikiem tego kodu jest następująca postać -
Poniżej znajduje się skrypt checkbox.cgi do obsługi danych wejściowych podawanych przez przeglądarkę internetową dla przycisku wyboru.
#!/usr/bin/python
# Import modules for CGI handling
import cgi, cgitb
# Create instance of FieldStorage
form = cgi.FieldStorage()
# Get data from fields
if form.getvalue('maths'):
math_flag = "ON"
else:
math_flag = "OFF"
if form.getvalue('physics'):
physics_flag = "ON"
else:
physics_flag = "OFF"
print "Content-type:text/html\r\n\r\n"
print "<html>"
print "<head>"
print "<title>Checkbox - Third CGI Program</title>"
print "</head>"
print "<body>"
print "<h2> CheckBox Maths is : %s</h2>" % math_flag
print "<h2> CheckBox Physics is : %s</h2>" % physics_flag
print "</body>"
print "</html>"
Przekazywanie danych przycisku radiowego do programu CGI
Przyciski radiowe są używane, gdy wymagana jest tylko jedna opcja.
Oto przykład kodu HTML dla formularza z dwoma przyciskami opcji -
<form action = "/cgi-bin/radiobutton.py" method = "post" target = "_blank">
<input type = "radio" name = "subject" value = "maths" /> Maths
<input type = "radio" name = "subject" value = "physics" /> Physics
<input type = "submit" value = "Select Subject" />
</form>
Wynikiem tego kodu jest następująca postać -
Poniżej znajduje się skrypt radiobutton.py do obsługi danych wejściowych podawanych przez przeglądarkę internetową dla przycisku opcji -
#!/usr/bin/python
# Import modules for CGI handling
import cgi, cgitb
# Create instance of FieldStorage
form = cgi.FieldStorage()
# Get data from fields
if form.getvalue('subject'):
subject = form.getvalue('subject')
else:
subject = "Not set"
print "Content-type:text/html\r\n\r\n"
print "<html>"
print "<head>"
print "<title>Radio - Fourth CGI Program</title>"
print "</head>"
print "<body>"
print "<h2> Selected Subject is %s</h2>" % subject
print "</body>"
print "</html>"
Przekazywanie danych obszaru tekstowego do programu CGI
Element TEXTAREA jest używany, gdy tekst wielowierszowy ma zostać przesłany do programu CGI.
Oto przykładowy kod HTML dla formularza z polem TEXTAREA -
<form action = "/cgi-bin/textarea.py" method = "post" target = "_blank">
<textarea name = "textcontent" cols = "40" rows = "4">
Type your text here...
</textarea>
<input type = "submit" value = "Submit" />
</form>
Wynikiem tego kodu jest następująca postać -
Poniżej znajduje się skrypt textarea.cgi do obsługi danych wejściowych podawanych przez przeglądarkę internetową -
#!/usr/bin/python
# Import modules for CGI handling
import cgi, cgitb
# Create instance of FieldStorage
form = cgi.FieldStorage()
# Get data from fields
if form.getvalue('textcontent'):
text_content = form.getvalue('textcontent')
else:
text_content = "Not entered"
print "Content-type:text/html\r\n\r\n"
print "<html>"
print "<head>";
print "<title>Text Area - Fifth CGI Program</title>"
print "</head>"
print "<body>"
print "<h2> Entered Text Content is %s</h2>" % text_content
print "</body>"
Przekazywanie danych z rozwijanej skrzynki do programu CGI
Drop Down Box jest używany, gdy mamy wiele dostępnych opcji, ale tylko jedna lub dwie zostaną wybrane.
Oto przykładowy kod HTML dla formularza z jednym rozwijanym oknem -
<form action = "/cgi-bin/dropdown.py" method = "post" target = "_blank">
<select name = "dropdown">
<option value = "Maths" selected>Maths</option>
<option value = "Physics">Physics</option>
</select>
<input type = "submit" value = "Submit"/>
</form>
Wynikiem tego kodu jest następująca postać -
Poniżej znajduje się skrypt dropdown.py do obsługi danych wejściowych podawanych przez przeglądarkę internetową.
#!/usr/bin/python
# Import modules for CGI handling
import cgi, cgitb
# Create instance of FieldStorage
form = cgi.FieldStorage()
# Get data from fields
if form.getvalue('dropdown'):
subject = form.getvalue('dropdown')
else:
subject = "Not entered"
print "Content-type:text/html\r\n\r\n"
print "<html>"
print "<head>"
print "<title>Dropdown Box - Sixth CGI Program</title>"
print "</head>"
print "<body>"
print "<h2> Selected Subject is %s</h2>" % subject
print "</body>"
print "</html>"
Korzystanie z plików cookie w CGI
Protokół HTTP jest protokołem bezstanowym. W przypadku komercyjnej witryny internetowej wymagane jest przechowywanie informacji o sesjach między różnymi stronami. Na przykład jedna rejestracja użytkownika kończy się po wypełnieniu wielu stron. Jak zachować informacje o sesji użytkownika na wszystkich stronach internetowych?
W wielu sytuacjach używanie plików cookie jest najskuteczniejszą metodą zapamiętywania i śledzenia preferencji, zakupów, prowizji i innych informacji wymaganych dla lepszych wrażeń odwiedzających lub statystyk witryny.
Jak to działa?
Twój serwer wysyła pewne dane do przeglądarki odwiedzającego w formie pliku cookie. Przeglądarka może zaakceptować plik cookie. Jeśli tak, jest przechowywany jako zwykły zapis tekstowy na dysku twardym gościa. Teraz, gdy użytkownik przejdzie na inną stronę w Twojej witrynie, plik cookie jest dostępny do pobrania. Po odzyskaniu serwer wie / pamięta, co zostało zapisane.
Pliki cookie to zapis danych w postaci zwykłego tekstu składający się z 5 pól o zmiennej długości -
Expires- data wygaśnięcia pliku cookie. Jeśli jest puste, plik cookie wygaśnie, gdy odwiedzający zamknie przeglądarkę.
Domain - nazwa domeny Twojej witryny.
Path- Ścieżka do katalogu lub strony internetowej, która ustawia plik cookie. To może być puste, jeśli chcesz pobrać plik cookie z dowolnego katalogu lub strony.
Secure- Jeśli to pole zawiera słowo „bezpieczny”, plik cookie można pobrać tylko z bezpiecznego serwera. Jeśli to pole jest puste, takie ograniczenie nie istnieje.
Name=Value - Pliki cookie są ustawiane i pobierane w postaci par klucza i wartości.
Konfiguracja plików cookie
Wysyłanie plików cookie do przeglądarki jest bardzo łatwe. Te pliki cookie są wysyłane wraz z nagłówkiem HTTP przed do pola typu zawartości. Zakładając, że chcesz ustawić identyfikator użytkownika i hasło jako pliki cookie. Ustawienie plików cookie odbywa się w następujący sposób -
#!/usr/bin/python
print "Set-Cookie:UserID = XYZ;\r\n"
print "Set-Cookie:Password = XYZ123;\r\n"
print "Set-Cookie:Expires = Tuesday, 31-Dec-2007 23:12:40 GMT;\r\n"
print "Set-Cookie:Domain = www.tutorialspoint.com;\r\n"
print "Set-Cookie:Path = /perl;\n"
print "Content-type:text/html\r\n\r\n"
...........Rest of the HTML Content....
Na podstawie tego przykładu musisz wiedzieć, jak ustawić pliki cookie. UżywamySet-Cookie Nagłówek HTTP do ustawiania plików cookie.
Opcjonalne jest ustawienie atrybutów plików cookie, takich jak Wygasa, Domena i Ścieżka. Warto zauważyć, że pliki cookie są ustawiane przed wysłaniem magicznej linii"Content-type:text/html\r\n\r\n.
Pobieranie plików cookie
Pobranie wszystkich ustawionych plików cookie jest bardzo łatwe. Pliki cookie są przechowywane w zmiennej środowiskowej CGI HTTP_COOKIE i będą miały następującą postać -
key1 = value1;key2 = value2;key3 = value3....
Oto przykład pobierania plików cookie.
#!/usr/bin/python
# Import modules for CGI handling
from os import environ
import cgi, cgitb
if environ.has_key('HTTP_COOKIE'):
for cookie in map(strip, split(environ['HTTP_COOKIE'], ';')):
(key, value ) = split(cookie, '=');
if key == "UserID":
user_id = value
if key == "Password":
password = value
print "User ID = %s" % user_id
print "Password = %s" % password
Daje to następujący wynik dla plików cookie ustawionych przez powyższy skrypt -
User ID = XYZ
Password = XYZ123
Przykład przesyłania plików
Aby przesłać plik, formularz HTML musi mieć atrybut enctype ustawiony na multipart/form-data. Znacznik wejściowy z typem pliku tworzy przycisk „Przeglądaj”.
<html>
<body>
<form enctype = "multipart/form-data"
action = "save_file.py" method = "post">
<p>File: <input type = "file" name = "filename" /></p>
<p><input type = "submit" value = "Upload" /></p>
</form>
</body>
</html>
Wynikiem tego kodu jest następująca postać -
Powyższy przykład został celowo wyłączony, aby zapisać osoby przesyłające plik na nasz serwer, ale możesz wypróbować powyższy kod na swoim serwerze.
Oto scenariusz save_file.py do obsługi przesyłania plików -
#!/usr/bin/python
import cgi, os
import cgitb; cgitb.enable()
form = cgi.FieldStorage()
# Get filename here.
fileitem = form['filename']
# Test if the file was uploaded
if fileitem.filename:
# strip leading path from file name to avoid
# directory traversal attacks
fn = os.path.basename(fileitem.filename)
open('/tmp/' + fn, 'wb').write(fileitem.file.read())
message = 'The file "' + fn + '" was uploaded successfully'
else:
message = 'No file was uploaded'
print """\
Content-Type: text/html\n
<html>
<body>
<p>%s</p>
</body>
</html>
""" % (message,)
Jeśli uruchomisz powyższy skrypt w systemie Unix / Linux, musisz zadbać o zastąpienie separatora plików w następujący sposób, w przeciwnym razie na komputerze z systemem Windows powyżej instrukcja open () powinna działać dobrze.
fn = os.path.basename(fileitem.filename.replace("\\", "/" ))
Jak wywołać okno dialogowe „Pobieranie pliku”?
Czasami pożądane jest udostępnienie opcji, w której użytkownik może kliknąć łącze, a zamiast wyświetlania rzeczywistej zawartości wyświetli się okno dialogowe „Pobieranie pliku”. Jest to bardzo łatwe i można to osiągnąć za pomocą nagłówka HTTP. Ten nagłówek HTTP różni się od nagłówka wspomnianego w poprzedniej sekcji.
Na przykład, jeśli chcesz utworzyć plik FileName plik do pobrania z podanego linku, to jego składnia jest następująca -
#!/usr/bin/python
# HTTP Header
print "Content-Type:application/octet-stream; name = \"FileName\"\r\n";
print "Content-Disposition: attachment; filename = \"FileName\"\r\n\n";
# Actual File Content will go here.
fo = open("foo.txt", "rb")
str = fo.read();
print str
# Close opend file
fo.close()
Mam nadzieję, że podobał Ci się ten samouczek. Jeśli tak, prześlij mi swoją opinię na adres: Skontaktuj się z nami
Standardem Pythona dla interfejsów baz danych jest Python DB-API. Większość interfejsów baz danych Pythona jest zgodnych z tym standardem.
Możesz wybrać odpowiednią bazę danych dla swojej aplikacji. Python Database API obsługuje szeroką gamę serwerów baz danych, takich jak -
- GadFly
- mSQL
- MySQL
- PostgreSQL
- Microsoft SQL Server 2000
- Informix
- Interbase
- Oracle
- Sybase
- SQLite
Oto lista dostępnych interfejsów baz danych Pythona - Python Database Interfaces and APIs . Musisz pobrać oddzielny moduł DB API dla każdej bazy danych, do której chcesz uzyskać dostęp. Na przykład, jeśli potrzebujesz dostępu do bazy danych Oracle, a także do bazy danych MySQL, musisz pobrać zarówno moduły bazy danych Oracle, jak i MySQL.
DB API zapewnia minimalny standard pracy z bazami danych przy użyciu struktur i składni Pythona, jeśli tylko jest to możliwe. Ten interfejs API obejmuje następujące -
- Importowanie modułu API.
- Uzyskanie połączenia z bazą danych.
- Wydawanie instrukcji SQL i procedur składowanych.
- Zamykanie połączenia
Python ma wbudowaną obsługę SQLite. W tej sekcji nauczylibyśmy się wszystkich pojęć z użyciem MySQL. Moduł MySQLdb, popularny interfejs MySQL nie jest kompatybilny z Pythonem 3. Zamiast tego użyjemy modułu PyMySQL .
Co to jest PyMySQL?
PyMySQL to interfejs do łączenia się z serwerem bazy danych MySQL z Pythona. Implementuje Python Database API v2.0 i zawiera czystą bibliotekę klienta MySQL w języku Python. Celem PyMySQL jest bycie bezpośrednim zamiennikiem MySQLdb.
Jak zainstalować PyMySQL?
Zanim przejdziesz dalej, upewnij się, że masz zainstalowany PyMySQL na swoim komputerze. Po prostu wpisz następujące polecenie w swoim skrypcie Pythona i uruchom go -
#!/usr/bin/python3
import pymysql
Jeśli daje następujący wynik, oznacza to, że moduł MySQLdb nie jest zainstalowany -
Traceback (most recent call last):
File "test.py", line 3, in <module>
Import pymysql
ImportError: No module named pymysql
Ostatnia stabilna wersja jest dostępna w PyPI i można ją zainstalować za pomocą pip -
pip install pymysql
Alternatywnie (np. Jeśli pip nie jest dostępny), archiwum można pobrać z GitHub i zainstalować za pomocą Setuptools w następujący sposób -
$ # X.X is the desired pymysql version (e.g. 0.5 or 0.6).
$ curl -L https://github.com/PyMySQL/PyMySQL/tarball/pymysql-X.X | tar xz $ cd PyMySQL*
$ python setup.py install $ # The folder PyMySQL* can be safely removed now.
Note - Upewnij się, że masz uprawnienia roota, aby zainstalować powyższy moduł.
Połączenie z bazą danych
Przed połączeniem się z bazą danych MySQL upewnij się, że są spełnione następujące warunki -
Utworzyłeś bazę danych TESTDB.
Utworzyłeś tabelę PRACOWNIK w TESTDB.
Ta tabela zawiera pola FIRST_NAME, LAST_NAME, AGE, SEX i INCOME.
ID użytkownika „testuser” i hasło „test123” są ustawione na dostęp do bazy danych TESTDB.
Moduł Pythona PyMySQL jest poprawnie zainstalowany na Twoim komputerze.
Przeszedłeś przez samouczek MySQL, aby zrozumieć podstawy MySQL.
Przykład
Poniżej znajduje się przykład połączenia z bazą danych MySQL „TESTDB” -
#!/usr/bin/python3
import pymysql
# Open database connection
db = pymysql.connect("localhost","testuser","test123","TESTDB" )
# prepare a cursor object using cursor() method
cursor = db.cursor()
# execute SQL query using execute() method.
cursor.execute("SELECT VERSION()")
# Fetch a single row using fetchone() method.
data = cursor.fetchone()
print ("Database version : %s " % data)
# disconnect from server
db.close()
Podczas uruchamiania tego skryptu daje następujący wynik.
Database version : 5.5.20-log
Jeśli połączenie zostanie nawiązane ze źródłem danych, obiekt połączenia jest zwracany i zapisywany w db do dalszego użytku, w przeciwnym razie dbjest ustawiona na Brak. Kolejny,db obiekt służy do tworzenia pliku cursorobiekt, który z kolei służy do wykonywania zapytań SQL. Wreszcie, przed wyjściem, zapewnia zamknięcie połączenia z bazą danych i zwolnienie zasobów.
Tworzenie tabeli bazy danych
Po nawiązaniu połączenia z bazą danych jesteśmy gotowi do tworzenia tabel lub rekordów w tabelach bazy danych za pomocą execute metoda utworzonego kursora.
Przykład
Stwórzmy tabelę bazy danych PRACOWNIK -
#!/usr/bin/python3
import pymysql
# Open database connection
db = pymysql.connect("localhost","testuser","test123","TESTDB" )
# prepare a cursor object using cursor() method
cursor = db.cursor()
# Drop table if it already exist using execute() method.
cursor.execute("DROP TABLE IF EXISTS EMPLOYEE")
# Create table as per requirement
sql = """CREATE TABLE EMPLOYEE (
FIRST_NAME CHAR(20) NOT NULL,
LAST_NAME CHAR(20),
AGE INT,
SEX CHAR(1),
INCOME FLOAT )"""
cursor.execute(sql)
# disconnect from server
db.close()
Operacja INSERT
Operacja INSERT jest wymagana, gdy chcesz utworzyć rekordy w tabeli bazy danych.
Przykład
Poniższy przykład wykonuje instrukcję SQL INSERT , aby utworzyć rekord w tabeli EMPLOYEE -
#!/usr/bin/python3
import pymysql
# Open database connection
db = pymysql.connect("localhost","testuser","test123","TESTDB" )
# prepare a cursor object using cursor() method
cursor = db.cursor()
# Prepare SQL query to INSERT a record into the database.
sql = """INSERT INTO EMPLOYEE(FIRST_NAME,
LAST_NAME, AGE, SEX, INCOME)
VALUES ('Mac', 'Mohan', 20, 'M', 2000)"""
try:
# Execute the SQL command
cursor.execute(sql)
# Commit your changes in the database
db.commit()
except:
# Rollback in case there is any error
db.rollback()
# disconnect from server
db.close()
Powyższy przykład można zapisać w następujący sposób, aby dynamicznie tworzyć zapytania SQL -
#!/usr/bin/python3
import pymysql
# Open database connection
db = pymysql.connect("localhost","testuser","test123","TESTDB" )
# prepare a cursor object using cursor() method
cursor = db.cursor()
# Prepare SQL query to INSERT a record into the database.
sql = "INSERT INTO EMPLOYEE(FIRST_NAME, \
LAST_NAME, AGE, SEX, INCOME) \
VALUES ('%s', '%s', '%d', '%c', '%d' )" % \
('Mac', 'Mohan', 20, 'M', 2000)
try:
# Execute the SQL command
cursor.execute(sql)
# Commit your changes in the database
db.commit()
except:
# Rollback in case there is any error
db.rollback()
# disconnect from server
db.close()
Przykład
Poniższy segment kodu to kolejna forma wykonania, w której można bezpośrednio przekazywać parametry -
..................................
user_id = "test123"
password = "password"
con.execute('insert into Login values("%s", "%s")' % \
(user_id, password))
..................................
Operacja READ
READ Operacja na dowolnej bazie danych oznacza pobranie przydatnych informacji z bazy danych.
Po ustanowieniu połączenia z bazą danych można wykonać zapytanie do tej bazy danych. Możesz użyć jednego z nichfetchone() metoda pobierania pojedynczego rekordu lub fetchall() metoda pobierania wielu wartości z tabeli bazy danych.
fetchone()- Pobiera następny wiersz zestawu wyników zapytania. Zestaw wyników to obiekt, który jest zwracany, gdy obiekt kursora jest używany do zapytania tabeli.
fetchall()- Pobiera wszystkie wiersze w zestawie wyników. Jeśli niektóre wiersze zostały już wyodrębnione z zestawu wyników, pobiera pozostałe wiersze z zestawu wyników.
rowcount - To jest atrybut tylko do odczytu i zwraca liczbę wierszy, na które wpłynęła metoda execute ().
Przykład
Poniższa procedura odpytuje wszystkie rekordy z tabeli PRACOWNIK z wynagrodzeniem powyżej 1000 -
#!/usr/bin/python3
import pymysql
# Open database connection
db = pymysql.connect("localhost","testuser","test123","TESTDB" )
# prepare a cursor object using cursor() method
cursor = db.cursor()
# Prepare SQL query to INSERT a record into the database.
sql = "SELECT * FROM EMPLOYEE \
WHERE INCOME > '%d'" % (1000)
try:
# Execute the SQL command
cursor.execute(sql)
# Fetch all the rows in a list of lists.
results = cursor.fetchall()
for row in results:
fname = row[0]
lname = row[1]
age = row[2]
sex = row[3]
income = row[4]
# Now print fetched result
print ("fname = %s,lname = %s,age = %d,sex = %s,income = %d" % \
(fname, lname, age, sex, income ))
except:
print ("Error: unable to fetch data")
# disconnect from server
db.close()
Wynik
To da następujący wynik -
fname = Mac, lname = Mohan, age = 20, sex = M, income = 2000
Operacja aktualizacji
UPDATE Operacja na dowolnej bazie danych oznacza aktualizację jednego lub więcej rekordów, które są już dostępne w bazie danych.
Poniższa procedura aktualizuje wszystkie rekordy zawierające PŁEĆ jako 'M'. Tutaj zwiększamy WIEK wszystkich samców o jeden rok.
Przykład
#!/usr/bin/python3
import pymysql
# Open database connection
db = pymysql.connect("localhost","testuser","test123","TESTDB" )
# prepare a cursor object using cursor() method
cursor = db.cursor()
# Prepare SQL query to UPDATE required records
sql = "UPDATE EMPLOYEE SET AGE = AGE + 1
WHERE SEX = '%c'" % ('M')
try:
# Execute the SQL command
cursor.execute(sql)
# Commit your changes in the database
db.commit()
except:
# Rollback in case there is any error
db.rollback()
# disconnect from server
db.close()
Operacja USUŃ
Operacja DELETE jest wymagana, gdy chcesz usunąć niektóre rekordy z bazy danych. Poniżej znajduje się procedura usuwania wszystkich zapisów od PRACOWNIKA w wieku powyżej 20 lat -
Przykład
#!/usr/bin/python3
import pymysql
# Open database connection
db = pymysql.connect("localhost","testuser","test123","TESTDB" )
# prepare a cursor object using cursor() method
cursor = db.cursor()
# Prepare SQL query to DELETE required records
sql = "DELETE FROM EMPLOYEE WHERE AGE > '%d'" % (20)
try:
# Execute the SQL command
cursor.execute(sql)
# Commit your changes in the database
db.commit()
except:
# Rollback in case there is any error
db.rollback()
# disconnect from server
db.close()
Wykonywanie transakcji
Transakcje to mechanizm zapewniający spójność danych. Transakcje mają następujące cztery właściwości -
Atomicity - Albo transakcja zostaje zakończona, albo nic się nie dzieje.
Consistency - Transakcja musi rozpocząć się w stanie zgodnym i pozostawić system w stanie zgodnym.
Isolation - Pośrednie wyniki transakcji nie są widoczne poza bieżącą transakcją.
Durability - Po zatwierdzeniu transakcji efekty są trwałe, nawet po awarii systemu.
Python DB API 2.0 zapewnia dwie metody zatwierdzania lub wycofywania transakcji.
Przykład
Wiesz już, jak realizować transakcje. Oto podobny przykład -
# Prepare SQL query to DELETE required records
sql = "DELETE FROM EMPLOYEE WHERE AGE > '%d'" % (20)
try:
# Execute the SQL command
cursor.execute(sql)
# Commit your changes in the database
db.commit()
except:
# Rollback in case there is any error
db.rollback()
Operacja COMMIT
Commit to operacja, która daje zielony sygnał do bazy danych w celu sfinalizowania zmian, a po tej operacji nie można cofnąć żadnej zmiany.
Oto prosty przykład wywołania commit metoda.
db.commit()
Operacja ROLLBACK
Jeśli nie jesteś zadowolony z co najmniej jednej zmiany i chcesz całkowicie cofnąć te zmiany, użyj rozszerzenia rollback() metoda.
Oto prosty przykład wywołania rollback() metoda.
db.rollback()
Odłączanie bazy danych
Aby rozłączyć połączenie z bazą danych, użyj metody close ().
db.close()
Jeśli połączenie z bazą danych zostanie zamknięte przez użytkownika za pomocą metody close (), wszystkie oczekujące transakcje są wycofywane przez bazę danych. Jednak zamiast polegać na szczegółach implementacji niższego poziomu bazy danych, Twoja aplikacja będzie lepiej wywoływać jawne zatwierdzanie lub wycofywanie zmian.
Obsługa błędów
Istnieje wiele źródeł błędów. Kilka przykładów to błąd składni w wykonywanej instrukcji SQL, błąd połączenia lub wywołanie metody pobierania dla już anulowanego lub zakończonego uchwytu instrukcji.
Interfejs API bazy danych definiuje liczbę błędów, które muszą występować w każdym module bazy danych. W poniższej tabeli wymieniono te wyjątki.
Sr.No. | Wyjątek i opis |
---|---|
1 | Warning Używany w przypadku problemów, które nie są śmiertelne. Musi podklasę StandardError. |
2 | Error Klasa bazowa dla błędów. Musi podklasę StandardError. |
3 | InterfaceError Używany w przypadku błędów w module bazy danych, a nie w samej bazie danych. Musi podklasa Błąd. |
4 | DatabaseError Używane w przypadku błędów w bazie danych. Musi podklasa Błąd. |
5 | DataError Podklasa DatabaseError, która odnosi się do błędów w danych. |
6 | OperationalError Podklasa DatabaseError, która odnosi się do błędów, takich jak utrata połączenia z bazą danych. Te błędy są na ogół poza kontrolą skryptera języka Python. |
7 | IntegrityError Podklasa DatabaseError dla sytuacji, które mogą uszkodzić relacyjną integralność, takich jak ograniczenia unikalności lub klucze obce. |
8 | InternalError Podklasa DatabaseError, która odnosi się do błędów wewnętrznych modułu bazy danych, takich jak kursor nie jest już aktywny. |
9 | ProgrammingError Podklasa DatabaseError, która odnosi się do błędów, takich jak zła nazwa tabeli i inne rzeczy, za które można bezpiecznie obwiniać Ciebie. |
10 | NotSupportedError Podklasa DatabaseError, która odnosi się do próby wywołania nieobsługiwanej funkcjonalności. |
Twoje skrypty Pythona powinny obsługiwać te błędy, ale przed użyciem któregokolwiek z powyższych wyjątków upewnij się, że Twoja baza danych MySQLdb obsługuje ten wyjątek. Możesz uzyskać więcej informacji na ich temat, czytając specyfikację DB API 2.0.
Python zapewnia dwa poziomy dostępu do usług sieciowych. Na niskim poziomie można uzyskać dostęp do podstawowej obsługi gniazd w podstawowym systemie operacyjnym, co umożliwia implementację klientów i serwerów zarówno dla protokołów zorientowanych na połączenie, jak i dla protokołów bezpołączeniowych.
Python ma również biblioteki, które zapewniają wyższy poziom dostępu do określonych protokołów sieciowych na poziomie aplikacji, takich jak FTP, HTTP i tak dalej.
W tym rozdziale poznasz najsłynniejszą koncepcję w dziedzinie sieci - programowanie za pomocą gniazd.
Co to są gniazda?
Gniazda to punkty końcowe dwukierunkowego kanału komunikacyjnego. Gniazda mogą komunikować się w ramach procesu, między procesami na tej samej maszynie lub między procesami na różnych kontynentach.
Gniazda mogą być implementowane w wielu różnych typach kanałów: gniazda domeny Unix, TCP, UDP i tak dalej. Gniazdo biblioteka zapewnia specyficzne klasy do obsługi wspólnych transportów, jak również ogólnego interfejsu do obsługi resztę.
Gniazda mają swoje własne słownictwo -
Sr.No. | Termin i opis |
---|---|
1 | domain Rodzina protokołów używanych jako mechanizm transportu. Te wartości są stałymi, takimi jak AF_INET, PF_INET, PF_UNIX, PF_X25 i tak dalej. |
2 | type Typ komunikacji między dwoma punktami końcowymi, zwykle SOCK_STREAM dla protokołów zorientowanych na połączenie i SOCK_DGRAM dla protokołów bezpołączeniowych. |
3 | protocol Zwykle zero, może to być wykorzystane do identyfikacji wariantu protokołu w domenie i typu. |
4 | hostname Identyfikator interfejsu sieciowego -
|
5 | port Każdy serwer nasłuchuje klientów dzwoniących na co najmniej jednym porcie. Port może być numerem portu Fixnum, ciągiem znaków zawierającym numer portu lub nazwą usługi. |
Moduł gniazda
Aby utworzyć gniazdo, musisz użyć funkcji socket.socket () dostępnej w module gniazda, która ma ogólną składnię -
s = socket.socket (socket_family, socket_type, protocol = 0)
Oto opis parametrów -
socket_family - To jest AF_UNIX lub AF_INET, jak wyjaśniono wcześniej.
socket_type - To jest SOCK_STREAM lub SOCK_DGRAM.
protocol - Zwykle jest to pomijane, domyślnie 0.
Gdy masz już obiekt gniazda , możesz użyć wymaganych funkcji do stworzenia programu klienta lub serwera. Poniżej znajduje się lista wymaganych funkcji -
Metody gniazda serwera
Sr.No. | Metoda i opis |
---|---|
1 | s.bind() Ta metoda wiąże adres (nazwa hosta, para numerów portów) z gniazdem. |
2 | s.listen() Ta metoda konfiguruje i uruchamia odbiornik TCP. |
3 | s.accept() To pasywnie akceptuje połączenie klienta TCP, czekając na nadejście połączenia (blokowanie). |
Metody gniazda klienta
Sr.No. | Metoda i opis |
---|---|
1 | s.connect() Ta metoda aktywnie inicjuje połączenie z serwerem TCP. |
Ogólne metody gniazd
Sr.No. | Metoda i opis |
---|---|
1 | s.recv() Ta metoda odbiera komunikat TCP |
2 | s.send() Ta metoda przesyła komunikat TCP |
3 | s.recvfrom() Ta metoda odbiera komunikat UDP |
4 | s.sendto() Ta metoda przesyła komunikat UDP |
5 | s.close() Ta metoda zamyka gniazdo |
6 | socket.gethostname() Zwraca nazwę hosta. |
Prosty serwer
Do pisania serwerów internetowych używamy rozszerzenia socketfunkcja dostępna w module gniazda w celu utworzenia obiektu gniazda. Obiekt gniazda jest następnie używany do wywoływania innych funkcji w celu skonfigurowania serwera gniazda.
Teraz zadzwoń do bind(hostname, port)funkcję, aby określić port dla usługi na danym hoście.
Następnie wywołaj metodę accept zwróconego obiektu. Ta metoda czeka, aż klient połączy się z określonym portem, a następnie zwraca obiekt połączenia, który reprezentuje połączenie z tym klientem.
#!/usr/bin/python3 # This is server.py file
import socket
# create a socket object
serversocket = socket.socket(
socket.AF_INET, socket.SOCK_STREAM)
# get local machine name
host = socket.gethostname()
port = 9999
# bind to the port
serversocket.bind((host, port))
# queue up to 5 requests
serversocket.listen(5)
while True:
# establish a connection
clientsocket,addr = serversocket.accept()
print("Got a connection from %s" % str(addr))
msg = 'Thank you for connecting'+ "\r\n"
clientsocket.send(msg.encode('ascii'))
clientsocket.close()
Prosty klient
Napiszmy bardzo prosty program kliencki, który otwiera połączenie z podanym portem 12345 i danym hostem. Utworzenie klienta gniazda za pomocą funkcji modułu gniazda w języku Python jest bardzo proste .
Plik socket.connect(hosname, port )otwiera połączenie TCP z nazwą hosta na porcie . Gdy masz otwarte gniazdo, możesz z niego czytać jak z każdego obiektu IO. Po zakończeniu pamiętaj, aby go zamknąć, tak jak zamknąłbyś plik.
Przykład
Poniższy kod to bardzo prosty klient, który łączy się z podanym hostem i portem, odczytuje wszystkie dostępne dane z gniazda, a następnie wychodzi -
#!/usr/bin/python3 # This is client.py file
import socket
# create a socket object
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# get local machine name
host = socket.gethostname()
port = 9999
# connection to hostname on the port.
s.connect((host, port))
# Receive no more than 1024 bytes
msg = s.recv(1024)
s.close()
print (msg.decode('ascii'))
Teraz uruchom ten server.py w tle, a następnie uruchom powyższy client.py, aby zobaczyć wynik.
# Following would start a server in background.
$ python server.py & # Once server is started run client as follows: $ python client.py
Wynik
Dałoby to następujący wynik -
on server terminal
Got a connection from ('192.168.1.10', 3747)
On client terminal
Thank you for connecting
Moduły internetowe Python
Lista niektórych ważnych modułów programowania sieci / Internetu w Pythonie jest podana poniżej -
Protokół | Wspólna funkcja | Port No | Moduł Pythona |
---|---|---|---|
HTTP | strony internetowe | 80 | httplib, urllib, xmlrpclib |
NNTP | Wiadomości Usenet | 119 | nntplib |
FTP | Przesyłanie plików | 20 | ftplib, urllib |
SMTP | Wysyłać email | 25 | smtplib |
POP3 | Pobieranie wiadomości e-mail | 110 | poplib |
IMAP4 | Pobieranie wiadomości e-mail | 143 | imaplib |
Telnet | Linie poleceń | 23 | telnetlib |
Suseł | Przesyłanie dokumentów | 70 | gopherlib, urllib |
Sprawdź wszystkie wymienione powyżej biblioteki, aby współpracowały z protokołami FTP, SMTP, POP i IMAP.
Dalsze lektury
To był szybki początek programowania w gniazdach. To obszerny temat. Zaleca się przejście przez poniższy link, aby znaleźć więcej szczegółów -
Programowanie gniazd w systemie Unix .
Biblioteka i moduły gniazd Pythona .
Simple Mail Transfer Protocol (SMTP) to protokół obsługujący wysyłanie i kierowanie poczty między serwerami pocztowymi.
Python zapewnia smtplib moduł, który definiuje obiekt sesji klienta SMTP, który może być używany do wysyłania wiadomości e-mail do dowolnego komputera internetowego z demonem nasłuchiwania SMTP lub ESMTP.
Oto prosta składnia tworzenia jednego obiektu SMTP, którego można później użyć do wysłania wiadomości e-mail -
import smtplib
smtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] )
Oto szczegóły parametrów -
host- To jest host, na którym działa Twój serwer SMTP. Możesz określić adres IP hosta lub nazwę domeny, na przykład tutorialspoint.com. To jest opcjonalny argument.
port- Jeśli podajesz argument hosta , musisz określić port, na którym nasłuchuje serwer SMTP. Zwykle ten port byłby 25.
local_hostname- Jeśli twój serwer SMTP działa na twoim lokalnym komputerze, możesz określić tylko localhost jako opcję.
Obiekt SMTP ma metodę instancji o nazwie sendmail, który jest zwykle używany do wysyłania wiadomości. Potrzeba trzech parametrów -
Nadawca - Ciąg z adresem nadawcy.
Te odbiorniki - wykaz ciągów, po jednym dla każdego odbiorcy.
Wiadomość - wiadomość jako ciąg sformatowany jak określono w różnych dokumentach RFC.
Przykład
Oto prosty sposób na wysłanie jednego e-maila za pomocą skryptu Python. Spróbuj raz -
#!/usr/bin/python3
import smtplib
sender = '[email protected]'
receivers = ['[email protected]']
message = """From: From Person <[email protected]>
To: To Person <[email protected]>
Subject: SMTP e-mail test
This is a test e-mail message.
"""
try:
smtpObj = smtplib.SMTP('localhost')
smtpObj.sendmail(sender, receivers, message)
print "Successfully sent email"
except SMTPException:
print "Error: unable to send email"
Tutaj umieściłeś podstawowy e-mail w wiadomości, używając potrójnego cudzysłowu, zwracając uwagę na prawidłowe formatowanie nagłówków. E-mail wymaga rozszerzeniaFrom, Toi a Subject nagłówek, oddzielony od treści wiadomości e-mail pustą linią.
Aby wysłać pocztę, użyj smtpObj do połączenia się z serwerem SMTP na komputerze lokalnym. Następnie użyj metody sendmail wraz z wiadomością, adresem nadawcy i adresem docelowym jako parametrami (nawet jeśli adresy od i do znajdują się w samej wiadomości e-mail, nie zawsze są one używane do kierowania poczty).
Jeśli nie używasz serwera SMTP na komputerze lokalnym, możesz użyć klienta smtplib do komunikacji ze zdalnym serwerem SMTP. O ile nie korzystasz z usługi poczty internetowej (takiej jak Gmail lub Yahoo! Mail), Twój dostawca poczty e-mail musi podać Ci dane serwera poczty wychodzącej, które możesz podać w następujący sposób -
mail = smtplib.SMTP('smtp.gmail.com', 587)
Wysyłanie e-maila w formacie HTML za pomocą Pythona
Kiedy wysyłasz wiadomość tekstową za pomocą Pythona, cała zawartość jest traktowana jako zwykły tekst. Nawet jeśli umieścisz znaczniki HTML w wiadomości tekstowej, jest ona wyświetlana jako zwykły tekst, a znaczniki HTML nie będą sformatowane zgodnie ze składnią HTML. Jednak Python udostępnia opcję wysyłania wiadomości HTML jako rzeczywistej wiadomości HTML.
Wysyłając wiadomość e-mail, możesz określić wersję Mime, typ zawartości i zestaw znaków, aby wysłać wiadomość e-mail w formacie HTML.
Przykład
Poniżej znajduje się przykład wysyłania treści HTML jako wiadomości e-mail. Spróbuj raz -
#!/usr/bin/python3
import smtplib
message = """From: From Person <[email protected]>
To: To Person <[email protected]>
MIME-Version: 1.0
Content-type: text/html
Subject: SMTP HTML e-mail test
This is an e-mail message to be sent in HTML format
<b>This is HTML message.</b>
<h1>This is headline.</h1>
"""
try:
smtpObj = smtplib.SMTP('localhost')
smtpObj.sendmail(sender, receivers, message)
print "Successfully sent email"
except SMTPException:
print "Error: unable to send email"
Wysyłanie załączników jako e-mail
Aby wysłać wiadomość e-mail z mieszaną zawartością, należy ustawić rozszerzenie Content-type nagłówek do multipart/mixed. Następnie można określić tekst i sekcje załącznikaboundaries.
Granicę rozpoczynają dwa łączniki, po których następuje niepowtarzalny numer, który nie może pojawić się w części wiadomości e-mail. Ostateczna granica oznaczająca ostatnią sekcję wiadomości e-mail musi również kończyć się dwoma łącznikami.
Załączone pliki powinny być zakodowane z rozszerzeniem pack("m") funkcja ma kodowanie base 64 przed transmisją.
Przykład
Poniżej znajduje się przykład, który wysyła plik /tmp/test.txtjako załącznik. Spróbuj raz -
#!/usr/bin/python3
import smtplib
import base64
filename = "/tmp/test.txt"
# Read a file and encode it into base64 format
fo = open(filename, "rb")
filecontent = fo.read()
encodedcontent = base64.b64encode(filecontent) # base64
sender = '[email protected]'
reciever = '[email protected]'
marker = "AUNIQUEMARKER"
body ="""
This is a test email to send an attachement.
"""
# Define the main headers.
part1 = """From: From Person <[email protected]>
To: To Person <[email protected]>
Subject: Sending Attachement
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary=%s
--%s
""" % (marker, marker)
# Define the message action
part2 = """Content-Type: text/plain
Content-Transfer-Encoding:8bit
%s
--%s
""" % (body,marker)
# Define the attachment section
part3 = """Content-Type: multipart/mixed; name=\"%s\"
Content-Transfer-Encoding:base64
Content-Disposition: attachment; filename=%s
%s
--%s--
""" %(filename, filename, encodedcontent, marker)
message = part1 + part2 + part3
try:
smtpObj = smtplib.SMTP('localhost')
smtpObj.sendmail(sender, reciever, message)
print "Successfully sent email"
except Exception:
print ("Error: unable to send email")
Uruchomienie kilku wątków jest podobne do równoczesnego uruchamiania kilku różnych programów, ale ma następujące zalety -
Wiele wątków w procesie współdzieli tę samą przestrzeń danych z głównym wątkiem i dlatego może łatwiej udostępniać informacje lub komunikować się ze sobą, niż gdyby były oddzielnymi procesami.
Wątki są czasami nazywane procesami lekkimi i nie wymagają dużej ilości pamięci; są tańsze niż procesy.
Wątek ma początek, sekwencję wykonania i zakończenie. Posiada wskaźnik instrukcji, który śledzi, gdzie w kontekście jest aktualnie uruchomiona.
Może być uprzedzony (przerwany).
Można go tymczasowo zawiesić (znanego również jako spanie), podczas gdy inne wątki są uruchomione - nazywa się to ustępowaniem.
Istnieją dwa różne rodzaje wątków -
- wątek jądra
- wątek użytkownika
Wątki jądra są częścią systemu operacyjnego, podczas gdy wątki przestrzeni użytkownika nie są zaimplementowane w jądrze.
Istnieją dwa moduły, które obsługują użycie wątków w Pythonie3 -
- _thread
- threading
Moduł wątku był „przestarzały” przez długi czas. Zachęcamy użytkowników do używania zamiast tego modułu obsługi wątków. Stąd w Pythonie 3 moduł „wątek” nie jest już dostępny. Jednak jego nazwa została zmieniona na „_thread” w celu zapewnienia zgodności wstecznej w Pythonie3.
Rozpoczęcie nowego wątku
Aby odrodzić kolejny wątek, musisz wywołać następującą metodę dostępną w module wątków -
_thread.start_new_thread ( function, args[, kwargs] )
To wywołanie metody umożliwia szybki i wydajny sposób tworzenia nowych wątków w systemie Linux i Windows.
Wywołanie metody wraca natychmiast, a wątek potomny uruchamia się i wywołuje funkcję z przekazaną listą argumentów . Kiedy funkcja zwraca, wątek zostaje zakończony.
Tutaj argumenty to krotka argumentów; użyj pustej krotki, aby wywołać funkcję bez przekazywania żadnych argumentów. kwargs to opcjonalny słownik argumentów słów kluczowych.
Przykład
#!/usr/bin/python3
import _thread
import time
# Define a function for the thread
def print_time( threadName, delay):
count = 0
while count < 5:
time.sleep(delay)
count += 1
print ("%s: %s" % ( threadName, time.ctime(time.time()) ))
# Create two threads as follows
try:
_thread.start_new_thread( print_time, ("Thread-1", 2, ) )
_thread.start_new_thread( print_time, ("Thread-2", 4, ) )
except:
print ("Error: unable to start thread")
while 1:
pass
Wynik
Wykonanie powyższego kodu daje następujący wynik -
Thread-1: Fri Feb 19 09:41:39 2016
Thread-2: Fri Feb 19 09:41:41 2016
Thread-1: Fri Feb 19 09:41:41 2016
Thread-1: Fri Feb 19 09:41:43 2016
Thread-2: Fri Feb 19 09:41:45 2016
Thread-1: Fri Feb 19 09:41:45 2016
Thread-1: Fri Feb 19 09:41:47 2016
Thread-2: Fri Feb 19 09:41:49 2016
Thread-2: Fri Feb 19 09:41:53 2016
Program przechodzi w nieskończoną pętlę. Będziesz musiał nacisnąć ctrl-c, aby zatrzymać
Chociaż jest bardzo skuteczny w przypadku wątków niskiego poziomu, moduł wątków jest bardzo ograniczony w porównaniu z nowszym modułem wątków.
Moduł gwintowania
Nowszy moduł obsługi wątków zawarty w Pythonie 2.4 zapewnia znacznie wydajniejszą obsługę wątków na wysokim poziomie niż moduł wątków omówiony w poprzedniej sekcji.
Gwintowania Moduł udostępnia wszystkie te metody z gwintem modułu i zapewnia dodatkowe metody -
threading.activeCount() - Zwraca liczbę aktywnych obiektów wątku.
threading.currentThread() - Zwraca liczbę obiektów wątku w kontrolce wątku wywołującego.
threading.enumerate() - Zwraca listę wszystkich aktualnie aktywnych obiektów wątku.
Oprócz metod moduł wątkowości ma klasę Thread, która implementuje wątkowanie. Metody udostępniane przez klasę Thread są następujące -
run() - Metoda run () jest punktem wejścia dla wątku.
start() - Metoda start () uruchamia wątek przez wywołanie metody run.
join([time]) - Join () czeka na zakończenie wątków.
isAlive() - Metoda isAlive () sprawdza, czy wątek nadal jest wykonywany.
getName() - Metoda getName () zwraca nazwę wątku.
setName() - Metoda setName () ustawia nazwę wątku.
Tworzenie wątku za pomocą modułu Threading
Aby zaimplementować nowy wątek za pomocą modułu Threading, musisz wykonać następujące czynności -
Zdefiniuj nową podklasę klasy Thread .
Zastąp metodę __init __ (self [, args]) , aby dodać dodatkowe argumenty.
Następnie nadpisz metodę run (self [, args]), aby zaimplementować, co wątek powinien zrobić po uruchomieniu.
Po utworzeniu nowej podklasy Thread można utworzyć jej instancję, a następnie rozpocząć nowy wątek, wywołując metodę start () , która z kolei wywołuje metodę run () .
Przykład
#!/usr/bin/python3
import threading
import time
exitFlag = 0
class myThread (threading.Thread):
def __init__(self, threadID, name, counter):
threading.Thread.__init__(self)
self.threadID = threadID
self.name = name
self.counter = counter
def run(self):
print ("Starting " + self.name)
print_time(self.name, self.counter, 5)
print ("Exiting " + self.name)
def print_time(threadName, delay, counter):
while counter:
if exitFlag:
threadName.exit()
time.sleep(delay)
print ("%s: %s" % (threadName, time.ctime(time.time())))
counter -= 1
# Create new threads
thread1 = myThread(1, "Thread-1", 1)
thread2 = myThread(2, "Thread-2", 2)
# Start new Threads
thread1.start()
thread2.start()
thread1.join()
thread2.join()
print ("Exiting Main Thread")
Wynik
Kiedy uruchamiamy powyższy program, daje on następujący wynik -
Starting Thread-1
Starting Thread-2
Thread-1: Fri Feb 19 10:00:21 2016
Thread-2: Fri Feb 19 10:00:22 2016
Thread-1: Fri Feb 19 10:00:22 2016
Thread-1: Fri Feb 19 10:00:23 2016
Thread-2: Fri Feb 19 10:00:24 2016
Thread-1: Fri Feb 19 10:00:24 2016
Thread-1: Fri Feb 19 10:00:25 2016
Exiting Thread-1
Thread-2: Fri Feb 19 10:00:26 2016
Thread-2: Fri Feb 19 10:00:28 2016
Thread-2: Fri Feb 19 10:00:30 2016
Exiting Thread-2
Exiting Main Thread
Synchronizacja wątków
Moduł obsługi wątków dostarczany z Pythonem zawiera prosty w implementacji mechanizm blokujący, który umożliwia synchronizację wątków. Nowa blokada jest tworzona przez wywołanie metody Lock () , która zwraca nową blokadę.
Metoda pozyskiwania (blokowania) nowego obiektu blokady służy do wymuszania synchronicznego działania wątków. Opcjonalny parametr blokowania umożliwia kontrolowanie, czy wątek oczekuje na uzyskanie blokady.
Jeśli blokowanie jest ustawione na 0, wątek zwraca natychmiast wartość 0, jeśli nie można uzyskać blokady, oraz 1, jeśli blokada została uzyskana. Jeśli blokowanie jest ustawione na 1, wątek blokuje się i czeka na zwolnienie blokady.
Metoda release () nowego obiektu blokady służy do zwolnienia blokady, gdy nie jest już potrzebna.
Przykład
#!/usr/bin/python3
import threading
import time
class myThread (threading.Thread):
def __init__(self, threadID, name, counter):
threading.Thread.__init__(self)
self.threadID = threadID
self.name = name
self.counter = counter
def run(self):
print ("Starting " + self.name)
# Get lock to synchronize threads
threadLock.acquire()
print_time(self.name, self.counter, 3)
# Free lock to release next thread
threadLock.release()
def print_time(threadName, delay, counter):
while counter:
time.sleep(delay)
print ("%s: %s" % (threadName, time.ctime(time.time())))
counter -= 1
threadLock = threading.Lock()
threads = []
# Create new threads
thread1 = myThread(1, "Thread-1", 1)
thread2 = myThread(2, "Thread-2", 2)
# Start new Threads
thread1.start()
thread2.start()
# Add threads to thread list
threads.append(thread1)
threads.append(thread2)
# Wait for all threads to complete
for t in threads:
t.join()
print ("Exiting Main Thread")
Wynik
Wykonanie powyższego kodu daje następujący wynik -
Starting Thread-1
Starting Thread-2
Thread-1: Fri Feb 19 10:04:14 2016
Thread-1: Fri Feb 19 10:04:15 2016
Thread-1: Fri Feb 19 10:04:16 2016
Thread-2: Fri Feb 19 10:04:18 2016
Thread-2: Fri Feb 19 10:04:20 2016
Thread-2: Fri Feb 19 10:04:22 2016
Exiting Main Thread
Wielowątkowa kolejka priorytetowa
Queue Moduł pozwala na tworzenie nowego obiektu kolejki, która może pomieścić szereg specyficzny elementów. Istnieją następujące metody kontrolowania kolejki -
get() - Funkcja get () usuwa i zwraca element z kolejki.
put() - Put dodaje element do kolejki.
qsize() - Funkcja qsize () zwraca liczbę elementów, które aktualnie znajdują się w kolejce.
empty()- Empty () zwraca True, jeśli kolejka jest pusta; w przeciwnym razie False.
full()- full () zwraca True, jeśli kolejka jest pełna; w przeciwnym razie False.
Przykład
#!/usr/bin/python3
import queue
import threading
import time
exitFlag = 0
class myThread (threading.Thread):
def __init__(self, threadID, name, q):
threading.Thread.__init__(self)
self.threadID = threadID
self.name = name
self.q = q
def run(self):
print ("Starting " + self.name)
process_data(self.name, self.q)
print ("Exiting " + self.name)
def process_data(threadName, q):
while not exitFlag:
queueLock.acquire()
if not workQueue.empty():
data = q.get()
queueLock.release()
print ("%s processing %s" % (threadName, data))
else:
queueLock.release()
time.sleep(1)
threadList = ["Thread-1", "Thread-2", "Thread-3"]
nameList = ["One", "Two", "Three", "Four", "Five"]
queueLock = threading.Lock()
workQueue = queue.Queue(10)
threads = []
threadID = 1
# Create new threads
for tName in threadList:
thread = myThread(threadID, tName, workQueue)
thread.start()
threads.append(thread)
threadID += 1
# Fill the queue
queueLock.acquire()
for word in nameList:
workQueue.put(word)
queueLock.release()
# Wait for queue to empty
while not workQueue.empty():
pass
# Notify threads it's time to exit
exitFlag = 1
# Wait for all threads to complete
for t in threads:
t.join()
print ("Exiting Main Thread")
Wynik
Wykonanie powyższego kodu daje następujący wynik -
Starting Thread-1
Starting Thread-2
Starting Thread-3
Thread-1 processing One
Thread-2 processing Two
Thread-3 processing Three
Thread-1 processing Four
Thread-2 processing Five
Exiting Thread-3
Exiting Thread-1
Exiting Thread-2
Exiting Main Thread
XML to przenośny język open source, który umożliwia programistom tworzenie aplikacji, które mogą być odczytywane przez inne aplikacje, niezależnie od systemu operacyjnego i / lub języka programowania.
Co to jest XML?
Extensible Markup Language (XML) jest językiem znaczników, podobnie jak HTML czy SGML. Jest to zalecane przez konsorcjum World Wide Web i dostępne jako otwarty standard.
XML jest niezwykle przydatny do śledzenia małych i średnich ilości danych bez konieczności korzystania z sieci szkieletowej opartej na języku SQL.
Architektury i API parsera XML
Biblioteka standardowa Pythona zapewnia minimalny, ale przydatny zestaw interfejsów do pracy z XML.
Dwa najbardziej podstawowe i szeroko stosowane interfejsy API do danych XML to interfejsy SAX i DOM.
Simple API for XML (SAX)- Tutaj rejestrujesz wywołania zwrotne dla interesujących zdarzeń, a następnie pozwalasz parserowi przejść przez dokument. Jest to przydatne, gdy dokumenty są duże lub masz ograniczenia pamięci, analizuje plik podczas odczytywania go z dysku, a cały plik nigdy nie jest zapisywany w pamięci.
Document Object Model (DOM) API - Jest to zalecenie konsorcjum World Wide Web Consortium, w którym cały plik jest wczytywany do pamięci i przechowywany w formie hierarchicznej (opartej na drzewie), aby przedstawić wszystkie cechy dokumentu XML.
Oczywiście SAX nie może przetwarzać informacji tak szybko, jak DOM, podczas pracy z dużymi plikami. Z drugiej strony, używanie wyłącznie DOM może naprawdę zniszczyć twoje zasoby, zwłaszcza jeśli jest używane na wielu małych plikach.
SAX jest tylko do odczytu, podczas gdy DOM umożliwia zmiany w pliku XML. Ponieważ te dwa różne interfejsy API dosłownie się uzupełniają, nie ma powodu, dla którego nie można używać ich obu w dużych projektach.
We wszystkich naszych przykładach kodu XML użyjmy prostego pliku XML movies.xml jako danych wejściowych -
<collection shelf = "New Arrivals">
<movie title = "Enemy Behind">
<type>War, Thriller</type>
<format>DVD</format>
<year>2003</year>
<rating>PG</rating>
<stars>10</stars>
<description>Talk about a US-Japan war</description>
</movie>
<movie title = "Transformers">
<type>Anime, Science Fiction</type>
<format>DVD</format>
<year>1989</year>
<rating>R</rating>
<stars>8</stars>
<description>A schientific fiction</description>
</movie>
<movie title = "Trigun">
<type>Anime, Action</type>
<format>DVD</format>
<episodes>4</episodes>
<rating>PG</rating>
<stars>10</stars>
<description>Vash the Stampede!</description>
</movie>
<movie title = "Ishtar">
<type>Comedy</type>
<format>VHS</format>
<rating>PG</rating>
<stars>2</stars>
<description>Viewable boredom</description>
</movie>
</collection>
Parsowanie XML za pomocą API SAX
SAX to standardowy interfejs do analizowania XML sterowanego zdarzeniami. Parsowanie XML za pomocą SAX zazwyczaj wymaga utworzenia własnego ContentHandler'a przez podklasę xml.sax.ContentHandler.
Twój ContentHandler obsługuje określone tagi i atrybuty Twojego smaku (ów) XML. Obiekt ContentHandler udostępnia metody do obsługi różnych zdarzeń analizy. Jego parser będący właścicielem wywołuje metody ContentHandler podczas analizowania pliku XML.
Metody startDocument i endDocument są wywoływane na początku i na końcu pliku XML. Znaki metody (tekst) przekazują dane znakowe pliku XML poprzez tekst parametru.
ContentHandler jest wywoływana na początku i na końcu każdego elementu. Jeśli parser nie jest w trybie przestrzeni nazw, wywoływane są metody startElement (tag, atrybuty) i endElement (tag) ; w przeciwnym razie wywoływane są odpowiednie metody startElementNS i endElementNS . W tym przypadku tag to znacznik elementu, a atrybuty to obiekt Attributes.
Oto inne ważne metody, które należy zrozumieć przed kontynuowaniem -
Metoda make_parser
Poniższa metoda tworzy nowy obiekt parsera i zwraca go. Utworzony obiekt parsera będzie pierwszego typu analizatora składni znalezionego przez system.
xml.sax.make_parser( [parser_list] )
Oto szczegóły parametrów -
parser_list - Opcjonalny argument składający się z listy parserów do użycia, z których wszystkie muszą implementować metodę make_parser.
Metoda analizy
Poniższa metoda tworzy parser SAX i używa go do analizowania dokumentu.
xml.sax.parse( xmlfile, contenthandler[, errorhandler])
Oto szczegóły parametrów -
xmlfile - To jest nazwa pliku XML do odczytu.
contenthandler - To musi być obiekt ContentHandler.
errorhandler - Jeśli określono, errorhandler musi być obiektem SAX ErrorHandler.
Metoda parseString
Jest jeszcze jedna metoda tworzenia parsera SAX i analizowania podanego XML string.
xml.sax.parseString(xmlstring, contenthandler[, errorhandler])
Oto szczegóły parametrów -
xmlstring - To jest nazwa ciągu XML do odczytu.
contenthandler - To musi być obiekt ContentHandler.
errorhandler - Jeśli określono, errorhandler musi być obiektem SAX ErrorHandler.
Przykład
#!/usr/bin/python3
import xml.sax
class MovieHandler( xml.sax.ContentHandler ):
def __init__(self):
self.CurrentData = ""
self.type = ""
self.format = ""
self.year = ""
self.rating = ""
self.stars = ""
self.description = ""
# Call when an element starts
def startElement(self, tag, attributes):
self.CurrentData = tag
if tag == "movie":
print ("*****Movie*****")
title = attributes["title"]
print ("Title:", title)
# Call when an elements ends
def endElement(self, tag):
if self.CurrentData == "type":
print ("Type:", self.type)
elif self.CurrentData == "format":
print ("Format:", self.format)
elif self.CurrentData == "year":
print ("Year:", self.year)
elif self.CurrentData == "rating":
print ("Rating:", self.rating)
elif self.CurrentData == "stars":
print ("Stars:", self.stars)
elif self.CurrentData == "description":
print ("Description:", self.description)
self.CurrentData = ""
# Call when a character is read
def characters(self, content):
if self.CurrentData == "type":
self.type = content
elif self.CurrentData == "format":
self.format = content
elif self.CurrentData == "year":
self.year = content
elif self.CurrentData == "rating":
self.rating = content
elif self.CurrentData == "stars":
self.stars = content
elif self.CurrentData == "description":
self.description = content
if ( __name__ == "__main__"):
# create an XMLReader
parser = xml.sax.make_parser()
# turn off namepsaces
parser.setFeature(xml.sax.handler.feature_namespaces, 0)
# override the default ContextHandler
Handler = MovieHandler()
parser.setContentHandler( Handler )
parser.parse("movies.xml")
Wynik
Dałoby to następujący wynik -
*****Movie*****
Title: Enemy Behind
Type: War, Thriller
Format: DVD
Year: 2003
Rating: PG
Stars: 10
Description: Talk about a US-Japan war
*****Movie*****
Title: Transformers
Type: Anime, Science Fiction
Format: DVD
Year: 1989
Rating: R
Stars: 8
Description: A scientific fiction
*****Movie*****
Title: Trigun
Type: Anime, Action
Format: DVD
Rating: PG
Stars: 10
Description: Vash the Stampede!
*****Movie*****
Title: Ishtar
Type: Comedy
Format: VHS
Rating: PG
Stars: 2
Description: Viewable boredom
Aby uzyskać szczegółowe informacje na temat dokumentacji API SAX, zapoznaj się ze standardowymi interfejsami API Python SAX .
Przetwarzanie XML za pomocą interfejsów API DOM
Document Object Model („DOM”) to wielojęzyczny interfejs API firmy World Wide Web Consortium (W3C) służący do uzyskiwania dostępu do dokumentów XML i modyfikowania ich.
DOM jest niezwykle przydatny w aplikacjach o dostępie swobodnym. SAX pozwala na podgląd tylko jednego bitu dokumentu na raz. Jeśli patrzysz na jeden element SAX, nie masz dostępu do innego.
Oto najprostszy sposób na szybkie załadowanie dokumentu XML i utworzenie obiektu minidom przy użyciu modułu xml.dom. Obiekt minidom zapewnia prostą metodę parsera, która szybko tworzy drzewo DOM z pliku XML.
Przykładowa fraza wywołuje funkcję parse (file [, parser]) obiektu minidom w celu przeanalizowania pliku XML, wyznaczonego przez plik, do obiektu drzewa DOM.
Przykład
#!/usr/bin/python3
from xml.dom.minidom import parse
import xml.dom.minidom
# Open XML document using minidom parser
DOMTree = xml.dom.minidom.parse("movies.xml")
collection = DOMTree.documentElement
if collection.hasAttribute("shelf"):
print ("Root element : %s" % collection.getAttribute("shelf"))
# Get all the movies in the collection
movies = collection.getElementsByTagName("movie")
# Print detail of each movie.
for movie in movies:
print ("*****Movie*****")
if movie.hasAttribute("title"):
print ("Title: %s" % movie.getAttribute("title"))
type = movie.getElementsByTagName('type')[0]
print ("Type: %s" % type.childNodes[0].data)
format = movie.getElementsByTagName('format')[0]
print ("Format: %s" % format.childNodes[0].data)
rating = movie.getElementsByTagName('rating')[0]
print ("Rating: %s" % rating.childNodes[0].data)
description = movie.getElementsByTagName('description')[0]
print ("Description: %s" % description.childNodes[0].data)
Wynik
Dałoby to następujący wynik -
Root element : New Arrivals
*****Movie*****
Title: Enemy Behind
Type: War, Thriller
Format: DVD
Rating: PG
Description: Talk about a US-Japan war
*****Movie*****
Title: Transformers
Type: Anime, Science Fiction
Format: DVD
Rating: R
Description: A scientific fiction
*****Movie*****
Title: Trigun
Type: Anime, Action
Format: DVD
Rating: PG
Description: Vash the Stampede!
*****Movie*****
Title: Ishtar
Type: Comedy
Format: VHS
Rating: PG
Description: Viewable boredom
Aby uzyskać szczegółowe informacje na temat dokumentacji DOM API, zapoznaj się ze standardowymi interfejsami API języka Python DOM .
Python zapewnia różne opcje tworzenia graficznych interfejsów użytkownika (GUI). Najważniejsze funkcje są wymienione poniżej.
Tkinter- Tkinter to interfejs Pythona do zestawu narzędzi Tk GUI dostarczanego z Pythonem. Szukalibyśmy tej opcji w tym rozdziale.
wxPython- To jest interfejs Pythona typu open source dla zestawu narzędzi wxWidgets GUI. Możesz znaleźć pełny samouczek dotyczący WxPython tutaj .
PyQt−Jest to również interfejs Pythona dla popularnej wieloplatformowej biblioteki Qt GUI. TutorialsPoint ma bardzo dobry tutorial PyQt tutaj .
JPython - JPython to port Pythona dla Javy, który zapewnia skryptom Pythona bezproblemowy dostęp do bibliotek klas Java na komputerze lokalnym http://www.jython.org.
Dostępnych jest wiele innych interfejsów, które można znaleźć w sieci.
Programowanie Tkinter
Tkinter to standardowa biblioteka GUI dla Pythona. Python w połączeniu z Tkinter zapewnia szybki i łatwy sposób tworzenia aplikacji GUI. Tkinter zapewnia potężny, zorientowany obiektowo interfejs do zestawu narzędzi Tk GUI.
Tworzenie aplikacji GUI za pomocą Tkinter jest łatwym zadaniem. Wszystko, co musisz zrobić, to wykonać następujące kroki -
Zaimportuj moduł Tkinter .
Utwórz główne okno aplikacji GUI.
Dodaj jeden lub więcej z wyżej wymienionych widżetów do aplikacji GUI.
Wprowadź główną pętlę zdarzeń, aby podjąć działanie przeciwko każdemu zdarzeniu wyzwalanemu przez użytkownika.
Przykład
#!/usr/bin/python3
import tkinter # note that module name has changed from Tkinter in Python 2 to tkinter in Python 3
top = tkinter.Tk()
# Code to add widgets will go here...
top.mainloop()
Spowoduje to utworzenie następującego okna -
Tkinter Widgets
Tkinter zapewnia różne elementy sterujące, takie jak przyciski, etykiety i pola tekstowe używane w aplikacji GUI. Te elementy sterujące są powszechnie nazywane widżetami.
Obecnie w Tkinter jest dostępnych 15 typów widżetów. Przedstawiamy te widgety, a także krótki opis w poniższej tabeli -
Sr.No. | Operator i opis |
---|---|
1 | Przycisk Widżet Przycisk służy do wyświetlania przycisków w aplikacji. |
2 | Brezentowy Widżet Canvas służy do rysowania w aplikacji kształtów, takich jak linie, owale, wielokąty i prostokąty. |
3 | Checkbutton Widget Przycisk wyboru służy do wyświetlania wielu opcji jako pól wyboru. Użytkownik może jednocześnie wybrać wiele opcji. |
4 | Wejście Widget Wejście służy do wyświetlania jednowierszowego pola tekstowego służącego do akceptowania wartości od użytkownika. |
5 | Rama Widżet Ramka służy jako widget kontenera do organizowania innych widgetów. |
6 | Etykieta Widżet Etykieta służy do zapewniania jednowierszowego podpisu dla innych widżetów. Może również zawierać obrazy. |
7 | Skrzynka na listy Widżet Listbox służy do udostępniania użytkownikowi listy opcji. |
8 | Przycisk MENU Widżet Menubutton służy do wyświetlania menu w aplikacji. |
9 | Menu Widget Menu służy do dostarczania użytkownikowi różnych poleceń. Te polecenia są zawarte w Menubutton. |
10 | Wiadomość Widget Wiadomość służy do wyświetlania wielowierszowych pól tekstowych służących do akceptowania wartości od użytkownika. |
11 | Przycisk radiowy Widget Radiobutton służy do wyświetlania wielu opcji jako przycisków radiowych. Użytkownik może wybrać tylko jedną opcję naraz. |
12 | Skala Widżet Skala służy do udostępniania widgetu suwaka. |
13 | Pasek przewijania Widżet Pasek przewijania służy do dodawania możliwości przewijania do różnych widżetów, takich jak pola list. |
14 | Tekst Widżet Tekst służy do wyświetlania tekstu w wielu wierszach. |
15 | Najwyższy poziom Widżet najwyższego poziomu służy do udostępniania osobnego kontenera okna. |
16 | Spinbox Widżet Spinbox jest wariantem standardowego widżetu Tkinter Entry, za pomocą którego można wybierać spośród ustalonej liczby wartości. |
17 | PanedWindow PanedWindow to widget kontenera, który może zawierać dowolną liczbę paneli, ułożonych poziomo lub pionowo. |
18 | LabelFrame Labelframe to prosty widget kontenera. Jego głównym celem jest działanie jako przekładka lub kontener dla złożonych układów okien. |
19 | tkMessageBox Ten moduł jest używany do wyświetlania okienek wiadomości w twoich aplikacjach. |
Atrybuty standardowe
Przyjrzyjmy się, jak określono niektóre z ich wspólnych atrybutów, takich jak rozmiary, kolory i czcionki.
Dimensions
Colors
Fonts
Anchors
Style reliefowe
Bitmaps
Cursors
Zarządzanie geometrią
Wszystkie widżety Tkinter mają dostęp do określonych metod zarządzania geometrią, których celem jest organizowanie widżetów w obszarze nadrzędnym widżetów. Tkinter ujawnia następujące klasy menedżerów geometrii: opakowanie, siatka i miejsce.
Metoda pack () - ten menedżer geometrii organizuje widżety w bloki przed umieszczeniem ich w widgecie nadrzędnym.
Metoda grid () - ten menedżer geometrii organizuje widżety w strukturze tabeli w widgecie nadrzędnym.
Metoda place () - ten menedżer geometrii organizuje widżety, umieszczając je w określonej pozycji w widgecie nadrzędnym.
Każdy kod napisany przy użyciu dowolnego języka skompilowanego, takiego jak C, C ++ lub Java, można zintegrować lub zaimportować do innego skryptu Pythona. Ten kod jest traktowany jako „rozszerzenie”.
Moduł rozszerzający Python to nic innego jak zwykła biblioteka C. Na komputerach uniksowych biblioteki te zwykle kończą się na.so(dla wspólnego obiektu). Na komputerach z systemem Windows zazwyczaj widzisz.dll (dla biblioteki połączonej dynamicznie).
Wymagania wstępne dotyczące pisania rozszerzeń
Aby rozpocząć pisanie rozszerzenia, będziesz potrzebować plików nagłówkowych Pythona.
Na komputerach z systemem Unix zwykle wymaga to zainstalowania pakietu specyficznego dla programisty, takiego jak.
Użytkownicy systemu Windows otrzymują te nagłówki jako część pakietu, gdy używają binarnego instalatora języka Python.
Ponadto zakłada się, że masz dobrą znajomość języka C lub C ++, aby napisać dowolne rozszerzenie języka Python przy użyciu programowania w języku C.
Najpierw spójrz na rozszerzenie Pythona
Aby po raz pierwszy przyjrzeć się modułowi rozszerzenia Python, musisz zgrupować swój kod na cztery części -
Plik nagłówkowy Python.h .
Funkcje C, które chcesz ujawnić jako interfejs z Twojego modułu.
Tabela odwzorowująca nazwy twoich funkcji, ponieważ programiści Pythona widzą je jako funkcje C wewnątrz modułu rozszerzenia.
Funkcja inicjalizacji.
Plik nagłówkowy Python.h
Musisz dołączyć plik nagłówkowy Python.h do pliku źródłowego C, który daje dostęp do wewnętrznego interfejsu API języka Python używanego do podpięcia modułu do interpretera.
Upewnij się, że dołączasz Python.h przed innymi nagłówkami, których możesz potrzebować. Musisz przestrzegać dołączeń z funkcjami, które chcesz wywołać z Pythona.
Funkcje C.
Podpisy implementacji funkcji w języku C zawsze przyjmują jedną z trzech następujących form -
static PyObject *MyFunction( PyObject *self, PyObject *args );
static PyObject *MyFunctionWithKeywords(PyObject *self,
PyObject *args,
PyObject *kw);
static PyObject *MyFunctionWithNoArgs( PyObject *self );
Każda z poprzednich deklaracji zwraca obiekt w języku Python. Nie ma czegoś takiego jak funkcja void w Pythonie, jak w C. Jeśli nie chcesz, aby twoje funkcje zwracały wartość, zwróć odpowiednik funkcji w CNonewartość. Nagłówki Pythona definiują makro Py_RETURN_NONE, które robi to za nas.
Nazwy twoich funkcji C mogą być dowolne, ponieważ nigdy nie są widoczne poza modułem rozszerzającym. Są zdefiniowane jako funkcja statyczna .
Twoje funkcje C zwykle są nazywane przez połączenie razem modułu Pythona i nazw funkcji, jak pokazano tutaj -
static PyObject *module_func(PyObject *self, PyObject *args) {
/* Do your stuff here. */
Py_RETURN_NONE;
}
To jest funkcja Pythona o nazwie func wewnątrz modułu modułu . Będziesz umieszczać wskaźniki do funkcji C w tabeli metod modułu, który zwykle pojawia się jako następny w kodzie źródłowym.
Tabela mapowania metod
Ta tabela metod jest prostą tablicą struktur PyMethodDef. Ta struktura wygląda mniej więcej tak -
struct PyMethodDef {
char *ml_name;
PyCFunction ml_meth;
int ml_flags;
char *ml_doc;
};
Oto opis członków tej struktury -
ml_name - To jest nazwa funkcji, jaką prezentuje interpreter języka Python, gdy jest używana w programach w języku Python.
ml_meth - To jest adres funkcji, która ma jeden z podpisów opisanych w poprzedniej sekcji.
ml_flags - To mówi interpreterowi, którego z trzech podpisów używa ml_meth.
Ta flaga zwykle ma wartość METH_VARARGS.
Ta flaga może być OR 'bitowa OR' za pomocą METH_KEYWORDS, jeśli chcesz dopuścić argumenty słów kluczowych do swojej funkcji.
Może to również mieć wartość METH_NOARGS, która wskazuje, że nie chcesz akceptować żadnych argumentów.
ml_doc - To jest dokumentacja funkcji, która może mieć wartość NULL, jeśli nie masz ochoty go pisać.
Ta tabela musi być zakończona wartownikiem składającym się z wartości NULL i 0 dla odpowiednich członków.
Przykład
Dla wyżej zdefiniowanej funkcji mamy następującą tabelę odwzorowania metod -
static PyMethodDef module_methods[] = {
{ "func", (PyCFunction)module_func, METH_NOARGS, NULL },
{ NULL, NULL, 0, NULL }
};
Funkcja inicjalizacji
Ostatnią częścią modułu rozszerzającego jest funkcja inicjalizacji. Ta funkcja jest wywoływana przez interpreter języka Python podczas ładowania modułu. Wymagane jest nazwanie funkcjiinitModule, gdzie Module to nazwa modułu.
Funkcja inicjalizacji musi zostać wyeksportowana z biblioteki, którą będziesz budować. Nagłówki Pythona definiują PyMODINIT_FUNC tak, aby zawierały odpowiednie inkantacje, które mają się wydarzyć dla określonego środowiska, w którym kompilujemy. Wystarczy, że użyjesz go podczas definiowania funkcji.
Twoja funkcja inicjalizacji C ma ogólnie następującą ogólną strukturę -
PyMODINIT_FUNC initModule() {
Py_InitModule3(func, module_methods, "docstring...");
}
Oto opis Py_InitModule3 funkcja -
func - To jest funkcja do wyeksportowania.
module_methods - To jest nazwa tabeli odwzorowań zdefiniowana powyżej.
docstring - To jest komentarz, który chcesz umieścić w swoim rozszerzeniu.
Podsumowując to wszystko, wygląda to następująco -
#include <Python.h>
static PyObject *module_func(PyObject *self, PyObject *args) {
/* Do your stuff here. */
Py_RETURN_NONE;
}
static PyMethodDef module_methods[] = {
{ "func", (PyCFunction)module_func, METH_NOARGS, NULL },
{ NULL, NULL, 0, NULL }
};
PyMODINIT_FUNC initModule() {
Py_InitModule3(func, module_methods, "docstring...");
}
Przykład
Prosty przykład wykorzystujący wszystkie powyższe koncepcje -
#include <Python.h>
static PyObject* helloworld(PyObject* self)
{
return Py_BuildValue("s", "Hello, Python extensions!!");
}
static char helloworld_docs[] =
"helloworld( ): Any message you want to put here!!\n";
static PyMethodDef helloworld_funcs[] = {
{"helloworld", (PyCFunction)helloworld,
METH_NOARGS, helloworld_docs},
{NULL}
};
void inithelloworld(void)
{
Py_InitModule3("helloworld", helloworld_funcs,
"Extension module example!");
}
Tutaj funkcja Py_BuildValue służy do budowania wartości Pythona. Zapisz powyższy kod w pliku hello.c. Zobaczylibyśmy, jak skompilować i zainstalować ten moduł, aby był wywoływany ze skryptu Pythona.
Tworzenie i instalowanie rozszerzeń
Distutils opakowanie sprawia, że bardzo łatwo rozprowadzać modułów Python, zarówno czystych modułów Pythona i rozszerzeń, w sposób standardowy. Moduły są rozprowadzane w formie źródłowej, budowane i instalowane za pomocą skryptu instalacyjnego, zwykle nazywanego setup.py as.
Dla powyższego modułu musisz przygotować następujący skrypt setup.py -
from distutils.core import setup, Extension
setup(name = 'helloworld', version = '1.0', \
ext_modules = [Extension('helloworld', ['hello.c'])])
Teraz użyj następującego polecenia, które wykonałoby wszystkie potrzebne kroki kompilacji i łączenia, z odpowiednimi poleceniami i flagami kompilatora i konsolidatora, i kopiuje wynikową bibliotekę dynamiczną do odpowiedniego katalogu -
$ python setup.py install
W systemach uniksowych najprawdopodobniej będziesz musiał uruchomić to polecenie jako root, aby mieć uprawnienia do zapisu w katalogu pakietów witryn. Zwykle nie stanowi to problemu w systemie Windows.
Importowanie rozszerzeń
Po zainstalowaniu rozszerzeń będziesz mógł zaimportować i wywołać to rozszerzenie w swoim skrypcie Python w następujący sposób -
Przykład
#!/usr/bin/python3
import helloworld
print helloworld.helloworld()
Wynik
Dałoby to następujący wynik -
Hello, Python extensions!!
Przekazywanie parametrów funkcji
Ponieważ najprawdopodobniej będziesz chciał zdefiniować funkcje, które akceptują argumenty, możesz użyć jednego z innych podpisów dla swoich funkcji C. Na przykład następująca funkcja, która przyjmuje pewną liczbę parametrów, została zdefiniowana w ten sposób -
static PyObject *module_func(PyObject *self, PyObject *args) {
/* Parse args and do something interesting here. */
Py_RETURN_NONE;
}
Tablica metod zawierająca wpis dla nowej funkcji wyglądałaby następująco -
static PyMethodDef module_methods[] = {
{ "func", (PyCFunction)module_func, METH_NOARGS, NULL },
{ "func", module_func, METH_VARARGS, NULL },
{ NULL, NULL, 0, NULL }
};
Możesz użyć funkcji API PyArg_ParseTuple, aby wyodrębnić argumenty z jednego wskaźnika PyObject przekazanego do funkcji C.
Pierwszym argumentem PyArg_ParseTuple jest argument args. To jest obiekt, który będziesz analizować . Drugi argument to łańcuch formatu opisujący argumenty w oczekiwanej postaci. Każdy argument jest reprezentowany przez jeden lub więcej znaków w ciągu formatu w następujący sposób.
static PyObject *module_func(PyObject *self, PyObject *args) {
int i;
double d;
char *s;
if (!PyArg_ParseTuple(args, "ids", &i, &d, &s)) {
return NULL;
}
/* Do something interesting here. */
Py_RETURN_NONE;
}
Wynik
Skompilowanie nowej wersji modułu i zaimportowanie go umożliwia wywołanie nowej funkcji z dowolną liczbą argumentów dowolnego typu -
module.func(1, s = "three", d = 2.0)
module.func(i = 1, d = 2.0, s = "three")
module.func(s = "three", d = 2.0, i = 1)
Prawdopodobnie możesz wymyślić jeszcze więcej odmian.
Funkcja PyArg_ParseTuple
Oto standardowy podpis pliku PyArg_ParseTuple funkcja -
int PyArg_ParseTuple(PyObject* tuple,char* format,...)
Ta funkcja zwraca 0 dla błędów i wartość różną od 0 dla sukcesu. Tuple to PyObject *, który był drugim argumentem funkcji C. Tutaj format jest łańcuchem w C, który opisuje obowiązkowe i opcjonalne argumenty.
Oto lista kodów formatu dla PyArg_ParseTuple funkcja -
Kod | Typ C. | Znaczenie |
---|---|---|
do | zwęglać | Ciąg znaków Pythona o długości 1 staje się znakiem C. |
re | podwójnie | Python float staje się double C. |
fa | pływak | Python float zmienia się w float w C. |
ja | int | Int Python staje się int C. |
l | długo | Int Python staje się długi w C. |
L | długo, długo | Int Python staje się długi w C. |
O | PyObject * | Pobiera pożyczone odwołanie do argumentu języka Python o wartości innej niż NULL. |
s | zwęglać* | Ciąg Pythona bez osadzonych wartości null w znaku C *. |
s # | char * + int | Dowolny ciąg znaków Pythona na adres i długość w języku C. |
t # | char * + int | Bufor jednosegmentowy tylko do odczytu na adres C i długość. |
u | Py_UNICODE * | Python Unicode bez osadzonych wartości null do C. |
ty # | Py_UNICODE * + int | Dowolny adres i długość w standardzie Python Unicode C. |
w # | char * + int | Odczyt / zapis buforu pojedynczego segmentu na adres i długość w C. |
z | zwęglać* | Podobnie jak s, akceptuje także None (ustawia C char * na NULL). |
z # | char * + int | Podobnie jak s #, akceptuje także None (ustawia C char * na NULL). |
(...) | zgodnie z ... | Sekwencja Pythona jest traktowana jako jeden argument na element. |
| | Następujące argumenty są opcjonalne. | |
: | Formatuj koniec, po którym następuje nazwa funkcji dla komunikatów o błędach. | |
; | Koniec formatu, po którym następuje cały tekst komunikatu o błędzie. |
Zwracane wartości
Py_BuildValue przyjmuje ciąg formatu, podobnie jak PyArg_ParseTuple . Zamiast przekazywać adresy budowanych wartości, przekazujesz wartości rzeczywiste. Oto przykład pokazujący, jak zaimplementować funkcję dodawania -
static PyObject *foo_add(PyObject *self, PyObject *args) {
int a;
int b;
if (!PyArg_ParseTuple(args, "ii", &a, &b)) {
return NULL;
}
return Py_BuildValue("i", a + b);
}
Tak by to wyglądało, gdyby zostało zaimplementowane w Pythonie -
def add(a, b):
return (a + b)
Możesz zwrócić dwie wartości z funkcji w następujący sposób. Zostałoby to przechwycone za pomocą listy w Pythonie.
static PyObject *foo_add_subtract(PyObject *self, PyObject *args) {
int a;
int b;
if (!PyArg_ParseTuple(args, "ii", &a, &b)) {
return NULL;
}
return Py_BuildValue("ii", a + b, a - b);
}
Tak by to wyglądało, gdyby zostało zaimplementowane w Pythonie -
def add_subtract(a, b):
return (a + b, a - b)
Py_BuildValue Function
Oto standardowy podpis dla Py_BuildValue funkcja -
PyObject* Py_BuildValue(char* format,...)
Tutaj format to napis w C, który opisuje obiekt Pythona do zbudowania. Następujące argumenty Py_BuildValue są wartościami w języku C, na podstawie których budowany jest wynik. Wynik PyObject * jest nowym odniesieniem.
W poniższej tabeli wymieniono często używane ciągi kodu, z których zero lub więcej jest łączonych w format ciągu.
Kod | Typ C. | Znaczenie |
---|---|---|
do | zwęglać | AC char staje się ciągiem znaków Pythona o długości 1. |
re | podwójnie | AC double staje się pływakiem Pythona. |
fa | pływak | AC float zmienia się w Python float. |
ja | int | AC int staje się intem Pythona. |
l | długo | AC long staje się intem Pythona. |
N | PyObject * | Przekazuje obiekt Pythona i kradnie odniesienie. |
O | PyObject * | Przekazuje obiekt w języku Python i ZWALNIA go jak zwykle. |
O & | konwertuj + anuluj * | Arbitralna konwersja |
s | zwęglać* | Znak * zakończony znakiem C 0 na łańcuch w języku Python lub NULL na brak. |
s # | char * + int | C char * i długość do łańcucha Pythona lub NULL do None. |
u | Py_UNICODE * | C-wide, zakończony znakiem null ciąg do Python Unicode lub NULL do None. |
ty # | Py_UNICODE * + int | C-szeroki ciąg i długość do Python Unicode lub NULL do None. |
w # | char * + int | Odczyt / zapis buforu pojedynczego segmentu na adres i długość w C. |
z | zwęglać* | Podobnie jak s, akceptuje także None (ustawia C char * na NULL). |
z # | char * + int | Podobnie jak s #, akceptuje także None (ustawia C char * na NULL). |
(...) | zgodnie z ... | Tworzy krotkę Pythona z wartości w C. |
[…] | zgodnie z ... | Tworzy listę Pythona z wartości C. |
{...} | zgodnie z ... | Tworzy słownik Pythona z wartości C, naprzemiennych kluczy i wartości. |
Kod {...} buduje słowniki z parzystej liczby wartości C, na przemian kluczy i wartości. Na przykład Py_BuildValue ("{issi}", 23, "zig", "zag", 42) zwraca słownik, taki jak Python's {23: 'zig', 'zag': 42}.