python histogramm - Rückgabe boolean wenn gesetzt ist leer





erstellen achsenskalierung (6)


Wenn du sagst:

c is not None

Sie überprüfen, ob c und None auf dasselbe Objekt verweisen. Das ist es, was der Operator "ist" tut. In Python ist None ein spezieller Nullwert, was bedeutet, dass Sie keinen Wert zur Verfügung haben. Sorta wie null in c oder Java. Da Python intern nur einen None-Wert mit dem "is" -Operator zuweist, um zu prüfen, ob etwas None ist (think null), funktioniert es, und es wurde zum populären Stil. Dies hat jedoch nichts mit dem Wahrheitswert der Menge c zu tun, sondern es prüft, ob c tatsächlich eine Menge und nicht ein Nullwert ist.

Wenn Sie überprüfen möchten, ob eine Menge in einer Bedingungsanweisung leer ist, wird sie im Kontext als Boolean interpretiert. Sie können also einfach sagen:

c = set()
if c:
   print "it has stuff in it"
else:
   print "it is empty"

Aber wenn Sie möchten, dass es in einen booleschen Wert konvertiert wird, können Sie einfach sagen:

c = set()
c_has_stuff_in_it = bool(c)

Ich habe Mühe, einen saubereren Weg zu finden, um einen booleschen Wert zurückzugeben, wenn mein Satz am Ende meiner Funktion leer ist

Ich nehme die Schnittmenge zweier Mengen und möchte auf der Basis von True oder False , wenn die resultierende Menge leer ist.

def myfunc(a,b):
    c = a.intersection(b)
    #...return boolean here

Mein erster Gedanke war zu tun

return c is not None

In meinem Interpreter kann ich jedoch leicht erkennen, dass diese Aussage wahr zurückgibt, wenn c = set([])

>>> c = set([])
>>> c is not None
True

Ich habe auch alles ausprobiert:

>>> c == None
False
>>> c == False
False
>>> c is None
False

Jetzt habe ich aus der Dokumentation gelesen, dass ich nur verwenden kann, and / or not mit leeren Mengen, um einen booleschen Wert abzuleiten. Bis jetzt ist das einzige, was ich mir vorstellen kann, nicht c zurückzukehren

>>> not not c
False
>>> not c
True

Ich habe das Gefühl, dass es einen viel pythischeren Weg gibt, dies zu tun, indem ich darum kämpfe, es zu finden. Ich möchte nicht die tatsächliche Menge auf eine if-Anweisung zurückgeben, weil ich die Werte nicht brauche, ich möchte nur wissen, ob sie sich schneiden.




Wenn Sie für eine leere Menge return True wollen, dann wäre es klarer, dies zu tun:

return c == set()

dh " c ist gleich einer leeren set ".

(Oder umgekehrt return c != set() ).

Meiner Meinung nach ist dies expliziter (wenn auch weniger idiomatisch), als sich darauf zu verlassen, dass Python eine leere Menge in einem booleschen Kontext als False interpretiert.




Wenn c eine Menge ist, dann können Sie überprüfen, ob sie leer ist: return not c .

Wenn c leer ist, dann ist not c nicht True .

Andernfalls, wenn c irgendwelche Elemente enthält, wird c not c False .




nicht so pythisch wie die anderen Antworten, sondern Mathematik:

return len(c) == 0



Nicht so sauber wie Bool (c), aber es war eine Ausrede, um Ternär zu verwenden.

def myfunc(a,b):
    return True if a.intersection(b) else False

Auch wenn Sie ein bisschen dieselbe Logik verwenden, müssen Sie c nicht zuweisen, es sei denn, Sie verwenden es für etwas anderes.

def myfunc(a,b):
    return bool(a.intersection(b))

Schließlich würde ich annehmen, dass Sie einen True / False-Wert wünschen, weil Sie damit einen booleschen Test durchführen wollen. Ich würde empfehlen, den Overhead eines Funktionsaufrufs und einer Definition zu überspringen, indem Sie einfach testen, wo Sie sie benötigen.

Anstatt von:

if (myfunc(a,b)):
    # Do something

Vielleicht das:

if a.intersection(b):
    # Do something



Standardmäßig wird cin mit stdio synchronisiert, was dazu führt, dass keine Eingabepufferung erfolgt. Wenn Sie dies an der Spitze Ihres Hauptbereichs hinzufügen, sollten Sie eine wesentlich bessere Leistung sehen:

std::ios_base::sync_with_stdio(false);

Wenn ein Eingabestrom gepuffert wird, wird der Stream normalerweise in größeren Blöcken gelesen, anstatt jeweils ein Zeichen zu lesen. Dies reduziert die Anzahl von Systemaufrufen, die typischerweise relativ teuer sind. Da die FILE* stdio und iostreams oft separate Implementierungen und daher separate Puffer haben, könnte dies zu einem Problem führen, wenn beide zusammen verwendet werden. Beispielsweise:

int myvalue1;
cin >> myvalue1;
int myvalue2;
scanf("%d",&myvalue2);

Wenn mehr Eingaben von cin gelesen werden, als tatsächlich benötigt werden, dann wäre der zweite ganzzahlige Wert für die scanf Funktion nicht verfügbar, die ihren eigenen unabhängigen Puffer hat. Dies würde zu unerwarteten Ergebnissen führen.

Um dies zu vermeiden, werden Streams standardmäßig mit stdio synchronisiert. Ein üblicher Weg, dies zu erreichen, besteht darin, cin jedes Zeichen stdio nach Bedarf mit Hilfe von stdio Funktionen lesen zu lassen. Leider bringt dies eine Menge Overhead mit sich. Bei kleinen Eingabemengen ist dies kein großes Problem, aber wenn Sie Millionen von Zeilen lesen, ist die Leistungseinbuße erheblich.

Glücklicherweise haben die Bibliotheksdesigner entschieden, dass Sie diese Funktion auch deaktivieren sollten, um eine bessere Leistung zu erzielen, wenn Sie wüssten, was Sie getan haben. sync_with_stdio sie die Methode " sync_with_stdio bereitgestellt.







python python-2.7