Kompakt yazma yöntemi (a + b == c veya a + c == b veya b + c == a)


136

Boole ifadesini yazmanın daha kompakt veya pythonic bir yolu var mı

a + b == c or a + c == b or b + c == a

İle geldim

a + b + c in (2*a, 2*b, 2*c)

ama bu biraz garip.


16
Daha kompakt? Muhtemelen. Daha Pythonic? Olası olmayan.
chepner

126
Gelecekteki kendinize bir iyilik yapın ve orijinal formda tutun: Bunun amacını hemen söyleyen tek şey bu. Bunu değiştirmeyin. “Basit, karmaşık olmaktan daha iyidir.”, “Okunabilirlik önemlidir.”. “Uygulamanın açıklanması zorsa, bu kötü bir fikir.”
poke

21
Pythonic == okunamıyor mu?
nhaarman

3
@wwii Onlar birbirini dışlamazlar. Bkz. A = 0, b = 0, c = 0;)
Honza Brabec

1
@Phresnel ne dedi. İfadeyi "basitleştirmeye" çalışmak yerine, açıklayıcı bir ada sahip bir işleve sarın.
Cephalopod

Yanıtlar:


206

Python'un Zen'ine bakarsak, benimkini vurgulayın:

Python'un Zen'i, Tim Peters

Güzel, çirkin olmaktan iyidir.
Açık, örtük olmaktan iyidir.
Basit, karmaşık olmaktan iyidir.
Karmaşık karmaşık olmaktan iyidir.
Düz iç içe geçmişten daha iyidir.
Seyrek yoğun olmaktan iyidir.
Okunabilirlik önemlidir.
Özel durumlar kuralları ihlal edecek kadar özel değildir.
Pratiklik saflığı yenmesine rağmen.
Hatalar asla sessizce geçmemelidir.
Açıkça susturulmadıkça.
Belirsizlik karşısında, tahmin etme isteğini reddet.
Bunu yapmanın tek ve tercihen tek bir yolu olmalı.
Her ne kadar Hollandalı değilseniz bu yol ilk başta belli olmayabilir.
Şimdi hiç olmadığı kadar iyi.
Her ne kadar asla genellikle daha iyi olmasa daSağ şimdi.
Uygulamanın açıklanması zorsa, bu kötü bir fikirdir.
Uygulamanın açıklanması kolaysa, iyi bir fikir olabilir.
İsim alanları harika bir fikirdir - bunlardan daha fazlasını yapalım!

En Pythonic çözümü en açık, en basit ve açıklanması en kolay çözümdür:

a + b == c or a + c == b or b + c == a

Daha da iyisi, bu kodu anlamak için Python'u bilmenize bile gerek yok! Bu kadar kolay. Bu, çekincesiz, en iyi çözümdür. Başka bir şey entelektüel mastürbasyon.

Ayrıca, kısa devreleri olan tüm tekliflerden sadece biri olduğu için bu muhtemelen en iyi performans gösteren çözümdür. Eğer a + b == csadece tek bir ekleme ve karşılaştırma yapılır.


11
Daha da iyisi, niyeti kristalleştirmek için bazı parantezler atın.
Bryan Oakley

3
Niyet parantez olmadan zaten berraktır. Parantezlerin okunması zorlaşır - yazar zaten öncelik bunu kapsıyorsa parantez kullanıyor?
Miles Rout

1
Çok zeki olmaya çalışmakla ilgili bir not daha: aklınıza gelmeyen koşulları göz ardı ederek öngörülemeyen hatalar getirebilirsiniz. Başka bir deyişle, yeni kompakt çözümünüzün eşdeğer olduğunu düşünebilirsiniz , ancak her durumda değildir. Aksi kodlamak için zorlayıcı bir neden olmadığı sürece (performans, bellek kısıtlamaları, vb.), Netlik kraldır.
Rob Craig

Formülün ne için olduğuna bağlıdır. 'Açık, örtük olmaktan daha iyidir'e bakın,' önce sıralama 'yaklaşımının programın ne yaptığını ya da diğerlerinden birini daha açık bir şekilde ifade etmesi olabilir. Soruyu yargılayabileceğimizi sanmıyorum.
Thomas Ahle

101

Üç eşitliği aşağıdakiler için çözme:

a in (b+c, b-c, c-b)

4
Bununla ilgili tek sorun yan etkilerdir. B veya c daha karmaşık ifadelerse, birden çok kez çalıştırılır.
Silvio Mayolo

3
@Kroltan Demek istediğim, aslında "daha kompakt" bir temsili isteyen sorusunu cevapladım. Bkz: en.m.wikipedia.org/wiki/Short-circuit_evaluation
Alex Varga

24
Bu kodu okuyan herkes muhtemelen "zeki" olduğunuz için sizi lanetleyecektir.
Karoly Horvath

5
@SilvioMayolo Aynı orijinal için de geçerlidir
Izkata

1
@AlexVarga, "Demek istediğim aslında sorusunu cevapladım" Yaptın; % 30 daha az karakter kullanır (işleçler arasında boşluk bırakır). Cevabınızın yanlış olduğunu söylemeye çalışmıyordum, sadece ne kadar deyimsel (pitonik) olduğunu yorumlayarak. Güzel cevap.
Paul Draper

54

Python, bir dizinin tüm elemanlarında bir anyfonksiyona sahiptir or. Burada ifadenizi 3 elemanlı bir gruba dönüştürdüm.

any((a + b == c, a + c == b, b + c == a))

orKısa devre olduğunu unutmayın , bu nedenle bireysel koşulları hesaplamak pahalıysa, orijinal yapınızı korumak daha iyi olabilir.


2
any()ve all()kısa devre de.
TigerhawkT3

42
@ TigerhawkT3 Bu durumda olmasa da; üç ifade demet var olmadan önce değerlendirilir ve demet anyçift ​​çalıştırmadan önce var olur .
dürtmek

13
Ah, anlıyorum. Sanırım sadece bir jeneratör ya da benzer bir tembel yineleyici olduğunda.
TigerhawkT3

4
anyve all"kısa devre" verildikleri yinelemeyi inceleme süreci ; ancak bu yinelenebilir bir jeneratörden ziyade bir sekans ise , fonksiyon çağrısı gerçekleşmeden önce tam olarak değerlendirilmiştir .
Karl Knechtel

Bunun avantajı, matematik söz konusu olduğunda okunabilirlik için bol miktarda yardımcı olan birden fazla satıra bölünmenin (bağımsız değişkenleri iki kez girintileme , ifadede anytek girintili olma ) ):if
avantajı vardır

40

Yalnızca pozitif sayılarla uğraştığınızı biliyorsanız, bu işe yarayacak ve oldukça temiz:

a, b, c = sorted((a, b, c))
if a + b == c:
    do_stuff()

Dediğim gibi, bu sadece pozitif sayılar için geçerlidir; ancak pozitif olacaklarını biliyorsanız , bu, bir fonksiyonun aksine doğrudan kodda bile çok okunabilir bir çözüm IMO'sudur.

Biraz tekrarlanan hesaplama yapabilen bunu yapabilirsiniz; ancak performansı hedefiniz olarak belirtmediniz:

from itertools import permutations

if any(x + y == z for x, y, z in permutations((a, b, c), 3)):
    do_stuff()

Veya olmadan permutations()ve tekrarlanan hesaplamalar olasılığı:

if any(x + y == z for x, y, z in [(a, b, c), (a, c, b), (b, c, a)]:
    do_stuff()

Muhtemelen bunu ya da başka bir çözümü bir fonksiyona koyardım. Daha sonra kodunuzdaki işlevi temiz bir şekilde çağırabilirsiniz.

Şahsen, koddan daha fazla esnekliğe ihtiyaç duymadıkça, sorunuzdaki ilk yöntemi kullanacağım. Çok basit ve etkili. Yine de bir işleve koyabilirim:

def two_add_to_third(a, b, c):
    return a + b == c or a + c == b or b + c == a

if two_add_to_third(a, b, c):
    do_stuff()

Bu oldukça Pythonic ve muhtemelen bunu yapmanın en etkili yolu (ekstra fonksiyon bir kenara çağırmak); yine de performans hakkında çok fazla endişelenmemelisiniz, aslında bir soruna neden olmadıkça.


özellikle a, b, c'nin negatif olmadığını varsayabiliriz.
cphlewis

"Her zaman işe yaramaz" ifadesini biraz kafa karıştırıcı buluyorum. İlk çözüm yalnızca sayılarınızın negatif olmadığından emin olduğunuzda çalışır. Örneğin (a, b, c) = (-3, -2, -1) ile bir + b! = C var ancak b + c = a var. (-1, 1, 2) ve (-2, -1, 1) ile benzer vakalar.
usernumber

@usernumber, bilirsiniz, daha önce fark ettim; neden düzeltmedim emin değilim.
Cyphase

En iyi çözümünüz büyük bir girdi sınıfı için çalışmazken, OP'nin önerisi tüm girdiler için çalışır. "Çalışmıyor", "çalışmaktan" daha Pitoniktir?
Barry

3
Ooh, çabuk. " Yalnızca pozitif sayılarla uğraştığınızı biliyorsanız , bu işe yarar ve oldukça temizdir". Diğerleri herhangi bir sayı için çalışır, ancak yalnızca pozitif sayılarla uğraştığınızı biliyorsanız , üstteki çok okunabilir / Pythonic IMO'dur.
Cyphase

17

Yalnızca üç değişken kullanacaksanız, ilk yönteminiz:

a + b == c or a + c == b or b + c == a

Zaten çok pitonik.

Daha fazla değişken kullanmayı planlıyorsanız, mantık yönteminiz:

a + b + c in (2*a, 2*b, 2*c)

Çok akıllı ama nedenini düşünelim. Bu neden işe yarıyor?
Bazı basit aritmetik sayesinde şunu görüyoruz:

a + b = c
c = c
a + b + c == c + c == 2*c
a + b + c == 2*c

Ve bu o evet o eşit olur yani biri a, b veya c için geçerli zorunda kalacak 2*a, 2*bya 2*c. Bu, herhangi bir sayıda değişken için geçerli olacaktır.

Bunu hızlı bir şekilde yazmanın iyi bir yolu, değişkenlerinizin bir listesine sahip olmak ve toplamlarını iki katına çıkmış değerlerin bir listesiyle karşılaştırmak olacaktır.

values = [a,b,c,d,e,...]
any(sum(values) in [2*x for x in values])

Bu şekilde, denkleme daha fazla değişken eklemek için tek yapmanız gereken değerler listenizi 'n' denklemleri yazmak yerine 'n' yeni değişkenlere göre düzenlemek


4
Ne yaklaşık a=-1, b=-1, c=-2, daha sonra a+b=c, ancak a+b+c = -4ve 2*max(a,b,c)bir-2
Eric Renouf

Teşekkür ederim bu doğru, abs kullanmam gerekecek. Bu ayarlamayı şimdi yapıyorum.
ThatGuyRussell

2
Yarım düzine abs()çağrı ile biberledikten sonra , OP'nin snippet'inden Pythonic (aslında daha az okunabilir diyebilirim).
TigerhawkT3

Bu çok doğru, şimdi ayarlayacağım
ThatGuyRussell

1
@ThatGuyRussell Kısa devre yapmak için, bir jeneratör kullanmak istersiniz ... böyle bir şey any(sum(values) == 2*x for x in values), bu şekilde gerekli olan tüm ikiye katlamayı yapmak zorunda kalmazsınız.
Barry

12

Aşağıdaki kod, her bir öğeyi, o öğe hariç olmak üzere, tüm listenin toplamından hesaplanan diğerlerinin toplamı ile tekrarlı olarak karşılaştırmak için kullanılabilir.

 l = [a,b,c]
 any(sum(l)-e == e for e in l)

2
Güzel :) Bence []ikinci satırdan parantez kaldırırsanız , bu bile orijinal gibi kısa devre olacak or...
psmears

1
temelde any(a + b + c == 2*x for x in [a, b, c])OP'nin önerisine oldukça yakın
njzk2

Bu benzerdir, ancak bu yöntem herhangi bir sayıda değişkene uzanır. @Psmears tarafından kısa devre önerisini ekledim.
Arcanum

10

Deneyin ve basitleştirmeyin. Bunun yerine, isim , bir işlevle yapıyoruz:

def any_two_sum_to_third(a, b, c):
  return a + b == c or a + c == b or b + c == a

if any_two_sum_to_third(foo, bar, baz):
  ...

Koşulu "zekice" bir şeyle değiştirmek, onu kısaltabilir, ancak daha okunabilir hale getirmez. Bununla birlikte, onu nasıl bıraktığınız da çok okunabilir değil, çünkü bu üç koşulu bir bakışta neden kontrol ettiğinizi bilmek zor . Bu, ne kontrol ettiğinizi kesinlikle netleştirir.

Performansla ilgili olarak, bu yaklaşım bir işlev çağrısının ek yükünü ekler, ancak kesinlikle düzeltmeniz gereken bir darboğaz bulmadıkça performans için okunabilirliği asla feda etmeyin. Ve her zaman ölçün, çünkü bazı akıllı uygulamalar bazı durumlarda bazı işlev çağrılarını optimize etme ve satır içine alma yeteneğine sahiptir.


1
İşlevler yalnızca aynı kodu birden fazla noktada kullanmayı düşünüyorsanız veya kod karmaşıksa yazılmalıdır. Orijinal soruda kodun yeniden kullanılmasından söz edilmez ve tek bir kod satırı için bir işlev yazmak sadece aşırıya kaçmakla kalmaz, aynı zamanda okunabilirliği de bozar.
Igor Levicki

5
FP okulundan geldiğimde, tamamen katılmıyorum ve iyi adlandırılmış tek hat işlevlerinin, bulabileceğiniz okunabilirliği artırmak için en iyi araçlardan bazıları olduğunu belirtmeliyim. Eğer bir şeyler yapmak alıyorsun adımlar derhal açıklık üzme zaman bir işlev olun neyi işlevinin adı belirttiğiniz olanak tanıdığından, yaptığın şey daha iyi herhangi bir yorum olabilir daha.
Jack

Hangi okula çağırırsanız götürün, bir dizi kurala körü körüne uymak kötüdür. Bir fonksiyonun içinde gizlenmiş bir kod satırını okumak için kaynağın başka bir bölümüne atlamak zorunda kalması, sadece adında söylediklerini gerçekten doğrulayabilmesi ve ardından çağrının yerine geri dönmesi gerekiyor. doğru parametreleri geçirdiğinizden emin olun tamamen gereksiz bağlam geçişi. Bence bunu yapmak hem okunabilirliği hem de iş akışını bozar. Son olarak, ne bir fonksiyonun adı ne de kod yorumları kod dokümantasyonu için uygun bir alternatif değildir.
Igor Levicki

9

Python 3:

(a+b+c)/2 in (a,b,c)
(a+b+c+d)/2 in (a,b,c,d)
...

Herhangi bir sayıda değişkene göre ölçeklendirilir:

arr = [a,b,c,d,...]
sum(arr)/2 in arr

Ancak, genel olarak, üçten fazla değişkeniniz olmadıkça, orijinal sürümün daha okunabilir olduğunu kabul ediyorum.


3
Bu, kayan nokta yuvarlama hataları nedeniyle bazı girişler için yanlış sonuçlar döndürür.
Puan

Performans ve doğruluk nedenleriyle bölümden kaçınılmalıdır.
Igor Levicki

1
@pts Hiçbir uygulama kayan nokta yuvarlaması nedeniyle yanlış sonuçlar döndürmez mi? Hatta a + b == c
osundblad

@osundblad: a, b ve c ints ise, (a + b + c) / 2 yuvarlama yapar (ve yanlış sonuçlar verebilir), ancak a + b == c doğrudur.
Puan

3
2'ye bölünme üssü bir azalır, bu nedenle 2 ^ 53'den (python içindeki bir şamandıranın kesir kısmı) daha küçük herhangi bir tamsayı için doğru olur ve daha büyük tamsayılar için ondalık kullanabilirsiniz . Örneğin, 2 ^ 30'dan az olan tam sayıları kontrol etmek için[x for x in range(pow(2,30)) if x != ((x * 2)/ pow(2,1))]
Vitalii Fedorenko

6
(a+b-c)*(a+c-b)*(b+c-a) == 0

İki terimin toplamı üçüncü terime eşitse, faktörlerden biri sıfır olur ve tüm ürün sıfırlanır.


Tam olarak aynı şeyi düşünüyordum ama orijinal önerisinin daha temiz olduğunu inkar edemem ...
user541686

@Mehrdad - Kesinlikle. Gerçekten farklı değil(a+b<>c) && (a+c<>b) && (b+c<>a) == false
mbeckish

Çarpma mantıksal ifadelerden ve temel aritmetikten daha pahalıdır.
Igor Levicki

@IgorLevicki - Evet, ancak bu çok erken bir optimizasyon endişesi. Bu saniyede on binlerce kez yapılacak mı? Evetse, muhtemelen başka bir şeye bakmak istersiniz.
mbeckish

@mbeckish - Neden erken olduğunu düşünüyorsun? Kod, optimizasyon düşünülerek yazılmalıdır, sonradan düşünülecek şekilde optimize edilmemelidir. Bir gün bazı stajyer bu kod snippet'ini kopyalayacak ve gömülü bir platformda performans açısından kritik bir döngüye yapıştıracak ve bu da milyonlarca cihazda çalışacak kadar yavaş olmayacak, ancak belki de daha fazla pil gücü harcayacak. Böyle bir kod yazmak sadece kötü kodlama uygulamalarını teşvik eder. Bence OP'nin sorması gereken, o mantık ifadesini optimize etmenin bir yolu olup olmadığı.
Igor Levicki

6

Peki ya:

a == b + c or abs(a) == abs(b - c)

Değişkenler imzalanmamışsa bunun işe yaramayacağını unutmayın.

Kod optimizasyonu açısından (en azından x86 platformunda) bu en etkili çözüm gibi görünüyor.

Modern derleyiciler, hem abs () işlev çağrılarını satır içine alacak ve akıllı bir CDQ, XOR ve SUB komut dizisi kullanarak işaret testini ve sonraki koşullu dalı önleyecektir . Yukarıdaki yüksek seviye kodu bu nedenle sadece düşük gecikmeli, yüksek verimli ALU talimatları ve sadece iki koşulla temsil edilecektir.


Ve bence türleri fabs()için kullanılabilir float;).
shA.t

4

Alex Varga tarafından sağlanan çözüm (b + c, bc, cb) "kompakt ve matematiksel olarak güzel, ama aslında bu şekilde kod yazmayacağım çünkü bir sonraki geliştirici, kodun amacını hemen anlayamayacaktı .

Mark Ransom'un çözümü

any((a + b == c, a + c == b, b + c == a))

daha açık ama daha özlü değil

a + b == c or a + c == b or b + c == a

Başka birinin bakması gerekecek ya da yazarken ne düşündüğümü unuttuğumda uzun süre bakmak zorunda kalacağım kodu yazarken, çok kısa ya da zeki olmak yarardan çok zarar verme eğilimindedir. Kod okunabilir olmalıdır. Çok özlü, ama bir sonraki programcı bunu anlayamayacak kadar özlü değil.


Dürüst soru: İnsanlar neden her zaman bir sonraki programcının kodu okuyamayacak bir salak olacağını varsayıyor? Şahsen bu fikri aşağılayıcı buluyorum. Kodun her programcıya açık bir şekilde açık olması için yazılması gerekiyorsa, bu bir meslek olarak en düşük ortak paydaya, aramızda en az yetenekli olana hitap ettiğimizi gösterir. Bunu yapmaya devam edersek, kişisel becerilerini nasıl geliştirecekler? Bunu başka mesleklerde görmüyorum. En son ne zaman bestecinin basit bir müzik puanı yazdığını gördünüz, böylece her müzisyen beceri seviyesinden bağımsız olarak çalabilir mi?
Igor Levicki

6
Mesele, programcıların bile zihinsel enerjisinin sınırlı olması, bu nedenle sınırlı zihinsel enerjinizi programın algoritmasına ve daha üst düzey yönlerine mi, yoksa daha basit bir şekilde ifade edilebildiğinde karmaşık bir kod satırının ne anlama geldiğini anlamak mı istiyorsunuz? ? Programlama zordur, bu yüzden gereksiz yere kendinize daha fazla zorlamayın, tıpkı bir Olimpiyat koşucusu ağır bir sırt çantasıyla yarış yapamayacakları için koşmayacakları gibi. Steve McConell'in Code Complete 2'de söylediği gibi, okunabilirlik kodun en önemli yönlerinden biridir.
Paul J Abernathy

2

Talep daha kompakt VEYA daha pitonik için - elimi daha kompakt denedim.

verilmiş

import functools, itertools
f = functools.partial(itertools.permutations, r = 3)
def g(x,y,z):
    return x + y == z

Bu orijinalden 2 karakter daha az

any(g(*args) for args in f((a,b,c)))

ile test:

assert any(g(*args) for args in f((a,b,c))) == (a + b == c or a + c == b or b + c == a)

ayrıca, verilen:

h = functools.partial(itertools.starmap, g)

Bu eşdeğerdir

any(h(f((a,b,c))))

Orijinalinden iki karakter daha kısa, ancak OP'nin hemen sonra verdiği karakter değil, şu anda kullandığını söyledi. Orijinal ayrıca, mümkün olduğunda atladığı birçok boşluk içerir. Bunun çalışması g()için tanımlamanız gereken fonksiyonun küçük bir konusu da vardır . Tüm bunlar göz önüne alındığında, önemli ölçüde daha büyük olduğunu söyleyebilirim.
TigerhawkT3

@ TigerhawkT3, daha kısa bir ifade / satır isteği olarak yorumladım. daha fazla gelişme için düzenlemeye bakınız .
İkinci Dünya Savaşı

4
Çok kötü fonksiyon isimleri, sadece bir kod golf için uygundur.
0xc0de

@ 0xc0de - üzgünüm oynamıyorum. Uygun oldukça öznel ve koşullara bağlı olabilir - ama topluma erteleyeceğim.
İkinci Dünya Savaşı

Orijinal koddan daha fazla karakter içerdiğinde bunun nasıl daha kompakt olduğunu görmüyorum.
Igor Levicki

1

En pitonik cevap olarak gördüğümü sunmak istiyorum :

def one_number_is_the_sum_of_the_others(a, b, c):
    return any((a == b + c, b == a + c, c == a + b))

Optimize edilmemiş genel durum:

def one_number_is_the_sum_of_the_others(numbers):
    for idx in range(len(numbers)):
        remaining_numbers = numbers[:]
        sum_candidate = remaining_numbers.pop(idx)
        if sum_candidate == sum(remaining_numbers):
            return True
    return False 

Python Zen açısından, vurgulanan ifadelerin diğer cevaplardan daha fazla takip edildiğini düşünüyorum:

Python'un Zen'i, Tim Peters

Güzel, çirkin olmaktan iyidir.
Açık, örtük olmaktan iyidir.
Basit, karmaşık olmaktan iyidir.
Karmaşık karmaşık olmaktan iyidir.
Düz iç içe geçmişten daha iyidir.
Seyrek yoğun olmaktan iyidir.
Okunabilirlik önemlidir.
Özel durumlar kuralları ihlal edecek kadar özel değildir.
Pratiklik saflığı yenmesine rağmen.
Hatalar asla sessizce geçmemelidir.
Açıkça susturulmadıkça.
Belirsizlik karşısında, tahmin etme isteğini reddet.
Bunu yapmanın tek ve tercihen tek bir yolu olmalı.
Her ne kadar Hollandalı değilseniz bu yol ilk başta belli olmayabilir.
Şimdi hiç olmadığı kadar iyi.
Her ne kadar asla genellikle daha iyi olmasa daSağ şimdi.
Uygulamanın açıklanması zorsa, bu kötü bir fikirdir.
Uygulamanın açıklanması kolaysa, iyi bir fikir olabilir.
İsim alanları harika bir fikirdir - hadi bunlardan daha fazlasını yapalım!


1

Programlamamın eski bir alışkanlığı olarak, karmaşık ifadeyi sağda bir cümle içine yerleştirmenin onu daha okunabilir hale getirebileceğini düşünüyorum:

a == b+c or b == a+c or c == a+b

Artı ():

((a == b+c) or (b == a+c) or (c == a+b))

Ve ayrıca çok satırlı kullanımın daha fazla mantıklı olabileceğini düşünüyorum:

((a == b+c) or 
 (b == a+c) or 
 (c == a+b))

0

Genel bir şekilde,

m = a+b-c;
if (m == 0 || m == 2*a || m == 2*b) do_stuff ();

bir giriş değişkenini değiştirmek sizin için uygunsa,

c = a+b-c;
if (c==0 || c == 2*a || c == 2*b) do_stuff ();

bit kesmek kullanarak yararlanmak istiyorsanız, "!", ">> 1" ve "<< 1" kullanabilirsiniz.

Yuvarlama hatalarını önlemek için iki çarpmayı önlemek için kullanılmasına rağmen bölünmeden kaçındım. Ancak taşmaları kontrol edin


0
def any_sum_of_others (*nums):
    num_elements = len(nums)
    for i in range(num_elements):
        discriminating_map = map(lambda j: -1 if j == i else 1, range(num_elements))
        if sum(n * u for n, u in zip(nums, discriminating_map)) == 0:
            return True
    return False

print(any_sum_of_others(0, 0, 0)) # True
print(any_sum_of_others(1, 2, 3)) # True
print(any_sum_of_others(7, 12, 5)) # True
print(any_sum_of_others(4, 2, 2)) # True
print(any_sum_of_others(1, -1, 0)) # True
print(any_sum_of_others(9, 8, -4)) # False
print(any_sum_of_others(4, 3, 2)) # False
print(any_sum_of_others(1, 1, 1, 1, 4)) # True
print(any_sum_of_others(0)) # True
print(any_sum_of_others(1)) # False

İşlevler yalnızca aynı kodu birden fazla noktada kullanmayı düşünüyorsanız veya kod karmaşıksa yazılmalıdır. Orijinal soruda kodun yeniden kullanılmasından söz edilmez ve tek bir kod satırı için bir işlev yazmak sadece aşırıya kaçmakla kalmaz, aynı zamanda okunabilirliği de bozar.
Igor Levicki

Okunabilirliği bozduğuna katılmıyorum; uygun bir isim seçerseniz okunabilirliği artırabilir (ancak bu cevapta seçtiğim ismin kalitesi ile ilgili herhangi bir beyanda bulunmam). Buna ek olarak, bir kavram için bir isim vermek de yararlı olabilir, ki bu fonksiyonunuza iyi bir isim vermeye zorladığınız sürece yapmanız gerekir. Fonksiyonlar iyidir. İşlevselliğin bir işlevde kapsüllenmekten fayda sağlayacak kadar karmaşık olup olmadığı konusunda öznel bir yargı vardır.
Hammerite
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.