Schreiben Sie ein paar Zeilen Python-Code, der X
keine globalen Variablen referenziert, so dass
def method():
X
print(a)
method()
druckt 1
aber
def method():
X
X
print(a)
method()
druckt 2
.
Ich hasse es, ein Stickler zu sein, aber es scheint vars
und locals
sind tatsächlich globale Variablen in Python:
def test_global_1():
global vars, locals
vars = lambda: 2
locals = lambda: 3
def test_global_2():
print(vars())
print(locals())
test_global_1()
test_global_2()
Es sieht auch so aus, als würden die Leute gerne objektive Gewinnkriterien für solche Rätsel sehen. Die Codelänge fühlt sich hier nicht wirklich richtig an, also könnten wir vielleicht ein System von Brownie-Punkten für verschiedene neuartige Funktionen des Codes erstellen? Ich bin mir nicht sicher, was genau das sein könnte, aber hier ist ein Anfang:
- +1 für wirklich wirklich keine Globalen (nein
vars
oderlocals
) - +1 für den ersten Beitrag zu einer bestimmten Technik
- +1 für die kürzeste veröffentlichte Lösung
- +1 für eine Lösung mit nur einer Python-Anweisung
- +1 für interessante "Hacks" wie das Beitreten an lexikalischen Grenzen
- +1 für die Nichtverwendung von Ausnahmen
Und wenn Ihnen mehr einfällt, können Sie diese Frage bearbeiten, um sie der Liste hinzuzufügen.
Kann dieses Problem ohne Verwendung von Ausnahmen und ohne Verwendung von Globals wie vars
und gelöst werden locals
? Ich vermute, es kann, obwohl ich noch nicht genau herausgefunden habe, wie ...
X
, aber es gibt andere Möglichkeiten.Antworten:
Initialisiert die Variable
a
auf0
nur , wenn es nicht bereits in der Variablentabelle initialisiert. Dann erhöht es.Kurz (danke an den Histokraten für
len
):Wenn sich die beiden Kopien von
X
in derselben Zeile befinden könnten, könnten wir dies tunwas sich verdoppelt
mit dem "Opferlamm"
aa
, das die zweite variable Zuordnung auffrisst.quelle
a=len(vars())+1
Python
Ich dachte an diese Lösung, da
try
undexcept
war der erste Weg, um festzustellen, ob eine Variable noch existiert oder nicht.quelle
Python 2
Wenn
exec
Python 2 angetroffen wird , wird grundsätzlich ein spezielles Flag (0x01
) entferntmethod.func_code.co_flags
, wodurchlocals
Zuweisungen wirksam werden. Ich habe dies ausgenutzt, um dienonlocal
Unterstützung in Python 2 zu implementieren (siehe Zeile 43 für das xor, das das Flag ändert).quelle
a = locals().get('a', 0) + 1
?exec''
mehr;)Meine erste Idee (und dann das Glätten) war:
Aber die Antwort des Histokraten scheint optimal zu sein.
quelle
Mein Versuch. Verwendet das Mathematikmodul, um zu verfolgen, ob X ein- oder zweimal ausgeführt wird.
quelle
Als Antwort auf einen Kommentar bearbeitet: a ist eine Liste leerer Listen der Länge n, wobei n die Häufigkeit ist, mit der Sie die Methode aufgerufen haben. Wenn Sie diese Methode zweimal aufrufen, wird 1 und dann 2 gedruckt.
quelle
a=[]
als Parameter liegt außerhalb der Parameter für diese Herausforderung.Der
try
Block prüft, ob die Variable a definiert ist.Wenn die Variable nicht definiert ist (dies ist nur dann der
NameError
Fall, wenn der X-Block einmal vorhanden ist), wird eine Ausnahme ausgelöst.Wenn eine Variable definiert ist (dies ist der
else
Fall, wenn der X-Block zweimal vorhanden ist), wird er eingegeben.quelle
else