Python'un güç operatörünün sağla ilişkilendirmesinin gerekçesi nedir?


9

Matematiksel ifade dizelerini ayrıştırmak için kod yazıyorum ve zincirleme güç operatörlerinin Python'da değerlendirilme sırasının Excel'deki sıradan farklı olduğunu fark ettim.

Gönderen http://docs.python.org/reference/expressions.html :

"Böylece, belirsiz bir güç ve tekli operatör dizisinde, operatörler sağdan sola değerlendirilir (bu, işlenenler için değerlendirme sırasını kısıtlamaz): -1 * 2 sonuç -1 ile sonuçlanır." *

Python'da Bu araçlar 2**2**3olarak değerlendirilir2**(2**3) = 2**8 = 256

Excel'de, tam tersi çalışır: 2^2^3olarak değerlendirilir(2^2)^3 = 4^3 = 64

Şimdi kendi ayrıştırıcım için bir uygulama seçmem gerekiyor. Excel sırasının, çarpma değerlendirme sırasını yansıttığı için uygulanması daha kolaydır.

Ofisteki bazı insanlara bağırsaklarının değerlendirilmesinde ne hissettiklerini sordum 2^2^3ve karışık tepkiler aldım.

Python uygulaması lehine herhangi bir iyi neden veya karar bilen var mı? Ve bir cevabınız yoksa, lütfen bağırsaktan aldığınız sonuçla yorum yapın - 64veya 256?


Uygulaması o kadar zor değil. Her neyse, ayrıştırıcınız atama gibi şeyler için bir şekilde doğru ilişkilendirmeyi desteklemelidir.
marco-fiset

Evet değil, aslında uyguladım. Ancak Excel kuralına geri döndüm, çünkü kütüphanemin birincil kullanımlarından biri denklemleri Excel'e aktarmaktır, bu nedenle denklemlerin orada çalışma şekline sadık kalmak daha mantıklıdır.
Pieter Müller

Yanıtlar:


10

Matematikte yığılmış üslerin yukarıdan aşağıya doğru uygulanmasının nedeni, üslerin çoğalmasını sağlamanın diğer yolu:

(((2^3)^4)^5) = 2^(3 * 4 * 5)

Bu net değil biçim cevap .... ama üsteller değil nasıl çalışır bu bağlamda? ((2 ^ 3) ^ 4) 8 ^ 4 = (2 ^ 3) * (2 ^ 3) * (2 ^ 3) * (2 ^ 3) = 2 ^ (3 + 3 + 3 + 3) = = 2 ^ 12
Pureferret

3
Evet öyle. Demek istediğim, seçebileceğiniz iki emirden biri, üsleri istiflemeden yazabileceğiniz bir şey verir. Yani ilginç ilişkilendirme diğeri.
Andrea

14

Wikipedia (ve matematik öğretmenim) bana şunu söylüyor: Yığılmış üsler yukarıdan aşağıya uygulanır.

Bu, Python'un değerlendirme biçimini yansıtır. Microsoft yanlış (bir kez daha)

Ve Ruby bunu Python olarak değerlendiriyor, bu yüzden Matz yanlış olamaz çünkü bu doğru.


4
Ayrıca , doğru ilişkilendirmeyi destekleyen operatörün D Dili uygulaması ile ilgili bu ilginç gönderiye bakınız .
Pedro Romano

Visual Basic'i aynı şekilde değerlendirdiğini hatırlıyorum, ancak bu yönteme güvenilirlik ekleyip eklemediğinden emin değilim. ;)
Xion

Microsoft, yalnızca izlediği iddia edilen bazı belirtimlere uymazsa "yanlış" tır. Farklı diller matematiksel işlemleri farklı değerlendirir. APL, doğru hatırlıyorsam, tüm işlemleri doğru ilişkilendirilebilir hale getirdi. Farklı bir spesifikasyon ile tutarsızlık sinir bozucu olmakla birlikte mutlaka "yanlış" değildir.
Keith Thompson
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.