Anfängerfrage | Ende eines For-Schleifen-Blocks

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.
Antworten
dit
User
Beiträge: 1
Registriert: Mittwoch 2. Mai 2012, 17:32

Hallo zusammen!

Ich beschäftige mich seit Kurzem mit Python und habe ne Frage bezüglich Blöcke in Python.

Also ich programmiere hauptsächlich in C/C++ und Java und komme wohl deswegen nicht ganz klar mit dieser {}-losen Sprache

also hier ist ein einfaches Beispiel:

Code: Alles auswählen

def isLowCaseOnly(s=""):
    l = len(s)
    print ("length=%d" % l)
    for i in range(0, l):
        print ('i=%d' % i)
        if s[i] not in string.ascii_lowercase:
            return False
        
    return True
also hier sind meine zwei Fragen:
wie definiert man das Ende einer Methode?
wie definiert man das Ende einer FOR-Schleife (eine Leere Zeile?)?


Danke schon mal!
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Der Beginn eines Blockes wird durch Einrückung angezeigt. In Python hat die Einrückung eine wichtige Bedeutung und ist Teil der Syntax. Das Ende eines Blockes wird dementsprechend dadurch angezeigt, dass Code nicht mehr eingerückt ist. Leerzeilen innerhalb einer Funktions- oder Klassendefinition werden ignoriert und haben keine Bedeutung.
lunar

@dit: Beide Fragen beantwortet das Tutorial. Bitte lies das, denn dieses Forum ist kein Python-Grundkurs :)

Zu Deiner Frage: Blöcke – egal ob for-Schleife oder Methode – werden durch Ausrückung abgeschlossen.

Zu Deinem Quelltext:
  • Methoden werden in Python nach PEP 8 vollständig klein geschrieben, also "is_lower_case" statt "isLowCaseOnly".
  • Abkürzungen wie "l" oder "Low" sind ebenfalls verpönt, Bezeichner auszuschreiben, bringt Dich nicht um, hilft aber Dir selbst und anderen beim Verständnis des Quelltexts.
  • Der Standardwert für den Parameter "s" ist vollkommen überflüssig. Was hast Du dir dabei gedacht? Kann es sein, dass Du da versucht hast, den Typ des Parameters anzugeben?
  • Statt Schleifen über Indizes wird in Python direkt über das Objekt iteriert, sprich "for character in string:" statt "for i in range(len(string))".
  • Zudem hat Python viele implizite Hilfsmethode zur Iteration wie beispielsweise "all()".
  • Im Allgemeinen ist diese Funktion überflüssig, da Zeichenketten eine "islower()"-Methode haben. Ich gehe mal davon aus, dass Du diese Funktion nur zu Übungszwecken geschrieben hast.
  • Vernünftigerweise würde man eine derartige Funktion auch auf echten Unicode-Zeichenketten mithilfe des "unicodedata"-Moduls implementieren, anstatt sich auf ASCII zu beschränken.
Mithin lässt sich Dein Quelltext auf eine Zeile kürzen:

Code: Alles auswählen

def is_lower_case(s):
    return all(c in string.ascii_lowercase for c in s)
Oder bezüglich des letzten Punkts:

Code: Alles auswählen

def is_lower_case(s)
    return all(unicodedata.category(c) == 'Ll' for c in s)
Benutzeravatar
pillmuncher
User
Beiträge: 1482
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Willkommen im Forum!
wie definiert man das Ende einer Methode?
Alles wird durch die Einrückung definiert. Ein Code-Block endet dort, wo der Nächste Code-Block mit höchstens derselben Einrückungstiefe beginnt. Beispiel:

Code: Alles auswählen

def eine_funktion(n):
    mach_was_mit(n)

class EineKlasse(object):

    def eine_methode(self, x):
        mach_was_mit(x)

    eine_klassen_variable = 'hallo'

eine_modul_variable = 'servus'
Hier endet eine_funktion dort, wo EineKlasse beginnt, und die wiederum endet dort, wo eine_modul_variable beginnt.
wie definiert man das Ende einer FOR-Schleife (eine Leere Zeile?)?
Ebenso wie bei den anderen Code-Blöcken. Wenn danach etweder die Datei endet oder danach etwas mit höchstens derselben Einrückungstiefe wie der Beginn der for-Schleife daherkommt, ist das das Ende des Blocks.

Übrigens ist deine Beispiel-Funktion recht unpythonisch. Besser wäre dies hier:

Code: Alles auswählen

def is_low_case_only(s):
    return all(a == b for a, b in zip(s, s.lower())
Dabei bleiben Satzzeichen, Zahlen und white space allerdings unberücksichtigt. Wenn es tatsächlich darum geht, dass s nur aus den Buchstaben a-z besteht, dann vielleicht so:

Code: Alles auswählen

def is_low_case_only(s):
    return all(c in string.ascii_lowercase for c in s)
In specifications, Murphy's Law supersedes Ohm's.
Benutzeravatar
pillmuncher
User
Beiträge: 1482
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Noch eine Anmerkung: das Wort "Code-Block" in meiner o.s. Antwort ist nur eine informelle Ausdrucksweise. Der Python-Sprach-Standard spricht hier von Statements bzw. Compound Statements.
In specifications, Murphy's Law supersedes Ohm's.
Antworten