[ /tv/ /rf/ /vg/ /a/ /b/ /u/ /bo/ /fur/ /to/ /dt/ /cp/ /oe/ /bg/ /ve/ /r/ /mad/ /d/ /mu/ /cr/ /di/ /sw/ /hr/ /wh/ /lor/ /s/ /hau/ /slow/ /gf/ /vn/ /w/ /ma/ /azu/ /wn/ ] [ Main | Settings | Bookmarks | Music Player ]

No.28158 Reply
File: python_logo_3d_by...
Png, 128.36 KB, 800×600
edit Find source with google Find source with iqdb
python_logo_3d_by_technopathic-d4qgd9q.png
File: python_ninja_by_p...
Png, 432.25 KB, 859×1000
edit Find source with google Find source with iqdb
python_ninja_by_plaidklaus-d2z4e07.png

Прошлый тред >>17058 пошёл ко дну, посему Здесь стартует новый.

Краткая справка для новичков:
Официальный сайт: http://python.org/
Документация по стандартной библиотеке и разнообразные Tips & Tricks: http://docs.python.org/
Свежая тема для священной войны, или руководство по выбору между версиями: http://wiki.python.org/moin/Python2orPython3
Ссылка для вопящих про дикие тормоза: http://speed.pypy.org/
>> No.28203 Reply
>>28158
Почему на скриптовом языке стали писать высокоуровневые приложения? Нормально ли это?
>> No.28209 Reply
>>28203
Что в твоем понимании "скриптовый язык" и чем оно отличается от того же дотнета?
> Нормально ли это?
Нормально. На питоне писать в несколько раз быстрее, чем на плюсах, например.
>> No.28210 Reply
>>28158
А есть в Питоне 3 минимизация/максимизация (например, симплекс-методом, чтобы была целевая функция f(x)->min и произвольное количество ограничений вида g_i(X)<=N, h_i(X)=M)? Самому пилить долго, чуть-чуть посмотрел в гугле — вроде ничего не нашёл. Так может кто из анонов знает.
>> No.28211 Reply
File: -.jpg
Jpg, 289.79 KB, 1280×1862 - Click the image to expand
edit Find source with google Find source with iqdb
-.jpg
>>28209
Ну так программа на питоне, просто скрипт, а дотнетовское приложение компилируется в байткод.
>> No.28212 Reply
>>28210
Есть в NumPy/SciPy.
>> No.28213 Reply
>>28211
> программа на питоне, просто скрипт, а дотнетовское приложение компилируется в байткод
Фейспалм.жпг
Программа на питоне тоже преобразуется в байт-код. И яваскрипт преобразуется в байт-код. И любой другой язык, который вообще претендует хоть на какое-то быстродействие, преобразуется в байт-код.
>> No.28214 Reply
>>28212
Нашёл это: http://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.fmi[...].fmin
Симплекс-метод, линейная оптимизация, вроде всё хорошо. Но как туда заносить ограничения?
>> No.28215 Reply
>> No.28216 Reply
>>28215
Параметр "constraints"? Только для методов COBYLA и SLSQP, причём в первом нет ограничений-равенств, а второй требует якобиан (благо, у меня задача линейного программирования). Похоже сильно отличается от того, чему нас учили, но разобраться можно будет. Спасибо.
>> No.28217 Reply
>>28216
Как вариант, ограничения можно вшить прямо в функцию же.
>> No.28218 Reply
>>28217
Хм? Проверять аргументы внутри функции с помощью if-else? Что возвращать если ограничения не работают? Какое-то заведомо большое значение? А это разве не поломает оптимизатор (ибо уже не линейное программирование)?
>> No.28220 Reply
>>28216
SLSQP производной не требует
>>> from scipy.optimize import minimize
>>> def f(x):
...     return (x[0] - 2) ** 2 + 10
... 
>>> res = minimize(f, [0.0], method='SLSQP')
>>> print res.x
[ 2.]

>>> res = minimize(f, [0.0], method='SLSQP', bounds=((-100.0,  1.0),))
>>> res
  status: 0
 success: True
    njev: 2
    nfev: 6
     fun: 10.999999999999996
       x: array([ 1.])
 message: 'Optimization terminated successfully.'
     jac: array([-1.99999988,  0.        ])
     nit: 2
>> No.28221 Reply
>>28220
Но ведь в это примере нет constraints, а производная именно там:
> constraints : dict or sequence of dict, optional
> Constraints definition (only for COBYLA and SLSQP). Each constraint is defined in a dictionary with fields:
> type: str
> Constraint type: ‘eq’ for equality, ‘ineq’ for inequality.
> fun: callable
> The function defining the constraint.
> jac: callable, optional
> The Jacobian of fun (only for SLSQP).
>> No.28222 Reply
>>28221
Ну вот тебе с ограничениями:
>>> res = minimize(f, [0.0], method='SLSQP', bounds=((-100.0,  1.0),), constraints={'type': 'ineq', 'fun': lambda x: f(x) - 12})
>>> res
  status: 0
 success: True
    njev: 5
    nfev: 15
     fun: 12.000000000108864
       x: array([ 0.58578644])
 message: 'Optimization terminated successfully.'
     jac: array([-2.8284272,  0.       ])
     nit: 5
>> No.28223 Reply
>>28222
ОК, признаю, я слепой.
> jac: callable, optional
Спасибо, это упростит задачу.
>> No.28239 Reply
File: 4b5d6e3307966b2b93d3d8ba8acb0b12.jpg
Jpg, 423.93 KB, 1000×950 - Click the image to expand
edit Find source with google Find source with iqdb
4b5d6e3307966b2b93d3d8ba8acb0b12.jpg
Анончик, опять думал тебе вопрос задать, но сам разобрался уже.
С наступающим тебя!
>> No.28251 Reply
File: foverver-с-компом.jpeg
Jpeg, 32.23 KB, 470×275 - Click the image to expand
edit Find source with google Find source with iqdb
foverver-с-компом.jpeg
>>28239
Ога, тебя тоже.
>> No.28256 Reply
инфо:сижу на виндах xp sp2 и 7 sp1. Пользуюсь python 3.3.
что нужно: Нужно получить текст, выводимый виндовой консолью при обращении к ней.
В чём проблема: в кодировке.
при использовании функции sys.getfilesystemencoding() получаю результат 'mbcs' блять.
Значит в консоли используется эта кодировка? Она же не поддерживается питоном?
>> No.28257 Reply
Анон, каким инструментарием можно реализовать следующий алгоритм:
одновременно запускаются некоторая процедура, а также таймер обратного отсчета. Процедура может завершиться раньше, или позже того, как выйдет время по таймеру. Если процедура завершается раньше, то она ждет, пока не выйдет таймер, а потом таймер с процедурой запускаются по новой. Если к моменту завершения процедуры таймер уже вышел, то процедура с таймером опять же перезапускаются. Чтобы не зациклиться навечно, процедура может проверять некоторое значение и завершать цикл.
Мне в голову приходят только очереди с блокировками, но я совсем не уверен, что это по теме.
>> No.28258 Reply
>>28257
Делаешь два потока, в одном time.sleep(), в другом твоя процедура.
>> No.28259 Reply
Я обнаружил баг/фичу, вот такую. В данный момент ищу объяснения сам, но вдруг кто-то пошлёт меня куда надо раньше:
def f (l = [], addr = [0]):
for el in l:
    addr[-1]+= 1
    print str(addr) + ':' + str(el)
    if (type(el) == list):  # sublist
        addr.append(0)
        f(el, addr)
    else:
        pass
return addr
Здесь три сосны и заблудиться негде, но эта функция умеет сохранять состояния переменной addr между вызовами. Я нуб конечно, и не читал внимательно про объявления ф-ций (сейчас читаю), но это выпало меня в осадок:
> > > print f ([1, 2, ['a', 'b']])
[1]:1
[2]:2
[3]:['a', 'b']
[3, 1]:a
[3, 2]:b
[3, 2]
> > > print f ([1, 2, ['a', 'b']])
[3, 3]:1
[3, 4]:2
[3, 5]:['a', 'b']
[3, 5, 1]:a
[3, 5, 2]:b
[3, 5, 2]
> > > print f ([1, 2, ['a', 'b']])
[3, 5, 3]:1
[3, 5, 4]:2
[3, 5, 5]:['a', 'b']
[3, 5, 5, 1]:a
[3, 5, 5, 2]:b
[3, 5, 5, 2]

как такое может быть, если никаких глобальных переменных я не объявлял? Выходит, при повторном запуске она стартует с того места, где остановилась? Но зачем?
>> No.28260 Reply
>>28259
Это не баг, это стандартная ловушка для новичков. Инициализация дефолтных значений происходит только при объявлении функции, а не при её вызове. Поэтому нельзя использовать мутабл значения, если ты не хочешь таких вот эффектов.
В документации это специально подчеркивается.
>> No.28261 Reply
Вот это в документации,
http://docs.python.org/2/reference/compound_stmts.html#function-definitions
> Default parameter values are evaluated when the function definition is executed. This means that the expression is evaluated once, when the function is defined, and that the same “pre-computed” value is used for each call. This is especially important to understand when a default parameter is a mutable object, such as a list or a dictionary: if the function modifies the object (e.g. by appending an item to a list), the default value is in effect modified. This is generally not what was intended.
Выделено специально болдом даже.
>> No.28262 Reply
File: красивая-девушка-с-веснушками.jpg
Jpg, 59.90 KB, 544×544 - Click the image to expand
edit Find source with google Find source with iqdb
красивая-девушка-с-веснушками.jpg
>>28260
>>28261
вот вам няшечка
>> No.28266 Reply
File: guido-van-rossum_x270.jpg
Jpg, 21.79 KB, 270×270 - Click the image to expand
edit Find source with google Find source with iqdb
guido-van-rossum_x270.jpg
>>28259
> Но зачем?
Фюрерок так захотел.
>> No.28269 Reply
>>28257
Я бы сделал так:
  
import threading
  
def timed_func(timeout):
    job_is_done = False
    
    still_alive = threading.Event()
    still_alive.set()
    
    timer = threading.Timer(timeout, still_alive.clear)
    timer.start()
    
    while still_alive.is_set() and not job_is_done:
        # raise job_is_done flag then continue instead of just break!
        ...
        do some stuff..
        ...
    
    else:
        timer.join()  # wait for the timer to finish
    
    timer.cancel()
while True: timed_func(3)
>> No.28271 Reply
File: 1356552500571.jpg
Jpg, 62.95 KB, 754×900
edit Find source with google Find source with iqdb
1356552500571.jpg
File: 1356553431966.jpg
Jpg, 127.89 KB, 1152×1565
edit Find source with google Find source with iqdb
1356553431966.jpg
File: 1356553784674.jpg
Jpg, 160.04 KB, 1000×1332
edit Find source with google Find source with iqdb
1356553784674.jpg

>>28269
Огромное спасибо!
>> No.28411 Reply
Какая может быть мотивация использовать IPython? Как вы его используете?
>> No.28450 Reply
В программировании полный ноль. Начал изучать python с книги Лутца Изучаем Питон 4 издание. Всё правильно делаю? И да, как правильно читать офф. документацию?
>> No.28469 Reply
>>28450
> Всё правильно делаю?
Нет. В твоём случае начинают с SICP (который на Scheme). Точнее, с http://courses.csail.mit.edu/6.042/spring12/mcs.pdf. Точнее, с курса английского языка.
>> No.28471 Reply
Real World Haskell
>> No.28472 Reply
>>28450
> > В программировании полный ноль.
Я вот с этого начал:
http://younglinux.info/python.php
Имея до этого только чуть завышенный школьный уровень. По моему очень годно написано. Правда только про ветку 2.x
> > как правильно читать офф. документацию?
А как читать её неправильно?
>> No.28566 Reply
>>28210
Толи в NumPy, толи в SciPy (библиотеки) есть твои методы.
>> No.28582 Reply
Добра всем. Недавно решил подучить какой-нибудь язык для выполнения нужных мне задач. Решил взять Питон, поскольку в последнее время был у меня на слуху. Как упражнение для ознакомления, написал ознакомительный скрипт для парсинга страницы нашей гос. транспортной компании и выдачи времени, через которое на остановке появится следующий автобус. Думаю оформить это в виде приложения на Симбиан, которое будет висеть виджетом на главном экране телефона. Сейчас допиливаю систему кеширования для того, чтобы не приходилось каждый раз лезть в интернет за страницей. Страницу решил распарсить регекспами, благо вероятность ошибки достаточно мала, да и в библиотеки для парсинга ХТМЛ я не въехал =( Плюс не работает ensymble_gui - вообще не реагирует на кнопки, кроме кнопки "Browse". ДА и с гуем пока не разбирался.
https://github.com/CRImier/RSEasy
Оцените?
>> No.28583 Reply
>>28582
> библиотеки для парсинга ХТМЛ
есть Grab: http://grablib.org/docs/ - он основан на lxml
> https://github.com/CRImier/RSEasy
> Оцените?
первое, что бросилось в глаза - несоблюдение code conventions относительно количества пустых строк между блоками кода :3, PEP 8 в общем %%http://www.python.org/dev/peps/pep-0008/%%. Больше пока ничего не скажу, потому что мимопробегал и некогда.
>> No.28585 Reply
>>28583
Присоединяюсь и добавлю, что модуль "main" нечитаемый. Также import не в начале, а в разных местах кода разбросаны.
В некоторых функциях коменты делать пытаешься. После объявления функции используй лучше docstring:
def func():
  """ Return that""" 
Тогда это можно будет прочитать, посмотрев атрибут doc :
print func().__doc__
> #That's all, folks
Ненужные комментарии тоже не по-питоньему. Лучше, если код говорит сам за себя.
>> No.28586 Reply
>>28582
def check_transtp(transtp):
if transtp == "tram" or transtp == "bus" or transtp == "trolleybus" or transtp == "night_bus":
return True
else:
return False
Это ужасно. Лучше так
def check_transtp(transtp):
    return transtp in ["tram", "bus", "trolleybus", "night_bus"]
>> No.28590 Reply
>>28583
Ок, давно собираюсь скачать и почитать =) Спасибо, учту.
>>28585
Как повысить читаемость, по-твоему? Чаще комментировать и по делу? Плюс стиль, конечно же. Уже бегу качать.
>>28586
Если можешь, объясни, как это работает. И кстати, как по мне, мой вариант лучше по читаемости - сразу понятен. Какие подводные камни?
>> No.28591 Reply
>>28583
А, и по твоей библиотеке - реально ли ей легко пользоваться? Будет ли она быстрее, чем моё смешение регекспов? Регекспы планирую потом переделать, конечно. Кеширование доделаю и пересмотрю основные модули.
>> No.28594 Reply
>>28591
Она будет корректнее. "HTML-нельзя-парсить-регэкспами.txt".
Мимоид-в-категории-проходилов
>> No.28595 Reply
>>28590
> объясни, как это работает. И кстати, как по мне, мой вариант лучше по читаемости - сразу понятен.
Разумеется, тебе твой вариант более понятен, так как ты не знаком с оператором in. Тебе стоит сначала почитать учебник, прежде чем что-то писать. Вряд ли кто-то будет тебе объяснять базовые вещи, кроме личного репетитора.
>> No.28596 Reply
>>28590
> Если можешь, объясни, как это работает
Если бы там был set (это который {"tram",... } ), то можно было бы выразиться в терминах "transpt входит в множество {x}" - "transpt in {set}", результат операции - True или False (входит и не входит, соответственно).
А с [list] аналогично же.
Таки да, читни учебника или документацию, туториал на офсайте.
>> No.28597 Reply
>>28590
> повысить читаемость
А перед тем как их копипастить, разберись как они работают.
У питона замечательная документация с поиском и примерами: http://docs.python.org/2/reference/expressions.html#membership-test-details
исползуй её!
  • Почитай исходники программ похожих на твою и не только, посмотри как они это всё реализовали.
И если возникает необходимость добавить комментарий, который вместо "как этим кодом пользоваться", объясняет "что этот код делает". То скорее всего ты делаешь что то не так. Лучше переписать такой код так, что бы было понятно и очевидно что оно делает, даже без комментариев.
Так как в питоне обычно - нечитаемый код == нерабочий.
>> No.28717 Reply
Реквестирую python-скрипт, который бы делал рассылку сообщений юзерам ВКонтактика.
Мне нужно для доброй цели :3.
Заодно интересуюсь, после скольких сообщений забанят аккаунт.
>> No.28718 Reply
>>28717
Там лимит на 20 юзеров-нефрендов с одного акка в день, так что особо не поспамишь.
>> No.28719 Reply
File: spam-can-collection-2009-09-med.jpg
Jpg, 319.20 KB, 1582×1070 - Click the image to expand
edit Find source with google Find source with iqdb
spam-can-collection-2009-09-med.jpg
>>28718
Спасибо. Мне надо всего-то 216 сообщений.

Посмотрел POST-запросы при отправке сообщений, там везде в параметрах какие-то хэши.
Не знаю, как их выцепить, используя httplib.
Видимо, придётся отправлять сообщения JavaScript'ом из браузера.
>> No.28743 Reply
>> No.28755 Reply
Анон, привет!
Я тут продолжаю постигать глубины распараллеливания и пришел к тебе с вопросом. Есть пример:
#!/usr/bin/env python3

from multiprocessing import Pool
from time import sleep

counter = 0
markers = range(20)

def runner(marker):
	print(marker)

def main():
	if counter == 10:
		raise SystemExit

	pool = Pool(2)
	pool.map(runner, markers)

while True:
	main()
	sleep(3)
	counter += 1
Так вот, когда я его запускаю, то вижу, что отработавшие дочерние процессы до выполнения raise SystemExit не помирают, а продолжают висеть в памяти. Как правильно реализовать их убийство, чтобы не тратить ресурсы впустую?
>> No.28756 Reply
>>28755
Это вроде бы решается вызовом метода join для пула твоего:
http://docs.python.org/3/library/multiprocessing.html#multiprocessing.[...].join
>> No.28757 Reply
File: 030.jpg
Jpg, 194.99 KB, 1620×1080 - Click the image to expand
edit Find source with google Find source with iqdb
030.jpg
>>28756
Точно, добавил две строки:
pool.terminate()
pool.join()
и перестали процессы плодиться. Большое спасибо за подсказку!
>> No.28758 Reply
File: 1359022250443.jpg
Jpg, 309.53 KB, 1000×666 - Click the image to expand
edit Find source with google Find source with iqdb
1359022250443.jpg
>>28757
Даже pool.join() не нужен, и без него работает нормально.
>> No.28759 Reply
>>28758
Без join главное приложение может раньше созданных процессов завершиться, как я понимаю. Если тебя это устраивает, то ок.
>> No.28763 Reply
>>28759
Спасибо за совет, но меня это устраивает, да.

Анон, кажется, я заплутал в областях видимости, погляди своим свежим взглядом, пожалуйста. Вот код, который ведет себя ожидаемо и понятно мне:
#!/usr/bin/env python3

class Hello:
	X = ['browser']
	def __init__(self, x):
		self.x = x

	def translate(self):
		Hello.X.extend(['-new-tab', self.x])

def main():
	hello1 = Hello(1)
	hello2 = Hello(2)
	hello1.translate()
	hello2.translate()

main()
print(Hello.X)
А вот код, в который я добавил мультипроцесс, и который меня удивляет:
from multiprocessing import Pool

class Hello:
	X = ['browser']

	def __init__(self, x):
		self.x = x

	def translate(self):
		Hello.X.extend(['-new-tab', self.x])

def runner(marker):
	inst = Hello(marker)
	inst.translate()

def main():
	markers = range(2)
	pool = Pool(len(markers))
	pool.map(runner, markers)
	pool.terminate()

main()
print(Hello.X)
Почему значение переменной класса не сохраняется в итоге? И можно ли все же его сохранять?
>> No.28772 Reply
>>28763
На каждый новый процесс, multiprocessing, запускает новый интерпретатор с новыми эксземплярами классов.
Поэтому для обмена данных между процессами юзай:
http://docs.python.org/2/library/multiprocessing.html#pipes-and-queues
http://docs.python.org/2/library/multiprocessing.html#managers
>> No.28773 Reply
File: 055.jpg
Jpg, 601.51 KB, 1763×1167 - Click the image to expand
edit Find source with google Find source with iqdb
055.jpg
>>28772
Понятно, спасибо!
>> No.29038 Reply
>> No.29070 Reply
>>29038
Чем тебя модуль io не устраивает?
>> No.29071 Reply
>>29070
уныл и малофичаст же
>> No.29073 Reply
>>29071
Ну, хрен знает, чего тебе не хватает.
О других не слышал как-то. Может ещё кто знает.
>> No.29074 Reply
>>29073
Например, я хочу заменять по регулярке вхождения из входного стрима в выходной стрим, как юниксовым sed'ом можно делать. Потом мне нужна например функция read_until, которая читает символы из потока в строку, пока не встретится определенный шаблон. Я понимаю, что все это можно навелосипедить, но я уже говорил, что не хочется.
>> No.29081 Reply
>>29074
> изменять стрим по регулярке
Питоновский .re не умеет в стримы, только строки или буфферы.
> read_until
Смотри itertools.
http://docs.python.org/2/library/itertools.html
>> No.29083 Reply
не холивара ради, объясните постигающему преимущество джанго перед пхп. Начинаю пилить городской сайт, решил писать на питоне, поскольку его я знаю лучше пхп. Но есть сомнения в целесообразности. Хостинг для джанго дороже обычного пхп+мускул. спасибо.
>> No.29101 Reply
>>29083
> преимущество джанго перед пхп
Такового не имеется, в джангу ещё пару лет назад набижала толпа похапешников и понатащила туда своих кривых мыслительных шаблонов.
>> No.29105 Reply
>>29101
Можешь провести аналогии и привести примеры?
>> No.29125 Reply
>>29083
За неимением гербовой (руби) пиши лучше на туалетной (пхп).
> объясните постигающему преимущество джанго перед пхп.
Его знает меньше кулхацкеров, из-за чего риск взлома твоего поделия теоретически меньше.
>> No.29126 Reply
>>29125
LOL!
>> No.29167 Reply
File: aigis1.jpg
Jpg, 36.15 KB, 250×333 - Click the image to expand
edit Find source with google Find source with iqdb
aigis1.jpg
Вот мой сокет:
s = socket.socket(socket.AFINET, socket.SOCKDGRAM)
PORT = 8000
s.settimeout(None)
s.bind(('localhost', PORT))
while True:
   data, address = s.recvfrom(4096)
   print data
   print address
Почему когда в браузере я ввожу 127.0.0.1:8000 я не вижу GET
запрос(там где print data)?
>> No.29168 Reply
>>29167
SOCK_DGRAM - это UDP, поэтому попробуй:
echo "qwerty" | nc -u localhost 8000
и всё должно заработать.
>> No.29171 Reply
File: aigis2.jpg
Jpg, 25.89 KB, 397×298 - Click the image to expand
edit Find source with google Find source with iqdb
aigis2.jpg
>>29168
У меня не установлено nc. На что нужно SOCK_DGRAM заменить?
>> No.29172 Reply
>>29171
Скорее всего тебе нужен SOCK_STREAM (TCP) про остальные есть в man/mdsn, но тогда придётся добавить:
s.listen(backlog)
сonnection, address = s.accept()
перед
data = сonnection.recv(1024)
так как TCP на сколько я знаю не умеет получать данные, не установив заранее соединение.
>> No.29173 Reply
File: kurisu2.jpeg
Jpeg, 272.40 KB, 857×643 - Click the image to expand
edit Find source with google Find source with iqdb
kurisu2.jpeg
>>29172
Чаю тебе, анонимный. Никогда не обращал внимания на accept(), а он, оказывается, нужен.
>> No.29200 Reply
File: yrfFDiB1lXYXRhhxZlKKIOqbJ72Et-N0TJB1Nad5Qe8.jpeg
Jpeg, 54.38 KB, 576×768 - Click the image to expand
edit Find source with google Find source with iqdb
yrfFDiB1lXYXRhhxZlKKIOqbJ72Et-N0TJB1Nad5Qe8.jpeg
Помогите, пожалуйста. Вот код:
http://pastebin.com/1gWqPhdL
Ошибка вот в этом блоке
for yy in range (MAP_HEIGHT):
for xx in range (21):
    if smap[yy][xx]=='#':
        map[yy][xx]=Tile(True)
По идее в строчке in range(21) Должно стоять значение MAP_WIDTH, которое равно 46. Это значение длины строки из массива smap(Он по ссылке, вставлять сюда не встал, так как большой).
Так вот, если в for xx in range(): стоит больше 20, то возникает ошибка list assignment index out of range. Но почему?! Ведь в каждой строчке из smap больше 20 значений!
Более того, до этого я спокойно делал
for y in range(SCREEN_HEIGHT):
for x in range(SCREEN_WIDTH):
    if smap[y][x] == '#':
        ....далее присваивание...
И это работало.
Помогите, второй день не могу понять что к чему.
>> No.29201 Reply
>>29200
У тебя вот здесь:
map = [[Tile(False)
                for y in range(MAP_HEIGHT) ]
                        for x in range(MAP_WIDTH) ]
Создается матрица на 46 строк и 20 столбцов. А тебе надо наоборот, наверно.
>> No.29211 Reply
>>29200
А почему сразу не
map_ = [[Tile(cell == '#') for cell in row] for row in smap]
?
и не каких IndexError.

Олсо
if block_sight == False
   - жесть, достаточно
self.block_sight = block_sight or blocked
>> No.29214 Reply
>>29201
http://www.python.org/dev/peps/pep-0008/
> Use 4 spaces per indentation level.
>> No.29217 Reply
File: 075.jpg
Jpg, 93.31 KB, 510×378 - Click the image to expand
edit Find source with google Find source with iqdb
075.jpg
>> No.29225 Reply
>>29201
Да, ты оказался прав. Спасибо тебе.
>>29211
Я только учусь кодить. Спасибо за замечания.
>> No.29239 Reply
File: 095.jpg
Jpg, 163.55 KB, 1024×960 - Click the image to expand
edit Find source with google Find source with iqdb
095.jpg
>>29211
А существует ли некий сборник подобных питоньих best practice, или это собирается по крохам, и приходит с опытом?
>> No.29240 Reply
>>29239
Болшенство из них есть в документациии, остальное гуглится, читается, спрашивается, придумывается.
>> No.29244 Reply
Ещё довольно много людей ведут блоги.
Мне понравились вот эти парни:
http://www.dabeaz.com/talks.html
http://nedbatchelder.com/

Это какой-то "мануал по философии Python":
http://python.net/~goodger/projects/pycon/2007/idiomatic/presentation.html
>> No.29245 Reply
>>29240
>>29244
Спасибки.
>> No.29275 Reply
File: 1360607227551.jpg
Jpg, 70.52 KB, 576×459 - Click the image to expand
edit Find source with google Find source with iqdb
1360607227551.jpg
Вот еще вопрос. Я решил ввести еще и цвет тайтла.
class Tile:
def __init__(self, blocked,color,block_sight = None):
    self.color=color 
Дальше:
wall_wood=Tile(True, libtcod.green)

Когда дальше я делаю присваивание
for y in range(100):
for x in range(100):
    if maps[y][x]=='#':
        map[x][y]=wall_wood
Выходит ошибка:
TypeError: 'builtinfunctionormethod' object has no attribute 'getitem_'
Как я понимаю этого от того, что я объявляю color внутри функции. Как его сделать доступным всей программе? И почему, когда я делал просто
map[x][y]=Tile(False) не было никаких ошибок?
>> No.29287 Reply
>>29275
http://docs.python.org/2/library/functions.html#map
Именно поэтому считается дурным тоном, маскировать объекты из __builtin__. а так же использовать global, nonlocal и т.п. без явной надобности.
>> No.29290 Reply
>>29287
Я переобозначил функцию map. Теперь это у меня список.
Мне кажется, что ты меня не совсем понял.
>> No.29292 Reply
>>29290
Ну тода проверяй что за builtin function or method и что он делает у тебя в списке.
Или переписывай без злоупотребления индексами, что бы было сразу понятно что, откуда и куда.
>> No.29293 Reply
>>29292
Вот смотри. Неболььшой код.
class lol:
   def init(self, color):
   self.color=color
palitra=lol('red')

maps=[]
for x in range(10):
   for y in range(10):
   maps.append(palitra)
print maps[1].color

Ошибок никаких нет, но если я делаю
print maps[1][1].color
То у меня вылетает ошибка lol instance has no attribute 'getitem'
Почему?
>> No.29297 Reply
>>29293
Всё правильно, метод __getitem__, у эксземпляра класса lol не определён.
Поэтому palitra[1] вызывает соответствующую ошибку. Так же, list.append добавляет объекты к концу списка, а судя по двойному циклу, ты наверное хотел создать вложенный список, матрицу как сдесь: >>29211
>> No.29299 Reply
>>29297
Ясно. Спсибо за помощь. Буду разбираться с этим.
>> No.29305 Reply
>>29297
Здесь, здание, здоровье. Запомни уже блджадь!
>> No.29306 Reply
>>29305
Да он даже не знает, зачем нужны спойлеры, - куда уж ему запомнить правила.
>> No.29332 Reply
File: picurlfail.png
Png, 155.10 KB, 1365×744 - Click the image to expand
edit Find source with google Find source with iqdb
picurlfail.png
Котаны, что делать с таким выводом?
>> No.29347 Reply
>>29332
Можно добавить хидер с юзерагентом, чтобы обмануть, например.
>> No.29348 Reply
>>29347
> хидер
Что это?
>> No.29351 Reply
>> No.29352 Reply
>>29351
аа, но так ведь это [`hedə] читается!
>> No.29353 Reply
>>29352
Устоявшийся термин.
>> No.29354 Reply
Есть Python 3.2.3. Также имеются несколько скриптов, на данном питоне написанные. В директории со скриптами я выполнил python3 -O -m compileall *py. Была создана директория pycache с кучей файлов .pyo. Размер этих скомпилированных файлов получился больше, чем у нескомпилированных, что нелогично. Отчего так?
>> No.29355 Reply
>>29354
Точнее даже так: насколько я понял, цель компиляции в том, чтобы уменьшить размер файла и сократить время на его чтение, что приведет к повышению быстродействия. А тут такое.
Какие еще есть рабочие методы ускорения для третьего питона?
>> No.29356 Reply
>>29353
Нет, правда?
>> No.29357 Reply
>>29354
Почему это нелогично, по-твоему?
>> No.29358 Reply
>>29357
Больший файл дольше читается.
Вот тут >>29355 написал.
>> No.29359 Reply
>> No.29360 Reply
>>29359
Вот оно что, спасибо.
>> No.29367 Reply
File: 21312 .jpg
Jpg, 131.64 KB, 720×576 - Click the image to expand
edit Find source with google Find source with iqdb
21312 .jpg
>>29347
Держи неку, умняша.
>> No.29448 Reply
File: 1243193066113.jpeg
Jpeg, 101.24 KB, 572×720
Your censorship settings forbid this file.
unrated
Не уверен что по адресу, проблема такая:
Есть динамический url. Кусок который меняестся получаю через Foo.objects.get(bar=eggs) из бд, это внутры блока try. Если такого нет, то должно вызыватся исключение DoesNotExist. Но мне выдает NameError: global name DoesNotExist undefenned. Если обрабатывать NameError, то получаю ошибку DoesNotExist
>> No.29449 Reply
>>29448
Не понимаю, о какой СУБД идет речь, но, боже мой, обработай оба исключения, делов-то.
>> No.29451 Reply
>>29448
NameError тебе говорит, что ты не импортировал DoesNotExist, перед тем как его использовать.
>> No.29459 Reply
File: 1235058431566.jpg
Jpg, 116.56 KB, 480×499
Your censorship settings forbid this file.
unrated
>>29449
В except пишу оба через or и получаю NameError
>>29451
Импортирую оба модуля которые есть в выводе ошибки query manager - ничего не меняется.
%%File "/usr/lib/python2.7/site-packages/django/db/models/manager.py", line 131, in get
return self.get_query_set().get(*args, **kwargs)
   File "/usr/lib/python2.7/site-packages/django/db/models/query.py", line 366, in get
% self.model._meta.object_name)
DoesNotExist: Post matching query does not exist.%%
>> No.29473 Reply
>>29459
При импортировании модуля, его содержимое не попадает ни в locals, ни в globals.
Так что:
Или каждый раз указывай полный путь до объекта except foo.bar...baz.DoesNotExist:.
Или определи соответствующее имя в видимом пространстве имён DoesNotExist = foo.bar...baz.DoesNotExist (чтобы не обращаться каждый раз к foo,bar,baz...).
Или импортируй нужный объект из модуля from foo.bar...baz import DoesNotExist, если сам модуль foo тебе не нужен.
>> No.29484 Reply
>>29473
Не работает даже с приставкой модуля. Если from foo.bar...baz import DoesNotExist то получаю атрибутЭрор.
Хотя проблема уже решилась использованием getobjector_404
>> No.29616 Reply
>>29484
лови TvoyaModelClass.DoesNotExist
>> No.29620 Reply
File: 1269374836_python-3.jpeg
Jpeg, 24.22 KB, 278×400 - Click the image to expand
edit Find source with google Find source with iqdb
1269374836_python-3.jpeg
Доброчан, выхожу из ридонли.
Так все-таки, поясните мне прямо, какую ветку питона нужно изучать, если в будущем планируется работать с django? И живо ли еще все это? Я просто не в теме.

Поясните за книгу на пике, так как я 2 года изучал java в универе, то Лутц я думаю мне не нужен. Все правильно делаю?
>> No.29622 Reply
File: 1334663934327.png
Png, 720.07 KB, 685×1000 - Click the image to expand
edit Find source with google Find source with iqdb
1334663934327.png
>>29616
Это работает! Спасибо.
>> No.29630 Reply
File: zx.jpg
Jpg, 21.38 KB, 299×300 - Click the image to expand
edit Find source with google Find source with iqdb
zx.jpg
>>29620
Поясняю. Так называемые фреймворки - это первый признак того, что язык перестал соответствовать требованиям той области, где используется, и вокруг него строят нагромождение костылей. Так было с Паскалем, Жаббой, Пыхом и ПЛ/1.

Гвидо ван Россум знает об этом и спокойно пилит третью версию языка.

%%А вокруг бегает толпа обезьян с дикими воплями: "джанго", "соцсети", "хайлоадЪ", "фреймворки"...
Но живо ли ещё всё это? Я тоже не в теме.%%
>> No.29639 Reply
>>29630
Вообще-то недавно вышел Django 1.5 с экспериментальной поддержкой Python 3, а следующая версия, 1.6, запланирована как версия, полностью готовая для использования 3-й ветки языка.
>> No.29645 Reply
>>29630
> фреймворки - это первый признак того, что язык перестал соответствовать требованиям той области, где используется, и вокруг него строят нагромождение костылей
Python - опенсорсный проект. Если в него запихать все все все, то его станет нереально поддерживать сообществу. Лучше меньше, но лучше.
>> No.29664 Reply
>>29620
Советую Третьепитон кроме тех случаев когда нужно особые библиотэки, см. https://python3wos.appspot.com/ например.
>> No.29707 Reply
>>29630
> Так называемые фреймворки - это первый признак...
Хуйню вы несете, товарищ.
Веб, графика, гуй — все подобные вещи в любом языке делаются через фреймворки, чтобы для типикал приложения не изобретать стотыщмиллионов раз изобретенные до этого велосипеды.
> Гвидо ван Россум знает об этом и спокойно пилит третью версию языка.
Питон3 никак на фреймворки не влияет вообще, у него другое назначение — устранить ряд багов в core features.
>> No.29708 Reply
>>29707
Вот и выросло поколение, не заставшее Windows 3.x
>> No.29709 Reply
>>29708
говно операционка была же
>> No.29712 Reply
>>29708
Это важно только для тех, кто застал.
>> No.29868 Reply
File: Снимок.JPG
Jpg, 38.98 KB, 685×440 - Click the image to expand
edit Find source with google Find source with iqdb
Снимок.JPG
Питоняши, подскажите, как вы настраиваете Sublime Text 2 под Windows, чтобы он делал Build по Ctrl+B, пик рилейтед. Хоть и "C:\python27\" есть в PATH, конфиг все равно не понимает ни относительного, ни полного пути к интерпретатору. В cmd.exe Python запускается нормально.
>> No.29869 Reply
>>29868
Шиндовс не для питона и не для программирования в целом.
>> No.29871 Reply
>>29869
> и не для программирования в целом
Orly? Пруфы или КУДАХ-ТАХ-ТАХ
>> No.29874 Reply
>>29871
В линупсах тулчейны устанавливаются и обновляются одной командой в концольке, в шинде всё через жёпу, нужны таблэтки или покупать и не юнегз нихера.
>> No.29877 Reply
>>29868
Решил проблему с помощью SublimeREPL: https://github.com/wuub/SublimeREPL

А вы, вместо того, чтобы разводить софтосра симпозиумы, занялись бы делом. Книги сами себя не прочитают, скиллы сами себя не разовьют.
>> No.29881 Reply
>>29874
> в шинде всё через жёпу
Сначала хотел согласиться, но потом вспомнил, что в Линуксе не так много отличий в установке. А общих проблем, зачастую, больше.
> нужны таблэтки или покупать
Нет. Достаточно свободного кроссплатформенного ПО.

>>29877
Эх.
>> No.29890 Reply
Можно как-то передать параметры от одной функции в другую, не исользую яглобальные переменные?
>> No.29899 Reply
>>29890
Вызвать из одной функции другую и вернуть результат последней? Или если что-то совсем специфическое — можно использовать именованные аргументы. Опиши проблему конкретнее.
>> No.29900 Reply
>>29890
Можно, используя классы. Если у тебя есть какое-либо состояние, не мучай жопу, используй сразу по дефолту классы, в питоне они для хранения состояния идеально подходят.
>> No.29922 Reply
>>29899
Вот спасибо тебе. Именно так и сделаю.
>>29900
Именно в этой программе я классы не использую.
А что вообще такое функция в питоне. В классическом понимании она должна возвращать значение, но её можно использовать, как модуль, например, в паскале, то есть просто выполнять какие-либо действия.
>> No.29924 Reply
>>29922
Коряво как-то выразился, но надеюсь, что вы поймете.
>> No.29928 Reply
>>29922
Когда используешь ее как модуль - можно считать что она возвращает выбранную функцию
>> No.29931 Reply
>>29922
"функция" в питоне - это объект с определённым методом __call__.
> class Foo(object): pass
> x = Foo()
> callable(x)
False
>>> x(3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'x' object is not callable
>>> Foo.__call__ = lambda s, y: y*y
>>> callable(x)
True
>>> x.__call__(4)
16
>>> x(4)    # краткая запись вызова __call__
16
>>> def foo(y): return y*y
>>> dir(foo)
['__annotations__', '__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__doc__', ..., '__str__', '__subclasshook__']
>>> isinstance(foo, object)
True
>>> foo.__call__(4)
16
>> No.29969 Reply
File: 1293782727166.gif
Gif, 87.87 KB, 365×361 - Click the image to expand
edit Find source with google Find source with iqdb
1293782727166.gif
Написал программу, которая скачивает постеры к фильмам, указанным в файле, заполняемым пользователем, и распологает их на картинке.
Тобишь составляет адвайс листы.
Может тут найдутся гуру питона, которые укажут, куда мне нужно смотреть, что именно в коде я сделал не так.
http://pastebin.com/bYkwjyEE
>> No.29998 Reply
Что скажете про гуи на питоне?
Какой лучше выбрать? Qt? Gtk? Нужна кросплатформенность.
http://wiki.python.org/moin/GuiProgramming
>> No.29999 Reply
>>29998
Третий год клепаю их на питоне, до этого писал на плюсах.
Однозначно PyQt, с т.з. разработки он на голову обходит конкурентов. Есть определенный геморрой в упаковке результата под виндовз, но не смертельно. Результат получается как правило от 100МБ, но опять же, по нынешним меркам не смертельно.
>> No.30005 Reply
File: jp_g1241241.jpeg
Jpeg, 47.81 KB, 493×740 - Click the image to expand
edit Find source with google Find source with iqdb
jp_g1241241.jpeg
>>29969
Все что сразу бросаются в глаза:

global database и global text убери, функции и так имеют доступ к глобальным переменным.

На функции там разбит весь код для того, чтобы понятно было что какой кусок делает? Можно было оставить комментарии. У тебя читабельность больше страдает, вкупе с тем, что ты жадный до пробелов.

if line[0]=='$': None ... else: тоже лишняя конструкция. У тебя четыре раза открывается один и тот же файл, но нигде ты его не закрываешь.

В функции download у тебя два раза проверка на наличие постера.

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

Переменная text служит только для получения числа строк начинающихся с $? Тоже нужно что-то с этим сделать, потому как ты рад этого открываешь файл заново, создаешь совершенно лишний список. Можно в первой же функции посчитать эти строки там где у тебя if line[0]=='$': None Модуль math ты так и не использовал.

>>29999
Доброчую, сам пользовался обоими вариантами — приятнее PyQt.
>> No.30010 Reply
>>30005
Спасибо, что потратил время на меня. Научиться писать хороший код-действительно важно для меня.
А разве файл сам не закрывается после совершения операции над ним?
>> No.30014 Reply
>>30010
> А разве файл сам не закрывается после совершения операции над ним?
Нет. Файл закрывается когда объект удаляется, но в питоне язык не дает гарантий о времени удаления объектов. Т.е. при завершении программы он удалится, а до этого — как повезет.
>> No.30016 Reply
>>30010
Кроме тех случаев, когда используешь конструкцию wits open(filename) as f:. Так файл будет закрыт даже если будет выкинуто исключение.

В твоем случае, достаточно прочитать текстовый файл один раз и работать уже с его строками.
>> No.30023 Reply
>>29999
>>30005
А вы гуи клепаете через идешки или ручками все?
>> No.30024 Reply
>>30023
Если есть возможность и не лень, то ручками. А так QtDesigner за глаза хватает и всегда можно скомпилить в питоновский файл.
>> No.30027 Reply
>>29999
Сейчас себе на жизнь проганьем на питоне зарабатываешь?
>> No.30031 Reply
>>30027
На жуткой помеси питона и плюсов, у меня куча лоулевел задач (драйверы для железа, которое делают в нашей конторе, код перехвата сетевого трафика и т.д.), которые на питоне делать не кошерно. В основном то, что работает с железом или большими потоками данных на плюсах, а гуй и вспомогательные скрипты на питоне.
>> No.30032 Reply
>>30023
Я в результате к такой формуле пришел — формы и виджеты рисую в QtCreator, сохраняю их в .ui файлы, а потом их конпелирую в питон через pyuic4, там довольно няшное разделение кода создания виджета и логики (обработки евентов и т.д.) получается, есть UI модуль, есть модуль с логикой.
>> No.30033 Reply
>>30032
Вот так выглядит та часть, которую я руками писал, http://pastebin.com/bmRQ3ZKe
Остальное всё сгенерировано pyuic4
>> No.30037 Reply
>>29969
Я не гуру, а так мимоновичек, но мне понравилась задача и захотелось её по-своему сделать как упражнение. Не знаю, вдруг, тебе интересно будет, а мне, если повезёт, может быть тоже немного критики перепадет.
Так как imdbapi прекрасно отдаёт JSON, то я подумал, что не стоит связываться с этим XML и парсингом. Соответственно beautifulsoup не нужна, тем что она у меня не захотела устанавливаться. По тайтлу imdb не всегда находит фильмы, так что без imdb_id, пожалуй, не обойтись. Вообще формат входного файла у меня такой:
tt0133093, The Matrix, Sci-Fi
tt0110912, Pulp Fiction, Crime
Знаю, что по-хорошему бы надо через sys.argv входной и выходной файл сделать. Так сказать для пущего юзабилити. Но я пока плохо с этим разобрался. В общем, вот.
http://pastebin.com/8Jaexy5L
>> No.30042 Reply
File: wallpaper-2331079.jpg
Jpg, 543.24 KB, 1920×1080 - Click the image to expand
edit Find source with google Find source with iqdb
wallpaper-2331079.jpg
>>30037
Вместо sys.argv лучше попробуй сразу argparse — вдруг решишь расширять функционал.

Кстати о всяких там contains и подобных методов — они являются служебными и вызывать их лучше не напрямую.
То есть в 21 строке вместо if json[0].__contains__('poster'): использовать if 'poster' in json[0]: Я смотрю увлекся ты генераторами списков unique_genres = [item for item in set(genres)] почему бы не упростить list(set(genres)) ?

И в 35 строке, как он себя поведет при жанрах написанных в разном регистре? То есть когда работаешь с пользовательским вводом всегда стоит принимать во внимание то, что данные могут быть не совсем валидными. Это все конечно не критично, но лучше не забывать. А то получится у тебя два разных жанра Drama и drama.

Так же можешь почитать про функцию map, она упростит подсчет максимального числа постеров примерно до max(map(genres.count, genres)) и в дальнейшем будет очень полезной.

requests так же нормально грузит бинарные файлы.

Ну и опять же файл открывается два раза, первый раз он так и не закрывается. Операции чтения и записи всегда являются узким местом.

А вообще практика хорошая, можно в дальнейшем что-нибудь посложнее, как вариант: подсчет слов на странице и создания облака слов подобно wordle.net.

Заказанная критика. Понимаю, глаз замыливается, через пару дней даже можно перечитать код — найдешь новые более элегантные решения.
>> No.30049 Reply
>>30037
В get_poster_url, if 'poster' in json[0]: будет читаться лучше вызова if json[0].__contains__('poster'):, а ещё лучше будет заменить всю эту конструкцию на: return json[0].get('poster') Для подсчета жанров (и Number of posters in each column), вместо кучи списков удобнее использовать Counter http://docs.python.org/2/library/collections.html#counter-objects
from collections import Counter
  
genres = Counter(l.split(',')[2].strip() for l in open('films.txt', 'r'))
unique_genres = list(genres.keys())
max_posters = max(genres.values())
На 61-63й строке не нужно вызывать split три раза подряд, mdb_id, title, genre = (i.strip() for i in line.split(',')) Но это всё мелочи..
Лишняя возня с индексами и списками, повторное чтение из файла, намекают тебе на неудачную структуризацию данных.
А код обработки исходных данных, загрузки постеров и генерации картинки (строки 59-88) перемешан в одном большом цикле.

Попробуй разделить код на блоки, чтобы в одно время выполнялась только одна задача и подбери подходящую структуру данных для хранения списка фильмов, например: namedtuple http://docs.python.org/2/library/collections.html#collections.namedtuple
from collections import namedtuple
_Movie = namedtuple('Movie', 'mdb_id, title, genre, poster')
def Movie(mdb_id, title, genre, poster=None):  # workaround for default "poster" argument
    return _Movie(mdb_id, title, genre, poster)
  
# read movies from file
movies = [Movie(*(i.strip() for i in line.split(',', 2)))
          for line in open('films.txt', 'r')]
теперь чтобы посчитать жанры достаточно:
genres = Counter(m.genre for m in movies)
или скачать все постеры:
for mov in movies:
    p_url = get_poster_url(mov.mdb_id)
    if p_url:
        mov.poster = urlopen(p_url).read()
отсортировать по жанру:
movies.sort(key=lambda m: m.genre)
и так далее..
>> No.30052 Reply
File: 5a08bbf94914.jpg
Jpg, 168.63 KB, 1024×768
edit Find source with google Find source with iqdb
5a08bbf94914.jpg
File: 26451eba6dcb.jpg
Jpg, 161.63 KB, 1024×819
edit Find source with google Find source with iqdb
26451eba6dcb.jpg
File: 49529980fb76.jpg
Jpg, 208.52 KB, 1024×768
edit Find source with google Find source with iqdb
49529980fb76.jpg
File: 82ef0f53c9da.jpg
Jpg, 199.71 KB, 1024×683
edit Find source with google Find source with iqdb
82ef0f53c9da.jpg

>>30042
>>30049
Спасибо, доброкодеры. Вот вам немного кристаллов.
>> No.30053 Reply
>>30052
На первой картинке черепашка?
>> No.30056 Reply
File: 5a08bbf94914m.jpg
Jpg, 240.74 KB, 1024×768 - Click the image to expand
edit Find source with google Find source with iqdb
5a08bbf94914m.jpg
>>30053
Зачем ты это сказал? Она мне теперь приснится.
>> No.30115 Reply
>>30042
Кроме того, что спецметоды напрямую не используются, там блок if-else, легко заменяется на
return json[0].get('poster', False)

Не забывайте, друзья, про замечательный метод .get у словарей, который не создает эксепшн и может возвращать дефолтное значение, если указанный ключ отсутствует.
>> No.30116 Reply
>>30115
Сори, анон 30049 уже упомянул об этом.
>> No.30119 Reply
>>30049
>>30115
Это я пропустил, спасибо за исправление. В его случаи, это лучший вариант.
В других случаях же, это может стать плохой практикой — все же значение может и быть как и None так и False.
>> No.30132 Reply
Поясните за распараллеливание. Что есть годного почитать из этого. Смотрел туториалы в интернете и ни черта не понял.
И можно ли обмениваться значениями между функциями, или будет мешать GIL? Ну то есть надо, чтобы по массиву проходили две функции, и при их обмене, если выполняется какое-то условие, то элементы массива бы изменялись.
>> No.30136 Reply
>>30132
> можно ли обмениваться значениями между функциями процессами
Можно.
http://docs.python.org/3/library/multiprocessing.html?highlight=multip[...]esses
Но для
> по массиву проходили две функции
распараллеливание не нужно.
>> No.30137 Reply
>>30132
Если грубо, в питооне распараллеливание по потокам имеет смысл только для i/o операций. Открытие и чтение файлов, граббинг веб-страничек, запись в БД и все такое. Для этого GIL мешать почти не будет.
Чистую математику можно бить по процессам, модуль кажется multiprocess или как-то так.
>> No.30138 Reply
>>30132
> И можно ли обмениваться значениями между функциями, или будет мешать GIL?
GIL это Global Interpreter Lock, т.е. мьютекс внутри мейн лупа интерпретатора, позволяющий одновременно питоновые опкоды выполнять только одному потоку.
Он по определению не может мешать обмену данными или чему там еще, это просто внутренний мьютекс, гарантирующий, что оно не рухнет все нахер.

Для синхронизации внутри программы есть целая куча готовых синхронизирующих примитивов, берешь те, что нравятся и пользуешься.
> Что есть годного почитать из этого
Да в общем-то стандартные доки питона достаточно ясно поясняют, что это всё такое. Ну и PEPы.
>> No.30139 Reply
>>30137
> в питооне распараллеливание по потокам имеет смысл только для i/o операций
Глупости, есть замечательный C-API GIL_Release(), который позволяет выполнять код без GILа, т.е. такой код вполне нормально паралеллится.
Не помню сходу, насколько оно используется в NumPy/SciPy, но по-моему там было вообще автоматическое распараллеливание для трудоемких вычислений.
>> No.30146 Reply
Посоны, как в питоне читать/писать простые хмл-файлы?
>> No.30147 Reply
>>30146
Красивым мылом.
>> No.30151 Reply
>>30147
Красивым каменным супом же. Или домом минидомом.
>> No.30190 Reply
>>30146
Не слушай этих, они ничего не понимают в хмле, только lxml, только нормальный ElementTree.
>> No.30193 Reply
File: Bubl.png
Png, 86.64 KB, 960×540 - Click the image to expand
edit Find source with google Find source with iqdb
Bubl.png
>>30190
ElementTree сложный, я уже минидомом упоролся.
>> No.30217 Reply
>>30037
Поисправлял то, что насоветовали, и попробовал сделать многопоточную загрузку. Суть такова:
Загрузка происходит в 2 этапа. Сначала скачивается ссылка, потом постер. Пусть будет t1 и t2. Для каждого этапа я делаю несколько потоков. Чтобы упорядочить доступ к объектам, делаю 3 очереди (q1, q2, q3) и размещаю таким образом: q1=>t1=>q2=>t2=>q3. Вроде бы всё работает.
Аноны, может вы ещё раз посмотрите, если не лень будет, годится такой код, нет? Ну там претензии к оформлению может ещё какие есть.
http://pastebin.com/6b4dy24q
>> No.30242 Reply
>>30217
  • Цикл и условие в строках 125-126 эквивалентны конструкции:
genre = mov.genre
try:
    x = 20+(WIDTH+20)*unique_genres.index(genre)
except ValueError: pass
else:
    y = 100 + y_counter[genre]
    ...
Причем код в исключении никогда не будет выполняться, так как список unique_genres уже сгенерирован из всех возможных mov.genre .
  • Не совсем понятно, зачем код скачивающий постеры разбит на четыре части, было бы логичней получить ссылку и сразу начинать скачивать постер.
  • Вместо link_task.setDaemon(True), лучше link_task.daemon = True так как:
> setDaemon() Old API for daemon.
http://docs.python.org/2.7/library/threading.html?highlight=setdaemon#[...]aemon
  • У тебя частенько встречаются конструкции вроде:
while not q1.empty():
    movie = q1.get()
в то время как в документации явно указанно что:
> if empty() returns False it doesn’t guarantee that a subsequent call to get() will not block.
http://docs.python.org/2/library/queue.html?highlight=queue#queue-objects
Поэтому будет лучше:
try:
    while True:
        movie = q1.get(timeout=TIMEOUT)  # или .get_nowait()
        ...
except Empty: pass
  • Настолько частая проверка while not q3.full(): pass будет жрать все 100% cpu, поэтому вместо pass лучше использовать sleep(DELAY) (из модуля time ).
Но так как ты всё равно используешь q3.task_done() , было бы целесообразней вызвать q3.join() .
Похожая проблема есть в стоках 49-53.

А вообще, операции над списками в несколько потоков удобней делать с помощью ThreadPool, (thread версия multiprocessing.pool).
http://docs.python.org/2/library/multiprocessing.html?highlight=multip[...].pool
from multiprocessing.pool import ThreadPool
downloader = ThreadPool(threads_num)
downloader.map(get_link_and_poster, movies)  # blocks until the result is ready.
А ещё он умеет возвращать генератор, таким образом можно начинать собирать "advice", не дожидаясь пока докачаются остальные постеры.
for mov in downloader.imap_unordered(get_link_and_poster, movies):
    if mov.poster:
        ...
>> No.30249 Reply
File: 1341515567108.gif
Gif, 36.13 KB, 720×720 - Click the image to expand
edit Find source with google Find source with iqdb
1341515567108.gif
>>30242
Ок, буду дальше медитировать над скриптом.
> было бы логичней получить ссылку и сразу начинать скачивать постер.
Просто ссылка на одном сайте, а картинка на другом. Или это не имеет значения?
>> No.30256 Reply
>>30249
Всё понял. Действительно, нет смысла разбивать загрузку на 2 части. Спасибо.
>> No.30312 Reply
>>28158

Скажите есть какой нибуть механизм/практики контроля типов в Питоне?

Допустим функция принимает что то типа wx.Window. Но передать туда можно что захочешь.

Есть какая либо возможность эту ошибку отловить, до того как оно мне ноги поотстреливает?
>> No.30313 Reply
>>30312
Явную проверку типов issubclass, isinstance обычно не используют, так как она ломает "Duck Typing".
Поэтому такие ошибки обычно ловят или уже после того как "простреливают" ноги:
try:
    ...
    ...
except (AttributeError, ..., Whatever):  # looks like it wasn't wx.Window after all
    raise TypeError("Expected 'wx.Window' got '{0.__name__}'"
                    .format(type(window)))
Или заранее проверяют объект на наличие нужных методов:
if not hasattr(window, 'Show'):
    raise TypeError("Can't show this window!")
Последнее можно запихать в __subclasscheck__, __instancecheck__ и использовать issubclass, isinstance для большей наглядности.
А еще, для создания абстрактных классов, проверки объектов во время инициализации и пр. есть:
http://docs.python.org/2.7/library/abc.html?highlight=abs#module-abc
from abc import ABCMeta, abstractmethod
class A(metaclass=ABCMeta):  # for Python3
    # __metaclass__=ABCMeta  # for Python2
    @abstractmethod
    def foo(self): pass
  
class B(A):
    def foo(self): pass
  
class C(A): pass
>
>>> a=B()  # OK
>>> b=C()
TypeError: Can't instantiate abstract class C with abstract methods foo
>> No.30341 Reply
File: 00000.jpeg
Jpeg, 115.60 KB, 800×600 - Click the image to expand
edit Find source with google Find source with iqdb
00000.jpeg
>>30313
Спасибо
>> No.30489 Reply
Анон, привет, есть простой цикл:
for a in b:
    do_something(a)
Дело в том, что при выполнении do_something(a) может возникнуть исключение, характер появления которого плавающий. А функцию эту все же хочется отработать. Вижу такое решение:
c = iter(b)
a = next(c)

while True:
    try:
        do_something(a)
    except:
        pass
    else:
        try:
            a = next(c)
        except StopIteration:
            break
Но должно же быть более простое решение?
>> No.30490 Reply
>>30489
Ничего не понял, почему просто не запихать трай-эксепт внутрь фор?
>> No.30491 Reply
>>30490
Да, а еще можно можно в какой-нибудь подавляющий эксепшоны декоратор завернуть.
>> No.30492 Reply
>>30490
Это как, продемонстрируй?
>> No.30496 Reply
>>30492
Банально
for a in b:
    try:
        do_something(a)
    except:
        pass
>> No.30499 Reply
>>30496
Не то. Текущий элемент (а), на котором будет поймано ислючение, будет пропущен, и цикл начнет обрабатывать следующий элемент из (b). А надо, чтобы пыталось обработать текущий (a), пока исключение не пропадет. Т.е. логика такая:
for a in b:
    try:
        do_something(a)
    except:
        прогнать_еще_раз_текущий_(а)
>> No.30501 Reply
>>30499
> надо, чтобы пыталось обработать текущий (a), пока исключение не пропадет
Извращение какое-то.
Ну вообще гря тоже самое:
for a in b:
    f = True
    while f:
        try:
            do_something(a)
            f = False
        except Exception as e:
            pass
>> No.30504 Reply
>>30501
Можно и без флага:
for a in b:
    while True:
        try:
            do_something(a)
        except Exception: pass
        else: break
>> No.30505 Reply
File: 147.jpg
Jpg, 43.43 KB, 465×700 - Click the image to expand
edit Find source with google Find source with iqdb
147.jpg
>>30504
Годно, спасибо.
>> No.30580 Reply
File: alice_100.jpg
Jpg, 4584.41 KB, 2552×3508 - Click the image to expand
edit Find source with google Find source with iqdb
alice_100.jpg
Это снова я и я опять прошу посмотреть мой код. Делал специальный будильник-аркаду. Помните старый баян - по полю в рандомных направлениях летают прямоугольники и нужно своим прямоугольником не задеть другие. Мол, если ты продержишься больше 17 секунд, то ты гений. Сделал на основе этой идеи будильник.
http://pastebin.com/xUUcR3iG
>> No.30581 Reply
>>30505
Какая же она противная.
>> No.30598 Reply
>>30580
time_alarm=time_alarm.split(':')
hours=time_alarm[0]
minutes=time_alarm[1]
В одну строку.
hours, minutes = time_alarm.split(':')
for event in pygame.event.get():
            pygame.mouse.set_visible(0)
Вот здесь непонятно, зачем ты делаешь курсор невидимым в цикле.

А собственно по pygame вряд ли могу помочь, у меня скрипт не работает. Сначала просто висит, я так понял, ждет назначенного времени, потом мелькнули какие-то квадраты и все, выход.
>> No.30603 Reply
>>30598
Ага. Там нужно указывать в таком виде.
python file.py 12:00 20. Где последний аргумент - сколько секунд продлится игра.
Спасибо за помощь.
>> No.30617 Reply
>>30580
:12
window_open=True + while window_open: = while True: ?
Или window_open это дескриптор из pygame.locals и он потом меняет значение?.. было бы неплохо это документировать.

:19-23
Читать аргументы лучше тогда, когда они есть, т.е. после if __name__=='__main__': .
И вообще нежелательно писать код в теле модуля, не относящийся к инициализации этого модуля.

Обе функции wait() подсказывают тебе, что ты делаешь что то не так. Зачем будильнику проверять время каждые 30 секунд?
Тем более, для отложенного запуска, в питоне есть http://docs.python.org/2/library/threading.html#timer-objects

:41,65
except: эквивалентен except BaseException: и ловит ВСЕ исключения, служебные, системные, исключения интерпретатора и т.д.
Если тебе зачем-то надо поймать ВСЕ исключения твоей программы (а в твоём случае, это точно не надо), лови except Exception: .

:42
Всё-таки наличие файла лучше проверить сразу, при запуске, чем потом узнать что "будильник сломался" лол.

:43,101
Вызов sys.exit() не из основного потока, возможно делает не совсем то что ты ожидал
http://docs.python.org/2/library/sys.html#sys.exit

:53-55
Луче (и понятней) иметь один список с объектами, чем три (а потом четыре, пять..) с их свойствами.

:94
Питон не любит рекурсии, особенно те, без которых можно было обойтись.
Тем более, в этом месте "me" пропадает и если не двигать мышкой, больше не появляется и можно дальше идти спать..

:78-85
Когда x>640 или y>480 то очевидно что они не меньше нуля и наоборот. Тут была бы уместней конструкция if, elif .
Каждый [i] и .x это вызов __getitem__(i) и __getattr__(x), с последующим обращениями к словарям и т.д..
Так как их значения во время цикла не меняются, что бы "питон не тормозил" их можно кэшировать в локальном пространстве имён. (Тоже самое относится и к .cos, .sin, .randint и пр.)

:96-98
Не знаток PyGame, но для бесконечного повтора вроде есть music.play(loops=-1) .

:102-106
Зачем нужно три потока? третий - основной.
thread1 завершается сам, а кто и когда завершает thread2 ?
>> No.30635 Reply
File: o772894.jpg
Jpg, 662.28 KB, 1600×1200 - Click the image to expand
edit Find source with google Find source with iqdb
o772894.jpg
>>30617
Спасибо. Хорошие замечания, особенно про проверку музыки и функцию wait(там был жуткий быдлокод).
>> No.30739 Reply
File: JGgHcT8.jpg
Jpg, 444.64 KB, 1836×2448 - Click the image to expand
edit Find source with google Find source with iqdb
JGgHcT8.jpg
Анон, а безопасно ли питон-коду модифицировать свой файл?
Перезапускать себя, например os.system('python file.py &')?

Если да, то можно же организовать самооптимизирующийся код!
>> No.30741 Reply
>>30739
> безопасно ли питон-коду модифицировать свой файл?
Нет.
>> No.30784 Reply
>>30739
> модифицировать
"Модифицируй" текстовый файл и исполняй его через exec().
Или просто строку. Будет то же самое, но без приставки "само".
>> No.30785 Reply
File: wallpaper-733405.jpg
Jpg, 160.78 KB, 1024×768 - Click the image to expand
edit Find source with google Find source with iqdb
wallpaper-733405.jpg
Здравствуйте.
Подскажите пожалуйста. Хочу научиться программировать. До этого программировал только на турбо паскале, в школе. И то, только квадратные уравнения решали, лол.
Хочу начать с питона. Начинал читать Лутца. Прочёл пол книги, и как-то потихоньку забил. Ибо на столько страниц всё растянуть... Каких-то конкретных заданий - нету. Поэтому то что я прочёл, я успешно забывал. В идеале хотел бы научиться программировать не питоне. А дальше может быть, в целях самообразования с++.
Таки вот, как нужно изучать язык? Когда я читал Лутца, мне не было интересно, ибо примитивные, неинтересные примеры. Я после прочтения статьи, набирал код и исполнял его и т.д. Но через день забывал. Нужно ли конспектировать что-то? Может нужно прочесть что-то вводное в программирование? ООП вообще никак не понимаю. Не укладывается у меня это в голове и не могу понять как работает. Также испытываю проблемы с алгоритмами. Надеюсь на вашу помощь, ня.
>> No.30787 Reply
>>30785
Указанную тобой книгу не читал, но уверен что ты говоришь о хорошей, годной книге для обучения программированию на конкретном языке, а не программированию вообще. По второму я даже и не знаю что посоветовать, кроме четырехтомника Кнута, но это зело хардкорно.
Хороший метод для самообучения програмированию на мой взгляд - выбрать себе простую, но реальную задачу и решить её: калькулятор, сетевой пинг-понг, маленькую тулзу для автоматизации какого-нибудь твоего действия. Главное, довести дело до конца. Нормальный интерфейс, понятный не только тебе. Хелп, шорткаты, настройки.

Ну и в конце немного скепсиса
> > Хочу научиться программировать.
> > Начинал читать Лутца. Прочёл пол книги, и как-то потихоньку забил.
> > Поэтому то что я прочёл, я успешно забывал.
> > Когда я читал Лутца, мне не было интересно
> > Хочу научиться
> > забил забывал не было интересно
Ты вообще уверен, что оно тебе надо?
>> No.30788 Reply
>>30787
Да, уверен!
>> No.30789 Reply
>>30788
Хм, может тогда будешь няшей и сделаешь мне вот что:
есть набор пар имя:значение, например "имя1":10, "Имя2":5. Еще есть есть формула в виде строки "имя1*(2имя2+4)".
Нужна функция, принимающая набор и формулу и возвращающая результат вычислений (140 в данном примере).
>> No.30790 Reply
>>30789
Но я не знаю как это сделать!ъ
Единственная мысль, которая пришла в голову - "имя1":10, "имя2":5 сделать словарями.
"имя1*(2имя2+4)" - сделать строкой.
Дальше подстановка значений словаря в формулу и вывод?
>> No.30791 Reply
>>30790
> Но я не знаю как это сделать.
Чего ты не знаешь как сделать?
Как заменить один кусок строки другим в питоне? Посмотри в книге.
Не умеешь вычислять значения по формуле? Походи на уроки математики в младшей школе.
Не знаешь, как работают операторы сложения/умножения напитоне? Посмотри в книге.
Не знаешь, как разобрать строку в вычисляемое выражение? Посмотри в книге. Подумай. Не поможет - погугли. Если и погуглить не можешь - бросай все, иди в гуманитарии.
В этом собственно и заключается умение программировать - понять задачу и найти способ её решения.

ПыСы, может немного грубовато, но я просто хочу дать тебе понять, что это ты хочешь научиться программировать, это только тебе нужно и все средства для этого у тебя есть. Если ты на каждую новую задачу будешь реагировать "Я не знаю как это сделать", то нахер такой разработчик вообще нужен. Вся ценность разработчиков в том, что им можно сказать: "У меня есть такая задача" и они её решат. Придумать как - это их работа.
Готовых рецептов для всего на свете нет, нужно каждый раз думать своей головой.

к: лесбиянку тутор во всем виновата
>> No.30803 Reply
File: 0133972aa000f4d1447744fd47e6470d.jpg
Jpg, 200.14 KB, 850×850 - Click the image to expand
edit Find source with google Find source with iqdb
0133972aa000f4d1447744fd47e6470d.jpg
Анон, есть такая проблема: нужно сохранить страницу с кириллицей(на странице она есть, но сохранять ее не обязательно) и с правильными заголовками в запросе(важно). Если попробовать urllib2.urlopen(url).read(), затем записать это в файл - кирилица отваливается(хрен с ней, конечно, но сохраняется архивом)(если вывести на печать получаю кракозябры). Если через urllib.urlretrieve(url, file) то нельзя добавить заголовки. Заголовки можно добавить в urllib2, но нельзя через него сохранить(насколько я знаю).
>> No.30804 Reply
>> No.30805 Reply
File: 7dbafb125a587aecfb0d341c027fc752.jpg
Jpg, 353.90 KB, 850×1976 - Click the image to expand
edit Find source with google Find source with iqdb
7dbafb125a587aecfb0d341c027fc752.jpg
>>30804
Мне нужно через питон
>> No.30806 Reply
>>30803
Наверное как-то так:
http://stackoverflow.com/questions/1020892/urllib2-read-to-unicode

Или пробуй третий питон, у него с кракозябрами проблем, обычно нет.
>> No.30809 Reply
>>30806
Зпто проблемы с половиной непортированных либ.
>> No.30816 Reply
File: 3ecd58008790d489873483b1ee73346b.jpg
Jpg, 329.22 KB, 850×1277 - Click the image to expand
edit Find source with google Find source with iqdb
3ecd58008790d489873483b1ee73346b.jpg
>>30806
Выдает UnicodeDecodeError
>> No.30818 Reply
>>30816
А ты в заголовке страницы смотрел ее кодировку?
В третьем питоне без проблем читаю странички чем-то вроде такого:
url = 'http://www.kinopoisk.ru'
page = opener.open(url)
html = str(page.read().decode(encoding='cp1251'))
>> No.30819 Reply
File: fddbe31d96d4fb53dca47e40dfe85afe.jpg
Jpg, 174.22 KB, 850×850 - Click the image to expand
edit Find source with google Find source with iqdb
fddbe31d96d4fb53dca47e40dfe85afe.jpg
>>30818
У меня твой код выдает ошибку
UnicodeDecodeError: 'charmap' codec can't decode byte 0x98
Кодировка в заголовке windows-1251
>> No.30821 Reply
>>30803
> сохраняется архивом
похоже получаешь страницу в gzip-encode
попробуй ее перед сохранением разгзипить
>> No.30830 Reply
>>30819
А если так?
html = str(page.read().decode(encoding='cp1251', errors='ignore'))
>> No.30838 Reply
>>30785
>>30787
>>30791
Решил сделать парсер картинок с wallbase.cc.
С чего начать? Ибо я не совсем представляю как работают парсеры.
>> No.30839 Reply
File: A832049.jpg
Jpg, 82.90 KB, 468×512 - Click the image to expand
edit Find source with google Find source with iqdb
A832049.jpg
>>30838
> не совсем представляю как работают парсеры
Ну так разбери и посмотри.
https://github.com/search?q=wallbase.cc
>> No.30840 Reply
>>30838
Что в твоем понимании парсер картинок? Может грабилку? Ты хочешь стащить с сайта картинки по тегам, или что?
>> No.30842 Reply
>>30840
Видимо да, я не знаю терминологии. Ну какая-нибудь форма - вводишь кеи - и вывод картинок по кеям.
>> No.30858 Reply
>>30842
У тебя подход какой-то странный я не понимаю.
Ладно, попробуй так: сделай это на маленьком конкретном примере вручную и подробно опиши каждый шаг. А потом запрограммируй эту же последовательность действий.
Ужасная, отвратительная практика, но я ничего лучше посоветовать не могу
>> No.30860 Reply
File: 3ad394387a5821b7b...
Jpg, 138.32 KB, 565×800
edit Find source with google Find source with iqdb
3ad394387a5821b7b157e97f9a1ce2ab.jpg
File: 0d09624bec7bb78c6...
Jpg, 279.48 KB, 850×1189
edit Find source with google Find source with iqdb
0d09624bec7bb78c6fc945c133fb3d55.jpg

>>30821
Да, это был архив. Вот только нахрена сжимать текст я так и непонял. Спасибо тебе, огромное!
>>30830
Выдает ошибку декодирования, правда ругается на другой символ.
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2039' in position 1: ordinal not in range(128)
Я тоже пробовал добавлять ignore, т.к. кирилица не особо и нужна, но не взлетело.
>> No.30862 Reply
>>30860
> Да, это был архив. Вот только нахрена сжимать текст я так и непонял. Спасибо тебе, огромное!
Можно настроить вебсервер так, чтобы он отдавал контент в gzip-encoded. Это несколько нагружает сервер, но экономит трафик. Браузеры умеют автоматически распаковывать такой контент. Причем когда браузер делает запрос он в хидере Accept-Encoding указывает в каких форматах он готов принять данные с сервера. В том числе можно этим включить/выключить гзип. urllib2 может ередавать такие хидеры, поэтому как вариант - делать свой кастом хидер.
headers = {
                   'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Version/3.1.2 Safari/525.21',
                   'Accept': r"text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1",
                   'Accept-Language': r"en-EN,ru;q=0.9,en;q=0.8",
                   #'Accept-Encoding': r"deflate, gzip, identity, *;q=0",
                   'Accept-Encoding': r"gzip;q=0,deflate;q=0, identity, *;q=0",
                   'Accept-Charset': r"Accept-Charset: iso-8859-1, utf-8, *;q=0.1",
                   'Keep-Alive': r"300",^M
                   'Connection': r"Keep-Alive",
^M
                }
request = urllib2.Request(url, data=None, headers=headers)
>> No.30863 Reply
>>30860
UnicodeEncodeError из за str() , которой ты не указал в какую кодировку конвертировать юникод (а по умолчанию это ascii ).
Так что, или указывай кодировку, или убирай str() и напрямую юзай encode html = page.read().decode(encoding='cp1251').encode(encoding='<твоя любимая кодировка>') (так, имхо, понятней что происходит), или работай с юникодом, 2013 год на дворе...
>> No.30905 Reply
>>28158
Привет, Питонач. Пишу прогу, которая заполняет базу данных рандомными данными. Использую MySQLbd у меня в таблице есть поля типа timestamp и я не понимаю что с ними делать. Подскажите советом или ссылочкой?
>> No.30950 Reply
>>30905
> timestamp
Юниксовый timestamp же. Количество секунд с 1970го года.
Гугл говорит, что можно например так:
import datetime
print(datetime.datetime.fromtimestamp(int("1284101485")).strftime('%Y-%m-%d %H:%M:%S'))
мимонепитонщик
>> No.31068 Reply
File: eHut74O.jpg
Jpg, 57.78 KB, 500×412 - Click the image to expand
edit Find source with google Find source with iqdb
eHut74O.jpg
>>30784
Медленное спасибо тебе, анон.
Пару дней помониторил и ушел - даже не знал что мне ответили.
>> No.31076 Reply
Как обстоят дела с разработкой под Андроид на питоне? Трудно ли портировать приложение с компа на Андроид?
>> No.31079 Reply
>>31076
> портировать приложение с компа
никак. В SLA пользовательский интерфейс состоит из хтмл кода. правда, я последний раз смотрел на него коло года назад.
>> No.31321 Reply
Доброкодер, возможно записать объект в файл? В документации куча способов записи строк, но что делать если в переменной хранится картинка или архив?
>> No.31322 Reply
>>31321
serialization
>> No.31327 Reply
Питоняши, тут такое дело. Прохожу курс на coursera по данным, а там домашки на этом вашем питоне. С CS у меня неплохо, но вот языка не знаю. Подскажите какой-нибудь справочник по синтаксису, чтобы коротко, понятно, и исчерпывающе, как в msdn например.
>> No.31328 Reply
>> No.31329 Reply
>>31328
Это понятно и исчерпывающе, но очень подробно и многословно. Для того чтобы понять, как написать хэллоуворлд нужно будет прочесть четверть документа.
Хотелось бы иметь документ, в котором за минуту можно найти необходимый элемент языка, при условии, что я знаю, что ищу тоесть при условии, что взглянув на первый абзац описания я смогу понять, подойдет оно мне или нет..
>> No.31330 Reply
>> No.31331 Reply
File: flower_fairy_wallpaper_by_bluesaga331-normal[1].jpg
Jpg, 1215.34 KB, 1680×1260 - Click the image to expand
edit Find source with google Find source with iqdb
flower_fairy_wallpaper_by_bluesaga331-normal[1].jpg
>>31330
Агонь! Спасибо, анон, держи фею.

И если >>31328 с >>31330 не одно и то же лицо - тоже спасибо, за участие.
>> No.31332 Reply
File: Gravity-Falls-Episode-7-Double-Dipper.jpg
Jpg, 81.84 KB, 600×400 - Click the image to expand
edit Find source with google Find source with iqdb
Gravity-Falls-Episode-7-Double-Dipper.jpg
>>31331
Один и тот же пэхэпист, мечтающий писать на руби, но еще поверхностно знающий и одобряющий питон.
>> No.31355 Reply
>>28158
У меня к вам скромный вопрос про питонятину.
Лень было вчера вникать в синтаксис при написании одного разборщика местного апи, однако я заметил, что в вашем язык блоки кода объявляются отступами.

Так ли это и стоит ли его дальше использовать вместо баша в повседневной жизни? Ну и да, расскажите мне про другие "качественные архитектурные решения" этого языка. (про грабли с гирляндой версий я уже в курсе, это у вас так отлично развивается проект, да)

С: золото чану
>> No.31390 Reply
>>31355
> Так ли это и стоит ли его дальше использовать вместо баша в повседневной жизни?
Имхо, это как использовать виндовый павершелл в повседневной жизни - излишне.
Имхо, на баше повседневные задачи решаются тупо быстрее: грепнул, авкнул, запустил. Плюс это де факто стандарт написания консольных скриптов в *nix системах.
Питон же стоит использовать там где баша не хватает, ну допустим написать анализатор лога со статистикой, графиками и шлюхами. Ну точнее можно и на баше, но это тоже уже будет изъебством.
>> No.31409 Reply
>>31355
> Так ли это и стоит ли его дальше использовать вместо баша в повседневной жизни?
Стоит юзать ipython - очень мощная оболочка. Считай что ipython = python + bash.
>> No.31416 Reply
>>31409
о, питон в кои то веки дорос до уровня руби
>> No.31810 Reply
Новый релиз IronPython, yay! Альфа версия alpha as fuck!
>> No.31924 Reply
File: 1248331803739.jpg
Jpg, 352.47 KB, 688×650
Your censorship settings forbid this file.
unrated
>>28158
   Доброго здравия, анон.
   Пилю Python-поделку для реализации одной нужной мне фичи, заодно обучаюсь на реальном примере. Написал нужные функции, поддержку примитивной БД, словом, все, что требовалось. Теперь хочу облачить это дело в графику с помощью tkinter-а, но перед этим прикрутить некостыльный интерфейс для интерпретатора. Соответственно, появились вопросы.
1.Как можно реализовать или где можно почитать о реализации такого: открываем интерпретатор > запускаем скрипт, который создает строку ввода и выполняет функции в скрипте по именам > вызываем функцию из скрипта по имени > обрабатываем результат > вызываем еще n функций по надобности > по вводе пустой строки цикл ввода прекращается.
Пробовал через while True и далее с вводом строки, как у Саммерфилда написано, но не взлетело. Желательно материал вообще на эту тему, как сделать программку более дружелюбной для конечного пользователя(то есть, меня, ибо если импортировать в интерпретатор функции, а потом вызывать их как module.func() это извращение и неюзабельно.
2.Отзывы по поводу tkinter-а, трудно ли будет написать примерно такой интерфейс: набор однотипных кнопок, скажем, A с разными параметрами(тут ООП рулит, как я догадываюсь), кнопка B добавляющая кнопки A и кнопка C удаляющая кнопки A.
p.s. Извиняюсь, если написано ужасающе, но я слишком долго сидел в ридонли.
>> No.31927 Reply
>>31924
> 1.Как можно реализовать или где можно почитать о реализации такого: открываем интерпретатор > запускаем скрипт, который создает строку ввода и выполняет функции в скрипте по именам > вызываем функцию из скрипта по имени > обрабатываем результат > вызываем еще n функций по надобности > по вводе пустой строки цикл ввода прекращается.
Реализовал это через функцию, которая принимает строку, по условию определяет содержание, выполняет указанную функцию и вызывает саму себя, но, подозреваю, что страшнейший быдлокод и нужно через while True делать. Вопрос еще актуален.
>> No.31931 Reply
>>31927
Как-то так:
class Dispatch:
    def foo1: pass
    def foo2: pass
    ...
    def foon: pass

while True:
    fun = input('blah.. blah..')
    if not fun: break
    foo = getattr(Dispatch, fun)  # или наоборот
    result = foo(*args, **kwargs)
Можно ещё попробовать это в генератор обернуть.
>> No.31952 Reply
File: 6166315.2.jpg
Jpg, 1656.17 KB, 2000×1437 - Click the image to expand
edit Find source with google Find source with iqdb
6166315.2.jpg
>>31931
Обернул все функции в класс, сделал через while, получилось гораздо компактней и в принципе то, что нужно. Т.к. функции простейшие и между собой связаны только одним объектом, то не стал лезть к getattr, опять сделал через if-ы ввода, но упростил.
http://pastebin.com/NavP4Ui6 - вот часть кода для примера.
Работает так, как и задумывалось изначально. Приношу благодарность за помощь.
>> No.31953 Reply
Котоны, а код типа такого не лучше ли (прошу прощения за руби) http://ideone.com/74Is6J
При этом, $task пополняется при подключении модулей с действиями, а значит более чистая архитектура и нет гемороя с плагинами
>> No.31962 Reply
>>31931
А ещё лучше, вот так: http://docs.python.org/3.2/library/cmd.html
import cmd

class Standart(cmd):
    def __init__(self, tasklist)
        self.tasklist = tasklist

    def do_Add(self):
        # addtask to self.tasklist
        pass

    # ...

    def do_Del(self):
        # deltask from self.tasklist
        pass

std = Standart(tasklist)
std.prompt = "Справка = help. Команда: " 
std.cmdloop()
>> No.32180 Reply
>>28158
Пишу простенький HTTP сервер на Python (задание из универа)
нужно занять 80 порт. Система запрещает. Как получить к нему доступ?
>> No.32181 Reply
>>32180
Винда? Тогда используй netstat, посмотри, кто занял порт, и прибей гада.
>> No.32182 Reply
>>32180
хм. я идиот. просто запустить через Sudo и всё. прошу прощения.
>> No.32192 Reply
>>32182
В Debian и Ubuntu по умолчанию биндиться на порты до 1024-го может только root. Есть утилитка authbind, она позволяет нерутовым программам биндиться.
>> No.32324 Reply
>>32182
И снова в тред врывается идиот с 80м портом.

У меня проблемы с относительными адресами. Когда запускаю из IDE ( spider) всё работает, а из консоли файл не находит. почему так? Абсолютный адрес работает и там и там. но не хотелось бы его использовать
>> No.32329 Reply
>>32324
В консоле вбей pwd. Все относительные пути будут прибавляться к нему. Сравни то что получилось с абсолютным.

Хинт: используй cd
>> No.32335 Reply
>>32324
> но не хотелось бы его использовать
Тебе мало проблем, ты хочешь еще текущую директорию отслеживать?
>> No.32337 Reply
>>32335
> еще текущую директорию отслеживать?
Как будто что-то сложное, вычислил при запуске программы, подставил ко всем относительным адресам.
>> No.32371 Reply
>>32337
Если бы всё было так просто. В 95% случаев эту самую директорию выставляют в чёрт знает что. Не нужна тебе еще одна глобальная переменная, не нуж-на.
>> No.32400 Reply
>>32371
> В 95% случаев эту самую директорию выставляют в чёрт знает что.
Ват?
> Не нужна тебе еще одна глобальная переменная, не нуж-на.
Ок.
Вычислил, сделал туда cd, все остальные файлы в относительных путях.
>> No.32405 Reply
>>32400
Тебе не нужна еще одна глобальная переменная. Не нуж-на.
>> No.32443 Reply
>>32405
> > сделал туда cd
>> No.32470 Reply
>>32443
1. Внутри программы тоже можно сделать "cd" (для текущей программы).
2. Когда юзер будет ставить и запускать эту прогу, это будет одним из поводов обматерить ее автора или послмть ему багрепорт.
>> No.32702 Reply
File: 1250171982515.jpg
Jpg, 136.99 KB, 800×841 - Click the image to expand
edit Find source with google Find source with iqdb
1250171982515.jpg
Хочу устроится куда-нибудь стажером. Знаю синтаксис и умею сортировать пузырьками. Пидорнут ли меня сразу или стоит попробовать?
>> No.32703 Reply
>>32702
> стоит попробовать
This.
>> No.32718 Reply
File: 1352788336864.jpg
Jpg, 99.34 KB, 530×580 - Click the image to expand
edit Find source with google Find source with iqdb
1352788336864.jpg
>>32702
Сейчас нужен SQL, а не сортировка пузырьками.

Дано три таблицы: товары, города, продажи. Нет, не так: посетители, страницы, посещения. Нет, не так: A, B, AB. Нарисовать их, добавить индексы, написать запрос с тремя условиями WHERE, JOIN-IN, HAVING - обыкновенная задача с собеседования.
>> No.32883 Reply
>>28158
Добрый день, питонач. У меня вопрос: как запретить программе выходить за пределы корневого каталога. да и как это вообще работает.
Преподаватель скинул тесты. В одном из тестов запрашивается файл httptest/../../../../../../../../../../../../../etc/passwd, которого в корневом каталоге нет, но почему-то программа его находит, что считается ошибкой.
>> No.32886 Reply
>>32883
Проверять получаемые пути:
if not os.path.abspath(path).startswith(abs_work_dir_path):
    raise Exception()
Создать белый список файлов, которые можно открывать и разрешить обращаться к ним только по индексам:
allowed_files = {'file1': 'httptest/files/1',
                 'file2': 'httptest/files/2',
                 ...
                 'test/file3': 'httptest/testfiles/3'}

try:
    file = open(allowed_files[path])
except KeyError:
    print('Access denied')
А вообще это задача операционной системы, запускай программу от имени пользователя у которого нет доступа к файлам за пределами рабочего каталога или запускай программу из под chrootа.
>> No.32888 Reply
>>32886
> запускай программу от имени пользователя у которого нет доступа к файлам за пределами рабочего каталога
>> No.32897 Reply
>>32883
> запрашивается файл /etc/passwd
Ну и пусть запрашивается, там все равно ничего интересного нет.
>> No.33010 Reply
File: cirno2.png
Png, 114.68 KB, 300×333 - Click the image to expand
edit Find source with google Find source with iqdb
cirno2.png
>>32718
Можно ли использовать всякие orm-костыли на собеседованиях? SQL плохо знаю.
>> No.33013 Reply
>>33010
Имхо использование orm хорошо, но знание к приблизительно каким sql-запросам они приводят еще лучше.
>> No.33016 Reply
>>33010
По моему опыту на собеседованиях спрашивают по SQL, а на практике всегда нужно работать с ORM.
>> No.33420 Reply
File: 977944.jpg
Jpg, 801.01 KB, 1171×1495 - Click the image to expand
edit Find source with google Find source with iqdb
977944.jpg
Что такое тестирование(unittest)? Программа передающая что-то на вход тестируемой программе и проверяющая результат? Зачем тогда нужны эти фреймворки? Такие тесты полностью автоматические?
Гугл говорит как их писать, а не что это.
>> No.33421 Reply
>>33420
функция:
def fact(n)
  if n == 0 then return 1
  else return n * fact(n - 1) end
end
Юнит-тест:
def test_fact
  assert(fact(0) == 1)
  assert(fact(1) == 1)
  assert(fact(3) == 6)
  assert(fact(5) == 120)
end
>> No.33431 Reply
>>33421
Спасибо, понял. Их обычно пишут полностью автоматическими или как у тебя? А что такое end?
>> No.33432 Reply
>>33421
А в чём смысл такого теста?
>> No.33434 Reply
>>33432
Если ты что нибудь в ядре нарефакторишь, то можешь проверить что ничего не отвалилось.
>> No.33442 Reply
>>33431
Да, полностью автоматическими. И запускаться они должны в один клик, иначе никто их запускать не будет.
>> No.33443 Reply
>>33434
Точнее, в чём смысл конкретно этого теста? Почему проверяются 0 и 1 понятно, а почему проверяются и 3, и 5? Это ведь избыточно.
>> No.33444 Reply
>>33421
Ох лол. Не называй это тестами.
>> No.33451 Reply
>>33443
> и 3, и 5
> избыточно
Тесты проверяют твою программу на определённых, показательных входных данных. Мол, если программа правильно работает на них, то она будет правильно работать на всех данных.
>>33444
Почему? Чем это не юнит-тест?
>> No.33455 Reply
>>33451
Входных данных пять классов: нуль, единица, n>1, n<0 и не целые числа. Достаточно одного теста на каждый класс. Либо тест на 3, либо тест на 5 следует выкинуть, потому что они из одного класса.
>> No.33514 Reply
Питонач, у меня сломался гугл. Можно ли на питоне создавать нативные приложения под окошки, например? С гуем и прочими прелестями.
>> No.33515 Reply
>> No.33518 Reply
>>33515
Спасибо. Осталось только доучить Python :3
>> No.33532 Reply
>>33515
На ЛОРе пишут, что gtk умирает, так что возможно лучше валить PyQt.
Вот например гткашные pidgin и gajim выглядят под шиндой временами корявенько, а кутешные qbittorrent и clementine как родные.
>> No.33533 Reply
>>33532
* валить на
>> No.33535 Reply
>>33532
4.2, gtk просто более нишевый (и в плане платформ, и в плане ЯП, на которых с ним удобнее работать)
>> No.33645 Reply
Привет, анон, есть класс:
class AttributeDict(dict): 
    __getattr__ = dict.__getitem__
    __setattr__ = dict.__setitem__
И если сделать вот так:
urls = AttributeDict({})
urls.foo = bar
то все в порядке. Но хочется достичь большего (в идеале бесконечного) уровня вложенности. Т.е. чтобы можно было сделать и так: urls.foo1.foo2 = bar2. Соответственно, чтобы и достать значения можно было так же. Как это реализуется вообще?
>> No.33647 Reply
>>33645
Бесконечный уровень вложения делается примерно так:
class Node:
    def __init__(self, val=None):
        self._val = val

    def __getattr__(self, name):
        d = self.__dict__
        attr = d.get(name)
        
        if not name.startswith('_') and attr is None:
            attr = Node()
            d[name] = attr

        return attr
    
    def __setattr__(self, name, val):
        d = self.__dict__
        
        if name.startswith('_'):
            d[name] = val
        
        else:
            self.__getattr__(name)._val = val
Доступ к '._val' через '=', делается через дескрипторы нужно гуглить как именно.
>> No.33648 Reply
File: 089.jpg
Jpg, 283.44 KB, 790×1000 - Click the image to expand
edit Find source with google Find source with iqdb
089.jpg
>>33647
Спасибо, конечно, но как-то мудрёно для меня. Проще словари друг в друга вкладывать.
>> No.33651 Reply
>>33648
там это и написанно
>> No.33654 Reply
>>33651
Значит, я не понимаю чего-то. А есть пример, как помещать туда элементы, и как доставать?
>> No.33655 Reply
>>33654
> > > a = Node()
> > > a.x.y = 9
> > > a.x = 7
> > > a.x.y._val
9
> > > a.x._val
7

А чтобы не писать каждый раз ._val нужно курить мануалы по дескрипторам.
>> No.33657 Reply
File: 025.jpg
Jpg, 130.41 KB, 1600×1200 - Click the image to expand
edit Find source with google Find source with iqdb
025.jpg
>>33655
Понятно, спасибо.
>> No.33659 Reply
>>33647
Какой нечитабельный код

перл-кун
>> No.33664 Reply
File: -.jpg
Jpg, 66.97 KB, 604×453 - Click the image to expand
edit Find source with google Find source with iqdb
-.jpg
>>33659
Для примера сойдёт, Доброкодер-кун ведь не будет его как есть копипастить правда, Доброкодер-кун?.
>> No.33665 Reply
File: yes.jpg
Jpg, 91.45 KB, 962×1080 - Click the image to expand
edit Find source with google Find source with iqdb
yes.jpg
>> No.33700 Reply
Добра, анон.
Что спросить-то хотел...
Ты знаешь какие-нибудь opensource-проекты, где использовались бы Tornado и MongoDB вместе? Спрашивал у гугла, обшарил весь github. Не обязательно GPL, лишь бы сорцы почитать можно было.
>> No.33725 Reply
В суперклассе есть метод со структурой if else. Можно ли в производном классе наследовать этот метод и добавить в структуру elif?
>> No.33726 Reply
>>33725
Нет, но ты можешь написать вот так например http://ideone.com/MbkgjS
>> No.33727 Reply
>>33725
Если в суперклассе это заранее не предусмотрено, как тут >>33726, то можно добавлять 'if'ы только в начале конструкции.
class A:
    def elseifs(self, x):
        if ..:
        elif ..:
        else: ..

class B(A):
    def elseifs(self, x):

        if something(x):
            dosomething()

        elif something_else(x):
            dosomething_else()

        else:
            super().elseifs(x)
А если тебе надо часто менять или расширять условия, то возможно будет лучше использовать словари\диспетчер классы.
>> No.33736 Reply
File: tumblr_m73a5a0YaJ1r68r2ho1_1280.png
Png, 384.21 KB, 1062×1428 - Click the image to expand
edit Find source with google Find source with iqdb
tumblr_m73a5a0YaJ1r68r2ho1_1280.png
>>33726
>>33727
Спасибо!
>> No.33745 Reply
File: sample_9a9947f37984f61c9b480721dd138250.jpg
Jpg, 88.21 KB, 850×715 - Click the image to expand
edit Find source with google Find source with iqdb
sample_9a9947f37984f61c9b480721dd138250.jpg
>>32702
Пидорнули!
>> No.33750 Reply
>>33745
За неумение или за что-то другое?
>> No.33756 Reply
>>33750
За неумение. Еще я нервничал и двух слов связать не мог. Зато посоветовали хорошую книгу по алгоритмам. Буду пробовать снова.
>> No.33764 Reply
>>33756
> ато посоветовали хорошую книгу по алгоритмам
Какую?
>> No.33768 Reply
Довожу до конца курс по Питону на Codeacademy. Что читать дальше? И стоило ли вообще этот курс проходить?
Цель - написать мамке программу для бухгалтерии, с гуем и прочим. Ну и потом, разумеется, пытаться на этом поприще заработать. Заранее спасибо :3
>> No.33769 Reply
>>33768
А там разве не за полчаса всё проходится?
>> No.33771 Reply
>>33769
Мне некуда торопиться. И таки на вопрос ты не ответил, няша.
>> No.33772 Reply
>>33768
> Что читать дальше?
SICP, Совершенный код, Объектно-ориентированное конструирование программных систем.
И вообще http://pastebin.com/3LXd4HAc
> И стоило ли вообще этот курс проходить?
Ну ознакомиться с синтаксисом, норм.
>> No.33773 Reply
>>33764
Python Algorithms: Mastering Basic Algorithms in the Python Language
>> No.33774 Reply
>>33772
> И вообще
Заманала эта паста.
мимо
>> No.33779 Reply
>>33774
Букварь бы тоже заманал, если бы не принудительное среднее образование.
>> No.33820 Reply
File: Снимок-экрана-02.08.2013-19:16:57.png
Png, 187.95 KB, 464×345 - Click the image to expand
edit Find source with google Find source with iqdb
Снимок-экрана-02.08.2013-19:16:57.png
Питонач, где я дурак?
>>> matrix = [[0]*4]*4
>>> for line in matrix: line
... 
[0, 0, 0, 0]
[0, 0, 0, 0]
[0, 0, 0, 0]
[0, 0, 0, 0]
>>> matrix[2][2] = 1
>>> for line in matrix: line
... 
[0, 0, 1, 0]
[0, 0, 1, 0]
[0, 0, 1, 0]
[0, 0, 1, 0]
>> No.33828 Reply
>>33820
>>> id(matrix[0])
139913036760056
>>> id(matrix[1])
139913036760056
Это значит что у тебя вектора, составляющие матрицу - один и тот же объект на самом деле.
matrix = [[0 for x in range(4)] for x in range(4)]
>> No.33867 Reply
File: fate.JPG
Jpg, 67.76 KB, 801×602 - Click the image to expand
edit Find source with google Find source with iqdb
fate.JPG
http://pastebin.com/rBATrEwY
В списке pics все картинки в папке. Нужно оставить только те, которые начинаются с frame. Регулярное выражение совпадает где нужно, НО в конце рядом с print pics видно что остались картинки которые под него не попадают. Они просто пропускаются(это видно в print i который перед raw_input()). Как такое может быть(for вроде должен перебрать весь список)? А если отсортировать нетронутый список pics - получаю None.
>> No.33869 Reply
>>33867
Предлагаю так:
[item for i, item in enumerate(pics) if not re.search(p, item)]
>> No.33870 Reply
>>33869
Блин, поспешил. И пароль главное не стал вводить - типо фиг с ним, вроде всё просто.
Не нужны же индексы, вот:
[item for item in pics if not re.search(p, item)]
>> No.33874 Reply
File: 22bf4f3a4885f9eaf0f9faab47aee0a3.jpg
Jpg, 277.46 KB, 600×1100 - Click the image to expand
edit Find source with google Find source with iqdb
22bf4f3a4885f9eaf0f9faab47aee0a3.jpg
>>33870
Спасибо, работает, но интерестно почему через for - нет. Циклом традиционнее, вроде, и во вложенных сборках что-то не то с индексами(в предидущем треде было) - так что я их боюсь.
>> No.33875 Reply
>>33874
В for он перескакивает через одну при удалении. Сам до конца не понял,почему, поэтому не стал умничать.
>> No.33878 Reply
>>33875
А как по твоему 'for' должен "догадаться" что после удаления элемента нужно вернуться на один индекс назад?
По хорошему он должен вылетать с исключением, как это случается когда один поток модифицирует список, а другой в это время, перебирает его через 'for'. Но видать это пока не починили.
>> No.33896 Reply
>>33867
Регулярное выражение для такого случая? Вы совсем поехамши.
Где же простота и элегантность?
pics = [blablabla]
print filter(lambda x: x.startwith('frame'), pics)
>> No.33897 Reply
>>33896
Прошу прощения, не .startwith, а .startswith
>> No.33898 Reply
>>33896
> Питон для такого случая? Вы совсем похеамши.
Починил.
Где же простота и элегантность?
ls |grep -E '^frame_[0-9]+\.(jpg|png|gif)$'
>> No.33901 Reply
>>33898
bash в питонотреде? Нет пути.
Да и элегантностью тут не пахнет.
>> No.33903 Reply
>>33901
Тащемта, для такой задачи bash действительно подходит лучше Python.
мимопитонист
>> No.34005 Reply
Почему не удаляется фрейм?
from tkinter import *

class something():
    def play(self):
        a2 = Frame()
        a2.grid()

        self.bttn = Button(root,text = 'Anything',command = a2.destroy).grid()

root = Tk()
a1 = Frame(root)
a1.grid()
Label(a1,text = '1234').grid()

a = something()
a.play()

root.mainloop()
>> No.34007 Reply
>>34005
Во-первых, прежде чем виджет дестроить, надо его распаковать.
Во-вторых, фрейм удаляется, но поскольку кнопка родителем имеет не фрейм, а рута, этого не видно.
В-третьих, grid() возвращает None, потому твоё присваивание self.bttn = малоосмысленно.
<...>
    def play(self):
        a2 = Frame()
        def finish():
            a2.grid_forget()
            a2.destroy()
        a2.grid()
        self.bttn = Button(a2, text = 'Anything', command = finish)
        self.bttn.grid()
Приятно видеть, что дело питонотреда живёт. Оп предыдущего треда.
>> No.34023 Reply
Почему app недоступно из метода play, но доступно из com?
from tkinter import *


class c1():
    def __init__(self):
        a = c2()
        a.play()


class c2():
    variants = ('1','2')
    answers = ('one','two')

    def play(self):
        self.bttn_app = Frame(root)
        self.bttn_app.grid()
        app.output.insert(END, '>>> ')    # Вот тут выдает ошибку

        for variant in list(enumerate(self.variants)):
            Button(self.bttn_app, text=variant[1],
                   command=lambda variant=variant[0]: self.com(variant)).grid()

    def com(self,var):
        app.output.insert(END, '>>> '+self.answers[var])


class Application(Frame):
    def __init__(self, master):
        Frame.__init__(self, master)
        self.grid()
        self.create_widgets()

    def create_widgets(self):
        self.output = Text(self,wrap=WORD)
        self.output.grid()

        game = c1()


root = Tk()
app = Application(root)
root.mainloop()
>> No.34024 Reply
>>34023
Смотри внимательно Traceback, на момент вызова 'play()', 'app' ещё не определена.
Ещё подробно про резолюцию имён можно почитать здесь: http://tech.blog.aknin.name/2010/06/05/pythons-innards-naming/
Или писать более внятный код, чтобы этого читать не пришлось
>> No.34065 Reply
File: ssdsd.png
Png, 6.54 KB, 372×47 - Click the image to expand
edit Find source with google Find source with iqdb
ssdsd.png
>>28158
Анончик, почему получается так? Снизу выложу две строчки кода, а пикчей будет вывод из консоли. Собственно, первая строчка на пикче - то, что я ввожу, вторая - результат работы print. Что это за странные дополнительные символы там, где их и быть не должно и почему метод lower() не срабатывает на кусок русского текста?
> self.userinput = rawinput("> ").lower()
> print self.user_input
>> No.34066 Reply
>>34065
Разметку запорол, но с нижними подчёркиваниями, надеюсь, разобраться можно.
>> No.34067 Reply
File: html-cheat-sheet-...
Png, 76.83 KB, 763×1037
edit Find source with google Find source with iqdb
html-cheat-sheet-v1.png
File: emezeta-php-card-...
Png, 1268.87 KB, 2480×3508
edit Find source with google Find source with iqdb
emezeta-php-card-v0.2.png

Есть похожее для питона? Интересуют стандартные библиотеки.
>> No.34068 Reply
>>34065
> raw_input
> кусок русского текста
Пришло время перекодировать строки, строки сами себя не перекодируют..
Кстати Рyhton нативно поддерживает юникод c 2008го года.
>> No.34069 Reply
File: hot-sexy-girl-n1.jpg
Jpg, 43.21 KB, 610×779 - Click the image to expand
edit Find source with google Find source with iqdb
hot-sexy-girl-n1.jpg
> Пришло время перекодировать строки, строки сами себя не перекодируют
Ты имеешь ввиду encode() и decode() методы? Беда в том, что при попытке применить один из них я натыкаюсь на огромную кучу проблем, так что может ты укажешь мне куда гуглить и что читать, чтобы точно и точечно применить их по отношению к русскому тексту так, чтобы убрать те символы?
Или ты говоришь о u" "?
>> No.34070 Reply
>>34069
Я бы посоветовал погуглить в сторону третьего пайтона.
Так как работать с не ascii во втором это, как ты уже заметил, "огромная куча проблем".
Вот тут, небольшая их компиляция: http://pythonhosted.org/kitchen/unicode-frustrations.html
>> No.34071 Reply
File: 2013-08-26-003704_722x434_scrot.png
Png, 16.08 KB, 722×434 - Click the image to expand
edit Find source with google Find source with iqdb
2013-08-26-003704_722x434_scrot.png
>>34070
Я бы посоветовал не давать дурацких советов, потому как все, кто может, используют 3-й, но не все, видишь ли, могут, и по вполне реальным причинам. Новички же банально ссут. Короче, не можешь подсказать, так и не выёбывайся, Склифосовский. Хотя ссылку ты ему дал нормальную, да.
>>34069
#!/usr/bin/env python
# -*- coding: utf-8 -*-
  
txt = raw_input().decode('utf-8')
print 'Lower: ', txt.lower()
Консоль: sakura, кодировка консоли utf-8. Как видишь, всё работает. Другое дело, что, вообще говоря, не лучшая практика. полагаться на то, что кодировка консоли именно utf-8, но, как я понимаю, тебя сейчас не это волнует.

Обрати внимание на вторую строчку кода, она важна, если в теле скрипта есть захардкоженые не-ascii строки.

Что тебе нужно понять: букв нет. Есть последовательности байтов и то, как их интерпретировать, определяет кодировка. u"" это не строка в кодировке utf-8, это строка юникода, что является совершенно отдельной абстракцией.
Читать: Разница между вторым и третьим пайтоном в этом плане в том, что во втором дефолтная строка — это байтовая строка, а в третьем — юникод строка. Таким образом, второй пайтон как бы всё технически в работе со строками умеет, но многие АПИ просто не умеют работать со строками в нужной кодировке, а в третьем об этом заботиться не нужно, ибо абстракцией по умолчанию является юникод, а не байтовая строка.
Читать (по желанию): http://lucumr.pocoo.org/2013/7/2/the-updated-guide-to-unicode/

В принципе, советую отказаться от привычки задавать подобные вопросы здесь и при каждой отдельной проблеме гуглить и первым делом кликать по ссылкам на стаковерфлоу. Здесь ты в большинстве случаев получишь бесполезный ответ, и вообще, это нормальный способ решать подобные проблемы, тем более, что проблемы кодировок во втором пайтоне хорошо озвучены в сообществе. Но это, конечно, твоё дело.

Алсо, да, впредь, пожалуйста, используй более точные формулировки, чем "огромная куча проблем". "Огромная куча проблем" не является удовлетворительным идентификатором.
>> No.34077 Reply
>>34071
Так стоит python 2 сейчас изучать или python 3?
>> No.34089 Reply
>>34077
3, чтобы никому не сношать мозг.
Это ж то же самое, что спрашивать «ребята, я собираюсь купить себе первый компьютер, что на него ставить, ME или восьмёрку?».
>> No.34112 Reply
>> No.34117 Reply
>>34077
Учи оба. Не ошибёшься.
>> No.34130 Reply
>>34089
Только пока все перетащат свои поделия на третий — пройдет еще пара лет. Лучше начать со второго, потом пересесть будет не проблемой.
>> No.34136 Reply
>>34130
Лучше начать со второго, а потом еще пару лет тащить свои приложения на третий.
Анон, не стоит использовать старое программное обеспечение, ведь новое почти всегда лучше!
>> No.34283 Reply
Добрый вечер.
Есть два скрипта: один на python, другой на lua. Как научить их общаться между собой?
Как сделать это через сокет (который Unix Domain)? Питонский скрипт должен слушать, ждать данные, луаскрипт - обрабатывать некоторое событие.
Сам ни одного, ни другого языка толком не знаю, так что, вполне может быть, реализуется сие вполне стандартными методами. А может нет? Расскажите, а.
>> No.34332 Reply
Доброанон, не могу выбрать фреймворк. У меня очень-очень большая БД, в которой часто используются связи много-ко-многим с параметром в средней таблице.
Попробовал джангу, но она не может нормально в описанную выше связь (только если руками sql). Посмотрел по сторонам - там какие-то пирамидки, фласки, вебпишечки - черт ногу сломит кто для чего и зачем.
На чем вообще масштабные и нагруженные проекты пилят?
>> No.34356 Reply
>>34332
> На чем вообще масштабные и нагруженные проекты пилят?
На других языках. Другие программисты. Которые не задают такие убогие вопросы на доброчане. Не ориентируйся на масштабные и нагруженные проекты, неудачник.

По делу: хватит думать "фреймворками", неудачник. Тебе нужен ОРМ? Используй sqlalchemy. Тебе нужен фреймворк для веб-страничек? Используй flask. Пирамиды и джанги а ещё в нагрузку твистеды и торнадо это всё очень здорово, но зачем? Не отвечай, но если ты можешь ответить зачем, то их и используй впрочем, нахуя я это пишу, если понятно, что ты не стал бы спрашивать, если бы мог ответить на этот вопрос. Если не можешь ответить: просто используй фласк и не еби мозг себе и другим своими фреймворкопробелмами.

Алсо, да, ещё может появиться такой же умник как я, и обосрать мой совет, сказав, что нужно использовать не sqlalchemy и flask, a peewee и flask. Так вот, peewee, конечно, минималистичней, но он самостоятельно выдумывает имена таблиц и вообще имеет ряд странностей, так что пока не можешь решать сам, что лучше: используй-ка лучше sqlalchemy.
>>34283
Дурацкие ты вопросы какие-то задаёшь. Лень отвечать. Если б ты не знал про сокеты, я б тебе что-нибудь и ответил, но раз ты знаешь, что они есть и это то, что тебе надо, так хуле ты тут спрашиваешь, уеба? Иди погугли. Или напишу, почему найденное тебя не устроило.
>> No.34369 Reply
>>34356
Спасибо, жопа, похоже, ты подсказал ровно то, что мне нужно:3
>> No.34386 Reply
File: a8dbb2bec6ec3e82cef906b52cebbe7d.0.jpg
Jpg, 67.53 KB, 520×392 - Click the image to expand
edit Find source with google Find source with iqdb
a8dbb2bec6ec3e82cef906b52cebbe7d.0.jpg
>>34332
> только если руками sql
Ты так пишешь "sql" будто это что-то плохое...
>> No.34389 Reply
>>34386
Надо либо так, либо эдак. А когда месиво в коде начинается при более менее типовых выборках - не айс
>> No.34390 Reply
>>34283
Что насчёт запуска lua в скрипте на python (https://pypi.python.org/pypi/lupa/)?
>> No.34391 Reply
>>34389
Вьюшки не пробовал создавать?
>> No.34855 Reply
File: WinPython.png
Png, 144.13 KB, 1366×768 - Click the image to expand
edit Find source with google Find source with iqdb
WinPython.png
Анон, у меня проблема с библиотеками. Скачал Pygame, Numpy, Scipy и на всё говорит, что модуль не найден на инструкцию import %название библиотеки%. Скачал WinPython, но там работает только WinPython интерпретатор, и при этом на весьма нужные мне функции говорит, что они ошибочны. А остальные программы выдают сообщение на картинке. Переустанавливал, брал старые версии, всё равно ошибки.

ОС: Windows 8 64 бит.
>> No.34856 Reply
File: Linus-Torvalds.jpg
Jpg, 22.07 KB, 620×310 - Click the image to expand
edit Find source with google Find source with iqdb
Linus-Torvalds.jpg
>>34855
Господа, дайте ему линукса.
>> No.34857 Reply
>>34855
Скачал PyCharm, всё работает из коробки, попробуй, ещё захочешь.
>>34856
С каких это пор питон стал зависим от оси?
>> No.34862 Reply
>>34857
Питон делался бородатыми красноглазиками для бородатых красноглазиков, поэтому под не юнихобразыми осями корректная работа его не была никогда приоритетной задачей, в линупсах он идет изкоробки, а в гейос из-за приверженности к нетрадиционному сексу изкоробки руби, но поставить и работать с питухоном не проблема, ибо юнегз. В винде всё ни как у людей, всё ксеноморфно и инопланетянско.
>> No.34869 Reply
>>34862
Наркоман.
>> No.34884 Reply
>>34857
С тех пор как в винде нет логичного именования веток файловой системы.

Хотя, внимательный BSDвод здесь может похулить и линупс.
>> No.34933 Reply
>>34884
> Хотя, внимательный BSDвод здесь может похулить и линупс.
За помойку в /etc? Хоть я с линупсами долго не работал, но вот это бросилось в глаза
>> No.34957 Reply
>>34884
/usr/local == shit
>> No.34974 Reply
File: 1224372932169.jpg
Jpg, 202.72 KB, 466×699
Your censorship settings forbid this file.
unrated
Есть сервер на локалхосте которому нужно отправить строку, и он пришлет ответ. Клиент на питоне не печатает ответ, хотя через telnet все работает нормально:
import socket
s = socket.create_connection(('127.0.0.1', 10000))
s.sendall('ghjk')
print s.recv(500)
через wireshark видно что строка отправляется, затем сервер отправляет подтверждение что принял, потом он должен отправить ответ вида "this is response"(в другом пакете) - но не отправляет.
Возможно s.recv(500) читает из парета с подтверждением?
Проблема именно в клиенте, через telnet всё работает.
>> No.34981 Reply
>>34957
Не смотрел, но осуждаю? Иди перечитай позикс.
>> No.34982 Reply
>>34974
Поищи, как указать порт. Без его указания, наверное, он отправляет на какой-то свой дефолтный - отличный от телнетовского.
>> No.34983 Reply
>>34974
Алсо, советую вместо телнета использовать netcat.
>> No.34985 Reply
>>34974
flush()
>> No.34987 Reply
>>34974
while True:
    sys.stdout.write(s.recv(512))
>> No.34990 Reply
>>34982
Порт указан - 10000, и работает именно через telnet, а через клиент не хочет.
>>34987
Безрезультатно.
Прикладываю код сервера, он 100% правильный, скопипастил с примера, хотя проблема скорее всего в клиенте.
http://pastebin.com/Qtqdh1wz
Пакет подтверждения приходит с одинаковыми флагами независимо от telnet или клиент используется, но ответ отправляет только телнету. Почему?
>> No.34993 Reply
>>34990
flush()
>> No.34994 Reply
File: horo1.jpg
Jpg, 1331.50 KB, 1500×1000 - Click the image to expand
edit Find source with google Find source with iqdb
horo1.jpg
>>34993
Пакет не приходит, и flush() тоже не помогает. Не понятно почему. Можешь сам попробовать: http://pastebin.com/Qtqdh1wz - сервер, >>34974 - клиент.
>> No.34995 Reply
>>34994
> ответ отправляет только телнету.
> class FingerProtocol(basic.LineReceiver)
> t.p.b.LineReceiver(protocol.Protocol, _PauseableMixin) : class documentation
> A protocol that receives lines and/or raw data, depending on mode.
> In line mode, each line that's received becomes a callback to lineReceived.
s.sendall('ghjk')
s.sendall('\n')
>> No.34996 Reply
File: horo2.jpg
Jpg, 1332.74 KB, 1000×1500 - Click the image to expand
edit Find source with google Find source with iqdb
horo2.jpg
>>34995
Ох лол, кто бы мог подумать! Это такой тонкий ньюанс или я очень чайник?
Зачем тогда присылать подтверждение что принял, если на самом деле - еще нет
Заработало с '\r\n', спасибо.
>> No.35011 Reply
Питончане, насколько нормальна будет такая конструкция?


def isvalidfilename(fn):
if fn.count('.doc',-4,len(fn))
    fn = doc2pdf(fn,fn)
if fn.count('.pdf',-4,len(fn))
    fn = pdf2tiff(fn,fn)
return fn.count('.tif',-4,len(fn))
def pdf2tiff(source, destination):
idx = destination.rindex('.')
destination = destination[:idx]
args = [
'-q', '-dNOPAUSE', '-dBATCH',
'-sDEVICE=tiffg4',
'-r600', '-sPAPERSIZE=a4',
'-sOutputFile=' + destination + '__%03d.tiff'
]
gs_cmd = 'gs ' + ' '.join(args) +' '+ source
os.system(gs_cmd)
args = [destination + '__*.tiff', destination + '.tiff' ]
tiffcp_cmd = 'tiffcp  ' + ' '.join(args)
os.system(tiffcp_cmd)
args = [destination + '__*.tiff']
rm_cmd = 'rm  ' + ' '.join(args)
os.system(rm_cmd)
>> No.35012 Reply
File: Питон-внезапно-322691.jpeg
Jpeg, 78.22 KB, 700×525 - Click the image to expand
edit Find source with google Find source with iqdb
Питон-внезапно-322691.jpeg
>>35011
пик отклеился.
>> No.35081 Reply
Анон, подскажи, как полностью выпилить python 2.7 с компьютера? Не так давно проявил фантастический долбоебизм - при живом и рабочем Python(xy) зачем-то поставил Python 2.7. Spyder тут же накрылся, при каждой попытке запуска выводилось Spyder crashed during last session. При переустановке Python(xy) выводит предупреждение, что на компьютере уже стоит Python 2.7., как удалить его - не знаю, в "программах и компонентах" нет, но где-то, видимо, скрывается.
>> No.35084 Reply
>>35081
В path проверь.
>> No.35086 Reply
>>35084
У меня все добро работает и без прописки в path - находит по регистру, подозреваю.
>> No.35155 Reply
>>35084
Сейчас я "будто бы всё удалил" и хочу заново поставить Python(xy). В Path тоже ничего от старых не осталось. И всё равно, в начале установки выскакивает предупреждение, что на компьютере есть другая версия Python.
>> No.35171 Reply
>>35155
Реестр почисть
>> No.35210 Reply
>>35081
время переустанавливать шинвдовs
>> No.35215 Reply
File: spinegirl_by_kingdeadman-d5cxduj.jpg
Jpg, 54.13 KB, 560×660 - Click the image to expand
edit Find source with google Find source with iqdb
spinegirl_by_kingdeadman-d5cxduj.jpg
Няши, сегодня я первый раз открыл питон и начал его ковырять. расскажите мне о лучших практиках работы со стрингами.
в чём разница "яблоки" и 'груши'?
что предпочтительнее "лётчик " + name + " не понимает" или "лётчик %s не понимает" %name
>> No.35220 Reply
в чём разница " и ' для обозначения стрингов?
как лучше конкатенировать стринги? "пукан" + boom или же "пукан %s" % boom
>> No.35228 Reply
>>35215
> в чём разница "яблоки" и 'груши'?
C ' не нужно лишнюю клавишу (shift) нажимать.
"лётчик %s не понимает" % name
или
"лётчик {} не понимает".format(name)
Последний вариант предпочтительнее, им чаще пользуются, помогает от некоторых неоднозначностей избавиться, больше возможностей форматирования, но первый мне лично больше нравится, компактнее.
>> No.35300 Reply
есть список с bytes, как его записать в файл через BufferedWriter?
>> No.35306 Reply
Какую питоноIDE используешь, и почему? Не могу найти идеальный вариант а внутренний перфекционист хочет его найти.
Симпатичны пока IEP и Ninja.
>> No.35307 Reply
>>35306
Критерии выбора IDE у меня практически равны критериям выбора партии среди быдла в современной россии.
>> No.35318 Reply
>>35306
PyCharm, т.к. привык к PhpStorm и RubyMine. Опепативы 8 гигов, проц i5, жить можно.
>> No.35319 Reply
>>35307
То есть, используешь то, что идёт по умолчанию — IDLE?
>> No.35322 Reply
>>35306
Spyder.
+ Поддержка SciPy, NumPy, IPython
>> No.35360 Reply
>>35306
Э-э… Vim. Потому что больше ничего не нужно.
>> No.35365 Reply
>>35360
потому что ты ничего больше не умеешь?
>> No.35368 Reply
Допустим, нужно вывести содержание всех элементов в элементе.
Как это делаю я:
for a in mod.element:
	print(eval("mod.element." + a))
Можно ли это сделать прямее? А именно, есть ли некий модификатор который будет изменять интерпретацию значений a, которая равны элементу внутри mod.element со строки на код?

Такой код, например
for a in mod.element:
	print(a)
...лишь печатает само название элемента, что наверное было сделано для того чтобы дети быстрее освоили язык.
>> No.35370 Reply
>> No.35380 Reply
Почему нельзя сделать так?
i = -1
while i+=1 < 1000:
    # do something
    pass
Выбрасывает скупо SyntaxError.
>> No.35381 Reply
>>35380
А как ты собрался к i прибавлять 1 < 1000?
>> No.35396 Reply
>>35381
То же самое происходит если взять его в скобки. Уже пробовал.
>> No.35397 Reply
>>35396
Имею ввиду i+=1.
>> No.35404 Reply
>>35380
Потому что "i += 1" — это не expression, и значания у него нет.
>> No.35406 Reply
>>35404
Питонопроблемы.
крестобог
>> No.35408 Reply
>>35406
> шоколадопроблемы
> говнобог
>> No.35409 Reply
>>35404
Кривизна языка. Почему этот оператор нельзя сделать производителем выражений? Даже в чистом си есть.
>> No.35410 Reply
File: 6e07469b23c279438...
Jpg, 139.45 KB, 687×800
edit Find source with google Find source with iqdb
6e07469b23c279438f6da6dca7cd2112.jpg
File: 10.jpg
Jpg, 209.43 KB, 704×396
edit Find source with google Find source with iqdb
10.jpg

>>35380
> Почему нельзя сделать так?
Потомушта атата. Нельзя так делать.
while не предназначен для перебора последовательностей. Ибо есть for же. Если нужно пройтись по сложной последовательности чисел, то инкапсулируй всё это непотребство в итератор.

>>35409
> Кривизна языка.
А зойчем вообще так делать? Спортивная стрельба по своим ногам?
Это далеко не баг. Это фича. При том годная весьма.
> Почему этот оператор нельзя сделать производителем выражений?
Да ты упорот же.
> Даже в чистом си есть.
В Няшном нет ничего, кроме нескольких сортов int-а. Если ты думаешь, что это не так, то ты не знаешь Няшный. И уж тем более в Няшном нет указателей, но есть номера ячеек памяти.
while в си не эквивалентен while в питоне
Та же фигня со всякими for и if.
А знаешь почему? Да потомушта питон не си-подобный ЯП.

мимоняшнобог
>> No.35413 Reply
>>35410
Что такое няшный?
>> No.35416 Reply
>> No.35476 Reply
Python2
Допустим есть один класс с методом:
''
class TestClass():
def __init__(self, a,b):
    self.a=a
    self.b=b
def test(self):
    return self.a*self.b
''
Создаю экземпляр и хочу, чтобы метод мне отработал
''
x=TestClass(2,2)
print x.test
''
А он мне начинает телегу толкать про какой-то
''
<bound method TestClass.test of <main.TestClass instance at 0xb750336c>>
''
Что мне сделать, чтобы метод просто передавал 4?
В гугл сходил, результат неудовлетворительный.
>> No.35477 Reply
>>35476
Зафейлил разметку
class TestClass():
    def __init__(self, a,b):
        self.a=a
        self.b=b
    def test(self):
        return self.a*self.b

x=TestClass(2,2)
print x.test
Выдает:
<bound method TestClass.test of <__main__.TestClass instance at 0xb750336c>>
>> No.35478 Reply
File: Снимок-экрана-17.11.2013-20:06:47.png
Png, 27.95 KB, 640×506 - Click the image to expand
edit Find source with google Find source with iqdb
Снимок-экрана-17.11.2013-20:06:47.png
>>35476
> print x.test()
>> No.35480 Reply
>>35478
Спасибо, анон.
>> No.35482 Reply
>>35481
Совсем косой. Извините.
>> No.35491 Reply
>>35410
> Да ты упорот же.
Понятно же вроде объяснил. Попробуй лучше.
Можно только привести еще пример.
i = 1
(i+=1)-1 == SyntaxError.
> А зойчем вообще так делать? Спортивная стрельба по своим ногам?
> Это далеко не баг. Это фича. При том годная весьма.
Элегантное малострочное решение задач. В самом стандартном k&r, как я уже сказал, встречается уйму раз. Тебе просто непривычно. Так и мне было.
>> No.35498 Reply
>>35491
> Элегантное малострочное решение задач
с нулевой сопровождаемостью.
>> No.35506 Reply
Питоны, делая из своего набора функций и переменных класс с методами, написал self более 9000 раз.
Я что-то делаю не так, или это еще одна прекрасная сторона ООП, которая ждет меня в любом языке программирования?
>> No.35508 Reply
Какой толк от классов? Я имею ввиду зачем они существуют, если можно писать например так:

def qwerty():
print 1111
def ololo():
qwerty()
И объясните тупому что такое в каждом классе и функции self.
>> No.35512 Reply
>>35508
Так нельзя писать, нужны отступы птрсн.жпг
>>35506
Непосредственно к ООП эта особенность имеет минимальное отношение. В крестах можно без этого, только вот во избежание конфликта с именами параметров многие всё равно пишут через this-> или приписывают богомерзкое m_ ко всем членам класса.
>> No.35514 Reply
File: такие-дела.jpg
Jpg, 35.82 KB, 604×400 - Click the image to expand
edit Find source with google Find source with iqdb
такие-дела.jpg
>>35506
Мне например на собеседованиях большинство работодателей пытается доказать что паттерны проектирования являются главной и неотъемлемой частью ООП, несмотря на то что паттерны - это примитивные алгоритмы, а уж с классами они будут или без - дело десятое. Карочи мир жесток и несправедлив.
>> No.35521 Reply
>>35514
> паттерны [ООП] - это примитивные алгоритмы
Извини, анон, но ты идиот, не понимающий сути(тм) ООП. Паттерны - это не алгоритмы, а способы организации классов для решения какой-то типовой задачи. Слово "алгоритмы" к ним применимо примерно так же, как, например, к связи таблиц БД на ER-диаграмме.
>> No.35524 Reply
>>35514
Мне например на собеседованиях большинство пидарасов пытается доказать что паттерны проектирования являются главной и неотъемлемой частью ООП, несмотря на то что паттерны - это примитивные костыли для тех языков, где нет функций высших порядков, и где задача "передать на вход функции сортировки функцию сравнения" вызывает унижение и боль, а уж с классами они будут или без - дело десятое. Карочи мир жесток и несправедлив.
>> No.35528 Reply
Питач, у меня тут проблема с форматированием. Вот есть у меня стринг

eingabe = '86 232 69 131 84 218 86 29 83 210 82 67'

А мне его нужно выровнять по колонкам:

ausgabe = ' 86 232 69 131 84 218 86 29 83 210 82 67'

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

def fstr(s):
   t = s.split()
   result = ''
   for i in t:
   result += " " * (4 - len(i)) + i
   return result

Чую, что можно сделать красивее.
>> No.35529 Reply
>>35528
с разметкой я зафейлил, Антон.
>> No.35530 Reply
>>35524
я бы оставил на произвол судьбы свидетелей иеговы, которые затесались в мой домашний кружок бесед, и каждый день ходил бы на такие собеседования, просто потому, что я восхищаюсь полётом мысли идиотов.
>> No.35531 Reply
>>35508
А можно вот так:
class QwertyOlolo():
    def qwerty(self):
    print 1111
    def ololo():
    self.qwerty()
>> No.35532 Reply
>>35531
Только работать не будет потому, что я опять забыл сраный self
>> No.35533 Reply
>>35528
ns = eingabe.split()
w = max(map(len, ns)) + 1

print(''.join(map(('{:>%d}' % w).format, ns)))
# или
print((('{:>%d}' % w) * len(ns)).format(*ns))
``
>> No.35534 Reply
В продолжение темы про пропущенные скобки при вызове метода.
Анон, как мне сделать, чтобы при обращении типа:
> > > a.b
В случае наличия в объекте значения b, передавалось это значиние, а в случае отсутствия автоматически вызывался метод a.b()?
>> No.35535 Reply
>>35534
class БуханкаХлеба:
    @property
    def тролейбус(self):
        """Но зачем??!"""
        if имеет_значение(self._b):
            return self._b

        return self._b()
>> No.35538 Reply
Антон, а как няшно заполнять Dict, в котором только ключи без значений? (или просто перезаписать значения из list)

d = {"Петрович": None, "Палыч": None, "Мухтар": None}
l = ["1 бутылка", "1 бутылка", "сок"]

так вот, как сделать, чтобы было:

d = {"Петрович": "1 бутылка", "Палыч": "1 бутылка", "Мухтар": "сок"}

есть ли вариант без всяких for key in d ?
>> No.35544 Reply
>>35538
d.update(zip(sorted(d), l))
>> No.35545 Reply
Спасибо, Антон
>> No.35547 Reply
File: what_a_fuck_i_am_doing.png
Png, 240.06 KB, 721×300 - Click the image to expand
edit Find source with google Find source with iqdb
what_a_fuck_i_am_doing.png
я уже двадцать минут как питонист. такая проблема - хочу распарсить страницу через BeautifulSoup, но как получить эту самую страницу из интернетов, если нужна печенька с sessionID? ну печенька-то у меня уже есть, а как её передать серверу через третий питон? какие модули (да и же тысячи!) для этого использовать и как это всё будет выглядеть?
>> No.35550 Reply
>> No.35553 Reply
File: Святой-Дух1.jpg
Jpg, 194.91 KB, 700×495 - Click the image to expand
edit Find source with google Find source with iqdb
Святой-Дух1.jpg
>>35550
а она не устарела? я хочу использовать что-то перспективное, чтоб дух времени удовлятворяла
>> No.35554 Reply
File: et.jpg
Jpg, 18.47 KB, 460×296 - Click the image to expand
edit Find source with google Find source with iqdb
et.jpg
>>35550
а она не устарела? я хочу использовать что-то перспективное, чтоб дух времени удовлятворяла
>> No.35557 Reply
>>35550
а что оно такое грубо неотёсанное?
>> No.35559 Reply
>>35550
можешь дать пример?
>> No.35560 Reply
File: 1246397463874.jpg
Jpg, 29.47 KB, 320×240 - Click the image to expand
edit Find source with google Find source with iqdb
1246397463874.jpg
как считать из файла печеньку, что в JSON формате?
>> No.35561 Reply
File: 1246398152666.png
Png, 14.17 KB, 661×577 - Click the image to expand
edit Find source with google Find source with iqdb
1246398152666.png
как считать из файла печеньку, что в JSON формате?
>> No.35567 Reply
Даблпостер, ты опять выходишь на связь ТЕПЕРЬ С РАЗНЫМИ КАРТИНКАМИ БЕСПЛАТНО БЕЗ СМС!!!?
>>35553
> 3.3
> устарела
Конечно устарела, епт, сейчас всё под мабилки пишут на сярпе и жаве, нахуй питон.
>>35557
Оно есть, оно работает, этого вполне хватает для того, чтоб сделать нормальный запрос.
>>35559
http://docs.python.org/3.3/library/urllib.request.html#examples ?
>> No.35603 Reply
Наверное не я один устал ждать API на ЛОРе, хочу запилить принципиально™ новый™ ЛОР-клиент™©® на замену почившей LORA.

Берем рандомный тред

import requests
`r = requests.get('https://www.linux.org.ru/forum/desktop/9855376/comments')`
`r.headers['content-type']`
`'application/json;charset=UTF-8'`
`r.json()`
`Out[90]:` 
`{u'comments': [{u'author': {u'nick': u'ziemin', u'stars': [True]},`
   `u'deletable': False,`
   `u'deleted': False,`
   `u'editable': False,`
   `u'id': 9855413,`
   `u'postdate': u'2013-11-23T13:38:15.708+0000',`
   `u'processedMessage': u'<p><b>\u0412\u043d\u0438\u043c\u0430\u043d\u0438\u0435:</b> <a href="https://www.linux.org.ru/wiki/en/Lorcode">\u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0439\u0442\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0440\u0430\u0437\u043c\u0435\u0442\u043a\u0438 LORCODE</a></p>',`
   `u'userpic': {u'height': 129,`
    `u'url': u'/photos/105962:-960368627.png',`
    `u'width': 146}},`
  `{u'author': {u'nick': u'fornlr', u'stars': [True]},`
   `u'deletable': False,`
   `u'deleted': False,`
   `u'editSummary': {u'editCount': 1,`
    `u'editDate': u'2013-11-23T13:48:38.365+0000',`
    `u'editNick': u'fornlr'},`
   `u'editable': False,`
   `u'id': 9855446,`
   `u'postdate': u'2013-11-23T13:47:29.973+0000',`
   `u'processedMessage': u'<p>\u041d\u0443 \u0445\u0432\u0430\u0442\u0438\u0442 \u0443\u0436\u0435 \u0442\u0440\u0443\u043f \u043d\u0430\u0441\u0438\u043b\u043e\u0432\u0430\u0442\u044c :/ <a href="http://www.kali.org/">http://www.kali.org/</a></p>',`
   `u'userpic': {u'height': 150,`
    `u'url': u'/photos/108412:1512604789.png',`
    `u'width': 150}},`
  `{u'author': {u'nick': u'smilessss', u'stars': [True, True]},`
   `u'deletable': False,`
   `u'deleted': False,`
   `u'editable': False,`
   `u'id': 9855454,`
   `u'postdate': u'2013-11-23T13:50:13.759+0000',`
   `u'processedMessage': u'<div class="none">&gt;&gt;-----\u0426\u0438\u0442\u0430\u0442\u0430----&gt;&gt;</div><div class="quote"><p>\u0441\u0442\u0430\u0432\u043b\u044e \u0431\u0430\u043a\u0442\u0440\u0430\u043a<br></p></div><div class="none">&lt;&lt;-----\u0426\u0438\u0442\u0430\u0442\u0430----&lt;&lt;</div><p>\u043a\u043e\u0433\u043e \u043b\u043e\u043c\u0430\u0442\u044c \u0441\u043e\u0431\u0440\u0430\u043b\u0441\u044f ?<br>\u0435\u0441\u043b\u0438 \u0434\u043b\u044f &#171;\u0430\u0443\u0434\u0438\u0442\u0430 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u0432\u043e\u0435\u0439 \u0441\u0435\u0442\u0438&#187; \u0442\u043e \u0441\u0442\u0430\u0432\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u0432 \u0441\u0432\u043e\u0439 \u0434\u0438\u0441\u0442\u0440, \u0433\u0434\u0435 \u0432\u0441\u0451 \u0443\u0436\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043e. </p>',`
   `u'userpic': {u'height': 150,`
    `u'url': u'/photos/102112:-873217890.jpg',`
    `u'width': 150}},`
  `{u'author': {u'nick': u'ymnikvlz'},`
   `u'deletable': False,`
   `u'deleted': False,`
   `u'editable': False,`
   `u'id': 9855473,`
   `u'postdate': u'2013-11-23T13:54:29.825+0000',`
   `u'processedMessage': u'<p>\u0441\u043f\u0430\u0441\u0438\u0431\u043e \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u044e kali \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c .</p>',`
   `u'reply': {u'author': u'fornlr',`
    `u'id': 9855446,`
    `u'postdate': u'2013-11-23T13:47:29.973+0000',`
    `u'samePage': True},`
   `u'userpic': {u'height': 150,`
    `u'url': u'https://secure.gravatar.com/avatar/83f8dadb9b79976e7d9cc39e6457f33e?s=150&r=g&d=blank',`
    `u'width': 150}},`
  `{u'author': {u'nick': u'ymnikvlz'},`
   `u'deletable': False,`
   `u'deleted': False,`
   `u'editable': False,`
   `u'id': 9855483,`
   `u'postdate': u'2013-11-23T13:56:33.552+0000',`
   `u'processedMessage': u'<p>\u041b\u043e\u043c\u0430\u0442\u044c \u043d\u0438\u043a\u043e\u0433\u043e \u043d\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u043b\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0437\u0443\u0447\u0430\u044e \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e \u0441\u0432\u043e\u0451 \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u0435. \u0421\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0441\u044f \u0441 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439 \u0432\u0438\u0434\u0435\u043e\u0434\u0440\u0430\u0439\u0432\u0435\u0440\u043e\u0432 \u0438 \u043f\u044b\u0442\u0430\u044e\u0441\u044c \u0445\u043e\u0442\u044c \u043a\u0430\u043a-\u0442\u043e \u043d\u0430\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u0440\u0435\u0448\u0430\u0442\u044c \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0432 linux  </p>',`
   `u'reply': {u'author': u'smilessss',`
    `u'id': 9855454,`
    `u'postdate': u'2013-11-23T13:50:13.759+0000',`
    `u'samePage': True},`
   `u'userpic': {u'height': 150,`
    `u'url': u'https://secure.gravatar.com/avatar/83f8dadb9b79976e7d9cc39e6457f33e?s=150&r=g&d=blank',`
    `u'width': 150}}],`
 `u'topic': {u'commentsAllowed': True,`
  `u'id': 9855376,`
  `u'link': u'/forum/desktop/9855376'}}`
dictionary_1 = dict(r.json()) ``
In [92]: dictionary_1['url'] --------------------------------------------------------------------------- KeyError Traceback (most recent call last) <ipython-input-92-70195ecbb415> in <module>() ----> 1 dictionary_1['url'] KeyError: 'url' Каким способом можно ответ перевести в читабельный словарь?
>> No.35604 Reply
>>35603
лицоладонь.жпг
Пользуй пестебин чтоли, твоя разметка отвратна.

АПИ на ЛОРе мог бы взять и запилить сам, исходники на гитхабе имеются.
>> No.35605 Reply
>>35603
Альзо,
#!/usr/bin/env python3
вместо `u'юникотная-строка' и прочей питухон2 некрофилии я бы пользовал, если бы писал на питоне, лол.
>> No.35864 Reply
File: -.jpg
Jpg, 292.60 KB, 1280×960 - Click the image to expand
edit Find source with google Find source with iqdb
-.jpg
Что почитать про хайлоад?
>> No.35983 Reply
File: b2887d3346feb70512a6c075be4fd809e3a2acbc.jpg
Jpg, 147.43 KB, 568×800 - Click the image to expand
edit Find source with google Find source with iqdb
b2887d3346feb70512a6c075be4fd809e3a2acbc.jpg
Аноны, могу ли я сюда обратиться с проблемой по Ren'Py, или мне в другой тред?
>> No.35984 Reply
>>35983
Логичней спросить на прямую у авторов и комьюнити, они ж там целые уроки клепали.
>> No.35985 Reply
>>35984
У меня проблема не напрямую с создаванием кода, а скорее с копанием чужого - автор оригинального кода не отзывается, уроки комьюнити шерстил, но тамошний ответ мне не помог.
>> No.35986 Reply
>>35985
Ну показывай.
>> No.35987 Reply
>>35986
Пилю перевод этой игрульки: http://scoutshonour.com/digital/
Наживую, бо сам не кодер и особенными приёмами не владею. Просто заменяю текст в самом коде.

Проблема в том, что невозможно перевести заглавия писем - выдает ошибку:

I'm sorry, but an exception occured while executing your Ren'Py
script.

UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-10: ordinal not in range(128)

While running game code:
   - script at line 187 of C:\Program Files\Digital - A Love Story/game/script.rpy

-- Full Traceback ------------------------------------------------------------

   File "C:\Program Files\Digital - A Love Story\renpy\bootstrap.py", line 260, in bootstrap
   File "C:\Program Files\Digital - A Love Story\renpy\main.py", line 310, in main
   File "C:\Program Files\Digital - A Love Story\renpy\main.py", line 93, in run
   File "C:\Program Files\Digital - A Love Story\renpy\execution.py", line 236, in run
   File "C:\Program Files\Digital - A Love Story\renpy\script.py", line 466, in lookup
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-10: ordinal not in range(128)

While running game code:
   - script at line 187 of C:\Program Files\Digital - A Love Story/game/script.rpy

Ren'Py Version: Ren'Py 6.10.2e


Шрифт проверял - необходимые символы имеются. Не знаю, что не так и что ему не нравится.
>> No.35988 Reply
>>35987
Строки сами юникодные? Должны быть вида u'fghfgh', либо в файле явно кодировка задана, хотя чёрт его знает, что там ренру ещё добавить может. А если питон третий, то тем более не понятно какие проблемы могут быть.
>> No.35990 Reply
>>35988
Нет, не такие.

Но при правке простого текста всё идёт, как часы, без всяких проблем.
>> No.35991 Reply
>>35864
Ничего.
>> No.35997 Reply
>>35991
На питон хайлоад невозможен из-за его слоупочности?
>> No.36034 Reply
>>35997
Он возможен даже на похэпэ, но готовые рецепты никто подробно описывает, потому что это всё делается на практике индивидуально для каждого конкретного проекта.
>> No.36044 Reply
File: -.jpg
Jpg, 69.16 KB, 700×525 - Click the image to expand
edit Find source with google Find source with iqdb
-.jpg
Имею на входе ['dict']['comment'] со всякими &#44, <br />, &quot; и так далее. Подскажите простой и красивый способ вырезать, желательно без replace, т.к. придется руками собирать их.
>> No.36045 Reply
>>36044
Да, js там тоже присутствует.
>> No.36048 Reply
>> No.36063 Reply
Антуаны, поведуйте, а как вы учили тот же питон или другой ЯП? Именно с чего начинали и через сколько был результат? Т.е. написание своих программ.
>> No.36064 Reply
>>36063
В школе паскаль показали. Когда понимаешь Суть, становится все равно на чем писать уже.
>> No.36070 Reply
>>36063
В школе мы изучали Бейсик Вильнюс и рисовали блок-схемы, был еще какой-то учебник по информатике на байтолюбские и алгоритмические темы. В универе на первом курсе были паскаль и сишка. Имхо программирование на императивных ЯП дается сразу либо никогда. Склад ума должен быть нужный, ну и практиковаться надо, книжки там всякие умные читать.
>> No.36221 Reply
File: 1372058538716.jpg
Jpg, 764.10 KB, 1600×1200 - Click the image to expand
edit Find source with google Find source with iqdb
1372058538716.jpg
Доброчан, помоги!
http://pastebin.com/shxma2i1
Прокси сервер на twisted который не делает ничего кроме принятия и отправки сообщений. Некоторые сайты через него работают нормально, - никаких ошибок: nowere.net, konachan.com. Некоторые не грузятся полностью и в консоли появляются deffered error, но из-за чего - мне непонятно. Такое случается на iichan.hk и vk.com(при скролинге вниз не подгружаются картинки альбома, что очень важно. пишу грабер) Цель - добиться правильной работы на vk.com, сижу не первую неделю.
>> No.36236 Reply
Доброй ночи, доброанон :3

Почему такой код

for i in range(len(dic['thread'])):
num = dic['thread'][i][0]['num']
com = dic['thread'][i][0]['comment']
cur.execute('INSERT INTO i (id, post) VALUES (?, ?), (num, com)')
con.commit()
возвращает такую ошибку
  2     num = dic['thread'][i][0]['num']
  3     com = dic['thread'][i][0]['comment']
----> 4 cur.execute('INSERT INTO i (id, post) VALUES (?, ?), (num, com)')
  5     con.commit()
  6 
OperationalError: no such column: num

?
Вроде же всё по мануалу, а сам врубится не могу :(
>> No.36237 Reply
>>36236
А, разобрался. (num, com) надо за кавычку выносить.
>> No.36252 Reply
File: 1372058596133.jpg
Jpg, 1477.02 KB, 1680×1050 - Click the image to expand
edit Find source with google Find source with iqdb
1372058596133.jpg
>>36221
Бамп
>> No.36274 Reply
Аноны, а можно на питончике распараллелить числодробилку по ядрам? Их у меня 4, хочется скорости. Но, насколько я знаю, CPython выполняется только на одном ядре.
>> No.36282 Reply
>>36274
Тебе ничто не мешает запустить несколько независимых процессов, а они уже будут выполняться как угодно. Если совсем просто, то используй multiprocessing.Pool.map. Работает так же, как и обычный map, но в несколько процессов. Правда, у него есть куча ограничений на то, какие ему можно пихать функции (грубо говоря, никакого кода, определённого внутри классов). Поэтому если хочешь что-то позаковыристее простых вычислений над списком, делай свой класс-наследник multiprocessing.Thread.
>> No.36467 Reply
Вопрос про regex:
Как в конструкцию вида [^123], записать 123 которые будут восприниматся как подряд идущие символы "1" "2" "3", т.е. как regex, а не просто набор символов.
>> No.36474 Reply
>>36467
По хорошему никак, по плохому можно добиться похожего через negative look ahead/back
stackoverflow.com/questions/406230/regular-expression-to-match-string-not-containing-a-word
>> No.36635 Reply
File: 1.py
Py, 0.00 KB, 0 lines - Click the image to get file
view edit
1.py
Привет, бидонщики.
Наверняка тут есть люди, которые писали парсеры доброчана, так что я пришёл посоветоваться.
Это моё детище, которое чекает новые посты и выводит сообщение при их появлении.

Не могли бы вы мне посоветовать, что можно улучшить или оптимизировать. Бидон не знаю, писал вслепую
>> No.36636 Reply
>>36635
Каждые 30 секунд ты спамишь запросами на кучу тредов вместо того, чтоб просто проверять закладки. Отличная идея, чо.
>> No.36637 Reply
>>36636
Объясни@обоснуй.
Для начала за закладки. Что это и как их пользовать с помощью API
>> No.36638 Reply
>>36637
/api/user.json?threads. Единственная проблема, что сейчас в той же куче скрытые треды, но это обещали поправить.
>> No.36639 Reply
>>36638
Ты предлагаешь мне где-то хранить кукисы и + каким образом мне добавлять треды в закладки через бидон?
>> No.36640 Reply
>>36639
Добавлю, что добавил через бравзер, зашел, смотрю выхлоп, а там, например lastpostid == null, unread == 0, хотя я знаю, что уже насыпалось как минимум одно сообщение в треде. Может я не туда смотрю, но теперь не могу понять, как именно мне понимать, что появился новый пост.

"threads":
   [
   {
   "board_id": 1,
   "thread_id": 267218,
   "lastpostid": null,
   "last_viewed": "2014-01-13 13:55:40.301217",
   "level": "bookmarked",
   "unread": 0,
   "class": "UserThread",
   "last_hit": null
   },
   {
   "board_id": 24,
   "thread_id": 227951,
   "lastpostid": null,
   "last_viewed": "2014-01-13 13:58:50.336214",
   "level": "bookmarked",
   "unread": 0,
   "class": "UserThread",
   "last_hit": null
   }
   ]
>> No.36641 Reply
>>36639
Я предлагаю пожалеть Доброчан и не устраивать ему регулярные стресс-тесты.
Хранить печеньки не сложнее хранения списка тредов.
> каким образом мне добавлять треды в закладки через бидон
Тем же, каким производятся все остальные взаимодействия с Доброчаном. /api/thread/b/123/sign.json
>> No.36642 Reply
>>36641
Так, тогда вопрос, где мне почитать полную доку по API?
>>/help/api здесь нет ничего за sign например
>> No.36643 Reply
Лол, я тебя таки обманул. Эта срань в закладках и правда не работает. Ну тогда мод тебе судья.
>> No.36644 Reply
>>36642
Там много чего нет. Кури скрипт ханабиры.
>> No.36645 Reply
>>36644
Но ведь наверняка закладки это где-то внутри системы и в api никак не выводится.
Какой тогда смысл что-то там искать в коде, если извне я всё равно не смогу получить эти данные?
Или предлагаешь парсить выхлоп самой борды? Это же неблагодарное дело. ничем не лучше моего подхода.
>> No.36646 Reply
>>36645
Я уже ничего не предлагаю. Мне казалось апи закладок нормально работает, а оно вот оно как.
>> No.36820 Reply
http://programarcadegames.com/index.php?lang=en
Что по поводу этого скажете? Стоит пробовать, если я новичок?
>> No.36937 Reply
Анон, а как на питоне максимально изящно определить, соответствуют ли 2 строки одному и тому же регулярному выражению?

Например, если нужно сдетектировать одинаковые последовательности гласных-согласных.

Думаю упрощать обе строки и просто сравнивать, но кажется грубоватым решением.
>> No.36939 Reply
>>36937
> соответствуют ли 2 строки одному и тому же регулярному выражению
Применить выражение на каждую строку и сравнить результаты.
все_соответствуют = all(выражение(строка) for строка in строки)
> сдетектировать одинаковые последовательности гласных-согласных
Не совсем понятно что именно ты хочешь "сдетектировать" (наличие,количество,порядок,индекс,..)
>> No.36942 Reply
>>36939
> все_соответствуют = all(выражение(строка) for строка in строки)
не совсем понял.
> Не совсем понятно что именно ты хочешь "сдетектировать" (наличие,количество,порядок,индекс,..)
ну вот например, критерий "эквивалемтности" - это порядок гласных/согласных.
тогда строки "ололо" (ГСГСГ) и "ороро" (ГСГСГ) эквивалентны, а "ололо" и "битард" (СГСГСС) - нет.

Или критерий - чредование гласных/согласных с игнорированием повторов, например строка (СГГГС) эквивалентна строке (СГС).

пытаюсь найти способ решить это с помощью регулярных выражений, за один проход независимо от кол-ва критериев эквивалентности, но не знаю возможно ли.
>> No.36944 Reply
>>36942
Из этого получается хорошая сеть переходов состояний (сеть Маркова вроде), но не знаю как это заюзать.
>> No.36948 Reply
>>36942
Я бы сделал как то так:
https://ideone.com/pnWF2g
>> No.36956 Reply
File: 418-ScMQEfy.jpg
Jpg, 623.99 KB, 1997×1248
edit Find source with google Find source with iqdb
418-ScMQEfy.jpg
File: 316-yX4bBt7.jpg
Jpg, 131.77 KB, 1920×1080
edit Find source with google Find source with iqdb
316-yX4bBt7.jpg
File: 443-CPGLPrB.jpg
Jpg, 330.99 KB, 1366×768
edit Find source with google Find source with iqdb
443-CPGLPrB.jpg
File: 227-sFRvocO.jpg
Jpg, 116.34 KB, 1024×576
edit Find source with google Find source with iqdb
227-sFRvocO.jpg
File: 416-DSY1lSo.jpg
Jpg, 468.62 KB, 1920×1080
edit Find source with google Find source with iqdb
416-DSY1lSo.jpg

>>36948
> isVowel = set('AЕЁИОУЫЭЮЯаеёиоуыэюя').contains
> equivalent("ололо", "ороро", keyfunc=partial(map, isVowel))
> for c, _ in groupby(map(isVowel, cs)):
немножко просветлился.
тысячи добра тебе.
>> No.36980 Reply
Где можно почитать про адекватные требования например к мидлу? Зашел на хх, там ересь какая-то. В заголовке написано вакансия для питонщика, а внутри css, html5, dhtml, js, jquery и так далее. Или это нормально считается?
>> No.36981 Reply
File: 129477643857977.jpg
Jpg, 304.94 KB, 630×800
Your censorship settings forbid this file.
r-18
>>36980
На самом деле тебя подсадят там на джангу какую-нибудь и будешь сайты клепать как обычная вебмакака.


Энивей, надоело быдлокодить а наверняка именно это у меня выходит сейчас, несмотря на кошерную документацию и ебучий пичарм, истерящий на каждый лишний пробел, хочу почитать умные книги и писать хорошо. Про Лутца говорят, что воды много. От Dive into Python я, если честно, охуел, потому что ну совсем для нубов же. И не устарела ли она за 10 лет-то?
>> No.36982 Reply
>>36981

Какой ужас ты сейчас написал. А кроме джанги питон уже всё?
>> No.36983 Reply
>>36982
Ни разу не видел вакансии с питоном без требования других языков или той же джанги. Хотя я особо и не искал.
>> No.36984 Reply
>>36983
Грусть-тоска.
>> No.36986 Reply
>>36983
А для чего может быть использован скриптовый язык типа питона кроме веба и мелких скриптов для каких-то целей?
>> No.36987 Reply
>>36986
Для любого бэкэнд кода.
У того же гугла большая часть писалась на питоне какое-то время, сейчас вроде на какой-то свой велосипед переходят/перешли.
>> No.36988 Reply
>>36987
В смысле, бек-энд кода? Ты же опять про веб?
>> No.36989 Reply
>>36988
В том числе, но не обязательно. Любые дела, которые крутятся на никсовом сервере.

Вообще, питон для веба это скорее виток хипсторской моды. Сначала был питон, потом рельсы, сейчас уже переползают на всякие ноде.жс, лол.
>> No.36990 Reply
>>36986
Да хоть для чего! В нормальных странах, например, data science переходит/перешла на питон, опенсорс и всё такое. Numpy, nltk, pymorphy, тысячи других в pypi. Но в украшке/рашке только питон ассоциируется только со сраной джангой. Даже сраный WoT на питоне, но туда не имеет смысла отправлять резюме.
>> No.36991 Reply
>>36989
> Сначала был питон, потом рельсы, сейчас уже переползают на всякие ноде.жс, лол.
Это те, кто впереди планеты всей. Массовые сайтошлёпы же только начинают переходить на джанго.
>> No.36992 Reply
Анончик, дай мне какое-нибудь задание, только небольшое, так, для практики.
>> No.36997 Reply
>>36992
Есть сайт для перевода субтитров notabenoid.com, где есть мудаки, которые запрещают скачивать перевод, но зато смотреть его можно.
Например, http://notabenoid.com/book/39952 или http://notabenoid.com/book/43860
Напиши скрипт, который бы дергал оттуда перевод и красивенько собирал.
>> No.36998 Reply
>>36997
> статус готово
> овер9000 вариантов перевода каждого абзаца со срачами
Ну и нахуй такой перевод?
>> No.37018 Reply
>>36997
Объясни конкретнее что тебе нужно. Вот прошел я по ссылке, зашел например сюда http://notabenoid.com/book/39952/148744
Тебе надо стянуть http://notabenoid.com/book/%book%/%хуйпоймичто% все переводы? Сформулируй внятнее, я с радостью постараюсь тебе помочь.





А так же очень интересны идеи по пиздингу только добавленных файлов на рутрекерах, которые еще не проверили, но и не успели закрыть. Или там что-то поменялось?
>> No.37019 Reply
>>37018
На рутрекере же есть фид.
>> No.37030 Reply
File: 1382256615176.jpg
Jpg, 70.56 KB, 395×589 - Click the image to expand
edit Find source with google Find source with iqdb
1382256615176.jpg
QTCPSocket не дает считать строку. Выдает ошибку "RuntimeError: no access to protected functions or signals for objects not created from Python"
Серверный сокет на PyQt4, принимает соединение, state() возвращает 3(значит подключен), можно узнать хост, порт подключеного к нему сокета, прочитать строку нельзя.
self.sock = QTcpServer()
self.sock.listen(QHostAddress('127.0.0.1'), 8000)
self.sock.newConnection.connect(ф-ция печатает результат)
Клиент простой сокет python, отрабатывает без ошибок.
s = socket.socket()
s.connect(('127.0.0.1', 8000))
s.sendall('Hello Qt!')
s.close()
>> No.37046 Reply
>>37018
Стянуть текст из колонки "Перевод на русский" и собрать перевод. Так как в некоторых кусках много вариантов, то, видимо, следует выбирать самый заплюсованный.
Лучше начинать сразу с перевода сабов, а не книги, потому что там еще с временем слинковать надо.
>> No.37048 Reply
>>37046
Не вопрос. Накидай тз ага, без него макака не может и краткий ман как их готовить.
>> No.37049 Reply
File: 1383827587903.jpg
Jpg, 47.82 KB, 402×604 - Click the image to expand
edit Find source with google Find source with iqdb
1383827587903.jpg
>>37030
Всё, разобрался. Нужно было вытаскивать строку по сигналу QIODevice.readyRead().
>> No.37051 Reply
>>37030
Читай байты, а не строку.
>> No.37076 Reply
Поднимаю вопрос о литературе по второму питону. DYP прочитал пролистал, хайпа не понял - это же просто разжеванные доки пополам с понтами.
>> No.37098 Reply
>>37076
Попроще хз что предложить, попробуй справочник Бизли и погугли хаб про неизвестный питон. Алсо, зачем второй?
>> No.37099 Reply
>>36989
> Вообще, питон для веба это скорее виток хипсторской моды. Сначала был питон, потом рельсы, сейчас уже переползают на всякие ноде.жс, лол.
Да ну вас нахрен со своей хипстерской модой. похапе - адовое недоразумение. Непременно надо его куда-нибудь деть и на что-нибудь заменить. Почему кто-то должен мучиться с ним, если уже все поняли, что это за говно?
>> No.37106 Reply
File: -.png
Png, 36.73 KB, 909×352 - Click the image to expand
edit Find source with google Find source with iqdb
-.png
>> No.37108 Reply
>>37106
PHP не может быть лучшим выбором решительно ни для чего.
>> No.37113 Reply
>>37108

Два чая этому господину. PHP - решето.
>> No.37127 Reply
>>37098
Спасибо, посмотрю. Второй, потому что на третий ни сдл, ни киви не перенесли, да и для утилитарных задач хватает второго за глаза.
>> No.37130 Reply
Нужен новый тред.
>> No.37133 Reply
>>37130
Нужен ещё более графонистый питон. Может даже в 3д, ЕВПОЧЯ.
>> No.37135 Reply
>>37133
> pyformex - program to create 3D geometry from Python scripts.
М?
>> No.37136 Reply
>>37135
А так же
> Panda3D - 3D Engine
Алсо,
> pip search 3D
>> No.37386 Reply
File: getPics.py
Py, 0.00 KB, 0 lines - Click the image to get file
view edit
getPics.py
Ну что, бидонщики. Очередной охуительный скрипт от меня.
На этот раз мы скачиваем все все пикчи на всех всех досках :3
>> No.37548 Reply
File: wallpaper-71767.jpg
Jpg, 205.19 KB, 1024×768 - Click the image to expand
edit Find source with google Find source with iqdb
wallpaper-71767.jpg
Почему когда вызываешь какой нибудь класс без "()" в конце показывает участок памяти? Как посмотреть аттрибуты класса? dict? Dir - это просмотр методов класса? Что делать если документация говно, а читать исходники - из глаз течет кровь, from world import Everything и ты после импорта еще 20 библиотек теряешь сознание и аппетит.
В общем  вопрос как питон устроен на низком уровне и если я достигну сатори и пойму как он работает на низком уровне, я буду лучше понимать как работают классы, super, @ и другие адские вафли? Си немножко знаю, но мало. Хотет что бы дали ссылки на такие материалы - "класс выделяет участок в памяти, создаеться dict, а каждый класс Python имеет свой dict(что такое dict на примере памяти?)" 
   Желаю материал после которого я буду точно знать что такое класс и обьект класса.
>> No.38353 Reply
File: 1393010199747.jpg
Jpg, 36.26 KB, 391×366 - Click the image to expand
edit Find source with google Find source with iqdb
1393010199747.jpg
Всем доброй весны. Проблема вот в чем. Есть django-папка,в ней лежит папочка со статическими файлами и папочка с настройками джанги. В папке с настройками джанго хочу сделать универсальный поиск папки со статикой что бы можно было пользовать этот репозитарий на другом компе. Если использовать команду "os.getcwd()", получаешь текущую директорию - /home/minik/django/setting_django, а мне нужно директорию выше - /home/minik/django. Как это можно сделать? Или не парить себе мозги и перенисти папку со статикой?
>> No.38489 Reply
>>38353
> а мне нужно директорию выше
curr_path = os.getcwd() parent = os.path.join(curr_path, '..')
> хочу сделать универсальный поиск папки
os.walk(...)
>> No.38686 Reply
File: 1315946128187.jpg
Jpg, 161.04 KB, 1024×768 - Click the image to expand
edit Find source with google Find source with iqdb
1315946128187.jpg
>>37386
> онднопоточная загрузка
Ты серьезно?
>> No.38721 Reply
Как создать символьную ссылку? Пробовал subprocess, os.symlink - получаю нерабочую ссылку. Имя файла с пробелами. Пробовал заменять через имя.replace(' ', '\\ ') - не работает.
>> No.38806 Reply
File: tests.py
Py, 0.00 KB, 0 lines - Click the image to get file
view edit
tests.py
Анон, никак не могу написать тесты для Flask + MongoDB. Код в аттаче, выдаёт 404 Not Found. На тебя вся надежда.


Password:

[ /tv/ /rf/ /vg/ /a/ /b/ /u/ /bo/ /fur/ /to/ /dt/ /cp/ /oe/ /bg/ /ve/ /r/ /mad/ /d/ /mu/ /cr/ /di/ /sw/ /hr/ /wh/ /lor/ /s/ /hau/ /slow/ /gf/ /vn/ /w/ /ma/ /azu/ /wn/ ] [ Main | Settings | Bookmarks | Music Player ]