Запуск с Python 2.6 (и если Вы находитесь на Python 3) Вы имеете стандартная библиотека инструмент для этого: itertools.permutations
.
import itertools
list(itertools.permutations([1, 2, 3]))
, Если Вы используете более старый Python (< 2.6) по некоторым причинам или просто любопытны знать, как это работает, вот один хороший подход, проявленный от http://code.activestate.com/recipes/252178/ :
def all_perms(elements):
if len(elements) <=1:
yield elements
else:
for perm in all_perms(elements[1:]):
for i in range(len(elements)):
# nb elements[0:1] works in both string and list contexts
yield perm[:i] + elements[0:1] + perm[i:]
Несколько альтернативных подходов перечислены в документации itertools.permutations
. Вот тот:
def permutations(iterable, r=None):
# permutations('ABCD', 2) --> AB AC AD BA BC BD CA CB CD DA DB DC
# permutations(range(3)) --> 012 021 102 120 201 210
pool = tuple(iterable)
n = len(pool)
r = n if r is None else r
if r > n:
return
indices = range(n)
cycles = range(n, n-r, -1)
yield tuple(pool[i] for i in indices[:r])
while n:
for i in reversed(range(r)):
cycles[i] -= 1
if cycles[i] == 0:
indices[i:] = indices[i+1:] + indices[i:i+1]
cycles[i] = n - i
else:
j = cycles[i]
indices[i], indices[-j] = indices[-j], indices[i]
yield tuple(pool[i] for i in indices[:r])
break
else:
return
И другой, на основе itertools.product
:
def permutations(iterable, r=None):
pool = tuple(iterable)
n = len(pool)
r = n if r is None else r
for indices in product(range(n), repeat=r):
if len(set(indices)) == r:
yield tuple(pool[i] for i in indices)
$ 1 - это анонимные внутренние классы, которые вы определили в своем файле WelcomeApplet.java
.
например, компиляция
public class Run {
public static void main(String[] args) {
System.out.println(new Object() {
public String toString() {
return "77";
}
});
}
private class innerNamed {
}
}
приведет к Run.class
], Выполните $ 1.class
и Выполните создаваемый $ innerNamed.class
Это файлы .class
, которые содержат анонимные внутренние классы .
В вашем примере WelcomeApplet.java
содержит класс верхнего уровня (называемый WelcomeApplet
) и анонимный внутренний класс, который будет храниться в WelcomeApplet $ 1.class
.
Обратите внимание, что точное имя файлов, содержащих анонимные внутренние классы не стандартизированы и могут отличаться. Но на практике я еще не видел никакой другой схемы, кроме описанной здесь.
Тела, зависящие от значений для перечисления
, также являются анонимными внутренними классами :
Необязательное тело класса константы enum неявно определяет объявление анонимного класса ( §15.9.5 ), которое расширяет непосредственно включающий тип enum.
Это из этой «строки» кода:
return new
ActionListener()
{
public void actionPerformed(ActionEvent event)
{
try
{
getAppletContext().showDocument(new URL(u));
}
catch(MalformedURLException e)
{
e.printStackTrace();
}
}
};
Как вы объявляете ActionListener
, вы создаете экземпляр анонимного внутреннего класса каждый раз, когда этот метод вызывается.
Даже если метод не вызывается, указанная выше строка все равно компилируется в анонимный внутренний класс, несмотря ни на что.
The WelcomeApplet$1.class
file is generated for an anonymous class in the WelcomeApplet.java source (the anonymous class is generated in the method call makeURLActionListener by calling new new ActionListener() {...}
)
To explain more clearly, the anonymous classes are generated at compile time any time you have an instantiation of a concrete named class that overrides some or all of the behavior of the concrete class (or interface) inline like this:
class HelloInternalClass {
public static final void main(String[] args) {
// print in another thread
new Thread(new Runnable() {
public void run() {
System.out.println("Printed from another thread");
}
}).start();
}
}
In the above sample code, the javac compiler would generate 2 class files just like in your example: HelloInternalClass.class
and HelloInternalClass$1.class
.
The anonymous class in this instance would be a subclass of Runnable and would be compiled into HelloInternalClass$1.class
. Incidentally, if you would ask a class name from the runnable instance in the above sample (by calling getClass().getName()
) you would find that it thinks of itself as "HelloInternalClass$1".
Это файлы .class
которые содержат анонимные внутренние классы .
В вашем примере WelcomeApplet.java
содержит класс верхнего уровня (называемый WelcomeApplet
) и анонимный внутренний класс, который будет храниться в WelcomeApplet $ 1.class
.
Обратите внимание, что точное имя файлов, содержащих анонимные внутренние классы, не стандартизировано и может отличаться. Но на практике я еще не видел никакой другой схемы, кроме описанной здесь.
Тела, зависящие от значений для перечисления
, также являются анонимными внутренними классами :
Необязательное тело класса константы перечисления неявно определяет объявление анонимного класса ( §15.9.5 ), которое расширяет непосредственно включающий тип перечисления.