Это копия, сохраненная 10 октября 2019 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Предыдущий >>1451619 (OP)
ЧАВО: https://github.com/TheKnightsWhoSayNi/info/wiki/Hat - по идее с этого надо начинать, прежде чем вопросы задавать, но аноны бугуртят, что это говно мамонта.
Книжки: https://yadi.sk/d/HQhhsBsq3TVRUq
Тоже книжки: https://yadi.sk/d/tArKKuQu3Kejuq
Больше книжек: https://yadi.sk/d/H-00n-UG3RSQem
Очень много книжек: https://drive.google.com/drive/folders/13YaFijvuH4dtv-PjUKVWLQ7ZIqXIfCLK
Анон, вместо того, чтобы без разметки постить код, лучше шарь код через специальные ресурсы:
https://ideone.com/
https://pastebin.com/
https://pyfiddle.io/
https://www.codepile.net/
#######################################
Вопросы-ответы:
А стоит ли читать Лутца, том номер N?нения в треде разделены. Кто-то за(очень неплохая база даётся), кто-то против(слишком много воды и объём книг убивает всё рвение). В общем - решать тебе, книга вредна не будет, то ты можешь её просто не дочитать и забросить.
Стоит ли читать %книга_нейм%, если там питон версии 2.х? - Нет, не стоит. 100% есть более актуальная книга, для пистона 3.х
А что ещё можно читать? - Питон сам по себе очень хорошо задокументирован, и для уровня начинающих, и для продвинутого. Смотри официальную документацию. Можно начать вот с этого https://docs.python.org/3/tutorial/introduction.html
А как учить джангу? Нахожу только книги по джанге 1.х - У джанги отличные доки (одни из лучших для пистоновских либ, имхо), почитай их для начала. Книгу по джанге можно читать и для версий <2, это не проблема, т.к. принципы остаются теми же. Для переката на 2.х хватит changelog`a или тех же самых доков/статей. Начни изучать с разбора учебного приложения с голосовалкой, из официальной документации.
в ньюфаг-треде написано, что нужно начинать с SICP, чтобы научиться программировать - Вот, пожалуйста, та же самая программа, но переработанная под язык Python http://composingprograms.com/ (нужно знать ангельский или уметь пользоваться переводчиком)
Дайте нормальные книжки на русском! Мы, блядь, не в пиндосии живём - брат, смотри книжки по ссылке в шапке, там есть и русские. Но помни, без языка ангелов твоя жизнь проходит мимо и ты обречён быть на обочине знаний и технологий.
Бля, я мошенник, предыдущий не тот, что в шапке, а этот:
>>1459370 (OP)
>>1459370 (OP)
>>1459370 (OP)
>>1459370 (OP)
Заньюфажился в тред, котаны. Мне тут пришли няшные Node-mcu, сейчас освою учебничек ПРОХОРЁНКА и буду катать умный дом на малинке и нодах с использованием MicroPython :3
Питонисты джангисты, подскажите, чего почитать и посмотреть, чтоб в джангу вникнуть.
В питоне опыт есть некоторый, последние 2 года круды на экспрессе писал, а тут предстоит на проект с джангой перейти. Как не совсем обосраться?
>которые учат что-то по несоответствующей документации
>причем винят не себя, а сложнойсть фреймворка
Что за хуйню ты себе навыдумывал? Тратят попытки у него, охуеть. Второй абзац в моем посте тебе ничего не сообщил? Была попытка разобраться без гугла путём пердолинья джанги - не получилось, пошел в гугл. Вывод - не нужно пытаться что-то сделать самому пока не получил начальные знания, понимание концепции в целом.
> Пиздец. Хорошо, что таких долбоебов максимум на стажера возьмут, а потом нахуй выкинут.
Имплаин я пытаюсь вкатиться на должность, а не от нехуй делать раз через раз ковыряюсь в этом вашем питоне.
Пиздец ты инфантил, не надо так
>>1465903
>мам смотри я знаю англицкий!
Блядь, сейчас этим хвастаться такое себе - любой бомж с подворотни нынче знает английский язык, другое дело что осваивать абсолбтно новые для себя штуки легче на нативном языке для не профессиональных погромистов, конечно
parameter = "?rel_rhy=jingle"
req = requests.get('https://api.datamuse.com/words' + parameter)
Почему тут такой странный синтаксис?
parameter = {"rel_rhy":"jingle"}
request = requests.get('https://api.datamuse.com/words',parameter)
Как это работает? Словарь подставляет ? перед rel_rhy и = перед jingle
Если правильно понимаю вопрос, то иногда набор параметров заранее не известен, и если он у тебя в словаре, то переделать в urlencode его достаточно просто:
params = {"key1": "value1", "key2": "value2"}
url = "http://example.com?" + "&".join(["{}={}".format(p[0], p[1]) for p in params.items()])
# url = "http://example.com?key1=value1&key2=value2"
Разумеется, в реальности всё сложнее, тут не учтены запрещённые символы, вроде "+" и прочего. Поэтому напрямую этот код никто не пишет, все вызывают специальную функцию из ${framework_name}. Да и в стандартной либе это есть.
Ох, я еще больше запутался. Но спасибо за ответ.
Это же requests либа только умеет обрабатывать такой синтаксис, как я понимаю.
Эксперементировал в конкатенации со str и dict и не вышло ничего.
При помощи модуля re, изучай - там в двух словах не объяснишь, у него формат вабще крайне сложный.
Циклом пройти по строке, считая каждый раз количество повторяющихся символов и вставляя это количество после первого символа вместо всех остальных. Вставлять можно срезами+конкатенацией строк. Короче бери и делай, дальше только вместо тебя всё написать.
>>65990
Очевидно это задача на алгоритмы, а не регулярные выражения, там даже указано, что использовать можно.
Спасибо, анон, почитаю
out = [st[0]]
num = 1
for i in st[1:]:
__if i == out[-1]:
____num += 1
__else:
____out += num
____num = 1
____out += i
out += num
out = ''.join(map(str(out)))
Лучше полагаться на то, как это делает requests сама. Конкатенация, как уже сказано, неправильно обрабатывает спецсимволы.
К тому же, конкатенация может прокатить только с get-запросом. Post ты через url не передашь, а requests сама сделает это за тебя, тебе остаётся только словарь передать вторым аргументом.
Сори, не запускал, видимо какой-то неявный эффект.
>>66017
> {{ d.key.key_nested }}
Ты пишешь ерунду
Сделай просто
> {{ key_nested }}
> Нафига мне ключ?
А нафиг ты по ключам итерируешься?
Итерируйся по значениям или ключу+значению.
Ну раз спрашиваю, значит нужно. Вроде как ничего сложного и необычного в этом нет, но возможность так делать почему-то, как я понимаю, отсутствует.
Потому что ты глупость пытаешься сделать.
Я уже написал, что если хочешь ключ - итерируйся по ключу, если хочешь значение - по значению, если надо и то, и то - юзай и то, и то.
Ты или свой кейс показывай(возможно тебе вообще не словарь пригодился бы) или ебись сам.
Собираю список элементов из 5к объектов за 4секунды
Есть какая-нибудь быстрая альтернатива, чтобы можно было оперировать коллекцией по индексу? Set/Tuple тоже долго
Как обрабатывают листы по 1кк элементу?
Взять го?
Но скорее всего тупишь либо ты, либо твой комп. Мне лень делать бенчмарки, но я вижу задержку только при создании листа более 100к элементов.
Попробуй модуль array.
ну и еще у объектов переопределен метод __eq__, что увеличивает время проверки для List comprehension
Списки создаются намного быстрее. Скорее всего у тебя твои объекты создаются очень медленно.
Просто список на 5k объектов будет меньше чем за миллисекунду создан.
>Есть какая-нибудь быстрая альтернатива, чтобы можно было оперировать коллекцией по индексу?
Так диапазон же?
Сап, сертификации после прохождения курсов/специализаций от coursera котируются у HRов при устройстве на первую работу джуном? Вроде же серьезная платформа
raz = a.split()
print (raz)
AttributeError: 'list' object has no attribute 'split'
???
Чому ерор? Делаю как в примере https://younglinux.info/python/string.php
> Делаю как в примере
Делаешь не как в примере. Попробуй просто подумать, что именно ты хочешь сделать? На какие части ты хочешь разбить список строк?
Друг, ты питон учишь что ли????
Единственный успех, полученный мной в задании - закрашивает только первый коридор, но в итоге код становится какой-то слишком объемным. На данный момент после первого закрашивания точка просто врезается и крашится.
Может делал кто, у меня от этих циклов голова уже кипит.
Один из предыдущих вариантов был с break, но прерывал не там где надо.
Был бы не криворуким, получил бы такой же результат в питухоне
Зато у нас есть секс, а у тебя нет
И что, в погромировании всем действительно не похуй что ты там накурсировал себе?
Это жеж как корочки из учебных центров получать
Скорее стажером.
Только дошел до этого задания. Решил сходу, предыдущее задание у меня вызвало больше проблем.
Спасибо большое. То, что надо.
Первый мув райт нужен чтобы цикл начинать с проверки, а не с движения, так проще с последней клеточкой в главной линии
Хотя я вижу, что прогу можно переработать, но это я где-то месяц назад делал
Иногда подмывает пододвинуть кружок к стартовой точке цикла, но если пораскинуть мозгами, то почти всегда можно сразу всё в цикл пихать.
Ну хз, если подумать концептуально, то цикл должен выполнять задачу внутри вот этой линии, как добраться до первой клетки в линии это не задача главного цикла. Я когда делал, нигде особо это запихивать не пытался
И нафиг там регистр ax? В каком месте предполагается его использование?
Я тот анон, который месяц назад это делал, тоже помню возникла с регистром проблема, гуглил, потому что непонятно было, что с ним делать. Но саму задачу сейчас я уже особо не помню, могу просто скинуть решение
Скин, пожалуйста. Я вроде решил её, но кружок серый, типа "нештатное завершение". Хз, что нужно. Какой-то условие не выполняю, а какое - понять не могу.
Шика-а-а-ароно.
Разобрался. Только и нужно-то было счетчик поставить в уже готовое своё решение. Уффф!! Осилил таки все задачи робота.
Анон, а ты графические задачи делал дальше по курсу?
Ага, я делал все задачи из первых 9 практик. В контексте сортировок даже занял второе место в общем зачёте, не хватило одного очка до первого
Контесте*
Оу, там еще какие-то соревнования будут? Интересно.
Просто я вот сижу читаю книгу, мануалы на ютубе - там при пояснении классов рассказывают как СОЗДАТЬ МОДЕЛЬ СОБАКИ, или подобную хуйню, с подклассами вроде КЛАСС РЕТРИВЕР(СОБАКА), а в результате тупо создают экземпляр собаки с описанием свойств - тоже самое можно просто вбить в переменную. Какая именно должна стоять задача, чтобы начать описывать объекты экземплярами класса?
А КАК БУДЕТ ЛАЯТЬ ТВОЯ СОБАКА?
ТЫ СОЗДАШЬ ФУНКЦИЮ КОТОРАЯ ПРИНИМАЕТ СОБАКУ И ЛАЕТ?
Я ХОЧУ ЧТОБЫ РЕТРИВЕРЫ ДЕЛАЛИ ГАВ ГАВ А МОПСЫ РРРРРР!
Класс - это не только поля, это ещё и методы. Тоже собрался вручную их вбивать?
Вообще, классы удобны тогда, когда у тебя есть несколько логически взаимосвязанных методов и есть общие переменные, которые классы могут использовать.
А с наследованием хороших примеров не ищи, их очень мало. В теории наследование удобно, а на практике используется очень редко.
Прям такого, чтобы нельзя, нет. До появления ООП же как-то писали программы, и ничего.
Классы не дают чего-то принципиально нового, они лишь упрощают моделирование некоторых сущностей. На тех же сях вполне можно написать ряд функций, принимающих одну и ту же структуру, но по-разному с ней работающих.
Не воспринимай классы как что-то фундаментальное. Классы лишь дают новые способы сделать что-то, и всё.
понял, спасибо.
>на практике используется очень редко.
Бля, если бы. В книжках написано про синглтоны и фабрики, значит будем их везде юзать. Код стал в три раза длиннее и нечитаемым? Похую.
Синглтоны и фабрики вообще не про наследование, а про оверинжиниринг. Сюда же ситуации, когда у абстрактного класса только один потомок, когда у интерфейса только одна реализация, и тому подобные.
У наследования очень мало юз-кейсов, и синтетическое их выдумывание ни к чему хорошему не приводит.
Да в Питоне не сильно по-другому это всё.
Причём этот оверинжиниринг -- мэйнстрим в разработке, а не косяки отдельных разрабочтиков.
Грубя говоря, на псевдокоде это выглядит так:
massiv = [1,2,3,4,5,6,7]
spisok = [odin, dva, tri, chetire, pyat, shest, sem]
for i in massiv:
____if i.isdigit:
_________print(spisok)
Но питон, само собой, возвращает ошибку типа.
Как мне сделать, что я хочу - вернуть итое значение списка?
1) isdigit - Это строковая функция, а элементы Massive принадлежат типу данных int, тоесть он в данном случае не подходит
2) нумерация элементов списка начинается с нуля, а у тебя в массиве элементы начиная с единицы, тоесть надо сделать -1 к i из массива.
Блядь, оно сжирает реально символы, ну ты понял, короче
>>67403
Не, ребзя, это не то.
Вот код зафаршмачил сюда:
https://pastebin.com/3LRDm23k
Мне нужно, чтобы цикл проходился по содержимому жсона, и если там есть consumable с индексом 1 - он присваивал бы ему первое название из списка consumable_name_rus. Если с индексом 2 - то второе и так далее.
В идеале - как мне вообще сделать, чтобы цикл сам перебирал индекса консумаблов? У меня их там десяток штук, и я не хочу расписывать каждый из них через elif.
Я даже понятия не имею что такое джейсон, но если я тебя правильно понял - ты нихуя не понимаешь в циклах и нагородил каких-то костылей
А ты беги не по значениям massiv, а по индексам:
for i in range(len(massiv))
ну или
for i, value in enumerate(massiv)
>но если я тебя правильно понял - ты нихуя не понимаешь в циклах и нагородил каких-то костылей
Все верно.
Жсон - это JSON, похож на питоновский словарь с парой ключ-значение. Я его распаршиваю и получаю на выходе инфу - есть consumable 1 в количестве 5, consumable 2 в количестве 10 и так далее.
Для распаршивания жсона у меня уже готовы все инструменты и словари с переводом условного "consumable 1" в удобоваримые "рунные амулеты". Единственное, что мне не удается написать - это цикл, который проходит по жсону и заменяет кодированный объект на мой перевод.
>>67424
Я уже так пробовал. Проблема-то не в том, чтобы индексировать объекты массива, а в том, чтобы под каждый объект этого массива подставить итый объект из списка spisok. Я не понимаю, как в питоне сделать spisok - т.е. чтобы для каждого i цикла брался итый объект списка.
Вторая штука - for i, value in enumerate(massiv) выглядит более правдоподобно, и если i - это элемент massiv, то как мне определить value?
> Единственное, что мне не удается написать - это цикл, который проходит по жсону и заменяет кодированный объект на мой перевод.
ну я тебе написал же цикл - по индексу в консьюмбл подбирается имя и выдаётся pcs, не подходит чтоли?
А что конкретно ты хочешь видеть в результате?
Вот получил ты
'{ "consumable": { "1": 5, '"2": 10 }}'
К какому виду тебе надо это преобразовать?
А куда именно копать? Серьезно, я гимпом игрался уже с контрастом и яркостью, даже кроппил отдельно код - вообще не видит, сука. Причем грешил сначала на питоновскую либу, но нихуя - даже zbarimg не распознал.
Я всё лето учу, мне норм
Большинство о питоне на парах могло бы только мечтать, почти у всех кресты.
Питон - очень простой язык. Если знаешь хоть что-нибудь ещё, проблем тем более не будет. Литературы по нему очень много, в том числе на русском.
А питономакаке есть смысл осваивать кгесты? Без задач, просто чтоб было, чтоб понимать писечу чуть глубже, нежели чем довольствоваться полумагическим мышлением?
Ну я ж не ванга. Скинь пару примеров своих кю-эр кодов, тоже попробую поиграть с ними.
Можно хорошо освоить сишку, этого достаточно для понимания. Кресты - очень сложные, профита мало. Сложные они из-за своих собственных абстракций, писечка тут не при чём. В принципе, можно освоить основы, но углубляться стоит, только если будешь на них потом писать.
Подумал, что под "писечкой" подразумевается ЭВМ, а не питон.
Не, си-подобие - это про синтаксис, он не так важен. Семантика структурного программирования везде одинаковая.
Си, в принципе, может ответить на некоторые вопросы, и магии в питоне будет немного меньше. Но магия - это не то чтобы проблема, это лишь следствие абстракций, которые и в сях есть.
Но это всё философская хуита. Думать нужно скорее о том, будешь ли использовать си для решения каких-то задач, например, для написания расширений для питона. Если таких задач нет, то и толку от изучения тоже не будет.
Я слишком глуп для того чтоб развернуто тебе ответить. Ну писечка просто же ну, не понимаешь чтоли?
По C? K&R - лучшее, что есть для начала. Неустаревающая классика.
По крестам не подскажу, но точно не Страуструп (наисложнейшая книга, уж точно не для тех, у кого питон - основной).
Только что сгенерил код и распечатал его, сфоткал на телефон в хуевом качестве, и все распозналось.
Потом обратил внимание, что проблемные фотки были бОльшего разрешения (8256 x 5504). Попробовал уменьшить до 2048 по длинной стороне, и... все задетектилось отлично. Похоже, слишком большие изображения хуево распознаются. Непонятно, правда, почему.
Но спасибо тебе энивей, буду пробовать ресайзить перед распознаванием, хотя это какой-то пиздец, как по мне, если честно.
>>66742
Да, точно, потом увидел что так делать нельзя.
Тащемта, делаю лабу. Не знаю с чего начать.
Задача.
Получен массив строк data. Разделителем полей является знак табуляции.
1. Напиcать код функции "цена", которая будет выводить название и розничную цену товара заданного цвета "цвет".
При запуске программы будет вызвана основная функция main. Все остальные функции будут вызываться из нее. Цвет вводится с клавиатуры.
2. Проанализировать исходные данные. Изучить их структуру и определить, как получить доступ к искомым данным.
В приведенной задаче необходимо получить название, цвет и розничную цену. Эти данные содержатся в каждом элементе списка – строке, состоящей из полей, разделенных знаком табуляции. Для решения задачи необходимо перебирать в цикле
элементы исходного массива-списка и с каждым элементом производить следующие действия: получить значения полей из строки, используя метод split, необходимая информация находится в полях с индексами 1 (название и цвет) и 3 (цена), необходимо извлечь цвет из поля и сохранить эту информацию в новый массив для дальнейшего использования.
Ну вот я и пытался применить split к списку.
Сейчас что имею:
data = ['1000 QW 2000 2200 QopEw 12 12112', '1001 BW 2001 2300 QopEq 13 12113', '1100 DW 2700 2900 QSFEA 16 12113']
N = len(data)
for i in range(N):
g = data.split()
print(g)
Принт мне выводит итый элемент списка data, но элемент этот стоит последним.
Т.е. я хотел в g вытянуть итые элементы.
1) Ты можешь for row in map(str.split, data): ...
2) Ты можешь это же, но явно: rows = [e.split() for e in data]; for row in rows: ...
3) Либо ты можешь просто for line in data: row = line.split(); ...
Вот range() тебе тут точно не нужен, ты не в Си.
Кажется то, что нужно! Спасибо, анон :3
Интересная конструкция, постараюсь запомнить.
Ну и хорошо, антош. Пиши если что.
>ForeignKey
>ManyToManyField
Как понять?
Мне что теперь, бросать все и бежать учить SQL? Или пока и так сойдет?
Если можно, поясните в кратце как оно работает?
>Мне что теперь, бросать все и бежать учить SQL?
Что-нибудь про основы БД прочитать очень надо бы.
не в плане плохой/хороший, а в плане что углубленное изучение его вообще нафиг ненужно. написал на листочке повесил возле ПК делов
Я определил, что это действует на всех файлах.py в одной папке. Также когда открываю файл с этой папки, то выскакивает консоль, а потом прячется.
А ещё окно консоли выскакивает произвольно (или не совсем произвольно) - когда создаю новый файл, открываю, меняю код
Но раньше такого не было... Как можно по нормальному его переустановить?
Ну, да?
Ну тоесть я правильно понимаю, что прописав в классе __exit__ и обратившись к нему через with - можно сделать класс, который при возникновении ошибки успеет что-то сохранить, но следом программа всё-равно вывалится с ошибкой?
> Корректная обработка окончания работы;
> Лаконичный синтаксис начала/окончания работы.
Вроде всё.
Ну и как бы под капот, в эти все методы ты можешь вставить различный функционал. Но это очевидно.
>Вроде всё.
Ну ясно. Тогда, пожалуй, углубляться в понимание этого не буду, просто сохраню в голове ссылочку на метод, на случай, если всё-таки пригодится.
>>67839
А как правильно вызвать with относительно Класса, чтобы активировать методы enter и exit? У меня в книге приведена такая конструкция:
with MyClass():
____print('Выполняем')
____MyClass.calc(2, 0)
выглядит как-то супер-коряво
>____print('Выполняем')
>____MyClass.calc(2, 0)
это тот язык который заявлял что beautiful is better than ugly
лол
Алло, клован, это наглядный пример написанный учеником.
>with MyClass():
> ____print('Выполняем')
> ____MyClass.calc(2, 0)
Супер хуйово.
Норм выглядит так:
>with MyClass() as your_class:
> ____print('Выполняем')
> ____your_class.calc(2, 0)
Да ну это понятно, просто суть не меняется вроде, и получается что конструкция вызова экземпляра класса слишком длинная, почему бы тогда просто было не ввести метод __exit__ который срабатывает в случае аварийного завершения работы без всяких там with? Нахуя этот with?
> который срабатывает в случае аварийного завершения работы без всяких там with
Как деструктор в сях? Логично, да. Но тут вот так.
Вопрос почему стоит задать лично гвидо или тем, кто трудится над новыми релизами пистона.
Ну так, на мой скудный ум - в сях ты сам за собой подчищать должен, тут же работает сборщик мусора. Хочешь ловить ошибки - лови их в коде, который юзает твой класс.
Он позволяет не забыть освободить ресурс, который тебе больше не нужен.
В С++, например, оператора with нет, потому что нет сборки мусора и деструктор объекта автоматически вызывается когда объект выходит из области видимости. В языках же со сборкой мусора так нельзя, потому что на объект может быть неучтенная ссылка из каких-то ебеней, и освобождение ресурса будет только при сборке мусора, которая происходит в неопределенный момент. Для определенности тебе нужен либо with, либо вызывать освобождение ресурса вручную.
Да нет, with не лично гвидо придумал, это общая для языков со сборкой мусора тема. Либо with, либо try/finally, либо и то и другое вместе.
Собственно with это такой try/finally, в котором в finally-блоке вызывается финализатор.
Извини, не совсем понял, поясни пожалуйста, каким образом with освобождает ресурс вызванного через него класса? Я же ньюфаг
> with не лично гвидо придумал
Не знал, спасибо за инфу.
Я просто ничего кроме питона/с не тыкал.
Ну допустим у тебя есть файл. Ты пишешь
def peka(yoba):
_f = open(....) #взял ресурс
_f.write(yoba)
_f.close() #освободил ресурс
Допустим, f.write бросает исключение. С этим исключением ты отвалишься куда-то вверх, а f.close вызван не будет. Хуево. Поэтому надо писать
def peka(yoba):
_try:
__f = open(....) #взял ресурс
__f.write(yoba)
_f.close() #освободил ресурс если нет исключения
_except error as e:
__f.close() #освободил ресурс если есть исключения
raise e
Так себе конструкция. Поэтому придумали try/finally блок. Он выполняется всегда, не смотря ни на что.
def peka(yoba):
_try:
__f = open(....) #взял ресурс
__f.write(yoba)
_finally:
__f.close() #освободил ресурс
Все заебись. Даже если f.write вызывает исключение, finally будет выполнен всегда. Но finally с ЕДИНСТВЕННЫМ объектом встречается тоже часто. Поэтому можно навернуть еще больше сахара:
def peka(yoba):
_with open(...) as f:
__f.write(yoba)
Естественно при этом будет вызываться не close(), а что-то более абстрактное.
Ну допустим у тебя есть файл. Ты пишешь
def peka(yoba):
_f = open(....) #взял ресурс
_f.write(yoba)
_f.close() #освободил ресурс
Допустим, f.write бросает исключение. С этим исключением ты отвалишься куда-то вверх, а f.close вызван не будет. Хуево. Поэтому надо писать
def peka(yoba):
_try:
__f = open(....) #взял ресурс
__f.write(yoba)
_f.close() #освободил ресурс если нет исключения
_except error as e:
__f.close() #освободил ресурс если есть исключения
raise e
Так себе конструкция. Поэтому придумали try/finally блок. Он выполняется всегда, не смотря ни на что.
def peka(yoba):
_try:
__f = open(....) #взял ресурс
__f.write(yoba)
_finally:
__f.close() #освободил ресурс
Все заебись. Даже если f.write вызывает исключение, finally будет выполнен всегда. Но finally с ЕДИНСТВЕННЫМ объектом встречается тоже часто. Поэтому можно навернуть еще больше сахара:
def peka(yoba):
_with open(...) as f:
__f.write(yoba)
Естественно при этом будет вызываться не close(), а что-то более абстрактное.
Анон, не пинай, я всё-равно до конца не понимаю
>Допустим, f.write бросает исключение. С этим исключением ты отвалишься куда-то вверх, а f.close вызван не будет. Хуево.
Но ведь программа мигом отвалится, и будет уже похуй - был ли вызван f.close, или не был? ну, по крайней мере в плане высвобождения ненужных ресурсов
>Даже если f.write вызывает исключение, finally будет выполнен всегда. Но finally с ЕДИНСТВЕННЫМ объектом встречается тоже часто. Поэтому можно навернуть еще больше сахара:
Так а что сделает with, если применять его с классом? Закроет класс? Но ведь класс и без того закроется, если не будет ссылок на него, а если ссылки есть - закрывать нельзя. Поудаляет атрибуты класса? Но ведь они сами поудаляются опять же если нет ссылок, и наоборот если ссылки есть - удалять нельзя. Не понимаю. Не понимаю что делает with и в какой момент он это делает
>Но ведь программа мигом отвалится
с хуя ли?
может, ты где-то выше поймаешь этот эксепшен и будешь работать дальше
а потом еще раз попытаешься с этим файлом поработать. а он не закрыт. хуй знает, что там твоя имплементация в этом случае делать будет
В том, что класс как объект должен сам закрываться если него больше нету ссылок, и не должен закрываться если ссылки на него есть
Не-не, я может и не прав и не так понимаю, так что можешь пинать меня если уверен в своих словах
Это не совсем верно. Сборка мусора происходит не сразу после того, как не осталось ссылок, а по одному лишь компилятору ведомому алгоритму. То, что на объект не осталось ссылок, не вызовет его финалайзер сразу же. Это тебе не c++.
Поэтому и приходится юзать эти конструкции, что на финалайзер нельзя полагаться.
Ладно, хорошо. Учту. Но заниматься таким, как я понимаю, надо уже в очень крупных проектах, где за расходом ресурсов надо следить?
Не знаю почему аноны делали упор на ресурсы.
Но как упрощение восприятия кода: видишь with, знаешь что что-то открывается и закрывается - тратишь меньше времени на восприятие. Работа с объектом визуально выделена отступами, что так же упрощает понимание.
Во-вторых, ты запихал в __enter__ то, что ты делаешь до, в __exit__ что делаешь после, надеюсь не нужно объяснять, что это пишется один раз, а далее ты уже работаешь с with не задумываясь про пре и пост действия. Очевидно, что объект не обязательно удаляется после работы с ним.
Хули развели срач тоже не понимаю, есть такая конструкция в петоне, пользуйтесь если надо, а если не надо идите нахуй не пользуйтесь.
>Но как упрощение восприятия кода: видишь with, знаешь что что-то открывается и закрывается - тратишь меньше времени на восприятие.
Вот это понял, спасибо.
>Хули развели срач тоже не понимаю, есть такая конструкция в петоне, пользуйтесь если надо, а если не надо идите нахуй не пользуйтесь.
Ну так я хочу понять, какие именно функции удобно и полезно использовать, для этого прошу тут какие-нибудь реальные кейсы применения.
А вабще, подобные вопросы не возникали у меня после прочтения Укуса питона. Сейчас читаю книжку от Прохорёнка, которая прям как по списку проходится по многим возможностям питона - вот тут вопросы то и начинают возникать. Например, была глава про самописные итераторы на базе функции - хорошо, тут всё понятно, может пригодиться. Сейчас вот дошёл до самописных итераторов на базе класса - вот тут возникает вопрос - нахуя? Конструкция гораздо сложнее, выполняет то же...
Двачую этого. Например, в документации питона есть пример, где с with автоматически сохраняется и восстанавливается состояние графического контекста. Или, например, with может автоматически блокировать общий ресурс для эксклюзивного использования. Это удобный сахарок, вот и все. Можно без него, но с ним код читаемее.
> какие-нибудь реальные кейсы применения
Выбирай: https://docs.python.org/3/library/contextlib.html?highlight=contextlib
В любых проектах надо следить. Вот не закроешь ты файл или порт в одном потоке, а в другом он понадобится, и будет ошибка. К тому же, например, файл может не записаться, пока его не закроют. Короче, не следя за ресурсами ты обрекаешь себя на появление трудноуловимых ошибок.
>Не знаю почему аноны делали упор на ресурсы.
>Но как упрощение восприятия кода: видишь with, знаешь что что-то открывается и закрывается - тратишь меньше времени на восприятие.
Это что-то называется ресурсом.
> Это что-то называется ресурсом.
>>> with html.bold() as fragment:
... ____print('Hello', file=fragment)
<b>Hello</b>
Что тут называется ресурсом?
Скорее это не про крупные проекты, а про библиотечный код. В больших проектах в любом случае будут свои библиотеки для нужд проекта, а малых не обязательно.
Это относится и ко многим другим конструкциям языка.
Какой-то стейт внутри html, который будучи не освобожденным все поломает.
Хлебушек снова выходит на связь.
Нужно в автора засунуть книгу, когда пробую сделать это, вставив в него:
book = models.ForeignKey('Book', on_delete=models.SET_NULL, null=True)
то выдает такую вот ошибку
catalog.Author.book: (fields.E303) Reverse query name for 'Author.book' clashes with field name 'Book.author'.
HINT: Rename field 'Book.author', or add/change a related_name argument to the definition for field 'Author.book'.
catalog.Book.author: (fields.E303) Reverse query name for 'Book.author' clashes with field name 'Author.book'.
HINT: Rename field 'Author.book', or add/change a related_name argument to the definition for field 'Book.author'.
Вроде бы в ней всё понятно, даже хинты есть, но подсказки не помагают, да и подобная вставка прокатывала в других классах что находятся выше.
Почему так происходит? Помогите.
text = input('Enter something --> ')
except E0FError:
print('Why you did E0F')
except KeyboardInterrupt:
print('You canceled an operation.')
else:
print('You entered {0}'.format(text))
Почему этот код не показывает, то что после except, а отвечает на исключения, как обычно?
потому, что else сработает только если не будет исклюений. Добавь finaly - оно сработает в любом случае.
В EOF должна быть буква, а не 0.
Вызов KeyboardInterrupt не получается в PyCharm (ctrl - c), вместо этого выделяет строку в консоли
360x360, 0:12
А разве в BookInstance не должно быть отношение один с одним, а не один со многим. Это же, как я понял, копия книги. Попробуй поменять на OneToOneField.
Он вообще ебанутый.
Запись в таблице Books это и есть блядь инстанс, т.е. экземпляр книги. А он ебашит отдельную таблицу для этого.
1280x720, 1:15
Наверное проблема в related_name. То есть у тебя и в Авторе метод book_set и в Инстансе book_set.
https://developer.mozilla.org/ru/docs/Learn/Server-side/Django/Admin_siteside/Django/Home_page
>Добавьте встроенный список перечня Book в представление списка Author , используя тот же самый подход, который мы применили для Book/BookInstance.
В уроке никаких оне ту оне фиелдов мне не давали, а значит и в задачке он не нужон.
>>68409
Это типа статус книги, и вообще не мой мопед, ну. Ты чего такой агрессивный?
>>68417
Релатед наме не помогает, и в уроке о нем ничего не говорили.
Нужно допустим взять date, date_epoch и maxtemp_c из апи сайта погоды, но maxtemp_c в "day": {}, как его оттуда взять? Что я не так сделал? Если удалить ["day"] и maxtemp_c то программа работает правильно
А так выдает ошибку:
line 11, in get
forecast_data = data["forecast"]["forecastday"]["day"]
TypeError: list indices must be integers or slices, not str
ну ты ибан))
делай так...
try:
__text = input ('enter...')
except:
__print('SERVER GOT SOME ERROR ALARM ALARM')
Ты всё напутал. Дай код на пастбин.
> пайшарм
Для больших проектов возможно. Но для мелких - слишком перегружен, отовсюду лезут эти ебучие подсказки-костыли, как будто я не знаю аргументов у print'а.
Ну как бы очевидно, что данные на входе нужно проверять. Уже внутри можешь без трая крутить данными, но лишняя перестраховка никогда лишней не будет.
...
class Author(models.Model):
"""
Model representing an author.
"""
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
date_of_birth = models.DateField(null=True, blank=True)
date_of_death = models.DateField('Died', null=True, blank=True)
book = models.ForeignKey('Book', on_delete=models.SET_NULL, null=True, related_name = 'book_blyat')
...
>Reverse query name for 'Book.author' clashes with field name 'Author.book'.
HINT: Rename field 'Author.book', or add/change a related_name argument to the definition for field 'Book.author'.
Можно подумать ты знаешь аргументы всего и вся. Да и следуя твоим же словам - аргументы принта нужны людям которые большие проекты пилят? Нет?
Всё чем перегружен пайшарм - комфортом пользования, написание кода без лишних телодвижений, вплоть до встроенного SSH
Откуда у бедного вкатывальщика возьмутся деньги на нормальную пекарню и лицензию питоншарма?
Мне проще доки покурить по конкретному вопросу, чем терпеть эти выскакивающие подсказки на все случаи жизни.
Не хочу камунити, хочу нормальный пгодукт изкаропки
Документация telebot?
Тоже недавно ебался с этим, ниче не получилось. Буду читать. Английский уровень говно говна. Буду сидеть с переводчиком, значится.
раздел1
|подраздел1
|статья1
|статья2
|подраздел2
|статья1
|статья2
раздел2
|подраздел1
|статья1
|статья2
|подраздел2
|статья1
|статья2
Подскажите, пожалуйста, есть какое-то готовое решение?
ебаная макака блядь, минус разметка. пикрил дерево
Нет, мне нужен питоний вариант с хранением в БД, чтобы другие сервисы могли в эту БД залезать и дергать ЖСОН. жсон будет генерить editorjs
На работах тоже принято так делать? Как разбивать строки так, чтобы было максимально читаемо?
>ряя пистрон читаемость кокок
>будем выёбываься и сокращать что было как у настоящих прогромистов!
> На работах тоже принято так делать?
Только если навредить хочешь.
> Как разбивать строки так, чтобы было максимально читаемо?
Как с функциями примерно. То есть разбить действия построчно так, что бы на одной строке выполнялась одна логическая группа действий(форматирование / лист-компрехэншн / and etc.).
> стал стараться уложить любое решение в одну логическую строку
Зачем?
>зачем
Так в топовых решениях
>одна логическая группа действий(форматирование / лист-компрехэншн / and etc.).
Я гуглил длинные лист компрэхэншены, и судя по ответам на стаковерфлоу https://stackoverflow.com/questions/311588/how-to-indent-python-list-comprehensions люди делают примерно такие штуки, как у меня во втором пике.
> Так в топовых решениях
Так у тебя цель какая? Пистон выучить/скилл прокачать или заниматься спортивным погромированием?
> как у меня во втором пике.
Второй пик - Ок.
Стаковерфлоу даёт самое простое и рабочее решение, интегрировать его в проект и улучшить - твоя задача.
Я бы не юзал компрехеншены с вложенностью больше 2 и тебе не советую. То же самое с обилием условий.
Так в спортивном программировании вообще нет разницы, как что выглядит и сколько занимает логических строк.
А топовые решения там просто такие, которые собрали много флажков 'clever' и 'best practices', поэтому и повторяю.
>компрехеншены с вложенностью больше 2
То есть мне лучше сумму от генератора вынести в отдельную функцию? Понял, там где-то такие решения тоже были
Как я уже писал, всё зависит от твоих целей. Если спорт - похуй на красивость. И тут больше нечего тебе подсказать, по крайней мере мне.
> То есть мне лучше сумму от генератора вынести в отдельную функцию?
Как я уже написал, второй пик выглядит более-менее ок ещё. Там как раз вложенность 2 (условие ж не считается). Я бы добавил развернутый коммент с пояснением работы данной йобы и всё. Но смотри в начало, насчёт твоей цели.
Понял, спасибо
Не очень существенно, но в целом более читаемо, если локальная функция будет определена.
Ещё твой код можно оформить в фунциональном стиле через filter, это имеет смысл, если выносить генератор в отдельную функцию. Я бы скорее вместе с проверкой на равенство вынес
https://ideone.com/7RBLrr
Это просто чуть более гибкий подход, но реально на однострочниках не важно. Тебе всё равно в первую очередь надо вникать в логику подсчёта суммы. Лучше в комментарии просто пример один привести, как считается, а реализовать так, как у тебя.
Проблемы с чтением кода начинаются тогда, когда код большой и уже не свежий. Если ты постоянно пишешь в стиле генереторов списков либо в функциональном стиле, то и читать более-менее легко будет. Проблема не в том, чтобы строчку прочесть, а в том, чтобы понять смысл всей магии, которую ты делаешь.
Хороший стиль какие-то тестовые и контрольные значения приводить.
ладно, спасибо. У одного у меня бобмануло такое форматирование, значит
Нет в этом ничего хорошего, читаемость дропается в ноль.
Можно вообще всю программу написать в одно выражение, но смысл? Код должен быть читаемым, а не "О ,смотрите, я могу сжать 10 понятных строк в одну длинную".
Спасибо, я о решении с filter() тоже думал, но это, понятное дело, только если выносить проверку в отдельную функцию.
Я так понимаю, это должно быть удобно, если в будущем потребуется как-то изменить условие.
>пример один привести, как считается
Вообще должно быть достаточно понятно, если к проверке прикомментить 'example: 89 == 81 + 92'
Я, кстати, где-то читал, что в коде вообще комментов должно быть по минимуму, или вообще не должно быть, типо всё понятно из самого кода. Но в случае с однострочниками это имеет смысл? Тогда в моём первом пике нужно прикомментить, например 'example: "Bad" - > "2 1 4"'
>>69338
Ну как я понял из треда, у меня пока ещё нормально. В первом это одно логическое действие -- форматирование строки, во втором мы просто по заданному диапазону собираем список элементов, удовлетворяющих условию, если условие пояснить, то остальное тривиально.
Я же заебался блядь нахуй, спокойно саморазвиваться в сериалах советуйте годноты уже не могу - иногда монитор разъебать хочется из за того что некоторое количество вещей просто так в голове не укладывается а ведь так уютно было когда основы пистрона учил
Мне чет вообще питон разонравился, когда начал пытаться в веб-программирование на нем - PHP для этого оказывается в разы удобнее.
Пхп анально ограничен вебом, что демотивирует, так что пистрон первым языком самое то, я считаю
Стыдно сказать, завтыкал на генерации ссылок, и вообще во всем этом url говне
Вылез в джангу сразу после того как освоил основы пистрона, от того и проблем с продвижением дохуя. Но ничего, по ходу дрочева в джанге осваиваю всякие классные штуки о которых в моей мурзилке по пистрону ничего не говорилось.
Сейчас на 7 части пикрилейтеда, оставил на завтра
Щас уже все не вспомню, давно на питоне был проект, но мне дико не хватало всякой мелочи типа isset, empty, ??, ?:
И еще были какие-то вечные проблемы с подключением модулей - pycharm видит, питон не видит. Иногда просто были ситуации, когда не ясно, как их вообще подключать. Скорее всего это было из-за кривой архитектуры проекта, но все же.
Угу, сам щас этим страдаю, потому что однотипные проекты на пыхе уже подзаебали, надо валить в другие направления, но вот куда, пока не ясно.
Сначала был десктоп на C++/MFC, потом десктоп на Java/Swing, потом заразился PHP и на нем просидел аж 5 лет. Щас по сторонам смотрю, куда можно сбежать.
Тонко.
Начал с курса МФТИ, сделал всего робота, сейчас перекатился на курсеру - слушаю уже второй курс по Python for Everybody Specialization, там про структуры данных питона.
Пока вкуриваю как волшебным образов таплы превращаются в листы и обратно.
Если тебе координаты вектора не надо менять после того, как он создан, то кортежем.
Считай просто так, что список - это переменная, а кортеж - константа. Если тебе не нужно менять координаты вектора после того, как вектор создан, то кортеж, если же у тебя какая-то динамичная система, то или список, или какая-нибудь другая структура.
всё время хочется вкатиться, но хочется поковырять готовые проекты, посмотреть на говнокод а я люблю говнокод... особенно на питоне... покажи мне говнокод других, попугаться
хороший код это не тот, который записан в одну строчку.
Хороший код, это когда он читается новичком, как будто код сошел со страниц учебника
Be consistent in return statements. Either all return statements in a function should return an expression, or none of them should. If any return statement returns an expression, any return statements where no value is returned should explicitly state this as return None, and an explicit return statement should be present at the end of the function (if reachable).
Заебись, так и живем.
Спасибо.
Отключи пепку и протабулируй нормально, будь мужиком
Какая лучшая современная подробная книжка по питону для полных новичков?
2д графика на пайтоне точно такая же как и 3д - биндинг для сишной либы
Э байт оф пайтон 2.0 неплоха.
Алсо попробуй этого клована.
Много картинок, схемочек, свистоперделочек. Стильно нет, модно, молодежно!
Новичку не нужно ничего подробного, это хуйня, больше 200 страниц не бери. Укус питона почитай, потом покодь что-нибудь, там в конце укуса есть ссылки на список задачек + задачки на разных сайтах порешай, или какой-нибудь курс приглянувшийся попроходи. Потом уже что-то подробное читай
Завтра ищешь в интернете книжку Dive into python. Похуй если ничего не поймешь. Затем идешь на python.org и изучаешь стандартную библиотеку от корки до корки. Потом зубришь, именно, сука, вызубриваешь конвенцию по написанию питоньего кода - PEP8, чтобы от зубов отскакивало. Когда напишешь свою первую имиджборду, по пути изучив верстку на html+css, скачиваешь и изучаешь любой питоний асинхронный вебсервер, рекомендую Tornado или Gevent. Как переделаешь имиджборду, чтобы выдавала по крайней мере 5 тысяч запросов в секунду, можешь идти дальше - тебя ждет увлекательный мир хайлоада. Apache Hadoop, сверхбыстрые асинхронные key-value хранилища, MapReduce. Отсос хиккующих выблядков / просто неудачников типа рейфага или сисярп/джава-хуесосов, которые сосут хуй по жизни не заставит себя ждать и уже через пол года ты будешь получать такие суммы, что любая баба будет течь при одном упоминании твоей зарплаты.
А тебе 18 есть?
Я попробую.
Dive into python подходит только для тех, кто переходит с другого языка и хочет как можно быстрее вкатиться. Для новичка не подойдёт.
Против "Погружения", стандартной библиотеки и PEP8 ничего не имею. А вот советовать не самые мощные веб-серверы я бы не стал. Рекомендую uWSGI позади nginx.
>для тех, кто переходит с другого языка и хочет как можно быстрее вкатиться
Сейчас бы в 2019 не знать пару языков и не пользоваться божественным VS Code, для написания всех программ мира
кодик тут https://pastebin.com/dVRkqEgd
У тебя где-то раньше ошибка https://ideone.com/lLUat2
Скорее всего ты как-то переопределил list - например есть переменная с таким именем
да, только то в том что в jupyter notebook эта прога чистая. то есть там только эти 6 строчек, больше ничего нет
Разбей m = [i.lower() for i in input().split()] на несколько действий. Увидишь где ошибка.
но проблема то только в том что почему то в разных интерпритаторах программа ведет себя по разному. на идеоне вон спокойно работает
забей анон. ноутбук мозги ебурил. я его перезапустил и он заново почему то нормально заработал. хуй знает че ему надо было
> но проблема то только в том что почему то в разных интерпритаторах программа ведет себя по разному.
Так идеон это какая-то веб хуита, ты локально через консоль у себя загоняй и смотри работает или нет.
Может кто сталкивался, какие примерно задачи с его помощью обычно решают, для обработки данных вероятно?
Ого.
Но я не о вакансиях "программист" или "математик", а про узких специалистов из других областей. Физики или инженеры, например.
просят подержать стол пока серьезные дяди пишут код на R
Так вот, дирик меня отхуесосил и отказал.
Держу в курсе.
Печально, чувак. Поделись стори хотя бы: и выговоришься, и может чего анон подчерпнёт для себя.
Поучился полгода, устроился на галеру. Узнал от коллег про эликсир, прощерстил тырнет, пописал пару примерчиков. Язык то топовый. Планирую уговаривать других что-нибудь написать на нем на работке.
Что сами думаете?
js, vue, django, flask, asyncio, tornado, +- docker тыкал и jenkins. Ну и базовый набор с гитом и постгресом.
Рубипидоры настолько тупые, что уже в эликсирошизиков превращаются?
Фреймворки можно и без языка пердолить
Хочу написать нужные поля, указать их тип, собрать из них любую иерархию вложенности и без проблем все это сериализировать и десериализировать. NamedTuple имеет проблемы с nested сериализацией, по SO попробовал пару решений то одно вылезет, то другое. Это же простейшая задача - запилить классу и без писички мисички их сериализовать, которая решена в других языках с полпинка. Почему в Питоне это так сложно и как сделать правильно?
Есть такая хуйня:
https://habr.com/ru/post/415829/
Но она из коробки не может в сериализацию, добавляется она, в частности, так:
https://stackoverflow.com/questions/51286748/make-the-python-json-encoder-support-pythons-new-dataclasses
Вообще, почитай о метаклассах и об аннотациях типов, может и выйдет что-то.
Спасибо, стоило написать про новые датаклассы с 3.7 - про них я читал, но они с 3.7 только, а слесарьфлоу работает с максимум 3.6.
> может и выйдет что-то
Пиздец, как же я ору временами с Питона - не мочь нормально в такие простейшие вещи как классы и рекурсивный проход по дереву объекта (сериализованного объекта) нахуй.
Чего ещё ждать от динамически типизированного языка. Тут не городят новые типы на каждый чих, а всегда юзают dict и пох.
Есть встроенный модуль pickle, он умеет питоновские объекты превращать в поток байтов и обратно. Но ето опасно.
https://docs.python.org/3/library/pickle.html
Есть стандартные модули json, csv чтобы преобразовывать в соответствующие форматы, ну с собственными объектами придется чуток поднапрячься. Вообще много всего в стандартных либах есть
https://docs.python.org/3/library/markup.html
https://docs.python.org/3/library/persistence.html
https://docs.python.org/3/library/fileformats.html
А можешь посмотреть и на сторонние инструменты
https://github.com/marshmallow-code/marshmallow
>>70573
>>70588
20 минут разговора с ЧСВ-дириком и всё.
Из общения он узнал что я в основном работал один и никогда в паре с тестироващиками, это и стало причиной отказа, по крайней мере судя по фидбэку.
Я не унываю, аноны, просто обидно что было такое приятное собеседование(побеседовали на около-питоновское), а вот так всё кончилось.
> Чего ещё ждать от динамически типизированного языка
Удобства? Как например удобно работать со всякими нампаями и пандасами.
> Тут не городят новые типы на каждый чих, а всегда юзают dict и пох.
А контракт между микросервисами описывать на использованном клочке туалетного словаря? Типичный же кейс - по сваггер спецификации сгенерить классы (или наоборот), сериализовывать данные на входе и выходе в них, в тестах описать контракты в моках и пануватi. Не, это не пайтон вей. Пайтон вей - написать вручную классы, обсираться из-за несоответствия, обсираться все равно из-за сериализации, а с нормальным моком веб сервера просто пойти нахуй или поднимать в тестах фласк из говна и палок с роутами для моков.
Челы подумали, что в традиционных тредах легко наступить на грабли, и продвигают асинхронщину. А asyncio - хуйня, чтобы написать асинхронный веб-сервер.
> ЧСВ-дириком
Зато сэкономил себе время и не будешь работать с неприятным тебе человеком.
> я в основном работал один и никогда в паре с тестироващиками
Его поинт в том, что ты у нас домашний не командный игрок и все вытекающие отсюда проблемы.
> Но ето опасно.
> Warning The pickle module is not secure against erroneous or maliciously constructed data. Never unpickle data received from an untrusted or unauthenticated source.
> JSON
Ну это просто пушка!
> json
Работает нормально только со словарями. Десериализовать в класс начинаются боль и питон.
> А можешь посмотреть и на сторонние инструменты
Выглядит интересно, спасибо, посмотрю.
> Его поинт
Я его понимаю, но от этого менее обидно не становится.
Я ж блять не отбитый на голову, не зашуганный, нормально общаюсь с коллегами и могу работать вместе, но.
С фронтэндерами/мобильниками/ML работал жи.
Ну это ты считаешь, что ты не сыч и будешь участвовать в скрам-приседаниях. А со стороны того манагера выглядит, что поток соискателей и поди залезь каждому в голову и выясни правда это или нет.
ыыы омакакивают у у у мартышки кодеры говнокодеры ыыыы
Не кажется, но ты ожидал другого? Фреймворки создают, чтобы облегчить и ускорить работу программиста, автоматизировать при возможности. Если хочешь именно кодить, просто потому что тебе это нравится, то рынку ты не нужен. А фреймворки для гуманитариев нужны.
Так и живём, так и катимся в светлое коммунистическое будущее , блеать.
Угу, ведь сайты-визитки и лендинги - это такой уберхайлоад, что с ним только php справится, как же иначе-то.
Если питоша даже с сайтами-визитками не справляется, то о чем тут вообще говорить.
а батарейки там есть?
Я написал CV алгоритм для детекта некоторых вещей. Как на вход алгоритма будут попадать картинки? Даже асинхронщина требует сериализации.
это же второй питон
это же второй питон
Помогити, мне нужно из React, используя Axios отправить файл на Django-Rest, но не просто отправить, а создать какой-то пользовательский вью, чтобы пропарсить этот файл xls и полученные данные записать в базу. Наведите меня на что-нибудь, чтобы я понял, как это сделать
Програмач, стоит задача писать данные в базу (mysql).
Данные заполняются юзером при запуске скрипта. Они имеют строгий формат (некоторые поля должны быть a-Z, некоторые только числовые), но юзеры бывают тупые (могут совать неподходящие символы в данные, типа символов перевода строк или пробелы) или даже саботажники.
Чем такие вещи фильтруются-валидируются в питоне?
Это когда на снежной горке ты пускаешь своего ребенка по ледяной дорожке, но не смотришь что внизу и вообще забываешь о нем навсегда как только ты отправил его вниз.
Каждые n символов делаешь перевод строки.
Нет, это не полноценная асинхронность, ты описываешь схему с очередью задач без переключения. Как в JS, если без async/await.
Но в нормальной асинхронности ты можешь ждать результат. Ты пустил ребёнка с горки и ждёшь потом, когда он вернётся.
Питон про нормальную асинхронность, и в JS она тоже уже давно потдержена.
Есть актуальный мануал по джанге на русском?
Кроме документации.
Помню, читал что-то оче годное, но по старой версии.
Впорос по {{ form }}:
А вот я хочу заместо renewal date (пик 1) видеть кастомное название, кириллическое, например, но не хочу превращать код в "хуй = пидр жопа водка балалайка ельцин".
Как реализовать?
https://tutorial.djangogirls.org/ru/
какая то костыльщина
Ты нихуя не понимаешь, но объяснять бесплатно мне лень.
будет пушка, третье пришествие пыхона!
Просто Я СКОЗАЛ.
В прошлом году вышел python 3.7, в этом году выходит python 3.8, видимо, в следующем году выйдет python 3.9, что, в 2021 грядет python 4?
Синхронные фреймворки перестали быть нужны, они не обеспечивают максимальную утилизацию ресурсов.
Как апач перестал быть нужен со своими потоками, уступив молодым асинхронным серверам, так и фреймворки туда же уйдут.
Если хотят выжить - придется усидеть на двух стульях.
Я джангу давно не использовал, а вот распиливать Джанго монолиты на микросервисы на aiohttp уже приходилось.
Хз, выгорит, что у них или нет.
Охуели в край уже, сука!
и они тоже
> Джанго монолиты на микросервисы на aiohttp
Распиливаем на работе сейчас NodeJS монолит на aiohttp/tornado микросервисы. Я когда узнал об этом - охуел.
Как и везде, вот ты считал данные, а перед тем, как что-то еще дальше с ними делать, тебе надо их проверить, и если проверку они не проходят, то дальше их не передавать, а пользователю предъявить, мол, чо за хуйня, нормальные данные давай. Если есть графический интерфейс, то можно прям такие поля в форме сделать, что неправильные данные просто не вводятся, например, сделать так, что буквы в числовое поле просто не будут вводиться, но полностью проверку в коде это не заменяет.
Как проверять? Если случай простой, можно и ручками, вон у строки есть методы всякие, там isalpha, isnumeric, isspace, count, и многие другие, еще есть стандартный модуль re для регулярных выражений, можешь регулярками проверять, в конце концов, строки это итерируемый объект, можешь просто посимвольно пройти и проверить.
Если ты уже используешь какой-то фрэймворк для своих целей, может, там уже есть свои спецсредства для валидации. Хочешь специальных фрэймворков для валидации данных, есть и такие
https://github.com/vinta/awesome-python#data-validation
Нет, не обязателен. Но полезен и приятен.
Через ОRМ или aio-psycopg2(или типа того).
У нас первый вариант, т.к. до записи в БД данные хранятся в кафке и всё ок.
Использовать гораздо более подходящие для асинхронных неблокирующих веб-серверов go и jvm-языки там, где производительности блокирующих веб-приложений уже недостаточно.
js(noda)+ aiohttp+DB
все верно?
> куда и как будет двигаться синхронная Django.
Продолжать в будущее, а куда еще? Использование неблокирующей асинхронщины оправдано только при высоких нагрузках в приложениях, где треды большей частью времени сычуют в blocking io. Во всех остальных случаях это или лишний геморрой, или тот же blocking, если дристануть подливой и нечаянно блокировать тред.
Проще говоря, для большинства питоновебприложений все это нахуй не всралось и вполне хватает настроенного wsgi с каким-нибудь gunicorn и отсайзенным количеством воркеров с name_your_favorite_web_framework
Я лять 7 лет назад использовал ангулар, я сейчас использую ангулар, чуть позднее, ну пусть будет лет пять назад, я использовал express и не стесняюсь его иногда забрать сейчас.
Где быстро меняющееся it?
Почему джава господа и рубисты получают на порядок больше питонистов? С чем это связано?
CV и ML в рассчет не берем.
https://pydantic-docs.helpmanual.io
Умеет изкаробки генерить json schema и вроде как даже с вложенностью
Какой я тебе пыхер, маня. Все хорошие разработчики дебажат логами. Потому что лог
1. Выдает тебе срез стейта.
2. Работает в асинхронной, многопоточной и любой другой среде.
3. Намного меньше проблем с воспроизводимостью.
Сначала криворукие привыкают к дебаггеру, а потом ноят о том, что асинхронный код - сложна.
Джава, потому что тырпрайз, банки, где хуевая работа и что бы удержать прогееров нужно платить много нефти.
По руби ...
Не слежу, но предполагаю, что вам кажется.
Питон нужен многим, и большим и маленьким, и русским и зарубежным, и уровень ЗП размывается.
А популярность руби последние годы помножилась на ноль, зато в глаза бросаются зп вакансий в америкосские конторы, которым нужны мидлы/сеньеры. Там руби ещё более менее жив, ибо много легаси говна было создано в последний стартап бум.
Ты дурак штоле?
Хорошие разработчики дебажат наиболее продвинутым инструментом.
Если есть возможность использовать дебаггер - замечательно, это намного удобнее и быстрее чем перезапускать, добавлять логи, снова перезапускать.
Если нет, то просто выбора нет - логи так логи.
Но отказываться от дебаггера? А ты отказаться от использования рук не хочешь? Это откат в каменный век разработки.
Дебажить нужно дебаггером. Логи для саппорта и разбора инцидентов. Невозможность нормально поставить брейкпоинт где угодно это пиздец.
Спасибо.
>3.5 релизнули 4 года назад
>нормальной асинхронной orm так и не завезли, пиши запросы руками
>асинхронные фреймворки представляют из себя набор "напиши все сам, вот тебе роуты и библиотеки с 10 звездочками"
>до сих пор нет нормальных либ для data definition, вот тебе 2.5 мертвых библиотеки, остальное сами пиши
>интрепретатор мы оптимизировать не будем, скорость НИНУЖНА
>местный ООП представляет из себя цирк с конями
>нормальные треды тоже не нужны
>сам язык используется для прототипирования или требует жутких костылей для нормального прода
Но если бы где нибудь было лучше и за это бы платили, то я бы свалил
Бейсик.
Ну хуй с ним с ельциным. Практика встраивания кириллицы в код существует, или это пиздец какой нехороший тон?
Проблему решил добавлением label, о котором в моей мурзилке ничего не говорилось
Потому что версионирование такое позволяет
Потому что число после точки в версии - это не дробная часть или что-то вроде того, а совершенно отдельное число, никак не связанное с первым. Это всё равно, что писать, например "3; 7".
Питон не про многопоточность (GIL GIL PIDOR) и промышленное программирование. Питон про скрипты (админов и сетевиков), различные алгоритмы и прототипы.
Тащемта говоря, не заинтересуйся питоном научное сообщество и примазавшиеся шлимазлы и не будь в питоне всякие DS, CV и ML, то был бы Питон где-то подле Руби, только подальше от веба (потому что рельсы удобнее джанг) и поближе к админам, которые решили забыть про регулярные выражения Перл и выучить хотя бы один язык программирования.
Но в этом нет ничего плохого. ЯП это просто инструменты для своих задач и ничего не мешает применять различные языки для различных задач, где они наиболее эффективны. Глупо ограничивать себя один ЯП и мужественно превозмогать те вещи, которые в других языках делаются с полпинка.
>>71456
Есть. Полтора. Котлин, который обожают все, кто на нем писал, и Раст который после Крестов почти как Котлин для ведроебов с ограничением ихней 6 джавы 150 летней давности.
>Питон не про промышленное программирование
Сука, я сейчас сижу на проекте, где мы делаем высоконагруженную апликуху и сильной повязкой на финансовых вопросов. Единственный плюс это скорость написания фич, как только стартап выстрелил начили все ОПТИМИЗИРОВАТЬ и возникает ощущение, что нахуй пистон выкинем.
Ухухухухухуху
Я каждый раз питонистов спрашиваю, в чем кайф и смысл питона.
Все в один голос отвечают: охуенно быстрое прототипирование. А потом, мол, мы перекатываем на нормальные языки.
Ну, ок, а в чем проблема прототипировать сразу на целевом языке?
Это, блядь, не самолет, который сперва надо из говна вылепить, чтобы посмотреть, чо получится.
>В том и смысл вышки - получить фундамент. Стеку тебя не научат, да. Образование слишком консервативная вещь, редкий препод угонится за изменениями стека со своей программой обучения.
Так что стек за тобой, а фендамент за вышкой. Плюс, анон как и всякий человек, ленив, а значит вероятность самостоятельного изучения фендаменталки - 0,1%.
Хочу получить фундамент без вуза регистрации и смс.
Вышкобоги, накидайте запросов для гугла
возможно не только к питону относится
Как я понял, нет смысла пытаться сделать так, чтоб программа, которую я написал кодв случае неверного ИНПУТА рестарталась, ведь это делается уже в других прогах, видимо. Ибо try except работает только один раз, после второго неверного инпута все крашится.
Я зря с этим морочусь и создаю лишнюю головную боль? Или надо до конца пилить?
Например делаю задание про месяца года и ввожу не число, а букву "а". В первый раз try/except говорит "введите число, а не название", а во второй раз все вырубает.
Делай input в цикле, который не прервётся, пока ты не введёшь корректное значение. Разумно такой ввод в отдельную функцию вынести, если надо вводить несколько значений.
def my_input():
while True:
try:
value = int(input())
except:
print('stuppid monkey')
continue
else:
return value
Ого, спасибо, анон. Домой приеду попробую.
>Продолжать в будущее, а куда еще? Использование неблокирующей асинхронщины оправдано только при высоких нагрузках в приложениях, где треды большей частью времени сычуют в blocking io.
В тредах много гемора с блокировками, которые тебе самому надо выставлять, асинхронщина в этом плане проще.
Синхронно ты ничего не сделаешь, как только уходишь от модели запрос-ответ, как начинаешь какой-то поток данных обрабатывать, сокеты и т.п.
Но сокетов и подобного нет, проще синхронно жить, без корутин и без потоков.
Сам переписываю софтину с node.js на asyncio+aiohttp. Но это шило на мыло, везде асинхронщина, в ноде она чуть проще и понятнее, просто сам js как язык говно, хотя может даже быстрее.
Быстро сделали мвп, быстро нашли клиентов и начали делать деньги, теперь можно и расслабиться, грамотное проектирование заняло бы гораздо больше времени. А тут проект уже приносит прибыль, скорость внедрения фич начинает уступать надёжности в продуктовом плане и пора что-то менять
Да, ничего, индийский код просто. Проще так будет:
def my_input():
while True:
try:
return int(input())
except:
print('stuppid monkey, try again')
В питоне ты как раз делаешь грамотное проектирование, быстро и прозрачно. Вот если вдруг станет актуально сильно разгонять, то может потом придётся полностью или частично на другие платформы переходить и разные кривые хаки придумывать. Но для этого надо, чтобы взлетело, и чтобы в твоей задаче это было актуально.
Наверное идиотский вопрос задам, но все же, на всякий случай.
Вот у меня получается мои месяцы тоже функцией идут
Мне вот функцию с неверным инпутом под нее засунуть или уже после запуска самих месяцов ставить? Или до них? Или вообще похер?
То есть:
def mesyaci() :
.... тут хуйня всякая
.... def netotinput() :
Так?
И как он, годный?
В итоге выбрал книгу Дронова (хоть и не люблю многостаночников).
Книга оказалась хорошей, это не первая книга автора по Django. Предыдущая была слабей, как по подаче материала так и по решениям которые автор приводил.
Куча всякой мелочи изменилось, но умеренно.
Самое принципиальное, что сильно изменилось, это обработка url
Для вката 1.9 актуален, урл после 1.8 меняли
Войтивайти, плз.
> дизморальщики
Ты дурак? Никто не говорит, что Питон не нужен. Питон нужен. В своих задачах где он хорош. Где он не хорош, питонистам следует расширить экспертизу и выучить и использовать другие языки, а не мужественно превозмогать авгиевы конюшни.
Как только ты уходишь от модели запрос-ответ и начинает работать с каналами и потоками данных, тут-то нужно съебывать с Питона.
Почему нельзя использовать обычный оператор комментария # hui ?
Тебя, блядь, просто забыли спросить, извини.
Я посмотрел курс по диагонали перед тем как его пройти.
Почему-то """ такой комментарий """ там считается дефолтным для функций
Тру питонисты начинают каждую строку многострочного комментария с #. В любой ide это делается автоматически или одним хоткеем.
>Это, блядь, не самолет, который сперва надо из говна вылепить, чтобы посмотреть, чо получится.
MVP
PROOF OF CONCEPT
Не может такого быть, ты походу и сам ньюфаг ебаный и не знаешь нихуя!
from collections import deque
from queue import LifoQueue
обе эти хуйни подойдут
все, вопрос закрыт.
Бля, я понимаю, что я кормлю жирноту, но тот стек, что в этой задаче нужен это одна ебаная переменная
Удачи.
Не хочется тут палить код, так что телега fakeaccount123123
Ну можно вложенный счётчик сделать, на который будет переходить при другом виде скобок. Их всего три вида, там значит и так никаких особых проблем не будет
Не, не получится. Так можно учесть нужное количество скобок, но закрывать их можно в произвольном порядке, и это пройдёт проверку.
Да ну, это некрасиво получится.Но вообще реально, я сейчас прикинул. Ну ладно пусть список вместо переменной, всё равно алгоритм на несколько строчек.
Мне в голову пришёл такой функциональный стиль, когда встречая скобку другого вида рекурсивно вызывается та же функция, но уже считающая по другой скобке, я бы так сделал.
>классическая задачу на проверку скобок, чтобы наработать навык работы со стеком
>нет, хотим изъебываться на ровном месте.
Задача, проверить корректно ли открыты и закрыты скобки. Случай с одним видом скобок:
(()()) - корректно
(()))(() - некорректно
но для этого достаточно одной переменной.
Интереснее с несколькими видами ([{<>}])
([(])) - некорректно
Тут уже стек нужен, но в питоне это совсем просто, можно обычный список в качестве стека использовать
Ну вот запилю я сейчас свой первый говноблог, а дальше что? Накидайте идей для пет прожекта, где я смогу реализовать весь функционал фреймворка, чтоб можно было его ковырять и допиливать в ходе изучения остального стека
кек
Такое спрашивают, когда изучаешь базовые алгоритмы и структуры данных. Тащемта, если не знаешь такого, ты по умолчанию дебил унтерменш и для всего юзаешь списочки ака массивы
Я так и понял анон, поэтому и написал бяку, чтоб ты навернул алгоритмы и структуры данных.
Кидай почитать чего, только без выебонов.
Мурзилку какую-нибудь базовую, для понимания предмета в целом. Потом расширю когданибудь
Algorithms in a Nutshell George T. Heineman, Gary Pollice & Stanley Selkow
Грокаем алгоритмы
Т.Кормен - Алгоритмы. Построение и анализ
import itertools
s = "coooccck"
result = "".join(["{}{}".format(k,len(list(g))) for k, g in itertools.groupby(s)])
Использовать алгоритм bfs для нахождения кратчайшего пути. Алгоритм тут(https://pyfiddle.io/fiddle/ef79dbfc-a65f-456d-84e7-e114716ebb32/?m=Saved fiddle). Мне нужно вывести его длину и все точки, через которые он проходит. Длину я подсчитываю, а как записывать вершины, через которые прошёл - не понимаю. Подскажите, что нужно добавить.
>Подскажите, что нужно добавить.
Добавить в твою даунскую голову, что раз ты выбрал прогать, знай, тебе никто никогда не поможет.
А теперь ебись с этим.
Совет: решения утром эффективны лучше всего.
Зачем городить свой поиск пути?
??????? ?????????????? ???????? ???? ?????? ??????, ???????? ????????? (?????????) ??????. ?????, ????? bfs ?????????????? ??????? ??????? ? ???? ?? ??? ???? ??????? ???????? 3.
Спасибо, запилю свой говноблог для закрепления пройденогоматериала и обмажусь этими твоими алгоритмами
Бамп, посоны.
AAAABBCC -> A4B2C2
+
https://pastebin.com/eSfEPVP0
Я уже и забыл как подобное решать, пиздец. 40 минут мучений над двумя ебаными задачами.
Благо собеседующий сам на пистоне лишь немного пишет, поэтому в паре моментов не доебался.
С анаграммами совсем просто.
Создаёшь словарь, где ключём будет отсортированное слово, а значением - список слов-перестановок
дальше идёшь по входящему списку
for word in input_words:
sorted_word = sorted(word)
if sorted_word in ana_dict:
ana_dict[sorted_word].append(word)
else:
ana_dict[sorted_word] = [word]
в итоге получаешь словарь списков.
Я решил через Counter & defaultdict.
Первая задача:
https://ideone.com/yiLs2b
Но правда когда решал, умудрился в двух местах протупить, сначала туплы вместо списков, из-за чего ошибка исполнения, потом забыл нулевой элемент из вывода убрать. Наверное, если бы так решал перед собеседователями, то тоже дёргался бы.
Вообще, наверное это такие примитивные задачки, чтобы понять, что перед тобой не случайный человек. На стрессе наверное нормально дёргаться и тупить. На самом деле очень много ведь случайных, кто и такое не решит, но пытаются куда-нибудь устроиться.
Ты главное не сказал, после этих задач на какое-нибудь дальнейшее собеседование зовут? Или не понравилось, как ты решал?
> чтобы понять
Думаю да, и на ждуна и на мидла одно и тоже.
>>72276
> Ты главное не сказал
Ну я ж написал, что собес только закончился, соответственно результатов пока нет. Да думаю что не прошёл, ну и похуй.
Я ему про рэбит и распределённые вычисления, а он мне "а запили как мне анаграммы", забавно.
Помогите, кто разбирается в tkinter. Необходимо в окне вывести символ с индексом и символ со степенью(на пике пример, где v с индексом, а метры в кубе). Я пока что придумал только делать одну строку одним шрифтом, затем записывать вторую строку делать ее шрифтом меньше и сдвигать вверх на пару пикселей для степени и сдвигать вниз для индекса(на второй пикче как это должно быть, но для этого приходится дописывать 2 строчки дополнительные и еще перебирать координату х, чтобы подогнать тройку эту), но может есть другой способ?
Ролю нет
Сортировать каждое слово это, наверное, довольно долго, быстрее будет проверять через перевод слова в set символов
Тот редкий случай, когда можно вспомнить о frozenset().
О, точно. Вроде использую юникод для греческих и латинских букв, а про индексы и не подумал. Спасибо за помощь.
Программированием не увлекался особо. Так немного поковырял недельку. Бота для телеги написал. Парсер для вк захуярил.
Функцианала не много, чисто для себя делал, но при желании могу много плюх накрутить.
Этого ведь мало для трудоустройства? Или там где без опыта работы берут именно такие и нужны? Чё вы там учите такого годами?
хуй знает, я так вакансии полистал - там везде всякая разная хуйня - базы данных, вёрстка, и прочая хуйня, которая к питону не относятся, какие-то определенные модули/фреймворки. Тоесть при трудоустройстве нужен обычно не только язык программирования - а стак технологий которыми ты владеешь.
Мне даже просто не понятно, где для чувака без опыта работы граница того, чем он владеет. Вот например могу я те же простые запросы делать. Могу ли я говорить, что знаю бд?
Ну я бы сказал, что базовые знания по БД имею. А так - сам хз как правильно на работу устроиться - тоже ньюфаг.
>>72486
Да уже в них смысл есть, причём немалый.
На собес спрашивают активно, не в первую очередь, правда.
Но конечно же их не стоит учить в первую очередь, всё же для синхронных либ сопутствующие батарейки лучше развиты и спрос на них высок.
>>72445
Выбери область в которую хочешь катиться, и тогда анон подскажет стек примерный.
Игра запиленная на PyGame
Пилите игру, прогресс разработки заливаете на гит(любой сервис), аноны оценивают и победителям приз, к примеру 200$(рубли/битки and etc. в эквиваленте).
1. Тематика любая;
2. Пара отдельных направлений - 2D и 3D(в каждом направлении свой победитель и свой приз);
3. Поощрительные призы за не призовые места, но за код/душу/музыку/анимацию and etc;
4. Уже ведёшь разработку? Похуй, можешь принять участие. Главное - активность.
5, Со сроками определимся, но как по мне, хватит - 2-3 месяца.
Есть желающие принять участи?
Меня на собесе минут 40 спрашивали о работе асинхронных библиотек, плюсах, минусах, работе с синхронными либами, как избегать таких ситуаций и т.д. А на деле у них там из асинхронщины только задачи в очередь кладутся. Я тогда знатно пригорел. Ну нахуя вы дрочить на собесах так, словно у вас неебически мутированный стек и вы прям на С дописываете комплекты к либам, когда на выходе имеется обычный json, crud и очереди?
Такие конкурсы же делают в гд. Да и тут по факту половина работы дизайнерская, и странно это pygame'ом и вообще питоном ограничивать
Хм, можно расширить до Kivy/PyQT.
Но мне кажется, что разрабы на Kivy будут в неравных условиях.
Хотя, можно разделить призы ещё и по платформам.
>>72565
> Такие конкурсы же делают в гд
Там конкурсы на быструю разработку встречал только, а тут немного другое.
> Да и тут по факту половина работы дизайнерская
Да, но есть куча готовых ассетов, поэтому вай нот?
> странно это pygame'ом и вообще питоном ограничивать
В этом и суть. На пайгейме не очень много свежих и играбельных игр есть, почему бы не оживить немного?
Сколько платишь? Сколько предоплата?
Помогите с проблемкой. Осваиваю ООП. Написал код с графическим интерфейсом, который проводит определенные расчеты, на пике часть от этой программы. Сейчас решил представить этот код в виде классов. Создал класс с постоянным полем, который содержит строчки, необходимо вывести эти строчки в главном окне, но если внутри класса передавать аргумент root, то выдаёт ошибку. Каким образом засунуть эти строчки в главное окно? Вот ссылка на код, если надо https://pastebin.com/LgtTquDE
ООП на примере Python - плохой выбор. Но дело твоё.
Когда присваиваешь непосредственно внутри определения класса, ты создаёшь статическое поле. Тебе же нужно создавать его в экземпляре. Короче, присваивай все поля в конструкторе.
class LabEnt:
.def __init__(self, root):
..self.labels = Label(root, ...)
...
a = LabEnt(root)
Как можно проебать форматирование в 2019?
куда собеседовался?
Это копия, сохраненная 10 октября 2019 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.