Seite 1 von 1

Code erklären

Verfasst: Montag 3. Februar 2020, 18:16
von Sarius
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)

Re: Code erklären

Verfasst: Montag 3. Februar 2020, 18:18
von __deets__
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.

Re: Code erklären

Verfasst: Montag 3. Februar 2020, 21:45
von nezzcarth
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 ... ;)