Ноу хау - от мастеров на заметку » Страница 7

-

Программирование на Python



JOIN_ME


репутация:
на сайте с 1970 года
сообщений:

#61

А мой вариант обыграть не пробовали? У меня проблем с рекурсией нету. Она закончится если при сканировании попадется вложенность папок более 1000, а это уже маловероятно. И еще - там где не хватает рекурсии, надо заюзать цикл.
Типа до:
def x():
. x()
типа после:
while 1:
. x()
в данном примере как вариант можно так закрутить (как я понял lst это список папок):
while lst:
. _scan(lst.pop(0))

dimy44


репутация: 537
на сайте с 2006 года
сообщений: 2540

HTC One S

Евпатория

Возраст - 53

#62

Хм. Нет у меня 1000. Вот незатейливый тест:
t = -1
def a():
. . . . global t
. . . . t += 1
. . . . open('D:\\recursion_test', 'w').write('recursion_test: %d' %t)
. . . . a()
a()
у меня 235 вызовов
-------------
добавлено в 12.45: JOIN_ME, твой способ пробовал, там кстати путь слэшами должен заканчиваться, выдало индексэррор, далее углубляться не стал че да как там, решил тогда свой сделать...

JOIN_ME


репутация:
на сайте с 1970 года
сообщений:

#63

Переполнение стека наверное происходит

Virtuos86


репутация: 101
на сайте с 2008 года
сообщений: 802

где-то в России

#64

Цитата: dimy44
Хм. Нет у меня 1000. Вот незатейливый тест:t = -1def a():. . . . global t. . . . t += 1. . . . open('D:\\recursion_test', 'w').write('recursion_test: %d' %t). . . . a()a()у меня 235 вызовов -------------добавлено в 12.45: JOIN_ME, твой способ пробовал, там кстати путь слэшами должен заканчиваться, выдало индексэррор, далее углубляться не стал че да как там, решил тогда свой сделать...


Вообще-то не очень удачная идея делать тест с I/O (вводом/выводом). Тут на нём весь оверхед получается, ИМХО.

dimy44


репутация: 537
на сайте с 2006 года
сообщений: 2540

HTC One S

Евпатория

Возраст - 53

#65

Вот такой компромисс предлагаю:
#
from e32 import ao_sleep
flag = 1 # флажок
def f(arg=0, step=0):
. . global flag
. . step += 1
. . arg += 1
. . if step == 50000: #кол-во итераций
. . . . flag = 0
. . if arg < 234 and flag:
. . . . f(arg, step)
. . elif arg == 234 and flag:
. . . . arg = 0
. . . . ao_sleep(0, lambda: f(arg, step))
f()
print 'start'
while flag: #блокировка до полной отработки
. . ao_sleep(0.1)
print 'finish'
#
-------------
добавлено в 11.23: Переделал сканер. Скан диска Е (910 файлов) дает выигрыш 8.5 против 10.2 сек. (в старом варианте)

Прикрепленный файл #1: c8_scanner.zip | скачать с зеркала | (1,53 Kb)
-------------
добавлено в 12.03: 243 папки

JOIN_ME


репутация:
на сайте с 1970 года
сообщений:

#66

Как известно для реализации меню appuifw.app.menu необходимо в эту переменную передать список кортежей вида (u'Заголовок', функция). Частой проблемой я вляется передача аргумента в данную функцию. Например:
аppuifw.app.menu = [(u'Menu1', func(1)), (u'Menu2', func(2))]
Все это легко решается с помощью lambda, но мне пришла идея задействовать фабрику функций (в соседней теме вспомнил об этой фиче). Примерно так:
1) переделываем функцию из например
def func(x):
. print x
в такую
def func(x):
. def fx():
. . print x
. return f
x
и теперь запись
аppuifw.app.menu = [(u'Menu1', func(1)), (u'Menu2', func(2))]
будет прекрасно выполняться. Чтото особо полезного здесь нет, зато эстетичнее кучи лямбд и читабельнее.

dimy44


репутация: 537
на сайте с 2006 года
сообщений: 2540

HTC One S

Евпатория

Возраст - 53

#67

В последнее время все чаще замечаю, что много народу строит интерфейс программ на питон 1.4.х., применяя popup_menu либо selection_list. В угоду сенсорам, или еще по другим причинам. При этом их нисколько не заботит, что, скажем подпись правого софта "Назад" или "Отмена", хотя там по сути выход, итп. В прикрепленном файле пример, как поставить свои подписи на софтклавиши (подстмотрел реализацию в appuifw2.py).
П.С. Виртуоз раньше пример подобный писал, но несколько иначе.

Прикрепленный файл #1: d3_set_softkey_title.zip (530 b)

iBiZoNiX


репутация:
на сайте с 1970 года
сообщений:

#68


def love(num):
if len(str(num)) >= 2 and str(num)[-2] == '1':
end = 'пар'
else:
if str(num)[-1] in ['2', '3', '4']:
end = 'пары'
elif str(num)[-1] in ['0', '5', '6', '7', '8', '9']:
end = 'пар'
else:
end = 'пара'
print 'На нашем сайте нашли друг друга %s %s'%(num, end)

>>> love(1)
На нашем сайте нашли друг друга 1 пара
>>> love(11)
На нашем сайте нашли друг друга 11 пар
>>> love(4254)
На нашем сайте нашли друг друга 4254 пары
>>>

dimy44


репутация: 537
на сайте с 2006 года
сообщений: 2540

HTC One S

Евпатория

Возраст - 53

#69

я бы посоветовал в самом начале записать в переменную num = str(num), чтобы в дальнейшем не тратить на это ресурсы.

JOIN_ME


репутация:
на сайте с 1970 года
сообщений:

#70

Ну или так


def love(num):
if num > 10 and num < 20:
end = 'пap'
else:
last = divmod(num, 10)[1]
if last in (2, 3, 4):
end = 'пapы'
elif last == 1:
end = 'пapa'
else:
end = 'пap'
return end


Яндекс.Метрика