[PYTHON]

===

=== http://docs.python.jp/2/tutorial/classes.html#iterator

Zuerst las ich die Python-Dokumentation und lernte Iterator, Generator, Decorator usw., also schrieb ich FizzBuzz mit diesen zum Üben. Was ist Iterator? (Zitat) (Zitat beginnen) Diese Zugriffsmethoden sind klar, präzise und bequem. Die Verwendung von Iteratoren ist in Python weit verbreitet und bringt Einheit. Hinter den Kulissen ruft die Anweisung "for" das Containerobjekt "iter ()" auf. Diese Funktion gibt ein Iteratorobjekt mit der definierten Methode next () zurück. Die Methode next () greift nacheinander auf die Elemente im Container zu. Wenn der Container keine Elemente mehr enthält, auf die zugegriffen werden kann, löst next () eine StopIteration -Ausnahme aus und beendet die for-Schleife. Das folgende Beispiel zeigt, wie es tatsächlich funktioniert. (Weggelassen) Sobald Sie den Mechanismus hinter dem Iteratorprotokoll gesehen haben, können Sie Ihrer Klasse ganz einfach iteratives Verhalten hinzufügen. Definieren Sie eine iter () -Methode, um ein Objekt mit einer next () -Methode zurückzugeben. Wenn die Klasse selbst "next ()" definiert, kann "iter ()" einfach "self" zurückgeben. (Ende des Zitierens)

Wenn Sie es einfach machen möchten, können Sie eine Klasse mit der Methode "iter ()" und der Methode "next ()" definieren und eine Ausnahme von "StopIteration" auslösen, wenn die Beendigungsbedingung erfüllt ist. Es scheint, dass die Instanz von Iterator so verwendet werden kann, wie sie in der for-Anweisung steht.

Code

Ich habe einen FizzBuzzIterator mit ähnlichen Spezifikationen geschrieben, indem ich mich auf die Funktion range () bezog.

def fizzbuzz(n):
  n = int(n)
  if (n%15) == 0: return "FizzBuzz"
  elif (n%5) == 0: return "Buzz"
  elif (n%3) == 0: return "Fizz"
  else: return n

class FizzBuzzIterator:
  def __init__(self,start, stop, step=1):
    self.count = start
    self.stop = stop
    self.step = step

  def __iter__(self):
    return self

  def next(self):
    if (self.step > 0 and self.count >= self.stop) or (self.step < 0 and self.count <= self.stop):
      raise StopIteration
    else:
      result = fizzbuzz(self.count)
      self.count += self.step
      return result

FizzBuzz von 1 bis 100 ausgeben

fbiter1 =  FizzBuzzIterator(1,101)
for fzbz in fbiter1: print fzbz

FizzBuzz nur für ungerade Zahlen von 1 bis 99 ausgeben

fbiter2 =  FizzBuzzIterator(1,101,2)
for fzbz in fbiter2: print fzbz

Geben Sie FizzBuzz in umgekehrter Reihenfolge von 100 auf 1 aus

fbiter3 =  FizzBuzzIterator(100,0,-1)
for fzbz in fbiter3: print fzbz

Was ist Generator (Zitat)

http://docs.python.jp/2/tutorial/classes.html#generator (Zitat starten) Der Generator ist ein übersichtliches und leistungsstarkes Tool zum Erstellen von Iteratoren. Der Generator wird wie eine normale Funktion geschrieben, verwendet jedoch eine Yield-Anweisung, um alle Daten zurückzugeben. Bei jedem Aufruf von next () setzt der Generator die zuvor unterbrochene Verarbeitung fort (der Generator merkt sich alle Datenwerte und welche Anweisung zuletzt ausgeführt wurde). Wenn Sie sich das folgende Beispiel ansehen, können Sie sehen, dass der Generator sehr einfach zu erstellen ist. (Ende des Zitierens)

Code

Iterator schien sehr hart zu arbeiten, aber sollte der Generator nur ein Dokument sein? Ich wunderte mich.

def fizzbuzz(n):
  n = int(n)
  if (n%15) == 0: return "FizzBuzz"
  elif (n%5) == 0: return "Buzz"
  elif (n%3) == 0: return "Fizz"
  else: return n

def fizzbuzz_generator(start,finish,diff=1):
   for n in range(start,finish,diff):
     yield fizzbuzz(n)

for fzbz in fizzbuzz_generator(1,100):
  print fzbz

Was ist Dekorateur (Zitat)

http://docs.python.jp/2/glossary.html#term-decorator (Zitat starten) (Dekorateur) Eine Funktion, die eine Funktion zurückgibt. Es wird normalerweise verwendet, um eine Funktion mit der Syntax "@ wrapper" zu konvertieren. Übliche Verwendungszwecke für Dekorateure sind "classmethod ()" und "staticmethod ()".

Die Grammatik des Dekorateurs ist Syntaxzucker. Die folgenden zwei Funktionsdefinitionen sind semantisch identisch.

def f(...):
    ...
f = staticmethod(f)

@staticmethod
def f(...):
    ...

(Ende des Zitierens)

Code

Ich habe es nicht verstanden, also habe ich es geschrieben.

def fizzbuzz(n):
  n = int(n)
  if (n%15) == 0: return "FizzBuzz"
  elif (n%5) == 0: return "Buzz"
  elif (n%3) == 0: return "Fizz"
  else: return n

def fizzbuzz_decorator(func):
  def wrapper(*args, **kwargs):
    func(fizzbuzz(*args))
  return wrapper

@fizzbuzz_decorator
def f(n):
  print n

f(1)
f(2)
f(3)
f(4)
f(5)

Oben scheint es, dass f durch den Dekoratorausdruck "@ fizzbuzz_decorator" neu geschrieben wird und f in "fizzbuzz_decorator (f)", dh die folgende Funktion wrapper (), umgeschrieben wird.

def wrapper(*args, **kwargs):
  f(fizzbuzz(args[0]))

Daher scheint es, dass die fizzbuzz-Zeichenfolge ausgegeben wird, da das Argument von f von der Funktion fizzbuzz () verarbeitet und dann an das ursprüngliche f übergeben wird.

Ausführungsergebnis

1
2
Fizz
3
Buzz

Verschachtelung des Dekoratorausdrucks (Zitat)

Es scheint, dass Dekoratorausdrücke auch verschachtelt werden können. http://docs.python.jp/2/reference/compound_stmts.html#function (Zitat starten) Funktionsdefinitionen können in einen oder mehrere Dekorationsausdrücke eingeschlossen werden. Wenn Sie eine Funktion definieren, wird der Dekoratorausdruck in dem Bereich ausgewertet, der die Funktionsdefinition enthält. Das Ergebnis muss ein aufrufbares Objekt sein, dessen einziges Argument ein Funktionsobjekt ist. Anstelle eines Funktionsobjekts ist der zurückgegebene Wert an den Funktionsnamen gebunden. Mehrere Dekorateure werden verschachtelt und angewendet. (Ende des Zitierens)

def fizzbuzz(n):
  n = int(n)
  if (n%15) == 0: return "FizzBuzz"
  elif (n%5) == 0: return "Buzz"
  elif (n%3) == 0: return "Fizz"
  else: return n

def fizzbuzz_decorator(func):
  def wrapper(*args, **kwargs):
    func(fizzbuzz(*args))
  return wrapper

def fizzbuzz_decorator2(func):
  def wrapper(*args, **kwargs):
    for n in range(1,args[0]):
      func(n)
  return wrapper

@fizzbuzz_decorator2
@fizzbuzz_decorator
def f(n):
  print n

f(101)

Dies ist ein Muster, das dem folgenden entspricht.

f = fizzbuzz_decorator2(fizzbuzz_decorator(f))

Ausführungsergebnis

1
2
Fizz
3
Buzz
(Weggelassen)
98
Fizz
Buzz

Es scheint, dass Sie dem Dekorateur Argumente übergeben können, daher werde ich sie in Zukunft hinzufügen, sobald ich Nachforschungen angestellt habe.

Recommended Posts