Архив метки: Python

Видеоуроки курса Python 2015

Курс ориентирован на людей, уже знакомых с каким-либо языком программирования, например, Java или C++.

Лектор: Сергей Лебедев.

Домашние задания

Рекомендации к оцениванию домашних заданий. Оценивать по двум критериям: корректность и идиоматичность, то есть решение должно правильно работать и соответствовать руководству по стилю.

Хорошие книги про Python

  1. David M. Beazley, Python Essential Reference, 2009.
  2. Mark Lutz, Learning Python, 5th edition, 2013 (значительная часть 4-го издания также будет релевантной).
  3. David M. Beazley, Brian K. Jones, Python Cookbook, 3rd edition, 2013.

Лекция 1. Начало.

Кто, когда и зачем придумал язык Python. Интерпретаторы языка. Синтаксис языка с высоты птичьего полёта. Интерактивная оболочка IPython.

Дополнительные материалы

Лекция 2. Всё, что вы хотели знать о функциях в Python.

Синтаксис объявления функций. Упаковка и распаковка аргументов. Ключевые аргументы и аргументы по умолчанию. Распаковка и оператор присваивания. Области видимости, правило LEGB, операторы global и nonlocal. Функциональное программирование, анонимные функции. Функции map, filter и zip. Генераторы списков, множеств и словарей. Немного о PEP 8.

Дополнительные материалы

Лекция 3. Декораторы и модуль functools.

Синтаксис декораторов. Декораторы с аргументами, без аргументов. Примеры использования декораторов. Модуль functools.

Дополнительные материалы

Лекция 4. Строки, байты, файлы и ввод/вывод.

Строковые литералы и сырые строки. Строки и Юникод. Основные методы работы со строками. Модуль string. Байты. Кодировки. Файлы и файловые объекты. Методы работы с файлами. Модуль io.

Дополнительные материалы

Лекция 5. Встроенные коллекции и модуль collections.

И снова встроенные коллекции: кортеж, список, множество, словарь — обход в глубину, обзор методов, примеры. Почти всё про модуль collections: именованные кортежи, счётчики, defaultdict, OrderedDict.

Дополнительные материалы

Лекция 6. Классы 1.

Синтаксис объявления классов. Атрибуты, связанные и несвязанные методы, __dict__, __slots__< /code>. Статические методы и методы класса. Свойства, декоратор @property. Наследование, перегрузка методов и функция super. Декораторы классов. Магические методы.

Дополнительные материалы

Лекция 7. Исключения и менеджеры контекста.

Исключения, зачем они нужны и как их обрабатывать. Встроенные исключения и базовые классы BaseException и Exception. Операторы try...except..else..finally. Менеджеры контекста и модуль contextlib.

Дополнительные материалы

Лекция 8. Итераторы, генераторы и модуль itertools.

Два протокола итераторов: __next__ + __iter__ и __getitem__. Итераторы и цикл for, а также операторы in и not in. Генераторы, оператор-выражение yield. Генераторы как: итераторы, сопрограммы, менеджеры контекста. Модуль itertools.

Дополнительные материалы

Лекция 9. Модули, пакеты и система импорта.

Модули. Операторы import и from ... import. Пакеты. Относительный и абсолютный импорт. __init__-фасад. И снова оператор import - обход в глубину.

Дополнительные материалы

Лекция 10. Классы 2.

Дескрипторы: что-как-зачем. Конструктор __new__, класс type и метаклассы. Наследование встроенных типов. Модули abc и collections.abc.

Дополнительные материалы

Лекция 11. Тестирование.

Зачем тестировать? Тестирование в интерпретаторе и доктесты. Модуль unittest. Пакет py.test - на порядок лучше. Тестирование свойств и пакет hypothesis.

Дополнительные материалы

Лекция 12. Быстрее, Python, ещё быстрее.

Измерение времени работы кода на Python с помощью модулей timeit, cProfile и line_profiler. Немного о NumPy. JIT и AOT компиляция кода на Python на примере Numba и Cython.

Дополнительные матер

Motor 0.5

Мы строили-строили и наконец построили.

Motor 0.5 (асинхронный драйвер для MongoDB) доехал до релиза.

Новая версия работает с asyncio.
Всем рекомендую

Автор: Andrew Svetlov

uvloop — альтернатива стандартному asyncio loop

В последнее время Юра Селиванов (ага, тот самый автор PEP-492 aka async/await и MagicPython) работал над тем чтобы сделать asyncio побыстрее.

Он взял libuv и построил с её помощью uvloop — asyncio совместимый event loop.

Результаты замера производительности здесь.

Получается, что uvloop в 3.5 раза быстрее стандартного и в 1.25 раза обгоняет gevent.
Т.е. абсолютный победитель по скорости в мире Python.

Библиотека пока еще не имеет стабильной версии, скоро всё будет.

Автор: Andrew Svetlov

Майкл Доусон — Программируем на Python, ответы на 4-ую главу…

Майкл Доусон — Программируем на Python.

Ответы на 4-ую главу.

Задание №1

# coding=utf-8
# Программа считает числа из заданного интервала, значения которых задает пользоваетель.

itog = int(«0»)
first = int(input(«Введите начальное значение: «))
last = int(input(«Введите последнее значение: «))
interval = int(input(«Введите интервал между 
целыми  числами: «
))
last += 1
for i in range(first, last, interval):
    itog += i
print(«Сумма введеных вами чисел: «, itog)
input(«nnВведите Enter, чтобы выйти…»)

Задание №2

# coding=utf-8
# Программа, которая принимает текст
 пользовательского ввода и печатает его наоборот

message = str(input(«Введите любой текст и вы
 получите его наоборот: «
))
new_message = «»
for i in message[::-1]:
    new_message += i
print(«А вот ваш новый текст:», new_message)
input(«nnНажмите Enter, чтобы выйти из программы…»)

Задание №3

  1. # coding=utf-8
  2. import random
  3.  
  4. # Создадим последовательность слов, из которых компьютер будет выбирать
  5. WORDS = («питон»,
  6.          «анаграмма»,
  7.          «простая»,
  8.          «сложная»,
  9.          «ответ»,
  10.          «подстаканник»)
  11.  
  12. # случайным образом выбираем из последовательности одно слово
  13. word = random.choice(WORDS)
  14.  
  15. # Создадим переменную, с которой будет сопоставлена версия игрока
  16. correct = word
  17.  
  18. # Создаем переменную и подсказку, которая будет появляться при запросе игрока «Не знаю»
  19. i_dont_know = «Не знаю»
  20. podskazka = word[0] + word[1] + word[2]
  21.  
  22. # создаем анаграмму выбранного слова, в которой буквы будут расставлены хаотично
  23. jumble = «»
  24. while word:
  25.     position = random.randrange(len(word))
  26.     jumble += word[position]
  27.     word = word[:position] + word[(position + 1):]
  28.  
  29. # Создаем очки для игроков. Те, кто не использовал подсказку, получают больше.
  30. scores = 10
  31.  
  32. # Начало игры
  33. print(
  34.     «»»
  35.                                      Добро пожаловать в игру 'Анаграммы'!
  36.                         Надо переставить буквы так, чтобы получилось осмысленное слово.
  37.                                
    Если вам нужна подсказка введите: «Не знаю».
  38.            Но учтите, если вы не будете использовать подсказку, кол-во заработанных очков будет больше.
  39.                             (Для выхода нажмите Enter, не вводя своей версии.)
  40.     «»»
  41. )
  42. print(«Вот анаграмма: «, jumble)
  43. guess = input(«nПопробуйте отгадать исходное слово: «)
  44. while guess != «» and guess != correct:
  45.     if guess != correct and not guess == i_dont_know:
  46.         print(«К сожалению, вы неправы.»)
  47.     if guess == i_dont_know:
  48.         scores —= 5
  49.         print(«nПодсказка! Первые три буквы слова!», podskazka)
  50.     guess = input(«Попробуйте отгадать исходное слово: «)
  51.     if guess == correct:
  52.         print(«Да, именно так! Вы отгадали!n«)
  53.  
  54. # Если игрок слишком часто использовал подсказку (что странно, ведь она одна и та же), избегаем отрицательного значения
  55. # приводя к нулю
  56. if scores < 0:
  57.     scores = 0
  58. print(«Спасибо за игру! У вас», scores, «очков!»)
  59. input(«nnНажмите Enter, чтобы выйти…»)

Задание №4

  1. # coding=utf-8
  2. import random
  3. # Создадим последовательность слов, из которых компьютер будет выбирать
  4. WORDS = («питон»,
  5.          «анаграмма»,
  6.          «простая»,
  7.          «сложная»,
  8.          «ответ»,
  9.          «подстаканник»)
  10.  
  11. # случайным образом выбираем из последовательности одно слово
  12. word = random.choice(WORDS)
  13.  
  14. print(«ttЗдравствуй игрок!»)
  15. print(«Попробуй угадать с пяти попыток слово, которое загадал компьютер.»)
  16. print(«Ты можешь спрашивать, есть ли определенная буква в слове. А потом скажешь слово.»)
  17. print(«Итак, поехали!»)
  18. print(«nКоличество букв в слове:», len(word))
  19.  
  20. # Цикл отгадывания букв
  21. tries = 5
  22. letter = ()
  23. while tries >= 1:
  24.     letter = str(input(«В загаданном слове есть буква: «))
  25.     if letter not in word:
  26.         tries —= 1
  27.         print(«nВы ошиблись, такой буквы нет в слове!»)
  28.         print(» У вас осталось», tries, «попыток(ки)!»)
  29.     if letter in word:
  30.         tries —= 1
  31.         print(«nВы угадали, эта буква есть в слове!»)
  32.         print(«У вас осталось», tries, «попыток(ки)!»)
  33.  
  34. # Вторая часть отгадывания.
  35. i_dont_know = «Не знаю»
  36. print(«nВаши 5 попыток закончились, вы готовы угадать слово?»)
  37. print(«Если вы сдались и не хотите продолжать, напишите 'Не знаю'.»)
  38. correct = (input(«nЭто слово: «))
  39.  
  40. while correct != word:
  41.     print(«Попробуйте еще раз!»)
  42.     correct = (input(«nЭто слово: «))
  43.     if correct == word:
  44.         print(«nПоздравляю! Вы выиграли!»)
  45.     if correct == i_dont_know:
  46.         print(«nОчень жаль!»)
  47.         break
  48.  
  49. input(«nНажмите Enter, чтобы выйти…»)

Автор: Alek Azimov

Майкл Доусон — "Программируем на Python", ответы на задания 3-ой главы…

Майкл Доусон — Программируем на Python. Ответы на задания 3 главы.

Задание №1

  1. # Задание: Написать программу симулятор пирожка с "сюрпризом",
  2. #которая бы при запуске отображала один из пяти различных "сюрпризов",
  3. #выбранных случайным образом.
  4.  
  5. print("ttttДобрый вечер!")
  6. print("Вы, как 100-ый клиент за день, получаете пирожок с секретной начинкой!")
  7. print("У нас 5 секретных начинок, и мы не знаем какая вам достанется. Удачи!n")
  8.  
  9. import random
  10. stuffing = random.randint(1, 5)
  11. if stuffing == 1:
  12. print("Вам попалась начинка с рисом и яйцом! Поздравляю!")
  13.  
  14. elif stuffing == 2:
  15. print("Вам попалась начинка с курагой! Поздравляю!")
  16.  
  17. elif stuffing == 3:
  18. print("Вам попалась начинка с картошкой! Поздравляю!")
  19.  
  20. elif stuffing == 4:
  21. print("Вам попалась начинка с сосиской! Поздравляю!")
  22.  
  23. elif stuffing == 5:
  24. print("Вам попалась начинка с салатом! Поздравляю!")
  25.  
  26. else:
  27. print("Что-то сломалось наверное, приходите за призом завтра...")
  28.  
  29. input("Нажмите Enter, чтобы покинуть розыгрыш...")
  30.  

Задание №2

  1. #Дом. задание: Написать программу, которая бы "подбрасывала" условную монету
  2. #100 раз и сообщала, сколько раз выпала "решка" или "орел".
  3.  
  4. import random
  5. print("Сейчас программа 'подбросит' монетку и подсчитает сколько раз выпадет")
  6. print("'решка', или 'орел'.")
  7.  
  8. reshka = 0
  9. orel = 0
  10. kol_podbros = 0
  11.  
  12. while kol_podbros != 100:
  13. podbros = random.randint(1, 2)
  14.  
  15. if podbros == 1:
  16. orel += 1
  17. else:
  18. reshka += 1
  19. kol_podbros += 1
  20.  
  21. print("nОрлов выпало: ", orel)
  22. print("Решек выпало: ", reshka)

Задание №3

  1. # Игра "отгадай число"
  2.  
  3. import random
  4.  
  5. print("tДобро пожаловать в игру 'Отгадай число'!")
  6. print("Компьютер загадал натуральное число из диапазона от 1 до 100.")
  7. print("Вам нужно угадать его за максимум 5 попыток.n")
  8.  
  9. # Начальные значения
  10. the_number = random.randint(1, 100)
  11. guess = int(input("Ваше предположение: "))
  12. tries = 1
  13.  
  14. # Цикл отгадывания
  15. while guess != the_number:
  16. if guess > the_number:
  17. print("Меньше...")
  18. elif guess < the_number:
  19. print("Больше...")
  20. if guess > the_number and tries >= 6:
  21. print("Соберись, тряпка!")
  22. elif guess < the_number and tries >= 6:
  23. print("Неудачник!")
  24.  
  25. guess = int(input("nВаше предположение: "))
  26. tries += 1
  27.  
  28. print("nПоздравляю! Вам удалось отгадать число!")
  29. print("вы затратили всего лишь", tries, "попытки(ок)!")
  30. if tries >= 6:
  31. print("nВсего лишь", tries, "попытки(ок)), Карл?! Да ты издеваешься?")
  32.  
  33. input("nНажмите Enter, чтобы покинуть игру...")

Задание №4

  1. # coding=utf-8
  2.  
  3. print("tttЗдравствуй, игрок!")
  4. print("Тебе предстоить сыграть с компьютером в 'Числа'.")
  5. print("Надо загадать число от 1 до 100, а компьютер попытается отгадать его.")
  6. number = int(input("Введите загаданное число: "))
  7.  
  8. # Задаем начальные значения и задаем первую попытку угадывания, задействуя метод Хартли.
  9. # То есть делим интервал угадывания наполовину, чтобы быстрей добраться до искомого числа.
  10. computer_number = 50
  11. tries = 1
  12. low = 1
  13. high = 100
  14. print(computer_number)
  15.  
  16. # Цикл отгадывания
  17. while computer_number != number:
  18. if computer_number > number:
  19. high = computer_number # Задаем загаданное число верхней границей интервала
  20. # Продолжаем делить полученный интервал наполовину.
  21. computer_number = computer_number - ((high-low)//2)
  22. print(computer_number)
  23. elif computer_number < number:
  24. low = computer_number # Задаем загаданное число нижней границей интервала
  25. computer_number = computer_number + ((high-low)//2)
  26. print(computer_number)
  27. tries += 1
  28.  
  29. print("Компьютер потратил", tries, "попытки(ок) на отгадывание твоего числа.")
  30. input("nnНажмите Enter, чтобы выйти из программы...")

Автор: Alek Azimov

Майкл Доусон — "Программируем на Python", ответы на задания 2-ой главы…

Ответы на задания 2-ой главы.

Первое устное задание рассматривать не будем.

 

Задача №2
Напишите программу, в окно которой пользователь сможет ввести названия двух своих любимых блюд. Программа должна сцеплять две эти строки и выводить полученную строку, как название нового, невиданного блюда.
name1 = input("Введите первое свое любимое блюдо: ")
name2 = input("Введите второе свое любимое блюдо: ")
print("nА теперь, внимание! Я придумал блюдо, которое объединяет ваше оба любимых: ")
print(name1+name2)
input("nnВведите Enter, чтобы выйти из приложения...")
 
Задача №3
Напишите программу "Щедрый посетитель", в окно которой пользователь сможет ввести сумму счета за обед в ресторане. Программа должна выводить два значения: чаевые из расчета 15% и 20% от указанной суммы.
print("Здравствуйте, уважаемый посетитель стриптиз-клуба 'Вертихвостка'!")
# Не могу удержаться. Процитируем Гарри Гаррисона :-)
print("Наш девиз: ЗАХОДИТЕ К НАМ, ЗАСРАНЦЫ, ЖДУТ ВАС ВЫПИВКА И ТАНЦЫ!")
print("Вас приветствует приложение для подсчета чаевых для официантки,")
print("которая, обслуживала вас.")
check = int(input("nДля начала введите сумму счета в долларах (без центов): "))

# Рассчитываем чаевые по американской системе
tip_good = check / 100 * 20
tip_bad = check / 100 * 10
print(«nЕсли вам понравилось обслуживание, то оставьте официантке «,tip_good, «долларов»)
print(«Если же нет, то оставьте «, tip_bad, «долларов»)

input(«nnНажмите Enter, чтобы закрыть приложение…»)

 
Задача №4
Напишите программу «Автодилер», в окно которой пользователь сможет ввести стоимость автомобиля без наценок. Программа должна прибавлять к ней несколько дополнительных сумм: налог, регистрационный сбор, агентский сбор, цена доставки машины по месту назначения.Пусть налог и регистрационный сбор вычисляются как доля от начальной с тоимости, а остальные наценки будем считать фиксированным величинами. Окончательная цена автомобиля должна быть выведена на экран.

 

print("Здравствуйте! Вас приветствует приложение автоцентра Audi.")
print("Вводя стоимость автомобиля, мы расчитаем вам окончательную цену")
print("автомобиля со всеми наценками с каждым подпунктом")
price = int(input("nВведите стоимость автомобиля: "))

nalog = price / 100 * 13
print(«nНалог: «, nalog, «рублей»)

reg_sbor = price / 100 * 3
print(«nРегистрационный сбор: «, reg_sbor, «рублей»)
print(«nАгентский сбор: «, 10000, «рублей»)
print(«nДоставка машины: «, 5000, «рублей»)

full = price + nalog + reg_sbor + 10000 + 5000
print(«nnИтого: «, full, «рублей»)

print(«nnБлагодарим за покупку!»)
input(«Введите Enter, чтобы закрыть приложение…»)

 
P.S. За наглядный листинг кода спасибо сайту highlight.hohli.com.
P.P.S. Все разъезжается по швам.

Автор: Alek Azimov