Ноу хау - от мастеров на заметку

-

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



atrant


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

#1

В этой теме предлагаю публиковать свои прикольные решения частых, наболевших или сложных, короче, повседневных проблем. Примеры рецептов можно найти тут . Активно используйте прикрепленные файлы! Так будет удобнее и надежнее. В сообщении - описание, в файле - решение =)


тема создана:

Рейтинг: 4
голосов: 1

Virtuos86


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

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

#2

Пофиксил некоторые неточности.
Спасибо Krust'у. winked

Параллельный импорт вспомогательных модулей.
Подробно - в прикр. файле.

Прикрепленный файл #1: parallel_import_by_virtuos86_in_0401201033310_f.zip (1.27 кб)

Krust


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

#3

Интересно. Когда народу надоест писать True вместо того чтоб просто 1 написать... Alen, тогда бы уж ещё способы написал...
y={'a':0, 'b':3}.get(x, None) # если в словаре есть ключ x, y=value, иначе y=None
-------
y=new_y or y # если new_y ложь, остается старое значение y
-------
y=('a','b')[x] # если x==1:y='b'. Частный случай, смена языка note((u'Hi !',ru('Привет!'))[lang])
-------
def add_y():y=(y+1,0)[y==6] # в функции увеличиваем y на 1 пока не достигнет 6, потом он снова 0.
-------
-------------
добавлено в 21.10: Делать было нечего...Вот:
Класс, наследованный от типа словаря. Словарь получил новые методы


# heap.py,by Krust (31,12,2009)

class heap(dict):
  def __init__(self, default={}):
    self.update(default)
  
  def __call__(self, el=None):
    h=self.items()
    h.sort()
    if el is None:return h # items
    else:return [x[el] for x in h] # key or value
    
  def index(self, arg, el=0):
    # if el is 0: return key, if 1 return value
    return self(el).index(arg)
    
  def keys_v(self,value):
    return [item[0] for item in self() if item[1]==value]
  
if __name__=='__main__':
  m=heap({'a':2, 'c':4, 'b':1}) # создание словаря с дополнительными методами
  # дальше с m можно работать, как с обычным словарем. Кроме того дополнительно:
  print m() # то же что m.items(), только сортированный
  print m(0) # ключи словаря, сортированные
  print m(1) # значения словаря, сортированные по ключам
  print m.index('b') # индекс ключа '1' в сортированном списке ключей
  print m.index(2,1) # индекс значения 2
  print m.keys_v(2) # список ключей, у которых значение равно 2

Alen28


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

Nokia N82

Украина

Возраст - 31

#4

Krust, я только пример подал smile

Krust


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

#5

Функция возвращает список позиций вхождения строки string в текст text.
Необязательные аргументы:
register=1 # учитывать регист букв
edge=1 # искать слово только "целиком" (если подстрока-часть слова в тексте, она не принимается)


def search(text, string, register=None, edge=None):
  if not register:text,string=text.lower(),string.lower()
  if edge:
    def ist(t):
      return t.isalpha()+t.isdigit()*2+t.isspace()*4
    ed1,ed2,len_string,len_text=ist(string[0]),ist(string[-1]),string.__len__(),text.__len__()  
  index,find=[],-1
  while 1:
    find=text.find(string,find+1)
    if find<0:break
    if edge and ((find>0 and ist(text[find-1])==ed1) or (find+len_string<len_text and ist(text[find+len_string])==ed2)):find+=1;continue      
    index.append(find)
  return index

search(u'Hello word, aga', u'Aga',0,1) # искать без учета регистра, слово целиком
-------------
добавлено в 01.00: Как скачать маленький файл на низком уровне, чтоб не сожрало из за него всю оперативу без urllib и httplib (если хотите, замените e32socket на socket или iapconnect):

#Retrieve.py,by Krust (24,12,2009)

def retrieve(url, path):
  host,url=url.split('/',1)
  #print host,url
  import e32socket,e32
  client=e32socket.socket(e32socket.AF_INET, e32socket.SOCK_STREAM,0,None)
  client.connect((e32socket.gethostbyname(host),80))
  print 'ok connect'
  client.send('GET /%s HTTP/1.0\r\nHost: %s\r\nUser-agent: Python\r\n\r\n'%(url, host))

  string=client.recv(1024).split('\r\n')
  for t in xrange(string.__len__()):
    if not string[t] or string[t].isspace():break
  print '\r\n'.join(string[:t+1]) # Header
  string=['\r\n'.join(string[t+1:])]
  while 1:
    e32.ao_yield()
    t=client.recv(1024)
    if not t:break
    string.append(t)
  import e32posix as ex
  f=ex.open(path,ex.O_RDWR|ex.O_TRUNC|ex.O_CREAT)
  ex.write(f,''.join(string))
  ex.close(f)
  print 'Done'

if __name__=='__main__':
  retrieve('python.org/images/python-logo.gif', 'c:\\logo_from_python_org.jpg')

это же в прикрепленном файле.

Прикрепленный файл #1: retrieve_by_krust_in_08012010230648_f.zip ( меньше 1кб)

Krust


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

#6

Как записать русское слово в url без urllib.urlencode.


# Функция:
r=lambda t:repr(t.encode('u8')).replace(r'\x','%').upper()
# Пример:
url='www..../register.py/func?name='+r('андрей')
# ну без urllib.urlencode надо значит все русские слова отдельно так изменять. Зато огромная экономия ресурсов. Если посылать такое url, как Get запрос серверу в предыдущую функцию.
Хотя можно ещё эту функцию из urllib вырезать. Я вырезал вначале. Там кажется из трех функций состоит. Но вот этот метод мне показался короче.

Virtuos86


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

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

#7

Модуль на чистом Python для компрессии/декомпрессии строк.
Найден на просторах Интернета.
В качестве побочного применения модуль позволяет зашифровывать строки по автоматически генерируемому ключу.
Смотрим код модуля и разбираемся.
В раздел Модули не вижу необходимости помещать, но если будет нужно перемещу.


Прикрепленный файл #1: textprocessor_by_virtuos86_in_17012010102832_f.zip ( меньше 1кб)

Virtuos86


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

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

#8

Покуда идея python-вики доводится до завершения, ноу-хау сомнительной свежести.

Если собрались переписать какую-нибудь функцию, то ни в коем случае не нужно сразу бросаться править её код. Ни-ни! smile

Копируете эту функцию рядышком (не буквально, конечно, а выше или ниже по исходнику), добавляете к её имени какою-нибудь букву (например, из 'foo' получается 'fooX'). Теперь можно смело редактировать её копию, поскольку 'бэкап' всегда под рукой. Напортачили - всегда можно восстановить исходную версию. Да и вообще помогает, когда не нужно держать в памяти её первоначальный вид; что же там, блин, функция делала благополучно, пока вы не решили её 'улучшить'.

=====

Как вариант, можно сделать копию редактируемого файла под другим именем, и открыть её в другом окне|процессе(это если вы в пишете в Ded).

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


JOIN_ME


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

#9

А можно ниже по коду с тем же именем. И тогда не нужно подстраивать под новое имя свой код.

Andre-4667


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

#10

Ну я тож что нибудь этакое про вставку русского текста в программу, например я знаю эти варианты:

Цитата: С помощью функции
def ru(x): return x.decode('u8')

def ru(x): return unicode(x, 'u8')


Цитата: С помощью лямбда функции
ru=lambda x: x.decode('u8')

ru=lambda x: unicode(x, 'u8')


Напомнить пароль