Ычан: [d | b / bro / hr / l / m / mi / mu / o / ph / r / s / sci / tran / tu / tv / x | es / vg | au / tr | a / aa / c / fi / jp / rm / tan / to / vn / vo]
[Назад] [Вся нить] [Первые 100 сообщений] [Последние 50 сообщений]
Ответ в нить [Последние 50 сообщений]
Имя
Animapcha image [@] [?]
Тема   ( ответ в 23830)
Сообщение flower
Файл 
Пароль  (для удаления файлов и сообщений)
Параметры   
  • Прежде чем постить, ознакомьтесь с правилами.
  • Поддерживаются файлы типов 7Z, BZ, BZ2, GIF, GZ, JPG, MO, MP3, MP4, OGG, OGV, PDF, PNG, PSD, RAR, SVG, SWF, TXT, WEBM, WEBP, XCF, ZIP размером до 5000 кБ.
  • Ныне 3535 unique user posts. Посмотреть каталог
  • Максимальное количество бампов нити: 500
junior_developer_aoba.png - (578.70KB, 720×720)
23830
No. 23830    
Здесь можно получить помощь и консультацию по любому языку программирования, в любой сфере разработки. Не важно, программируете ли вы собственного робота, пишете серверную приблуду, интегрируете чужие API, ковыряете игру, или пытаетесь сделать сайт на Wordpress - если аноним что-то об этом знает, он обязательно поможет.

Пополняемая база знаний: http://pastebin.com/AGhLZppH

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

Другие тематические нити (периодически обновляется): https://pastebin.com/psy43ibG

Примеры кода лучше выкладывать в виде ссылок на http://pastebin.com или http://ideone.com
Фронтендные вещи лучше выкладывать на http://jsfiddle.net

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

Чтобы не сбивать новичков с толку, а также не разбавлять полезную информацию мусором, беспредметные споры типа "какой язык / парадигма / библиотека / етц лучше" здесь запрещены. Для подобных вещей теперь есть отдельная диспутов нить >>/dev/21353

Если здесь поселится достаточное количество программистов на одном языке / одной сферы, можно будет их выделить в отдельную нить, а в этой оставить на неё ссылку.
По мере поступления вопросов можно составлять FAQ и базу знаний.

Архив нитей:
http://410chan.org/dev/arch/res/14160.html
http://410chan.org/dev/arch/res/15681.html
http://410chan.org/dev/arch/res/17424.html
http://410chan.org/dev/arch/res/19666.html
http://410chan.org/dev/arch/res/21641.html

Прошлая нить пока тонет тут: >>/dev/21641
278 сообщений пропущено. Показаны 50 последних сообщений Развернуть все изображения
No. 24975    
>>24974
Извини что не в тему. Вроде бы существуют какие то конверторы, но я краем уха слышал только о конвертации на более новую спецификацию. Тем не менее, сказать хотел совсем другое. А именно, что нужно не как проще, а как правильнее. Иначе будет всё плохо. А для этого ты должен сам знать и понимать различия спецификаций. В общем то, по этой причине никто с даунгрейдом и не парится, а просто заставляют всех использовать последний хром. Браузеров старых-хороших несовместимых с твоей рисовалкой много, к слову. Я уже давно смирился. Лучше наверное тебе и не заморачиваться, делай на всём самом свежем, как все.
No. 24976    
>>24975
На всякий случай поясню, что и сам планировал дальше писать относительно современный код, используя ту часть стандартов, которая его упрощает, насколько возможно.

На данный вопрос меня натолкнул тот факт, что некоторые используемые в том же самом проекте библиотеки (pako), а так же, к примеру, куклоскрипт, имеют в сборках версию под старые стандарты.

Я уже написал для страницы простенький скрипт-загрузчик, который перебирает список js-файлов (моей основной писаниной в первую очередь и сконвертированной версией во вторую) и останавливается на первом, который будет успешно переварен браузером. Затык остаётся в том, чтобы получить (и продолжать получать в будущем) некую рабочую версию-конверсию. Я не сомневаюсь, что она будет менее быстрой.

В качестве отдельного анекдота, 11-я Опера не справилась даже с этим перебором, не вызывая от неудобоваримой версии ни
onload
, ни
onerror
. Но там я ни на что и не надеялся.
No. 24977    
>>24974
>https://babeljs.io/en/repl
На вид, их онлайн REPL просто работает неочевидно, ну или полусмломан.

Насколько вижу по спекам, async function definitions появились в ECMAScript 2017:
https://ecma-international.org/ecma-262/8.0/#sec-async-function-definitions

Вот в ECMAScript 2016 их еще нет:
https://ecma-international.org/ecma-262/7.0/

Соответственно, если поставить в Babel REPL пресет es-2017, то простую функцию типа
async function foo() {

  await 1 
}

оно, согласно этой вот доке
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function
должно переделать в подобие

function foo() {
   return Promise.resolve(1).then(() => undefined)
}

И оно действительно переделает, именно что в хтоническое подобие, с использованием своего промис-генератора:

function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {  ... }
function _asyncToGenerator(fn) { return function () { ... } }
function foo() {
  return _foo.apply(this, arguments);
}
function _foo() { ... }

Того же самого эффекта можно добиться, если в REPL включить Env presets и в поле Browsers вписать, к примеру, chrome 54 - это последняя версия Хрома, которая не поддерживала async function, согласно той же доке.

Возможно, будет проще переписать это аккуратно самому, используя документацию, а не надеяться на генератор, как предлагает >>24975 если не придется переписывать ничего вдогонку, конечно
Вот только странно, что это вообще приходится делать.

Если верить автору, твой Otter Browser использует Qt WebEngine из Qt5:
https://doc.qt.io/qt-5/qtwebengine-overview.html
А он внутри использует Chromium
>This version of Qt WebEngine is based on Chromium version 80.0.3987, with additional security fixes from newer versions.
Такой версии, которая уже всё это должна сама поддерживать.
Получается, или автор использует древнюю версию Qt WebEngine, или ты используешь древнюю версию браузера.

Я бы рекомендовал зайти в этом Otter Browser на какой-нибудь ресурс, который проверяет доступность разных фишек, типа:
https://html5test.com/
И посмотреть, насколько плохи дела.

Сообщай, помог ли тот ужас, который выдаёт Babel завестись хоть чему-то в твоём браузере.
No. 24978    
Всегда было интересно, на чём конкретно из свежей спецификации js вылетает опера 12.18
И не могу придумать ни одного адекватного способа узнать.
No. 24979    
>>24977
> если в REPL включить Env presets и в поле Browsers вписать, к примеру, chrome 54
Результат тот же, что я сам получал, перебирая галочки "es-такой-то" наверху или конкретные плагины-преобразователи внизу, а именно — такая ошибка:
ReferenceError: Can't find variable: regeneratorRuntime


> This version of Qt WebEngine is based on Chromium
Тогда можно предположить, что рано или поздно всё там будет и успокоиться.
Версию браузера я взял позавчера прямо из последней папки еженедельных сборок на sourceforge.

> https://html5test.com/
> насколько плохи дела.
На 361 из 555. Из всего списка, что выдаёт тест, не хватает только async/await. И наверно rest/spread arguments, которых в списке нет.

>>24978
11-я на многих современных сайтах вылетает уже на этапе установки HTTPS-соединения. А где проходит, валится на каком-нибудь jQuery.
No. 24980    
Привет, аноним. Есть сайт на битриксе с авторизацией. После авторизации требуется нажать на кнопку. На практике же при авторизации в браузер поступает тонна непонятных кук, я сохраняю их всех и передаю вместе с запросом отправки формы (кнопкожмаканья) через питоний requests. Ниработаит. В чем может быть затыка и как найти корень проблемы?

Вообще, как парсить сайты с JS и динамическим контентом?
No. 24981    
>>24979
>ReferenceError: Can't find variable: regeneratorRuntime
Для трансляции кода Babel использует Regenerator:
https://github.com/facebook/regenerator
Которому для работы сгенерированного кода нужна своя рантайм библиотека, без которой ничего не будет работать.
Если пользоваться плагином отдельно, то можно прямо указать ему включить рантайм в итоговый скрипт:

regenerator es6.js > es5.js # Just the transform.
regenerator --include-runtime es6.js > es5.js # Add the runtime too.

Babel REPL этого не включает, и тебе надо будет подключить его самому, взяв с гитхаба или с npm: https://www.npmjs.com/package/regenerator-runtime

>361 из 555
Не очень дела, современный браузер дает 500+
No. 24982    
>>24980
>Вообще, как парсить сайты с JS и динамическим контентом?
Лучше всего парсить headless-браузером с поддержкой яваскрипта и всех тех же динамических событий, что поддерживает браузер. Обычно это делается с помощью тест-фреймворков, типа
Puppeteer: https://pptr.dev/
CasperJS: http://casperjs.org/ (поддержка приостановлена)
SlimerJS: https://slimerjs.org/ (поддержка приостановлена)
Работающих на базе node.js

Соответственно и парсить потом всё тоже яваскриптом.
No. 24984    
>>24981
После подключения регенератор-рантайма перед ней, в Otter Browser es5-версия запускает сборку UI, завершает содержимое первого пункта меню и останавливается где-то на втором без каких-либо видимых ошибок в консоли.

12-я Опера жалуется на const в актуальной версии и на промисы в es5-конверсии.

Ещё вчера я натыкался на браузер Falkon, который тоже использует Qt5WebEngine. Несмотря на некоторые баги установщика (предложение убить несуществующий процесс и отсутствие msvcr120.dll в сборке, без которой браузер не запустится), в нём моя страничка работает прямо как есть, в актуальном виде.

В общем, спасибо и на этом, смысла дебажить глубже лично у меня нет.
No. 24985    
>>24984
Ок, заходи если что.
No. 24986    
>>24982
Большое спасибо.
No. 24987    
>>24986
Важно помнить, что многие сайты противятся всяким внешним парсерам, и всячески стараются их блокировать. Самый простой вариант, который проверяется - специфический User-Agent или его отсутствие. На всякий случай проверь, что будет отправлять твоя штука и если надо выставь на соответствующий браузер.
No. 24988    
>>24982
Забыл очевидный Selenium.

Ну и в приинципе, можно пытаться в spidermonkey.
No. 24989    
>>24988
На селениуме уже делал, думал, есть какие-то варианты пошустрее и не такие прожорливые.
No. 25019    
435681.jpg - (205.11KB, 1127×1600)
25019
А есть тут кто с тревожностью или вовсе социальной фобией? У вас вышло во фриланс?

Чуть больше чем за два месяца научился основам C, попробовал Пайтон, написал маленький сайт на HTML + CSS + JS, заодно послушал лекции немного про машинную архитектуру: в общих чертах про регистры, память, указатели, дескрипторы.
Когда освоил основы и понял, что теперь могу в принципе изучить любой язык, то из всего решил остановить свой выбор и сконцентрировать внимание на Пайтон. Теперь буду изучать его синтаксис и набивать навык письма.

Дайте советов, что делать потом, что ещё подучить, и как конвертировать это в деньги, при этом не сойдя с ума от страха.
No. 25024    
>>25019
> А есть тут кто с тревожностью или вовсе социальной фобией? У вас вышло во фриланс?
Ну, у меня много проблем в голове. Но я пью таблеточки и начал заниматься с психологом раз в неделю.
Не на фрилансе, но, скажем, работаю из дому, редкие рабочие звонки, и вот это все.
Все возможно конечно же.
В первую очередь рекомендую (если еще нет, конечно же) заняться здоровьем. Тогда все остальное просто у тебя легче пойдет.
Во-вторых, на счет «что подучить» очень зависит от того, что ты хочешь. Если возможно, расскажи подробнее, пожалуйста.
No. 25025    
89653232.jpg - (141.87KB, 800×1041)
25025
>>25024
Ты молодец! И я занимался здоровьем и результаты хорошие. Но чтобы они были ещё лучше нужно заниматься на более высоком уровне, а для этого нужно заработать.
Ну и труд сам по себе терапия, в каком-то смысле.
Всёж остаются, так сказать, ограничения по здоровью на виды деятельности. И именно из этого, мне кажется, нужно исходить в выборе направления. А то я изучить то, наверное, могу что угодно, хоть веб, ход SQL, хоть язык ассемблера. Решил вот выбрать в качестве языка Пайтон как нечто такое общее и востребованное, но теперь хотелось бы это как-то ещё сузить и за месяца полтора определиться с направлением. Чтобы как можно меньше приходилось говорить с заказчиками, выяснять и обсуждать, а оказывать как можно более простую помощь.
Вот здесь бы хотелось найти советов, на какие направления во фрилансе можно обратить внимание, где нет какой-то большой ответственности и не нужны софт скиллы. Потому что идти прямо в бой и учиться на ходу с расчётом на скорые хорошие доходы, это вообще физически невозможно.
Надеюсь в общих чертах обрисовал.
No. 25031    
79660654_p0.jpg - (1.27MB, 1200×1761)
25031
>>25019
>>25025
Кстати. Может быть у кого тут есть желание поиграть роль ментора по Пайтон?
А ещё я слышал, что некоторые крупные фрилансеры нанимают себе неопытных товарищей, которые пишут для них части кода. Наверное для меня это был бы прекрасный вариант для "мягкого" старта.
Позволю себе оставить тут ссылку на крипточатик element.io Найти меня там можно по @habasi:matrix.org Надеюсь меня за это не забанят.
No. 25038    
#!/usr/bin/env python3

a = "WTF"
b = "WTF"
print(a is b) # False
print(a == b) # True

Ожидаю разный объект, но по факту a is b является истиной.

a = 9
b = 9
print(a is b)
Тоже истина.

My god, why?!
No. 25039    
H0kqlA7.png - (19.68KB, 484×374)
25039
>>25038
Шо?
No. 25040    
>>25039
is сравнивает объекты, на которые ссылаются имена? Почему a и b получили один объект? Я ожидал разные.
No. 25042    
>>25040
is сравнивает ссылки.
В 3.7
In [1]: a = 1

In [2]: b = 2

In [3]: id(a)
Out[3]: 4529736784

In [4]: id(b)
Out[4]: 4529736816

In [5]: a is b
Out[5]: False

В 3.9

In [1]: a = 1

In [2]: b = 2

In [3]: id(a)
Out[3]: 4543162672

In [4]: id(b)
Out[4]: 4543162672

In [5]: a is b
Out[5]: True

In [6]:
No. 25043    
>>25042
Ой, у меня руки кудрявые. В 3.7 простые типы тоже не берут новый участок памяти, а ссылаются на существующий.
No. 25045    
Реквистирую ооп экспертов, мобильных экспертов и мобильнооопшных няш

В общем-то хочу:
1. Запилить очередной чаноклиент или крайне схожую по функционалу штуку. Кроссплатформ или андроид-онли
2. Написать в труЪ ооп стиле, в полноценной реализации которого я никогда не писал, но вроде-как знаю основные концепции (ооп иерархию там, суперкласс, абстрактный класс...)
3. Не трахаться с какими-то плагинами и сдк, желательно не иметь в маст-хевах андроид-студию (До этого пытался попинывать RN и Flutter, бошка начинала болеть ещё на стадии открытия на виртуальном девайсе (ну и хеллоу ворлды показались какими-то не теми, чего хотел бы))

Насколько я понял, выбор стоит между Kotlin и Java
Буду признателен получить если не советы, то хотя бы %языкнейм% и %фреймворкнейм%, куда копать чайнику
No. 25049    
>>25045
Я не знаю, что тут консультировать касательно клиента для борд: выглядит как влажные мечты, извини за прямоту. Хочу строить космические ракеты, есть опыт запуск фейерверков.
Если твои цели освоить тру-ООП, то учи Java, для начала в отрыве от мобильной разработки, хорошего обучающего материала по ней выше крыши. Затем уже начинай изучать нативную разработку под Андроид.
Флаттер - не золотая пуля. У соседнего отдела на нем мобильное приложение, и я порой вижу таски в трекере уровня "Нельзя нажать кнопку на iOS, потому что ее перекрывает несворачиваемая клавиатура". Кросс-платформ все равно требует костылей.
No. 25050    
>>25049
> освоить тру-ООП, то учи Java, для начала в отрыве от мобильной разработки
Или с# aka Java от Mircosoft.
Тоже полностью объектно-ориентированный язык.
мимошарпоёб
No. 25051    
>>25045
Постараюсь дать совет в контексте конкретно того что ты хочешь сделать.
Ты хочешь мобильное приложение сделанное по канонам ООП. Давай для начала в контексте андройда.

Выбор между Котлином или Джавой здесь не так важен, т.к. оба языка имеют хорошую поддержку ООП. Попробуй оба, и реши какой язык тебе лично удобнее, можешь начать с того, что поновее и посвежее

Гораздо важнее тут выбрать правильную ООП-схему для твоего приложения.
Ты хочешь чан-клиент, т.е. единый "интерфейс" для нескольких чанов.
Значит тебя интересуют ООП-схемы для интерфейсов.

Самые популярные схемы тут такие:
Я бы сказал, что для чан-клиента, которому придётся в качестве "бэкендов" иметь кучу чанов на разных движках подойдет как раз MVVM, который для схожих целей и придумывали.

Вот, держи пример, как собирать приложение по MVVM-схеме под андройд (Котлин):
https://medium.com/hongbeomi-dev/create-android-app-with-mvvm-pattern-simply-using-android-architecture-component-529d983eaabe
Вроде реализация не выглядит как "я только создал пустой проект, а уже устал"

И готовое приложение, сделанное по этому гайду "на посмотреть":
https://github.com/hongbeomi/HarryPotter

Дополнительно, держи неплохую шпаргалку по всему ООП в принципе:
https://www.oodesign.com/

Надеюсь, что я правильно понял что ты хочешь, если что - уточняй.
No. 25066    
Всех с наступающим Новым Годом!

Спасибо всем, кто помогал, советовал, и подсказывал начинающим программистам в этом году.
Успехов всем начинающим программистам в их проектах и экспериментах.

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

Всем хорошего кода в Новом Году.
No. 25069    
Имеется lua 5.1.
Хотим получить список из трех списков, делаем:
return foo(), bar(), baz()
Обламываемся, потому что у первых двух списков обрезаются все значения, кроме первого. Извращения вроде этого работают (table_merge тупо вызывает table.insert в цикле):
return unpack(table_merge({foo()}, table_merge({bar()}, {baz()})))

Однако восторга у меня такое решение, сами понимаете, не вызывает. Есть более вменяемый способ?
No. 25070    
>>25069
Как минимум твоё извращение можно завернуть в мета-поведение, перегрузив оператор +.

function table_merge (mytable, newtable)
      for i = 1, table.maxn(newtable) do
         table.insert(mytable, table.maxn(mytable)+1,newtable[i])
      end
      return mytable  
end

acc_table = setmetatable({ }, { __add = table_merge })
merged_table = acc_table + foo() + bar() + baz()

print("Merged tables:")
print(unpack(merged_table))

Таким образом не придется писать страшных крокодилов, хотя суть операции и не поменяется. У меня оно выводит:

Merged tables:
1    2    3    4    5    6    7    8    9

Где:

function foo ()
    return { 1, 2, 3 }
end

function bar ()
    return { 4, 5 }
end

function baz ()
    return { 6, 7, 8, 9 }
end

Если интересно, немного инфы по мета-таблицам здесь:
https://www.tutorialspoint.com/lua/lua_metatables.htm
No. 25072    
>>25070
>можно завернуть в мета-поведение, перегрузив оператор +.
Иными словами, кроме синтаксического сахара, который позволяет немного замаскировать это безобразие, язык, похоже, предложить ничего не может.
Ясно. Что же, спасибо и на том.

Склоняюсь к мысли написать скрипт на каком-нибудь нормальном языке, который тупо сгенерирует код на lua, уже содержащий все нужные мне списки в готовом виде.

>немного инфы здесь
За ссылку благодарю. Там, гляжу, не только эта инфа, но и вообще много полезного.
No. 25075    
>>25072
>Иными словами, кроме синтаксического сахара, который позволяет немного замаскировать это безобразие, язык, похоже, предложить ничего не может.
Не совсем так. Перейдя на версию Lua 5.3 ты бы мог воспользоваться table.move():
https://www.lua.org/manual/5.3/manual.html#pdf-table.move

function table_merge(a, b)
  local result = {table.unpack(a)}
  table.move(b, 1, #b, #result + 1, result)
  return result
end

merged_table = table_merge(table_merge(foo(), bar()), baz())

print("Merged tables:")
print(unpack(merged_table ))

Что чуть-чуть, но лучше. И тоже можно завернуть в сахар.
Вывод будет идентичный:

Merged tables:
1    2    3    4    5    6    7    8    9

No. 25080    
>>25075
>Перейдя на версию Lua 5.3
Угу, а был бы там нормальный перл, а не его кастрированное подобие, каковым по существу луа и является, так всё бы вообще работало из коробки.

Учитывая, какую нишу занимает луа: аддоны, моды к играм и пр. вспомогательные скрипты — не думаю, что у большей части тех, кто имеет с ним дело, есть возможность выбирать версию. Если конечно, они сами не являются авторами того приложения, для которого эти аддоны и пишутся.
No. 25081    
Помогите осмыслить копирование пайтона.
Вроде бы понимаю разницу меж shallow и deep копиями. Когда неизменяемый тип, то поверхностная копия прекрасно подойдёт; операция с копией просто создаст новый объект на её основе. Когда список в списке в списке... то .deepcopy() всё-всё скопирует.
Но почему .deepcopy() не нужен для самого списка? Например
a = [6, 6, 6]
b = copy.copy(a)
for num in range(len(b)):
b[num] += 3
print(a, b)

У меня сложилось ожидание, что b просто получит копию ссылки на объект [6, 6, 6]. То есть, это всё равно что b = a, потому что список это изменяемый объект. Так почему же b получил новый независимый список?
Не первый раз уже. Вроде кажется что понимаю систему имён, ссылок и объектов. Но на самом деле нет, какие-то у меня сложились неправильные представления.
No. 25082    
>>25081
>Так почему же b получил новый независимый список?

Смотри, на поверхности о том что так будет заявлено прямо в документации к copy.
>The difference between shallow and deep copying is only relevant for compound objects (objects that contain other objects, like lists or class instances.

Разберемся, почему.
>A shallow copy constructs a new compound object and then (to the extent possible) inserts references into it to the objects found in the original.

Да, новый список ты получаешь в любом случае, иначе зачем вообще делать копию?
А вот ссылки туда должно скопировать старые. Почему же когда мы меняем элемент в списке, он меняется независимо?
Потому что он immutable типа. Каждое изменение элемента такого типа сопровождается созданием копии, с новой ссылкой:

>If we have an immutable object (str, int, tuple, etc.), all the variables that refer to it will always see the same value, but operations that transform that value into a new value always return a new object.
>operations that transform that value into a new value always return a new object.

Поэтому, как только ты меняешь immutable элемент в списке b, ты на самом деле убираешь старый элемент и ставишь на его место новый. А в списке a он себе остается жить как жил.

Подробнее тут:
https://towardsdatascience.com/https-towardsdatascience-com-python-basics-mutable-vs-immutable-objects-829a0cb1530a

Ну и про copy и всё остальное:
https://docs.python.org/3/library/copy.html
https://docs.python.org/3/faq/programming.html?highlight=immutable#why-did-changing-list-y-also-change-list-x
No. 25083    
>>25082
О, наконец понял логику. Спасибо! Люблю вникать в такие нюансы.
No. 25084    
>>25083
Не за что, заходи.
No. 25085    
>>25083
Стало понятно что это за баковня:
a = 9

b = 9

a is b

True

print(f"{id(a)}\n{id(b)}")

9785120

9785120

Это на самом деле один и тот же объект! Это не важно для кода, поскольку a и b имеют разные ссылки = любая операция с ними присвоит им новый объект. Но это может иметь смысл для оптимизации памяти.
Более того:
a = "immutable"

# ...некоторое количество кода и операций...

c = "immutable"

a is c

True

print(f"{id(a)}\n{id(c)}")

139856783445104

139856783445104

Совсем не очевидная механика.
No. 25086    
>>25085
>a = "immutable"
># ...некоторое количество кода и операций...
>c = "immutable"
>a is c
>True

Похоже на вот эту оптимизацию компилятора / исполняемой среды:
>Python will also optimize immutable literals by storing them once, at compile time, with the bytecode in code objects
Из-за чего у тебя и получается ссылка на один и тот же объект, вместо разных.

Подробнее можно почитать тут:
https://stackoverflow.com/questions/24245324/about-the-changing-id-of-an-immutable-string

Конкретно в этом ответе:
https://stackoverflow.com/a/24245514
No. 25088    
>>25085
>Совсем не очевидная механика.
Со строками в Java ровно такая же петрушка.
No. 25142    
0183028.jpg - (137.34KB, 2048×1148)
25142
Может кто-нибудь сталкивался с такой задачей на Пайтон, что нужно в строке посчитать не просто количество подстрок, а количество последовательностей.
Например подстрока "lalala"
Поиск в строке "nyanyalalalanyanya" должен вернуть 0.
Поиск в строке "nyanyalalalalalala" должен вернуть 1, и далее.
Ситуацию усугубляет то, что подстрок много и нужно посчитать количество каждой последовательности подстрок в очень длинной-длинной строке, а НЕ каждой последовательности отдельно.

Я могу очень легко это сделать на низком уровне, проверяя символ за символом с множеством условий. Но мне хочется найти более pythonic решение, хоть задача и мягко скажем не очень осмысленная.
No. 25143    
>>25142
> а НЕ каждой последовательности отдельно
Потому что они могут накладываться друг на друга.
No. 25144    
>>25142
>>25143
А lalala задается руками, или ты сам должен по строке определить, что там есть такое повторение?
No. 25145    
>>25144
Не руками, случайное. И я немного ошибся, друг на друга она не накладываются, так что можно спокойно проверить строку на все последовательности по очереди.

Придумал такое, смешное: автозамена всех таких подстрок на '1', затем автозамена всех остальных символов на ',' и вот так
l = [l for l in s.split(',') if len(l) > 0]
получаю список строк, из длинны которых я легко получаю длину каждой последовательности! В 4 действия выходит.
No. 25146    
>>25145
Если можно все подстроки проверить по очереди и их не надо находить самостоятельно, то по идее можно просто сделать count() по подстроке?

> s = 'aaabbbcccyyybbb'
> l = ['aaa', 'bbb']
>
> c = { ll: s.count(ll) for ll in l }
> cc = { k: v for (k, v) in c.items() if v > 1 }
>
> print(c)
> print(cc)

Получится
> {'aaa': 1, 'bbb': 2}
> {'bbb': 2}
No. 25147    
>>25146
Думал что можно с count что-то намудрить, но она считает количество подстрок в целом, не придумал как с её помощью получить именно размеры последовательностей.
Ладно. Вижу что у меня ничерта не получается объяснять такие дебильные вещи, а задание я каким-то забавным образом решил, так что спасибо и на этом.
No. 25148    
>>25147
А, дошло наконец, тебе надо считать именно повторения подстроки идущие сразу друг за другом, в группах?

Тогда первое что приходит на ум - регулярки:

>import re
>s = 'bbbaaabbbcccyyybbbbbbcccdddbbbbbbbbbeeebbbbbb'
>l = ['aaa', 'bbb']

>groups = { ll: re.findall('%s{2,}'%(re.escape(ll)), s) for ll in l }
>reps = { k: [ vv.count(k) - 1 for vv in v ] for (k,v) in groups.items() }

>print(groups)
>print(reps)

Выведет

>{'aaa': [], 'bbb': ['bbbbbb', 'bbbbbbbbb', 'bbbbbb']}
>{'aaa': [], 'bbb': [1, 2, 1]}

Хотя возможно и лиховато их в таких целях использовать.
No. 25149    
>>25148
Стив Балмер, ты крутой! Очень классно уметь писать такие сложные генераторы.
No. 25150    
>>25149
Спасибо, но лучше бы я умел сводить дела к простым генераторам.
No. 25157    
А тперь объясните мне причем тут Аоба, которая дизайнер, и разработка, которая код?
Удалить сообщение []
Пароль  
[Mod]