Пока, собственно, только один вопрос, но может, и другие появятся.
Никак не могу освоиться с этим языком.
В учебных целях придумал следующую задачку: есть строка, по структуре представляющая таблицу (например, | играет роль разделителя столбцов, а \n — разделителя строк). Требуется эту строку распарсить, то есть создать некий iterable объект, содержащий отдельные ячейки. Навроде двумерного массива. Вот никак не могу сообразить, в виде какого объекта это можно реализовать.
Вообще, насколько понимаю, такое паршенье необходимо должно предшествовать, например, всяким конвертациям таблицы: поскольку строки являются неизменяемыми величинами, использование в цикле оператора вида
str1 = str1 + str2
приводило бы к тому, что перелопачивается слишком много памяти. Следовательно, надо обрабатывать ячейки как элементы большого объекта, а потом за один раз делать конкатенацию. Правильно я говорю? В Lua, по крайней мере, учат делать так.
Цитата: Квас от декабря 23, 2011, 00:14
str1 = str1 + str2
Не делайте так. Переформулируйте задачу, чтобы использовать встроенные методы строк (
строка.split('|'), например, или
find): они работают быстрее (т.к. написаны на Си) и они удобнее.
Мне сейчас лень что-то думать, потому что у меня нет Пюфона для экспериментов под рукой и я боюсь соврать.
немного кложурного оффтопа:
Clojure 1.3.0
user=> (def s
"asdf | fg |ggg
asd| asd|dd
sdfg| fff|gg")
#'user/s
user=> (map #(seq (.split % "\\|")) (.split s "\n")) ;<--парсер
(("asdf " " fg " "ggg") ("asd" " asd" "dd") ("sdfg" " fff" "gg"))
Нет, всё-таки Ваши лиспы страшные.
Научившись на них думать, начинаешь понимать весь ужас нелиспов.
Цитата: Demetrius от декабря 23, 2011, 00:20
Цитата: Квас от декабря 23, 2011, 00:14
str1 = str1 + str2
Не делайте так. Переформулируйте задачу, чтобы использовать встроенные методы строк (строка.split('|'), например, или find): они работают быстрее (т.к. написаны на Си) и они удобнее.
Я же и пишу, что так нельзя делать. Если начать с пустой строки и прибавлять сто раз по символу, то в результате постоянного создания новых строк используется, грубо говоря, (1+2+...+100) б ≈ 5 кб памяти.
Поэтому мне и кажется, что нужно ячейки сделать элементами некоторого аналога двумерного массива, после чего можно пользоваться, например, операцией join.
Так можно сначала разделить исходную строку по разделителю строк, а потом — в цикле — по разделителям ячеек...
В Pythonʼе же есть аналог jay-esʼового
Цитата: var s = "a1b2c3d".split(/\d/); вернет массив ["a", "b", "c", "d"]. |
? |
Цитата: Demetrius от декабря 23, 2011, 00:20
Цитата: Квас от декабря 23, 2011, 00:14str1 = str1 + str2
Не делайте так. Переформулируйте задачу, чтобы использовать встроенные методы строк (строка.split('|'), например, или find): они работают быстрее (т.к. написаны на Си) и они удобнее.
Не понял. Оператор "плюс" - не встроенный метод?
Тогда есть более встроенный метод: ''.join([str1,str2]).
Честно сказать, не понял проблему и что требуется.
Почему бы в качестве "что-то типа двумерного массива" не использовать например двумерный массив? Ну или дишкнари с киями в виде таплов по два.
Делаем просто два раза сплит на эту строку (по '\n' и по '|') и все.
Я это и предложил.
Цитата: Bhudh от декабря 23, 2011, 14:03
Я это и предложил.
Значит я поддерживаю.
Цитата: Квас от декабря 23, 2011, 10:11
Я же и пишу, что так нельзя делать. Если начать с пустой строки и прибавлять сто раз по символу, то в результате постоянного создания новых строк используется, грубо говоря, (1+2+...+100) б ≈ 5 кб памяти.
А почему это вас волнует? Откуда вообще у вас такая инфа? :) Это же детали имплементации языка, а не часть языка.
Я не знаю как работает гарбаге цоллецтор в питоне (в каком из них?), но почему бы ему своевременно обрывки не подчищать, чтобы столько памяти не скапливалось? После выполенния str1 = str1 + str2, то на что раньше str1 указывал уже ничем не адресовано и подлежит удалению. Может новый стр1 вообще на его же место запишется.
Цитата: Квас от декабря 23, 2011, 10:11
Поэтому мне и кажется, что нужно ячейки сделать элементами некоторого аналога двумерного массива, после чего можно пользоваться, например, операцией join.
Запутался. Вам нужно построить такую строку или ее распарсить?
Распарсить, обработать ячейки по отдельности и построить обратно, насколько я понял.
Ну строится обратно в обратном порядке, вместо двух сплитов два джоина.
Погоди. А джойн берёт ряд массива в отдельности? Хотя что я, если у нас сплиты, то у нас одномерный массив...
И вообще питон это почти математика, там че хочешь берется. Пишешь как обычно пишут математики {f|f \in S} [f for f in S] и все дела.
Цитата: RawonaM от декабря 23, 2011, 13:56
Почему бы в качестве "что-то типа двумерного массива" не использовать например двумерный массив? Ну или дишкнари с киями в виде таплов по два.
Надо попробовать.
Цитата: RawonaM от декабря 23, 2011, 13:56
Честно сказать, не понял проблему и что требуется.
Хочу вот это:
Цитата: Bhudh от декабря 23, 2011, 14:14
Распарсить, обработать ячейки по отдельности и построить обратно, насколько я понял.
но не мог сообразить, как это по-человечески сделать. Алгоритмически просто, но начинаю писать — дальше «def» не идёт.
Цитата: RawonaM от декабря 23, 2011, 14:09
Цитата: Квас от декабря 23, 2011, 10:11Я же и пишу, что так нельзя делать. Если начать с пустой строки и прибавлять сто раз по символу, то в результате постоянного создания новых строк используется, грубо говоря, (1+2+...+100) б ≈ 5 кб памяти.
А почему это вас волнует? Откуда вообще у вас такая инфа? :) Это же детали имплементации языка, а не часть языка.
Я читал Programming in Lua, и там был пример, когда последовательное добавление строк к строке-результату работает порядка 2 с, а объединение большого количества строк — элементов таблицы происходит мгновенно благодаря алгоритму ханойской башни или чего-то навроде. Это потому, что строки в Lua — неизменяемые объекты. В Pythone — тоже (согласно туториалу), поэтому я и соображаю, что идеологически верно за раз объединять кучу строк.
Цитата: RawonaM от декабря 23, 2011, 13:56
Ну или дишкнари с киями в виде таплов по два.
Понял только на третьем прочтении.
Quase,
split как раз будет быстрее, чем ручная функция-парсер.
Цитата: RawonaM от декабря 23, 2011, 13:47
Не понял. Оператор "плюс" - не встроенный метод?
Тогда есть более встроенный метод: ''.join([str1,str2]).
Оператор плюс-то встроенный, но, как я понял, Квас собрался проходиться по каждому символу строки и прибавлять его к строке-результату.
А вообще да, РавонаМ прав, проще всего так:
a="""11|12|13
21|22|23
31|32|33"""
t = [x.split("|") for x in a.split("\n")]
Цитата: arseniiv от декабря 23, 2011, 19:36
Quase, split как раз будет быстрее, чем ручная функция-парсер.
Я не против. Вопрос состоял в том, каким типом данных представить двумерный массив строк.
Цитата: Demetrius от декабря 23, 2011, 19:43
Цитата: RawonaM от декабря 23, 2011, 13:47Не понял. Оператор "плюс" - не встроенный метод?
Тогда есть более встроенный метод: ''.join([str1,str2]).
Оператор плюс-то встроенный, но, как я понял, Квас собрался проходиться по каждому символу строки и прибавлять его к строке-результату.
Ну, не по символу, но можно представить, что от одной строки-таблицы откусываются, например, ячейки, и из них составляется другая строка. Что по моему разумению неграмотно.
Цитата: Квас от декабря 23, 2011, 19:45
Я не против. Вопрос состоял в том, каким типом данных представить двумерный массив строк.
Списком списков же. Если будут проблемы с производительностью, тогда уже делать итератор с yield'ами.
Цитата: Квас от декабря 23, 2011, 19:45
Я не против. Вопрос состоял в том, каким типом данных представить двумерный массив строк.
А, ну так вон тогда у Deme. в самом конце получается двумерный массив.
Неправда, у Deme. получается список списков. Если честно, я вообще не знаю, как в Пюфоне сделать массив.
Ну это я метаординарно говоря. Решил не читать, какие там типы, когда вопрос не такой конкретный.
Цитата: Квас от декабря 23, 2011, 19:21
Я читал Programming in Lua, и там был пример, когда последовательное добавление строк к строке-результату работает порядка 2 с, а объединение большого количества строк — элементов таблицы происходит мгновенно благодаря алгоритму ханойской башни или чего-то навроде. Это потому, что строки в Lua — неизменяемые объекты. В Pythone — тоже (согласно туториалу), поэтому я и соображаю, что идеологически верно за раз объединять кучу строк.
Вот совсем недавно я с таким же делом столкнулся за жабаскрипте.
В мозилле все отлично работало, а вдруг я решил на ИЕ запустить, жутко тормозило. У меня был цикл, который прибавлял к строке по чуть-чуть, пока она не достигала многих мегабайтов. ФФ вероятно умеет это оптимизировать сам, а ИЕ не умеет. Сделал массив в который добавлял по элементу, потом все это одним джоином, стало работать в ИЕ приемлемо.
Так что это зависит конкретно от имплементации.
Думаю, что нужно отделить
мух от котлет язык от конкретного интерпретатора, и на этих этапах такими вещами не заморачиваться. :) Вдруг питон реализует это иначе, нежели Луа. Вы этого не знаете, а даже если знаете, то оно в данный момент только мешает.
Цитата: Demetrius от декабря 23, 2011, 20:11
Неправда, у Deme. получается список списков. Если честно, я вообще не знаю, как в Пюфоне сделать массив.
Список это и есть массив.
Вас?! Список—это когда элементы связаны через указатели, массив—это когда он расположены подряд. :what:
Цитата: Demetrius от декабря 23, 2011, 20:31
Вас?! Список—это когда элементы связаны через указатели, массив—это когда он расположены подряд. :what:
То что вы написали это связанный список.
Списком может быть что угодно.
В питоне нет прямого доступа к памяти, так что что там как расположено вы не знаете и вам не нужно этого знать.
Для программиста разница между связанным списком и массивом состоит в том, что к элементам массива есть прямой доступ, а по связанному списку нужно гулять как по ленте.
Списки в питоне это самые настоящие массивы с точки зрения пользования.
Да, список списков, два раза сплит и два раза джойн — это, видимо, то, чего моя душенька желала. :yes: Насчёт словаря тоже понравилось.
походу у меня те же проблемы в sql
:fp:
оптимизация и фсётакое
до чего ж люди-то умные есть!
Цитата: Demetrius от декабря 23, 2011, 20:31
Вас?!
а правду мне немцы говорили, шо нуна говорить (вопрошать) не "вас", а "битте"?
Квас, давайте еще вопросы :)
Я вообще питон обожаю. Жалко, что вот по алгоритмам мой проверяющий не принимает на питоне. В целом питон совместим в большинстве случаев с псеводокодом, парочка элементарный преобразований и все.
А на других языках нужно лишнего напихивать, так что суть уже теряется :(
У нас правда курсы сугубо теоретические, но вот два практических задания есть, смысл в коих мне не особо понятен.
По мере поступления — обязательно. :)
Пока такой общий вопрос: как у питона обстоит дело с общением с внешним миром? Скажем, взаимодействие с другими программами или возможность использования его функций другими скриптовыми языками. Последнее, насколько понимаю — штучный товар.
Такая, например, ситуация: питон должен обработать некоторый файл и создать ТеХовский файл, который нужно обработать latex-ом. Я пока вижу единственный выход: взаимодействие организуется с помощью AutoHotkey, который запускает питоновский скрипт, ждёт его окончания и пару раз запускает латех.
Цитата: Квас от декабря 23, 2011, 22:08
Такая, например, ситуация: питон должен обработать некоторый файл и создать ТеХовский файл, который нужно обработать latex-ом. Я пока вижу единственный выход: взаимодействие организуется с помощью AutoHotkey, который запускает питоновский скрипт, ждёт его окончания и пару раз запускает латех.
Не очень понял зачем тут АНК нужен.
Питон умеет читать файлы, он прочтет ТеХ файл, обработает, вызовет ЛаТеХ.
Умеет вызывать? Это замечательно.
Насчёт AHK я — потому что quam cuisque nôrit artem, in hâc se exerceat.
РавонаМ, спасибо, буду знать.
Алгоритмически вопрос тупейший, но я запутался с кодировками.
Предположим, я хочу сделать элементарную русскую склонялку. Даётся слово «трава», от него надо оторвать -а и к основе добавлять окончания -а, -ы и по списку; результаты можно в список.
Я написал функцию и пытался тестировать её из интерактивного режима — не вышло. Я хочу, чтобы функция работала с utf-8 и не соображу, где надо ставить u, где какие unicode и пр. Может быть, глючит у меня от того, что в консоли не utf-8? Пока есть следующее:
# -*- coding: utf-8 -*-
def decline(word, type):
if type == 11: # трава
stem = word[0:len(word)-2]
return [stem + u'а',
stem + u'ы',
stem + u'е',
stem + u'у',
stem + u'ой']
Я вряд ли чем помогу, я плохо знаю Python 2, как-то мне третий больше нравится.
Цитировать
Может быть, глючит у меня от того, что в консоли не utf-8?
Всё возможно.
word Вы передаёте как уникодовую строку? Если вы её прочитали откуда-то и она не в уникоде, делайте
word.decode('cp1251') перед тем, как передавать её в функцию.
По идее, при выводе в консоль уникодные строки должны перекодироваться правильно. Можете на всякий вывод при выводе в консоль попробовать сделать
text.encode('cp866')... Но, по идее, если строка уникодная, то Python сам должен разобраться.
Спасибо, завтра попробую.
Я себе поставил 2.7, потому что на сайте было написано: «Не знаете что ставить — ставьте 2.7.» :) Неужели по такому маленькому кусочку уже понятна версия? ;) В принципе, можно и третий попробовать.
Цитата: Квас от января 20, 2012, 00:09
Я себе поставил 2.7, потому что на сайте было написано: «Не знаете что ставить — ставьте 2.7.» :) Неужели по такому маленькому кусочку уже понятна версия? ;) В принципе, можно и третий попробовать.
С вторым питоном работают большинство сторонних библиотек (например, лингвистическая NLTK); их потихоньку портируют на 3, но очень медленно. Именно поэтому всем рекомендуют (пока что) второй питон.
3.x обратно не совместим с 2.x (ну, если не считать программы-автопреобразователя), зато там переделали некоторые вещи. Например, теперь все строки уникодовые, поэтому префикса
u нет (зато есть префикс
b, чтобы указать, что это не строка, а массив байт, замаскированный под строку). Вот по этому и узнал :)
Или вот, например, убрали варианты для увеличения скорости: нет
xrange, зато теперь
range сам разбирается, какое представление будет удобнее; нет
cpickle, зато
pickle сам вызывает ускоренную версию, если она доступа.
IPython кто-нибудь пробовал на Windows установить? QT console работает?
Je ne connais pas IPython, à quoi c'est bon?
IDLE n'est pas assez?
I don't know yet. I'd say IDLE is a very rudimentary interactive tool. Google says IPython has certain advantages over the ordinary python console, whereas qt console has no rival whatever. :) I'd love to try NumPy and SciPy. QT console must be useful for them (e. g. it can display graphics inline).
Цитата: Квас от апреля 22, 2012, 12:02
I'd say IDLE is a very rudimentary interactive tool.
O_o"
I've never had a task for which I'd need something besides IDLE.
Цитата: Квас от апреля 22, 2012, 12:02
I don't know yet.
Pourquoi cette langue hérétique?!! >(
Цитата: Квас от апреля 22, 2012, 12:02
I'd love to try NumPy and SciPy. QT console must be useful for them (e. g. it can display graphics inline).
Alors utilise PyScriptor, IDE complet :)
Цитата: Demetrius от апреля 22, 2012, 12:20
Цитата: Квас от апреля 22, 2012, 12:02I'd say IDLE is a very rudimentary interactive tool.
O_o"
I've never had a task for which I'd need something besides IDLE.
I'm afraid IDLE won't do tricks like this:
http://www.scipy.org/Cookbook/OptimizationDemo1
Generally, I don't see any essential advantages of IDLE over the console, except, perhaps, the copypaste. On the other hand, the console has the command history.
:fp: Je peux pas la voir ici...
Цитата: Квас от апреля 22, 2012, 12:31
Generally, I don't see any essential advantages of IDLE over the console, except, perhaps, the copypaste.
La console a copypaste aussi.
Цитата: Квас от апреля 22, 2012, 12:34
Ce matin j'ai découvert que j'avais désappris toutes les langues. Quel dommage ! :(
Quel dommage de voir que quelqu'un, qui peut écrire français, écrit cette autre langue :(
Quasus, ILF est juste pour toi maintenant! :)
Цитата: Квас от апреля 22, 2012, 12:31
I'm afraid IDLE won't do tricks like this:
http://www.scipy.org/Cookbook/OptimizationDemo1
Generally, I don't see any essential advantages of IDLE over the console, except, perhaps, the copypaste. On the other hand, the console has the command history.
I'm not sure about what the screenshot demonstrates, but why do you think IDLE can't do this? :donno:
Цитата: Demetrius от апреля 22, 2012, 12:40
Цитата: Квас от апреля 22, 2012, 12:31I'm afraid IDLE won't do tricks like this:
http://www.scipy.org/Cookbook/OptimizationDemo1
Generally, I don't see any essential advantages of IDLE over the console, except, perhaps, the copypaste. On the other hand, the console has the command history.
I'm not sure about what the screenshot demonstrates, but why do you think IDLE can't do this? :donno:
Il peut, pas de problème. C'est la fonctionalité de python, pas d'une shell.
Цитата: RawonaM от апреля 22, 2012, 12:37
Цитата: Квас от апреля 22, 2012, 12:34Ce matin j'ai découvert que j'avais désappris toutes les langues. Quel dommage ! :(
Quel dommage de voir que quelqu'un, qui peut écrire français, écrit cette autre langue :(
Pas aujourd'hui. :( Je ne peux pas me figurer combien de temps il me demandrait d'écrire en français ce que j'ai écrit en anglais. Alors je fais ce que je peux pour internationaliser LF.
Цитата: Demetrius от апреля 22, 2012, 12:40
Цитата: Квас от апреля 22, 2012, 12:31I'm afraid IDLE won't do tricks like this:
http://www.scipy.org/Cookbook/OptimizationDemo1
Generally, I don't see any essential advantages of IDLE over the console, except, perhaps, the copypaste. On the other hand, the console has the command history.
I'm not sure about what the screenshot demonstrates, but why do you think IDLE can't do this? :donno:
If I manage to find instructions, I'll give it a try. I understand that all this Python stuff may be extremely powerful tools, but it all is so counter-intuitive. For example, my second attempt to install IPython succeeded, but qtconsole kept asking for packages and other stuff until it spat out a UnicodeDecodeError, and now I'm quite at a loss. :wall:
Цитата: Квас от апреля 22, 2012, 12:50
If I manage to find instructions, I'll give it a try. I understand that all this Python stuff may be extremely powerful tools, but it all is so counter-intuitive. For example, my second attempt to install IPython succeeded, but qtconsole kept asking for packages and other stuff until it spat out a UnicodeDecodeError, and now I'm quite at a loss. :wall:
Use Linux, feel libre :) apt-get — solves tout!
Now I see that the cause of the error is not the IPython itself, but a package called 'socket': socket.gethostbyname_ex('localhost') raises the UnicodeDecodeError. Perhaps it has something to do with non-ASCII characters in my user name. :(
Not in my username, but somewhere in the register.
http://victor-k-development.blogspot.com/2010/07/unicodedecodeerror-django.html
Цитата: Квас от апреля 22, 2012, 23:45
Now I see that the cause of the error is not the IPython itself, but a package called 'socket': socket.gethostbyname_ex('localhost') raises the UnicodeDecodeError. Perhaps it has something to do with non-ASCII characters in my user name. :(
This proved a minor problem. The cyrillic letters in the localhost mattered. I found out that socket.gethostbyname_ex('localhost') didn't work on my computer altogether and commented out a couple of lines in ipython (I'm sure it was safe, but I'm too lazy to explain why).
Finally qt console appeared. Alas! At the very moment Windows notified me that python.exe had to stop right away. The sad truth is that I've never managed to use the qt console and apparently I have to wait for further releases. Such a pity! I won't see any embedded pictures. :'(
Yet I've managed to get ipython working. From the very beginning I had problems with encodings: the shell works in cp866, whereas it thinks it reads files in cp1251. Goddammit! I've learnt I can change the shell's encoding with chcp (this is the advantage of ipython: it can function as the shell), and I've replaced the contents of cp1251.py with that of utf_8.py—now I can run utf-8 encoded scripts interactively! (http://www.smileyvault.com/albums/stock/smiley-party0006.gif)
Не подскажете, как запускают программу с параметрами?
Цитата: Квас от апреля 30, 2012, 11:55
Не подскажете, как запускают программу с параметрами?
Quels paramétres?
К примеру, "c:\blah-blah\sumatrapdf.exe" -reuse-intance <имя файла> <номер строки>
Alors il faut faire la même chose :)
e.g. "python my.py par1 par2"
Мне бы из скрипта запустить программу и передать ей параметры.
import os
os.system("notepad 1.txt")
Спасибо! Вроде заработало. Но думает слишком долго. :-\
Ещё люди, оказывается, через subprocess.call делают. Я пытаюсь настроить прямой поиск из вима (ТеХ) в суматре (пдф) — должно «летать», но оба питоновские решения думают по нескольку секунд. Так не пойдёт.
Вопрос из вима, но больше, как понимаю, питоноспецифический. Главным образом, виндоспецифический.
Пытаюсь пробовать применять фильтрацию текста: текст из вима передаётся через stdin питону, который должен его обработать. Я пробовал
sys.stdin.read()
— работает для русских и английских букв. Если сделать
sys.stdin.buffer.read().decode('cp1251'),
аналогично. Если же
sys.stdin.buffer.read().decode('utf-8'),
то для русских не работает. Для греческих не работает ни в каком варианте.
При этом вимовский файл в utf-8. То есть когда он передаёт текст питону, тот почему-то уверен, что это cp1251. Есть ли способ его разубедить?
Вообще, может кто-нибудь знает форум, где есть про вим и питон вместе, и желательно русский?
Кстати, по поводу вызова внешних приложений. Если вызывать процесс через os.system, скрипт будет ждать его завершения. Можно воспользоваться subprocess.Popen. Я написал себе на пробу скриптик — консольный поисковик страницы в одном отсканированном словаре, тандем python—SumatraPDF работает замечательно.
Peux-tu montrer le code entier?
Цитата: RawonaM от мая 6, 2012, 15:13
Peux-tu montrer le code entier?
C'est python 3.2.
import sys
#inp=sys.stdin.buffer.read().decode('cp1251')
inp=sys.stdin.read()
outp=inp + '\nαβγδ.'
sys.stdout.buffer.write(outp.encode())
# the following assumes the output should be in cp1251
# and doesn't accept Greek letters
#sys.stdout.write(outp)
En effet, je comprends que mes questions sont peut-être trop spécifique, mais à présent je ne connais pas de bons forums informatiques. (En effet, je crois que LF n'est point mal à cet égard.)
:donno:
Je vais l'essayer dans les Fenêtres demain.
Je ne sais pas qu'est-ce que je dois faire pour l'essayer sans vim.
Créer un test.py comme ça et l'exécuter :)
Mais qu'est-ce que je dois faire pour terminer l'input ? Я нажимаю Enter до бесконечности.
Ctrl-Z? Sinon, crée un ficher comme j'ai fait et utilise l'opérateur "<".
Quant'à Ctrl-Z, il me semble qu'il ne marche pas.
Les Fenêtres. :fp:
Quasus, déménage à Linux.
Цитата: RawonaM от мая 7, 2012, 08:15
Les Fenêtres. :fp:
Je suis de ton avis. Mais Linux, c'est trop. :'(
Цитата: Квас от мая 7, 2012, 10:09
Mais Linux, c'est trop. :'(
Dans lequel sens? Il est plus facile de faire ce que tu veux en Linux.
Pour installer quelque chose il faut exécuter une ligne.
Je crois qu'il ne vaut pas la peine. :)
:donno:
Je me suis habitué à Windows et je m'y sens bien avec autohotkey et cet. Je n'ai pas d'expérience avec d'autres systemes d'exploitation. Pour le moment je joue avec ces facilités de vim, et j'ai peur que je perdrai plus que je trouverai. Alors, il ne vaut pas la peine.
Собрал gvim 7.3 с поддержкой интерфейса python 3.2! Теперь мне фильтрация не нужна. :=
Насчёт windows messages никто не в курсе?
Quels messages?
Как их из Python'а? Не знаю.
Toutes sortes de messages tels comme WM_ACTIVATE. En effet, je voudrais gérer des fenêtres ouvertes. On peut le faire à l'aide de l'Autohotkey, mais peut-être y a-t-il déjà un instrument propre au python.
Je m'y rends compte, que l'on ne se sert pas de Windows ici, mais tout de même... ;D
Цитата: arseniiv от мая 24, 2012, 22:16
Как их из Python'а? Не знаю.
А есть какие-то ещё способы, например, сделать окно активным?
Подозреваю, что это может быть завязано с Popen.send_signal.
В WinAPI ведь должно быть можно из него пролезть? Тогда
SendMessage. В неё надо передавать не помню что, но для окон и элементов управления — их handle. Не помню, какой функцией его взять; и их должно быть несколько. Вроде бы есть функция-итератор окон. Тогда перебираем и ищем окно с нужным заголовком.
Цитата: Квас от мая 24, 2012, 22:28
Подозреваю, что это может быть завязано с Popen.send_signal.
Если это что-то, оборачивающее WinAPI достаточно широко — то хорошо, не надо будет этой низкоуровневой возни.
http://stackoverflow.com/questions/1025029/how-to-use-win32-apis-with-python
Спасибо.
:o Да боже ж ты мой! Кроме прочего, пакет win32api, очевидно, не входит в стандартный дистрибутив.
По-моему, легче работать через AutoHotkey. (Через него можно делать практически всё, а тривиальные операции типа «найти и активировать окно» весьма просты.)
Поставил себе Python 3.3.
Был шокирован, что print теперь требует скобок.
Скажите, дальше стоит соваться? А то меня весьма весьма смутило, что совместимость со второй версией нарушена даже на уровне программы «Hello World».
Цитата: Hellerick от октября 8, 2013, 06:37
Скажите, дальше стоит соваться? А то меня весьма весьма смутило, что совместимость со второй версией нарушена даже на уровне программы «Hello World».
Мне третий больше нравится.
Плохие традиции когда-то надо заканчивать.
Цитата: Hellerick от октября 8, 2013, 06:37
А то меня весьма весьма смутило, что совместимость со второй версией нарушена даже на уровне программы «Hello World».
Мне пришлось исправлять
ez_setup.py, и единственные исправления, которые помню — это скобки у
print и смена синтаксиса
catch.
Цитата: Hellerick от октября 8, 2013, 06:37
Поставил себе Python 3.3.
Был шокирован, что print теперь требует скобок.
Это еще что.
Цитировать>>> 1/2
0.5
Твоюжмать :o
Hellerick, а нельзя просто кратко прочитать нововведения в питон 3 и не удивляться каждый раз?
А еще они куда-то дели `мои косые скобочки`! :uzhos:
Цитата: RawonaM от октября 24, 2013, 08:28
Hellerick, а нельзя просто кратко прочитать нововведения в питон 3 и не удивляться каждый раз?
А толку? Я ж всё равно сюда буду бегать свои эмоции выплескивать.
Что язык поменяли до полной несовместимости — ладно, майкрософтовские бейсики 80-х и 90-х годов тоже имеют мало общего между собой. Но зачем еще одно и то же название интерпритатора и расширение файлов для 2-х и 3-х питонов использовать? Особенно с учетом, что файлы .py рассчитаны на самосоятельный запуск как скрипты. После выхода 3-го питона, простые способы запуска питоновских скриптов (бóльшая часть которых написана на Python 2.x) остались в прошлом.
Ну, лично я теперь взял за привычку специально писать так, чтоб и второй (дома), и третий (на работе) пvѳоны код корректно исполняли. Хотя зачем эту свистопляску придумали, понимаю плохо. Видать, про то, что лучшее — враг хорошего, они не слышали.
Летом сего года понадобилось запустить один скрипт (чтобы всего-то распаковать хромопак ради интереса), написанный на питоне. С питоном я знаком весьма поверхностно на уровне хеллоуворлда, поэтому просто скачал и установил последнюю версию. Много думал. Только потом дошло, что скрипт написан на втором питоне, хотя написан и выложен был за несколько дней до того, как я его скачал.
Второй питон всё ещё так популярен или прогер, писавший тот скрипт, был "динозавром"?
Судя по всему, 2-й именно и популярен. На 3-м пишут реже.
Цитата: Timiriliev от октября 24, 2013, 15:47
Второй питон всё ещё так популярен или прогер, писавший тот скрипт, был "динозавром"?
Не смотря на некоторые теоретические преимущества Третьего, каких-то практических шагов для перехода не него предпринимается мало. Всё уже ориентировано на Второй, и морочиться с переездом никому не хочется. Вон в моей Убунте тоже Второй искаропки установлен.
Если писать на втором аккуратно, можно будет получить код на третьем автоматически с помощью
2to3.py.
Цитата: Python от октября 24, 2013, 15:34
Но зачем ещё одно и то же <...> расширение файлов для 2-х и 3-х питонов использовать?
+1
А нет ли конвенции, чтобы в коде прописывать что-то вроде
Цитировать# -*- version: 2.7 -*-
?
Dēmē передаёт:
Цитировать#! python3
http://docs.python.org/dev/whatsnew/3.3.html#pep-397-python-launcher-for-windows
Впервые смог выжать из питона хоть какую-то графику. Похоже, что этот вопрос считается слишком простым, чтобы покрывать его справкой или иллюстрировать примерами.
Ужаснуло, что для того, чтобы программка работала и дома, и на работе, начинать ее пришлось словами:
try:
from Tkinter import *
from tkinter import *
except BaseException: pass
А что ужасаться-то? Вполне нормальная для своего назначения конструкция.
Цитата: Hellerick от декабря 3, 2013, 16:02
try:
from Tkinter import *
from tkinter import *
except BaseException: pass
Не работает :(
Python 3 почему-то потребовал, чтобы
tkinter шел первым. А Python 2, небось, захочет, чтобы первым был
Tkinter?
Цитата: Hellerick от декабря 4, 2013, 04:08
Не работает :(
Логично. Попробуйте так:
try:
from tkinter import *
except BaseException: pass
try:
from Tkinter import *
except BaseException: pass
Цитата: RawonaM от декабря 4, 2013, 08:20
Попробуйте так:
Я сначала так и сделал, но потом обнаружил, что на двоечке они и вместе работают. А потом пришел на троечку, и обнаружил, что там не работают.
В общем, затеребили они мена со своими версиями.
Цитата: Hellerick от декабря 4, 2013, 08:41
Я сначала так и сделал, но потом обнаружил, что на двоечке они и вместе работают.
Значит у вас на двойке первый вариант есть на обоих системах.
Не может же он выполнить вторую строку если первая выдала эксепшн.
Цитата: RawonaM от декабря 4, 2013, 08:52
Значит у вас на двойке первый вариант есть на обоих системах.
Не может же он выполнить вторую строку если первая выдала эксепшн.
А, во оно как.
А я думал, что
try — это такой режим, когда просто все сообщения об ошибках откладываются до поры до времени.
Цитата: Hellerick от декабря 4, 2013, 09:29
А я думал, что try — это такой режим, когда просто все сообщения об ошибках откладываются до поры до времени.
Бесполезный был бы режим :)
Цитата: arseniiv от ноября 11, 2013, 17:03
Dēmē передаёт:
Цитировать#! python3
http://docs.python.org/dev/whatsnew/3.3.html#pep-397-python-launcher-for-windows
Немного поэкспериментировав, обнаружил, что питоновский ланчер py.exe поддерживает не только виртуальные имена питона (#!python2, #!python3) или #!py -НОМЕР.ВЕРСИИ, но и другие интерпритаторы. Т.е., можно, например, назвать файл perlprogram.py, указать в первой строчке #!perl — он будет работать как перл-программа (при условии, что путь к perl.exe включен в PATH).
:D
Недавно захотел скомпилировать программку (кажется, с помощью py2exe). Код был на одну страничку, а исполняемый файл получился на 3,5 МБ. Похоже, весь питон туда целиком запихнут.
Почитал форумы. Мое предположение подтвердилось. Говорят, питон слишком свободно играет с данными, и любой компилятор будет вынужден для этого побоища выстраивать весь колизей целиком.
Но ведь как-то питоном всё же пользуются при производстве человеческих программных продуктов. :donno:
Вполне "человеческий программный продукт", например, - мой любимый библиотечный менеджер Calibre (написан на версии 2.7). Вес инсталляшки - 58 метров. После установки весит 166 мегов. Из них 48 мегов весит зазипованная папка pylib.zip и 82 мега - виндузовые DLL-ки. Сам исполняемый файл весит 169 килобайт. Все вполне терпимо. Правда, это несколько иной подход к делу, нежели компилировать исходник при помощи py2exe.
Но одно автор потерял однозначно - кроссплатформенность питона.
Играюсь с питоном.
>>> class Dclass:
... sub=[]
...
>>> D = [Dclass(), Dclass()]
>>> D[0].sub += [1]
>>> D[0].sub
[1]
>>> D[1].sub
[1]
>>> D[0].sub = D[0].sub + [1]
>>> D[0].sub
[1, 1]
>>> D[1].sub
[1]
Когда я применяю к D[0].sub "+=", кроме него также почуму-то увеличивается и D[1].sub. Но если я прямо пишу D[0].sub = D[0].sub + [1], этого не проиходит.
Это баг или фича?
sub у вас это переменная класса. D[0].sub, D[1].sub, Dclass.sub — все указывают на один объект.
Однако в строке
Цитата: Hellerick от декабря 23, 2013, 14:21
>>> D[0].sub = D[0].sub + [1]
Вы создаете новую переменную объекта D[0], которая затеняет переменную класса.
Цитата: RawonaM от декабря 23, 2013, 15:05
sub у вас это переменная класса. D[0].sub, D[1].sub, Dclass.sub — все указывают на один объект.
Однако в строке
Цитата: Hellerick от декабря 23, 2013, 14:21
>>> D[0].sub = D[0].sub + [1]
Вы создаете новую переменную объекта D[0], которая затеняет переменную класса.
Да, мне уже объяснили.
Впрочем, вы формулируете короче и понятнее. :)
Неприятная особенность. Если б там был не
set, а простое числовое значение, этот номер был прокатил. Мало просто программировать в свое удовольствие, надо еще учитывать, какие типы
mutable, а какие
immutable, и как с ними питон собирается обращаться. Как-то это не соответствует моим представлениям о комфортном языке.
Опять питон плохо себя ведет. :(
>>> class Dclass:
pid = 0
>>> Dlist = [Dclass(), Dclass()]
>>> Dlist
[<__main__.Dclass instance at 0x020B8468>, <__main__.Dclass instance at 0x02011170>]
>>> Dlist[0] = Dlist[1]
>>> Dlist
[<__main__.Dclass instance at 0x02011170>, <__main__.Dclass instance at 0x02011170>]
Зачем он прописал два объекта по одному адресу? Я ж их не расцеплю теперь. Мне надо было просто скопировать значения из одного объекта в другой.
Новогодний клон вне новогоднего раздела. Можете банить, если хотите.
Цитата: Hellerick от декабря 25, 2013, 06:49
Опять питон плохо себя ведет. :(
>>> class Dclass:
pid = 0
>>> Dlist = [Dclass(), Dclass()]
>>> Dlist
[<__main__.Dclass instance at 0x020B8468>, <__main__.Dclass instance at 0x02011170>]
>>> Dlist[0] = Dlist[1]
>>> Dlist
[<__main__.Dclass instance at 0x02011170>, <__main__.Dclass instance at 0x02011170>]
Зачем он прописал два объекта по одному адресу? Я ж их не расцеплю теперь. Мне надо было просто скопировать значения из одного объекта в другой.
Это не Python прописал 2 объекта по одному адресу, это вы прописали их по одному адресу, сделав
Dlist[0] = Dlist[1]. В большинстве современных языков объекты копируются по ссылкам, т.е.
a = b не приводит к копированию объекта, а лишь к копированию ссылки на тот же объект (исключение — C++). Попробуйте вот это: http://docs.python.org/3/library/copy.html (т.е., по идее,
import copy сверху и
Dlist[0] = copy.deepcopy(Dlist[1])).
Модераторы, назовите тему как-нибудь «Вопросы о языке питон» — когда вижу эту тему в списке с нынешним названием, постоянно Пѵѳон мерещится, надоело уже. :stop::fp:;D
Цитата: Demetrius от декабря 25, 2013, 12:04
Это не Python прописал 2 объекта по одному адресу, это вы прописали их по одному адресу,
Да знаю я. Но пакостная же особенность.
Нормальная особенность. Копирование адреса — это прозрачно. Глубокое копирование может быть разным и не так прозрачно, и не всегда возможно. Так что если первое соответствует простому синтаксису, а второе — непростому, это нормально. По-моему. Но я ведь прав.
Главное — что фактическая реализация программы противоречит ее алгоритмическому описанию. Это, может, и поощряет более рациональную манеру программирования, но всё равно, это баг.
Цитата: Hellerick от декабря 26, 2013, 01:55
фактическая реализация программы противоречит ее алгоритмическому описанию
А не надо смысл лишний приписывать ничему — и всё будет OK.
Тема разделена. Продолжение здесь: НГ/Вопросы о Python'е (http://lingvoforum.net/index.php/topic,64473.0.html).
http://alexgaynor.net/2013/dec/30/about-python-3/
Интересно, на что будет болee похож Python 4, когда появится — на Python 2 (который популярнее), или на Python 3 (который как бы прогрессивнее)?
Ни на что.
Четвертого Питона быть не должно. Пусть развивают третий...
Третий ненужен.
Мне нужен!
Программа для генерирования bitcoin-адреса.
_ =r"""A(W/2,*M(3*G
*G*V(2*J%P),G,J,G)+((M((J-T
)*V((G-S)%P),S,T,G)if(S@(G,J))if(
W%2@(S,T)))if(W@(S,T);H=2**256;import&h
ashlib&as&h,os,re,bi nascii&as&k;J$:int(
k.b2a_hex(W),16);C$:C (W/ 58)+[W%58]if(W@
[];X=h.new("rip em d160");Y$:h.sha25
6(W).digest();I$ d=32:I(W/256,d-1)+
chr(W%256)if(d>0@""; U$:J(k.a2b_base
64(W));f=J(os.urando m(64)) %(H-U("AUVRIxl
Qt1/EQC2hcy/JvsA="))+ 1;M$Q,R,G :((W*W-Q-G)%P,
(W*(G+2*Q-W*W)-R)%P) ;P=H-2** 32-977;V$Q=P,L=
1,O=0:V(Q%W,W,O-Q/W* L,L)if(W@O%P;S,
T=A(f,U("eb5mfvncu6 xVoGKVzocLBwKb/Nst
zijZWfKBWxb4F5g="), U("SDra dyajxGVdpPv8DhEI
qP0XtEimhVQZnEfQj/ sQ1Lg="), 0,0);F$:"1"+F(W
[1:])if(W[:1 ]=="\0"@"" .join(map(B,C(
J(W))));K$: F(W +Y(Y(W))[:4]);
X.update(Y("\4"+ I(S)+I(T)));B$
:re.sub("[0OIl _]| [^\\w]","","".jo
in(map(chr,ra nge (123))))[W];print"Addre
ss:",K("\0"+X.dig est())+"\nPrivkey:",K(
"\x80"+I(f))""";exec(reduce(lambda W,X:
W.replace(*X),zip(" \n&$@",["","",
" ","=lambda W,",")else "])
,"A$G,J,S,T:"+_))
Говорят, что работает. :what:
Цитата: RawonaM от января 3, 2014, 11:01
Вряд ли это работает.
Там в самом начале стоит ключик регулярного выражения — наверное, через оные всё и исправляется.
Запустил пару раз. Что-то сгенерировало. Что с ним делать дальше? И сколько это в деньгах?
Цитата: Python от января 3, 2014, 18:00
Запустил пару раз. Что-то сгенерировало. Что с ним делать дальше?
Теперь вы можете послать туда все ваши деньги, и вам будет Счастье.
Несерьезный вопрос.
Частенько мои программы работают с двумя файлами — один входной, а другой выходной, и их надо обзывать какими-то переменными. Но вот в названиях этих у меня всё время какой-то разнобой, а сердце требует униформности.
У вас есть какие-нибудь традиции именования таких переменных?
sys.stdin, sys.stdout. Перенаправление из/в файл делаю в командной строке.
Решил почитать, что пишут умные люди.
ЦитироватьNote: Python doesn't depend on the underlying operating system's notion of text files; all the processing is done by Python itself, and is therefore platform-independent.
:what:
Одна из моих программ отказалась корректно работать под Unix именно из-за того, что восприятие спецсимвола
\n оказалось platform-dependent.
Справку по open-то посмотрите. Там, вроде, можно и насильно указать, какими строками разделять lines файла.
Цитировать>>> (2 or 3) * (5 and 7)
14
Ась? :what:
Все правильно, а вы что ожидали?
Цитата: Hellerick от апреля 16, 2014, 04:42
Цитировать>>> (2 or 3) * (5 and 7)
14
Ась? :what:
Для or возвращается первый истинный элемент, а для and — последний. Применимо в случае, например, (x or 3), что означает «если x не определён, подставить 3».
Цитата: Vertaler от апреля 16, 2014, 11:32
Цитата: Hellerick от апреля 16, 2014, 04:42
Цитировать>>> (2 or 3) * (5 and 7)
14
Ась? :what:
Для or возвращается первый истинный элемент, а для and — последний. Применимо в случае, например, (x or 3), что означает «если x не определён, подставить 3».
Точнее, если «если x == false, подставить 3».
Х может быть определен, но если это допустим 0 или пустая строка, то это фолз.
https://docs.python.org/2/library/stdtypes.html
См. 5.2
Спасибо за объяснения.
Цитата: RawonaM от апреля 16, 2014, 11:23
Все правильно, а вы что ожидали?
Я думал, что
2 or 3 вернет
True.
Цитата: Hellerick от апреля 16, 2014, 04:42
Цитировать>>> (2 or 3) * (5 and 7)
14
Ась? :what:
Кстати, C# так тоже может. Не помню только, сразу переопределены ли для чисел
true и
false или надо самому.
Там
a || b для не
boolов эквивалентно
true(a) ? a : b, но не
true(a) ? true : b.
Цитата: arseniiv от апреля 16, 2014, 17:14
Кстати, C# так тоже может. Не помню только, сразу переопределены ли для чисел true и false или надо самому.
Там a || b для не boolов эквивалентно true(a) ? a : b, но не true(a) ? true : b.
Ты серьёзно или шутишь? Или ты перепутал C# с чем-то другим? С джаваскриптом?
В C#'е:
1) Оператор || для чисел не определён.
2) Переопределять операторы на числах нельзя. (Один из операндов оператора при переопределении должен быть того же класса, в котором этот оператор переопределяется. Влезть в тип int не получится.)
3) Операторы || и && вообще нельзя явно переопределить. Они будут вычисляться сами, если переопределить false и true.
4) Оператор ||, кажется, всегда возвращает bool.
Цитата: Тайльнемер от апреля 16, 2014, 20:26
3) Операторы || и && вообще нельзя явно переопределить. Они будут вычисляться сами, если переопределить false и true.
4) Оператор ||, кажется, всегда возвращает bool.
Сори, я тоже ошибся.
Операторы || и && будут вычисляться сами, если переопределить false, true, | и &.
Операторы || и && будут возвращать не bool, а тот тип, в котором определены вышеуказанные операторы.
static void Main()
{
var i0 = new MyInt(0);
var i2 = new MyInt(2);
var i3 = new MyInt(3);
var i5 = new MyInt(5);
var i7 = new MyInt(7);
Console.WriteLine(i0 ? "i0 is true" : "i0 is false");
Console.WriteLine((i2 || i3) * (i5 && i7));
}
class MyInt
{
public MyInt(int value)
{
Value = value;
}
public int Value { get; private set; }
public static bool operator true(MyInt b)
{
Console.WriteLine("called: true");
return b.Value != 0;
}
public static bool operator false(MyInt b)
{
Console.WriteLine("called: false");
return b.Value == 0;
}
public static MyInt operator |(MyInt a, MyInt b)
{
Console.WriteLine("called: |");
return a ? a : b;
}
public static MyInt operator &(MyInt a, MyInt b)
{
Console.WriteLine("called: &");
return a ? b : a;
}
public static MyInt operator *(MyInt a, MyInt b)
{
Console.WriteLine("called: *");
return new MyInt(a.Value * b.Value);
}
public override string ToString()
{
return String.Format("MyInt({0})", Value);
}
}
Цитата: Тайльнемер от апреля 16, 2014, 20:26
2) Переопределять операторы на числах нельзя. (Один из операндов оператора при переопределении должен быть того же класса, в котором этот оператор переопределяется. Влезть в тип int не получится.)
А как метод расширения? (Не проверял.)
От нечего делать, выполнил школьную задачку: написать программу, которая заполнит матрицу числами по спирали.
size = [4,7]
matrix = [[0 for j in range(size[1])] for i in range(size[0])]
position = [0,0]
shifts = [[0,1], [1,0], [0,-1], [-1,0]]
def free(freepos): # Проверяет, свободна ли клетка
return (
0<=freepos[0]<=size[0]-1 and
0<=freepos[1]<=size[1]-1 and
matrix[freepos[0]][freepos[1]]==0)
move = 1
direction = 0
while min([min(i) for i in matrix])==0:
matrix[position[0]][position[1]] = move
checkposition = [a+b for a, b in zip(position, shifts[direction])]
if free(checkposition):
position = checkposition
move += 1
else:
direction = (direction+1)%4
for i in matrix: print((size[1]*'{:2} ').format(*i))
Программа выводит:
Цитировать 1 2 3 4 5 6 7
18 19 20 21 22 23 8
17 28 27 26 25 24 9
16 15 14 13 12 11 10
Хотелось бы услышать критику. Любую. Неудачные названия переменных, неоптимальное хранение данных, какие-то лишние шаги и т.п.
Цитата: Hellerick от октября 24, 2013, 15:43
Ну, лично я теперь взял за привычку специально писать так, чтоб и второй (дома), и третий (на работе) пvѳоны код корректно исполняли.
А не проще ли установить дома третий или на работѣ второй?
Теперь и там, и там третий.
Хотя возможность запускать второй (на работе) оставлена. Иногда это создает проблемы.
https://github.com/snoack/python-goto — Пѵѳонъ должен бы оценить
А он разве им уже не пользовался (http://lingvoforum.net/index.php/topic,34646.msg2575180.html#msg2575180)?
Цитата: Hellerick от сентября 22, 2015, 15:18
А он разве им уже не пользовался (http://lingvoforum.net/index.php/topic,34646.msg2575180.html#msg2575180)?
Там goto в части, которая является батником, а не питоновским кодом.
Цитата: Upliner от сентября 22, 2015, 15:23
Цитата: Hellerick от сентября 22, 2015, 15:18
А он разве им уже не пользовался (http://lingvoforum.net/index.php/topic,34646.msg2575180.html#msg2575180)?
Там goto в части, которая является батником, а не питоновским кодом.
Странный код. Не врубаюсь в него.
По-моему Питонов код успешно демонстрирует, что гото не нужен ;)
Цитата: Hellerick от сентября 22, 2015, 15:34
Цитата: Upliner от сентября 22, 2015, 15:23
Цитата: Hellerick от сентября 22, 2015, 15:18
А он разве им уже не пользовался (http://lingvoforum.net/index.php/topic,34646.msg2575180.html#msg2575180)?
Там goto в части, которая является батником, а не питоновским кодом.
Странный код. Не врубаюсь в него.
Один из примеров кода, написанного сразу на двух языках программирования. Каждый из интерпретаторов либо перепрыгивает код "чужого" языка, либо воспринимает их как комментарии.
Нашёл, как это называется: https://en.wikipedia.org/wiki/Polyglot_%28computing%29
Цитата: Demetrius от сентября 22, 2015, 15:08
https://github.com/snoack/python-goto — Пѵѳонъ должен бы оценить
Оцінюю
Цитата: Demetrius от сентября 22, 2015, 15:36
По-моему Питонов код успешно демонстрирует, что гото не нужен ;)
В части, где батник — определенно нужен. При отсутствии многострочных комментариев в синтаксисе батника, безусловный переход — практически единственный способ «закомментить» произвольный текст после него (до конца файла или до следующей метки; к счастью, cmd.exe работает как чистый интерпритатор и проверяет синтаксис каждой команды лишь непосредственно перед ее выполнением).
На самом деле можно было сделать проще:
@py -3 -x "%~f0" %* & goto :eof
# some python code...
Но когда создавался тот код, об опции -x (игнорировать первую строку питоновского файла) я не знал.
Впрочем, даже здесь понадобилось бы goto :)
Нашел у себя программу, которую написал непонятно зачем.
def check(e):
l = [[i, 1/i] for i in range(1,e+1)]
s = sum([i[1] for i in l])
l1=[[0,0,0]]
for i in l:
if i[0]==1:
l1=l1+[[i[0],i[1],i[1]/s]]
else:
l1=l1+[[i[0],i[1],l1[i[0]-1][2]+i[1]/s]]
i=0
go_on = True
while go_on:
i+=1
if l1[i][2]+l1[i][0]/e>1: go_on = False
a = l1[i-1][2]+l1[i-1][0]/e
b = l1[i][2]+l1[i][0]/e
return (1-a)/(b-a)+i-1
if __name__=='__main__':
for j in range(6,400):
elemq=j
print(j,check(elemq))
Сейчас сижу, пытаюсь понять, что же она делает.
Цитата: for j in range(6,400):
elemq=j
print(j,check(elemq))
6 2.179775280898876
7 2.5002416626389556
8 2.799911563121822
9 3.0932885381670445
10 3.3996052920108184
11 3.6919301492425323
12 3.9714388731595163
13 4.266061397195968
14 4.553403636653781
15 4.831011179105047
16 5.108259096808772
17 5.3918393641232205
18 5.6676417027007036
19 5.936050272142532
20 6.211987622854944
21 6.486110790246089
22 6.754062122852561
23 7.017089561186049
24 7.2896590477317424
25 7.556957487587939
26 7.819164566040115
27 8.080612194857721
28 8.347161527092297
29 8.609263382942855
30 8.867047589625486
31 9.12646940043044
32 9.388290588086052
33 9.646276280784331
34 9.900524078845802
35 10.157689961176342
36 10.415679185495627
37 10.670304487110071
38 10.921641540813058
39 11.176448463496751
40 11.431254289155287
41 11.683070026903545
42 11.931955821399175
43 12.184376477037056
44 12.43648443763693
45 12.685905492338952
46 12.932688421911337
47 13.182740811971954
48 13.432524591186395
49 13.679871985778606
50 13.92482323507159
51 14.172552253510208
52 14.420306155473472
53 14.665833937925884
54 14.909169273961723
55 15.154635350207737
56 15.400595722324049
57 15.644508804893867
58 15.886403125494514
59 16.129675124731016
60 16.374034965504496
61 16.61650135048682
62 16.85709870784594
63 17.09824945542091
64 17.34116865974874
65 17.582328052458404
66 17.821748748366154
67 18.06085220216865
68 18.30246492397914
69 18.54243494720886
70 18.780780674538025
71 19.017910148426424
72 19.258330205400156
73 19.49721097792139
74 19.73456862361595
75 19.970419132412644
76 20.209120605469405
77 20.446998177963092
78 20.683442687436877
79 20.918468278627103
80 21.15515059852952
81 21.392099574645798
82 21.627696144312395
83 21.861952893571665
84 22.096699851857895
85 22.332785417171248
86 22.567591197108833
87 22.801128450478668
88 23.034018636847733
89 23.26929815031495
90 23.50336358382475
91 23.7362250578134
92 23.967892615496286
93 24.20185643424044
94 24.43522632421835
95 24.667450984501958
96 24.89853948825296
97 25.130658428446083
98 25.36337279542268
99 25.594995566162698
100 25.82553497046687
101 26.055884500669727
102 26.287979280008898
103 26.519031621994245
104 26.74904901916804
105 26.978038917401804
106 27.20920709468033
107 27.43971748074611
108 27.669237484121464
109 27.897773910006283
110 28.127204382226658
111 28.35719869140192
112 28.586243754173474
113 28.814345809786758
114 29.04210763058903
115 29.271609477335982
116 29.500200159848713
117 29.72788541525888
118 29.95467095115711
119 30.183073980063895
120 30.41122917542198
121 30.638513844841732
122 30.864933252839958
123 31.09170732912615
124 31.319444454840124
125 31.546343546958646
126 31.772409473621416
127 31.997647080537917
128 32.22495172905791
129 32.451479176082
130 32.677203420679284
131 32.90212895577059
132 33.127849587062194
133 33.35401835608227
134 33.5794119535689
135 33.804034554550306
136 34.028230158713
137 34.254052348300895
138 34.47912564176236
139 34.70345392680565
140 34.92704107612023
141 35.151666638650234
142 35.376429342837284
143 35.60047145409289
144 35.82379658661253
145 36.046941455554055
146 36.271402712836824
147 36.495166355179755
148 36.718235761747636
149 36.94061429993286
150 37.164120658384945
151 37.38761313402697
152 37.610432820394415
153 37.832582872111345
154 38.05465373856718
155 38.27788197807736
156 38.500457683400384
157 38.72238381468028
158 38.94366332274003
159 39.16603911350046
160 39.38837632731479
161 39.61008294673109
162 39.83116174553818
163 40.052147123007344
164 40.27425110082927
165 40.49574246581204
166 40.71662382916243
167 40.93689779464231
168 41.15814100868348
169 41.37942123172331
170 41.60010836171342
171 41.820204853684324
172 42.04010196707941
173 42.26117502177743
174 42.48167104785307
175 42.70159236316744
176 42.92094127958901
177 43.14105676099667
178 43.36136473962874
179 43.58111316108265
180 43.800304211183196
181 44.019116730227104
182 44.239239645084524
183 44.45881743623348
184 44.67785217280797
185 44.89634591908644
186 45.115343517251624
187 45.33475291820966
188 45.553632918533275
189 45.77198547484158
190 45.989812539298136
191 46.208965049816015
192 46.4276919081108
193 46.645904257241305
194 46.863603949852305
195 47.08149714392459
196 47.300072464951796
197 47.51814563960277
198 47.73571842790735
199 47.95279258625186
200 48.170815920071206
201 48.38875099413783
202 48.60619742237479
203 48.82315687525681
204 49.039961743515
205 49.257759824529
206 49.475080503206264
207 49.69192536982787
208 49.90829601168201
209 50.125209887155144
210 50.34240548389294
211 50.559135970133475
212 50.77540285853721
213 50.99120765899766
214 51.208208533633126
215 51.42482492170941
216 51.640987909186336
217 51.85669893640175
218 52.07252428022866
219 52.289026919537356
220 52.50508595060446
221 52.7207027485713
222 52.935878686291026
223 53.151775203640554
224 53.367730304839654
225 53.58325252220259
226 53.79834316764578
227 54.01310164704116
228 54.228952918046424
229 54.4443802975596
230 54.65938504023904
231 54.87396839884526
232 55.088784442498266
233 55.304116811580656
234 55.51903514487071
235 55.73354064147268
236 55.9476344987261
237 56.16249157451729
238 56.37732308583375
239 56.59174999477908
240 56.805773448348596
241 57.01953294071659
242 57.23427730267177
243 57.44862499989656
244 57.662577131919825
245 57.87613479680005
246 58.08992513652272
247 58.30419309046633
248 58.518073090662256
249 58.731566190528945
250 58.94467344211403
251 59.15848065493117
252 59.37228781138076
253 59.58571537214107
254 59.79876434723014
255 60.0115130942669
256 60.22524678504705
257 60.438607935594206
258 60.65159751617911
259 60.864216495926556
260 61.076974561144354
261 61.290268524925736
262 61.5031976995558
263 61.71576301665858
264 61.92796540678692
265 62.14072088548292
266 62.35358874083122
267 62.56609926028681
268 62.778253338985465
269 62.99005187106157
270 63.20279362471413
271 63.41524831236745
272 63.62735283606165
273 63.839108056449206
274 64.05083452214903
275 64.26323243702069
276 64.47528626498364
277 64.68699683491123
278 64.89836497483616
279 65.11007311949592
280 65.32207520624469
281 65.53373989117168
282 65.74506797221227
283 65.95606024651482
284 66.16774049417387
285 66.37935815628492
286 66.590644861514
287 66.80160137847972
288 67.01230225454718
289 67.2238718458515
290 67.4351159560454
291 67.64603532660391
292 67.85663069834071
293 68.06730049570174
294 68.27850088254159
295 68.48938181587415
296 68.69994401074098
297 68.91018818156263
298 69.12081861505615
299 69.33165991191701
300 69.54218757632131
301 69.75240229820012
302 69.9623047669019
303 70.17288805321031
304 70.38337992544751
305 70.59356378995304
306 70.8034403127858
307 71.01308408123751
308 71.22353898543922
309 71.43369067604057
310 71.64353979687841
311 71.85308699129973
312 72.0626821092759
313 72.272800395417
314 72.48262074978683
315 72.69214379456878
316 72.9013701514861
317 73.11090983412198
318 73.3207001434136
319 73.53019763235314
320 73.73940290249382
321 73.94831655495571
322 74.15779441703536
323 74.36726502946567
324 74.5764477705047
325 74.7853432220364
326 74.9939519655372
327 75.20336199732816
328 75.41252085196713
329 75.62139662918682
330 75.82998989210583
331 76.03850405734894
332 76.2476377481937
333 76.45649246208094
334 76.66506874455587
335 76.87336714082171
336 77.08181358769738
337 77.29064592860163
338 77.49920381433415
339 77.70748777330601
340 77.91549833360625
341 78.12387178019486
342 78.3324099315923
343 78.54067801371812
344 78.74867653860566
345 78.95640601798581
346 79.16470148561366
347 79.37295232927275
348 79.58093735958741
349 79.78865707292704
350 79.99611196537616
351 80.2043247611443
352 80.41229491478909
353 80.62000338662159
354 80.82745065802126
355 81.03480894289481
356 81.24276291054282
357 81.45045874151911
358 81.65789690308729
359 81.86507786227303
360 82.07235465893362
361 82.28003652164865
362 82.48746415971046
363 82.69463802661687
364 82.90155857564126
365 83.10874972954892
366 83.31616550148223
367 83.52333085076503
368 83.73024621769959
369 83.93691204237729
370 84.1440136326886
371 84.35116910911088
372 84.5580778593539
373 84.7647403110644
374 84.97115689169048
375 85.17816521839075
376 85.38506598645702
377 85.59172362352999
378 85.79813854511214
379 86.00433125241418
380 86.21122273834816
381 86.41787418720328
382 86.62428600298908
383 86.83045858954915
384 87.0365599220033
385 87.24320387366751
386 87.44961120393911
387 87.65578230561938
388 87.86171757135344
389 88.06772423225809
390 88.2741257609525
391 88.48029399367815
392 88.686229312465
393 88.89193209919623
394 89.09784097446527
395 89.30400501683935
396 89.50993900186528
397 89.71564330121741
398 89.92111828643269
399 90.12692643495909
Возрастающая функция :donno:.
Вижу, что возрастающая. Но ведь зачем-то я ее городил?
Название файла -- что-то вроде "Zipf vs 2080".
Блин. Закон Ципфа... Чё ж я сразу-то не сообразил... :fp:
Чтобы прочитать пакет в формате wheel надо скачать Wheel, который распространяется в формате wheel.
https://pypi.python.org/pypi/wheel#downloads
Это шутка такая?
Вроде пишут, что через pip устанавливать надо. :???
Я так понял, по-русски это «wheel» надо переводить «велосипед», да?
Цитата: Hellerick от июня 30, 2016, 09:53Это шутка такая?
Шутка весьма старая, типа инсталлятора RARʼа в формате rar или драйвера сетевой карты, который предлагается скачать в сети.
Цитата: Hellerick от июня 30, 2016, 09:53
Чтобы прочитать пакет в формате wheel надо скачать Wheel, который распространяется в формате wheel.
https://pypi.python.org/pypi/wheel#downloads
Это шутка такая?
Там предлагается для скачивания 2 формата -- whl и обычный .tar.gz. Если у кого-то есть более старая версия wheel, то он может его обновить его из .whl пакета, если нет -- то скачать и установить из .tar.gz.
Таких случаев весьма много -- компилятор языка C, написанный на C, git, исходники которого хранятся в git и т.д.
Я сейчас какой-нибудь IDE для python'а подбираю.
Кто что использует, может посоветовать?
Из питоновских IDE пользовался только PyCharm'ом. Лучше или хуже — сказать не могу, т.к. сравнивать несчем (кроме менее специализированных текстовых редакторов).
Я тоже сейчас с ним играюсь.
Чего мнетв нем не хватает: В стандартном IDLE после выполнения программы все переменные и функциии остаются в памяти, и через shell с ними можно еще поиграть, повыполнять с ними какие-то действия. В PyCharm после выполнения программы она полностью мертва, и ты с нею уже ничего не можешь сделать. Разве что можно из тамошнего Python shell'а через execfile вызвать выполнение этой же программы, и тогда данные будут доступны оттуда. Но это неудобно, особенно если программа долго работает и требует сложного взаимодейтвия с пользователем. Я что-то делаю не так? Нельзя ли как-то добиться, чтобы послы имполнения скрипта или его дебаггинга его результаты оставались доступными?
Выполнил школьное задание, программа для кодирования/декодирования шифра Цезаря.
print("""== Caesar's encryption/decryption algorithm ==
To switch between encryption/decryption modes, enter a single 'e' or 'd'.
To input encryption key, enter a number 1...25.
To quit, enter 0.""")
def cipher(t):
d = {chr(ord('a')+i):chr(ord('a')+(i+key*encrypt)%26) for i in range(26)}
d.update({chr(ord('A')+i):chr(ord('A')+(i+key*encrypt)%26) for i in range(26)})
return ''.join([d[c] if c.isalpha() else c for c in t])
go_on = True
encrypt = 1
key = 0
while go_on:
u = input()
if u in [str(i+1) for i in range(25)]:
key = int(u)
print('<Encryption key switched to %d>'%key)
elif u == '0':
go_on = False
print('<Quit>')
elif u == 'e':
encrypt = 1
print('<Switched to encryption mode>')
elif u == 'd':
encrypt = -1
print('<Switched to decryption mode>')
else:
print(cipher(u))
Хотелось бы услышать какую-нибудь критику. По организации, по оформлению, по чему-то еще.
Сделал себе сшивалку JPEG и PNG картинок в PDF.
import os
from PIL import Image as image
from reportlab.pdfgen import canvas
from reportlab.lib.units import mm
maxpagesize = (140*mm, 193*mm)
def convertfolder(folder):
if folder[-1] in ('/' or '\\'): folder = folder[:-1]
print('Proceding the folder "%s"'%folder)
filelist = os.listdir(folder)
filelist = [os.path.join(folder, i)
for i in filelist if
i[-4:].lower() =='.png' or
i[-4:].lower() =='.jpg' or
i[-5:].lower() =='.jpeg']
filelist.sort()
pdffilename = folder + '.pdf'
c = canvas.Canvas(pdffilename, pagesize=maxpagesize)
for f in filelist:
with image.open(f) as i:
scale = min(maxpagesize[0]/i.size[0], maxpagesize[1]/i.size[1])
pagesize = (scale*i.size[0], scale*i.size[1])
c.setPageSize(pagesize)
c.drawImage(f, 0, 0, *pagesize)
c.showPage()
c.save()
def convertfolderlist(folderlist):
folderlist = folderlist.split('\n')
folderlist = [i for i in folderlist if i!='']
for i in folderlist: convertfolder(i)
if __name__=="__main__":
convertfolderlist("""
/home/hellerick/Documents/Akiba/Manga/Mangajin/Vol 01
/home/hellerick/Documents/Akiba/Manga/Mangajin/Vol 02
/home/hellerick/Documents/Akiba/Manga/Mangajin/Vol 03
/home/hellerick/Documents/Akiba/Manga/Mangajin/Vol 04
/home/hellerick/Documents/Akiba/Manga/Mangajin/Vol 05
/home/hellerick/Documents/Akiba/Manga/Mangajin/Vol 06
/home/hellerick/Documents/Akiba/Manga/Mangajin/Vol 07
/home/hellerick/Documents/Akiba/Manga/Mangajin/Vol 08
/home/hellerick/Documents/Akiba/Manga/Mangajin/Vol 09
/home/hellerick/Documents/Akiba/Manga/Mangajin/Vol 10
/home/hellerick/Documents/Akiba/Manga/Mangajin/Vol 11
/home/hellerick/Documents/Akiba/Manga/Mangajin/Vol 12
/home/hellerick/Documents/Akiba/Manga/Mangajin/Vol 13
/home/hellerick/Documents/Akiba/Manga/Mangajin/Vol 14
/home/hellerick/Documents/Akiba/Manga/Mangajin/Vol 15
/home/hellerick/Documents/Akiba/Manga/Mangajin/Vol 16
/home/hellerick/Documents/Akiba/Manga/Mangajin/Vol 17
/home/hellerick/Documents/Akiba/Manga/Mangajin/Vol 18
/home/hellerick/Documents/Akiba/Manga/Mangajin/Vol 19
/home/hellerick/Documents/Akiba/Manga/Mangajin/Vol 20
/home/hellerick/Documents/Akiba/Manga/Mangajin/Vol 21
/home/hellerick/Documents/Akiba/Manga/Mangajin/Vol 22
/home/hellerick/Documents/Akiba/Manga/Mangajin/Vol 23
/home/hellerick/Documents/Akiba/Manga/Mangajin/Vol 24
/home/hellerick/Documents/Akiba/Manga/Mangajin/Vol 25
/home/hellerick/Documents/Akiba/Manga/Mangajin/Vol 26
/home/hellerick/Documents/Akiba/Manga/Mangajin/Vol 27
/home/hellerick/Documents/Akiba/Manga/Mangajin/Vol 28
/home/hellerick/Documents/Akiba/Manga/Mangajin/Vol 29
/home/hellerick/Documents/Akiba/Manga/Mangajin/Vol 30
""")
Опять-таки, критика любого рода приветствуется.
Мне одному кажется, что разный подход к мутабельным и иммутабельным объектам, никак не отраженный в синтаксисе языка — это наглое нарушение принципа "явное лучше неявного"?
Я про то, что по записи a=b невозможно заранее сказать, идет ли речь о приравнивании или отождествлении.
Так тема не про бейсик вроде, а про паскаль. :umnik:
Тьфу. Про пайтон.
Цитата: Vertaler от марта 9, 2017, 12:39
Тьфу. Про пайтон.
Мне ваше высказывание не стало понятнее.
Цитата: Hellerick от марта 9, 2017, 12:51
Мне ваше высказывание не стало понятнее.
A = b имеет два значения только в бейсике из известных мне языков.
Цитата: Upliner от июня 30, 2016, 13:51компилятор языка C, написанный на C
Он, всё ж таки, немножко откомпилированный, так что без разницы. Это не то.
Цитата: Lodur от марта 9, 2017, 13:01
Цитата: Upliner от июня 30, 2016, 13:51компилятор языка C, написанный на C
Он, всё ж таки, немножко откомпилированный, так что без разницы. Это не то.
В смысле "немножко откомпилированный"? Где в svn-е gcc откомпилированные файлы?