In [ ]:
%%html
<style>
.text_cell_render * {
   font-family: OfficinaSansCTT;
}
.reveal code {
    font-family: OfficinaSansCTT;
}
.text_cell_render h3 {
   font-family: OfficinaSansCTT;
}
.reveal section img {
    max-height: 500px;
    margin-left: auto;
    margin-right: auto;
}
</style>

Повторим немного пройденное

* Зачем нужен virtualenv?
* Какой командой ставится пакет Python?
* Чем ipython отличается от python?
* Что такое PEP8?
* Как импортировать и вызвать функцию из стороннего модуля?
* Что делает конструкция ниже?

In [ ]:
b = [
    a ** 3 for a in range(-10, 10)
    if a % 3 == 0
]

In [ ]:
b2 = []
for a in range(-10, 10):
    if a % 3 == 0:
        b2.append(a ** 3)
b2

Разбор задачи 1

https://py.checkio.org/mission/even-last/


In [ ]:
def checkio(arr):
    if not arr:
        return 0
    return sum(arr[::2]) * arr[-1]

Разбор задачи 2

https://py.checkio.org/mission/secret-message/

1. Нам не надо разбивать строку на слова, достаточно пройти по всем символам.
2. Как определить, что символ (строка) в верхнем регистре?

In [ ]:
def find_message(s):
    return "".join([
        ch for ch in s if ch.isupper()
    ])

In [ ]:
def find_message(s):
    msg = ""
    for ch in s:
        if ch.isupper():
            msg += ch
    return msg

In [ ]:
find_message("hello world!")

In [ ]:
def checkio(num):
    res = 1
    for digit in str(num):
        if digit != "0":
            res *= int(digit)
    return res

In [ ]:
def most_frequent(strings):
    d = {}
    for s in strings:
        if s in d:
            d[s] += 1
        else:
            d[s] = 1
    mx = 1
    res = strings[0]
    for k, v in d.items():
        if v > mx:
            mx = v
            res = k
    return res

In [ ]:
from collections import Counter

def most_frequent(strings):
    return Counter(strings).most_common(1)[0][0]

In [ ]:
most_frequent(["foo", "bar", "lol", "foo", "lol", "foo"])

Работа с файлами


In [ ]:
with open("test.txt", "w") as testfile:  # открываем на запись
    testfile.write("Немного текста\n")
    
with open("test.txt", "r") as testfile2:  # открываем на чтение
    a = testfile2.read()
    print(a)
    
with open("test.txt", "r") as testfile3: # еще бывают "rw", "rb", "wb", "a+" и т.д.
    for line in testfile3:
        print(line.split(" ")[0])

In [ ]:
with open("test.txt", "w") as testfile:  # открываем на запись
    testfile.write("Немного текста\n")

Система контроля версий Git

https://github.com/enchantner/python-zero

  • Скачать Git для Windows: https://git-scm.com/downloads
  • Скачать репозиторий с кодом:
    • git clone git@github.com:enchantner/python-zero.git
  • Скачать свежие обновления:
    • cd python-zero
    • git pull
  • Откатить изменения, если команда выше не работает:
    • git reset --hard HEAD
  • Добавить файлы для отслеживания
    • git add /path/to/file.txt
  • Зафиксировать изменения:
    • git commit -m "what's changed"
  • Залить изменения:
    • git push

Больше встроенных модулей!

* os - https://docs.python.org/3/library/os.html
* shutil - https://docs.python.org/3/library/shutil.html
* sys - https://docs.python.org/3/library/sys.html
* subprocess - https://docs.python.org/3/library/subprocess.html

In [ ]:
import os

In [ ]:
# os.listdir("/path/to/dir")
os.getcwd()  # текущий каталог
os.mkdir("testdir")   # создать каталог
os.rmdir("testdir")   # удалить пустой каталог 
os.makedirs("testdir/some_dir/some_other_dir")  # создаем сразу дерево каталогов
os.remove("test.txt")  # удалить файл, аналог os.unlink("test.txt")

In [ ]:
os.remove("test.txt")  
print(os.listdir("."))

In [ ]:
import shutil

In [ ]:
shutil.copytree("testdir", "otherdir")  # скопировать дерево целиком
shutil.rmtree("otherdir")   # удалить непустой каталог со всеми данными
shutil.copyfile("test.txt", "test2.txt") # скопировать файл
shutil.move("test2.txt", "test3.txt")  # переместить файл или каталог

In [ ]:


In [ ]:
import sys

In [ ]:
sys.argv  # список аргументов, с которыми вызвана команда. Первый - сама команда.
sys.stdin  # поток ввода
sys.stdout  # поток вывода
sys.stderr  # поток ошибок

In [ ]:


In [ ]:
import subprocess

In [ ]:
proc = subprocess.Popen("ls", stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE)
outs, errs = proc.communicate()
print(outs)
print(errs)

In [ ]:

Форматы данных - JSON

{
  "glossary": {
    "title": "example glossary",
    "GlossDiv": {
      "title": "S",
      "GlossList": {
        "GlossEntry": {
          "ID": 572,
          "SortAs": "SGML",
          "GlossTerm": "Standard Generalized Markup Language",
          "Acronym": "SGML",
          "Abbrev": "ISO 8879:1986",
          "GlossDef": {
            "para": "A meta-markup language, used to create markup languages such as DocBook.",
            "GlossSeeAlso": [
              "GML",
              "XML"
            ]
          },
          "GlossSee": "markup"
        }
      }
    }
  }
}

In [ ]:


In [ ]:
import json

d = json.loads(a)    # превратить строку в словарь
# print(d['glossary']['GlossDiv'])
s = json.dumps(d)   # превратить словарь обратно в строку

Форматы данных - YAML

pip install pyyaml

-  nikolay:
    name: Nikolay Markov
    job: Senior Data Engineer
    skills:
      - python
      - go
      - scala
-  vasily:
    name: Vasily Poupkine
    job: Product Manager
    skills:
      - talk
      - eat
      - sleep

In [ ]:
import yaml
a = ...
yaml.load(a)

Форматы данных - HTML

pip install bs4 lxml

<html>
    <body>
        <div class="container">
            <h2 align='center'>header</h2>
            <section>Some text here</section>
        </div>
        <ul>
            <li class="first">First choice</li>
            <li>Second choice</li>
        </ul>
    </body>
</html>

In [ ]:
from bs4 import BeautifulSoup as BS

text = """<html>
    <body>
        <div class="container">
            <h2 align='center'>Some cool text</h2>
            <section>Some text here</section>
        </div>
        <ul>
            <li class="first">First choice</li>
            <li>Second choice</li>
        </ul>
    </body>
</html>"""
soup = BS(text, "lxml")

In [ ]:
# soup.find_all("li")[0].text
soup.find("div", {"class": "container"}).find("h2", {"align": "center"}).text

Достаем содержимое сайта

pip install requests


In [ ]:
import requests

resp = requests.get("http://python.org")

In [ ]:

Задача на парсинг

Давайте достанем текст превью к первой новости на сайте http://python.org


In [ ]:

На дом

* Настроить Git, скачать репозиторий
* Почитать про регулярные выражения, подробно обсудим на следующем занятии
* https://py.checkio.org/mission/non-unique-elements/
* https://py.checkio.org/mission/absolute-sorting/
* https://py.checkio.org/mission/x-o-referee/

In [ ]: