Я бы сказал тут просматривается некий предыдущий опыт программирования
Как будто бы на паскале
py.user.nextКак всегда спасибо. Я как-то порывался уже купить Кушниренко для математиков, но не нашёл в продаже, книжки старые уже, 88г., скачал, пробежался по оглавлению и пара сомнений закралось: а не устарела ли инфа? Фортран, который там используется для практики сильно отличается от питона? или просто скипать всю практику?
Тут писал подборку материалов.
Тут выполнил один пример от и до.
py.user.next
Много у тебя всяких непитонячих приёмов
ZerGТа нет, нету опыта по большому счёту. С комплюхтером-то знаком давно, делаю на нём всякое, мультимедийное, околоигровое и музыкальное, но во взрослый кодинг полез только два месяца назад. До этого, разве что за Джаву брался тройку лет назад и бросил, да в скриптах поднаторел слегка, на проприетарном недо-языке для игр серии TES. https://tesall.ru/tutorials/the-elder-scrolls-modding/modostroenie-oblivion/485-obse-v-massi
тут просматривается некий предыдущий опыт программирования
py.user.nextЭто, думаю, следствие того, что я, не будь дурак, специально сделал так, чтобы некоторые функции могли ходить к одной и той же с разными аргументами и та в свою очередь выдавала разные же результаты. Просто походы такие совершаются у меня иногда в самых неожиданных местах, да, из-за этого получаются спагетти).
у тебя функции такие маленькие, а в них уже можно запутаться.
PalromТам не используется FORTRAN. Там используется псевдокод на русском языке. Видно, что ты вообще её не открывал, потому что там FORTRAN'а нет нигде, только в конце книги он привёл пример реализации на FORTRAN'е чего-то там. И там главное не код, а концепции, которые он раскрывает.
Я как-то порывался уже купить Кушниренко для математиков, но не нашёл в продаже, книжки старые уже, 88г., скачал, пробежался по оглавлению и пара сомнений закралось: а не устарела ли инфа? Фортран, который там используется для практики сильно отличается от питона? или просто скипать всю практику?
PalromНу, вот это хрень всё. Там есть правила создания функций и всё это в книжке написано. Как их делать, какие аргументы куда, как что называть. Она не должна выдавать разные результаты. Она должна иметь слабое предусловие и сильное постусловие. И это нужно соблюдать для того, чтобы потом эту функцию присобачивать не только внутри этой программы к другим её появляющимся частям, но и чтобы эту функцию можно было перенести в другие программы, которых на момент написания этой функции ещё не существовало. Потом ты это применяешь уже не к функциям, а к целым программам. И таким образом становится возможным одну программу использовать вообще для чего-то другого, для чего она не планировалась изначально.
Это, думаю, следствие того, что я, не будь дурак, специально сделал так, чтобы некоторые функции могли ходить к одной и той же с разными аргументами и та в свою очередь выдавала разные же результаты.
def goods_demo(demo_type=0, product=None): p = 'Товар:' s = 'Состав: ' c = 'Цена за 100 гр.: ' k = 'Количество (г): ' if demo_type == 0: for i in goods: print(i) return elif demo_type == 1: return f'{s}{goods[product][0]}' elif demo_type == 2: return f'{c}{goods[product][1]}' elif demo_type == 3: return f'{k}{goods[product][2]}' elif demo_type == 4: return f'{s}{goods[product][0]}\n' \ f'{c}{goods[product][1]}\n' \ f'{k}{goods[product][2]}' elif demo_type == 6: print('\nОстаток кондитерской:') for i in goods: print(f'{p} "{i}" {k}{goods[i][2]}') return
def ask_action_type(product): .... return goods_demo(action, product)
user_interest = ask_action_type(user_choice) if user_interest == 5:
def goods_demo(demo_type=0, product=None):
def goods_demo(product="Печеньки"):
if demo_type == 0: for i in goods: print(i) return
if action == 5: return action elif 1 <= action <= 4: return goods_demo(action, product)
if action == BUY: return action elif action in (PRICE, AMOUNT...): return goods_demo(action, product)
def add_to_cart(product, price, weight): if product in my_cart.keys(): my_cart[product][0] += price else: my_cart.update({product: [price, weight]})
'торт': ['мука, яйцо, сливки, шоколад', 150, 2000]
if product in my_cart.keys():
def check_goods(): global goods new = goods.copy() for i in goods: if goods[i][2] == 0: new.pop(i) goods = new.copy()
goods = new.copy()
FishHookФункция check_goods(): это вообще “зашквар”, это я полностью признаю. Если в б/д будет не 3 товара а миллион, то эта функция будет вешать программу на пару секунд при каждом проходе цикла в main(). Это криминал, но другого я не придумал. Чехарда с копированием словаря нужна мне была для того, чтобы проходить по исходному циклом for. Если итерировать и подчищать goods напрямую, то вылезет ошибка “изменение длины во время итерации”. Я просто пробовал несколько подходов, и такой, с копированием оказался самый компактный и понятный..
объясните, пожалуйста, зачем нужны .copy()?
FishHookНе догоняю.. Я ведь просто пробегаюсь по списку ключей словаря goods с помощью метода keys. Я где-то начитался, что метод работает очень быстро и для подобных целей нужно использовать именно его. Понятно, что для проверки членства программа встаёт, условно, на паузу и перебирает все ключи, но, а как иначе это можно было бы реализовать? (p.s. Про Биг-О я знаю, когда изучал алгоритмы, сталкивался с этим)
временная сложность получения значения по ключу для хэш-таблицы O(1) а перебор итератора это O(n).
FishHookДа, если список со значениями будет иметь меньше элементов, то всё, кранты. К созданию списка товаров нужно просто не подпускать криворукого манагера, или сделать функцию, которая проверяла бы словарь на соответствие.
а добавляете вы новый продукт и элементов только два, при этом везде в программе вы получаете данные по индексу. Изменение структуры БД приведет к полному переписыванию программы.
FishHookДругой.
Если я переименую “Торт” в “Торт кремовый” это один и тот же товар или уже другой?
В продаже имеется:
торт кремовый
пирожное
маффин
Какой из товаров вас интересует?
>>> торт
Такого товара нет, введите товар из списка выше.
Какой из товаров вас интересует?
>>> торт кремовый
Что вы хотели бы узнать о товаре?
(1)-состав, (2)-цена, (3)-количество, (4)-вся инф., (5)-покупка
>>>
FishHookА не надо менять порядок следования) Нужно добавить функционал? Дописывайте дальше по порядку.. Это то самое “Интерфейсную часть от логики надо отделять всегда”, может я её организовал криво-косо, но преследовал именно эту цель.
очевидно, что это некие пункты меню. И так же очевидно, что если я поменяю порядок следования этих пунктов, то программу придется переписывать.
FishHook
То есть даже если закрыть глаза на неопределенное поведение функции (то печатает в консоль, то возвращает строку) это какая-то ерунда, потому что в коде мы ждем целое число, которого функция не возвращает никогда.
PalromДа, функция просто игнорирует аргумент product если demo_type не требует его для отработки кода внутри функции. Меня уже размотали по этому поводу) По началу эта функция показалась мне удачным решением..
специально сделал так, чтобы некоторые функции могли ходить к одной и той же с разными аргументами и та в свою очередь выдавала разные же результаты.
py.user.next
Ну, вот это хрень всё.
FishHookА “код 5” к функции goods_demo уже не имеет никакого отношения. 5 отрабатывает в main:
И самое загадочное в этой функции это “Тайна загадочной пятерки” ибо при demo_type == 5 функция не делает вообще ничего.
user_interest = ask_action_type(user_choice) if user_interest == 5: buy(user_choice)
FishHookВ целом, спасибо за анализ, большое, человеческое. Пока разбирал программу свежим взглядом, нащупал опять свою старую проблему, на которую мне указывал py.user.next ещё месяц назад, и от которой, я думал избавился: мои функции очень жёстко завязаны друг на друга, и если хоть в одной что-то не так, и она не подготовила как следует данные для другой функции, то всё, обвал.
я обещал ревью
py.user.nextЖена у меня уже оценила. Пока едем в лифте она мне трижды проговаривает какую-то новость и только на четвёртый вопрос “Что ты думаешь по этому поводу?” я очухиваюсь и перестаю гонять цикл в цикле какой нибудь. Но не смотря на негодование, книжку “Программирование для математиков” мне нашла на озоне, заказала уже.
Ты лежишь на кровати, смотришь в потолок и пишешь программу на псевдокоде. Написал - встал, пошёл и записал её в комп, переписал из воображения в комп. Вот так это работает. Программирование - это не посиделки за компом, это нечто большее.
Palrom
Я просто пробовал несколько подходов, и такой, с копированием оказался самый компактный и понятный..
def check_goods(): global goods goods = {k: v for k, v in goods.items() if v[2] != 0}
Не догоняю.. Я ведь просто пробегаюсь по списку ключей словаря goods с помощью метода keys.
if product in my_cart.keys(): my_cart[product][0] += price
if product in my_cart: my_cart[product][0] += price
Другой.Здорово! То есть если у меня в корзине есть товар Торт, а Торт переименовали, то у меня в корзине торт превратился в ошибку времени выполнения. Идентификатор должен быть уникальным и неизменяемым
Palromэто не программист решает, а заказчик, скажет поменять - поменяешь
А не надо менять порядок следования)
PalromТвой код противоречит этому правилу. Вот смотри
Это то самое “Интерфейсную часть от логики надо отделять всегда”
BUY = "buy" GET_AMOUNT = "get_amount" GET_INFO = "info" MENU = [ BUY, GET_AMOUNT, GET_INFO ] TRANSLATION = { BUY: "Купить", GET_AMOUNT: "Остаток товара", GET_INFO: "Товары в наличии" } def ask_action(): for i, m in enumerate(MENU): print(i, TRANSLATION[m]) return MENU[int(input())] def buy(): pass def get_amount(): pass def get_info(): pass actons = { BUY: buy, GET_AMOUNT: get_amount, GET_INFO: get_info } def main(): action = ask_action() procedure = actions[action] procedure()
Palrom
А “код 5” к функции goods_demo уже не имеет никакого отношения. 5 отрабатывает в main:
Palromвот, а в ВУЗе пять лет учатся дураки, теорию какую-то изучают, математику какую-то дурацкую, надо на гикбрейнсах учиться. Не знаю, как словарь работает? Да и пофиг
А ведь во всяких гикбрейнсах обещают ажно вход в профессию за 3-6 месяцев..