Это копия, сохраненная 28 марта 2016 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Прошлый: >>665294 (OP)
2.х или 3.х v1: http://legacy.python.org/dev/peps/pep-0373/
2.x или 3.x v2: https://wiki.python.org/moin/Python2orPython3
ОП-пик устарел.
угомонись уже, пидор
А нахуй нужен свитч в некомпилируемом и динамическом языке? Вся его фишка же в том, что свитч сравнивает переменную с константами, из-за чего что-то там оптимизируется и быстро работает.
if/elif всё равно не больше места занимает (даже на один отступ меньше, чем если бы свитч был).
Допустим, мне надо, чтобы моя программа качала некие документы, которые ежедневно выкладываются на неком веб-ресурсе. Они бы складывались на фтп-сервере, каждый в папку со своей датой, когда были скачаны в формате dd/mm/yyyy. Чисто теоретически, сложно такую задачу на питоне?
Что нужно знать для реализации сей тривиальной задачи? Я начинающий программист. До этого на паскале/делфи писал из разряда laba1.
Все равно, в общем-то. А если нет, что поменяется? Полагаю, у виндоюзера должны возникнуть проблемы.
Нет, просто можно было бы и на bash написать. В общем, не важно.
Мисскликнул. Хотел сказать, что тоже интересно, буду знать.
Когда-то делал заливатель изменений из гит репозитория по фтп. Можешь передрать оттуда, там курлом всё сделано.
https://gist.github.com/kctier/33cda7cf6413c733d7eb
Тут в цикле достаются url из файла и сохраняются в текущей папке с датой в формате, который ты указал. А с ftp я не очень понял что тебе и куда, но будет выглядеть примерно так же.
С фтп надо будет просто качать в папочку, которая корневая у ftp сервера, который он поставит.
Ну тогда должно выглядеть примерно так:
mkdir -p $(date +"") && cd $_;
for url in urls.txt;do curl $url -O $(date +"%d-%m-%y");done;
Первая строка создаёт директорию, если она еще не существует, и переходит в неё. Вторая строка в цикле скачивает файлы по url и сохраняется с тем же названием, что и в url. Как-то так.
Что такое $_. Вывод предыдущей команды? Первый раз вижу такую конструкцию, это башизм?
Ошибся.
mkdir -p $(date +"%d-%m-%y") && cd $_;
r url in urls.txt;do curl -O $url ;done;
$_ - последний аргумент предыдущей команды.
Мне лень работать, поэтому вот вариант на powershell:
$urls = get-content "urls.txt"
$outputFolder = New-Item -Force -ItemType Directory -Name (get-date -format dd-MM-yy);
foreach ($url in $urls) {Start-BitsTransfer -Source $url -Destination $outputFolder}
Что мешает, кстати микрософт-быдлу поставлять питон из коробки? Лицензия позволяет. Поддержка винды там норм.
Apple вот поставляет.
Просто за это никто не заплатит.
1) Стул с пиками. Вес 5.
2) Стул с хуями. Вес 3.
3) Правильный ответ. Вес 1.
ИИ должен случайно выбрать в соответствии с весом варианта. Но при этом алгоритм должен быть универсальным Тоесть, нельзя просто взять и написать что-то типа:
> a = random.randint(1,9)
> if a <= 5: ai.piki_tocheni()
> elif a <= 8: ai.hui_drocheni()
> else: ai.pravilniy_otvet()
Нужно чтобы была возможность удалять и добавлять варианты и менять их вес.
Есть ли в питоне что-то готовое для такой задачи или нужно самому велосипед изобретать?
Как такой велосипед лучше организовать?
О, я делал такое. Тебе нужно сгенерировать кеш по всем значениям, суммируя последовательно веса: [5, 8, 9]. Далее randint по всему диапазону и бинарный поиск индекса по кешу (есть хороший модуль bisect).
Правда если у тебя оче дохуя удалений, вставок и перевешиваний, то советую сделать как бы бинарное дерево. В каждой ноде хранятся полные суммы весов каждой из двух ветвей. Туда же я бы посоветовал записывать полное количество листьев каждой ветви, чтобы дерево можно было поддерживать сбалансированным. Собственно поиск это спуск по дереву до листа: в каждой ноде у нас два весовых числа и мы просто выбираем взвешенным рандомом одну из ветвей, далее повторяем пока не достигнем листа. Удаление, добавление и перевешивание в целом тривиальны, будут иметь логарифмическую сложность.
Как-то ты ебануто справшиваешь. Тебе просто надо из списка вариантов рандомным образом выбрать один? Random.choise и вперде.
А, я хуячил такой ИИ, только на другом языке.
Суть такова. Тебе нужно использовать реализацию дерева решений. Если не понял, то читай дальше. В твоем случае у тебя одноуровневое дерево с тремя листьями: стул с пиками (вес 5), стул с хуями (вес 3 - пидор, лол, хуи предпочтительнее пик (мне тоже) ) и хуи дроченые срубают пики точены (вес 1).
Чтобы алгоритм обработки оптимального выбора был оптимальным тебе нужна рекурсия (итеративно тоже можно, но заебешься, если у тебя многоуровневое дерево с множеством узлов). Рассмотрим сначала пример с твоим деревом решений, потом посмотрим многоуровневые деревья с лабиринтом пик, негров, хуев, пироженок.
Ты находишься на верхнем узле дерева. У тебя есть 3 листа (лист это конечный элемент дерева. Грубо говоря, нижний). То есть 3 возможных хода ИИ. В начале рекурсивной функции проверяешь не является ли текущая позиция листом (конечным элементом). Если являешься, то вызываешь функцию оценки листа (стула с пиками), который узнает вес этого листа и возвращает его обратно. Рекурсивная функция, получив итоговую оценку своей позиции, возвращает ее вес.
Если текущая позиция не является листом (конечным стулом-элементом), а является узлом, у которого еще есть выборы, то возможные ходы (выборы сортов стульев) этой позиции добавляются в массив или коллекцию. Дальше хуячишь цикл по всем элементам массива. На каждом возможном ходу вызываешь рекурсивную функцию передавая в качестве параметра позицию хода (стула) и сравниваешь возвращенный вес с уже имеющимся наилучшим. Если вес меньше (хуи дроченые срубают пики точены (вес 1) лучше стула с пиками (вес 5) ), то наилучший вес делаешь равным возвращенному.
Только не забудь ограничить глубину раскрытия дерева решений - то есть идет оценка позиции и возврат веса если это лист (конечный элемент, достигли ДНА дерева) или достигнута максимальная глубина. Само собой, при погружении внутрь тогда надо изменять текущую глубину.
В результате такой хуйни, функция рекурсивно пробегает по всему дереву и возвращает наилучший ход (если несколько наилучших, то первый из них. Или какой сделаешь). То есть с одноуровневым (с 1 узлом - родительским и 3 листями - стельями) такая хуйня пробежится по всем стульям и вернет срубление пик точеных хуями, ибо вес ее будет наилучшим.
Если же у тебя многоуровневное дерево (перед тобой 3 прохода в каждом из которых 3 прохода в каждом из которых несколько стульев различного веса), то вернет наилучший ход и ИИ гарантированно не зайдет в позицию, где на одном стуле неснимаемые пики точены, на другом несрубаемые хуи дрочены, а на третьем распаленные геи-ниггеры из далекого космоса.
Хуйня получается компактной, расширяемой (функции поебать на размер и многоуровневость дерева) и твой преподаватель тебе отсосет. Только пиши аккуратно, а то охуеешь от траблшутинга, если что-то будет работать не так, как должно.
Если по-прежнему нихуя не понял, то ищи стратегию минимакса - по ней поймешь.
А, я хуячил такой ИИ, только на другом языке.
Суть такова. Тебе нужно использовать реализацию дерева решений. Если не понял, то читай дальше. В твоем случае у тебя одноуровневое дерево с тремя листьями: стул с пиками (вес 5), стул с хуями (вес 3 - пидор, лол, хуи предпочтительнее пик (мне тоже) ) и хуи дроченые срубают пики точены (вес 1).
Чтобы алгоритм обработки оптимального выбора был оптимальным тебе нужна рекурсия (итеративно тоже можно, но заебешься, если у тебя многоуровневое дерево с множеством узлов). Рассмотрим сначала пример с твоим деревом решений, потом посмотрим многоуровневые деревья с лабиринтом пик, негров, хуев, пироженок.
Ты находишься на верхнем узле дерева. У тебя есть 3 листа (лист это конечный элемент дерева. Грубо говоря, нижний). То есть 3 возможных хода ИИ. В начале рекурсивной функции проверяешь не является ли текущая позиция листом (конечным элементом). Если являешься, то вызываешь функцию оценки листа (стула с пиками), который узнает вес этого листа и возвращает его обратно. Рекурсивная функция, получив итоговую оценку своей позиции, возвращает ее вес.
Если текущая позиция не является листом (конечным стулом-элементом), а является узлом, у которого еще есть выборы, то возможные ходы (выборы сортов стульев) этой позиции добавляются в массив или коллекцию. Дальше хуячишь цикл по всем элементам массива. На каждом возможном ходу вызываешь рекурсивную функцию передавая в качестве параметра позицию хода (стула) и сравниваешь возвращенный вес с уже имеющимся наилучшим. Если вес меньше (хуи дроченые срубают пики точены (вес 1) лучше стула с пиками (вес 5) ), то наилучший вес делаешь равным возвращенному.
Только не забудь ограничить глубину раскрытия дерева решений - то есть идет оценка позиции и возврат веса если это лист (конечный элемент, достигли ДНА дерева) или достигнута максимальная глубина. Само собой, при погружении внутрь тогда надо изменять текущую глубину.
В результате такой хуйни, функция рекурсивно пробегает по всему дереву и возвращает наилучший ход (если несколько наилучших, то первый из них. Или какой сделаешь). То есть с одноуровневым (с 1 узлом - родительским и 3 листями - стельями) такая хуйня пробежится по всем стульям и вернет срубление пик точеных хуями, ибо вес ее будет наилучшим.
Если же у тебя многоуровневное дерево (перед тобой 3 прохода в каждом из которых 3 прохода в каждом из которых несколько стульев различного веса), то вернет наилучший ход и ИИ гарантированно не зайдет в позицию, где на одном стуле неснимаемые пики точены, на другом несрубаемые хуи дрочены, а на третьем распаленные геи-ниггеры из далекого космоса.
Хуйня получается компактной, расширяемой (функции поебать на размер и многоуровневость дерева) и твой преподаватель тебе отсосет. Только пиши аккуратно, а то охуеешь от траблшутинга, если что-то будет работать не так, как должно.
Если по-прежнему нихуя не понял, то ищи стратегию минимакса - по ней поймешь.
> Тебе просто надо из списка вариантов рандомным образом выбрать один?
Да, но при этом 1 элемент должен выпадать чаще другого, пропорционально весу.
> Есть два стула... Я выберу срубание... Хотя нет, в этот раз я выберу хуи. Не повезло прост((
Рубисты в треде, все в пхп.
Я думал о таком решении, но, если у пик будет вес 9999, а у хуёв 1, то придётся генерить список в 1000, а потом каждый раз перегенерировать при изменении весов, что непозволительный просер вычислительных ресурсов.
Чому бы не сортировать по весу и выбрать из наименьших?
Зачем устраивать дискуссию, если это есть в документации?
>Вот хуле нового ты сейчас сказал?
Ты очень неприятно выражаешься.
>Вот хуле нового ты сейчас сказал?
Конкретный пример в питоновских буквах.
Мне пригодилось. Больше чем описание про кеш словами без примера.
Всем спасибо за подсказки и участие.
Стековерфлоу-программисты пишут ИИ, лол.
> то придётся генерить список в 1000
И что? Во-первых, 1000 элементов это ничто. Во-вторых, они будут ссылаться на тот-же объект, то есть памяти тоже минимум съедено.
Не занимайся преждевременной оптимизацией тем более на быдлопитоне.
Ну вот. Тем более 10^12 вес. Обычно не бывает такого. При таком весе весом 1 можно было бы вообще принебречь.
Я только учусь и никогда раньше не сталкивался с таким таском, для этого мне можно обойтись только Django REST и для отображения написать несколько Ajax запросов? Я правильно понял?
Думаю тебе надо пердолиться с каким-то javascript фреймворком. Питоновская часть то простая. Кстати django rest довольно сложный, есть попробще либы.
в туториалах советуют Angular + REST, с первым я не знаком совсем. Хотя, думаю, задача не такая трудная чтобы на фронтенде использовать фреймворк.
В яваскрипт треде янгуляр чмырят дико. Сам я его не осилил(и не пытался).
Можешь на простом яваскрипте сделать или на jquery.
Если тебе просто преподу показать, то можно хранить картинки прямо в localStorage, а для SPA взять один из тысячи js галлерей, которая в любом случае понадобится.
аджахе!
Да, мне нужно просто реализовать это приложение на дев сервере. Я просто не совсем понимаю, что входит в понятие SPA. В моем представление, это приложение в котором весь обмен данными реализован через Ajax, без обновления страницы и данные отдаются через Json.
Соответственно мне нужен Django Rest. Я правильно все понял?
Дай-ка угадаю: ТЕСТОВОЕ ЗАДАНИЕ?
Django REST необязательно, можно и на голом Django все это сделать. Тут как тебе будет удобнее.
Галерей на js масса, выбирай одну, смотри в каком формате она получает данные. Скорее всего, это будет json список ссылок на превьюшки и полноразмерные картинки.
Single Page applications же, еба.
>данные отдаются через Json.
Не обязательно. Даннуми ты можешь хоть через WEB-сокет по каштомному бинарному протоколу обмениваться.
>Соответственно мне нужен Django Rest.
Совсем не обязательно. Можно на простой джанге заипошить, можно на фласке, можно хоть на голых скриптах. Задание-то хоть на какую позицию?
Django REST нужен чаще всего когда ты хочешься сделать по быстрому нормальное API к своему приложению, чтобы другие могли юзать его из своих сервисов. В твоем случае обычные вьюхи и какойнить ангуляр с библиотекой для картиночек будет достаточно.
>>672320
>>672324
Спасибо
Я позицию джуниора ищу и выполняю все задания которые предлагают. Пока устроится не могу. Самое тяжелое пока было написать простое реалтайм приложение, я написал но завалил все, что можно в интервью, сейчас подтянул знания.
Погуглю галереи и отдавать буду Jsonresponce через Ajax запросы, намного проще пока выглядит чем вникать в Rest и Angular
моча рано ударила в голову в 4 активно ругался матом
в детском саду девочки впервые показали мне пизду
потом школа вонючая форма драки клей так я становился сильней
Не совсем то, но пока искал, нашел, что Selenium в качестве вебдрайвера может phantomjs использовать.
Господа жи.
Месяцев 7 учусь, работаю 2х2 так что время свободное есть.
Входных данных никаких, даже отдаленно не представлял как все устроено. Прочитал Лутца, посмотрел кучу туториалов, вроде вник в основы, потом начал Django изучать, сейчас с основами тоже знаком хорошо. По sql небольшую книгу прочитал, не помню автора, просто чтобы представлять как делать запросы без ОРМ. Свой уровень не могу точно оценить но на джуниора точно должен тянуть.
Вообще нужно очень много практики, чтобы в голове откладывалось больше информации. На собеседования зовут редко как сделаю что-нибудь стоящее для гитхаба, может получше пойдет
3 месяца
Кодекадеми -> книжки-туториалы все подряд, уже добрый десяток книжечек со всеми заданиями и прочей хуйнёй, штук сорок скриптов для себя накатал что бы автоматизировать всё что хотел, вроде автоматизировал.
Начинал учить что бы высрать вполне конкретные две системки на джанго но меня до сих пор ебёт их делать.
А с другой стороны кодинг заебись, даже если я буду зарабатывать за месяц 3 сотни баксов это будет больше чем моя текущая зп, а я так понял удалёнку на 3 сотни найти не самое сложное в этой жизни.
Скажем так, я фрилансер в сфере корпоративного управления. Обычно это означает что я сижу дома и пизжу с долбоёбами на линкедине за мизерную ставку. Изредка - что я куда-то еду и за огромную кучу бабла им чёто делаю. Изредка это реально изредка.
Из других смешных особенностей опыта у меня вроде и много, но для международного уровня маловато, а местный вымер нахуй ввиду того что теперь моя область называется лднром.
Вот и получается что для говновакансий за 500 баксов никто с экспантом ебаться не захочет, собеседоваться зовут только на всякое говнище по 1-2 К $, а живу я на 10 тыщ руб которые зарабатываю тем что торгую через инет при помощи вордпресса и адсенса/директа всяким говном
Фантом жс. Только его надо отдельно скачивать. Удобная штука. А во время отладки надо одну строку поменять чтобы все было видно
Вычислить выражение типа
1 | 2 | 3 | ... | n
На тестах большого числа n все ломается.
Делал через reduce - MemoryError
А через цикл - Process was terminated. It took longer than 6000ms to complete.
Какой алгоритм взять?
вычислить or натуральных чисел от 0 до n
>Given a number n we will define it's scORe to be 0 | 1 | 2 | 3 | ... | n, where | is the bitwise OR operator.
>Write a function that takes n and finds it's scORe.
а меня хоть никто и не просил тоже расскажу.
С лета мееедленно так читал сначала Укус, понял что нихера не понял (вернее для реализации даже курсачей понимания маловато), решил сделать "сначала все зубришь-потом кодишь", поэтому читал вяло полгода Лутца. Понял что так нихера не проканает и сижу читаю теорию Лутца, практику Лутца, Бизли с примерами и описаловом библиотеки и еще СИКП и пытаюсь в курсачи и чтобы понять как работает оно. Но этого не случалось пока мне не припекло что мне надо перебираться из моей мухосрани а коденхом это сделать будет проще всего по затратам времени.
А большое n - это сколько? На моем днищеноуте n=100 млн вычисляет 5.4s
Само собой. Я просто хотел чтобы было видно почему так получается.
OR не умеет превращать 1 в 0. Если у числа где-то 1 в двоичном представлении, то сколько его не орь она там останется.
Поэтому у тебя сразу должно возникнуть предположение, что двоичном представлении X = 1 | 2 | ... | N должно быть дофига единиц.
По факту результат будет состоять из такого же количества битов, что и N, но все они будут "1". Даже объяснять лень.
По мне и фласк слишком батарейкнутый для простых дел.
Попробуй веб2пу - оно простое как банка пива и тоже работает.
что рекомендуешь прочесть чтобы понять веб2пу? и понять что он прост как банка пива?
Туториал на оф. сайте
f =open('file.txt').read().replace(',\n',',').split('\n')
f = filter(None, f)
for i in f:
print(i)
должно быть 10 строк, но их 11, т.е последняя пустая. Откуда она берется, как ее убрать?
Так так так. А что не так с каррингом? Глаз зацепился просто.
># -- coding: UTF-8 --
Такая хрень же не нужна в третьем, да?
Поиграй с бесплатным питонэнивер хостингом, пройди Джанго герлс туториал - базарю вопросов не останется вовсе а по времени займет ну 3 часа
Хочу вкатиться в кодинг в Х лет, нихуя не умея (кроме английского). Как я понял, из ЯП Python - самый легкий в плане синтаксиса.
Прочитал Лутца, прошел пару онлайн-курсов по основам синтаксиса, порешал задачки. Теперь хочу перейти к прикладному применению, писать код по обработке встроенных типов данных уже не интересно.
Посмотрел материалы, много книг, туториалов на инглише, по применению python в куче разных областей. Не представляю, за что браться, с чего начинать, так как по-хорошему специализироваться придется в чем-то одном. Data analysis, system administration, networking не привлекают, питоновские GUI и mobile apps убогие (пацаны сказали), остается web-development (порог вхождения низкий, как раз для всякого днища подойдет).
Так вот, где можно посмотреть примерный перечень технологий для фулстэк веб-разработки на питоне? Насколько я понял, нужно мочь в: верстку (html, css), базы данных (sql, postgres, mongodb), специализированные питоновские библиотеки и фреймворки (flask, pyramid, django), знать теорию (компьютерные сети, алгоритмы, паттерны проектирования), опционально linux, JS плюс соответствующие библиотеки и фреймворки. Поправьте, если что-то пропустил или ошибся.
Еще все утверждают, что просто учить синтаксис не имеет смысла, надо в ходе изучения создавать некие проекты. Что это за проекты и с чем их едят? Где можно посмотреть примеры, чтобы что-то выбрать для себя?
Лучше вкатывайся в мобайл девелопмент, на питоне гораздо лучше.
Учи все что попадает под руку, тебе это много времени на текущем уровне не займет, а кругозор расширит.
Ага, быстрее найдет "точку опору" и начнет ориентироваться во всех этих баззвордз.
на степик 10 марта начнется курс "прикладное программирование", может будет интересно
def clock(interval):
while True:
print("Текущее время: $s" % time.ctime())
time.sleep(interval)
t = threading.Thread(target=clock, args=(15,))
t.daemon = True
t.start()
Process finished with exit code 0
И все, ничего не выводит. В чем подвох?
Нагуглил как минимум справочник на русском
>A thread can be flagged as a "daemon thread". The significance of this flag is that the entire Python program exits when only daemon threads are left.
Попробуй убрать этот флаг, поставь интервал поменьше (1 секунду) и запусти. Смотри на консоль. Затем читай про .join() в доках.
Через try: os.... Рар архиватор запускать консольный и если вышел с ошибкой - следующий?
Именно весь файл просматривать?
Страшно представить сколько времени займет проверка картиночек по 15 мб
Ну ты можешь сначала прочитать заголовок жипега (http://www.fastgraph.com/help/jpeg_header_format.html), вытянуть оттуда нужные данные, посчитать размер и пропустить нужное количество байт, а там уж видно будет, есть что-то или нет (ну или сразу сравнить с размером картинки).
мне очень понравился лектор, интересно слушать его. Вообще у них много годных лекций на канале
Ходил устраиваться туда около полугода назад. Сначала немного общался текстом в скайпе с эйчаршей, вроде все норм. Пришел, прошел через охранника. Коридоры просторные, светлые. Вроде и аккуратно всё, но отдает какой то медицинской стерильностью. Вышла эйчарша. Симпатичная молодая девушка в джинсах и клетчатой рубашке, офисным стилем даже не пахнет. Пригласила в кабинет. Спросила за мой опыт, проекты, задала несколько несложных вопросов. Сказала что ы как профессионал её устраиваю, но хотелось бы ещё узнать личные качества. Пригласила для неформальной обстановке выйти покурить. На улице начала настойчиво ко мне приставать, обнимать, говорить что ей нужно узнать меня поближе. Сказала рядом живет. Ну я тогда молодой был, токсикозный. Согласился. Жила она правда рядом, буквально через дорогу. Пришли, она взасос поцеловала, начала меня раздевать. Ну я же листва, начал дрожащими руками её раздевать. Стягиваю джинсы с неё, а она без трусов и у неё нихуевый такой хуй, сантиметров 18 точно будет. Я охуел, замер, перевожу на неё взгляд, а она улыбается, меня по голове гладит и показывает на хуй, говорит - "я тебя на работу возьму без испытательного, зарплату сделаю выше на половину". Ну я подумал - а что терять? Она ничего не докажет, а работа не помешает. Ну я и сделал ей минет. Она как кончила сразу чего то занервначала, стала одеваться. Мне мою одежду дала и вытолкнула за дверь, сказала завтра сообщит по телефону во сколько приходить на работу. Этим же вечером пришла смска, что я им не подхожу. Я перезванивал - телефон не доступен. Обратно в офис ходил - охранник отказывается пускать. Квартира та как оказалась была съемная. Плохая компания, не рекомендую.
виджет - жс, значит тебе нужно что-то типа селениума что бы оно могло эти страницы с жс в браузере собрать прежде чем по икспас парсить
нафига?
виджет подключается с помощью определенного жс скрипта вроде как, парсишь на страницах урл с этим жсником, все
Пока смотрю на Dive into.
ну или справочник Бизли
Я уже 2 книги добавил где описывается все без воды.
https://github.com/TheKnightsWhoSayNi/info/wiki/Books#Лёгкие-книги
лолд
Двачую, трап > тян.
У меня один знакомый не успел переназначить бранч и закоммитил в мастер тян. В итоге релизнулся проект, а ему пришлось стать контрибьютором. Не забывай про безопасность.
не в ту ветку пушишь, тут трапы и их преимущества
То есть, сперва спарсить все сайты из выдачи?
если просто найти, то хоть юрлгетом. Смотришь как у гугла/яндекса url формируется для запросов, потом берешь какую-нибудь либу для работы с DOMом, там BeautifulSoap или Grab, ну или что ты там нагуглишь. Потом ходишь ею по ссылкам с выдачи, скачиваешь исходник сайта, можешь той же либой, но urllib должно хватить. Ну и ищешь в исходниках код, который вставляют для того что бы добавить этот блок комментариев.
Спасибо.
>f =open('file.txt').read().replace(',\n',',').split('\n')
>f = filter(None, f)
>for i in f:
>print(i)
Покажи свой файл
>базарю вопросов не останется вовсе а по времени займет ну 3 часа
Сдается мне, ты пиздишь. Вкатиться в джанго и за три дня не удастся, во всяком случае вопросов становится все больше, а про то чтобы хостить сайт даже пока боюсь и думать.
мимо нуб кун
Человек о хостинге и жеплое питон-приложений на этот хостинг спрашивал.
Спрашивал о веб2пу а не Джанго
А туториал от Джанго герлс я ему почитать рекомендовал ибо там тема использования питонэнивер раскрыта так что даже бабы врубаются.
Читай документацию, блеать.
https://docs.python.org/3.5/library/threading.html#threading.Thread.daemon
>The entire Python program exits when no alive non-daemon threads are left.
Короче либо крестик сними daemon=true убери, либо [/s]трусы надень[/s] t.join() сделай.
Ну у тебя в конце файла есть перевод строки. Стрипни текст и все.
> f = filter(None, f)
Должно убрать пустые строки. Видимо там не просто пустая строка а пробел.
Два чая этому господину. Некоторые пункты на OP пике вообще высосаны из пальца. Зачем питону компилятор, если он изначально разрабатывался без расчёта на компиляцию в машинный код. А так то, компиляция в байт-код есть, ибо .pyc файлы никто не отменял. Приватные методы - _,methodname или __methodname. КАРОЧИ ТОЛСТА.
Канпелятор есть - jit и pypy, есть nuitka, есть cython.
Проверка типов тоже есть - mypy и в pycharm.
Под "хвостовая рекурсия" афтар видимо имел ввиду tail call optimization и это фишка функциональных языков где нет циклов. Зачем оно в питоне непонятно, но всё равно можно запилить через хаки.
Карринг тоже есть - тот же functools.partial или самому запилить можно т.к. функции первого порядка
Ленивость тоже.
https://github.com/OlegWock/2ch-files-downloader
Подписывайтесь, ставьте лайки
kak?
matplotlib - тормознутое говно
vispy - не работающее аппаратно-ускоренное говно, кидающееся NotImplementedException на попытку его использования для построения графиков
всё остальное - низкоуровневое говно для рендеринга полигональных моделек
Честно - ни разу не слышал что бы матплот обвиняли именно в тормознутости
В других грехах - да, но в тормознутости от тебя первого слышу. Может ты что-то делаешь не так?
Можете сказать какие, а то я в этом деле валенок.
Вчера слушал "Talk Python to me" не совсем понял зачем он, какоето бесконечное обмазывание петоном в прямом эфире.
>Ну у тебя в конце файла есть перевод строки. Стрипни текст и все.
нет, пустые строки от перевода(любого количества) срок не появились бы
да? ну тогда ладно.
plotly - рендерит в браузере, и по-видимому юзает веб-сервис. Ты мне ещё предложи jupyter заюзать (не идёт потому, что разрабы pyzmq послали xp на хуй, увидев, что одной из импортируемых ими функций в xp нет, а разрабы jupyterа по видимому завязали jupyter на всяякое не нужное дерьмо (нахуя локалному нехайлоад экземпляру сервер очередей?)).
pygal - 2д диаграммы
>>674802
1 а ты попробуй построить 3d график
2 а на старом железе даже 2d будет тормозить
>но в тормознутости от тебя первого слышу.
1 на стековерфлоу есть об этом тред
2 в доках об этом написано и сказано юзать vispy
Есть еще подкаст.инит и питон тест подкаст
По мне так до жопы все это, я тупо разговорные слушаю что бы не так быстро речь иноземную забывать а пионерские термины - их и так хуй забудешь за отсутствием русских.
в том эпизоде что я слушай, кстати, поясняли что без петона в cgi и кинематограф вообще не ходи.
Вот ещё кстати, к ней примерялся, но тогда она qt5 не поддерживала и я её дропнул.
https://github.com/pyqtgraph/pyqtgraph
Что значит «не могу»?
>ошибку выдает
Очень полезная диагностическая информация, оставайтесь на линии, наши экстрасенсы уже закидываются спайсом и вылетают.
Никаких требований кроме регистрации. Делается через setup.py (как они там сейчас называются, setuptools или distutils). Есть ещё тестовый pypi, можешь попробовать, посмотреть, поправить.
Использовать пункты вместо пикселей, использовать вектор вместо растра.
Там дадо полигоноёбствать чтобы построить в 3d
>тыкайте сюда и хуяхуяк runserver
Обычно такой способ изучения фреймворков самый эффективный. Если же ты не в теме как решается некая задача, для которой предназначен именно этот фреймворк, то учись. Блог напиши, гостевуху, а то с хелловорлда решил сразу магазины идти писать.
File "manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 429, in exec
ute_from_command_line
utility.execute()
File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 379, in exec
ute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 191, in run_from
_argv
self.execute(args, *options.__dict__)
File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 219, in execute
self.validate()
File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 249, in validate
num_errors = get_validation_errors(s, app)
File "/usr/local/lib/python2.7/dist-packages/django/core/management/validation.py", line 35, in get
_validation_errors
for (app_name, error) in get_app_errors().items():
File "/usr/local/lib/python2.7/dist-packages/django/db/models/loading.py", line 146, in get_app_err
ors
self._populate()
File "/usr/local/lib/python2.7/dist-packages/django/db/models/loading.py", line 64, in _populate
self.load_app(app_name)
File "/usr/local/lib/python2.7/dist-packages/django/db/models/loading.py", line 78, in load_app
models = import_module('.models', app_name)
File "/usr/local/lib/python2.7/dist-packages/django/utils/importlib.py", line 35, in import_module
__import__(name)
File "/home/Contra111/my-first-blog/blog/models.py", line 2, in <module>
from django.utils import timezone
ImportError: cannot import name timezone
Мне что-то подсказывает что проблема в том, что в ошибках питон 2.7, я то писал всё на третьем и учебник на третьем, что делать?
File "manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 429, in exec
ute_from_command_line
utility.execute()
File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 379, in exec
ute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 191, in run_from
_argv
self.execute(args, *options.__dict__)
File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 219, in execute
self.validate()
File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 249, in validate
num_errors = get_validation_errors(s, app)
File "/usr/local/lib/python2.7/dist-packages/django/core/management/validation.py", line 35, in get
_validation_errors
for (app_name, error) in get_app_errors().items():
File "/usr/local/lib/python2.7/dist-packages/django/db/models/loading.py", line 146, in get_app_err
ors
self._populate()
File "/usr/local/lib/python2.7/dist-packages/django/db/models/loading.py", line 64, in _populate
self.load_app(app_name)
File "/usr/local/lib/python2.7/dist-packages/django/db/models/loading.py", line 78, in load_app
models = import_module('.models', app_name)
File "/usr/local/lib/python2.7/dist-packages/django/utils/importlib.py", line 35, in import_module
__import__(name)
File "/home/Contra111/my-first-blog/blog/models.py", line 2, in <module>
from django.utils import timezone
ImportError: cannot import name timezone
Мне что-то подсказывает что проблема в том, что в ошибках питон 2.7, я то писал всё на третьем и учебник на третьем, что делать?
mkvirtualenv --python=/usr/bin/python3.4 django18
Теперь версия 3.4
Чёт у тебя какая-то плохая джанга. У меня импортируется всё.
In [1]: from django.utils import timezone
In [2]: import django
In [3]: django.__version__
Out[3]: '1.8.7'
Виртуаленв поменял на 3.4, теперь другая ошибка:
(django18) 23:45 ~/my-first-blog (master)$ python manage.py collectstatic
Traceback (most recent call last):
File "manage.py", line 8, in <module>
from django.core.management import execute_from_command_line
ImportError: No module named 'django'
А тут джанги у тебя совсем нет.
Я пока совсем слаб во всех эти серверах, комитах и прочем, пройду этот гайд для девочек, и уже буду о своих серверах думать!
django18) 23:45 ~/my-first-blog (master)$ pip install django-1.9.3
Collecting django-1.9.3
Could not find a version that satisfies the requirement django-1.9.3 (from versions: )
No matching distribution found for django-1.9.3
(django18) 23:48 ~/my-first-blog (master)$ pip install django1.9.3
Collecting django1.9.3
Could not find a version that satisfies the requirement django1.9.3 (from versions: )
No matching distribution found for django1.9.3
Хех. На локалхосте у тебя видимо файл лежал прям там же, с именем django-1.9.3. Так-то pip install Django==1.9.3 (если есть такая вообще, на pypi сверься)
А ну да, так и ставил, на питонэнивер тоже поставил, пытаюсь выполнить python manage.py collectstatic :
Traceback (most recent call last):
File "manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "/home/Contra111/.virtualenvs/django18/lib/python3.4/site-packages/django/core/management/__in
it__.py", line 353, in execute_from_command_line
utility.execute()
File "/home/Contra111/.virtualenvs/django18/lib/python3.4/site-packages/django/core/management/__in
it__.py", line 345, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/home/Contra111/.virtualenvs/django18/lib/python3.4/site-packages/django/core/management/base
.py", line 348, in run_from_argv
self.execute(args, cmd_options)
File "/home/Contra111/.virtualenvs/django18/lib/python3.4/site-packages/django/core/management/base
.py", line 399, in execute
output = self.handle(args, options)
File "/home/Contra111/.virtualenvs/django18/lib/python3.4/site-packages/django/contrib/staticfiles/
management/commands/collectstatic.py", line 173, in handle
if self.interactive and input(''.join(message)) != 'yes':
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd0 in position 0: invalid continuation byte
Чего троллишь то, конечно yes писал
Чёт ты туда ввёл не то. Наверное под КОИ-8 сидишь прямо из восьмидесятых, что даже юникодный строкожуй подавился. Да, в utf-8 таки есть невалидные байты.
Мне это ни о чём не говорит. Что за пайтонэнивеа. Для нюфагов наверное, очередное всё-в-одном. Ток чёт глядя на твои стектрейсы мне кажется оно не справилось с тем для чего предназначалось.
я как понял это хостинг бесплатный, я туда отправил свой репозиторий с проектом, установил джангу, установил whitenoise, теперь пытаюсь настроить файл wsgi, и вот на этом моменте опять ошибка, он не видит whitenoise почему-то, хотя только что установил
я когда на локалхосте ставил джангу, не стал ставить венв, так как не понял зачем он нужен, а на сервере пришлось поставить, т.к иначе использовался питон 2.7
Не, тут речь о программе-сервере. Сам venv может быть в порядке. Например так:
uwsgi:
plugins: python34
env: SETTINGS_MODULE=settings
module: wsgi:app
venv: /ряяяяя/.venv/
master: true
processes: 1
Я в этот файл записал то что в гайде написано, только ник поменял на свой
http://tutorial.djangogirls.org/ru/deploy/index.html
>настроить файл wsgi
Сам wsgi файл обычно "настраивать" не нужно. У меня например вместо sys.path.append просто есть директива chdir, а вместо os.environ директива env. В итоге я могу вертеть как хочу, а wsgi файл остаётся нетронутым. И это правильно потому что складывать в общий гит, в общий файл wsgi.py настройки одной конкретной машины плохо. Но на твоём хостинге видимо нет возможности так делать, поэтому прямо в wsgi хардкодом вписали.
>не видит whitenoise
Пробуй под активированным венв запустить питон и импортировать этот модуль.
>В секции "Virtualenv" кликни по красному тексту "Enter the path to a virtualenv" и набери /home/<your-username>/my-first-blog/myvenv/
На тот который надо указывает?
Читать секции "как создать" и "как использовать".
https://habrahabr.ru/post/157287/
Учитывай что симлинк ipython не создаётся, только python.
Их никто не проверяет. Туда просто пакадж вливается файлом и сразу же появляется для скачивания.
Никто не использует третий кроме школьников это не интерпрайз.
ImportError: No module named 'whitenoise'
При создании виртуаленва версию питона надо выбрать.
Раньше это было:
virtualenv --python=python3.4 venv_dir
Теперь:
python3.4 -m venv venv_dir
Вот так ещё можно не делать его изолированным окончательно, разрешить использовать уже установленное в системе:
python3.4 -m venv --system-site-packages venv_dir
На самом деле это всё такой хак, позволяющий изолировать питоны и наборы библиотек. Он там подменяет несколько переменных окружения и расставляет симлинки. То есть ты под активированным венвом набираешь "python" и у тебя сразу нужная версия питона с нужным набором библиотек, всё импортируется, pip ставит только в этот венв (pip тоже теперь симлинк, в venv_dir/bin глянь). deactivate просто затирает переменные окружения в текущем баш-интерпретаторе и у тебя снова дефолтный системный питон.
Мне кажется что проблема не в венв?
Ну и чо. Не нашёл снова он у тебя модуль. Питон ищет модули по переменной окружения PYTHON_PATH + несколько каталогов по умолчанию (их можно изменить при сборке самого питона из исходников, чем пользуются дистростроители чтобы соблюсти свой дзен расположения файлов). Можешь прямо в шелле echo $PYTHON_PATH сделать (если выведет пустоту, это ок, значит используются только пути по умолчанию). venv в частности подменяет этот самый PYTHON_PATH. И если ты создал venv, сделал activate, установил в него пакет, а потом он у тебя не находится и не импортируется, значит где-то ты сделал хуйню, не знаю, может через sudo поставил системно или ещё что. Гугли @ читай короче, руки выпрямить по телефону я не могу.
Сделаю сейчас заново как ты писал про венв, если я файл висг оставляю пустым то всё работает, нахуй вообще эти висг нужен
The virtual environment was not created successfully because ensurepip is not
available. On Debian/Ubuntu systems, you need to install the python3-venv
package using the following command.
apt-get install python3-venv
You may need to use sudo with that command. After installing the python3-venv
package, recreate your virtual environment.
Это точка подключения твоей джанги к вебсерверу. Грубо говоря оно запускает питон и импортирует wsgi.py, затем импортированные объекты могут многократно срать ответами на запросы. Запускать на каждый запрос manage.py это пизда производительности и практика уровня начала 90х, когда сайты на башскриптах писали.
Твоя задача по сути сделать так, чтобы вебсервер запустил правильный питон, подключил правильный venv c библиотеками (если конечно ты используешь venv) и стартанул твою приложуху через wsgi.py.
Я не знаю блеать, я по гайду делаю, еще толком не вник во всё это
Тем что он вшит в сам питон. Но под двойкой только старый virtualenv.
Похоже деактивате это не та команда, активировал обратно на всякий
То куда насрал venv, вот этот твой каталог myvenv, ты его можешь взять и удалить как обычный каталог. В нём нет ничего особенного. Главное не пилить ветку на которой сидишь отключить его через deactivate если он у тебя сейчас подключен (source myvenv/bin/activate который).
http://puu.sh/nu05C/afd63608b7.png
Да, дебил.
Чтобы в текущей папке сделать венв что надо писать вместо venv_dir? Пишет что обязательно путь писать
>>675391
Я как понял на этом серве не получится установить венв как ты пишешь, требует рут права и утстановку пакета python3-venv, а этих прав у меня конечно нет
matplotlib стартует интерактивный просмотрщик, хуле ты хотел, там аки в гуглокартах приближать-отдалять можно. Запекай итоговую картинку сразу, будет быстро. По крайней мере я сомневаюсь что где-то будет быстрее. Тем более если ещё учесть время на написания кода.
Хз. Я тебе написал как оно делается стандартно. У тебя там какое-то чудо mkvirtualenv, которое уже установлено и настроено, юзай его, по аналогии, mkvirtualenv --help читни.
>что надо писать вместо venv_dir
Да любое название же. Суть в том что ты можешь хоть тыщу этих виртуаленвов завести. В одном двойка с джангой, в другом тройка и фласк версии точно 14.88, третьем ещё какой чёрт лысый. При этом у тебя всё есть и точно нужные версии пакетов без троганья рута. Если каждый полезет глобально ставить джангу рутом то весь хостинг далеко не уедет, для этого собственно и придумали венв, Virtual Environment. А весь этот замороч с activate/deactivate нужен только чтобы переключаться между ними.
>Пишет что обязательно путь писать
Ну наверное надо создать каталог сначала через mkdir.
aws.amazon.com на год бесплатно дает невероятные количества хуерги.
Можно в один клик накатить сервер с уставновленной джангой и всем что ей по вкусу.
Туториалов применительно к aws - мильярд. Да и почетно пиздеть что имеешь с авс опыт же, лол.
это я к тому что там можно не ебстись с венв, если что поломал - накатываешь свежий сервер ровно за минуту
с:499999
Ага, только нужно будет привязать к твоему амазон акку свою кредитку, и через год они могут начать ее юзать на каждый чих при нагрузке на сервак. спасибо, не надо
> error: Microsoft Visual C++ 10.0 is required (Unable to find vcvarsall.bat)
Вижуал студия 2015 стоит. Windows 7 64bit, готовые бинарники только на 32 есть, вроде.
Откуда этот файл взять и куда его пихать, честно говоря, искать лень, уж простите.
И чего делать, виндоёбы? Ставить всякие анаконды не хочу, ведь мне просто для проверки кроссплатформенности проги нужно, а не работы. Ну и виртуалки/линукс не предлагать, я макоёб и там всё прекрасно, цель сейчас именно на винде сделать.
купи себе календарь блять.
да там ты быстрее разберешься.
Или может не быстрее, но зато будет реально полезный опыт на который можно ссылаться.
>если есть лист А
А что? А4?
A[:] слайсит список и возвращает копию (просто слайсит от начала до конца, поэтому получается полная копия), поэтому ты можешь без проблем сделать так:
for e in A[:]: A.pop(0)
Попробуй и посмотри что будет, если убрать индексацию.
В математике всё быстро.
В octave всё быстро.
Вот только математика платная, а octave вылетает.
ну можешь поставить winpython, он портативный, но всё равно желательно в песочницу.
>И вообще, я нихуя не понимаю, хули требуется visual c++, если большинство пакетов используют поставляемый вместе с питоном gcc (а могли бы и clang)
Разрядность установленного питона тоже должна быть 32.
Я так постоянно подрывался, пока у меня стоял х64 и х32.
Если х32, то ты не такие же Microsoft Visual C++ 10.0 поставил.
у него 2015, а требует 2010
Лооол, естественно это игрища html+css.
>Разрядность установленного питона тоже должна быть 32.
В смысле тоже? Питон у меня 32, а винда 64. Винду переставить я, очевидно, не могу.
>ты не такие же Microsoft Visual C++ 10.0 поставил.
Как уже сказали, стоит у меня 2015-ая и не для питона, собственно, ставилась.
В общем, проблема решилась: шла б эта винда нахуй. Всем спасибо.
>Хочу на винду поставить numpy.
Троллейбус из буханки.жпг
Поставь уже себе какую-нибудь бубнту в виртуалку и кодь как человек.
Чому бы под мингв не поставить всё? Тот же посикс, но под виндой. Зачем советуют сразу виртуалки, они ж тормозят.
>\Даня
Вот это вот пиздец. Меняй имя учетки на латиницу, или готовься разрабатывать очко еблей с bytes/unicode, и прочими косяками из-за ебучей кириллицы.
Особенно понравится переименовывать, если учетка - встроенная admin'нская.
Кстати, это как раз тот самый случай, походу. Другие модули ставятся через pip? Вангую, что нет.
Отсутствия кириллицы в названии рабочих папок хватит.
Ну ты б хоть спойлер прочёл, что ли.
Не понимаю откуда у core пакаджей вообще проблемы с кодировками. Они же кроссплатформенные. Переименовывания это полумера, питон должен уметь работать под любым окружением.
Ну так он пытается декодировать Даню с использованием utf-8, а кодировка Дани - вин1251. Даня не попадает в диапазон ASCII, который общий у всего юникода.
pip вообще никак локаль не задействует, видимо. Жестко заданный utf-8. Но такое не только у него всплывает, и не только у core пакаджей. Так что никакой кириллицы - самая годная мера.
А проблема разве в консоли? Там именно внутри кода не может декодировать Даню нормально, а не при выводе в консоль.
А что у них с ценами? Во сколько примерно обходится месяц слабого сервера, который на DO дают за пять баксов?
винда хранит имена файлов в юникоде
Ну вот как бы я к тому же. Почему системные вызовы в кроссплатформенном Питоне падают?
>>675692
А собственно почему он пытается найти там утф8? Внутренне у питона юникод, значит он может прочесть строку из любой кодировки. По идее он должен сдетектировать вин1251 и системные вызовы выполнять в ней.
если не в консоли, тогда в конфиге. Может он в семибайтовой кодировке, тогда его надо сконвертить в utf8
Ну так ASCII (латиницу) он и прочтет из любой кодировки. Потому что 128 символов совпадают почти везде. В том числе в вин1251.
Юникод это не волшебная НЕХ, которая любые кодировки распознает.
UTF-8 - это и есть кодировки юникодная.
*семибитной
>Юникод это не волшебная НЕХ, которая любые кодировки распознает.
>UTF-8 - это и есть кодировки юникодная.
Ок, не распознаёт, но может хранить любой символ. Обычно другие кодировки это подмножество юникода. Внутри питона кстати не используется UTF-8, и даже не UCS, они там своё кастомное хранилище намутили, оно оче место экономит. Но это опять же не отменяет тот факт, что питон внутри себя может использовать любой символ юникода, а значит и прочитать практически любую кодировку используя codecs.
>>675773
>Юникод для чайников
Не тралируй, плис((
print var.lower()
Анон, я не могу понять, нахуй у этих методов разный синтаксис?
len([1,2,3])
len('lol')
len({'a', 8, None})
len({4: 'x', 5: 'b'})
'lol'.lower()
len это не метод, это встроенная функция питона. lower - это уже метод, но только у строк.
Ну да, могло бы хотя бы вывести кракозябры. Но там, может, после 0xc4 даже кракозябр не нашлось на последовательность.
Спасибо.
Так сложилось исторически.
http://effbot.org/pyfaq/why-does-python-use-methods-for-some-functionality-e-g-list-index-but-functions-for-other-e-g-len-list.htm
Если хочешь язык с нормальным ооп и последовательный юзай ruby.
Короче вот:
1. Ищи если есть инсталлятор питона посвежее, уже с обновлённым pip.
2. Если такого нет, то возьми и зарепорти баг в pip. Эта хрень должна работать нормально.
3. Если тебе это оче сложно, то забей и работай со старым pip.
>>675789
Да там не в кракозябрах даже дело, а в том что откуда-то в пип приходят байты в win1251, а он предполагает что отовсюду они придут в utf-8. Кракозябры, а точнее квадраты, получаются во время print из-за того что консолька не совладает с некоторыми символами. Тру кракозябры получаются когда закодировали одной кодировкой, а раскодировали другой.
>>675795
Это какое-то мнение недалёкого человека. В питоне с помощью магических методов ты можешь сделать len для чего угодно, в том числе и для сишных объектов. И оно будет везде len(..) и значить будет одно и то же. Так-то никто не мешает расширить класс str и добавить туда свойство length аки в жабаскрипте.
Я имею ввиду что в раби всё это метод всегда. В питоне же иногда метод, иногда встроенная функция потому что так сложилось ещё до того как туда ооп завезли)
Но ведь len можно передать не только строки.
А .lower() - метод типа str. Нельзя сделать ['a', 'B'].lower, но можно len(['a', 'B']).
Динамическая типизация, тип.
Что мешало сделать метод len() у строк и у списков и везде где он возможен?
> Нельзя сделать ['a', 'B'].lower
В нормальном языке можно было бы
array = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"]
array.map(&:upcase)
или array.map!(&:upcase) чтобы изменить их in-place
Я только что закодировал Даню с cp1251, и раскодировал в UTF-8 b'\xc4\xe0\xed\xff'. Тот же результат.
UnicodeDecodeError: 'utf8' codec can't decode byte 0xc4 in position 0: invalid continuation byte
Никаких кракозябр. В тч, в shell самого питона.
>array.map(&:upcase)
В чем разница? Ты ту же самую итерацию сделал. Тут тоже так можно кучей способов.
array = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"]
[a.upper() for a in array]
array[:] = [a.upper() for a in array]
Зато у нас map это ленивый генератор и мы можем выстраивать длинные цепи из filter/map не выделяя тонны памяти на каждый шаг.
Именно сам тип list не может быть .lower() же, должны быть предметы в нем. Что и делает map.
Считай, аналог всяких
for x in list:
....x.lower()
Ну дык это питон такой хитрый, всё в ascii перегоняет при repr(). Считается что ascii работает везде. Так-то если ты сохранишь эти байты в файл и откроешь блокнотом/браузером/cat, кракозябры таки будут.
Или у если у меня в списке вообще неведомая ебаная хуйня типа экземпляров классов?
Питон:
a = [1,2,3]
In [5]: a.
a.append a.clear a.copy a.count a.extend a.index a.insert a.pop a.remove a.reverse a.sort
Руби:
a = [1,2,3]
=> [1, 2, 3]
irb(main):002:0> a.public_methods
=> [:inspect, :to_s, :to_a, :to_ary, :frozen?, :==, :eql?, :hash, :[], :[]=, :at, :fetch, :first, :last, :concat, :<<, :push, :pop, :shift, :unshift, :insert, :each, :each_index, :reverse_each, :length, :size, :empty?, :find_index, :index, :rindex, :join, :reverse, :reverse!, :rotate, :rotate!, :sort, :sort!, :sort_by!, :collect, :collect!, :map, :map!, :select, :select!, :keep_if, :values_at, :delete, :delete_at, :delete_if, :reject, :reject!, :zip, :transpose, :replace, :clear, :fill, :include?, :<=>, :slice, :slice!, :assoc, :rassoc, :+, :*, :-, :&, :|, :uniq, :uniq!, :compact, :compact!, :flatten, :flatten!, :count, :shuffle!, :shuffle, :sample, :cycle, :permutation, :combination, :repeated_permutation, :repeated_combination, :product, :take, :take_while, :drop, :drop_while, :bsearch, :pack, :entries, :sort_by, :grep, :find, :detect, :find_all, :flat_map, :collect_concat, :inject, :reduce, :partition, :group_by, :all?, :any?, :one?, :none?, :min, :max, :minmax, :min_by, :max_by, :minmax_by, :member?, :each_with_index, :each_entry, :each_slice, :each_cons, :each_with_object, :chunk, :slice_before, :lazy, :nil?, :===, :=~, :!~, :class, :singleton_class, :clone, :dup, :taint, :tainted?, :untaint, :untrust, :untrusted?, :trust, :freeze, :methods, :singleton_methods, :protected_methods, :private_methods, :public_methods, :instance_variables, :instance_variable_get, :instance_variable_set, :instance_variable_defined?, :remove_instance_variable, :instance_of?, :kind_of?, :is_a?, :tap, :send, :public_send, :respond_to?, :extend, :display, :method, :public_method, :define_singleton_method, :object_id, :to_enum, :enum_for, :equal?, :!, :!=, :instance_eval, :instance_exec, :__send__, :__id__]
Ящетаю разница налицо. В питоне у нас необходимый минимум, в руби в обычный список вмешано половина стандартной библиотеки.
Питон:
a = [1,2,3]
In [5]: a.
a.append a.clear a.copy a.count a.extend a.index a.insert a.pop a.remove a.reverse a.sort
Руби:
a = [1,2,3]
=> [1, 2, 3]
irb(main):002:0> a.public_methods
=> [:inspect, :to_s, :to_a, :to_ary, :frozen?, :==, :eql?, :hash, :[], :[]=, :at, :fetch, :first, :last, :concat, :<<, :push, :pop, :shift, :unshift, :insert, :each, :each_index, :reverse_each, :length, :size, :empty?, :find_index, :index, :rindex, :join, :reverse, :reverse!, :rotate, :rotate!, :sort, :sort!, :sort_by!, :collect, :collect!, :map, :map!, :select, :select!, :keep_if, :values_at, :delete, :delete_at, :delete_if, :reject, :reject!, :zip, :transpose, :replace, :clear, :fill, :include?, :<=>, :slice, :slice!, :assoc, :rassoc, :+, :*, :-, :&, :|, :uniq, :uniq!, :compact, :compact!, :flatten, :flatten!, :count, :shuffle!, :shuffle, :sample, :cycle, :permutation, :combination, :repeated_permutation, :repeated_combination, :product, :take, :take_while, :drop, :drop_while, :bsearch, :pack, :entries, :sort_by, :grep, :find, :detect, :find_all, :flat_map, :collect_concat, :inject, :reduce, :partition, :group_by, :all?, :any?, :one?, :none?, :min, :max, :minmax, :min_by, :max_by, :minmax_by, :member?, :each_with_index, :each_entry, :each_slice, :each_cons, :each_with_object, :chunk, :slice_before, :lazy, :nil?, :===, :=~, :!~, :class, :singleton_class, :clone, :dup, :taint, :tainted?, :untaint, :untrust, :untrusted?, :trust, :freeze, :methods, :singleton_methods, :protected_methods, :private_methods, :public_methods, :instance_variables, :instance_variable_get, :instance_variable_set, :instance_variable_defined?, :remove_instance_variable, :instance_of?, :kind_of?, :is_a?, :tap, :send, :public_send, :respond_to?, :extend, :display, :method, :public_method, :define_singleton_method, :object_id, :to_enum, :enum_for, :equal?, :!, :!=, :instance_eval, :instance_exec, :__send__, :__id__]
Ящетаю разница налицо. В питоне у нас необходимый минимум, в руби в обычный список вмешано половина стандартной библиотеки.
Там замена фейлового декодирования спецсимволами, поди.
Это называется ООП. Эти методы получены путем наследования и миксинов.
Пользователь сам может переопределять или дополнять класс Array если хочет.
У питона столько же методов можно отрыть, они такого плана __x__.
In [2]: a.
a.append a.copy a.extend a.insert a.remove a.sort
a.clear a.count a.index a.pop a.reverse
In [2]: a._
a.__add__ a.__eq__ a.__iadd__ a.__mul__ a.__rmul__
a.__class__ a.__format__ a.__imul__ a.__ne__ a.__setattr__
a.__contains__ a.__ge__ a.__init__ a.__new__ a.__setitem__
a.__delattr__ a.__getattribute__ a.__iter__ a.__reduce__ a.__sizeof__
a.__delitem__ a.__getitem__ a.__le__ a.__reduce_ex__ a.__str__
a.__dir__ a.__gt__ a.__len__ a.__repr__ a.__subclasshook__
a.__doc__ a.__hash__ a.__lt__ a.__reversed__
Начинал читать Лутца когда-то, но терпения не хватило, какие-то дела появились и забил.
В питоне всё точно так же, но нельзя модифицировать встроенные классы. Зато можно расширить встроенный list и сделать его как в руби. Но использовать его придётся явно, сам литерал не станет сразу ExtList:
class ExtList(list):
...
a = ExtList([1,2,3])
Я считаю это преимуществом. Каждый себе строит свой list, никто никому не мешает. Тем более что в остальном этот ExtList ведёт себя как обычный:
len(a)
a.pop()
a.sort()
[a for x in a]
etc
>>675854
>a.public_methods
Твой аргумент инвалид.
cheatsheet какой-нибудь найди и тутор пройди, дальше по мере возникновения проблем. Считай что ты всё пишешь на stl (list, dict, set, str), а тип элемента для контейнеров variant.
Прохожу курсы на курсере и значит вот,
Нужно спарсить из файла эмайл адреса и посчитать самого активного.
Проблема у меня встала в следующем.
Разбиваю файл на слова ['From', 'stephen.marquard@uct.ac.za', 'Sat', 'Jan', '5', '09:14:16', '2008', 'Return-Path:', 'Received:', 'from', 'murder', '(mail.umich.edu', '[141.211.14.90])', 'by', 'frankenstein.mail.umich.edu', '(Cyrus', 'v2.3.8)', 'with', 'LMTPA;]
Такого вида список получается.
Далее прохожу по каждому слову и ищу From, мыло будет вторым словом после From. Как его получить? Всю голову сломал, я нубас, получается только вторую букву из From лол.
вот говно код, подскажи, бро
name = raw_input("Enter file:")
temp = open (name)
text = temp.read()
words = text.split()
print words
for word in words:
if word.startswith('From'):
print word[2]
for w1, w2 in zip(lst, lst[1:]): if w1 == 'From': print(w2)
Но вообще ты как-то через жопу это делаешь.
Имхо list(orig_list) как-то более очевидно чем orig_list[:]
Т.е. было бы логичнее разбивать файл на строки и искать строки, начинающиеся с From
Это антипаттерн.
for e in A.copy(): лучше делать.
Слайсинг имеет несколько иную природу и совсем не обязательно копирует объект.
a=typle(1,'xyu',[])
a[2]+=['pizda']
что произойдет если эту хуйню выполнить?
Да точно, я просто походу не так условие на англ понял, спасибо, бро.
Я наталкивался уже на эту фигню в каком-то quiz`е по питоне или какой-то статье типа python wat`с.
Вот здесь наверное https://github.com/cosmologicon/pywat
Вообще понятно почему так. Интерпретатор не знает mutable там объект или immutable и как у него iadd устроен.
По мне так не совсем логично, ведь чтобы быть имутабле туплу нужно в себе держать не ссылку на объект а его реальную копию.
Что он соственно и делет в случае
b=[2]
a=[1,b,3]
b=[100]
a=(1,b,3)
Я вижу что на деле им не запрещено быть мутабле, но тогда сам тупл нихуя не иммутабл(на деле опять же).
Как они собираются чтото там хешировать если тупл фактически изменяется со временем причем хуй это отконтролируешь?
Строить сложные запросы, конечно, лучше алхимией и она поддерживает особенности субд разных.
Odoo крутая штука, но мне не потребуется почти ничего оттуда. Надо решить более частную задачу, требующую кастомного программирования.
ок, не знал.
заливаю новый проет, вроде как прописываю к нему путь, но мне показывает 403.
смутно понимаю что нужно дать права доступа какомуто пользователю/группе пользователей кроме себя самого, но понятия не имею кому.
помоему это виндапроблемы.
На маке у меня все работает, а на винде никто за десять тредов(давно уже было) не заборол.
Ну кроме очевидных советов, которые нихуя не работают, декоде ютф и прочее.
Используй связку gunicorn и nginx.
Никто не использует апач в 2016 году. Разве что для php из-за поддержки .htaccess и т.п. но это оффтопик.
Используй wsgi и nginx.
> нужно дать права доступа какому-то пользователю/группе
Возможно ты имеешь в виду пользователя www-data.
https://docs.python.org/3/library/locale.html
В эту сторону копай, давно не ебался с питоном на винде, так что не скажу конкретнее. Ну и да, поставь хотя бы cygwin, побереги психику.
Твоя правда.
Интересно кто-нить юзает в продакшене?
Я когда-то лайти использовал и он мне даже больше nginx нравился но у него память текла и разработчики нифига не делали чтобы это исправить.
ой. обосрался. индекс 2 а не 1. Эм. Ну вроде бы списки должно сложить вместе. Но так как это сложение создаёт новый список, тупл не позволит поменять его. А вот append/extend изменяют inplace.
> так как это сложение создаёт новый список
Не создает.
+=(ака __iadd__) может вернуть новый объект, а может и старый. В случае списка оно делает extend.
nginx асинхронный и позволяет намного больше запросов в секунду обрабатывать пожирая меньше ресурсов. Для статики он намного лучше, а для питона в качестве прокси к wsgi(или там fastcgi) серверу.
Ngnix король статики. Для высоконагруженных проектов можно задрачивать комбинации ngnix + сервер динамики, тесты гуглить.
на кой пес начинающему нубу переходить на нгихн с апача?
мне бы оно хоть както заработало, а не чтобы козырять.
че там реально проще/логичней?
>>676511
только я сделал красивый скриншот, как ты меня опередил
По nginx больше всяких статей типа "как поднять проект на django". Легче нагуглить будет если какие-то вопросы.
апач с питоном никто давно не использует.
И да ничего сложного там нет.
2 часа в пейнте
ну, окай. Буду смотреть.
https://docs.python.org/3/faq/programming.html#why-does-a-tuple-i-item-raise-an-exception-when-the-addition-works
Frequently asked хех. Ну в любом случае не зная этот нюанс заранее предугадать нельзя. Вангую что этот вопрос любят задать на собеседовании.
> этот вопрос любят задать на собеседовании.
Хуевый вопрос и бессмысленный. Какой смысл это спрашивать на собеседовании?
Вряд ли в реальном коде такое попадается.
Вы написали в своём резюме что знаете питон. Выходит не знаете?
>>676570
Это из разряда ++i + ++i
еще пару тредов назад разбирали как себя ведет __del__ в некоторых случаях. Еще пару примеров и можно будет унижать интервьюэров в их собственном HR офисе
Мне кажется имеет смысл утверждать что знание недокументированных возможностей больше вредит чем помогает. Дзен питона процитировать и должны отъебаться.
>>676580
Попробуй с помощью setup.py для начала собрать дистр. Кажется sdist build. Оно тебе высрет зип файл или колесо, да, я в курсе про них. Если высрало и содержимое этого зипа тебя устраивает, выполняй через тот же setup заливку на pypi.
Покажи что выкладываешь.
Доброй ночи, мужики. Решил быстро скачать все картинки с одного блога. получил html с помощью urllib, но к несчастью осознал, что в блоге используется бесконечная прокрутка, а она не даёт мне спарсить весь бложик. Будь там старый добрый переход по страницам, вопросов бы не было, но тут эта модная жабаскрипт хуета. Можно ли как-то решить проблему?
Извините, поленился нормально погуглить. Уже нашёл решение. Всем споконой ночи, друзья.
Маловато, да и не оригинально.
Я подумывал итальянских каких-нибудь набрать вперемешку с английскими, но их искать и отбирать задолбаешься. Думал, может где базы есть.
Тогда получится просто рандом. Я хочу получить что-то типа старой гугловской капчи с инглипом.
Да, я знаю. Но за неимением таковых я хочу попробовать их имитировать каким-либо образом.
Ну и найди шрифт подходящий или прямо со сканов сдери весь алфавит. Потом рандом пару слов. Растяни и поверни их как-нибудь, добавь грязи и искажений.
Ну что например? Отвечай, быстро и решительно, плебей.
И бесполезный как крышка от этой бутылки. Юзай pyqt/pyside
Все пишут питоновский гуй на gtk через pygobject, а тот кто его не пишет почему-то советует pyqt/pyside
А именно нужен фокус на нем. Чтобы с помощью клавиатуры делать сортировку столбца, например.
Фокус через Tab сразу стартует со списка, никак не реагирует на заголовки. Переходит на кнопки, Аллаха и хз что еще, но не на заголовки.
Никакие setFocusPolicy им тоже не установить.
>>676750
Вот тут предлагают юзать селениум http://stackoverflow.com/questions/12519074/scrape-websites-with-infinite-scrolling
Хотя я решил проблему, просто подобрав значения в адресной сроке.
https://ideone.com/R4Oygz
Итерируйся по копии a.
Вообще итерироваться по списку и внутри что-то с ним делать плохая идея.
Я так понимаю, удаляя элемент 0, нулевым становится первый элемент, а цикл переходит к следующему и удаляет уже второй элемент, оставляя первый.
Я то думал, что раз я не на каких-нибудь крестах дрочёных пишу, а как белый человек на питоне, то я могу делать такие простые вещи без танцев с бубном.
Но оказывается, что если я хочу перебрать какой-нибудь список на предмет нежелательных элементов, то мне нельзя удалять их сразу после выявления. Нет, мне нужно сначала в одном цикле всех проверить и составить специальный расстрельный список. А потом уже только вторым перебором по расстрельному списку, очищать ряды партии. Всё через жопу.
Нет, тебе просто нужно написать
for i in a[:]: a.remove(i)
Или вообще использовать filter или что-то типа new_list = [i for i in a if i!=2]
Мутабельные структуры данных следует использовать только от безысходности. А это явно не твой случай. Тогда будет тебе все удобно.
Зачем проходиться в цикле по списку, чтобы проверить есть ли там элемент?
Можно сделать
try: lst.remove('el') except ValueError: blabla
Можно
if 'element' in lst: blabla
Можно проходиться с конца, если тебе уж так хочется и тогда этой проблемы не возникнет. (reversed возвращает итератор, а не копию списка)
>Зачем проходиться в цикле по списку, чтобы проверить есть ли там элемент?
Во-первых не чтобы провериль, а чтобы удалить его оттуда если нужно.
Во-вторых, например: по экрану летит нарисованный снаряд. Чтобы он мог лететь, нужно добавить его в определённый список, который будет каждый кадр перебираться, чтобы вызвать метод снаряда update. Этот метод рассчитывает текущее положение снаряда, чтобы знать где его рисовать, а в случае если снаряд сталкивается с препятствием этот метод должен обработать последствия: в том числе удалить снаряд из списка.
При том, что зачем рассчитывать положение снаряда, траекторию, ускорение и прочую фигню в цикле на питоне когда для этого есть готовая библиотека?
У сайта есть мобильная версия, но только в виде приложений на ios/android. Как можно залезть туда и начать скачивать оттуда?
Советуют указать мобильного клиента в хедере, но я не знаю что это такое и как это делать
Посоветуете что-то?
> удалять элемент перебираемого списка - вполне насущная задача
Тебе уже сказали, используй filter и tuple. А теперь уябывай.
>Охуительная идея создавать каждый раз список на тысячи элементов, только чтобы удалить 2 или 3 из них.
можно подумать твое удаление 2 или 3 не потребует 2 или 3 копии. список только называется списком, на самом деле это массив.
>>677089
>Чтобы он мог лететь, нужно добавить его в определённый список
да уж, гейдев за 300.
>Тебе уже сказали, используй filter и tuple.
Тоесть феирически говнокодить для решения элементарной задачи.
Иммутабельный контейнеры и фильтрация - это шаг вперёд по сравнению с "удалением элемента из списка". Возвращайся в кресты лучше.
Проходись по списку с конца используя reversed. В любом другом языке была бы такая же проблема и поэтому перебирают массивы с конца.
>можно подумать твое удаление 2 или 3 не потребует 2 или 3 копии. список только называется списком, на самом деле это массив.
Хочешь сказать, что копирование списка сопоставимо по скорости с удалением или добавлением элемента в него?
>Иммутабельный контейнеры и фильтрация - это шаг вперёд по сравнению с "удалением элемента из списка".
Только в твоих влажных фантазиях.
Если тебе нужно получить список? Надо.
Вот этот вариант внезапно работает быстрее всего. Спасибо.
На какой-нибудь сишечке так и пришлось бы сделать.
И если у тебя там много элементов, это должно быть быстрее.
А это трудно? Можно японскими свечами нарисовать? И прокрутку сделать?
По моему, это указание то, что твоё:
>Иммутабельный контейнеры и фильтрация - это шаг вперёд по сравнению с "удалением элемента из списка".
Ни на чём не основано, кроме личных предпочтений.
>шрифт подходящий
>Растяни и поверни их как-нибудь, добавь грязи и искажений
Так и сделал. Просто не хочу полный рандом - будет неинтересно. вообще для "напиши сценарий по капче" пилил
Не мог бы ты пояснить "копируешь каждый раз". Что за каждый раз и почему копируешь?
Во-первых, иммутабельные контейнеры удобнее и проще в использовании, ибо не надо думать о сайд эффектах. Во-вторых, пифон не тот язык, где нужно всерьёз думать о производительности этих самых контейнеров. Если тебе не хватает производительности, то скорее всего надо использовать не пифон в этой ситуации.
Выше написали уже что list в питоне это не список, а массив указателей.
Поиск и удаление элементы из середины - дорогая операция, такая же дорогая как копирование всего списка.
Если элементов много и надо удалить много элементов, то выгоднее завести новый список, куда помещать элементы для удаления и после прохода пересоздать список, исключив эти элементы.
Или даже делать это не после каждого прохода, а реже.
>>677284
Ему не надо удалять именно последний элемент с конца. Ему надо удалять элементы посередине, которые соответствуют определенным критериям.
А понял, из-за сдвига индекса. Спасибо.
Причем тут это. Речь о том, что удаление элемента из середины дорогая операция.
Мне там сказали, что я список каждый раз копирую.
Почему она должна быть дорогой то? Два указателя всего поправить нужно.
> Два указателя всего поправить нужно.
Список в питоне не двусвязный список, а массив.
See >>677295
>а массив
Чистым массивом он точно быть не может, потому что умеет растягиваться и хранить элементы разных типов. Может какое-нибудь сищное подобие вектора указателей, но тогда встаёт вопрос, как он в сях реализован.
> хранить элементы разных типов.
Он не хранит элементы разных типов. Он хранит указатели на объекты, они все одного типа.
1) Забивать на производительность, когда можешь сделать хорошо - это признак говнокода.
2) Мутабельные контейнеры бывают удобнее с точки зрения читаемости и поддерживаемости кода. А читаемость и поддерживаемость признак хорошего кода.
А как сайт этот устроен? Оно точно не генерит html на клиенте получая данные через ajax и api какой-нить?
Но в любом случае, тебе же надо на выходе получить html.
Мобильная версия в виде приложения получает данные не в виде html.
Значит стоит делать просто как обычно?
Какими способами можно тогда ускорить общение с сервером?
1. Удаление первого элемента списка по скорости на том же уровне, что и создание нового тупла из всех элементов без первого. Единственное для чего стоит использовать мутабельные объекты — экономия памяти.
2. В малой части типа сортировок да. В остальном — нет.
Вообще туплы в питоне не задуманы для такого использование. Они скорее как структуры в си или чтобы передать несколько элементов.
И вообще с такими идеями тебе в какой-нить фукнциональный язык.
Попробуй вот так. Посмотри что он тебе отдаст.
import requests
url = 'http://your-site'
headers = {'user-agent': 'Mozilla/5.0 (Linux; U; Android 4.0.3; ko-kr; LG-L160L Build/IML74K) AppleWebkit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30'}
r = requests.get(url, headers=headers)
Для keep-alive использовать urlgrabber?
Я правильно понимаю, что достаточно объявить keep-alive в начале и каждый urlopen будет проходить с его участием?
Да
С чего это не задуманы? Можешь использовать список, но не изменять его, если религия не позволяет.
Используй requests и Session отткуда
http://docs.python-requests.org/en/master/user/advanced/#keep-alive
Ну же, отвечай!
Он же сказал что мобильная версия сделана не в виде сайта, а в виде приложений.
поп(0) О(n) уже картинку скинули. аппенд амортизирован О(1), но если нужно изменить внутренний размер листа, но это долшьше. Для тру О(1) добавления/удаления в начало/конец используются deque, queue
Нет, r.text намного меньше чем в браузере
https://www.diffchecker.com/ghcqvped
Вот здесь разница если важно
Возможно, увидев андройдовский user agent, сервер отдаст ему данные для приложения. В любом случае он должен что-то отдать.
> увидев андройдовский user agent, сервер отдаст ему данные для приложения
Обычно смотрят не на user-agent а на другие заголовки. Типа content-type, Accept. Да и url другой.
Рад за тебя. Если тебе нужны какие-то конкретные данные, то у них вроде API есть.
Я лишь знаю, что увидев user-agent обычно редиректят на url мобильной версии. Я в этом не силен.
search.books - Find books by title, author, or ISBN.
Думаю, тут есть варианты как извратиться.
Да мне кажется, что простой crawler тоже сможет это сделать. Да и опыт написание crawler'a лишним не будет
Роллить во славу Инглипа конечно же! для "напиши сценарий для фильма по капче", я там выше писал Только рандом в словах ещё не завёз, но сервис уже работает.
Прости, уходил
Это проект на полгода на первом курсе, рекомендательную систему нужно построить
10% used (10.39s of your 100 second CPU allowance)
Allowance resets in 6 hours, 53 minutes
?
Что после того, как я попользуюсь процом 100 секунд, то после этого не смогу, пока таймер не сбросится?
>Тебе уже сказали, используй filter и tuple.
Я тут почитал ваш спор и у меня к тебе вопрос: а можешь показать пример, как исползовать тупл в ситуациях, когда нужно удалять/добавлять элементы в список?
Предположим, у меня есть список студентов Гарварда (20к+), нужно убрать оттуда тех, кто уже дал взятку. Однако, если деньги во взятке оказались фальшивыми, студента нужно будет туда вернуть.
Со списками всё элементарно:
#получаем эвент "дал взятку" с аргументом штудента
not_bribed.remove(student)
bribed.append(student)
#получаем эвент, что взятка оказалась фальшивой
bribed.remove(student)
not_bribed.append(student)
student.bribe /= 0.5 # в качестве штрафа удваиваем необходимую взятку*
А как быть с туплами? Программа у нас однотрендовая с эвентлупом, никаких одновременных обращений к списками не будет.
Разумеется, информация должна быть постоянно самая свежая, поэтому держать какой-то дополнительный список "на удаление" глупо, ведь ректор может попросить список имён для "домашнего визита" в любое время.
Всё просто
bribed = bribed + (student,)
i = not_bribed.index(student)
not_bribed = not_bribed[:i] + not_bribed[i + 1:]
Ты придумал данную задачу так, что здесь изначально два мутабельных контейнера и предлагаешь их заменить иммутабельными. Гораздо лучше в класс студент добавить свойство "давал взятку". Тогда нужен один тупл и всё.
>Ты придумал данную задачу так
Я просто придумал первую пришедшую в голову задачу со списками. Второй список, если честно, появился случайно при развитии сюжета. Делать шаг назад, естественно, было нельзя - первое правильно импровизации.
А в чём в итоге плюс-то этого постоянного пересоздания тупла вместо изменения списка? По скорости, как ты и говорил, разницы нет ( http://ideone.com/qXxwWC ), даже если remove заменить на поиск индекса и последующий pop. От случайных изменений можно защититься тем, чтобы не писать код, который изменяет.
То есть, в относительно небольшом приложении, какая может быть объективная причина использовать иммутабл и эти плюсы и слайсы, вместо очевидных и красивых append/remove?
Появится многопоточность, а она скорее всего появится. И мутабельность сыграет злую шутку.
В остальном, да, либо использовать эти списки, либо, как я уже выше написал, иметь один тупл со студентами и поле "взяточничества" студента.
Это копия, сохраненная 28 марта 2016 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.