Precedência
A ordem de avaliação dos operadores, do mais forte ao mais fraco.
| Nível | Operadores | Associatividade |
|---|---|---|
| 1 | () [] . ?. with | esquerda |
| 2 | ** | direita |
| 3 | - + not (unários) | direita |
| 4 | * / % ~/ // | esquerda |
| 5 | + - | esquerda |
| 6 | comparações, in, not in | encadeável |
| 7 | not | direita |
| 8 | and | esquerda |
| 9 | or | esquerda |
| 10 | ?? | esquerda |
| 11 | given … otherwise (ternário) | direita |
| 12 | >> | esquerda |
As consequências que surpreendem#
dataforge
out 2 ** 3 ** 2 # 512, e não 64 — potência associa à direita
out -2 ** 2 # -4, e não 4 — o sinal aplica depois da potência
out 2 + 3 * 4 # 14Por que ** associa à direita#
É a convenção matemática: 2³² significa 2^(3²) = 2⁹ = 512, não (2³)² = 64. Python, Ruby e Haskell fazem o mesmo.
Por que o unário vem depois#
-2 ** 2 é lido como -(2 ** 2). Isso também segue a matemática: −2² é −4. Para elevar o negativo, use parênteses: (-2) ** 2 dá 4.
O pipeline é o mais fraco#
Por isso nums >> sift n: n % 2 is 0 funciona sem parênteses: a expressão inteira n % 2 is 0 é avaliada antes que o >> entre em ação.