2011-01-24 32 views
10

Mam pewne zamieszanie co do jego znaczenia lub definicji.Co to jest wyrażenie w języku Python?

Czy to nie jakiś kod, który produkuje lub oblicza nowe wartości danych? (Mówi Zelle w swojej książce)

Potem zastanawiam się, czy typ danych typu string jest wyrażeniem.

Jeśli tak, to co robi eval(), gdy jego argumentem jest ciąg?

Książka autorstwa Zelle mówi: eval(<string>) ocenia string jako wyrażenie, co to dokładnie znaczy, jeśli string jest już wyrażeniem?

A jeśli string nie jest wyrażeniem, to dlaczego może się zdarzyć po print?

+1

pokrewne (ale nie ** ** dokładną kopią): [Co to jest różnica między wyrażeniem a stwierdzeniem?] (Http://stackoverflow.com/questions/4728073/ python-what-is-the-difference-between-an-expression-and-a-statement) –

Odpowiedz

17

Wyrażenia reprezentują coś, jak liczba, ciąg znaków lub wystąpienie klasy. Każda wartość jest wyrażeniem!

Wszystko, co robi coś, co jest oświadczeniem. Każde przypisanie do zmiennej lub wywołanie funkcji jest instrukcją. Każda wartość zawarta w tym wyrażeniu w wyrażeniu.

foo = "hello" to wyrażenie, które przypisuje wartość foo do wartości wyrażenia "cześć". Ponieważ kod "hello" jest prostym wyrażeniem, co oznacza, że ​​nie zawiera żadnych operacji, nic nie jest faktycznie oceniane, więc foo jest właśnie przypisane do "hello ". Bardziej złożone wyrażenia faktycznie oceniają rzeczy, takie jak dodawanie liczb. bardziej mylące. wyrażenia są tylko wartości, z wyjątkiem mogą mieć operacje, takie jak dodawanie lub odejmowanie.

eval ocenia ciąg jakby to była ekspresja pyton. Eval nie bierze wyrażenie jako argument. Jednakże, nie ma nic szczególnego to od każda pojedyncza wartość jest wyrażeniem. Mówienie "eval przyjmuje wartość jako argument" mówi dokładnie to samo, ale brzmi znacznie prościej: D

eval("2+2") przekazuje ciąg znaków "2+2" do funkcji. Funkcja oblicza wyrażenie zawarte w ciągu, który wychodzi do 4.

Książka Zelle mówi eval(<string>) ocenia ciąg jako wyraz, co to dokładnie znaczy, jeśli ciąg jest już wyrazem?

Dowolny ciąg jest wyrażeniem, ponieważ reprezentuje wartość. Jednak to, co znajduje się w łańcuchu, nie ma absolutnie żadnego wpływu na to, że jest wyrażeniem. Jeśli jest wartością, jest wyrażeniem. Kiedy jest "ocenione jako wyrażenie przez eval", znaki wewnątrz łańcucha są wykonywane tak, jakby były wyrażeniem python.

+2

Dobre wyjaśnienie, z wyjątkiem tego, że nie możesz 'eval' instrukcji: spróbuj' eval ("print hello") 'w Pythonie 2.x. –

+6

Wywołanie funkcji jest wyrażeniem w języku Python. Każde wyrażenie jest również instrukcją - "wyrażeniem wyrażenia". Zobacz także link do pokrewnego pytania, które podałem powyżej. –

+0

@Sven Używam innej definicji wyrażenia ze względu na prostotę. Pomyślałem, że pozostawienie tych informacji uniknie dodatkowej złożoności, zwłaszcza że wyrażeń jako zdań nie używa się zbyt szeroko. : D –

1

ciąg jest wyrażeniem. Wyrażenie to wszystko, co ma "wartość". Jak 3, "Hello world", 1 + 1, math.sqrt (9), itd. Nazwy funkcji są również wyrażeniami.

eval() podaje wartość wyrażenia, które nadajesz jej jako ciąg. Jeśli powiesz eval ("1 + 1"), zwróci 2. Tak więc zwraca to samo, co zostanie zwrócone, jeśli napiszesz: 1 + 1.

+1

Dodatkowo: Każda metoda/funkcja, która zwraca wartość, liczy się również jako wyrażenie. Tak więc sama eval jest na przykład przykładem. – poke

+0

@poke: To trochę zwodnicze. _Every_ metoda/funkcja zwraca wartość. Jeśli nie zwrócisz niczego jawnie, to domyślnie zwraca 'Brak'. (Oczywiście w praktyce, konkretne wywołanie funkcji może podnieść, 'sys.exit', zakręcić na zawsze w nieskończoną pętlę, itp. Zamiast zwracać.Ale to nie sprawia, że ​​wyrażenie wywołania funkcji nie jest wyrażeniem, bardziej niż' 1/0'.) – abarnert

+0

@ABarnert Ciężko powiedzieć teraz co miałem na myśli, ale myślę, że miałem na myśli to, że wszystkie te rzeczy liczą się również jako wyraz, nie tylko standardowe statyczne z pewnym podstawowym operatorem pomiędzy. – poke

2

"Wyrażenie" może być nieco mylącym określeniem, gdy odejdzie od myślenia o tym, jak działa własny parser skryptów Pythona. standard documentation wprowadza rozróżnienie między wyrażeniami a "atomami", ale uważam, że czyni to terminologię dość restrykcyjną (diagram BNF w punkcie 5.11 sugeruje, że aby być wyrażeniem, coś musi być albo formą lambda, albo wyrażeniem warunkowym, tak myślę. Mój BNF jest zardzewiały.)

Atomy, z drugiej strony, wydają się obejmować, jak @kynnysmatto mówi "wszystko, co ma" wartość ". Być może "wszystko, co można zinwentaryzować, a następnie spoza nawiasów jest nieodróżnialne od odpowiadającej mu wartości" może być lepszą definicją atomu.

Kiedy Zelle omawia wyrażenia w kontekście np. eval (foo), myślę, że zakłada:

  • foo jest identyfikatorem, który jest rodzajem atomu
  • ale foo jest identyfikatorem z coś
  • To „coś” to ciąg znaków podobny , prawdopodobnie rzeczywisty ciąg
  • wewnątrz elementów eval(), ten ciąg również stanowi "wyrażenie" w języku Python - to znaczy coś, co Python może przeanalizować i zrozumieć.

tl; dr: "wyrażenie" jako terminologia może być najlepiej zrozumiała pod względem analizy kodu; kiedy programujesz siebie, może ci się wydawać, że lepiej myśleć w kategoriach "atomów".

2

TL; DR: Wyrażenia są kombinacjami wartości i operatorów i zawsze są oceniane do pojedynczej wartości. Oświadczenie to każda inna instrukcja. Niektóre instrukcje zawierają wyrażenia.

wyrażenie jest instrukcja, która łączy w sobie wartości i operatorów i zawsze ocenia się do pojedynczej wartości.

Na przykład, to jest wyrażenie:

>>> 2 + 2 

2S są wartościami całkowitymi, a + to operator matematyczny. To wyrażenie w dół do liczby całkowitej pojedynczego 4.

Technicznie jest to także wyraz:

>>> 4 

Jako wyraz, ocenia w dół do pojedynczej wartości 4.

Kiedy mówię wartości i operatorów, to nie ogranicza się do problemów matematycznych:

>>> 'You will be ' + str(int(myAge) + 1) + ' next year.' 

zmienna myAge ocenia wartości wewnątrz niego. Wywołanie funkcji int('5') oblicza wartość zwracaną przez funkcję, 5. Wszystkie te wartości ciągów są łączone z operatorem + (w tym przypadku jest to operator konkatenacji ciągów).Bez względu na to, jak duże wyrazem jest, to ocenia dół do pojedynczej wartości: w tym przypadku, wartość ciągu 'You will be 6 next year.'

Porównajmy to z rachunku, która jest instrukcją Pythona, który nie ocenia w dół do wartość. Instrukcja Pythona to prawie wszystko, co nie jest wyrażeniem. Poniżej znajduje się zestawienie przypisanie:

>>> spam = 2 + 2 

Oto if:

>>> if spam == 4: 

Oto oświadczenie natomiast dla nieskończonej pętli:

>>> while True: 

Zauważ, że oba te sprawozdania zawierają wyrażenia (nawet True, który ocenia do pojedynczej wartości True). Ale nie wszystkie stwierdzenia zawierają w nich wyrażenia. Oto instrukcja break:

>>> break