Показаны сообщения с ярлыком Python. Показать все сообщения
Показаны сообщения с ярлыком Python. Показать все сообщения

Работа с текстовым форматом XML в языке Python

ElementTree

Пример XML-файла:


В составе стандартной библиотеки языка Python есть библиотека ElementTree.

from xml.etree import ElementTree

tree = ElementTree.parse("example.xml")
root = tree.getroot()
# use root = ElementTree.fromstring(string_xml_data) to parse from str

print(root)
print(root.tag, root.attrib)

Работа с текстовым форматом JSON в языке Python

Формат JSON изначально использовался для описания объектов, которые существует в JavaScript. Сейчас он является отдельным текстовым форматом. В JSON описываются такие основные сущности как числа, строки, списки, объекты (словари, которые хранят в себе пару ключ-значение), также мы храним значения true/false и null, что является аналогом None в языке Python.

[
  {
    "first_name": "Greg",
    "last_name": "Dean",
    "certificate": true,
    "scores": [
        70,
        80,
        90
    ],
    "description": "Good job, Greg"
  },
  {
    "first_name": "Wirt",
    "last_name": "Wood",
    "certificate": true,
    "scores": [
        70,
        80,
        90
    ],
    "description": "Nicely Done"
  }
]

Работа с текстовым табличным форматом CSV в Python

В общем случае файл в CSV-формате выглядит очень просто:

first name,last name,module1,module2,module3,description
student,best,100,100,100,Excellent score
student,good,90,"90,2",100,"Good score
but could do better"
Greg,Dean,70,80,90,"Good job, Greg"
Wirt,Wood,80,80.2,80,Nicely done
Greg,Dean,70,80,90,"Good job, Greg"
Wirt,Wood,80,80.2,80,Nicely done
"Greg","Dean","70","80","90","Good job, Greg"
"Wirt","Wood","80","80.2","80","Nicely done"
"Greg","Dean",70,80,90,"Good job, Greg"
"Wirt","Wood",80,80.2,80,"Nicely done"

Работа с текстовым протоколом HTTP в Python

Для выполнения HTTP-запросов в языке Python можно использовать библиотеку requests. Установить ее можно с помощью утилиты pip.

Функция get из модуля request возвращает нам response object. В качестве атрибутов нам доступны статус-коды, хедеры, само содержимое нашего ресурса (атрибут content).
import requests

res = requests.get("https://docs.python.org/3.5/")
print(res.status_code)  # 200
print(res.headers['Content-Type'])  # text/html
print(res.content)  # бинарный контент
print(res.text)  # текстовый контент

Пример загрузки файла из интернета:
import requests

res = requests.get("https://docs.python.org/3.5/_static/py.png")
print(res.status_code)  # 200
print(res.headers['Content-Type'])  # image/png
print(res.content)  # бинарный контент

with open("python.png", "wb") as f:
 f.write(res.content)

Можно указывать параметры запроса:
import requests

res = requests.get("https://yandex.ru/search/",
                   params={
                       "text": "Stepic",
                       "test": "test1",
                       "name": "Name With Spaces",
                       "list": ["test1", "test2"]
                   })
print(res.status_code)
print(res.headers['Content-Type'])
print(res.url)
# print(res.text)


Регулярные выражения в Python

В языке Python регулярные выражения представляются стандартной библиотекой.

Когда мы пишем регулярное выражение мы хотим чтобы обратный слэш вел себя как обратный слэш.
x = "hello\nworld"
print(x)

x = r"hello\nworld"  # сырая (raw) строка
print(x)

Для описания шаблонов регулярных выражений используются именно сырые строки.

Методы класса str в Python

Текстовая информация хранится в объектах строкового типа.

PEP8 и документация кода на Python

PEP8

В языке Python существует стилистический документу по написанию кода на языке Python. Она называется PEP8. переводы данного документа на русский язык: 

Проверить код можно с помощью консольной утилиты pep8, например:
pep8 generators.py

Определение классов в языке Python

Все данные в языке Python представлены объектами и отношениями между объектами. У любого объекта есть тип. Для определения собственных типов в языке Python есть классы. Классы позволяют описать поведение объектов данного класса.

class MyClass:
 a = 10
 
 def func(self):
  print('Hello')

В отличие от функций тело классов исполняется в момент определения самого класса. Для тела класса также как и для функций создается отдельный неймспейс и те имена, которые в этом неймспейсе остались затем закрепляются за объектом класса:
  • MyClass.a
  • MyClass.func
a и func являются атрибутами класса MyClass.

Списки в Python


Генерация списков (list comprehension)

x = [-2, -1, 0, 1, 2]

y = []
for i in x:
    y.append(i * i)

g = [i * i for i in x]
print(g)  # [4, 1, 0, 1, 4]

w = [i * i for i in x if i > 0]
print(w)  # [1, 4]

z = [(u, o) for u in range(3) for o in range(3) if o >= u]
print(z)  # [(0, 0), (0, 1), (0, 2), (1, 1), (1, 2), (2, 2)]

# генератор
v = ((u, o) for u in range(3) for o in range(3) if o >= u)
print(v)  # <generator object <genexpr> at 0x01124360>
print(next(v))  # (0, 0)


Основные конструкции языка Python


Цикл for и итераторы

lst = [1, 2, 3, 4, 5, 6]
book = {
    'title': 'The Langoliers',
    'author': 'Stephen King',
    'year_published': 1990
}
string = "Hello, World!"

for i in lst:  # перебираем элементы списка
    print(i)

for i in book:  # перебираем ключи словаря
    print(i)

for i in string:  # перебираем символы строки
    print(i)

В языке Python есть итераторы, такие объекты-перечислители, у которых можно спросить какой элемент является следующим в объекте.
iterator = iter(book)
print(next(iter))

Если мы хотим перебирать элементы какого-нибудь объекта с помощью цикла for, то у этого объекта должен быть итератор. Если в объекте кончились элементы, то итератор должен бросить ошибку StopIteration.

Именно таким образом и работает цикл for.
it = iter(book)
while True:
    try:
        i = next(it)
        print(i)
    except StopIteration:
        break;

Для того чтобы объект можно было проитерировать, т.е. перечислить его элементы, у него должен быть определен метод iter, который возвращает итератор. А для того чтобы объект являлся итератором у него должен быть определен метод next.
from random import random


class RandomIterator:
    def __init__(self, k):  # конструктор
        self.k = k
        self.i = 0

    def __next__(self):  # объект является итератором, когда у него есть данный метод
        if self.i < self.k:
            self.i += 1
            return random()
        else:
            raise StopIteration

    def __iter__(self):
        return self

x = RandomIterator(3)
print(next(x))  # next(x) ~ x.__next__()
print(next(x))
print(next(x))

for y in RandomIterator(10):
    print(y)

Пример итератора перебирающего пары элементов:
class DoubleElementListIterator:
    def __init__(self, lst):
        self.lst = lst
        self.i = 0

    def __next__(self):
        if self.i < len(self.lst):
            self.i += 2
            return self.lst[self.i - 2], self.lst[self.i - 1]
        else:
            raise StopIteration


class MyList(list):
    def __iter__(self):
        return DoubleElementListIterator(self)

for pair in MyList([1, 2, 3, 4]):
    print(pair)

Ошибки и исключения в Python

Все ошибки в языке Python делятся на два типа:
  • синтаксические ошибки;
  • исключения - ошибки, которые возникают в процессе исполнения кода.

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

Ошибки также являются объектами и поэтому у любой ошибки есть тип:
  • IndexError - мы пытались взять индекс, которого нет в списке.
  • NameError - это такая ошибка, которая встречается, когда мы не можем найти имя в пространстве имен.
  • TypeError - мы вероятно передали в какую-нибудь функцию, что-нибудь неправильного типа.

Ошибка хранит в себе состояние стека вызова на тот момент, когда совершилась ошибка.

Полиморфизм и переопределение методов в ООП на Python


Переопределение метода родителя

Метод с таким же именем как в одном из родительских классов:


Может возникнуть необходимость вызывать этот метод так как-будто он неопределен в нашем классе, а определен в каком-то из родительских. Для этого есть функция super, которая принимает два аргумента: класс родителей которого мы хотим проверить и объект с которым мы хотим ассоциировать метод. Запись super(MyListm, self).pop() эквивалентна записи list.pop(self).

Наследование классов в языке Python


Синтаксис



Расширение функционала стандартного списка:


Как структурировать Python-код


Неймспейсы

В процессе работы мы создаем имена и связываем с ними какие-то объекты.

Пространство имен - это сопоставление имен переменных, функций, классов и реальных объектов в оперативной памяти.


Множество ссылок от все имен до объектов называется пространством имен.

В любой момент времени можно спросить у пространства имен, а связан ли с конкретным именем какой-нибудь объект.

Каждый вызов функции сопровождается созданием нового пространства имен.

Первое пространство имен создается, когда мы запускаем интерпретатор. Это пространство имен builtins содержит в себе встроенные функции и классы: 
  • int, str, float, bool;
  • max, abs, id, ...

Второе пространство имен, которое создается это пространство main. Оно является глобальным и содержит в себе те имена, которые объявлены на самом верхнем уровне кода.

x не попадет в глобальный namespace. Тело функции не исполняется, когда мы его определяем. Тело функции исполняется, когда мы вызываем эту функцию. Однако даже, когда мы вызовем функцию, x не будет лежать в глобальном неймспейсе. При вызове функции создается локальный неймспейс.

Локальные пространства имен не создаются, когда мы используем условный оператор или циклы:
x = 13
if x % 2 == 1:
 x += 1
print(x) #4
Внутри цикла for создается имя, которое попадает в текущий неймспейс:
for i in range(5):
 x = i * i

print(x) # 16
Как делать не нужно:
for i in []:
 y = i * i
print(y) # NameError

Функции в языке Python

Хорошей практикой структурирования кода является написание функций.

Синтаксис:
def function_name(argument1, argument2):
 # function body
 return argument1 + argument2
x = function_name(2, 8)
y = function_name(x, 21)
print(y)
Отступ в четыре пробела в теле функции является важным.
Имена переменных в языке Python, в том числе имена функций и имена аргументов могут содержать в себе только латиницу, цифры и символ нижнего подчеркивания. И при этом не могут начинаться с цифры.

Определение функции не выполняется интерпретатором построчно, а выполняется целиком.

Функции в языке Python также являются объектами:


Объект функции хранит в себе очень много всего: название функции, аргументы и тело функции.


Пример:
def list_sum(lst):
 result = 0
 for element in lst:
  result += element
 return result

def sum(a, b):
 return a + b

y = sum(14, 29)
z = list_sum([1, 2, 3])
print(y)
print(z)

Операторы и выражения в Python


Оператор присваивания

С левой стороны находит имя переменной, а с правой стороны находится объект:
имя = (что-то)

Оператор присваивания запоминает за именем переменной из левой части идентификатор объекта из правой части.

x = 4Переменная x ссылается на объект 4, который будет создан в памяти.

y = x
y
ссылается на тот же объект, что и x.

Представление данных в языке Python


Всё в Python - есть объекты

Объект - это абстракция для данных. Объект - это некоторый контейнер в памяти, который содержит данные.

Все данные в языке Python представлены объектами и отношениями между объектами:
a = 1
b = 2
c = [a, b]
В языка Python у любого объекта есть три обязательные вещи: идентификатор, тип и значение. Тип и идентификатор объекта не изменяются в течение жизни объекта.

Никакие два объекта в один момент времени не обладают одинаковым идентификатором.

>>> x = [1, 2, 3]
>>> print(id(x))
51747776
>>> print(id([1, 2, 3]))
51756528

Идентификатор объекта - это какое-то число.

Переменная в языке Python - это всего лишь ссылка на объект. Значение переменной это всегда значение объекта.

>>> x = [1, 2, 3]
>>> y = x
>>> print(y is x)
True
>>> x.append(4)
>>> print(x)
[1, 2, 3, 4]
>>> print(y)
[1, 2, 3, 4]

append изменяет (изменяемый) объект, конкатенация создает новый. В следующем коде идет переопределение переменной t, а не объекта, на который ссылается s.
>>> x = [1, 2, 3]
>>> y = x
>>> y.append(4)
>>> s = "123"
>>> t = s
>>> t = t + "4"
>>> print(str(x) + " " + s)
[1, 2, 3, 4] 123


У любого объекта есть тип, который определяет, что можно сделать с объектом. Тип определяет поведение объекта и возможные принимаемые значения для объекта. Тип объекта не меняется в течение жизни объекта. Узнать тип объекта можно с помощью функции type():
>>> x = [1, 2, 3]
>>> type(x)
<class 'list'>
>>> type(4)
<class 'int'>
>>> type(type(x))
<class 'type'>
list - это стандартный тип отвечающий за список в языке Python. Типы в языке Python также являются объектами. Тип типа x - это класс type.

Ввод-вывод в Python

Стандартные потоки ввода и вывода

Чтобы считать одно число из стандартного потока ввода, можно использовать, например, следующий код:
n = int(input())

Пример программы, которая принимает последовательность чисел и выводит их сумму:
n = int(input())
count = 0 total= 0 while (count < n): count = count + 1 total = total + int(input()) print(total)


Интерпретация и исполнение кода на Python

Язык Python является интерпретируемым языком.

>>> x = [10, 2, 5, 7]
>>> x.sort()
>>> print(x)
[2, 5, 7, 10]
>>> fib = lambda x : 1 if x <= 2 else fib(x - 1) + fib(x - 2)
>>> fib(31)

Важным аспектом интерпретирования является то, что у нас нет никакой промежуточной стадии между самим кодом и его исполнением.

Для того чтобы исполнить код из файла необходимо передать его аргументом в интерпретатор:
python3 test.py

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

Язык Python это на самом деле набор соглашений между программистом и интерпретатором. Программист говорит, исполни такую-то инструкцию, я от тебя ожидаю того-то и того-то. Пути совершения этой инструкции у интерпретатора могут быть разные. Число интерпретаторов языка Python не так уж и мало. Некоторые детали могут быть верны только лишь для одного интерпретатора, например для CPython.