Форум сайта python.su
xam1816Там 2000 строк кривого кода, наврядли вам будет интересно его анализировать. Вот один из самых кривых модулей, который втиснут в функцию (как уже писал, я тогда не знал, что def - это функция, я ее применял как модуль, как что-то, что будет много раз повторяться). И таких “модулей 20 на всю программу. Хочется их сделать истинными модулями с правильной передачей переменных, но иначе не умею, только так и с глобальными переменными.
Выложите сюда свой код, который изначально у вас был на одном файле
def etherscan_parser(condition): global last_eth_block, eth_difficulty, profitability, block_profitability, lowest_theoretical_profitability, lowest_theoretical_profitability_truncated_list_avg, block_rewards_truncated_list_avg, profitability_truncated_list_avg,\ block_rewards_list, flexpool_block_rewards_list, profitability_list, limited_profitability_list, tx_fees_list, tx_fees_list1_avg tx_fees_list = [] block_rewards_list = [] flexpool_block_rewards_list = [] profitability_list = [] limited_profitability_list = [] lowest_theoretical_profitability_list = [] try: if condition is True: etherscan_request = requests.get('https://api.etherscan.io/api?module=proxy&action=eth_blockNumber&apikey=xxxxxx').json() last_eth_block_hex = etherscan_request['result'] last_eth_block = int(last_eth_block_hex, 16) last_eth_block = last_eth_block - 10 # берем чуть более давние блоки, так как данные о самых последних блоках иногда поступают с небольшим опознаднием last_eth_block_hex = hex(last_eth_block) # снова переводим в hex, так как надо будет брать difficulty, а ее из-за запаздывания информации по последнему блоку еще нет last_eth_block_data = requests.get('https://api.etherscan.io/api?module=proxy&action=eth_getBlockByNumber&tag=' + str(last_eth_block_hex) + '&boolean=true&apikey=xxxxxx').json() eth_difficulty = int(last_eth_block_data['result']['difficulty'], 16) etherscan_request = requests.get('https://api.etherscan.io/api?module=block&action=getblockreward&blockno=' + str(last_eth_block) + '&apikey=xxxxxx').json() block_status = (etherscan_request['status']) while block_status == '1': # block_status is str!! blocknumber = int(etherscan_request['result']['blockNumber']) block_data_etherscan_dict[blocknumber] = etherscan_request['result'] last_eth_block += 1 time.sleep(short_iteration_pause) etherscan_request = requests.get('https://api.etherscan.io/api?module=block&action=getblockreward&blockno=' + str(last_eth_block) + '&apikey=xxxxxx').json() block_status = etherscan_request['status'] for blocknumber in block_data_etherscan_dict.keys(): timestamp = int(block_data_etherscan_dict[blocknumber]['timeStamp']) block_reward = int(block_data_etherscan_dict[blocknumber]['blockReward']) / 1000000000000000000 block_profitability = (86400 * 1000000000000 * block_reward * eth_btc_exchange_rate / eth_difficulty) * (1 - orphan_rate) print('Block profitability =', block_profitability, '; block# =', blocknumber, 'reward =', block_reward, 'difficulty =', eth_difficulty) if block_profitability > profitability_limit: limited_block_profitability = profitability_limit else: limited_block_profitability = block_profitability lowest_theoretical_profitability = (1000000000000 * (average_uncle_reward + 0.0625 + (2 - average_uncle_reward - 0.0625) * (1 - uncle_rate)) * (1 - orphan_rate) / eth_difficulty) * 86400 * eth_btc_exchange_rate # 1.8125 = 1.75 + 0.0625 inclusion reward, 0.1875 = 2 - 1.8125. Only 1.75 ETH uncles calculated uncle_inclusion_reward = int(block_data_etherscan_dict[blocknumber]['uncleInclusionReward']) / 1000000000000000000 block_miner = block_data_etherscan_dict[blocknumber]['blockMiner'] my_etherscan_dict[blocknumber] = {'block_reward': block_reward, 'tx_fees': block_reward - 2 - uncle_inclusion_reward, 'timestamp': timestamp, 'block_profitability': block_profitability, 'uncle_reward': [], 'uncle_profitability': [], 'uncle_miner': [], 'lowest_theoretical_profitability': lowest_theoretical_profitability, 'limited_block_profitability': limited_block_profitability, 'limited_uncle_profitability': [], 'uncle_inclusion_reward': uncle_inclusion_reward, 'block_miner': block_miner} tx_fees_list.append(my_etherscan_dict[blocknumber]['tx_fees']) tx_fees_list1 = tx_fees_list[-10:] tx_fees_list1_avg = statistics.mean(tx_fees_list1) for x in range(0, len(block_data_etherscan_dict[blocknumber]['uncles'])): uncle_reward = int(block_data_etherscan_dict[blocknumber]['uncles'][x]['blockreward']) / 1000000000000000000 uncle_profitability = (86400 * 1000000000000 * uncle_reward * eth_btc_exchange_rate / eth_difficulty) * (1 - orphan_rate) uncle_miner = block_data_etherscan_dict[blocknumber]['uncles'][x]['miner'] my_etherscan_dict[blocknumber]['uncle_profitability'].append(uncle_profitability) my_etherscan_dict[blocknumber]['uncle_reward'].append(uncle_reward) my_etherscan_dict[blocknumber]['uncle_miner'].append(uncle_miner) if uncle_profitability > profitability_limit: limited_uncle_profitability = profitability_limit else: limited_uncle_profitability = uncle_profitability my_etherscan_dict[blocknumber]['limited_uncle_profitability'].append(limited_uncle_profitability) for blocknumber in my_etherscan_dict.keys(): block_rewards_list.append(my_etherscan_dict[blocknumber]['block_reward']) if my_etherscan_dict[blocknumber]['block_miner'] == '0x7f101fe45e6649a6fb8f3f8b43ed03d353f2b90c': flexpool_block_rewards_list.append(my_etherscan_dict[blocknumber]['block_reward']) profitability_list.append(my_etherscan_dict[blocknumber]['block_profitability']) limited_profitability_list.append(my_etherscan_dict[blocknumber]['limited_block_profitability']) lowest_theoretical_profitability_list.append(my_etherscan_dict[blocknumber]['lowest_theoretical_profitability']) for x in range(0, len(my_etherscan_dict[blocknumber]['uncle_profitability'])): block_rewards_list.append(my_etherscan_dict[blocknumber]['uncle_reward'][x]) if my_etherscan_dict[blocknumber]['uncle_miner'][x] == '0x7f101fe45e6649a6fb8f3f8b43ed03d353f2b90c': flexpool_block_rewards_list.append(my_etherscan_dict[blocknumber]['uncle_reward'][x]) profitability_list.append(my_etherscan_dict[blocknumber]['uncle_profitability'][x]) limited_profitability_list.append(my_etherscan_dict[blocknumber]['limited_uncle_profitability'][x]) block_reward_truncated_list = block_rewards_list[int(-4.545 * minutes_to_average_for_blockchain_profitability):] profitability_truncated_list = profitability_list[int(-4.545 * minutes_to_average_for_blockchain_profitability):] limited_profitability_truncated_list = limited_profitability_list[int(-4.545 * minutes_to_average_for_blockchain_profitability):] lowest_theoretical_profitability_truncated_list = lowest_theoretical_profitability_list[int(-4.545 * minutes_to_average_for_blockchain_profitability):] # LIST AVERAGES block_rewards_list_avg = round(statistics.mean(block_rewards_list), 3) block_rewards_truncated_list_avg = round(statistics.mean(block_reward_truncated_list), 3) try: flexpool_block_rewards_list_avg = round(statistics.mean(flexpool_block_rewards_list), 3) # если в последних блоках нет блока от flexpool, программа тут останавливается except: pass profitability_truncated_list_avg = round(statistics.mean(profitability_truncated_list), 3) limited_profitability_truncated_list_avg = profitability = round(statistics.mean(limited_profitability_truncated_list), 3) # ТУТ ОСНОВНОЕ ЗНАЧЕНИЕ profitability !!! lowest_theoretical_profitability_truncated_list_avg = round(statistics.mean(lowest_theoretical_profitability_truncated_list), 3) # COLLECTING TO MY OUTPUT DICT output_data_dict['block_rewards_list_avg'] = block_rewards_list_avg try: output_data_dict['flexpool_block_reward_etherscan_avg'] = flexpool_block_rewards_list_avg # если в последних блоках нет блока от flexpool, программа тут останавливается except: pass output_data_dict['block_rewards_truncated_list_avg'] = block_rewards_truncated_list_avg output_data_dict['profitability_truncated_list_avg'] = profitability_truncated_list_avg output_data_dict['profitability'] = profitability output_data_dict['lowest_theoretical_profitability_truncated_list_avg'] = lowest_theoretical_profitability_truncated_list_avg full_profitability_to_lowest_profitability_ratio = round(100 * profitability_truncated_list_avg / lowest_theoretical_profitability_truncated_list_avg, 2) full_profitability_to_lowest_profitability_ratio_list.append(full_profitability_to_lowest_profitability_ratio) reward_and_profitability_avg_by_timestamp_dict[int(time.time())] = {'block_rewards_list_avg': round(statistics.mean(block_rewards_list), 3), 'block_rewards_truncated_list_avg': block_rewards_truncated_list_avg, 'profitability': profitability, 'profitability_truncated_list_avg': profitability_truncated_list_avg, 'lowest_theoretical_profitability_truncated_list_avg': lowest_theoretical_profitability_truncated_list_avg} try: last_eth_block_hex = hex(last_eth_block) last_eth_block_data = requests.get('https://api.etherscan.io/api?module=proxy&action=eth_getBlockByNumber&tag=' + str(last_eth_block_hex) + '&boolean=true&apikey=xxxxxx').json() eth_difficulty = int(last_eth_block_data['result']['difficulty'], 16) except: pass except: print('eth_block_reward_etherscan error')
Отредактировано Renaldas (Фев. 11, 2022 21:32:19)
Офлайн
Офлайн
RenaldasВот здесь как раз нужно понять: функция - это то что будет использоваться - “вызываться” много раз.
я тогда не знал, что def - это функция, я ее применял как модуль, как что-то, что будет много раз повторяться
Офлайн
py.user.nextА откуда мне уметь, я же врач по специальности. Наверное, мой уровень программирования примерно равен твоему уровню колупания в каналах зубов. Ну и ничего страшного, определенные практические цели даже неумелым программированием были достигнуты, пробую учиться дальше
Офлайн
xam1816К сожалению, так как я учился по принципу эмпирической обратной связи (типа, выполяняется ли практически то, что мне нужно), понять я этого не мог. Как уже писал, я def считал просто как бы модулем программы, и о том, что это функция, которая что-то получает на вход и что-то выдает, сообразил только после месяцев попыток. До этого в def я клал кусок кода, который хотел повторять, вне зависимости от длины, все нужное обзывал глобальными переменными, и как-то крутился.
def last_block_number(): etherscan_request = requests.get('https://api.etherscan.io/api?module=proxy&action=eth_blockNumber&apikey=xxx').json() last_block = int(etherscan_request['result'], 16) return last_block
Отредактировано Renaldas (Фев. 12, 2022 18:12:12)
Офлайн
Renaldasвы сначала просто код соберите в функции, без потери работоспособности
и их объединить в модуль?
for i in seq:
делаем что-то с i
на пол страницы
def func(seq):
делаем что-то с seq
return result
result = func(seq)
def is_valid(var):
if var == чему-нибудь:
if var in в какой-нибудь последовательности
return True
if is_valid(var): some_list.append(var)
def str_to_other(string):
какую-то строку string мы преобразуем в другую херню
по какому-нибудь условию
return эту херню
Офлайн
RenaldasЭто плохо, конечно, специальность для программирования ужасная. У строителя какого-нибудь больше шансов, хотя он вроде бы выглядит тупо. Создание программы очень сильно напоминает построение дома. Чтобы построить первый этаж, нужно заложить фундамент. Чтобы построить второй этаж, нужно построить первый этаж. Так что у строителя больше шансов.
А откуда мне уметь, я же врач по специальности.
RenaldasНу вот ты заходишь к стоматологу в кабинет, а у него, значит, такой стенд, в котором лежат красивые такие инструменты типа дрель Bosh для сверления стен и закручивания шурупов, потом кувалда от Matrix там или чего-нибудь такого с резиновой ручкой, топор такой английский, ну и так далее. А зашёл ты там пломбу посмотреть или что-то наподобие. И он тебе говорит такой “садитесь!”. Ты такой “куда?”. Он такой “ну вот, вы что не видите, кресло стоит кожаное, вот в нём будем всё проверять”. Ну и всё, и ты ему говоришь “а вы точно стоматолог?”, ты-то знаешь, что он вообще какой-то левый, что он не врач даже, не медик. А он тебе говорит “да, я стоматолог, я честно признаюсь, я практикант, но вы можете на каждый инструмент посмотреть, там везде стоит моя эмблема и на ней написано, что я стоматолог, то есть это всё серьёзно, это операционный кабинет”. Ну, ты видишь, что это всё надо выкинуть, а это всё стоит целую гору денег, которые он на это потратил, всё это расставлял он там, кто-то наносил ему эту лазерную гравировку его эмблемы тоже не за бесплатно. И ты видишь, что он не мошенник, а просто верит, что так можно лечить людей. И он даже сделал им удобное кресло.
ой уровень программирования примерно равен твоему уровню колупания в каналах зубов
RenaldasТо, что ты выставил, примерно функций 100-200 займёт. Вообще, функций много не бывает. Пиши функцию, не боись, потому что она как раз тебя спасёт. А вот отсутствие функции, оно как раз тебя угробит. Выглядеть это будет так: через месяц поменяется какая-нибудь форма хешей без предупреждения, и из-за этого тебе нужно будет переписать примерно две тысячи строк; потом через месяц поменяется ещё какой-нибудь функционал, и тебе из-за этого нужно будет поменять ещё две тысячи строк, а из-за них, так как ты их поменял, надо будет возвращаться к первым двумя тысячам строк и менять их снова - то есть получится, что надо в целом пять тысяч строк поменять. И потом ты со страхом будешь ждать “а не поменяют ли там опять что-нибудь через месяц, из-за чего мне придётся выделять неделю своего времени, чтобы просто сохранить программу рабочей, так как она каждый раз ломается, из-за того что там опять что-то поменяли”. Вот чтобы этого не было, нужно чтобы всё было изолировано. Это как на машине: вот ты едешь, раз и прокололось колесо; ты выходишь, это колесо снимаешь, из багажника достаёшь другое колесо и ставишь на место проколотого колеса; дальше едешь как ни в чём ни бывало. Колесо изолировано от машины, благодаря чему ты и можешь это всё проделать за короткий срок. А вот если ты ехал в машине и случайно скальпелем, который там выпал как-то, пробил ногу себе, ты не можешь отстегнуть ногу и другую ногу поставить, надо ехать в больницу, а все дела эти, куда ты ехал, надо отменять. Это произошло потому, что нога от тела не изолирована. Вроде повреждена только нога, а влияет это на всё тело.
Получается, то что я выставил тут, должно было бы быть модулем с 20-30 функций в нем, так?
Офлайн
да блин хорошь над человеком прикалываться киньте …
короч эээ берешь лутца первыи и второй том (изучаем на питон) эт около 2000 ст.
потом берешь первый и второй том его же (прагроммируем на питон) тож около 2000 ст.
и втыкаешь все это (просто следуй правилу столько то страниц в день)
если есть непнятки гугл и что там у тебя в помощь
все у тебя есть база по языку (ну там еще много чего но оно такое не первой необходимости)
дальше более общее
ну там …
алгоритмы
базы данных
структуры данных
итд это если нужно потом подтянешь
а ваша эмпирика очень затратна по времени
Офлайн
блин хорошь над человеком прикалываться киньте …
короч эээ берешь лутца первыи и второй том (изучаем питон) эт около 2000 ст.
потом берешь первый и второй том его же (прагроммируем на питон) тож около 2000 ст.
и втыкаешь все это (просто следуй правилу столько то страниц в день)
если есть непнятки гугл и что там у тебя в помощь
все у тебя есть база по языку (ну там еще много чего но оно такое не первой необходимости)
дальше более общее
ну там …
алгоритмы базы данных
структуры данных
итд
это если нужно потом подтянешь
а ваша эмпирика очень затратна по времени
зы кнешно практику забрасывать не стоит но основной упор на изучение вот и все
Отредактировано AD0DE412 (Фев. 13, 2022 09:23:47)
Офлайн
Спасибо всем, к сожалению, похоже, на более высокий уровень более правильного программирования, как я вижу, мне не перейти, так как я просто на уровне большинства вас в моей специальности
К счастью, ну хоть работоспособный код получается, какой бы он там кривым не был бы. Похоже, врачам учиться программированию пока что можно только эмпирически, путем обратной связи “работает - не трогаем”, “не работает - меняем до тех пор, пока заработает”. Либо просто менять специальность и уделять годы времени программированию, что, пока, не получается
Офлайн