2012-04-04 50 views
6

W Pythonie 3.2, zgodnie z tym: http://docs.python.org/py3k/reference/expressions.html#summaryW Pythonie 3.2 słowo "lambda" jest uważane za "słowo kluczowe", "operator" lub jedno i drugie?

lambda jest operatorem o najniższym priorytecie w Pythonie.

I zgodnie z tym: http://docs.python.org/py3k/reference/lexical_analysis.html#keywords

lambda jest słowem kluczowym języka Python.

Jednakże, zgodnie z tym: http://docs.python.org/py3k/reference/lexical_analysis.html#other-tokens

Operatorzy i słowa kluczowe są odrębne podmioty.

Próbuję systematycznie wyjaśniać Python 3.2 komuś i nie chcę ich mylić. Ja sam jestem jednak zdezorientowany pod względem dokładnych definicji operatorów i słów kluczowych.

Domyślam się, że termin "operator" oznacza coś nieco innego, gdy jest używany w kontekście parsera Pythona i lexera w Pythonie.

+0

Jestem prawie pewien, że rozsądnie jest nazywać 'lambda' słowem kluczowym, a nie operatorem. – alberge

+1

@alberge Jakie jest twoje rozumowanie? – Paragon

+2

Ja wyraźnie zacisnąłem palce przed mózgiem. Kilka słów kluczowych w języku Pythona * to * operatory. Wygląda na to, że nakładają się na siebie. – alberge

Odpowiedz

2

lambda wyraźnie jest słowem kluczowym; jest to specjalne słowo rozpoznawane przez analizator składni, które w innym wypadku należałoby do definicji identifier.

lambda nie jest semantycznie operator. Operator jest po prostu funkcją, ale wywoływany z inną składnią. Możemy sobie wyobrazić zastąpienie operatora + funkcją add; wszystkie nasze programy z dodatkiem będą bardziej szczegółowe i trudniejsze do odczytania, ale możemy je jeszcze napisać. Z drugiej strony konstrukcja językowa lambda nie mogła zostać zastąpiona przez funkcję; lambda x: x+1 to nie tylko obliczenie wyniku z wartości x i x+1, ponieważ w tym kontekście nie są one wcale wartościami (x to nazwa parametru do definiowanej funkcji, a x+1 to kod korpusu lambda).

W tej samej strony, połączone do mamy: http://docs.python.org/py3k/reference/lexical_analysis.html#operators

tokeny są następujące podmioty:

+  -  *  ** /  //  % 
<<  >>  &  |  ^  ~ 
<  >  <=  >=  ==  != 

To całą zawartość podsekcji na operatorów. Z tego rozumiem, że w kontekście definiowania tokenów języka "operatorzy" są operatorami symbolicznymi, podczas gdy w sekcji słowa kluczowe wyraźnie stwierdza się, że "te rzeczy, które w innym przypadku byłyby identyfikatorami, są słowami kluczowymi". Dlatego myślę, że operatory słów kluczowych, takie jak not, is, in, itp. Nie są wymienione. Ale na pewno istnieją rzeczy, które są semantycznymi operatorami, które są słowami kluczowymi, niezależnie od tego, czy parser uważa je za oddzielne klasy.

Nie jestem pewien, dlaczego http://docs.python.org/py3k/reference/expressions.html#summary opisuje lambda jako operator; Na pewno nie. Ściśle mówiąc, nie mówi się wprost "lambda jest operatorem o najniższym priorytecie", to po prostu lista lambda w tabeli, której nagłówek kolumny to "Operator". Być może to była tylko wygoda; opisanie lambda jako rzeczy o niskim priorytecie jest dobrym sposobem wyjaśnienia, w jaki sposób Python będzie analizować lambda x: x + 1 (teoretycznie może to być (lambda x: x) + 1 lub lambda x: (x + 1)).

+0

Tylko dlatego, że nie możemy zastąpić konstruktu 'lambda' inną funkcją, nie powoduje to, że' lambda' nie jest funkcją. Jest to funkcja nieco unarna (jeśli wyjmiesz parametr matcher), który pobiera wyrażenie i zwraca funkcję. Jest to wyraźnie operator, ponieważ pobiera wyrażenie i zwraca wyrażenie (funkcji typu). – poke

+0

@poke Nie jest to funkcja, właśnie dlatego, że potrzebuje ekspresji. Nie przekazujesz wyrażeń funkcjom, przekazujesz wartości. Jeśli spróbujesz wyświetlić 'lambda', nie" przekazujesz "jej wartości, przekazujesz jej wyrażenie (które nie może być" przekazane "jakiejkolwiek innej funkcji). W przeciwnym razie prawidłowe byłoby powiązanie wyrażenia z nazwą i podanie zamiast tego nazwy: 'x = fire_ze_missiles(); f = lambda: x' jest ** bardzo ** różni się od 'f = lambda: fire_ze_missiles()', podczas gdy 'x = fire_ze_missiles(); y = x + 1' jest równoważne 'y = fire_ze_missiles() + 1'. – Ben

+0

Zgadzam się: 'lambda' nie" pachnie jak "operatora. I jak zauważyłeś, tabele pierwszeństwa nie są tylko dla operatorów: są naprawdę sposobem, w jaki ludzie radzą sobie z mocnymi mocami, patrząc na coś, co w przeciwnym razie byłoby niejednoznaczną parseą.Jesteśmy przyzwyczajeni do takiej dwuznaczności, gdy mamy do czynienia z wyrażeniami-z-operatorami. – torek

2

To nie znaczy, że są wzajemnie wykluczające się, tylko że:

"następujące kategorie tokenów istnieć: identyfikatory, słowa kluczowe literałów, operatorów i ograniczniki"

Jestem w kategorii osoba i amerykański. To prawda, może to oznaczać sugerowanie, że są one wzajemnie wykluczające się, w którym to przypadku dokumenty są niekonsekwentne.

+0

To zdanie przeszkadza mi z tego powodu, a także dlatego, że nie podało parasola na TRAWĘ, DEINDENT i NEWLINE. Wyjaśniając pojęcie tokena Pythona, nie wiem, czy powinienem połączyć te trzy elementy w jeden typ, czy też pozostawić je oddzielnie. Myślę, że to nie ma znaczenia dla tego pytania, ale staram się usystematyzować podstawy Pythona. –

+0

Te trzy to wszystkie separatory/markery instrukcji. INDENT i DEINDENT są używane do oznaczania instrukcji złożonych (oraz funkcji i treści klas), natomiast NEWLINE oddziela proste instrukcje. –

+0

Studiuję gramatykę; Czy znasz oficjalny termin i czy możesz go przytoczyć? Dokument, który piszę - chcę, jeśli to możliwe, używać tylko oficjalnego żargonu. –

4

Operatory i słowa kluczowe to odrębne jednostki.

Nie, nie są. is, in, and, or, not, i jestem pewien, że kilka innych jest jednocześnie.

+0

Dlaczego ta lista nie jest dla tych operatorów? Oznacza to (nieformalnie), że wymienia wszystkie tokeny będące operatorami. To są oczywiście żetony, ale nie ma ich na liście: http://docs.python.org/py3k/reference/lexical_analysis.html#operators –

+0

Po prostu dlatego, że są już na liście zarezerwowanych słów kluczowych. – poke

Powiązane problemy