Майкл доусон программирование на python: Программируем на Python. Майкл Доусон

Содержание

Книга «Программируем на Python» / Блог компании Издательский дом «Питер» / Хабр

Привет, Хаброжители! Вы наверняка слышали о книге Майкла Доусона (Michael Dawson), в которой он учит языку программирования Python тем же самым путем, то есть через программирование несложных игр. Учиться, создавая свои собственные развлекательные программы.

Несмотря на развлекательный характер примеров, демонстрируется вполне серьезная техника программирования. Ниже приведен отрывок из главы «Объектно-ориентированное программирование. Игра «Блек-джек»»

Знакомство с игрой «Блек-джек»


Проект, над разработкой которого мы потрудимся в этой главе, представляет собой упрощенную версию карточной игры «Блек-джек». Игровой процесс идет так: участники получают карты, с которыми связаны определенные числовые значения — очки, и каждый участник стремится набрать 21 очко, но не больше. Количество очков, соответствующих карте с цифрой, равно ее номиналу; валет, дама и король идут за 10 очков, а туз — за 1 или 11 (в зависимости от того, как выгоднее для игрока).

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

Затем каждому игроку по очереди предоставляется возможность тянуть дополнительные карты. Игрок может брать их из перемешанной колоды до тех пор, пока ему угодно и пока сумма очков на руках у него не превысила 21. При превышении, которое называется перебором, участник проигрывает. Если все перебрали, то компьютер выводит свою вторую карту и начинает новый раунд. Если же один или несколько участников остались в игре, то раунд еще не закончен. Дилер открывает свою вторую карту и, по общему правилу «Блек-джека», тянет дополнительные карты для себя до тех пор, пока сумма его очков не будет равна 17 или больше. Если дилер, в нашем случае — компьютер, совершает перебор, то победу одерживают все участники, оставшиеся в игре. Если нет, то сумма очков каждого из участников сравнивается с очками, которые набрал компьютер. Набравший больше очков (человек или компьютер) побеждает. При одинаковой сумме очков объявляется ничья между компьютером и одним или несколькими участниками.

Игровой процесс отражен на рис. 9.1.

Отправка и прием сообщений


Объектно-ориентированная программа — это своего рода экологическая система, в которой объекты — живые организмы. Чтобы поддерживать биоценоз в порядке, его обитатели должны взаимодействовать; так же происходит и в ООП. Программа не может быть полезна, если объекты в ней не взаимодействуют каким-либо удачно заданным способом. В терминах ООП такое взаимодействие называется отправкой сообщений. На практике объекты всего лишь вызывают методы друг друга. Это хотя и не совсем вежливо, но, во всяком случае, лучше, чем если бы объектам пришлось напрямую обращаться к атрибутам друг друга.

Знакомство с программой «Гибель пришельца»


Программа изображает ситуацию из компьютерной игры, в которой игрок стреляет в инопланетного агрессора. Все буквально так и происходит: игрок стреляет, а пришелец умирает (но, правда, успевает напоследок произнести несколько высокопарных слов). Это реализовано с помощью посылки сообщения от одного объекта другому. Результат работы программы отражен на рис. 9.2.

Говоря технически, программа создает hero — экземпляр класса Player и invader — экземпляр класса Alien. При вызове метода blast() объекта hero с аргументом invader этот объект вызывает метод die() объекта invader. Другими словами, когда герой стреляет в пришельца, это значит, что объект «герой» посылает объекту «пришелец» сообщение с требованием умереть. Этот обмен сообщениями показан на рис. 9.3.

Код этой программы вы можете найти на сайте-помощнике (courseptr.com/downloads) в папке Chapter 9. Файл называется alien_blaster.py:

# Гибель пришельца
# Демонстрирует взаимодействие объектов
class Player(object):
        """ Игрок в экшен-игре. """
        def blast(self, enemy):
             print("Игрок стреляет во врага.\n")
             enemy.die()
class Alien(object):
        """ Враждебный пришелец-инопланетянин в экшен-игре. """
        def die(self):
             print("Тяжело дыша, пришелец произносит: 'Ну, вот и все. Спета моя песенка. \n" \
            "Уже и в глазах темнеет… Передай полутора миллионам моих личинок, что я любил их… \n" \
            "Прощай, безжалостный мир.'")
# Основная часть программы
print("\t\tГибель пришельца\n")
hero = Player()
invader = Alien()
hero.blast(invader)
input("\n\nНажмите Enter, чтобы выйти.")

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


Прежде чем один объект сможет послать сообщение другому, надо, чтобы объектов было два! Столько их и создано в основной части моей программы: сначала объект класса Player, с которым связывается переменная hero, а потом объект класса Alien, с которым связывается переменная invader.

Интересное происходит в строке кода, следующей за этими двумя. Командой hero.blast(invader) я вызываю метод blast() объекта hero и передаю ему как аргумент объект invader. Изучив объявление blast(), вы можете увидеть, что этот метод принимает аргумент в параметр enemy. Поэтому при вызове blast() его внутренняя переменная enemy ссылается на объект класса Alien. Выведя на экран текст, метод blast() командой enemy.die() вызывает метод die() объекта Alien. Таким образом, по существу, экземпляр класса Player посылает экземпляру класса Alien сообщение, которым вызывает его метод die().

Прием сообщения


Объект invader принимает сообщение от объекта hero закономерным образом: вызывается метод die() и пришелец умирает, сказав самому себе душераздирающее надгробное слово.

Сочетание объектов


Обычно в жизни сложные вещи строятся из более простых. Так, гоночную автомашину можно рассматривать как единый объект, который, однако, составлен из других, более простых объектов: корпуса, двигателя, колес и т. д. Иногда встречается важный частный случай: объекты, представляющие собой наборы других объектов. Таков, например, зоопарк, который можно представить как набор животных. Эти типы отношений возможны и между программными объектами в ООП. К примеру, ничто не мешает написать класс Drag_Racer, представляющий гоночный автомобиль; у объектов этого класса будет атрибут engine, ссылающийся на объект Race_Engine (двигатель). Можно написать и класс Zoo, представляющий зоопарк, у объектов которого будет атрибут animals — список животных (объектов класса Animal). Сочетание объектов, как в этих примерах, позволяет строить сложные объекты из простых.

Знакомство с программой «Карты»


В программе «Карты» объекты представляют отдельные игральные карты, которыми можно воспользоваться для любой из игр от «Блек-джека» до «Подкидного дурака» (в зависимости от того, каковы ваши вкусы и денежные активы). Далее в той же программе строится объект «рука» (Hand), представляющий набор карт одного игрока; это не что иное, как список объектов-карт. Результат работы программы показан на рис. 9.4.

Я буду разбирать код небольшими порциями, однако вы можете ознакомиться и с целой программой на сайте-помощнике (www.courseptr.com/downloads) в папке Chapter 9. Файл называется playing_cards.py.

Создание класса Card


Первым делом в этой программе я создаю класс Card, объекты которого будут представлять игральные карты.
# Карты
# Демонстрирует сочетание объектов
class Card(object):
        """ Одна игральная карта. """
        RANKS = ["A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"]
        SUITS = ["c", "d", "h", "s"]
        def __init__(self, rank, suit):
             self.rank = rank
             self.suit = suit
        def __str__(self):
             rep = self.rank + self.suit
             return rep

У каждого объекта класса Card есть атрибут rank, значение которого — достоинство карты. Атрибут класса RANKS содержит все возможные значения: туз («A»), карты с номиналами от 2 до 10, валет («J»), дама («Q») и король («K»). У каждой карты есть также атрибут suit, представляющий масть карты. Все его возможные значения содержит атрибут класса SUITS: «c» (clubs) — трефы, «d» (diamonds) — бубны, «h» (hearts) — червы и, наконец, «s» (spades) — пики.

Например, объект со значением rank, равным «A», и значением suit, равным «d», представляет бубновый туз. Значения этих двух атрибутов, соединенных в единую строку, возвращает для вывода на печать специальный метод __str__().

Создание класса Hand


Следующее, что я должен сделать в программе, — создать класс Hand, экземпляры которого будут представлять наборы объектов-карт:
class Hand(object):
        """ 'Рука': набор карт на руках у одного игрока. """
        def __init__(self):
             self.cards = []
        def __str__(self):
             if self.cards:
                rep = ""
                for card in self.cards:
                     rep += str(card) + " "
             else:
                rep = "<пусто>"
             return rep
        def clear(self):
             self.cards = []
        def add(self, card):
             self.cards.append(card)
        def give(self, card, other_hand):
             self.cards.remove(card)
             other_hand.add(card)

У нового объекта класса Hand появляется атрибут cards, представляющий собой список карт. Таким образом, атрибут единичного объекта — список, который может содержать сколь угодно много других объектов.

Специальный метод __str__() возвращает одной строкой всю «руку». Метод последовательно берет все объекты класса Card и соединяет их строковые представления. Если в составе объекта Hand нет ни одной карты, то будет возвращена строка <пусто>.

Метод clear() очищает список карт: атрибут «руки» cards приравнивается к пустому списку. Метод add() добавляет объект к списку cards. Метод give() удаляет объект из списка cards, принадлежащего данной «руке», и добавляет тот же объект в набор карт другого объекта класса Hand (для этого вызывается его метод add()). Иными словами, первый объект Hand посылает второму объекту Hand сообщение: добавить в атрибут cards данный объект Card.

Применение объектов-карт


В основной части программы я создаю и вывожу на экран пять объектов класса Card:
# основная часть
card1 = Card(rank = "A", suit = "c")
print("Вывожу на экран объект-карту:")
print(card1)
card2 = Card(rank = "2", suit = "c")
card3 = Card(rank = "3", suit = "c")
card4 = Card(rank = "4", suit = "c")
card5 = Card(rank = "5", suit = "c")
print("\nВывожу еще четыре карты:")
print(card2)
print(card3)
print(card4)
print(card5)

У первого из созданных экземпляров класса Card атрибут rank равен «A», а атрибут suit — «c» (туз треф). На экране этот объект отображается в виде Ac; вид других карт аналогичен.

Сочетание объектов-карт в объекте Hand


Теперь я создам экземпляр класса Hand, свяжу его с переменной my_hand и выведу информацию о нем на экран:
my_hand = Hand()
print("\nПечатаю карты, которые у меня на руках до раздачи:")
print(my_hand)

Поскольку атрибут cards этого объекта пока равен пустому списку, на экране будет напечатано .

Добавлю в my_hand пять объектов класса Card и снова выведу объект на экран:

my_hand.add(card1)
my_hand.add(card2)
my_hand.add(card3)
my_hand.add(card4)
my_hand.add(card5)
print("\nПечатаю пять карт, которые появились у меня на руках:")
print(my_hand)

На экране отобразится текст Ac 2c 3c 4c 5c.

А сейчас я создам еще один экземпляр класса Hand под названием your_hand. Применив к my_hand метод give(), передам из «своей руки» в «вашу руку» две карты и затем выведу содержимое обеих «рук» на экран:

your_hand = Hand()
my_hand.give(card1, your_hand)
my_hand.give(card2, your_hand)
print("\nПервые две из моих карт я передал вам.")
print("Теперь у вас на руках:")
print(your_hand)
print("А у меня на руках:")
print(my_hand)

Как и следовало ожидать, your_hand имеет вид Ac 2c, а my_hand — 3c 4c 5c.

В конце программы я вызову метод clear() объекта my_hand и напечатаю его на экране еще раз:

my_hand.clear()
print("\nУ меня на руках после того, как я сбросил все карты:")
print(my_hand)
input("\n\nНажмите Enter, чтобы выйти.")

Закономерно отображается .

Создание новых классов с помощью наследования


Одна из ключевых идей ООП — наследование. Благодаря ему можно основать вновь создаваемый класс на существующем, причем новый класс автоматически получит (унаследует) все методы и атрибуты старого. Это как если бы за весь тот объем работы, который ушел на создание первоначального класса, не пришлось платить!

Расширение класса через наследование


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

Вообразим, например, что ваш класс Drag_Racer задает объект — гоночный автомобиль с методами stop() и go(). Можно на его основе создать новый класс, описывающий особый тип гоночных машин с функцией очистки ветрового стекла (на скорости до 400 км/ч о стекло будут все время биться насекомые). Этот новый класс автоматически унаследует методы stop() и go() от класса Drag_Racer. Значит, вам останется объявить всего один новый метод для очистки ветрового стекла, и класс будет готов.

» Более подробно с книгой можно ознакомиться на сайте издательства
» Оглавление
» Отрывок

Для Хаброжителей скидка 25% по купону — Python

Книга «Программируем на Python.» автора Доусон Майкл

 
 

Программируем на Python.

Автор: Доусон Майкл Жанр: Программирование Язык: русский Год: 2014 Издатель: ООО Издательство «Питер» ISBN: 978-1435455009 Город: Санкт-Петербург Статус: Закончена Добавил: Admin 5 Апр 18 Проверил: Admin 5 Апр 18 Формат:  PDF (51575 Kb)


Рейтинг: 0.0/5 (Всего голосов: 0)

Аннотация

Эта книга — идеальное пособие для начинающих изучать Python. Руководство, написанное опытным разработчиком и преподавателем, научит фундаментальным принципам программирования на примере создания простых игр. Вы приобретете необходимые навыки для разработки приложений на Python и узнаете, как их применять в реальной практике. Для лучшего усвоения материала в книге приведено множество примеров программного кода. В конце каждой главы вы найдете проект полноценной игры, иллюстрирующий ключевые идеи изложенной темы, а также краткое резюме пройденного материала и задачи для самопроверки. Прочитав эту книгу, вы всесторонне ознакомитесь с языком Python, усвоите базовые принципы программирования и будете готовы перенести их на почву других языков, за изучение которых возьметесь.  Научитесь программировать на Python играючи!

Объявления

Где купить?



Нравится книга? Поделись с друзьями!

Другие книги автора Доусон Майкл

Похожие книги

Комментарии к книге «Программируем на Python.»


Комментарий не найдено

Чтобы оставить комментарий или поставить оценку книге Вам нужно зайти на сайт или зарегистрироваться

 

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


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

Задание №1

  1. # Задание: Написать программу симулятор пирожка с "сюрпризом",

  2. #которая бы при запуске отображала один из пяти различных "сюрпризов",

  3. #выбранных случайным образом.

  4.  

  5. print("\t\t\t\tДобрый вечер!")

  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("\t\t\tЗдравствуй, игрок!")

  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("\n\nНажмите Enter, чтобы выйти из программы...")

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

Рейтинг: 4,66 / 5 (оценок: 34)

Категория: Знающим НЕ Python

Питер, 2019 год, 416 страниц

Эта книга — идеальное пособие для начинающих изучать Python. Руководство, написанное опытным разработчиком и преподавателем, научит фундаментальным принципам программирования на примере создания простых игр. Вы приобретете необходимые навыки для разработки приложений на Python и узнаете, как их применять в реальной практике.

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

Научитесь программировать на Python играючи!

Купить эту книгу в бумажном варианте:

Купить и скачать PDF-версию:

  • К сожалению, этой книги нет в электронном виде.

Вам также могут понравиться:

Все книги ➔ Знающим НЕ Python ➔ Программируем на Python

Доусон Майкл — Программируем на Python. — читать онлайн бесплатно

Тут можно читать онлайн книгу Доусон Майкл — Программируем на Python. — бесплатно полную версию (целиком). Жанр книги: Программирование. Вы можете прочесть полную версию (весь текст) онлайн без регистрации и смс на сайте Lib-King.Ru (Либ-Кинг) или прочитать краткое содержание, аннотацию (предисловие), описание и ознакомиться с отзывами (комментариями) о произведении.

Язык книги: Русский

Язык оригинальной книги: Английский

Издатель: ООО Издательство «Питер»

Город печати: Санкт-Петербург

Год печати: 2014

ISBN: 978-1435455009

Прочитал книгу? Поставь оценку!

Программируем на Python. краткое содержание

Программируем на Python. — описание и краткое содержание, автор Доусон Майкл, читать бесплатно онлайн на сайте электронной библиотеки Lib-King.Ru.

Эта книга — идеальное пособие для начинающих изучать Python. Руководство, написанное опытным разработчиком и преподавателем, научит фундаментальным принципам программирования на примере создания простых игр. Вы приобретете необходимые навыки для разработки приложений на Python и узнаете, как их применять в реальной практике. Для лучшего усвоения материала в книге приведено множество примеров программного кода. В конце каждой главы вы найдете проект полноценной игры, иллюстрирующий ключевые идеи изложенной темы, а также краткое резюме пройденного материала и задачи для самопроверки. Прочитав эту книгу, вы всесторонне ознакомитесь с языком Python, усвоите базовые принципы программирования и будете готовы перенести их на почву других языков, за изучение которых возьметесь.  Научитесь программировать на Python играючи!

Программируем на Python. — читать онлайн бесплатно полную версию (весь текст целиком)

Программируем на Python. — читать книгу онлайн бесплатно, автор Доусон Майкл

Поделиться книгой

Оставить отзыв

Книга «Программируем на Python» / Блог компании Издательский дом «Питер» / Хабр

Привет, Хаброжители! Вы наверняка слышали о книге Майкла Доусона (Майкл Доусон), которая учитывает программирование Python тем же путем, то есть через программирование несложных игр. Учиться, создавая свои собственные развлекательные программы.

Несмотря на развлекательный характер примеров, демонстрируется вполне серьезная техника программирования. Ниже приведен отрывок из главы «Объектно-ориентированное программирование.Игра «Блек-джек» »

Знакомство с игрой« Блек-джек »


Проект, над разработкой которого мы потрудимся в этой главе, представляет собой упрощенную версию карточной игры «Блек-джек». Игровой процесс идет так: участники получают карты, с одинаковыми значениями — очки, и каждый участник стремится набрать 21 очко, но не больше. Количество очков, соответствующей карте с цифрой, равно ее номиналу; валет, дама и король идут за 10 очков, а туз — за 1 или 11 (в зависимости от того, как выгоднее для игрока).

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

Затем каждому игроку по очереди предоставляется возможность тянуть дополнительные карты. Игрок может брать их из перемешанной колоды до тех пор, пока ему угодно и пока сумма очков в руках у него не превысила 21.При превышении, которое называется перебором, участник проигрывает. Если все перебрали, то компьютер выводит свою вторую карту и начинает новый раунд. Если же один или несколько участников остались в игре, то раунд еще не закончен. Дилер открывает свою вторую карту и, по общему правилу «Блек-джека», тянет дополнительные карты для себя до тех пор, пока сумма его очков не будет равна 17 или больше. Если дилер, в нашем случае — компьютер, совершает перебор, то победу одерживают все участники, оставшиеся в игре.Если нет, то сумма очков каждого из участников сравнивается с очками, которые набрал компьютер. Набравший больше очков (человек или компьютер) побеждает. При одинаковой сумме очков объявляется ничья между компьютером и одним или используемым участником.

Игровой процесс отражен на рис. 9.1.

Отправка и прием сообщений


Объектно-ориентированная программа — это своего рода экологическая система, в которой есть объекты — живые организмы. Чтобы поддерживать биоценоз в порядке, его обитатели должны поддерживать связь; так же происходит и в ООП.Программа не может быть полезна, если объекты в ней не взаимодействуют каким-либо удачно заданным способом. В терминах ООП такое взаимодействие называется отправкой сообщений. На практике всего лишь используются методы друг. Это хотя и не совсем вежливо, но во всяком случае, лучше, чем если бы объектам пришлось обращаться напрямую к атрибутам друг друга.

Знакомство с программой «Гибель пришельца»


Программа изображает ситуацию из компьютерной игры, в которой игрок стреляет в инопланетного агрессора.Все буквально так и происходит: игрок стреляет, а пришелец умирает (но, правда, успевает напоследок произнести несколько высокопарных слов). Это реализовано с помощью посылки от одного объекта другому. Результат работы программы отражен на рис. 9.2.

Говоря технически, программа создает — экземпляр класса Player и invader — экземпляр класса Alien. При вызове метода blast () объекта hero с аргументом invader этот объект вызывает метод die () объекта invader. Другими словами, когда герой стреляет в пришельца, это значит, что объект «герой» посылает объекту «пришелец» сообщение с требованием умереть.Этот обмен сообщениями показан на рис. 9.3.

Код этой программы вы можете найти на сайте-помощнике (courseptr.com/downloads) в папке 9. Файл называется alien_blaster.py:

  # Гибель пришельца
# Демонстрирует взаимодействие объектов
класс Player (объект):
        "" "Игрок в экшен-игре." ""
        def blast (себя, враг):
             print ("Игрок стреляет во врага. \ n")
             Враг.die ()
класс Чужой (объект):
        "" "Враждебный пришелец-инопланетянин в экшен-игре."" "
        def die (self):
             print ("Тяжело дыша, пришелец произносит: 'Ну, вот и все. Спета моя песенка. \ n" \
            "Уже и в глазах темнеет… Передай полутора миллионам моих личинок, что я любил их… \ n" \
            "Прощай, безжалостный мир.")
# Основная часть программы
print ("\ t \ tГибель пришельца \ n")
герой = Игрок ()
invader = Чужой ()
hero.blast (захватчик)
input ("\ n \ nНажмите Enter, чтобы выйти.")
  

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


Прежде чем один объект сможет послать сообщение другому, надо, чтобы объектов было два! Столько их и создано в основной части моей программы: сначала объект класса Player, с которым связывается переменная герой, а потом объект класса Alien, с которым связывается переменная invader.

Интересное происходит в строке кода, следующей за этими двумя. Командой hero.blast (invader) я вызываю метод blast () объекта hero и передаю ему как аргумент объект invader. Изучив объявление можете увидеть, что этот метод принимает аргумент в параметр врага. Поэтому при вызове blast () его внутренняя переменная враг Ссылется на объект класса Alien. Выведя на экране текст, метод blast () командой enemy.die () вызывает метод die () объекта Alien. Таким образом, по существу, экземпляр класса Player посылает экземпляр класса Alien сообщение, которому вызывается его метод die ().

Прием сообщения


Объект захватчик принимает сообщение от объекта героя закономерным образом: вызывается умирает () и пришелец умирает, сказав самому себе душераздирающее надгробное слово.

Сочетание объектов


Обычно в жизни сложные вещи строятся из более простых. Так, гоночную автомашину можно рассматривать как единый объект, который, однако, составлен из других, более простых объектов: корпуса, двигателя, колес и т. д. Иногда встречается важный частный случай: объекты, представляющие собой наборы других объектов.Таков, например, зоопарк, который можно представить как набор животных. Эти типы отношений возможны и между программными объектами в ООП. К примеру, ничто не мешает написать класс Drag_Racer, представляющий гоночный автомобиль; у объектов этого класса будет атрибут engine, указанный на объект Race_Engine (двигатель). Можно написать и класс Zoo, представляющий зоопарк, у объектов которого будет атрибут animals — список животных (объекты класса Animal). Сочетание объектов, как в этих примерах, позволяет строить сложные объекты из простых.

Знакомство с программой «Карты»


В программе «Карты» объекты представлены отдельные игральные карты, которые можно использовать для любой из игр от «Блек-джека» до «Подкидного дурака» (в зависимости от того, каковы ваши вкусы и денежные активы). Далее в той же программе строится объект «рука», представляющий набор карт одного игрока; это не что, как список объектов-карт. Результат работы программы показан на рис. 9.4.

Я буду разбираться код небольшими порциями, однако вы можете ознакомиться и с целой программой на сайте-помощнике (www.courseptr.com/downloads) в папке 9. Файл называется plays_cards.py.

Создание класса Карта


Первым делом в этой программе я создаю класс Card, объекты которого будут представлять собой игральные карты.
  # Карты
# Демонстрирует сочетание объектов
класс Card (объект):
        "" "Одна игральная карта." ""
        РАНГИ = [«A», «2», «3», «4», «5», «6», «7», «8», «9», «10», «J», «Q» , "К"]
        КОСТЮМЫ = ["c", "d", "h", "s"]
        def __init __ (я, ранг, масть):
             я.ранг = ранг
             self.suit = костюм
        def __str __ (сам):
             rep = self.rank + self.suit
             возвратиться
  

У каждого объекта класса У карты есть атрибут ранга, значение которого — достоинство карты. Атрибут класса RANKS содержит все возможные значения: туз («A»), карты с номиналами от 2 до 10, валет («J»), дама («Q») и король («K»). У каждой карты есть также атрибут костюм, представляющий масть карты. Все его возможные значения содержат атрибут класса КОСТЮМЫ: «c» (трефы) — трефы, «d» (бубны) — бубны, «h» (червы) — червы и, наконец, «s» (пики).

Например, объект со значением rank, равным «A», и значением, равным «d», представляет бубновый туз. Значения этих двух атрибутов, соединенных в единую строку, возвращает специальный метод __str __ ().

Создание класса Hand


Следующее, что я должен сделать в программе, — создать класс Hand, экземпляры которого будут представлены наборы объектов-карт:
 Класс  Hand (объект):
        "" "'Рука': набор карт на руках у одного игрока." ""
        def __init __ (сам):
             я.карты = []
        def __str __ (сам):
             если self.cards:
                rep = ""
                для карты в self.cards:
                     rep + = str (карточка) + ""
             еще:
                rep = "<пусто>"
             возвратиться
        def clear (self):
             self.cards = []
        def add (self, card):
             self.cards.append (карта)
        def give (self, card, other_hand):
             self.cards.remove (карта)
             other_hand.add (карточка)
  

У нового объекта класса Рука представляет карты, представляющий собой список карт.Таким образом, атрибут единичного объекта — список, который может содержать сколь угодно много других объектов.

Специальный метод __str __ () возвращает одной строкой всю «руку». Метод последовательно берет все объекты класса Карточка и соединяет их строковые представления. Если в составе объекта Hand нет ни одной карты, то будет возвращена строка <пусто>.

Метод clear () очищает список карт: атрибут «руки» карты приравнивается к пустому списку. Метод добавления () объекта к списку карт.Метод give () удаляет объект из списка карт, принадлежащий данной «руке», и тот же объект вызывает набор карт другого объекта класса Hand (для этого вызывается его метод add ()). Иными словами, первый объект «Рука» посылает второму объекту сообщение: добавить в атрибут карты данный объект карты.

Применение объектов-карт


В части я создаю и вывожу на экран пять объектов класса Карточка:
  # основная программа
card1 = Card (ранг = "A", масть = "c")
print ("Вывожу на экран объект-карту:")
печать (card1)
card2 = Card (ранг = "2", масть = "c")
card3 = Card (rank = "3", suit = "c")
card4 = Card (ранг = "4", масть = "c")
card5 = Card (rank = "5", suit = "c")
print ("\ nВывожу еще четыре карты:")
печать (card2)
печать (card3)
печать (card4)
печать (card5)
  

У первого из созданных экземпляров класса Атрибут ранга равен «A», атрибут костюма — «c» (туз треф).На экране этот объект отображается в виде Ac; вид других карт аналогичен.

Сочетание объектов-карт в объекте Рука


Теперь я создам экземпляр класса Hand, свяжу его с образцом my_hand и выведу информацию о нем на экране:
  my_hand = Hand ()
print ("\ nПечатаю карты, которые у меня на руках раздачи:")
печать (my_hand)
  

Ателье карты этого объекта пока равен пустому списку.

Добавлю в my_hand пять объектов класса Карта и снова выведу объект на экран:

  my_hand.добавить (card1)
my_hand.add (card2)
my_hand.add (card3)
my_hand.add (card4)
my_hand.add (card5)
print ("\ nПечатаю пять карт, которые появились у меня в руках:")
печать (my_hand)
  

На изображении текст Ac 2c 3c 4c 5c.

А сейчас я создам еще один экземпляр класса Hand под названием your_hand. Применив к my_hand метод give (), передам из «своей руки» в «вашу руку» две карты и выведу текст обеих «рук» на экран:

  your_hand = Hand ()
my_hand.give (card1, your_hand)
моя рука.дай (card2, your_hand)
print ("\ nПервые две из моих карт я передал вам.")
print ("Теперь у вас на руках:")
печать (ваша_ рука)
print ("А у меня на руках:")
печать (my_hand)
  

Как и следовало ожидать, your_hand имеет вид Ac 2c, а my_hand — 3c 4c 5c.

В конце программы я вызову метод clear () объекта my_hand и напечатаю его на экране еще раз:

  my_hand.clear ()
print ("\ nУ меня на руках после того, как я сбросил все карты:")
печать (my_hand)
input ("\ n \ nНажмите Enter, чтобы выйти.")
  

Закономерно отображается.

Создание новых классов с помощью наследования


Одна из ключевых идей ООП — наследование. Благодаря ему можно основать вновь создаваемый класс на существующем, новый класс автоматически получает (унаследует) все методы и атрибуты старого. Это как если бы за весь тот объем работы, который ушел на создание собственного класса, не пришлось платить!

Расширение класса через наследование


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

Вообразим, например, что ваш класс Drag_Racer задает объект — гоночный автомобиль с методами stop () и go (). Можно на его основе создать новый класс, описывающий особый тип гоночных машин с функцией очистки ветрового стекла (на скорости до 400 км / ч о стекло будут все время биться насекомыми).Этот новый класс автоматически унаследует методы stop () и go () от класса Drag_Racer. Значит, вам останется объявить всего один новый метод для очистки ветрового стекла, и класс будет готов.

»Более подробно с книгой можно ознакомиться на сайте издательства
»Оглавление
»Отрывок

Для Хаброжителей скидка 25% по купону — Python

.

Python: Задачи и решения (Глава 1. Начало работы. Программа Game Over).

Продолжаем учиться программированию. После второй главы в книге: Майкл Доусон «Программируем на Python», 2014 (Майкл Доусон «Программирование на Python для абсолютного новичка», 3-е издание), где я изучил особенности работы с текстом на языке программирования Python, предложены задания. Давайте выполнять их вместе. Я приведу свой вариант решения, а вы пишите ваши варианты в комментариях.

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

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

 name = input ('Твое имя? \ N')
print ('Уважаемый', имя)
print (введите («Нажмите Enter для выхода»)) 

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

 print ('\' Просто иди! \ '')
print ('(c) Кот') 

Эта запись была размещена на Python.Добавьте в закладки постоянную ссылку. .

Программирование для НЕпрограммистов / Блог компании SkillFactory / Хабр

Предлагаем вашему вниманию подборку материалов от python.org о том, с чего начать первые шаги в программировании.


Если Вы никогда не занимались программированием раньше, эти материалы для вас. Данные туториалы не предполагают, что у вас есть какой-то опыт. (Если у вас уже есть опыт программирования, Руководство для начинающих).

Книги


Каждую из этих книг можно купить онлайн или скачать.

Интерактивные курсы


На этих сайтах вы можете получить мгновенную обратную связь по проблемам, испытывающим, в процессе обучения.
  • CheckiO — это геймифицированный веб-сайт, обеспечивающий выполнение задач по программированию, которые можно решить на Python 3.
  • Python на Codecademy — портал для обучения.
  • Code the Blocks объединяет программирование на Python с трехмерной средой, в которой вы можете размещать блоки и строить структуры.Также вы найдете там учебные пособия, которые постепенно научат Вас создавать сложные 3D-структуры.
  • Computer Science Circles содержит 30 уроков, 100 упражнений. На сайте есть встроенный чат, куда ученик может обратиться за помощью к учителю. Общение в чате происходит на голландском, французском, немецком и литовском языках.
  • DataCamp Python Tutorial. В отличие от других учебных пособий по Python, этот 4-часовой учебный курс от DataCamp фокусируется на Python для Data Science.Он содержит 57 интерактивных упражнений и 11 видеоуроков.
  • Finxter. Насколько хороши Ваши навыки Python? Более 300 отобранных головоломок на Python для тестов и тренировок.
  • Как думать как компьютерный ученый: интерактивное издание — это интерактивное переосмысление книги Элкнера, Дауни и Майера с визуализацией и звуковыми пояснениями.

Ресурсы для младших школьников


  • Собери «Пыпет».Изучите основы программирования на Python, создавая тамагочи в стиле «Pypet» от Татьяны Тилоски.
  • Guido van Robot Учебный инструмент, в котором учащиеся учащиеся простые программы с использованием языка, похожего на управление моделируемым роботом. Проект включает план обучения, так как прошел испытания в средней школе Йорктауна.
  • Python для детей от Джейсона Р. Бриггса. Книга с примерами кода и головоломками.
  • PythonTurtle обучающая среда на Python, подходящая для начинающих и детей.Ресурс ориентирован преимущественно на детей, но, как известно, успешно используется взрослыми.
  • Учебник для молодых программистов Это полный текст учебника, который ежегодно преподается в PyCon (Северная Америка), с примерами и упражнениями. Это учебное пособие дает базовые навыки и выстраивает работу со сложной логикой и играми. Подходит детям от 10 лет и начинающим взрослым.
  • Самостоятельный курс Python 3 от Webucator свободно использовать для домашнего обучения школьники и студенты старше 13 лет.Исходя из нашего опыта, обучающиеся этого возраста усваивают материал так же быстро, как и взрослые новички в программировании.

Учебники и сайты


  • Байт Python от К. Сварупа подойдет для людей, не имеющего опыта программирования.
    Читать Укус питона (на русском).
  • Учебное пособие по программированию в нерабочее время на Python 3. Этот учебник создан для того, чтобы научить основам языка программирования на Python и объяснить, как создать веб-приложения.
  • Ask Python Учебник по Python для совсем начинающих.
  • Classpert — Python — большая коллекция покупных и платных онлайн-курсов Python от разных авторов.
  • Hackr.io — лучшие уроки и курсы Python от сообщества программистов.
  • Практическое руководство по Python — Python, графика и простые клиент / серверные основы взаимодействия (с видеоуроками).
  • Обучение программированию Введение в программирование для тех, кто никогда раньше не программировал, от Алана Голда.В приложении представлено несколько языков программирования, но особое внимание уделено Python (Python 2 и 3).
  • Letsfindcourse `Python: лучшие учебники и курсы по Python, рекомендованные экспертами.
  • Учебник Wikibooks для непрограммистов по Python руководство по Python для НЕпрограммистов от Джоша Кольяти.
  • Изучите Python Вводное руководство для начинающих о Python (с последующим углубленным изучением).
  • Обучение программированию Алана Голда
  • Python tips — это блог, который включает в себя советы по Python и учебники для начинающих и профессиональных программистов.
  • Python Tutorial в комплекте документации Python. Написано не для НЕ программмистов, но дает представление о вкусе и стиле языка.
  • Обширный учебник Python-Course.eu для начинающих — учебник для начинающих с большим количеством иллюстраций.
  • Pythonspot Tutorials учебники по Python для разных уровней.
  • The Python Guru — руководство для начинающих программистов.
  • Лучшие курсы по изучению Python — руководства по Python, представленные и оцененные разработчиками Python (с топом лучших).

Учебники для научной аудитории


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

Видео


  • Python 3 видео уроки для начинающих
  • Руководства по программированию на Python для начинающих: установка, ИСР (IDE), переменные, функции, строки, списки, ООП (ООП).
  • Подкаст
  • Young Programmers содержит видео уроки на Python, Pygame, Jython, Scratch, Alice, Java и Scala.

Инструменты


  • Thonny — интегрированная среда разработки для новичков.



Узнайте подробности, как получить востребованную профессию с нуля или Level Up по навыкам и зарплате, пройдя онлайн-курсы SkillFactory:

Читать еще


.