ћерион Ќетворкс

34 минуты чтени€

¬ этом руководстве мы расскажем про основы €зыка Python, расскажем как его установить, как запускать программы и на примерах разберем все основные темы.

–уководство по изучению Python с нул€ с примерами

ѕрежде всего, что такое Python? ѕо словам его создател€ √видо ван –оссума, Python - это:

Ђязык программировани€ высокого уровн€ и его основна€ философи€ проектировани€ - это все о читабельности кода и синтаксисе, который позвол€ет программистам выражать концепции в нескольких строках кодаї.

ћы можем использовать кодирование на Python по-разному: здесь блистают наука о данных, автоматизаци€ задач, написание скриптов, веб-разработка и машинное обучение. Quora, Pinterest и Spotify используют Python дл€ своей внутренней веб-разработки. »так, давайте немного узнаем об этом €зыке и разберем его основы.


ќ €зыке

„то умеет Python?

  • Python можно использовать на сервере дл€ создани€ веб-приложений.
  • Python можно использовать вместе с программным обеспечением дл€ создани€ рабочих процессов.
  • Python может подключатьс€ к системам баз данных. ќн также может читать и измен€ть файлы.
  • Python можно использовать дл€ обработки больших данных и выполнени€ сложной математики.
  • Python можно использовать дл€ быстрого создани€ прототипов или дл€ разработки программного обеспечени€, готового к производству.

ѕочему Python?

  • Python работает на разных платформах (Windows, Mac, Linux, Raspberry Pi и т.д.).
  • Python имеет простой синтаксис, аналогичный английскому €зыку.
  • —интаксис Python позвол€ет разработчикам писать программы с меньшим количеством строк, чем в некоторых других €зыках программировани€.
  • Python работает в системе интерпретатора, что означает, что код может быть выполнен, как только он будет написан. Ёто означает, что прототипирование может быть очень быстрым.
  • Python можно рассматривать как процедурный, объектно-ориентированный или функциональный.
  • Python попул€рный и имеет хорошо развитую экосистему.

’орошо знать

  • —ама€ последн€€ основна€ верси€ Python - это Python 3. ќднако Python 2, хот€ и не обновл€етс€ ничем, кроме обновлений безопасности, по-прежнему довольно попул€рен.
  • ћожно написать Python в интегрированной среде разработки, такой как Thonny, Pycharm, Netbeans или Eclipse, которые особенно полезны при управлении большими коллекци€ми файлов Python.

—интаксис Python по сравнению с другими €зыками программировани€

  • Python был разработан дл€ удобства чтени€ и имеет некоторое сходство с английским €зыком с вли€нием математики.
  • Python использует новые строки дл€ завершени€ команды, в отличие от других €зыков программировани€, в которых часто используютс€ точки с зап€той или круглые скобки.
  • Python полагаетс€ на отступы с использованием пробелов дл€ определени€ области видимости; например, объем циклов, функций и классов. ¬ других €зыках программировани€ дл€ этой цели часто используютс€ фигурные скобки.

ѕодготовка

”становка Python

Ќа многих ѕ  и Mac уже установлен Python.

„тобы проверить, установлен ли у вас Python на ѕ  с Windows, выполните поиск Python на панели запуска или выполните в командной строке cmd.exe следующее:

C:\Users\Your Name>python --version	

„тобы проверить, установлен ли у вас python на Linux или Mac, то на Linux откройте командную строку или на Mac откройте “ерминал и введите:

python --version

≈сли вы обнаружите, что на вашем компьютере не установлен python, вы можете бесплатно загрузить его со следующего веб-сайта: https://www.python.org/

Ѕыстрый старт

Python - это интерпретируемый €зык программировани€, это означает, что как разработчик вы пишете файлы Python .py в текстовом редакторе, а затем помещаете эти файлы в интерпретатор Python дл€ выполнени€.

—пособ запуска файла Python в командной строке выгл€дит следующим образом:

C:\Users\Your Name>python helloworld.py	

√де helloworld.py - это им€ вашего файла python.

ƒавайте напишем наш первый файл Python под названием helloworld.py, который можно сделать в любом текстовом редакторе.

print("Hello, World!")

—охраните ваш файл. ќткройте командную строку, перейдите в каталог, в котором вы сохранили файл, и запустите:

C:\Users\Your Name>python helloworld.py	

–езультат должен быть таким:

Hello, World!

ѕоздравл€ем, вы написали и выполнили свою первую программу на Python.

 омандна€ строка Python

„тобы протестировать небольшой объем кода на Python, иногда проще и быстрее всего не записывать код в файл. Ёто стало возможным, потому что Python можно запускать из командной строки.

¬ведите в командной строке Windows, Mac или Linux следующее:

C:\Users\Your Name>python

»ли, если команда python не сработала, вы можете попробовать py:

C:\Users\Your Name>py	

ќттуда вы можете написать любой Python, включа€ наш пример hello world из ранее в руководстве:

C:\Users\Your Name>python
Python 3.6.4 (v3.6.4:d48eceb, Dec 19 2017, 06:04:45) [MSC v.1900 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> print("Hello, World!") 

 отора€ напишет "Hello, World!" в командной строке:

C:\Users\Your Name>python
Python 3.6.4 (v3.6.4:d48eceb, Dec 19 2017, 06:04:45) [MSC v.1900 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> print("Hello, World!")
Hello, World! 

 огда вы закончите в командной строке Python, вы можете просто ввести следующее, чтобы выйти из интерфейса командной строки Python:

exit()	

ќсновы

1. ѕеременные

¬ы можете думать о переменных как о словах, хран€щих значение. ¬от так просто.

¬ Python действительно легко определить переменную и присвоить ей значение. ѕредставьте, что вы хотите сохранить номер 1 в переменной под названием one (единица). ƒавай сделаем это:

one = 1

«аметили насколько это было просто? ¬ы только что присвоили значение 1 переменной one.

two = 2
some_number = 10000	
Python - динамически типизированный €зык, и это не нужно указывать типы переменных, которые вы используете, и переменные не прив€заны к конкретному типу.

» вы можете присвоить любое другое значение любым другим переменным, которые захотите.  ак вы видите в таблице выше, переменна€ two хранит целое число 2, а some_number хранит 10 000.

ѕомимо целых чисел, мы также можем использовать булевые логические значени€ (True или False), строки, числа с плавающей зап€той и многие другие типы данных.

# booleans (булевые значени€)
true_boolean = True
false_boolean = False
 
# string (строка)
my_name = "Leandro Tk"

# float (числа с плавающей зап€той)
book_price = 15.80	
 омментарии начинаютс€ с символа #, и Python их игнорирует:

2. ѕоток управлени€: условные операторы

if использует выражение дл€ оценки того, €вл€етс€ ли утверждение истинным или ложным. ≈сли это True, он выполн€ет то, что находитс€ внутри оператора if. Ќапример:

if True:
  print("Hello Python If")

if 2 > 1:
  print("2 is greater than 1")	
ќбратите внимание, что на после строк с if у нас стоит отступ. ≈сли в других €зыках программировани€ отступы в коде предназначены только дл€ удобства чтени€, отступы в Python очень важны. Python использует отступ дл€ обозначени€ блока кода. “ут должен сто€ть хот€ бы один пробел, иначе мы получим ошибку.

2 больше 1, поэтому выполн€етс€ код print. ќператор else будет выполнен, если выражение if ложно.

‘ункци€ print () выводит указанное сообщение на экран.
if 1 > 2:
  print("1 is greater than 2")
else:
  print("1 is not greater than 2")	
¬ Python при сравнении используетс€ двойное равно ==, а при присвоении - одно.

1 не больше 2, поэтому код внутри оператора else будет выполнен.

¬ы также можете использовать оператор elif, который значит else if:

if 1 > 2:
  print("1 is greater than 2")
elif 2 > 1:
  print("1 is not greater than 2")
else:
  print("1 is equal to 2")	

3. ÷икл / »тератор

¬ Python мы можем выполн€ть итерацию в разных формах. ћы расскажем о двух: while и for.

÷икл while: пока оператор имеет значение True, код внутри блока будет выполнен. »так, этот код напечатает число от 1 до 10.

num = 1

while num <= 10:
    print(num)
    num += 1	

÷иклу while требуетс€ Ђусловие циклаї. ≈сли он остаетс€ True, он продолжает повторение. ¬ этом примере, когда num равно 11, условие цикла равно False.

≈ще один базовый фрагмент кода, чтобы лучше его пон€ть:

loop_condition = True

while loop_condition:
    print("Loop Condition keeps: %s" %(loop_condition))
    loop_condition = False
”словие цикла мы записали в переменную loop_condition, котора€ равна True, поэтому повторение продолжаетс€ до тех пор, пока мы не установим дл€ него значение false.

÷икл for: вы примен€ете переменную num к блоку, и оператор for выполнит итерацию дл€ вас. Ётот код будет напечатан так же, как и код while: от 1 до 10.

for i in range(1, 11):
  print(i)	

¬идите? Ёто так просто. ƒиапазон начинаетс€ с 1 и продолжаетс€ до 11-го элемента (10 - 10-й элемент).


List: коллекци€, массив, cтруктура данных

ѕредставьте, что вы хотите сохранить целое число 1 в переменной. Ќо, может быть, теперь вы захотите сохранить 2. » 3, 4, 5Е

≈сть ли другой способ хранить все нужные нам целые числа, но не в миллионах переменных?  ак вы уже догадались - действительно есть другой способ их хранени€.

List - это список или коллекци€, которую можно использовать дл€ хранени€ списка значений (например, этих целых чисел, которые вы хотите). »так, давайте воспользуемс€ этим:

my_integers = [1, 2, 3, 4, 5]	

Ёто действительно просто. ћы создали массив и сохранили его в my_integer.

Ќо, может быть, вы спрашиваете: Ђ ак мне получить значение из этого массива?ї ќтличный вопрос. —писок имеет пон€тие, называемое индексом. ѕервый элемент получает индекс 0. ¬торой получает 1 и так далее.

„тобы было пон€тнее, мы можем представить массив и каждый элемент с его индексом.

Array: [5][7][1][3][4]	
Index: [0][1][2][3][4]	

»спользу€ синтаксис Python, также просто пон€ть:

my_integers = [5, 7, 1, 3, 4]
print(my_integers[0]) # 5
print(my_integers[1]) # 7
print(my_integers[4]) # 4	

ѕредставьте, что вы не хотите хранить целые числа. ¬ы просто хотите хранить строки, например, список имен. ќн бы выгл€дел примерно так:

relatives_names = [
  "Alex",
  "Juliana",
  "Max",
  "Bruno",
  "Kaio"
]

print(relatives_names[4]) # Kaio

ќн работает так же, как и дл€ целых чисел. ќтлично.

ћы только что узнали, как работают индексы списков List. Ќо мне все еще нужно показать вам, как мы можем добавить элемент в структуру данных List (элемент в список).

—амый распространенный метод добавлени€ нового значени€ в List - это append. ѕосмотрим, как это работает:

bookshelf = []
bookshelf.append("The Effective Engineer")
bookshelf.append("The 4 Hour Work Week")
print(bookshelf[0]) # The Effective Engineer
print(bookshelf[1]) # The 4 Hour Work Week	

append делать очень просто. ¬ам просто нужно применить элемент (например, ЂThe Effective Engineerї) в качестве параметра добавлени€.

Ќу хватит о списках. ѕоговорим о другой структуре данных.


Dictionary: структура данных "ключ-значение"

“еперь мы знаем, что списки List индексируютс€ целыми числами. Ќо что, если мы не хотим использовать целые числа в качестве индексов? Ќекоторые структуры данных, которые мы можем использовать, €вл€ютс€ числовыми, строковыми или другими типами индексов.

ƒавайте узнаем о структуре данных Dictionary или —ловари на русском. Dictionary - это набор пар ключ-значение. ¬от как это выгл€дит:

dictionary_example = {
  "key1": "value1",
  "key2": "value2",
  "key3": "value3"
}
Dictionary иногда ещЄ называют ассоциативными массивами или хеш-таблицами.

 люч key - это индекс, указывающий на значение value.  ак нам получить доступ к значению словар€? ¬ы догадались - с помощью ключа. ƒавай попробуем:

dictionary_tk = {
  "name": "Leandro",
  "nickname": "Tk",
  "birthplace": "Brazil"
}

print("My name is %s" %(dictionary_tk["name"])) # My name is Leandro
print("But you can call me %s" %(dictionary_tk["nickname"])) # But you can call me Tk
print("And by the way I'm from %s" %(dictionary_tk["birthplace"])) # And by the way I'm from Brazil

ћы создали словарь dictionary_tk, и в нем записали им€, ник и место рождени€. Ёти атрибуты €вл€ютс€ ключами словар€.

“акже как мы узнали, как получить доступ к списку с помощью индекса, мы также используем индексы (ключи в контексте словар€) дл€ доступа к значению, хран€щемус€ в словаре.

≈ще одна замечательна€ вещь в Dictionary - это то, что мы можем использовать что угодно в качестве значени€. ƒопустим что в созданном словаре мы хотим добавить в него ключ age и записать туда насто€щий целочисленный возраст:

dictionary_tk = {
  "name": "Leandro",
  "nickname": "Tk",
  "birthplace": "Brazil"
  "age": 24
}

print("My name is %s" %(dictionary_tk["name"])) # My name is Leandro
print("But you can call me %s" %(dictionary_tk["nickname"])) # But you can call me Tk
print("And by the way I'm from %s" %(dictionary_tk["birthplace"])) # And by the way I'm from Brazil

«десь у нас есть пара ключ: age, значение: 24, использующа€ строку в качестве ключа и целое число в качестве значени€.

 ак и в случае со списками, давайте узнаем, как добавл€ть элементы в словарь.  люч, указывающий на значение, - это больша€ часть того, что такое Dictionary. Ёто также верно, когда мы говорим о добавлении к нему элементов:

dictionary_tk = {
  "name": "Leandro",
  "nickname": "Tk",
  "birthplace": "Brazil"
}

dictionary_tk['age'] = 24

print(dictionary_tk) # {'birthplace': 'Brazil', 'age': 24, 'nickname': 'Tk', 'name': 'Leandro'}	

Ќам просто нужно присвоить значение ключу словар€. Ќичего сложного здесь нет, правда?

“акже в Pythhon есть другие типы данных - кортежи (tuple), который по сути €вл€етс€ неизмен€емым списком и множества (set), содержащий не повтор€ющиес€ элементы в случайном пор€дке.

»тераци€: цикл по структурам данных

 ак мы узнали из основ Python, итераци€ списка (который List) очень проста. –азработчики Python, обычно используют цикл For. ƒавай сделаем это:

bookshelf = [
  "The Effective Engineer",
  "The 4 hours work week",
  "Zero to One",
  "Lean Startup",
  "Hooked"
]

for book in bookshelf:
    print(book)	

ќбъ€вим список с книгами - bookshelf. “еперь дл€ каждой книги на полке мы (а, можем все с ней делать) выводим ее, при помощи команды print. ƒовольно просто и интуитивно пон€тно.

ƒл€ хэш-структуры данных (словар€) мы также можем использовать цикл for, но мы примен€ем ключ:

dictionary = { "some_key": "some_value" }

for key in dictionary:
    print("%s --> %s" %(key, dictionary[key]))
    
# some_key --> some_value	

Ёто пример того, как его использовать. ƒл€ каждого ключа в словаре мы печатаем ключ и соответствующее ему значение.

ƒругой способ сделать это - использовать метод items, который вернет нам ключ и значение. »спользуем его дл€ словар€, что будет выгл€деть как dictionary.items()

dictionary = { "some_key": "some_value" }

for key, value in dictionary.items():
    print("%s --> %s" %(key, value))

# some_key --> some_value	

ћы назвали эти два параметра key и value, но это не об€зательно. ћы можем называть их как угодно. ƒавай посмотрим:

dictionary_tk = {
  "name": "Leandro",
  "nickname": "Tk",
  "birthplace": "Brazil",
  "age": 24
}

for attribute, value in dictionary_tk.items():
    print("My %s is %s" %(attribute, value))
    
# My name is Leandro
# My nickname is Tk
# My birthplace is Brazil
# My age is 24	

ћы видим, что мы использовали атрибут в качестве параметра дл€ ключа словар€, и он работает правильно. ќтлично!


‘ункции

‘ункци€ - это блок кода, который запускаетс€ только при его вызове. ¬ы можете передавать данные, называемые параметрами, в функцию. ¬ результате функци€ может возвращать данные. ¬се как везде

¬ Python функци€ определ€етс€ с помощью ключевого слова def:

def my_function():
  print("Hello from a function") 	

„тобы вызвать функцию, используйте им€ функции, за которым следует скобка:

def my_function():
  print("Hello from a function")

my_function()	

»нформаци€ может быть передана в функции как аргументы. јргументы указываютс€ после имени функции в круглых скобках. ¬ы можете добавить сколько угодно аргументов, просто разделив их зап€тыми. ¬ следующем примере есть функци€ с одним аргументом fname.  огда функци€ вызываетс€, мы передаем им€, которое используетс€ внутри функции дл€ печати полного имени:

def my_function(fname):
  print(fname + " Refsnes")

my_function("Emil")
my_function("Tobias")
my_function("Linus") 

ѕо умолчанию функци€ должна вызыватьс€ с правильным количеством аргументов. Ёто означает, что если ваша функци€ ожидает 2 аргумента, вы должны вызвать функцию с 2 аргументами, не больше и не меньше. ≈сли вы попытаетесь вызвать функцию с 1 или 3 аргументами, то получите ошибку.

def my_function(fname, lname):
  print(fname + " " + lname)

my_function("Emil", "Refsnes") 	

≈сли вы не знаете, сколько аргументов будет передано вашей функции, добавьте * перед именем параметра в определении функции.

def my_function(*kids):
  print("The youngest child is " + kids[2])

my_function("Emil", "Tobias", "Linus") 

ћы можем использовать значение параметра по умолчанию. ≈сли мы вызываем функцию без аргументов, то она не сломаетс€ и будет использовать значение по умолчанию:

def my_function(country = "Norway"):
  print("I am from " + country)

my_function("Sweden") #I am from Sweden
my_function() #I am from Norway

¬ы можете отправить любой тип данных аргумента функции (строка, число, список, словарь), » он будет обрабатыватьс€ как тот же тип данных внутри функции.

Ќапример если вы отправите список в качестве аргумента, он все равно будет списком, когда достигнет функции:

def my_function(food):
  for x in food:
    print(x)

fruits = ["apple", "banana", "cherry"]

my_function(fruits)

Ќу и чтобы позволить функции вернуть значение, используйте оператор return:

def my_function(x):
  return 5 * x

print(my_function(3)) #15
print(my_function(5)) #25

ѕользовательский ввод Python

Python позвол€ет вводить данные пользователем. Ёто означает, что мы можем попросить пользовател€ ввести данные.

Ётот метод немного отличаетс€ в Python 3.6 от Python 2.7. Python 3.6 использует метод input().

username = input("Enter username:")
print("Username is: " + username)

Python 2.7 использует метод raw_input().

username = raw_input("Enter username:")
print("Username is: " + username)	

Python прекращает выполнение, когда доходит до функции input (), и продолжает выполнение, когда пользователь ввел некоторый ввод.


ќбработка ошибок Python

Ѕлок try позвол€ет вам проверить блок кода на наличие ошибок.

Ѕлок except позвол€ет вам обрабатывать ошибку.

Ѕлок finally позвол€ет выполн€ть код независимо от результата блоков try и except.

ќбработка исключений

 огда возникает ошибка или исключение, как мы это называем, Python обычно останавливаетс€ и генерирует сообщение об ошибке.

Ёти исключени€ можно обрабатывать с помощью оператора try:

try:
  print(x)
except:
  print("An exception occurred") 	

Ѕлок try сгенерирует исключение, потому что x не определен.

ѕоскольку блок try вызывает ошибку, блок except будет выполнен. Ѕез блока try программа выйдет из стро€ и выдаст ошибку.

¬ы можете определить столько блоков исключений, сколько захотите, например если вы хотите выполнить специальный блок кода дл€ особого типа ошибки.

try:
  print(x)
except NameError:
  print("Variable x is not defined")
except:
  print("Something else went wrong") 	

¬ыведите одно сообщение, если блок try вызывает NameError, а другое - дл€ других ошибок.

¬ы можете использовать ключевое слово else, чтобы определить блок кода, который будет выполн€тьс€, если ошибок не возникло:

try:
  print("Hello")
except:
  print("Something went wrong")
else:
  print("Nothing went wrong") 	

Ѕлок finally, если он указан, будет выполнен независимо от того, вызывает ли блок try ошибку или нет.

try:
  print(x)
except:
  print("Something went wrong")
finally:
  print("The 'try except' is finished") 	

 ак разработчик Python сами вы можете создать исключение при возникновении услови€.

„тобы вызвать (или выкинуть) исключение, используйте ключевое слово raise.

x = -1

if x < 0:
  raise Exception("Sorry, no numbers below zero") 	

¬ы можете определить, какую ошибку выдавать, и текст, который будет выводить пользователь.

x = "hello"

if not type(x) is int:
  raise TypeError("Only integers are allowed") 	

 лассы и объекты

Ќемного теории:

ќбъекты представл€ют собой объекты реального мира, таких как автомобили, собаки или велосипеды. ” объектов есть две основные характеристики: данные и поведение.

” автомобилей есть данные, такие как количество колес, количество дверей и вместимость. ќни также демонстрируют поведение: они могут ускор€тьс€, останавливатьс€, показывать, сколько топлива осталось, и многое другое.

ћы идентифицируем данные как атрибуты, а поведение как методы в объектно-ориентированном программировании.

ј класс - это чертеж или план, из которого создаютс€ отдельные объекты. ¬ реальном мире мы часто находим много объектов одного типа.  ак машины.  ажда€ машина была построена по одному и тому же набору чертежей и состоит из одинаковых компонентов (у всех есть двигатель, колеса, двери и т.д.).


ќбъектно-ориентированное программирование Python

Python как объектно-ориентированный €зык программировани€ имеет следующие концепции: класс и объект.

 ласс - это план или чертерж, модель дл€ своих объектов.

»так, оп€ть же, класс - это просто модель или способ определени€ атрибутов и поведени€. Ќапример, класс транспортного средства имеет свои собственные атрибуты, определ€ющие, какие объекты €вл€ютс€ транспортными средствами.  оличество колес, тип бака, вместимость и максимальна€ скорость - все это атрибуты транспортного средства.

»ме€ это в виду, давайте посмотрим на синтаксис Python дл€ классов:

class Vehicle:
    pass	
pass это оператор-заглушка, равноценный отсутствию операции. “ут мы используем его потому что еще не указали атрибуты.

ћы определ€ем классы с помощью оператора class - и все. Ћегко, правда?

ќбъекты - это экземпл€ры класса. ћы создаем экземпл€р, называ€ класс.

car = Vehicle()
print(car) # <__main__.Vehicle instance at 0x7fb1de6c2638>

«десь car - это объект (или экземпл€р) класса Vehicle.

ѕомните, что у нашего класса транспортных средств есть четыре атрибута: количество колес, тип бака, вместимость и максимальна€ скорость. ћы устанавливаем все эти атрибуты при создании объекта транспортного средства. »так, здесь мы определ€ем наш класс дл€ получени€ данных, когда он их инициирует:

class Vehicle:
    def __init__(self, number_of_wheels, type_of_tank, seating_capacity, maximum_velocity):
        self.number_of_wheels = number_of_wheels
        self.type_of_tank = type_of_tank
        self.seating_capacity = seating_capacity
        self.maximum_velocity = maximum_velocity	
ћетод __init__, который автоматически вызываетс€ при создании объектов называетс€ конструктором объектов класса
ѕеременна€ self представл€ет текущий объект класса.

ћы используем метод init. ћы называем это методом конструктора. »так, когда мы создаем объект транспортного средства, мы можем определить эти атрибуты. ѕредставьте, что мы любим Tesla Model S и хотим создать такой объект. ” него четыре колеса, он работает на электроэнергии, вмещает п€ть сидений, а максимальна€ скорость составл€ет 250 км/час. ƒавайте создадим этот объект:

tesla_model_s = Vehicle(4, 'electric', 5, 250)

„етыре колеса + электробанк + п€ть сидений + максимальна€ скорость 250 км/час.

¬се атрибуты установлены. Ќо как мы можем получить доступ к значени€м этих атрибутов? ћы отправл€ем объекту сообщение с вопросом о них. ћы называем это методом. Ёто поведение объекта. ƒавайте применим это это:

class Vehicle:
    def __init__(self, number_of_wheels, type_of_tank, seating_capacity, maximum_velocity):
        self.number_of_wheels = number_of_wheels
        self.type_of_tank = type_of_tank
        self.seating_capacity = seating_capacity
        self.maximum_velocity = maximum_velocity

    def number_of_wheels(self):
        return self.number_of_wheels

    def set_number_of_wheels(self, number):
        self.number_of_wheels = number	

Ёто реализаци€ двух методов: number_of_wheels и set_number_of_wheels. ћы называем это геттером (getter) и сеттером (setter). ѕотому что первый получает значение атрибута, а второй устанавливает новое значение атрибута.

¬ Python мы можем сделать это, использу€ @property (декораторы) дл€ определени€ геттеров и сеттеров. ѕосмотрим на код:

class Vehicle:
    def __init__(self, number_of_wheels, type_of_tank, seating_capacity, maximum_velocity):
        self.number_of_wheels = number_of_wheels
        self.type_of_tank = type_of_tank
        self.seating_capacity = seating_capacity
        self.maximum_velocity = maximum_velocity
    
    @property
    def number_of_wheels(self):
        return self.__number_of_wheels
    
    @number_of_wheels.setter
    def number_of_wheels(self, number):
        self.__number_of_wheels = number	

» мы можем использовать эти методы как атрибуты, вызывав их через точку:

tesla_model_s = Vehicle(4, 'electric', 5, 250)
print(tesla_model_s.number_of_wheels) # 4
tesla_model_s.number_of_wheels = 2 # устанавливаем число колес равное 2
print(tesla_model_s.number_of_wheels) # 2

Ёто немного отличаетс€ от определени€ методов. ћетоды работают как атрибуты. Ќапример, когда мы устанавливаем новое количество колес, мы не примен€ем два в качестве параметра, а устанавливаем значение 2 равным number_of_wheels. Ёто один из способов написани€ геттеров и сеттеров в Python.

Ќо мы также можем использовать методы дл€ других вещей, например, метод make_noise. ƒавай увидим это:

class Vehicle:
    def __init__(self, number_of_wheels, type_of_tank, seating_capacity, maximum_velocity):
        self.number_of_wheels = number_of_wheels
        self.type_of_tank = type_of_tank
        self.seating_capacity = seating_capacity
        self.maximum_velocity = maximum_velocity

    def make_noise(self):
        print('VRUUUUUUUM')

 огда мы вызываем этот метод, он просто возвращает строку ЂVRRRRUUUUMї.

tesla_model_s = Vehicle(4, 'electric', 5, 250)
tesla_model_s.make_noise() # VRUUUUUUUM	

»нкапсул€ци€: скрытие информации

»нкапсул€ци€ - это механизм, ограничивающий пр€мой доступ к данным и методам объектов. Ќо в то же врем€ это облегчает работу с этими данными (методами объектов).

¬се внутреннее представление объекта скрыто снаружи. “олько объект может взаимодействовать со своими внутренними данными.

¬о-первых, нам нужно пон€ть, как работают общедоступные и непубличные переменные и методы экземпл€ра - pubulic и non-public.

ѕеременные общедоступного экземпл€ра

ƒл€ класса Python мы можем инициализировать общедоступную переменную экземпл€ра в нашем методе конструктора.

class Person:
    def __init__(self, first_name):
        self.first_name = first_name	

«десь мы примен€ем значение first_name в качестве аргумента к общедоступной переменной экземпл€ра (public instance variable).

tk = Person('TK')
print(tk.first_name) # => TK	

¬нутри класса:

class Person:
    first_name = 'TK'	

«десь нам не нужно примен€ть first_name в качестве аргумента, и все объекты экземпл€ра будут иметь атрибут класса, инициализированный с помощью TK.

tk = Person()
print(tk.first_name) # => TK	

“еперь мы узнали, что можем использовать общедоступные переменные экземпл€ра и атрибуты класса. ≈ще одна интересна€ особенность публичной части - это то, что мы можем управл€ть значением переменной. „то то значит? Ќаш объект может управл€ть своим значением переменной: получать и устанавливать значени€ переменных.

ѕомн€ о классе Person, мы хотим установить другое значение дл€ его переменной first_name:

tk = Person('TK')
tk.first_name = 'Kaio'
print(tk.first_name) # => Kaio	

ћы просто устанавливаем другое значение kaio дл€ переменной экземпл€ра first_name, и она обновл€ет значение. ¬от так просто. ѕоскольку это общедоступна€ переменна€, мы можем это сделать.

Ќепублична€ переменна€ экземпл€ра

¬ качестве общедоступной переменной экземпл€ра мы можем определить непубличную (non-public) переменную экземпл€ра как внутри метода конструктора, так и внутри класса. –азница в синтаксисе: дл€ закрытых переменных экземпл€ра используйте символ подчеркивани€ _ перед именем переменной.

Ђ„астныеї переменные экземпл€ра, к которым нельз€ получить доступ, кроме как изнутри объекта, в Python не существует. ќднако существует соглашение, которому следует больша€ часть кода Python: им€ с префиксом подчеркивани€ (например, _spam) должно рассматриватьс€ как закрыта€ часть API (будь то функци€, метод или член данных).

¬от пример:

class Person:
    def __init__(self, first_name, email):
        self.first_name = first_name
        self._email = email	

¬ы видели переменную _email? ¬от как мы определ€ем непубличную переменную:

tk = Person('TK', 'tk@mail.com')
print(tk._email) # tk@mail.com

ћы можем получить к ней доступ и обновить. Ќепубличные переменные - это просто соглашение, и их следует рассматривать как непубличную часть API.

API - это программный интерфейс приложени€. Ёто интерфейс взаимодействи€ с программой.

»так, мы используем метод, который позвол€ет нам делать это внутри определени€ нашего класса. ƒавайте реализуем два метода (emali и update_email), чтобы пон€ть это:

class Person:
    def __init__(self, first_name, email):
        self.first_name = first_name
        self._email = email

    def update_email(self, new_email):
        self._email = new_email

    def email(self):
        return self._email	

“еперь мы можем обновл€ть непубличные переменные и обращатьс€ к ним с помощью этих методов. ƒавайте посмотрим:

tk = Person('TK', 'tk@mail.com')
print(tk.email()) # => tk@mail.com
# tk._email = 'new_tk@mail.com' -- рассматривать как непубличную часть API класса 
print(tk.email()) # => tk@mail.com
tk.update_email('new_tk@mail.com')
print(tk.email()) # => new_tk@mail.com	
  1. ћы инициировали новый объект с именем TK и адресом электронной почты tk@mail.com
  2. –аспечатали email, обратившись к закрытой переменной с помощью метода
  3. ѕытались установить новый адрес электронной почты вне нашего класса
  4. Ќам нужно рассматривать непубличную переменную как непубличную часть API.
  5. ќбновлена непублична€ переменна€ с помощью нашего метода экземпл€ра
  6. ”спех! ћы можем обновить ее внутри нашего класса с помощью вспомогательного метода

ѕубличный метод

— общедоступными методами мы также можем использовать их вне нашего класса:

class Person:
    def __init__(self, first_name, age):
        self.first_name = first_name
        self._age = age

    def show_age(self):
        return self._age	

ƒавайте проверим это:

tk = Person('TK', 25)
print(tk.show_age()) # => 25	

ќтлично - мы можем использовать его без проблем.

Ќепубличный метод

Ќо с помощью закрытых методов мы не можем этого сделать. ƒавайте реализуем тот же класс Person, но теперь с закрытым методом show_age с подчеркиванием _.

class Person:
    def __init__(self, first_name, age):
        self.first_name = first_name
        self._age = age

    def _show_age(self):
        return self._age	

ј теперь мы попробуем вызвать этот непубличный метод с нашим объектом:

tk = Person('TK', 25)
print(tk._show_age()) # => 25	
“ут все так же. ћы можем получить к нему доступ и обновить. Ќепубличные методы - это просто соглашение, и их следует рассматривать как непубличную часть API.

¬от пример того, как мы можем это использовать:

class Person:
    def __init__(self, first_name, age):
        self.first_name = first_name
        self._age = age

    def show_age(self):
        return self._get_age()

    def _get_age(self):
        return self._age

tk = Person('TK', 25)
print(tk.show_age()) # => 25

«десь у нас есть закрытый метод _get_age и открытый метод show_age. show_age может использоватьс€ нашим объектом (вне нашего класса), а _get_age может использоватьс€ только внутри нашего определени€ класса (внутри метода show_age). Ќо оп€ть же: условно.

—водка по инкапсул€ции

— помощью инкапсул€ции мы можем гарантировать, что внутреннее представление объекта скрыто снаружи.


Ќаследование: поведение и характеристики

” некоторых объектов есть общие черты: их поведение и характеристики.

¬ объектно-ориентированном программировании классы могут наследовать общие характеристики (данные) и поведение (методы) от другого класса.

ƒавайте посмотрим на другой пример и реализуем его на Python.

ѕредставьте себе машину.  оличество колес, пассажировместимость и максимальна€ скорость - все это атрибуты автомобил€. ћожно сказать, что класс ElectricCar наследует те же атрибуты от обычного класса Car.

class Car:
    def __init__(self, number_of_wheels, seating_capacity, maximum_velocity):
        self.number_of_wheels = number_of_wheels
        self.seating_capacity = seating_capacity
        self.maximum_velocity = maximum_velocity	

¬ нашем классе Car реализованы:

my_car = Car(4, 5, 250)
print(my_car.number_of_wheels)
print(my_car.seating_capacity)
print(my_car.maximum_velocity)	

ѕосле запуска мы можем использовать все созданные переменные экземпл€ра. ќтлично.

¬ Python мы примен€ем родительский (parent) класс к дочернему (child) классу в качестве параметра.  ласс ElectricCar может быть унаследован от нашего класса Car.

class ElectricCar(Car):
    def __init__(self, number_of_wheels, seating_capacity, maximum_velocity):
        Car.__init__(self, number_of_wheels, seating_capacity, maximum_velocity)	

¬от так просто. Ќам не нужно реализовывать какой-либо другой метод, потому что он уже есть в этом классе (унаследованный от класса Car). ƒокажем это:

my_electric_car = ElectricCar(4, 5, 250)
print(my_electric_car.number_of_wheels) # => 4
print(my_electric_car.seating_capacity) # => 5
print(my_electric_car.maximum_velocity) # => 250	

ћодули в Python

„то такое модуль? —читайте, что модуль - это то же самое, что и библиотека кода. ‘айл, содержащий набор функций, которые вы хотите включить в свое приложение.

„тобы создать модуль, просто сохраните нужный код в файле с расширением .py:

—охраните этот код в файле с именем mymodule.py

def greeting(name):
  print("Hello, " + name) 

“еперь мы можем использовать только что созданный модуль, использу€ оператор import:

import mymodule

mymodule.greeting("Jonathan") #Hello, Jonathan 

¬ы можете создать псевдоним при импорте модул€, использу€ ключевое слово as:

import mymodule as mx

¬строенные модули

¬ Python есть несколько встроенных модулей, которые вы можете импортировать в любое врем€.

import platform

x = platform.system()
print(x) 	

—уществует встроенна€ функци€ дл€ отображени€ всех имен функций (или имен переменных) в модуле. Ёто функци€ dir():

import platform

x = dir(platform)
print(x)	

ѕолучим такой вывод:

['DEV_NULL', '_UNIXCONFDIR', 'WIN32_CLIENT_RELEASES', 'WIN32_SERVER_RELEASES', '__builtins__', '__cached__', '__copyright__', '__doc__', '__file__', '__loader__', '__name__', '__package __', '__spec__', '__version__', '_default_architecture', '_dist_try_harder', '_follow_symlinks', '_ironpython26_sys_version_parser', '_ironpython_sys_version_parser', '_java_getprop', '_libc_search', '_linux_distribution', '_lsb_release_version', '_mac_ver_xml', '_node', '_norm_version', '_perse_release_file', '_platform', '_platform_cache', '_pypy_sys_version_parser', '_release_filename', '_release_version', '_supported_dists', '_sys_version', '_sys_version_cache', '_sys_version_parser', '_syscmd_file', '_syscmd_uname', '_syscmd_ver', '_uname_cache', '_ver_output', 'architecture', 'collections', 'dist', 'java_ver', 'libc_ver', 'linux_distribution', 'mac_ver', 'machine', 'node', 'os', 'platform', 'popen', 'processor', 'python_branch', 'python_build', 'python_compiler', 'python_implementation', 'python_revision', 'python_version', 'python_version_tuple', 're', 'release', 'subprocess', 'sys', 'system', 'system_aliases', 'uname', 'uname_result', 'version', 'warnings', 'win32_ver']

–абота с файлами в Python

–абота с файлами - важна€ часть любого приложени€. Python имеет несколько функций дл€ создани€, чтени€, обновлени€ и удалени€ файлов.

ќбработка файлов

 лючевой функцией дл€ работы с файлами в Python €вл€етс€ функци€ open().

‘ункци€ open() принимает два параметра - им€ файла и режим.

—уществует четыре различных метода (режима) открыти€ файла:

  • r - „тение - значение по умолчанию. ќткрывает файл дл€ чтени€, возвращает ошибку, если файл не существует
  • a - ƒобавить - открывает файл дл€ добавлени€, создает файл, если он не существует.
  • w - «апись - открывает файл дл€ записи, создает файл, если он не существует.
  • x - —оздать - создает указанный файл, возвращает ошибку, если файл существует.

 роме того, вы можете указать, следует ли обрабатывать файл в двоичном или текстовом режиме.

  • t - “екст - значение по умолчанию. “екстовый режим
  • b - ƒвоичный - ƒвоичный режим (например, изображени€)

„тобы открыть файл дл€ чтени€, достаточно указать им€ файла:

f = open("demofile.txt")

 од выше по сути такой же, как:

f = open("demofile.txt", "rt")

ѕоскольку r дл€ чтени€ и t дл€ текста €вл€ютс€ значени€ми по умолчанию, вам не нужно их указывать.

ќткрыть файл на сервере

ѕредположим, у нас есть следующий файл, расположенный в той же папке, что и Python:

„тобы открыть файл, используйте встроенную функцию open(). ‘ункци€ open() возвращает файловый объект, у которого есть метод read() дл€ чтени€ содержимого файла:

f = open("demofile.txt", "r")
print(f.read()) 	

≈сли файл находитс€ в другом месте, вам нужно будет указать путь к файлу, например:

f = open("D:\\myfiles\welcome.txt", "r")
print(f.read()) 	

¬ы можете вывести одну строку, использу€ метод readline():

f = open("demofile.txt", "r")
print(f.readline()) 	

–екомендуетс€ всегда закрывать файл по окончании работы с ним. ¬ некоторых случа€х из-за буферизации изменени€, внесенные в файл, могут не отображатьс€, пока вы не закроете файл.

f = open("demofile.txt", "r")
print(f.readline())
f.close() 	

«апись в существующий файл

ƒл€ записи в существующий файл необходимо добавить параметр к функции open():

  • a - ƒобавить - добавит в конец файла
  • w - «апись - перезапишет весь существующий контент

ќткройте файл "demofile2.txt" и добавьте содержимое в файл:

f = open("demofile2.txt", "a")
f.write("Now the file has more content!")
f.close()

#откройте и прочитайте файл после добавлени€ нового содержимого:
f = open("demofile2.txt", "r")
print(f.read()) 

ќткройте файл "demofile3.txt" и перезапишите его содержимое:

f = open("demofile3.txt", "w")
f.write("Woops! I have deleted the content!")
f.close()

—оздать новый файл

„тобы создать новый файл в Python, используйте метод open() с одним из следующих параметров:

  • x - —оздать - создаст файл, вернет ошибку, если файл существует
  • a - ƒобавить - создаст файл, если указанный файл не существует
  • w - «апись - создаст файл, если указанный файл не существует

—оздайте файл с именем myfile.txt:

f = open ("myfile.txt", "x")

–езультат: создан новый пустой файл!

”далить файл

„тобы удалить файл, вы должны импортировать модуль os и запустить его функцию os.remove():

import os
os.remove("demofile.txt")	

„тобы избежать по€влени€ ошибки, вы можете проверить, существует ли файл, прежде чем пытатьс€ удалить его:

import os
if os.path.exists("demofile.txt"):
  os.remove("demofile.txt")
else:
  print("The file does not exist")	

”далить папку

„тобы удалить всю папку, используйте метод os.rmdir():

import os
os.rmdir("myfolder")	
”далить можно только пустые папки.

Python PIP

„то такое PIP? PIP - это менеджер пакетов дл€ пакетов Python или модулей, если хотите.

ѕримечание. ≈сли у вас Python версии 3.4 или новее, PIP включен по умолчанию.

„то такое пакет? ѕакет содержит все файлы, необходимые дл€ модул€. ћодули - это библиотеки кода Python, которые вы можете включить в свой проект.

ѕроверьте, установлен ли PIP

ѕерейдите в командной строке к каталогу скриптов Python и введите следующее:

C:\Users\Your Name\AppData\Local\Programs\Python\Python36-32\Scripts>pip --version

”становить PIP

≈сли у вас не установлен PIP, вы можете загрузить и установить его с этой страницы: https://pypi.org/project/pip/

—качать пакет

«агрузить пакет очень просто. ќткройте интерфейс командной строки и скажите PIP загрузить нужный пакет. ѕерейдите в командной строке к каталогу сценариев Python и введите следующее:

C:\Users\Your Name\AppData\Local\Programs\Python\Python36-32\Scripts>pip install camelcase	

ћы скачали пакет camelcase

»спользование пакета

ѕосле установки пакет готов к использованию. »мпортируйте пакет camelcase в свой проект при помощи ключевого слова import.

import camelcase

c = camelcase.CamelCase()

txt = "hello world"

print(c.hump(txt)) 	

ƒополнительные пакеты можно найти на https://pypi.org/.

”далить пакет

»спользуйте команду uninstall, чтобы удалить пакет:

C:\Users\Your Name\AppData\Local\Programs\Python\Python36-32\Scripts>pip uninstall camelcase

ƒиспетчер пакетов PIP попросит вас подтвердить, что вы хотите удалить пакет:

Uninstalling camelcase-02.1:
  Would remove:
    c:\users\Your Name\appdata\local\programs\python\python36-32\lib\site-packages\camecase-0.2-py3.6.egg-info
    c:\users\Your Name\appdata\local\programs\python\python36-32\lib\site-packages\camecase\*
Proceed (y/n)?

Ќажмите y, и пакет будет удален.

—писок пакетов

»спользуйте команду list, чтобы вывести список всех пакетов, установленных в вашей системе:

C:\Users\Your Name\AppData\Local\Programs\Python\Python36-32\Scripts>pip list	
Package         Version
-----------------------
camelcase       0.2
mysql-connector 2.1.6
pip             18.1
pymongo         3.6.1
setuptools      39.0.1	

¬от и все!

ћы узнали много нового об основах Python:

  •  ак установить Python и запустить свою первую программу
  •  ак работают переменные Python
  •  ак работают условные операторы Python
  •  ак работает цикл Python (while и for)
  •  ак работают функции Python
  •  ак работают исключени€ Python
  •  ак вводить данные в Python
  •  ак работать с файлами в Python
  •  ак работать с модул€ми в Python
  •  ак пользоватьс€ PIP
  •  ак использовать списки:  оллекци€ и ћассив
  •  оллекци€ ключей и значений словар€ Dictionary
  •  ак мы можем перебирать эти структуры данных
  • ќбъекты и классы
  • јтрибуты как данные объектов
  • ћетоды как поведение объектов
  • »спользование геттеров и сеттеров Python и декоратора свойств
  • »нкапсул€ци€: скрытие информации
  • Ќаследование: поведение и характеристики

“акже вам может быть интересно наше –уководство по изучению PHP с нул€ с примерами


—кидки 50% в Merion Academy

¬ыбрать курс