Архив рубрики: Python

Майкл Доусон — Программируем на 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

Программирование — обучение и тренировка

Предыстория

Впервые с программированием я столкнулся в 5 классе. В то время (1996 год) в школах еще было очень мало компьютеров и компьютерных классов, и многие школьники изучали информатику как чисто теоретический предмет.
Мне в этом плане очень повезло, в нашем лицее было достаточно машин для проведения уроков информатики даже в младших классах. В то время было невозможно сразу обучать детей реальному языку программирования (даже простому, типа BASIC). Сейчас это звучит странно, но в 96 году около 5-10% учащихся имели дома компьютер. Для развития наших алгоритмических навыков нам предложили особенную игру – Исполнитель Муравей. Это был простейший интерпретатор с элементарными задачами для детей. Работал он из под DOS.
Выглядело это примерно так:
Как и любому ребенку, мне нравились игры. А в особенности компьютерные игры. Думаю эта игра была одним из тех импульсов, которые и привели меня в будущем в класс с углубленным компьютерным обучением.

Кому все это надо?

Но вернемся в 2015. В современном мире появилось масса специальных программ, вебсайтов и других ресурсов направленных как на обучение детей, так и просто на обучение всех желающих различным языкам программирования.
Сегодня мы обойдем вопрос обучения детей программированию и сосредоточимся на ресурсах, которые позволяют людям уже умеющим программировать на базовом уровне, попрактиковать свои навыки, научиться новым языкам или технологиям, или посоревноваться с другими программистами.
Первый вопрос, который задает себе человек, перед тем как начать что-то делать – а зачем все это надо? Представьте себе молодого человека, которые решил на досуге повысить свои навыки программирования. В школе ему рассказывали какие-то базовые вещи и он даже писал простейшие программы. Но это было давно и он уже ничего не помнит. Что делать?
Конечно, можно пойти в магазин, купить книжку и засесть ее изучать. В большинстве случаев вы приобретете что-то вроде книги Б. Страуструпа “Язык программирования c++”, после которой в лучшем случае решите, что программирование это не ваше признание, а в худшем больше никогда в жизни не станете программировать. Отмечу, что я не считаю книгу Страуструпа плохой. Просто она совершенно не подходит для обучения языку, она скорее является отличным справочным материалом.

В чем плюс?

Те сайты, про которые я пишу сегодня, предлагают удобный интерактивный формат, который дает вам ряд преимуществ. По этому поводу, я даже слайдик для презентации делал:
Начну рассказывать с последнего пункта:
Для обучения доступен любой живой язык программирования. Будь то Javascript, C#, Java, Ruby, Python и многие многие другие.
Эти сайты рассчитаны на любой уровень. От нулевого с расчетом на детскую аудиторию до серьёзных сайтов, где по результатам соревнований можно получить реальные деньги и реального заказчикам.
Геймификация. Отличная мотивация для большинства людей. Вы получите различные уровни, достижения, значки и так далее, которыми можно похвастаться знакомым.
Масса интересных практических заданий. На мой взгляд один из самых важных пунктов. Теория мертва без практики. А придумать самому себе хорошее задание на нужную тему не так то просто. Плюс многие школьные сайты грешат заданиями, которые являются скорее практикой математики, нежели информатики. Вычислять на первых этапах корни уравнений – скукота. И создатели сайтов это отлично понимают. Поэтому и готовят куда более интересные задания, частенько с различного рода графикой.
Соревнование. При достижении определенного результата, нам становится интересно сравнить себя с другими людьми. Узнать на сколько хорошо у нас все получается? В нас живет дух соперничества. И обучающие ресурсы позволяют нам соревноваться с другими учениками по множеству параметров, в том числе проводя различные олимпиады в

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

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

Объяснений тут не нужно, я полагаю.

Задача №1
Научитесь вызывать ошибку: в интерактивном режиме введите название своего любимого сорта мороженого. Потом исправьте ошибку и создайте команду, которая будет правильным образом выводить на экран название этого сорта мороженого.

print("Пломбир")

Задача №2Напишите и сохраните программу, которая будет выводить ваше имя и дожидаться, пока пользователь нажмет Enter для выхода. Запустите эту программу, дважды щелкнув на ее значке.

print("Альмир")

input(«nnНажмите Enter, для выхода…»)

 

Задача №3

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

print("Жить, как говорится, хорошо!")
print("А хорошо жить еще лучше!")
print("Авторы: Г. Вицин и Е. Моргунов")

input(«nnНажмите Enter, для выхода…»)

Автор: Alek Azimov

Абстрактные классы для коллекций

Пусть мы сделали какой-то класс для хранения набора данных. Например, настроек вида ключ -> значение:

class Settings:

def __init__(self):
self._data = {}

def add_property(self, key, value):
assert isinstance(key, str), key
self._data[key] = value

def get_property(self, key):
assert isinstance(key, str), key
return self._data[key]

И тут нам в голову приходит удачная идея, что было бы здорово вместо вызова settings.get_property('key') использовать квадратные скобки как для dict: settings['key']:

def __getitem__(self, key):
return self.get_property(key)

Что не так?
То, что наш класс стал отчасти походить на readonly dict (он же mapping) — но он не реализует весь предполагаемый контракт.
Так, я привык, что если класс похож на readonly dict, то он позволяет узнать количество элементов в нём. Добавляем __len__:

def __len__(self):
return len(self._data)

Всё ещё не хорошо. Для mapping обычно можно итерироваться по ключам. Добавление __iter__ решает проблему:

def __iter__(self):
return iter(self._data)

Всё? Нет! Хочется ещё проверять на наличие ключа: key in settingsdict ведь это позволяет!
Можем добавить метод __contains__ — а можем вспомнить, что есть класс collections.abc.Mapping.
Это абстрактный базовый класс, задающий контракт для неизменяемого словаря.
Описание того, что таке абстрактный базовый класс — здесь
Просто наследуемся от Mapping:

from collections.abc import Mapping

class Settings(Mapping):

# ...

В качестве бесплатного бонуса получам поддержку .get(), .keys(), .items(), .values(), __eq__ и __ne__.
Реализация этих методов не оптимальная с точки зрения производительности, но она уже есть из коробки. К тому же всегда можно добавть свой вариант, который будет работать быстрее стандартного (если мы знаем как это сделать).
Если мы забудем реализовать какой-то критически важный метод — при создании экземпляра класса получим исключение:

>>> settings = Settings()
TypeError: Can't instantiate abstract class Settings with abstract methods __iter__

В стандартной библиотеке есть большой набор абстрактных базовых классов:

  • ByteString
  • Callable
  • Container
  • Hashable
  • ItemsView
  • Iterable
  • Iterator
  • KeysView
  • Mapping
  • MappingView
  • MutableMapping
  • MutableSequence
  • MutableSet
  • Sequence
  • Set
  • Sized
  • ValuesView

Очень рекомендую изучить набор методов, реализуемых этими классами — помогает понять систему типов собственно Питона.
При необходимаости можно (и нужно) написать свои.
А в заключение забавный пример.
В библиотеке sqlalchemy есть класс RowProxy для строки-кортежа, получаемой в результате SQL запроса.
Класс выглядит как mapping: имеет длину, .keys(), .items(), .__contains__() и все прочие нужные методы. Позволяет получать значение как по позиционному номеру так и по названию колонки в базе данных.
При этом он реализует контракт Sequence (как у tuple).
Т.е. iter(row) возвращает данные, а не названия колонок. И это немного сбивает с толку: выглядит как утка, а крякает как поросёнок.
В оправдание sqlalchemy могу сказать, что RowProxy появился в самой первой версии алхимии, еще до того как в Питон добавили collections.abc. А потом что-то менять стало поздно.
Но сейчас при разработке собственных библиотек стоит придерживаться устоявшихся стандартов и активно применять абстрактные базовые классы для коллекций.

Автор: Andrew Svetlov