Использование списков в конструкторе __init__
Помогите разобраться с использованием списков, tuple, dictionaries при ООП.
В каких случаях применяют списки в методе — конструкторе?
1 2 3
class TestClass: def __init__(self): list = []
А в каких в глобальном фрэйме?
1 2 3 4
class TestClass: list = [] def __init__(self): pass
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
class Person: def __init__(self, name, age): self.name = name self.age = age self.known_persons = [] def know (self, person): if not person in self.known_persons: self.known_persons.append(person) else: print('<> уже знает человека по имени <>'.format(self.name, person.name)) def is_known(self, person): text_action = {True: 'знает человека по имени', False : 'не знает человека по имени'} is_known_person = person in self.known_persons print('<> <> <>'.format(self.name, text_action[is_known_person], person.name)) if __name__ == '__main__': anna = Person('Anna Ross', 25) cliff = Person('Cliff Birds', 45) jhon = Person('Jhon Smit', 37) anna.is_known(cliff) anna.know(cliff) anna.is_known(cliff) anna.know(cliff) anna.is_known(jhon) anna.know(jhon) anna.is_known(jhon) anna.know(jhon)
По возможности, объясните принцип действия на примере выше.
Списки в глобальном фрэйме применимы на практике?
Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Ошибка при загрузке Ubuntu 14.04 LTS: run-init: /sbin/init: Permission denied
Здравствуйте! На компьютере установлена Uuntu 14.04 LTS (64 bit). После установки cups (для.

Использование двоеточия в конструкторе
Товарищи помогите понять код. В книге Скотта Майерса есть такое описание метода класса: .
Использование this и base в одном конструкторе
Здравствуйте. Подскажите пожалуйста, как мне грамотно написать следующую конструкцию: public class.
Использование inherited в конструкторе класса
Добрый день. Есть небольшой вопрос. Вот в Delphi принято конструктор писать так, constructor.
Использование аргументов в конструкторе при объявлении массива — >
Здравствуйте. Мне нужен массив класса button. Короче: button but(1);//работает button.
Автоматизируй это!
![]()
7540 / 4556 / 1206
Регистрация: 30.03.2015
Сообщений: 13,118
Записей в блоге: 29
AlexMarkov, чем локальнее переменная, тем она безопаснее, меньше живет и быстрее работает (реально быстрее! в свое время после прочтения Бизли проводил измерения по его примеру, просто переход на локальные переменные дает прирост в скорости в некоторых случаях)
Сообщение от AlexMarkov 
по рукам линейкой, никогда и ничего не называй зарезервированными словами) a_list лучше, а еще лучше читаемое и понятное название тех сузностей, что в списке, например links
Сообщение от AlexMarkov 
class TestClass:
* * def __init__(self):
* * * * list = []
список локальный, после выхода из метода -умрет
Сообщение от AlexMarkov 
class TestClass:
* * list = []
* * def __init__(self):
* * * * pass
это переменная класса, к ней обращаться можно через TestClass.a_list, общий лист на все экземпляры, но для понимания советую тебе создать несколько экземпляров такого класса (хватит 2) и попробовать его изменить из экземпляров, а также приравнять [] или None в одном(!) из экземпляров — будет интересно.
Сообщение от AlexMarkov 
self.known_persons = []
а вот это уже стандартное поле объекта, у каждого свое, один е влияет на других, состояние короче.
Сообщение от AlexMarkov 
print(‘<> уже знает человека по имени <>‘.format(self.name, person.name))
сравни и используй
print(f' уже знает человека по имени ')
1727 / 967 / 199
Регистрация: 22.02.2018
Сообщений: 2,694
Записей в блоге: 6
AlexMarkov, Объясните пожалуйста, что Вы понимаете под словом «фрэйм», что бы не было разночтения.
А пока я разберусь с примерами, которые Вы выложили.
Автоматизируй это!
![]()
7540 / 4556 / 1206
Регистрация: 30.03.2015
Сообщений: 13,118
Записей в блоге: 29
Сообщение от AlexMarkov 
Списки в глобальном фрэйме применимы на практике?
ты про глобальный список в модуле или про переменную класса? в принципе оба варианта допустимы, но первый только если этот список несколькими классами/функциями используется (константы?), второй — общий список для всех объектов класса.
Добавлено через 20 минут
общее правило такое — делай как можно локальнее: список нужен только в методе?-пусть только там и живет.
Каждому классу свой нужен? -делай селф.листик
Нужен общий на все объекты? — выноси на уровень класса
Нужен для нескольких классов или функций? — глобальный на уровне модуля (вне класса)
1727 / 967 / 199
Регистрация: 22.02.2018
Сообщений: 2,694
Записей в блоге: 6

Сообщение было отмечено AlexMarkov как решение
Решение
AlexMarkov, Вам правильно написал Welemir1, что нельзя давать своим переменным имена ключевых слов. Так же он Вам правильно объяснил про локальную переменную, что она может использоваться только в пределах функции или метода где она определена, для каких то внутренних нужд метода.
Метод __init__ служит для инициализации атрибутов у создаваемых классом экземпляров. Поэтому локальная переменная здесь не к месту. Отсюда можно сказать, что пример
1 2 3
class TestClass: def __init__(self): list = []
Добавлено через 15 минут
AlexMarkov, Кстати по поводу названий. Лутц в своих книгах называет метод __init__ конструктором. Некоторые считают такое название не правильным. Они называют метод __init__ инициализатором.
Мое мнение такое. Несомненно конструктором является класс, именно он создает экземпляры. Метод же __init__ создает атрибуты экземпляра. В какой то мере он продолжает конструирование экземпляра, начатую инструкцией class. Но учитывая, что разработчики питона дали такое название методу __init__, я для себя решил считать конструктором сам класс ( class() ), а метод __init__, учитывая его название и как предлагают некоторые программисты, называть инициализатором.
Поэтому читая у Лутца про «конструктор», я понимаю о чем он говорит, но для себя перевожу это в «инициализатор».
Я написал это для вас, потому , что в разных источниках Вы можете встретить и то и другое название метода __init__.
Добавлено через 55 минут
AlexMarkov, Вот тестирование и разбор второго примера.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
class TestClass: my_list = [1, 2, 3] # это атрибут класса, который добавляется и в экземпляры def __init__(self): pass if __name__ == '__main__': print(TestClass.my_list) # [1, 2, 3] объект, на который ссылка в атрибуте класса x = TestClass() print(x.my_list) # [1, 2, 3] объект, на который ссылка в атрибуте экземпляра TestClass.my_list = 11 # теперь атрибут класса имеет ссылку на объект 11 print(x.my_list) # 11 как мы видим значение которое мы получаем из атрибута экземпляра стало 11 # Вот здесь один тонкий момент заложенный в питон, и который я понял изучая дескрипторы. # атрибут экземпляра x.my_list, при создании получает ссылку на атрибут класса TestClass.my_list # который в свою очередь имеет ссылку на некоторый объект питона. Поэтому в данной строке мы и получаем ответ 11. x.my_list = 99 # но если атрибуту экземпляра напрямую присвоить некоторое значение, # то он уже будет иметь ссылку не на атрибут класса TestClass.my_list, а в данном случае # на объект 99. И все изменения в атрибуте класса, уже не будут отражаться # в атрибуте экземпляра. print(x.my_list) # 99 print(TestClass.my_list) # 11 y = TestClass() print(y.my_list) # 11
Если Вы не все поймете , что я написал в комментариях к коду, то не расстраивайтесь. Поймете это, когда начнете изучать дескрипторы. Если только будете их изучать.
А сейчас вам главное понять, что существуют атрибуты класса, это когда внутри класса присваиваются переменной(будущему атрибуту) некоторое значение.
И существуют атрибуты экземпляров, присваиваемые им при создании экземпляров.
Атрибуты экземпляров создаются внутри класса инструкцией присваивания с указанием self (это атрибуты только экземпляров), а так же атрибуты добавляемые экземпляру из атрибутов класса.
Кстати у конкретного экземпляра (а не у всех экземпляров оптом, как в классе) можно создать атрибут и за пределами класса инструкцией x.name_attr = obj.
Добавлено через 4 минуты
AlexMarkov, Третий пример, самый большой разберу позже. Сейчас у меня подходит очередь на сервере игры ВОВ.:)
99 / 86 / 20
Регистрация: 10.09.2019
Сообщений: 708
Сообщение от Welemir1 
по рукам линейкой, никогда и ничего не называй зарезервированными словами) a_list лучше, а еще лучше читаемое и понятное название тех сузностей, что в списке, например links
Welemir1, в данном случае использовал list именно как зарезервированное слово, т.к. приведенный код не является выдержкой из какой либо общей структуры, а является самодостаточным в данном конкретном случае (о том что зарезервированные слова не используют знаю.
Усвоил бы больше приведенной информации, если пояснения проходили по приведенному Примеру.
Сообщение от Viktorrus 
AlexMarkov, Объясните пожалуйста, что Вы понимаете под словом «фрэйм», что бы не было разночтения.
Viktorrus, под глобальным фрэймом в моем понимании входит и список в модуле и переменная класса (пока, надеюсь т.к. за недостатком времени не достаточно временного ресурса разбираться во «всей» терминологии, изучаю все аспекты пайтона, что конкретно необходимо, буду определяться в дальнейшем).
Если Вас интересует более конкретная информация можно прочитать здесь http://www.pythontutor.com/
Марка Лутца читаю параллельно изучая Python сейчас на c. 748-758, а так спасибо, жду дальнейших пояснений по данному вопросу.
Меня интересует использование списка в переменной класса, желательно, на «живом» примере. Например для хранения данных о пользователе и т.п.
Добавлено через 23 минуты
Viktorrus, отличное дополнение к изученному . жду .
60 / 86 / 16
Регистрация: 25.03.2019
Сообщений: 235
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
#!/usr/bin/env python3 # -*- coding: utf-8 -*- class Sample: value = 10 def __init__(self): self.value1 = 20 if __name__ == "__main__": ts1 = Sample() ts2 = Sample() # Переменная value1 у каждого объекта своя. Сейчас у них одинаковые значения. print(ts1.value1) print(ts2.value1) # Изменение переменных объекта. ts1.value1 = 50 ts2.value1 = 60 print(ts1.value1) print(ts2.value1) # Изменение переменной класса. Sample.value = 30 # Чтение переменной класса непосредственно из объектов. print(ts1.value) print(ts2.value)
Здесь смысл в областях видимости. В Python есть область видимости самого класса, и есть область видимости объекта. Когда вы создаете переменную непосредственно в области видимости класса, то значение этой переменной будет изменяться для всех объектов. Используется в том случае, если у вас, например, есть 10 объектов и нужно изменить какое-то одно значение для них всех.
То, что объявляется в конструкторе, относится только к объекту.
1727 / 967 / 199
Регистрация: 22.02.2018
Сообщений: 2,694
Записей в блоге: 6
AlexMarkov, В третьем примере метод know знакомит с человеком который передается в метод с помощью параметра person. И если не знаком, то заносит в список знакомых. Если же уже знаком, то сообщает об этом.
Метод is_known сообщает, знаком ли с человеком, который передается в метод параметром person.
Все действия и отношения осуществляются только над экземплярами класса Person (все рассматриваемые в примере люди принадлежат классу Person).
AlexMarkov, Так напишите, что Вам в этом примере не понятно?
Добавлено через 22 минуты
AlexMarkov, В принципе здесь рассматривается три свойства, которые присущи персонам (персоналу) из класса Person. Это name (имя), age (возраст), known_persons (список знакомых).
Список знакомых заполняется по ходу выполнения кода.
Я бы сделал немного по другому, дал бы возможность при создании экземпляра класса передавать через аргумент заполненный список тех знакомых, про которых мы знаем уже при создании экземпляра (персоны).
Тогда код выглядит так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
class Person: def __init__(self, name, age, known_persons = []): self.name = name self.age = age self.known_persons = known_persons def know (self, person): if not person in self.known_persons: self.known_persons.append(person) else: print('<> уже знает человека по имени <>'.format(self.name, person.name)) def is_known(self, person): text_action = {True: 'знает человека по имени', False : 'не знает человека по имени'} is_known_person = person in self.known_persons print('<> <> <>'.format(self.name, text_action[is_known_person], person.name)) if __name__ == '__main__': #anna = Person('Anna Ross', 25) cliff = Person('Cliff Birds', 45) jhon = Person('Jhon Smit', 37) anna = Person('Anna Ross', 25, [cliff]) #anna.is_known(cliff) #anna.know(cliff) anna.is_known(cliff) anna.know(cliff) anna.is_known(jhon) anna.know(jhon) anna.is_known(jhon) anna.know(jhon)
1727 / 967 / 199
Регистрация: 22.02.2018
Сообщений: 2,694
Записей в блоге: 6
AlexMarkov, еще дополню одним замечанием. Видимо Вас смутило, что в методе __init__ был задан атрибут known_persons, хотя его нет в параметрах этого метода. Так вот, в методе __init__ можно задавать любые атрибуты, а не только те, что присутствуют в методе в качестве параметров, и присваивать атрибутам можно любые объекты, в том числе и списки и словари и так далее.
99 / 86 / 20
Регистрация: 10.09.2019
Сообщений: 708
Viktorrus, прочитал еще раз главу 6 Марка Лутца «Интерлюдия о динамической типизации». Концепция Марка, что все сводится к переменным, объектам и ссылкам между ними, также применима к ООП?
И хотелось бы узнать Ваше мнение относительно упомянутых выше Yuri197, областей видимости (глава 17) применительно к ООП на этом же примере!
Я хочу узнать каким образом согласно данной концепции мне вести логическую цепочку относительно областей видимости указанных на рисунке 17.1 Правило LEGB? Спасибо!
Добавлено через 29 минут
А лучше было бы если бы Вы или читатели данной темы предложили свой вариант разъяснения на примере вот этого шаблона — заготовки игры в блэк джэк:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
from random import* # . - импортирование из модуля random класса random -- . # """ # Создаем список CARDS иммитирующий колоду карт # CARDS - имя глобальной переменной, = - операция присваивания, [] * 4 - объект списка # """ CARDS = [2, 3, 4, 5, 6, 7, 8, 9, 10,'Валет','Дама','Король','Туз'] * 4 class Game(): # """ # Имитация растасовки карт в случайном порядке # """ shuffle(CARDS) # """ # Функция метода коснтруктора (инициализатора) # """ def __init__(self): pass # """ # Функция концовки игры # """ def game_finished(self): pass # """ # Основная логика игры # """ def logic_game(self): pass # """ # Функция определения победителя # """ def pc_user_win (self): pass # """ # Функция вывода на экран # """ def prt(self): print(CARDS[]) print(len(CARDS)) # """ # Запуск игры # """ def main(self): pass # """ # Тестирование запуска и вывода на экран # """ if __name__ == "__main__": x = Game() x.prt()
Т.е. где лучше использовать список CARDS в глобальной, локальной (объемлющих функций), локальной(функция) областях видимости, может быть предложите логику самой игры и т.д. Или если я не по теме, могу создать новую.
Добавлено через 8 минут
Прошу не критиковать сам код, это только наработка для понимания концепции, важна Ваша точка зрения по данному вопросу.
1727 / 967 / 199
Регистрация: 22.02.2018
Сообщений: 2,694
Записей в блоге: 6
Сообщение от AlexMarkov 
Концепция Марка, что все сводится к переменным, объектам и ссылкам между ними, также применима к ООП?
Да. В питоне все, что относится к данным, это объекты. Все объекты размещаются в оперативной памяти компьютера, в виде некоторой области байтов. Объекты содержат в себе информацию о всем, что относится к этому объекту, включая информацию о типе объекта. Общаемся с объектами мы через переменные, которые содержат ссылки на эти объекты. Объект в памяти существует, пока на него есть хотя бы одна ссылка. Когда ссылок не остается, то объект идаляется из памяти компьютера. Это называется чисткой мусора, которая в С++ делается принудительно программистом, а в питоне она делается автоматически самим питоном.
Кроме обычных данных объектами в питоне являются так же и функции и классы и экземпляры классов.
При определении функции с помощью def, создается объект-функция и переменная (имя функции), которая содержит ссылку на объект функции.
Аналогично с классом. При определении класса инструкцией class, создается объект-класс, а так же переменная (имя класса), которая имеет ссылку на объект класса. Если определен class A(), то запись A() (без инструкции class), создает экземпляр класса, который может использоваться в выражении, но дольше не живет, если мы не присвоим его какой либо переменной ( то есть не создадим в переменной ссылку на этот объект-экземпляр класса x = A() ).
Это я пока что ответил только на первый Ваш вопрос. Как всегда подробно.
Продолжу отвечать в следующем комментарии.
Добавлено через 43 минуты
Сообщение от AlexMarkov 
И хотелось бы узнать Ваше мнение относительно упомянутых выше Yuri197, областей видимости (глава 17) применительно к ООП на этом же примере!
Сразу уточним Yuri197, класс называет классом, а экземпляр класса называет объектом. Но так как класс в питоне это тоже объект, то я, то что он называет объектом, буду называет экземпляром класса, чем он собственно и является, что бы не было путаницы с объектом-классом.
Итак, глава 17 посвящена функциям. И правило LEGB относится к функциям и к модулям, в которых размещаются функции.
Правило LEGB относится к «Областям видимости». В ООП Лутц вводит еще одно понятие, «Пространство имен», которое он также еще называет «Пакетом имен переменных». «Пакетом имен переменных» он называет модуль, а также класс. Вот что он пишет на стр. 704, рассказывая про классы.
«С фундаментальной точки зрения, классы – это действительно всего лишь пакеты функций и других имен, которые во многом напоминают модули. Однако автоматический поиск атрибутов в дереве наследования, который мы получаем при использовании классов, обеспечивает возможности по адаптации программного обеспечения более широкие, чем это возможно с помощью модулей и функций.»
При этом в ООП он периодически говорит о «Пространстве имен» класса и экземпляра класса.
Но это понятие он четко не объясняет. По крайней мере я для себя выяснил что такое «пространство имен» анализируя его тексты и экспериментируя.
Вот что я для себя выяснил.
«Области видимости переменных» для конкретного места в коде (конкретной строки в коде), это множество переменных, которые доступны для чтения (но при этом могут быть не доступны для записи).
«Пространством имен переменных» является множество переменных, которые доступны не только для чтения, но и для записи. И вот эту разницу с областью видимости нужно хорошо понимать.
Если объекты имеют не пересекающиеся пространства имен, то у них не может быть путаницы с переменными (конфликта имен). Все классы имеют свои изолированные пространства имен и каждый экземпляр класса имеет свое изолированное пространство имен. Причем области видимости объектов могут пересекаться, но если пространства имен не пересекаются, то конфликта имен быть не может, так как принадлежность к области видимости не достаточно, что бы писать в переменную (можно только читать).
Добавлено через 2 минуты
AlexMarkov, Так как рассмотрено несколько вопросов и большого материала к ним, то если я на что то не ответил, или в моем ответе не понятно, то спрашивайте.
Добавлено через 8 минут
AlexMarkov, Я не дал анализа Вашего кода игры в в блэк джэк. Попробую сделать это завтра. Если смогу, так как я не знаю этой игры.
Добавлено через 9 минут
AlexMarkov, В догонку. Конфликт имен может возникать, когда мы импортируем модуль с помощью инструкции for . import . Так как в этом случае происходит объединение пространств имен вызывающего модуля и вызываемого модуля. И если у них окажутся одинаковые имена, то произойдет конфликт имен, так как находясь в одном пространстве имен они обе будут доступны для записи и питон будет использовать первую попавшуюся переменную.
Что бы гарантированно избежать конфликта имен, когда такая опасность есть, нужно для импорта использовать инструкцию import .
В этом случае мы получаем квалифицированные имена с указанием импортированного модуля, что исключает возможность возникновения конфликта имен.
Или использовать классы и экземпляры классов, которые имеют свои собственные, изолированные пространства имен.
Viktorrus, пост от Viktorrus = «разжевал и рот положил».
| Меню пользователя @ Damenikx |
1727 / 967 / 199
Регистрация: 22.02.2018
Сообщений: 2,694
Записей в блоге: 6
AlexMarkov, Сразу предупреждаю, я игру блэк джэк не знаю. Поэтому могу дать комментарии только по форме, но не по алгоритму.
У меня вопрос, в игре блэк джэк масть карт имеет значение?
Если имеет, то строка
CARDS = [2, 3, 4, 5, 6, 7, 8, 9, 10,'Валет','Дама','Король','Туз'] * 4
не совсем удобна. Я бы разместил карты не в одном списке, а в четырех списках по мастям и уже эти списки вставил в базовый список.
Так проще было бы учитывать масть карты. Но в принципе можно учитывать масть и в Вашем варианте, с помощью смещения между мастями.
Вопрос, в какой области видимости располагать переменную CARDS? Скорее в глобальной. Но окончательно можно сказать построив алгоритм игры, которого я не знаю.
Сдаюсь. Не зная алгоритма игры, я вряд ли смогу, что то посоветовать.
Единственное, что я могу прокомментировать, это класс, который Вы создаете.
Класс создается тогда, когда вы используете множество экземпляров этого класса. Например Лутц создает класс Person, что бы работать с множеством служащих, являющихся экземплярами класса Persen. И часть этих служащих относятся к подклассу Manager, так как им присущи отличающие их особенности.
Вы создаете класс Game (игра). Вы что, в своем коде будите использовать набор разных игр? Или Вы хотите создать шаблон что бы разрабатывать в дальнейшем разные игры,, и использовать для этого Ваш шаблон Game?
Но разные игры настолько различаются, что Вы вряд ли сможете выявить общие для всех игр свойства, что бы поместить их в класс в качестве атрибутов экземпляров класса (игр).
Но как создавать структуру игры блэк джэк я подсказать не могу, так как не знаю этой игры, и потому не могу построить для нее ни алгоритм, ни структуру ООП.
Добавлено через 29 минут
AlexMarkov, Хотя можно использовать класс Game, если вы хотите собирать информацию о разных сеансах игры блэк джэк. Тогда каждым экземпляром этого класса будет конкретный сеанс этой игры, хранящий информацию о нем. Но я не знаю, что Вы хотите сделать и какой использовать алгоритм.
1727 / 967 / 199
Регистрация: 22.02.2018
Сообщений: 2,694
Записей в блоге: 6
AlexMarkov, Знаете, а Вы меня своей задачей заинтересовали. Я пожалуй в качестве практики тоже попробую ее решить с помощью ООП, параллельно Вам. И будем обмениваться нашими наработками.
На самом деле решение здесь будет более сложной структуры, чем обычно рассматриваемые отношения: Класс — экземпляр класса. Здесь еще добавляется Композиция с отношением: Целое — часть. Или как пишет Лутц отношение: «имеет». Целое имеет часть.
В игре блэк джэк можно рассматривать конкретный сеанс игры, как экземпляр класса Игра. И при этом не плохо было бы сохранять промежуточные параметры состояния игры на текущий момент в базе данных, что бы можно было прерываться, а потом продолжить начатый сеанс игры.
Но так же игра имеет части: Начало игры (инициализация), сам Процесс игры, который возможно тоже можно разбить на части, и Окончание сеанса игры. То есть здесь так же необходимо использовать шаблон Композиции.
Определение композиции Лутц дает в книге Лутц М. Изучаем Python (4-е издание, 2011) гл. 25 стр. 696-697
Пример использования композиции рассматривается в гл. 30 стр. 832-837.
Вы писали, что изучаете сейчас где то 7хх страницу. Поэтому пока дойдите до изучения композиции стр. 832-837.
А я пока изучу игру блэк джэк и освежу в памяти то, что пишет Лутц о композиции и его пример с пиццерией, где он использует композицию.
Добавлено через 6 минут
AlexMarkov, Разрешите обращаться к Вам за консультацией, если мне что то будет не понятно в игре блэк джэк.
99 / 86 / 20
Регистрация: 10.09.2019
Сообщений: 708
Viktorrus, да доброго времени суток, у меня есть еще пара вопросов в Вам, необходимо немного времени чтобы их правильно сформулировать, а пока вот примерное описание правил игры блэкджэк:
Ошибочно считается, что цель заключается в том, чтобы набрать как можно больше очков, но не более 21. На самом деле цель — обыграть дилера (крупье). В игре используется от одной до восьми колод. Из-за того что вероятность комбинации блек-джек при большем числе колод ниже, то преимущество игрока уменьшается при увеличении числа колод. При игре с шаффл-машинкой считается, что используется бесконечная колода. По окончании партии, когда осталась примерно треть карт (точное значение устанавливает дилер, размещая специальную карточку в т. наз. «шуз» на глаз), колоды перемешиваются. При игре одной колодой чаще всего она перемешивается после каждой партии.
Значения очков каждой карты: от двойки до десятки — от 2 до 10 соответственно, у туза — 1 или 11 (11 пока общая сумма не больше 21, далее 1), у т. н. картинок (король, дама, валет) — 10.
Если у игрока и дилера число очков на руках равное, то такая ситуация называется «ровно»: за рубежом это называется — пуш (англ. push). В такой ситуации все остаются при своих ставках, никто не выигрывает и не проигрывает. Хотя в казино бывают исключения, и при «пуше» выигрывает казино.
Игроки до раздачи карт делают ставки, кладя фишки на соответствующие поля игрового стола. После того, как первая карта сдана, игрокам запрещается делать ставки и прикасаться к своим фишкам.
Дилер раздаёт карты (обычно из одной или двух колод карт, но чаще из шуза, содержащего не менее четырёх колод): по две карты каждому игроку, себе раздаёт одну карту (в США принято раздавать дилеру две карты, одна из которых открыта, а другая — закрыта, то есть находится на столе рубашкой вверх). Все карты открываются сразу (видны и дилеру, и игроку).
Если у игрока сразу после раздачи набралось 21 очко (то есть у игрока туз и десятиочковая карта), то такая ситуация и называется блек-джек. В таком случае игроку сразу выплачивается выигрыш 3 к 2 (то есть в 1,5 раза превышающий его ставку). Исключение составляют случаи, когда дилеру первой картой (открытой) попадается 10, картинка или туз. В этом случае существует вероятность, что у дилера также будет блек-джек, поэтому игроку с блек-джеком предлагается либо взять выигрыш 1 к 1 (только если первая карта дилера — туз), либо дождаться окончания кона игры (и в случае, если у дилера не блек-джек, получить выигрыш 3 к 2).
Далее игрокам, у которых не блек-джек, предлагается на выбор либо взять ещё карту (в таком случае игрок должен сказать дилеру «карту» или «ещё», англ. hit me), либо остаться при тех картах (и той сумме очков), которые у него на руке (в этом случае игрок должен сказать дилеру «достаточно» или «хватит»).
Как правило, если у игрока после взятия новой карты в сумме получается 21, дилер не спрашивает его больше и переходит к следующему игроку.
Если у игрока после взятия новой карты сумма очков превысит 21, то такая ситуация называется «перебор». Дилер произносит «много» и снимает ставку игрока в пользу казино.
Если у дилера в первых двух картах набирается 21 очко (блек-джек), то все игроки (кроме тех, у кого тоже блек-джек), проигрывают. Те, у которых блек-джек, остаются при своих ставках, если они ранее не выбрали взять выигрыш 1 к 1 или если не застраховали свою комбинацию от блек-джека.
В некоторых случаях, в зависимости от того, какие карты на руках у игрока, дилер может предложить ему дополнительные варианты (см. ниже).
После того, как все игроки завершили брать карты, дилер говорит «себе» и раздаёт карты себе. Общее правило блек-джека состоит в том, что дилер обязан остановиться, как только наберёт 17 очков или выше, и обязан брать, пока не достигнет (даже если у всех не перебравших меньше очков). В различных казино может варьироваться правило, должен ли дилер останавливаться в ситуации, если у него туз и шестёрка (то есть 7 или 17 очков на руке). Обычно это правило написано на игровом столе.
При окончательном подсчёте очков в конце раунда карты остальных игроков для вас значения не имеют, игра ведётся только против дилера, то есть сравниваются карты только игрока и дилера, карты и ставки параллельных игроков не учитываются.
Добавлено через 1 час 9 минут
Вопрос по теории все тех же объектов, правильно ли я понял, что:
Концепция Марка Лутца: Переменная —> Ссылка —> Объект
Интерпретатор Python определяет некоторые имена до запуска программного кода. —> Существует некая системная таблица, где зарезервировано место для хранения ссылок на объекты.
a = 1 # создается объект типа int операцией присваивания.
Вопрос, где хранится имя переменной a, все в той же системной таблице?
В главе 4 он приводит определение, что объекты — это области памяти со значениями и ассоциированными с ними наборами операций.
Что понимается под словом значения в данном случае? Информация о типе объекта и применимые к ним наборы операций.
Так же сегодня рассматривал метод __add__, в данном примере используется возможность использования конкатенации строки и целого числа:
1 2 3 4 5 6 7
class BadStr(str): def __add__(self, other): return BadStr(str(self) + str(other)) t = BadStr('some') print(t + 2 + 2)
Как бы Вы объяснили интерпретирование данного кода? Меня интересует все та же концепция, что является объектом, ссылкой и переменными в данном случае.
«Теория не выводится логически из эмпирического знания, а как бы конструируется и надстраивается над ним для объяснения, понимания и предсказания»
Добавлено через 9 минут
Как передать список обектов в функцию?
Компилятор жалуеться на то что в функции display_persons у аргумента persons нету функции display.Как дать ему понять что список persons хранит обекты класса Person?
Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Как посмотреть список всех обектов определённого типа?
Например у меня есть 10 обектов. Мне нужно в цыкле обращаться к каждому из них. Как мне это сделать?
Как передать список в функцию
Здравствуйте , подскажите как передать в функцию-шаблон список , выдает ошибку .

Как передать в функцию список смежности графа?
Как передать в функцию список смежности графа который представлений как вектор векторов -.
Как передать односвязный список в функцию и вывести его?
Приветствую всех. Вывести список в main у меня получилось, а вот в функции, в которую я его.
60 / 86 / 16
Регистрация: 25.03.2019
Сообщений: 235

Сообщение было отмечено Smoug1894 как решение
Решение
Убрать астериск из строки:
def display_persons(*persons):
Он там нафиг не нужен. То есть сделать так:
def display_persons(persons):
В Питоне переменные передаются по ссылке или по значению? Есть подводные камни?
Неизменяемые объекты передаются по значению. Это значит, что при изменении значения переменной будет создан новый объект. К этому типу относятся:
- числовые данные (int, float, complex)
- символьные строки (str)
- кортежи (tuple) При инициализации переменной незменяемого типа создается объект (например, целое число), этот объект имеет некоторый идентификатор:
>>> a = 10 >>> id(a) 10914656
оператор = связывает переменную a и объект посредством ссылки. При этом вы не можете изменить сам объект, т.е. когда вы присвоите переменной новое значение, интерпретатор создаст новый объект (если до этого этот объект был создан, то переменная просто получит ссылку), а первоначальный объект удалится из памяти сбощиком мусора, если ссылок на него больше нет.
Изменяемые (mutable)
Изменяемые объекты передаются по ссылке. Это значит, что при изменении значения переменной объект будет изменен. К этому типу относятся:
- списки (list)
- множества (set)
- словари (dict)
Подводные камни
Создадим список a , установим для переменной b ссылку на a , прибавим к b элемент списка и выведем их значения и идентификаторы на экран:
>>> a = [1, 2] >>> b = a >>> b.append(3) >>> print(a, b) [1, 2, 3] [1, 2, 3] >>> print(id(a), id(b)) 139748057891656 139748057891656
Как мы видим, переменные имеют одинаковые id и элементы списка. Если ты не знаешь об этой особенности изменяемых объетов, то такое поведение программы для тебя становится полной неожиданностью и может привести к ошибке в работе программы. Таким же образом с помощью ссылки на изменяемый объект, переменная передается в функцию:
>>> def add_value(a): . a.append(3) >>> b = [1, 2] >>> add_value(b) >>> print(b) [1, 2, 3]
Даже возвращая None , функция изменила список b , чего бы нам не хотелось.
Что с этим можно сделать
Для того, чтобы передать в функцию изменяемую переменную как значение, нужно сделать копию изменяемого элемента. Создадим копию списка:
новый_лист = старый_лист[:]
Тоже самое можем сделать вот так:
новый_лист = list(старый_лист)
Переменная новый_лист ссылается на новый объект:
>>> id(старый_лист), id(новый_лист) (139748050279112, 139748057891656)
Это дает нам возможность изменять оба объекта независимо друг от друга.
Что почитать
- Переменные-ссылки в Python
- Understanding Python variables and Memory Management
Попробуйте бесплатные уроки по Python
Получите крутое код-ревью от практикующих программистов с разбором ошибок и рекомендациями, на что обратить внимание — бесплатно.
Переходите на страницу учебных модулей «Девмана» и выбирайте тему.
Как Передать Список В Класс Питон
В отличие от класса в интерфейсе описываются только сигнатуры метода (то, что должен делать объект). А то, как он это будет делать, объект решает сам. По сути интерфейс отделяет описание от реализации. Чтобы создать новый класс, нужно нажать на имя пакета правой кнопкой и выбрать New – Java Class.
Благодаря абстракции и полиморфизму ООП функции можно использовать снова и снова. Это упрощает программирование и экономит ресурсы. При реализации этой концепции ООП также можно создать абстрактный класс, который станет публичным и будет выступать только в роли родителя. Еще одна программная структура – интерфейсы ООП.
После создания экземпляра класса – вы можете работать с ним, как с обычной переменной или функцией. Мощь ORM, классов и объектов используется для вставки и выбора из базы данных. Мы используем функцию super() перед методом __init__(), чтобы извлечь содержимое метода __init__() из родительского класса в дочерний. Методы — это функции, определенные внутри класса. Они используются для определения поведения объекта.
Также в ООП на языке Python существуют декораторы функций, статические методы и множество других сложных и специальных приемов. В данном случае попытка обратиться к имени D.name приводит к появлению ошибки. С помощью методов перегрузки можно реализовать любые операции со встроенными типами данных. Большинство используются только при решении специальных задач, в которых необходимо, чтобы объекты имитировали поведение стандартных объектов. В Python __init__ выполняет перегрузку операции создания экземпляров. Второй метод __sub__ реализует операцию вычитания.
Классы
В подклассе, Python вызовет конструктор базового класса автоматически. Помимо этого, в Python реализована поддержка множественного наследования. Например, можно создать родительский класс с несколькими потомками или дочерний с несколькими родителями.
Один класс располагается в одном файле, и кроме описания класса там больше ничего не должно быть. Желательно, чтобы имя файла и имя класса были одинаковые. По стандарту, если имя состоит из нескольких слов, каждое пишется с большой буквы. Нельзя присваивать классу имя из зарезервированных слов, список которых есть на официальном сайте. Также нельзя начинать имя с цифры (используйте или букву, или символ подчеркивания). Объекты парадигмы ООП – это те самые отдельные блоки, где хранится и преобразуется информация.
Инкапсуляция блокирует доступ к деталям сложной концепции. Абстракция подразумевает возможность рассмотреть объект с общей точки зрения, а инкапсуляция не позволяет рассматривать этот объект с какой-либо другой. Как только мы определили метод __init__ и указали параметр self, начинаем перечислять остальные параметры/аргументы, которые используются в методе __init__. В нашем примере это first, last, mobile и monthly.
Классы И Объекты В Python:
Цель курса – научить слушателей программировать на языке Python в объектно-ориентированном стиле. Это позволяет создавать большие проекты с меньшим количеством ошибок и в более сжатые сроки, так как минимизируется или даже сводится к нулю использование одинакового кода. Эти темы, как правило, читаются в университетах на 2-3 ооп в python курсах. Поверьте, мы единственная IT-школа в Харькове в которой предлагается такой углублённый подход в изучении ООП на языке Пайтон для школьников. Общий класс, который задает базовые характеристики объектов, называется родителем (базовым, суперклассом). Классы, созданные на его основе – потомки, наследники, дочерние.
- Специальность заинтересовала меня популярностью и простотой изучаемого языка – Python.
- При этом первые реализуются с помощью вторых и наоборот.
- Но, при этом, они всё ещё обладают всеми другими характеристиками, присущими автотранспорту.
- Мы можем представить класс как эскиз попугая с метками.
- Объекты взаимодействую между собой, но не имеют полного доступа друг к другу.
- По окончании обучения на курсе проводится итоговая аттестация; Аттестация проводится в виде комплексного теста на последнем занятии.
Структура данных – это программная единица, которая хранит и обрабатывает однотипные либо связанные логически данные. При этом первые реализуются с помощью вторых и наоборот. Класс как раз и считается структурой, где объекты связаны между собой по характеристикам и функциям.
В первой части учебника про ООП в Python мы рассмотрим основы ООП в Python 3, всё самое главное, что стоит знать. Для каждого объекта свои, что указывает на природу переменных объекта. Декораторы можно считать неким упрощённым способом вызова явного оператора, как мы видели в этом примере. Обратите внимание, что выводится также и адрес в памяти компьютера, где хранится ваш объект. На вашем компьютере адрес будет другим, так как Python хранит объекты там, где имеется свободное место.
Методы Http
Суть заключается в том, что вы создаёте класс, и потом создаёте объекты от этого класса, которые имеет его свойства и методы. Мы изучили различные аспекты классов и объектов, равно как и терминологию, связанную с ними. Мы также увидели ряд достоинств и “подводных камней” объектно-ориентированного программирования. Python – в высокой степени объектно-ориентирован, поэтому понимание этих принципов очень поможет вам в дальнейшем. Помните, что это лишь традиция, и Python вовсе не обязывает делать именно так (кроме двойного подчёркивания). Метод, который вызывается при создании объектов, в ООП зовётся конструктором.
В глобальной области видимости – вы можете создавать свои объекты, такие как функции. А внутри функций – будет располагаться локальная область видимости самой функции. Классы создаются инструкциями, https://deveducation.com/ а объекты с помощью вызовов. Они могут хранить данные и обладать своим функционалом или методами классов. С ее помощью программисты отличают независимые функции от тех, что принадлежат классам.
Теперь, когда есть определенная структура того, как должны выглядеть таблицы, их можно создавать внутри приложения Flask. Рейсов будет автоматически увеличиваться при создании новых объектов полета. И все его методы могут использоваться логичным и понятным способом без необходимости знать или даже понимать, как может быть реализован Flight. Класс общий, поэтому код можно использовать повторно.
Что Такое Ооп
Python-разработчик отвечает за кодирование, проектирование, развертывание и отладку проектов разработки на стороне сервера (бэк-енд). Курс по основам Python проводится на русском/украинском языке, однако часть учебных материалов на английском, поэтому желательно знать английский хотя бы на базовом уровне. Кроме того, если вы планируете основательно развиваться в сфере веб-разработки, то вам просто необходимо будет освоить английский язык. Практика показывает, что кандидатов со знанием английского чаще приглашают на собеседования, и им легче продвигаться по карьерной лестнице. Вообще напрямую работать с атрибутами – не очень хорошая идея, лучше для этого использовать свойства. Важное замечание, на собеседовании в IT-компании первые вопросы на “профпригодность”, как правило, направлены на выяснение компетенции именно по ООП.
Как видите, вообще не обязательно, чтобы объект базового класса создавался первым. Про наследование и полиморфизм уже шла речь в начале статьи. Но тогда нельзя было приводить полноценные примеры на Python. Теперь, когда мы подтянули матчасть, написали и много раз переписали свой первый класс… как говорится, примеры в студию!
Дело в том, что при создании новых объектов создаются копии всех динамических атрибутов со сброшенными к «заводским настройкам» значениями. Статические атрибуты относятся не к объекту, а к классу и имеют только одну копию. В этом случае self заменяет имя объекта b или b2 внутри класса Bird . В ООП принято «экономить» код, время и силы, не делая лишних движений. Если нам нужно реализовать класс Утка, мы можем максимально использовать код класса Птица и добавить еще (желательно не сильно много) нового кода.
Learning Python, 5th Edition, Mark Lutz
Сами объекты при этом называются экземплярами класса. Последние, в свою очередь, имеют строгую иерархию наследования. На размер зарплаты Python-разработчика влияют знание языка программирования и необходимых для работы фреймворков, методологий разработки. Также программисты Python часто имеют дело с базами данных, поэтому стоит изучать MySQL, PostgreSQL.
Известные Компании, Использующие Python
» от этого же сайта, Python и вовсе находится на втором месте, «дыша в спину» C#. Python повсеместно рекомендуют для изучения в качестве первого языка. Более того, его изучают дети в ряде школ не только за рубежом, но и у нас. Python похож на обычный «человеческий» язык и прощает ошибки.
Создание Api
Чтобы реализовать полиморфизм, мы создали общий интерфейс. То есть, функцию flying_test(), которая может принимать любой объект. Затем мы передали объекты blu и peggy в функцию flying_test(). Мы попытались изменить цену, но не смогли, потому что Python рассматривает __maxprice, как приватные атрибуты.