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
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 ...
