Code erklären

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
Sarius
User
Beiträge: 20
Registriert: Dienstag 5. Juni 2018, 18:32

Hallo,
ich habe auf Codewars.com eine Challenge gesehen, in der ein String mit Groß- und Kleinbuchstaben zu einem String mit nur Kleinbuchstaben und Bindestrichen zur Trennung umgewandelt werden soll.
Die Beste Lösung war diese hier:

Code: Alles auswählen

def kebabize(s):
    return ''.join(c if c.islower() else '-' + c.lower() for c in s if c.isalpha()).strip('-')
Ich verstehe diese Lösung aber leider nicht, um genauer zu sein besonders wie Schleifen in einen Return Statement sein können.


Vielen Dank im Voraus!



Link zur Challenge(https://www.codewars.com/kata/57f8ff867 ... c4a/python)
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das ist eine list- comprehension, bzw genauer eine generator-expression. Damit kannst du sowas machen:

Code: Alles auswählen

a = []
for ding in aufzaehlbarem:
     a.append(ausdruck _mit_ding)

# wird zu
a = [ausdruck_mit_ding for ding in aufzaehlbarem]
Eine Generator-Expression ist dabei eine leichte Abwandlung aber das spielt keine grosse Rolle. Und ein Ausdruck kann eben auch ein ternaeres if enthalten

Code: Alles auswählen

a if bedingung else b
Und so wird ein Schuh draus.
nezzcarth
User
Beiträge: 1764
Registriert: Samstag 16. April 2011, 12:47

Sarius hat geschrieben: Montag 3. Februar 2020, 18:16 Ich verstehe diese Lösung aber leider nicht, um genauer zu sein besonders wie Schleifen in einen Return Statement sein können.
Eine Umschreibung der Funktion in eine äquivalente, etwas ausführlichere Form, könnte zum Beispiel so aussehen. Vielleicht wird dann klarer, was da passiert

Code: Alles auswählen

In [1]: def kebabize2(s): 
   ...:     result = [] 
   ...:     for c in s: 
   ...:         if c.isalpha(): 
   ...:             if c.islower(): 
   ...:                 result.append(c) 
   ...:             else: 
   ...:                 result.extend(('-', c.lower())) 
   ...:     return ''.join(result).strip('-') 
   ...:                                                                       

In [2]: def kebabize(s): 
   ...:     return ''.join(c if c.islower() else '-' + c.lower() for c in s if
   ...:  c.isalpha()).strip('-') 
   ...:                                                                                                        

In [3]: from hypothesis import given                                          

In [4]: from hypothesis.strategies import text                                

In [5]: @given(text()) 
   ...: def test_kebabize(s): 
   ...:     assert kebabize(s) == kebabize2(s) 
   ...:                                                                       

In [7]: test_kebabize()                                                       

Dass die Lösung als die Beste dort gilt, sagt vielleicht mehr über CodeWars als den Code aus ... ;)
Antworten