Seite 2 von 3

Re: Vorbereitung auf meine Pythonklausur

Verfasst: Sonntag 4. Juni 2017, 16:10
von BlackJack
@sharete: An dem `float()` sollst Du nichts ändern, nur das `input()` durch `raw_input()` ersetzen, denn das ist hier die richtige Funktion.

Re: Vorbereitung auf meine Pythonklausur

Verfasst: Sonntag 4. Juni 2017, 17:30
von sharete
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

Re: Vorbereitung auf meine Pythonklausur

Verfasst: Sonntag 4. Juni 2017, 17:46
von BlackJack
@sharete: Bei einem echten Python 2.x ist `input()` unsicher weil da beliebige Python-Ausdrücke die der Benutzer eingeben kann, ausgewertet werden.

Re: Vorbereitung auf meine Pythonklausur

Verfasst: Dienstag 6. Juni 2017, 14:23
von sharete
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

Re: Vorbereitung auf meine Pythonklausur

Verfasst: Dienstag 6. Juni 2017, 14:29
von Liffi
Fehlender else Zweig? ;-)

Re: Vorbereitung auf meine Pythonklausur

Verfasst: Dienstag 6. Juni 2017, 14:33
von sharete
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

Re: Vorbereitung auf meine Pythonklausur

Verfasst: Dienstag 6. Juni 2017, 14:46
von Sirius3
@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.

Re: Vorbereitung auf meine Pythonklausur

Verfasst: Dienstag 6. Juni 2017, 22:18
von sharete
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)

Re: Vorbereitung auf meine Pythonklausur

Verfasst: Mittwoch 7. Juni 2017, 08:04
von Sirius3
@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

Re: Vorbereitung auf meine Pythonklausur

Verfasst: Freitag 9. Juni 2017, 14:41
von sharete
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

Re: Vorbereitung auf meine Pythonklausur

Verfasst: Freitag 9. Juni 2017, 14:51
von Sirius3
@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.

Re: Vorbereitung auf meine Pythonklausur

Verfasst: Freitag 9. Juni 2017, 16:31
von sharete
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)

Re: Vorbereitung auf meine Pythonklausur

Verfasst: Freitag 9. Juni 2017, 16:44
von bwbg
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.

Re: Vorbereitung auf meine Pythonklausur

Verfasst: Freitag 9. Juni 2017, 16:51
von sharete
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.

Re: Vorbereitung auf meine Pythonklausur

Verfasst: Freitag 9. Juni 2017, 16:52
von Liffi
Ich würde behaupten, die Klammeranzahl darf zwischendurch nie negativ sein.

Code: Alles auswählen

))((
Das sollte vermutlich auch ungültig sein, oder?

Re: Vorbereitung auf meine Pythonklausur

Verfasst: Freitag 9. Juni 2017, 17:03
von Sirius3
@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.

Re: Vorbereitung auf meine Pythonklausur

Verfasst: Freitag 9. Juni 2017, 19:07
von 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.

Re: Vorbereitung auf meine Pythonklausur

Verfasst: Freitag 9. Juni 2017, 19:10
von 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

Re: Vorbereitung auf meine Pythonklausur

Verfasst: Freitag 9. Juni 2017, 20:30
von sharete
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...

Re: Vorbereitung auf meine Pythonklausur

Verfasst: Freitag 9. Juni 2017, 21:49
von BlackJack
@sharete: Man muss das Modul vorher natürlich importieren. :-)