Napisz kilka wierszy kodu w języku Python X
, który nie odwołuje się do żadnych zmiennych globalnych, takich jak
def method():
X
print(a)
method()
odciski, 1
ale
def method():
X
X
print(a)
method()
odciski 2
.
Tak, nienawidzę być pedantem, ale wydaje się, vars
i locals
są rzeczywiście zmienne globalne w Pythonie:
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()
Wygląda też na to, że ludzie chcieliby zobaczyć obiektywne kryteria wygrywające dla takich zagadek. Długość kodu tak naprawdę nie wydaje się tutaj, więc być może moglibyśmy stworzyć system punktów brownie dla różnych nowatorskich funkcji kodu? Nie jestem pewien, co to może być, ale oto początek:
- +1 za naprawdę brak globali (nie
vars
lublocals
) - +1 za to, że jako pierwszy opublikował określoną technikę
- +1 za najkrótsze opublikowane rozwiązanie
- +1 za rozwiązanie obejmujące tylko jedną instrukcję Python
- +1 za ciekawe „hacki”, takie jak łączenie na leksykalnych granicach
- +1 za niestosowanie wyjątków
A jeśli możesz wymyślić więcej, możesz edytować to pytanie, aby dodać je do listy.
Czy ten problem można rozwiązać bez użycia wyjątków i bez użycia globałów takich jak vars
i locals
? Podejrzewam, że tak, choć jeszcze nie wiem, jak ...
źródło
X
, ale są też inne opcje.Odpowiedzi:
Inicjalizuje zmienną
a
do0
tylko jeśli nie jest już zainicjowany w tabeli zmiennych. Następnie zwiększa.W skrócie (dzięki histocrat za
len
):Gdyby dwie kopie
X
mogły znajdować się w tej samej linii, moglibyśmy to zrobićktóra podwaja się do
„ofiarny baranek”
aa
pochłania drugie zmienne zadanie.źródło
a=len(vars())+1
Pyton
Myśl tego rozwiązania, ponieważ
try
iexcept
był to pierwszy sposób myślałem o celu ustalenia, czy zmienna lub jeszcze nie istniał.źródło
Python 2
Zasadniczo po
exec
napotkaniu w Pythonie 2 powoduje0x01
usunięcie specjalnej flagi ( )method.func_code.co_flags
, co powoduje, żelocals
przypisania mają wpływ. Wykorzystałem to, aby zaimplementowaćnonlocal
wsparcie w Pythonie 2 (patrz wiersz 43 dla xor modyfikującego flagę).źródło
a = locals().get('a', 0) + 1
?exec''
już więcej;)Moim pierwszym pomysłem (a potem wygładzeniem go) było:
Ale odpowiedź histokraty wydaje się optymalna.
źródło
Moja próba Używa modułu matematycznego do śledzenia, czy X jest uruchamiany raz czy dwa.
źródło
Edytowane w odpowiedzi na komentarz: a jest listą pustych list o długości n, gdzie n jest liczbą wywoływanych metod. Wywołanie tej metody dwukrotnie powoduje wydrukowanie 1, a następnie 2.
źródło
a=[]
jako parametru wykracza poza parametry tego wyzwania.Te
try
kontrole blokowe, jeśli zmienną jest zdefiniowana.Jeśli zmienna nie jest zdefiniowana (tylko wtedy, gdy X-blok jest obecny raz), wówczas
NameError
zgłaszany jest wyjątek.Jeśli zmienna jest zdefiniowana (to jest, gdy X-blok jest obecny dwukrotnie), to
else
zostanie wprowadzona.źródło
else