Funktionen

Ekkart Kleinod  • 
  • Beschreibung direkt unter Definition, in """
  • bei Funktionsaufrufen werden Referenzen übergeben, bei Veränderungen also vorher Kopien anlegen, nicht Parameter verändern
  • definiert mit def
  • man kann Typen an die Parameter und Rückgabe schreiben, das ist aber unüblich und wenig hilfreich

Parameter (Argumente)

  • positional, named (keyword)
  • erstes positional darf auch mit keyword übergeben werden, sonst nur named
def tag(name, *content, class_=None, **attrs):
    """Generate one or more HTML tags"""
    if class_ is not None:
        attrs['class'] = class_
    attr_pairs = (f' {attr}="{value}"' for attr, value in sorted(attrs.items()))
    attr_str = ''.join(attr_pairs)
    if content:
        elements = (f'<{name}{attr_str}>{c}</{name}>' for c in content)
        return '\n'.join(elements)
    else:
        return f'<{name}{attr_str} />'

Aufrufe

print(tag('br'))
print(tag('p', 'hello'))
print(tag('p', 'hello', 'world'))
print(tag('p', 'hello', id=33))
print(tag('p', 'hello', 'world', class_='sidebar'))
print(tag(content='testing', name="img"))
my_tag = {'name': 'img', 'title': 'Sunset Boulevard', 'src': 'sunset.jpg', 'class': 'framed'}
print(tag(**my_tag))
<br />
<p>hello</p>
<p>hello</p>
<p>world</p>
<p id="33">hello</p>
<p class="sidebar">hello</p>
<p class="sidebar">world</p>
<img content="testing" />
<img class="framed" src="sunset.jpg" title="Sunset Boulevard" />

Funktionsaufrufe mit vordefinierten Argumenten

Funktion immer mit dem gleichen Argument aufrufen: functools.partial

import unicodedata, functools

print(unicodedata.normalize('NFC', 'Café'))
print(unicodedata.normalize('NFC', 'Fraîche'))

nfc = functools.partial(unicodedata.normalize, 'NFC')

print(nfc('Café'))
print(nfc('Fraîche'))

Funktionale Programmierung

  • eigentlich nicht dafür gedacht
  • was hilft: das operator-Modul
  • lambdas in reduce von functools ersetzen

    • lamba

        from functools import reduce
        def factorial(n):
            return reduce(lambda a, b: a*b, range(1, n+1))
      
    • operator

        from functools import reduce
        from operator import mul
        def factorial(n):
            return reduce(mul, range(1, n+1))
      
  • hilfreich sind auch itemgetter, methodcaller etc. von operator