Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 04.05.2020
Сообщений: 11

Как сэкономить время на разработку!? Python

07.05.2020, 07:11. Показов 968. Ответов 10

Студворк — интернет-сервис помощи студентам
Здравствуйте как сэкономить время, может кто нибудь знает какие нибудь лайфхаки по разработке?
Вот например:

Василий считает ООП великолепным подходом к программированию различных систем.
Сегодня он хочет, чтобы вы начали разрабатывать основу для pyRPG (Python role-playing game).
Представьте себе мир, в котором у игрока (Player) есть три основных характеристики: сила (strength), ловкость (agility) и интеллект (intelligence). По умолчанию у каждого героя игры все характеристики равны нулю.
Для увеличения (или уменьшения) характеристики в игре используются зелья (Potion), которые накладывают определённый эффект на игрока и действуют определённое количество ходов.
Перед вами стоит задача создать два класса Player и Potion, описывающие данную механику.
Класс Potion описывает эффект от зелья.
Конструктор класса Potion должен иметь вид: Potion(duration, strength, agility, intelligence). Параметр duration описывает длительность эффекта в «шагах» и является позиционным. Параметры strength, agility, intelligence описывают силу, ловкость и интеллект, получаемые от зелья, и являются необязательными.
Класс Potion должен иметь методы:

duration() — возвращает длительность эффекта зелья;
strength() — возвращает силу, получаемую от зелья;
agility() — возвращает ловкость, получаемую от зелья;
intelligence() — возвращает интеллект, получаемую от зелья;
copy() — возвращает копию объекта.
Над объектами класса Potion должна быть возможность производить следующие операции:

potion1 == potion2 — возвращает True, если все параметры зелий равны, иначе False;
next(potion) — снижает продолжительность эффекта на 1 и возвращает None, если продолжительность снизилась до 0, иначе возвращает принимаемый объект;
potion1 + potion2 — странным образом смешивает два зелья: параметры зелий складываются, а продолжительность эффекта нового зелья равна минимальной из переданных;
potion1 - potion2 — странным образом смешивает два зелья: параметры зелий вычитаются, а продолжительность эффекта нового зелья равна максимальной из переданных;
potion * number — странным образом модифицирует зелье: параметры зелья умножаются на number, а продолжительность эффекта нового зелья остаётся такой же;
str(potion) — возвращает строку, описывающую зелье в формате Potion(duration=D, strength=S, agility=A, intelligence=Intel).
Класс Player описывает состояние пользователя.
У конструктора класса Player не должно быть позиционных параметров.
Класс Player должен иметь методы:

strength() — возвращает суммарную силу героя;
agility() — возвращает суммарную ловкость героя;
intelligence() — возвращает суммарный интеллект героя;
append(potion) — накладывает эффект (копию зелья potion) на героя.
Над объектом класса Player должна быть возможность производить следующие операции:

player += potion — накладывает эффект (копию зелья potion) на героя;
next(player) — имитирует ход, снижает длительность всех наложенных на героя зелий на 1;
str(player) — возвращает строковое представление героя в виде:
Player {
strength: S
agility: A
intelligence: Intel
}

Python
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
class Potion:
    def __init__(self, duration, strength=0, agility=0, intelligence=0):
        self.duration = duration
        self.strength = strength
        self.agility = agility
        self.intelligence = intelligence
        self.krot = 0
        
    def duration(self):# — возвращает длительность эффекта зелья
        return self.duritation
    
    def strength(self):# — возвращает силу, получаемую от зелья
        return self.duritation
    
    def agility(self):# — возвращает ловкость, получаемую от зелья
        return self.agility
    
    def intelligence(self):# — возвращает интеллект, получаемую от зелья
        return  self.agility
    
    def copy(self):# — возвращает копию объекта. 
        new = self
        return new
    
    def __add__(self, other):
        a = self.duration + other.duration
        b = self.strength + other.strength
        c = self.agility + other.agility
        d = self.intelligence + other.intelligence
        q = Potion(a, b, c, d)
        return q
 
    def __eq__(self, other):
        a = self.duration == other.duration
        b = self.strength == other.strength
        c = self.agility == other.agility
        d = self.intelligence == other.intelligence
        if self.duration == other.duration \
           and self.strength == other.strength \
           and self.agility == other.agility \
           and self.intelligence == other.intelligence:
            return True
        else:
            return False
 
    def __sub__(self, other):
        a = self.duration - other.duration
        b = self.strength - other.strength
        c = self.agility - other.agility
        d = self.intelligence - other.intelligence
        q = Potion(a, b, c, d)
        return q
 
    def __mul__(self, other):
        a = self.duration * other
        b = self.strength * other
        c = self.agility * other
        d = self.intelligence * other
        q = Potion(a, b, c, d)
        return q
 
    def __str__(self):
        return 'Potion(duration={0}, strength={1}, agility={2}, intelligence={3})' \
               .format(self.duration, self.strength, self.agility, self.intelligence)
 
 
class Player:
    def __init__(self):
        self.strength = 0
        self.agility = 0
        self.intelligence = 0
        self.duration = 0
        self.new = []
        
    def strength(self):# — возвращает силу, получаемую от зелья
        return self.duritation
    
    def agility(self):# — возвращает ловкость, получаемую от зелья
        return self.agility
    
    def intelligence(self):# — возвращает интеллект, получаемую от зелья
        return  self.agility
 
    def append(self, potion):
        item = potion.copy()
        nora = []
        nora.append(item.duration)
        nora.append(item.strength)
        nora.append(item.agility)
        nora.append(item.intelligence)
        self.duration += potion.duration
        self.strength += potion.strength
        self.agility += potion.agility
        self.intelligence = potion.intelligence
        return self.new.append(nora)
 
    def __iadd__(self, other):
        item = other.copy()
        nora = []
        nora.append(item.duration)
        nora.append(item.strength)
        nora.append(item.agility)
        nora.append(item.intelligence)
        self.new.append(nora)
        self.duration += other.duration
        self.strength += other.strength
        self.agility += other.agility
        self.intelligence += other.intelligence
        return self
 
    def __next__(self):
        for i in range(len(self.new)):
            self.new[i][0] -= 1
            #print('after', self.new)
        #print('before', self.new)
        w = len(self.new)
        for i in range(len(self.new)):
            if self.new[i][0] == 0:
                self.strength -= self.new[i][1]
                self.agility -= self.new[i][2]
                self.intelligence -= self.new[i][3]
        d = []
        for i in range(len(self.new)):
            if self.new[i][0] == 0:
                d.append(i)
        if len(d) != 0:
            for h in d:
                del self.new[h]
        return self
        
 
    def __str__(self):
        return 'Player {0} \n strength:{1} \n agility:{2} \n intelligence:{3} \n {4}' \
               .format('{', self.strength, self.agility, self.intelligence, '}')


Эту программу я делал 3 часа, но на его разработку давалось менее 1 часа.
Она полностью рабочая, но ГДЕ И КАК Я МОГ СЭКОНОМИТЬ ВРЕМЯ НА РАЗРАБОТКУ? Надеюсь на ваши советы.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.05.2020, 07:11
Ответы с готовыми решениями:

Как сэкономить время?
Грустная история стандартного человека: Утро. Встать. Не то что бы лежать покуда охота. Далее выход в люди: Причесаться, смыть с себя...

Как сэкономить время при session_start и mysql_connect?
Приветствую всех! Задача стоит такая: нужно выводить данные из БД ajax-ом каждую минуту. Решаю так: из индексного файла посылаю...

Как сэкономить время и ресурсы при выполнении кода VBA
Доброго всем времени суток. Проблема такая: есть лист, в котором есть огромная таблица - много строк и столбцов. В каждой ячейке матрицы...

10
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
07.05.2020, 07:58
NikiforovDV, странный вопрос, тут трата времени идет из за вашей сообразительности. Быстрее понимаешь, быстрее делаешь, подобные задачи занимают меньше времени с опытом. В этом коде куча ошибок, таких как: название методов совпадает с названием атрибутов, функции возвращают не существующие атрибуты, копипаст.
1
1293 / 677 / 367
Регистрация: 07.01.2019
Сообщений: 2,300
07.05.2020, 08:17
Цитата Сообщение от NikiforovDV Посмотреть сообщение
какие нибудь лайфхаки
Есть супер-лайфхак, трудолюбие называется

Кстати метод copy реализован неверно, он возвращает не копию, а сам объект

Python
1
2
3
4
5
6
7
8
9
10
p = Potion(5)
z = p.copy()
 
print(p)
print(z)
 
p.strength = 5
 
print(p)
print(z)
Вывод

Potion(duration=5, strength=0, agility=0, intelligence=0)
Potion(duration=5, strength=0, agility=0, intelligence=0)
Potion(duration=5, strength=5, agility=0, intelligence=0)
Potion(duration=5, strength=5, agility=0, intelligence=0)
1
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
07.05.2020, 08:29
NikiforovDV, 25 мин, при этом одна рука занята кофе и вафельками:

Python
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
# -*- coding: utf-8 -*-
 
 
from __future__ import annotations
from typing import List, Tuple
 
 
class Characteristics:
 
    def __init__(self, strength: int = 0, agility: int = 0, intelligence: int = 0):
        self._strength, self._agility, self._intelligence = strength, agility, intelligence
 
    def getStrength(self) -> int:
        return self._strength
 
    def setStrength(self, strength: int):
        self._strength = strength
 
    strength = property(getStrength, setStrength)
 
    def getAgility(self) -> int:
        return self._agility
 
    def setAgility(self, agility: int):
        self._agility = agility
 
    agility = property(getAgility, setAgility)
 
    def getIntelligence(self) -> int:
        return self._intelligence
 
    def setIntelligence(self, intelligence: int):
        self._intelligence = intelligence
 
    intelligence = property(getIntelligence, setIntelligence)
 
 
class Potiton(Characteristics):
 
    def __init__(self, duration: int, strength: int = 0, agility: int = 0, intelligence: int = 0):
        Characteristics.__init__(self, strength, agility, intelligence)
        self._duration = duration
 
    def getDuration(self) -> int:
        return self._duration
 
    def setDuration(self, duration: int):
        self._duration = duration
 
    duration = property(getDuration, setDuration)
 
    def copy(self) -> Potiton:
        return Potiton(self._duration, self._strength, self._agility, self._intelligence)
 
    def __eq__(self, other: Potiton) -> bool:
        return (self._strength, self._agility, self._intelligence) == \
               (other.strength, other.agility, other.intelligence)
 
    def __str__(self) -> str:
        return f"Potion(duration={self._duration}, strength={self._strength}, "\
               f"agility={self._agility}, intelligence={self._intelligence})."
 
    def __next__(self):
        self._duration -= 1
 
 
class Player(Characteristics):
   
 
    def __init__(self, name: str, strength: int = 0, agility: int = 0, intelligence: int = 0):
        Characteristics.__init__(self, strength, agility, intelligence)
        self._name = name
        self._potitons = []
 
    def getName(self) -> str:
        return self._name
 
    def setName(self, name: str):
        self._name = name
 
    name = property(getName, setName)
 
    def getPotitons(self) -> Tuple[Potiton]:
        return tuple(self._potitons)
 
    potitons = property(getPotitons)
 
    def append(self, potiton: Potiton):
        self._potitons.append(potiton)
        self._strength += potiton.strength
        self._agility += potiton.agility
        self._intelligence += potiton.intelligence
 
    def remove(self, potiton: Potiton):
        self._potitons.remove(potiton)
        self._strength -= potiton.strength
        self._agility -= potiton.agility
        self._intelligence -= potiton.intelligence
 
    def __str__(self) -> str:
        return f"Player(strength: {self._strength}, agility: {self._agility}, " \
               f"intelligence: {self._intelligence})"
 
    def __next__(self):
        for potiton in self._potitons:
            next(potiton)
            if potiton.duration == 0:
                self.remove(potiton)
 
 
potiton = Potiton(1, 10, 5, -2)
player = Player("Vasya")
player.append(potiton.copy())
print(player) # Player(strength: 10, agility: 5, intelligence: -2)
next(player) 
print(player) # Player(strength: 0, agility: 0, intelligence: 0)
0
0 / 0 / 0
Регистрация: 04.05.2020
Сообщений: 11
07.05.2020, 08:55  [ТС]
Вопрос!
Является ли критической ошибкой совпадения имен методов и атрибутов в коде?
Вроде как бы работает.
Они не должны совпадать из-за какого-то негласного правила?

p.s. Спасибо что указали про ошибку метода копирования, я уже исправил его после вашего замечания.
0
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
07.05.2020, 08:59
NikiforovDV,

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class MyClass:
    agility = 10
 
    def agility(self):
        return self.agility
 
 
my_class = MyClass()
 
print(my_class.agility)
# <bound method MyClass.agility of <__main__.MyClass object at 0x00561CF0>>
 
my_class.agility = 10
print(my_class.agility)
# 10
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,663
Записей в блоге: 29
07.05.2020, 09:08
Цитата Сообщение от NikiforovDV Посмотреть сообщение
Является ли критической ошибкой совпадения имен методов и атрибутов в коде?
да, является

Цитата Сообщение от NikiforovDV Посмотреть сообщение
Вроде как бы работает.
нет, не работает и не может работать
предлагаю провести вот такой эксперимент
Python
1
2
3
4
>>> p=Player()
>>> p.agility
0
>>> p.agility()
и вообще "вроде работает" это довольно жалкое оправдание (особенно если не работает)
1
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
07.05.2020, 09:50
Welemir1, можешь ответить, оптимальный ли способ использую я при создание свойств объекта в примере выше? (По хорошему во всех методах проверку на тип поставить но опустим.)
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,663
Записей в блоге: 29
07.05.2020, 10:47
DmFat, нет, если взять твой пример то после 13 строки у тебя больше нет метода аджилити) ты его перезаписал интом. Ну нельзя называть атрибуты и методы одинаково, потому что метод это тоже атрибут, просто он вызываемый (коллабл).
Плюс возможное (при определенных ситуациях) но не самое верное решение сделать аджилити атрибутом самого класса, а не объектов. Изменив его мы получим изменение во всех объектах, а это не всегда ожидаемо.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
>>> class MyClass:
...     agility = 10
...
>>> c=MyClass()
>>> c.agility
10
>>> c1=MyClass()
>>> c1.agility
10
>>> MyClass.agility = 1000
>>> c1.agility
1000
>>> c.agility
1000
0
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
07.05.2020, 10:54
Welemir1, да я не про то, про вариант выше, с классами: Characteristic и т.д.
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,663
Записей в блоге: 29
07.05.2020, 11:02
Цитата Сообщение от DmFat Посмотреть сообщение
про вариант выше, с классами: Characteristic и т.д.
не надо создавать проперти там, где нет логики, зачем? тут вообще подойдет датакласс или неймдтапл для Характеристик
не верная абстракция для Питья (если я верно понял), оно может дать какие то характеристики но само не обладает ими, то есть у Зелья не может быть силы или ловкости. Оно не должно быть наследником характеристик

Игрок получается -набор зелий? раз его можно итерировать некстом по зельям? Это скорее можно сказать про пояс героя, на котором зелья висят, но сам то герой точно не набор зелий.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.05.2020, 11:02
Помогаю со студенческими работами здесь

Сколько требуется время на разработку?
Профессионалы посоветуйте сколько примерно требуется времени на разработку( в основном программирование ), а то требуют как можно скорее? ...

C# или как сэкономить
Вот вопрос по C# если допустим к примеру я обьявляю 2 константы (ну так теоретически!!!) String x1 = &quot;Текст1&quot;; String...

Как сэкономить память?
#define PORTS 260 #define MAX_NUMBER_OF_ENTRIES 255 Есть у нас такой интересный указатель: STRUCT_T (*location); Под него...

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

i7 4770-4770k Как сэкономить?
Если я не буду разгонять проц и возьму 4770 в место 4770к,сколько я смогу сэкономить на сборке компа????? Просто разница в цене 4770 и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru