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