2012-01-12 5 views

ответ

-1

Посмотрите на мой вопрос здесь: Does python have a built-in function for interleaving generators/sequences?

from itertools import * 
from functional import * 

compose_mult = partial(reduce, compose) 
leaf = compose_mult((partial(imap, next), cycle, partial(imap, chain), lambda *args: args)) 

Вы увидите, что я использовал частичное приложение для создания одного аргумента функции, которые могут быть переданы итератора функции (карты и уменьшить).

+9

«из модуля импорта *» плохой стиль, не распространять его вокруг в примерах фрагментах. – ddaa

+0

@ddaa: Я не согласен. Он часто может быть уместным, например, при импорте «сантехники» общей полезности. – Marcin

+2

Есть некоторые случаи, когда это полезно (например, импортировать все объекты из tkinter для написания приложения), но лучше всего избегать в примерах фрагментов. Выполнение этого из двух библиотек особенно сбивает с толку, потому что оно скрывает, откуда происходит каждая вещь: в какой библиотеке я бы нашел «compose»? О, и вы имели в виду «functools», а не «функциональный»? –

11

Одно использование, которое я часто ставил, это печатать до stderr, а не по умолчанию stdout.

from __future__ import print_function 
import sys 
from functools import partial 

print_stderr = partial(print, file=sys.stderr) 
print_stderr('Help! Little Timmy is stuck down the well!') 

Вы можете использовать это с любыми другими аргументами, принятых print функции:

print_stderr('Egg', 'chips', 'beans', sep=' and ') 
6

Другим примером для, при написании Tkinter кода, например, для добавления данных идентификатора функции обратного вызова , так как обратные вызовы Tkinter вызываются без параметров.

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

import Tkinter 
from functools import partial 

window = Tkinter.Tk() 
contents = Tkinter.Variable(window) 
display = Tkinter.Entry(window, textvariable=contents) 

display.pack() 

def clicked(digit): 
    contents.set(contents.get() + str(digit)) 

counter = 0 

for i, number in enumerate("7894561230"): 
    if not i % 3: 
     frame = Tkinter.Frame(window) 
     frame.pack() 
    button = Tkinter.Button(frame, text=number, command=partial(clicked, number)) 
    button.pack(side="left", fill="x") 

Tkinter.mainloop() 
+1

+1 Это удобно для других GUI-библиотек (например, PyQt, wx). – reclosedev

Смежные вопросы