Skip to content

Volobuev first branch#69

Open
volobuev-m wants to merge 40 commits into
mainfrom
volobuev_first_branch
Open

Volobuev first branch#69
volobuev-m wants to merge 40 commits into
mainfrom
volobuev_first_branch

Conversation

@volobuev-m
Copy link
Copy Markdown
Collaborator

No description provided.

Copy link
Copy Markdown
Owner

@IlyaOrlov IlyaOrlov left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Есть существенные замечания.

Comment thread Practice/mvolobuev/lec4 task1.py Outdated
Comment thread Practice/mvolobuev/lec4 task1.py Outdated
Comment thread Practice/mvolobuev/lec4 task2.py Outdated
Comment thread Practice/mvolobuev/lec4 task2.py Outdated
Comment thread Practice/mvolobuev/lec4 task2.py
Comment thread Practice/mvolobuev/lec4 task6.py Outdated
Comment thread Practice/mvolobuev/lec4 task7.py Outdated
Comment thread Practice/mvolobuev/lec4 task8.py Outdated
Comment thread Practice/mvolobuev/lec4 task8.py Outdated
Comment thread Practice/mvolobuev/lec4 task8.py Outdated
Copy link
Copy Markdown
Owner

@IlyaOrlov IlyaOrlov left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Добавил ещё замечаний.

Comment thread Practice/mvolobuev/lec5 task1.py
j2 = len(st)
for i in range(0, len(st) - 1):
for k in range(i + 1, len(st)):
if int(st[k]) == int(st[i]):
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Зачем здесь int?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Исправил.

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Не вижу исправления. int на месте.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Сразу исправил.

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment thread Practice/mvolobuev/lec5 task3.py
Comment thread Practice/mvolobuev/lec5 task4.py
Copy link
Copy Markdown
Owner

@IlyaOrlov IlyaOrlov left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Есть ещё замечания.

Comment thread Practice/mvolobuev/lec4 task1.py Outdated
bp = alfavit[15]
s = ""
for k in range(0, 4):
if k == 0:
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Код в стр.29-31, 34-36, 39-41, 43-45 одинаковый. Зачем его столько раз повторять?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Исправил.

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Нет.
Во-первых, данный код выдаёт ошибку, т.к. s1 в стр.34,38,42 не определена.
Во-вторых, весь код в стр.26-46 можно упростить до:

stop_alf = (alfavit[18], alfavit[19], alfavit[14], alfavit[15])
s = ""
for k in range(0, 4):
    b = stop_alf[k][1]
    s1 = bukv(b, alfavit)
    s += str(s1) + " "

или даже до

stop_alf = (alfavit[18], alfavit[19], alfavit[14], alfavit[15])
s = ""
for n, b in stop_alf:
    s += str(bukv(b, alfavit)) + " "

В-третьих, буквы "a"..."z" и так упорядочены по таблице ASCII. Получить порядковый номер каждой буквы можно и без доп. структуры alfavit простым вычитанием порядкового номера "a".
Например, порядковый номер "z":

nz = ord("z") - ord("a") + 1  # получится 26

Узнать символ по порядковому номеру тоже просто. Например, номер 5:

b5 = chr(ord("a") + 5 - 1)  # получится "e"

Операции ord и chr мы проходили на 5-м занятии (примерно 58-я минута записи).

Если всё же удобней работать с алфавитом как списком, имеет смысл сгенерировать его через алгоритм:

alfavit = []
for i in range(1, ord("z") + 1):
    b = chr(ord("a") + i - 1)
    alfavit.append((i, b))

Это более быстрый и гибкий подход. Если заказчик решит нумеровать буквы с 0, а не с 1, захочет проверять прописные буквы, а не строчные, поправить алгоритм гораздо проще, чем переписывать заново всю последовательность букв и цифр.
Прописать конкретные числа, буквы - это допустимо и даже правильно... на начальном этапе решения. Чтоб увидеть и понять закономерность! Но на этом нельзя останавливаться. Как только закономерность становится явной - её стоит заменить алгоритмом. Когда Вы пишете (1, "a"), (2, "b") и т.д. - это уже рутинная, повторяющаяся деятельность. Пусть её выполняет машина. Вам надо просто задать ей алгоритм. То же самое и с повторяющимся кодом:

if k == ...:
    b = ...
    buk_v(...)

Comment thread Practice/mvolobuev/lec4 task3_2.py
Comment thread Practice/mvolobuev/lec4 task5.py Outdated
Comment thread Practice/mvolobuev/lec4 task5.py Outdated
Comment thread Practice/mvolobuev/lec5 task1.py Outdated
@volobuev-m volobuev-m closed this Sep 14, 2023
@volobuev-m volobuev-m reopened this Sep 14, 2023
@volobuev-m volobuev-m closed this Sep 15, 2023
@volobuev-m volobuev-m reopened this Sep 15, 2023
@volobuev-m volobuev-m closed this Sep 15, 2023
@volobuev-m volobuev-m reopened this Sep 15, 2023
Copy link
Copy Markdown
Owner

@IlyaOrlov IlyaOrlov left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Хорошо, но замечания ещё есть.

Comment thread Practice/mvolobuev/lec5 task1.py Outdated
if arg[k] < arg[i]:
if arg[k] < arg[n]:
n = k
arg[i], arg[n] = arg[n], arg[i]
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

А здесь ещё можно повесить проверку if i != n, чтоб не тратить время на самоприсваивание.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Не совсем понял предложение.
n = i - присвоение необходимо чтобы знать с какого элемента мы начинаем проверку.
n = k - это присвоение необходимо для проверки повторений цикла
на мой взляд код рабочий и минимальный, меньше только мое первое предложение с пузырьковым методом.

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Да, эти присваивания необходимы. Но если внутри цикла for k in range(i+1, len(arg)) n не поменялся (не нашлось меньшего элемента), то незачем делать и перестановку arg[i], arg[n] = arg[n], arg[i].
Т.е. финальный вариант получается такой:

arg = [0, 3, 24, 2, 3, 7]
print(arg)
for i in range(0, len(arg)-1):
    n = i
    for k in range(i+1, len(arg)):
        if arg[k] < arg[n]:
            n = k
    if n != i:        
        arg[i], arg[n] = arg[n], arg[i]
print(arg)

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Внес изменения, получил это:
[0, 3, 24, 2, 3, 7]
[0, 2, 3, 7, 3, 24]

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Если изменения внесены в точности, как в приведённом мною коде, то результат должен получится другой.
image
Можете прислать, какой код у Вас получился, и я скажу, где ошибка. Хотя и так догадываюсь, что if n != i: и перестановку Вы внесли во вложенный цикл, чего делать не стоило.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Спасибо, все получилось. Но мой код короче на одну строку.
Или проводиться дополнительная проверка, или дополнительное присваивание.
На скорость это может повлиять?

Copy link
Copy Markdown
Owner

@IlyaOrlov IlyaOrlov Sep 29, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Хороший вопрос. Давайте разбираться. Возьмём список из миллиона элементов и рассмотрим крайние случаи.

  1. Если список отсортирован по возрастанию (а мы сортируем по убыванию). Тогда n всегда будет != i, т.к. во вложенном цикле всегда будет находиться какой-то меньший элемент. Мы получим миллион лишних проверок.
  2. Если список отсортирован сразу, как нам нужно (по убыванию). Тогда n всегда будет == i, т.к. во вложенном цикле никогда не будет элементов, меньших, чем i-й. Без проверки if n != i: мы получим миллион лишних перестановок (самоперестановок).

Если элементы в списке генерируются случайным образом по равномерному распределению, то вероятность обоих крайних случаев одинаковая.
Таким образом, перед нами встаёт дилемма: миллион лишних проверок или миллион лишних перестановок. Проверка - операция чтения, перестановка - это две операции записи. Очевидно, проверка выполняется быстрее, чем перестановка. Поэтому из двух зол я бы выбрал меньшее - проверку.

Comment thread Practice/mvolobuev/lec5 task3.py Outdated
Comment thread Practice/mvolobuev/lec5 task3.py Outdated
@@ -0,0 +1,16 @@
def zam(t, dik1):
t2 = list('')
n = len(t)
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Код в стр.3-8 можно заменить одной строкой: t = t.replace(dik1['дождь'])
Странно только, что пара 'Вчера': 'Завтра' никак не используется.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

Copy link
Copy Markdown
Owner

@IlyaOrlov IlyaOrlov Sep 18, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ОК. Исправляюсь) Вот такой строкой: return t.replace('дождь', dik1['дождь'])

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Но вообще идея была в том, чтоб получить независимое от конкретных значений решение:
Например:

def zam(t, dik1):
    for k, v in dik1.items():
	t = t.replace(k, v)
    return t

А всеми заменами управляем только через содержимое словаря. По сути, так работает автозамена в Word, в PyCharm.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Надо будет потренироваться с показанным решением.

Comment thread Practice/mvolobuev/lec5 task4.py Outdated
Comment thread Practice/mvolobuev/lec5 task4.py Outdated
Comment thread Practice/mvolobuev/lec5 task4.py
@volobuev-m volobuev-m closed this Sep 18, 2023
@volobuev-m volobuev-m reopened this Sep 18, 2023
Copy link
Copy Markdown
Owner

@IlyaOrlov IlyaOrlov left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Добавил замечания.

Comment thread Practice/mvolobuev/lec6_task1.py Outdated
Comment thread Practice/mvolobuev/lec6_task1.py Outdated
Comment thread Practice/mvolobuev/lec6_task1.py Outdated
Comment thread Practice/mvolobuev/lec6_task2.py Outdated
Comment thread Practice/mvolobuev/lec6_task2.py Outdated
# cls.cvet = new_color
print(new_color)
cls.cvet = new_color
print(cls.cvet)
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

И всё-таки cls.cvet или cls.color?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Случайно стер код, пришлось восстанавливать. Исправлю.

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Опять нет!
У Вас в стр.3 задан атрибут color = "Зеленый" (который до этого был cvet = "Зеленый").
Его-то и надо здесь вывести, а new_cvet тут не нужен.
Т.е. либо тут выводите print("cls.color"), либо в стр.3 меняете имя атрибута класса обратно на cvet = "Зеленый".

Comment thread Practice/mvolobuev/lec6_task2.py Outdated
Comment thread Practice/mvolobuev/lec6_task2.py Outdated
Comment thread Practice/mvolobuev/lec6_task3.py Outdated
Comment thread Practice/mvolobuev/lec6_task3.py Outdated
Comment thread Practice/mvolobuev/lec7/lec7_task2.py

class Pupil(Man):
def __init__(self, name, student):
self._name = name
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Имеет смысл здесь (вместо self._name = name) вызвать super().__init__(name). Технически, разницы никакой. Но логически, это показывает преемственность Pupil от Man. Т.е. мы явно указываем, что Pupil умеет всё то же, что и Man (в данном случае, прописывать имя при создании экземпляра), + что-то своё.
То же самое применимо и к строке 22.
Т.е., как сейчас сделано - это не ошибка. Но, скажем так, можно придать этому коду дополнительный смысл. Если не понятно, что я имею в виду, пожалуйста, напишите. Попробую объяснить ещё)

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

По стр. 16 кажется понятно. Мы как бы дополнительно указали что есть класс Man, и на основе его открыт класс Pupil. По стр. 22 не понятно. Там time.sleep(i) выполнена задержка времени.

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

По стр. 22 мы можем явно показать, что solve_task в классе-наследнике это тот же solve_task, что и в родителе + новый функционал для организации ожидания. Т.е. так:

    def solve_task(self):
        i = random.randint(3, 6)
        time.sleep(i)
        super().solve_task()

Т.е. Pupil подождал немного, а потом напечатал то же, что печатает в таких случаях родитель. При этом мы можем не конкретизировать здесь, что делает в ходе решения задачи родитель.


class WrapStrToFile:
def __init__(self):
self.filepach = tempfile.mktemp()
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Должен ли атрибут filepach быть доступен вне класса WrapStrToFile?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

В данной задаче нет, т.к. этот файл в папке временных файлов.

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Дело даже не в том, что это временный файл. А в том, что работа с файлом - это всё внутренняя задача класса WrapStrToFile. И обращений вида:

wstf = WrapStrToFile()
print(wstf.filepach)
wstf.filepach = """

быть не должно.
Поэтому стоит объявить данный атрибут защищённым (добавить в название нижнее подчеркивание): self._filepach = tempfile.mktemp()

print(f"На Вашем счету осталось: {atm.deposit1}")
return

def batm(self):
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Вероятно, это должен быть статический метод.

if j < 0 or j > atm.deposit1:
break
else:
self.deposit1 = self.deposit1 - j
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

self.deposit1 -= j

# и наборе поддерживаемых операций.
class Banks:
def __init__(self, address, deposit1, deposit2):
self.address = address
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Все определённые здесь атрибуты стоит сделать защищёнными. Например, deposit1. Его, по-любому, нельзя позволять менять вне банкомата (lst[i].deposit1 = 100500). Только внутри методов банкомата. Но сейчас выглядит так, как будто можно.

class Atm_ilyinka(Banks):

# Снятие со счета
def snytie(self):
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Этот метод одинаковый у всех банкоматов (вроде бы). Достаточно оставить его только в классе-родителе (Banks).

return io

# Пополнение счета
def popolnenie(self):
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

А чем пополнение (popolnenie) отличается от взноса (vznos)?

Copy link
Copy Markdown
Owner

@IlyaOrlov IlyaOrlov left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Код с банкоматами хорош, но стоит его оптимизировать!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants