If Anweisung Python?

3 Antworten

So kann einfach geprüft werden, ob eine Eingabe zwischen 1 (inklusiv) und 10 (exklusiv) liegt:

number = int(input())

if number >= 1 and number < 10:
  # do something ...
EhrenMensch 
Fragesteller
 24.06.2021, 01:44

danke: ) ich hab es jetzt mit if i in range(1, 11): gelöst

0
regex9  24.06.2021, 01:49
@EhrenMensch

Das ist m.E. keine so gute Lösung, denn auf diese Weise wird doch erst eine Liste angelegt, die die Zahlen im abgesteckten Bereich beinhaltet und dann muss noch einmal durch jedes Element iteriert werden, um zu prüfen, ob es dem Wert von i entspricht. Bei zehn Elementen mag es zwar noch nicht so dramatisch sein, doch umso größer der Wertebereich wird, umso mehr Aufwand ist auch nötig.

1
EhrenMensch 
Fragesteller
 24.06.2021, 01:53
@regex9

also bei mir liegt es zwischen 1250000 und 1750000 und es hat alles geklappt oder hab ich jetzt was falsch verstanden ? musste auch selbst keine liste anlegen halt wirklich nur (1250000, 1750000)

0
EhrenMensch 
Fragesteller
 24.06.2021, 01:54
@EhrenMensch

aber korrigier mich gerne! habe auch nochmal extra eine neue Frage aufgemacht mit dem ganzen code (2 Screenshots) und hab nach verbesserungs-vorschlägen gefragt: )

0
xxxcyberxxx  24.06.2021, 01:56
@regex9
Das ist m.E. keine so gute Lösung, denn auf diese Weise wird doch erst eine Liste angelegt, die die Zahlen im abgesteckten Bereich beinhaltet und dann muss noch einmal durch jedes Element iteriert werden, um zu prüfen, ob es dem Wert von i entspricht

das stimmt so nicht, range ist ein eigener Typ und es wird nicht erst eine Liste erstellt. Ein Range-Objekt speichert nur drei Dinge: Start, Stop und die Steps, die in einer Iteration passieren. Der verbrauchte Speicher ist sehr klein, auch wenn große Bereiche abgedeckt werden. Damit lässt sich auch sehr einfach und effizient berechnen, ob eine Zahl drin liegt oder nicht ...

1
regex9  24.06.2021, 02:53
@EhrenMensch

Um die Funktionalität, ob es klappt, ging es hierbei nicht (und ich meine, dass das aus meinem Kommentar auch klar hervorgeht), sondern darum, wie etwas funktioniert (lies dazu alle Kommentare unter dieser Antwort). Wege nach Rom gibt es viele, doch nicht jeder ist so kurz / einfach wie ein anderer.

Bei meinem Lösungsvorschlag hast du zwei konstante Werte (1, 10) und eine Variable, die miteinander via mathematischer Operatoren verglichen werden.

Mit range hast du ein Objekt, welches zusätzlich Speicher einnimmt (auch wenn der minimal ist). Für den Vergleich wird ebenso mathematisch gearbeitet.

0
EhrenMensch 
Fragesteller
 24.06.2021, 02:56
@regex9

Ja habs jetzt auch verstanden :) danke nochmal

0
MrAmazing2  24.06.2021, 02:50

Mit Chained Comparisons ginge das noch etwas kürzer. ^^

0

if 1 <= number <= 10:

Woher ich das weiß:Hobby – Programmieren ist mein Hobby & Beruf
i in range(1, 11)

wäre die Bedingung für deine Abfrage, ob die in der Variable i gespeicherte Zahl im Zahlenbereich von 1 bis 10 liegt

eingebaut dann:

if i in range(1, 11):
  # do stuff

Das sind jedoch Basics, die du auf jeden Fall beherrschen solltest, wenn du weitermachen willst.

EhrenMensch 
Fragesteller
 24.06.2021, 01:28

hab vor 3 eher 2 tagen angefangen also bin noch nicht sooo deep drin. aber denke ich mache mich ganz gut :) und danke für die Antwort, hat mein problem behoben

0
EhrenMensch 
Fragesteller
 24.06.2021, 01:30

Ich sehe auch du bist ja Community Experte. Könnte ich dir eventuell einen Code schicken, an dem ich heute gesessen habe, und du sagst mir vllt ob ich was verbessern kann ? also falls du grade zeit und lust dazu hast. falls nicht is auch nicht schlimm.

0
xxxcyberxxx  24.06.2021, 01:35
@EhrenMensch

stell es doch einfach als öffentliche Frage. Je nachdem, ob es ein Längerer Code ist, nutz eventuell einen Dienst wie Hastebin.

Wenn du den Code direkt postest, bitte nutz den Code-Tag hier im Editor (wie bei meiner Antwort) und denk daran, dass bei Python die Einrückung sehr wichtig ist

0
EhrenMensch 
Fragesteller
 24.06.2021, 01:43
@xxxcyberxxx

achso ja ich wollte nicht direkt für sowas unnötiges eine neue Frage aufmachen, aber klar dann mach ich das : ) ich hab grad mal geguckt ich kriege das mit Hastebin grad irgendwie nicht hin entweder bin ich zu müde oder es ist sehr unübersichtlich gemacht ^^ ich stelle die frage einfach mit 2 screenshots öffentlich :) wenn du Interesse hast mir Tipps zu geben kannst du dann gerne kommentieren :)

0
KarlRanseierIII  24.06.2021, 02:27

Gott bewahre!

0
xxxcyberxxx  24.06.2021, 02:37
@KarlRanseierIII
Gott bewahre!

willst du das auch noch ausführen (z.B., worauf sich deine Aussage genau bezieht) oder einfach so stehen lassen

0
KarlRanseierIII  24.06.2021, 02:58
@xxxcyberxxx

In Python3 hat man für ints den in Operator bei ranges so hingebogen, daß er in O(1) arbeitet, weil man das eigentliche Protokoll umgeht und stattdessen eine einfache Berechnung ausführt.

Ansich ist in+range ein O(n) und wenn wir den Modus Operandi erzwingen:

16123789.0 in range(2**32)

hört der Spaß auf ;-).

D.h., wenn man das macht, sollte man sich sehr sicher sein, daß die Sonderbehandlung auch greift.

Insofern ist eine Grenzprüfung mit 2 Conditionals und AND allgemein die bessere Option.

0
xxxcyberxxx  24.06.2021, 03:07
@KarlRanseierIII
In Python3 hat man für ints den in Operator bei ranges so hingebogen, daß er in O(1) arbeitet, weil man das eigentliche Protokoll umgeht und stattdessen eine einfache Berechnung ausführt.

eine Range speichert in Python3 nur 3 Werte, und das sind eben Start, Stop und Steps. Ich bin jetzt zu faul, die genaue Implementierung rauszunehmen, aber vermutlich wurde intern dann auch auf irgendwas mit einfachen Vergleichen gemacht.

Wenn ich es als Funktion implementieren müsste, würde ich vermutlich folgendes machen (um auch die Steps zu unterstützen, die range eben haben kann)

def in_range(min_val, max_val, steps, num):
  return False if num >= max_val else (num - min_val) % steps == 0
Insofern ist eine Grenzprüfung mit 2 Conditionals und AND allgemein die bessere Option.

Gut, bei Floats möge es sich vielleicht noch anders verhalten. Es ging hier aber um Ganzzahlen (Zahlen von 1 bis 10)

Wenn man von Integern ausgeht, ist der Unterschied zwischen "in range" und zwei Größer-Kleiner-Vergleichen & und sehr gering - so gering, dass da die besser lesbare "in range" vorzuziehen ist.

0
KarlRanseierIII  24.06.2021, 03:18
@xxxcyberxxx

Wir müssen nicht den Quellcode rausholen, da wird es ein if, ein modulo und Kleinvieh geben, kein Thema.

Das Problem ist, range kann mißverstanden werden, weil nicht klar ist, daß eben nicht geschaut wird, ob es innerhalb eines Wertebereichs liegt, sondern innerhalb der von der Range erzeugten Werte.

Spaßig wird das mit einem beliebigen Typ, der mit einem int vergleichen werden kann (Denk z.B. mal an die Normen von Vektoren). dann schreibe ich naiv vielleicht sowas wie:

if myvec in range (1000,1000000000,5):

und bekomme nicht das, was ich möchte, oder doch, aber eben arsch lahm.

Okay, zugegeben, wer so ne Klasse selbst schreibt, der weiß hoffentlich auch, was eine range() ist und wie sie funktioniert.

1