2015-10-15 12 views
6

ben [bana göre yazılmaz] Bu gibi bazı kod hakkında çok karışık hissediyorum:herhangi

version = any(func1(), func2()) # wrong, should be any([func1(), func2()]) 

def func1(): 
    if something: 
     return 1 
    else: 
     return None 

def func2(): 
    if something: 
     return 2 
    else: 
     return 3 

version bir num olmalıdır. [func1(), func2()][1, None] olduğunda [None, 2] olduğunda, zaman [1, 2]any() sadece True veya False dönmek, çünkü

1. yüzden bu kodda any() kullanmanın yanlış olduğunu düşünüyorum dönmelidir 2, dönmelidir, 1 dönmelidir. Bu mantığı başka bir yolla yeniden kurarsam, pythoner olarak zarif bir yol bulamıyorum.

any() mantığını gerçekleştirip gerçekleştiremeyeceğini bilmek istiyorum, değilse nasıl incelikli bir şekilde elde edilir?

+1

Herhangi bir() 'in hangi senaryoyu kullanacağını veya bu kod parçasının nasıl basitleştirileceğini mi soruyorsunuz? – Nayuki

+0

@NayukiMinase Herhangi bir() 'in mantıksal başarıya ulaşıp ulaşamayacağını öğrenmek istiyorum. –

cevap

12

Burada or'u kullanabilirsiniz.

version = func1() or func2() 

Arama yapmaya başlamadan önce işlevlerin tanımlandığından emin olun.

Bu, or ilk True benzeri değeri veya son değeri döndürdüğü için geçerlidir (değer true değilse). Ve Boole bağlamında 'Hiçbiri' Yanlış olarak kabul edilir.

+2

Bu iyi bir yol, teşekkürler. –

5

@ AnandSKumar'ın yanıtı en uygunudur.

>>> def foo(): 
... return 2 
... 
>>> def boo(): 
... return 3 
... 
>>> def doo(): 
... return 4 
... 
>>> f = [foo, boo, doo] 

>>> any(i() < 3 for i in f) 
True 

Sonuçta herhangi is içeride neler olup bittiğini, yöntemlerin diziyi sürekli tekrarlanması:

Bu örneği ele alalım: Eğer ilgileniyorsanız Ama size bir bazı bilgiler vermek j, ve her öğenin 3'ten küçük olup olmadığını, bu durumda "herhangi birinin" ne yapacağını, bununla eşleşen "HERHANGİ" koşulu döndürdüğünü belirtin. Bu yüzden, False olan birini bulsanız bile, yine de True olacaktır.

Bunun için "all" olarak adlandırılan, TÜM koşulların denetlediğiniz durumunuza göre karşılanmasını sağlayan benzer bir yöntem daha vardır. İşte bir örnek:

>>> all(i() < 3 for i in f) 
False 

Gördüğünüz gibi, bir koşul başarısız olduğu için False döndürecektir. keyfi uzunluk durum için

4

(burada açıkça mantıklı değil or zincirleme), tüm sonuçları ile falsy olduğunda ilk truthy değeri veya belirli bir değeri döndürür any bir sürümünü yapabilirsiniz:

# If on Py2, you'll want to do this to get shortcircuiting behavior 
from future_builtins import filter 

result = next(filter(None, iterable_to_check), False) # False can be replaced with a chosen default 

filter yalnızca "doğruluk" değerleri üretir ve iki argüman next ilk "doğru" değeri alır veya filter "doğruluk" değeri bulamazsa varsayılan değerdir.

iterable_to_check ise boş olmayan Sequence (sadece Iterable yerine), tam olarak zincirleme or s davranışını eşleşebilir ("falsy" sonuç son değer, değil False veya None gibi belirli bir değerdir) ile:

result = next(filter(None, sequence_to_check), sequence_to_check[-1]) 

tüm elemanlar "falsy" ne zaman sonuç olarak son elemanı ("truthy" ya da "falsy") kullanımı. Açık olmak gerekirse, test edilecek şeylerin kümesi sabit ve ufacıksa, Anand'ın cevabı için or açıksa daha iyi bir yoldur.