Vorbereitung auf meine Pythonklausur

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
BlackJack

@sharete: An dem `float()` sollst Du nichts ändern, nur das `input()` durch `raw_input()` ersetzen, denn das ist hier die richtige Funktion.
sharete
User
Beiträge: 20
Registriert: Donnerstag 1. Juni 2017, 11:31

BlackJack hat geschrieben:@sharete: An dem `float()` sollst Du nichts ändern, nur das `input()` durch `raw_input()` ersetzen, denn das ist hier die richtige Funktion.
Okay und wo ist der Unterschied, ob ich nun float(input, oder float(raw_input benutze?

LG
BlackJack

@sharete: Bei einem echten Python 2.x ist `input()` unsicher weil da beliebige Python-Ausdrücke die der Benutzer eingeben kann, ausgewertet werden.
sharete
User
Beiträge: 20
Registriert: Donnerstag 1. Juni 2017, 11:31

Neues Spiel, neues Glück :D..

Also ich soll anzeigen lassen, ob ein bestimmtes Jahr ein Schaltjahr ist oder nicht. Habe soweit einen Code geschrieben, der die Formel beinhaltet und er zeigt mir jedesmal an, wenn es ein Schaltjahr ist. Gebe ich aber mit Absicht ein falsches Jahr ein, wird mir nicht ausgegeben, dass es KEIN Schaltjahr ist. Woran kann das liegen?

Code: Alles auswählen

x = int(raw_input("Eingabe:"))

if x % 400 == 0:
    print "Es ist ein Schaltjahr"
elif x % 100 == 0:
    print "Es ist kein Schaltjahr"
elif x % 4 == 0:
    print "Es ist ein Schaltjahr"
LG
Zuletzt geändert von Anonymous am Dienstag 6. Juni 2017, 14:38, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Liffi
User
Beiträge: 153
Registriert: Montag 1. Januar 2007, 17:23

Fehlender else Zweig? ;-)
sharete
User
Beiträge: 20
Registriert: Donnerstag 1. Juni 2017, 11:31

Decke ist das nicht mit el(se)if ab? Ich dachte bei einem elif ist kein else zwingend notwendig.

edit: AHHHH jetzt weiß ich, was du meinst! Dankeschön, habs gefixt :D
Sirius3
User
Beiträge: 17830
Registriert: Sonntag 21. Oktober 2012, 17:20

@sharete: zum Code, `x` is kein schöner Name für eine Variable, die ein Jahr repräsentieren soll. Die if-Bedingungen sollten noch mit `and` und `or` zu einer Bedingung zusammengefasst werden.
sharete
User
Beiträge: 20
Registriert: Donnerstag 1. Juni 2017, 11:31

Sirius3 hat geschrieben:@sharete: zum Code, `x` is kein schöner Name für eine Variable, die ein Jahr repräsentieren soll. Die if-Bedingungen sollten noch mit `and` und `or` zu einer Bedingung zusammengefasst werden.
Wäre das förmlich so in Ordnung?

Code: Alles auswählen

schaltjahr = int(raw_input("Eingabe:"))

if schaltjahr % 400 == 0 or schaltjahr % 4 == 0:
    print "Es ist ein Schaltjahr"
else:
    print "Es ist kein Schaltjahr"
Nun hätte ich noch eine Frage bezüglich eines Codes und zwar verstehe ich nicht, was dieses abs soll?

Code: Alles auswählen

def ungefaehr(x,y):
    if abs(x-y) < 0.001:
        return True
    else:
        return False
 
print ungefaehr(3.14159,3.14)
print ungefaehr(3.14159,3.141)
print ungefaehr(-0.555,-0.5555)
print ungefaehr(-0.555,-0.55)
Zuletzt geändert von Anonymous am Dienstag 6. Juni 2017, 23:34, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Sirius3
User
Beiträge: 17830
Registriert: Sonntag 21. Oktober 2012, 17:20

@sharete: Du willst prüfen, ob das Jahr ein Schaltjahr ist, der Variablenname `jahr` wäre dann passender. Bei der Abfrage fehlt noch der Fall, dass Jahre die durch 100 teilbar sind, kein Schaltjahr sind. abs berechnet den Absolutbetrag, kurz:

Code: Alles auswählen

def ungefaehr_gleich(a, b):
    return abs(a-b) < 0.001
sharete
User
Beiträge: 20
Registriert: Donnerstag 1. Juni 2017, 11:31

Hey Leute, ich bins mal wieder. Und zwar:

Mal angenommen, ich habe zwei Listen. In der ersten Liste stehen zufällig Zahlen, also z.B. 12,13,15,16,17. Und die zweite Liste ist gefüllt mit 0 und 1en also z.B. 0,1,1,0,0. Wie kann ich dann auf die beiden Listen so zugreifen, dass in der ersten Liste die Zahlen zusammen addiert werden, wo in der zweiten Liste der Index 1 ist? Also z.B.:

Code: Alles auswählen

X = [3,6,4,2,8,5,5,1]
Y = [1,0,0,1,1,1,0,0]
Ich muss dann doch erstmal den index von Y ermitteln, wo die einsen sich befinden und dann den Index von Y auf X übernehmen und diese Zahlen von X addieren. Jedoch habe ich ne Kopfblockade, wie ich dahin komme.

LG
Sirius3
User
Beiträge: 17830
Registriert: Sonntag 21. Oktober 2012, 17:20

@sharete: um über mehrere Listen gleichzeitig zu iterieren, gibt es `zip`.

Hier ein Beispiel mit sinnvolleren Variablennamen

Code: Alles auswählen

values = [3,6,4,2,8,5,5,1]
mask = [1,0,0,1,1,1,0,0]
for value, active in zip(values, mask):
    do_someting()
Statt 0 und 1 sollten in der zweiten Liste False und True stehen.
sharete
User
Beiträge: 20
Registriert: Donnerstag 1. Juni 2017, 11:31

Ah, okay dass mit zip wurde uns gar nicht beigebracht.

Bezüglich der 0,1, wo du meintest dass dort True und False stehen soll, die Liste wurde uns in einem Programmskelett vorgegeben und wir mussten damit arbeiten, trotzdem danke!

Wir hatten eine weitere Aufgabe, wo wir checken sollen, ob die Klammerung richtig stattgefunden hat, dies habe ich so gemacht:

Code: Alles auswählen

def Klammercheck(S):
    asList = list(S)
    count = 0
    for i in asList:
        if i == "(":
            count +=1
        else:
            count -=1
    if count == 0:
        return True
    else:
        return False
 
K1 = "(()(())())()"; K2 = "())()()"; K3 = "((()))()(";
print K1,"ist",Klammercheck(K1)
print K2,"ist",Klammercheck(K2)
print K3,"ist",Klammercheck(K3)
Gibt es sonst noch eine kürzere Variante, oder "bessere"? Zu beachten ist, dass wir wieder ein Programmskelett vorgegeben bekommen haben, wo die XXXXXXXX mit unserem Code ausgetauscht werden soll:

Code: Alles auswählen

def Klammercheck(S):
   XXXXXXXXXX

K1 = "(()(())())()"; K2 = "())()()"; K3 = "((()))()(";
print K1,"ist",Klammercheck(K1)
print K2,"ist",Klammercheck(K2)
print K3,"ist",Klammercheck(K3)
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

Im Grunde zählst Du die Anzahl der öffnenden und die Anzahl der schließenden Klammern. String-Objekte besitzen die Methode count für solche Fälle. Wenn die Differenz gleich 0 ist, so ist die Klammerung nach Deiner Definition richtig. Demnach wäre der Funktionskörper ein Einzeiler.
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
sharete
User
Beiträge: 20
Registriert: Donnerstag 1. Juni 2017, 11:31

bwbg hat geschrieben:Im Grunde zählst Du die Anzahl der öffnenden und die Anzahl der schließenden Klammern. String-Objekte besitzen die Methode count für solche Fälle. Wenn die Differenz gleich 0 ist, so ist die Klammerung nach Deiner Definition richtig. Demnach wäre der Funktionskörper ein Einzeiler.
Was dort passiert und am Ende bei rauskommt, habe ich ja selbst erarbeitet. Meine Frage war nur, ob der Code so okay ist bzw. ob es "besser" bzw. kürzer geht, mit dem vorgegeben Programmskelett.
Liffi
User
Beiträge: 153
Registriert: Montag 1. Januar 2007, 17:23

Ich würde behaupten, die Klammeranzahl darf zwischendurch nie negativ sein.

Code: Alles auswählen

))((
Das sollte vermutlich auch ungültig sein, oder?
Sirius3
User
Beiträge: 17830
Registriert: Sonntag 21. Oktober 2012, 17:20

@sharete: Funktionsnamen sollten Tätigkeiten beschreiben, am besten in englisch, weil die anderen Schlüsselwörter auch englisch sind, so hat man keinen Sprachmix. Variablennamen sollten komplett klein geschrieben werden und sprechend sein, i und S sind das nicht. Man sollte nur eine Anweisung pro Zeile schreiben, ";" sollte man nie benutzen, statt Variablen durchzunummerieren sollte man Listen verwenden. Deinen Code nach den üblichen Konventionen sieht also so aus:

Code: Alles auswählen

def check_brackets(text):
    count = 0
    for char in text:
        if char == "(":
            count += 1
        else:
            count -= 1
    return count == 0

tests = [
    "(()(())())()",
    "())()()",
    "((()))()(",
]

for test in tests:
    print test, "ist", check_brackets(test)
Dann ist alles auch gleich viel lesbarer.

Kurz kann man das dann so schreiben:

Code: Alles auswählen

def check_brackets(text):
    return text.count("(")*2 == len(text)
Ob das korrekt ist, hat Liffi ja schon angezweifelt.
BlackJack

Ich würde das ein bisschen defensiver Programmieren und nicht einfach bei jedem beliebigen Zeichen das kleine öffnende Klammer ist, den Zähler verringern. Selbst wenn die Dokumentation von dem Argument einfordert das nur die Zeichen '(' und ')' darin vorkommen dürfen, würde ich mindestens ein ``assert`` für den Fall vorsehen das doch etwas anderes vorkommt.
BlackJack

Das mit dem Aufsummieren wenn in der zweiten Liste eine 1 steht, ist ein klarer Fall für `itertools.compress()`:

Code: Alles auswählen

In [11]: X = [3,6,4,2,8,5,5,1]

In [12]: Y = [1,0,0,1,1,1,0,0]

In [13]: sum(itertools.compress(X, Y))
Out[13]: 18
sharete
User
Beiträge: 20
Registriert: Donnerstag 1. Juni 2017, 11:31

BlackJack hat geschrieben:Das mit dem Aufsummieren wenn in der zweiten Liste eine 1 steht, ist ein klarer Fall für `itertools.compress()`:

Code: Alles auswählen

In [11]: X = [3,6,4,2,8,5,5,1]

In [12]: Y = [1,0,0,1,1,1,0,0]

In [13]: sum(itertools.compress(X, Y))
Out[13]: 18

Wenn ich den Code so eingebe kriege ich den error:

Code: Alles auswählen

Line 4: NameError: name 'itertools' is not defined
edit: liegt höchstwahrscheinlich daran, dass codeskulptor den begriff nicht kennt. das traurige ist, dass wir damit in der klausur programmieren werden...
BlackJack

@sharete: Man muss das Modul vorher natürlich importieren. :-)
Antworten