Inhaltsverzeichnis
Funktion höherer Ordnung
Variablen können auf Funktionen verweisen, und die Funktion selbst kann auch Variablen zugewiesen werden, dh Variablen können auf Funktionen verweisen
>>> f = abs
>>> f(-10)
10
Der Funktionsname ist auch eine Variable , der Funktionsname ist tatsächlich die Variable, die auf die Funktion verweist
Eine Funktion kann eine andere Funktion als Parameter empfangen. Diese Funktion wird als Funktion höherer Ordnung bezeichnet
#一个最简单的高阶函数:
def add(x, y, f):
return f(x) + f(y)
Der Ableitungsprozess beim Aufrufen der obigen Funktion ist wie folgt
x = -5
y = 6
f = abs
f(x) + f(y) ==> abs(-5) + abs(6) ==> 11
return 11
Karte verkleinern
map()
Die Funktion empfängt zwei Parameter, einer ist eine Funktion, und der andere besteht Iterable
darin map
, die übergebene Funktion nacheinander auf jedes Element der Sequenz anzuwenden und das Ergebnis als neues zurückzugeben Iterator
.
>>> def f(x):
... return x * x
...
>>> r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> list(r)
[1, 4, 9, 16, 25, 36, 49, 64, 81]
map()
Der erste übergebene Parameter f
ist das Funktionsobjekt selbst. Da das Ergebnis r
eins ist Iterator
, handelt es sich Iterator
um eine verzögerte Sequenz. list()
Lassen Sie es also die gesamte Sequenz über eine Funktion berechnen und eine Liste zurückgeben
redu (Funktion, Sequenz, Initialisierer = Keine) wendet eine Funktion auf eine Sequenz an[x1, x2, x3, ...]
, diese Funktion muss zwei Parameter empfangen undreduce
das Ergebnis wird weiterhin mit dem nächsten Element der Sequenz akkumuliert.
- Wenn der optionale Parameterinitialisierer bereitgestellt wird, entspricht dies dem Einfügen als Element der Sequenz in den ersten Teil der Sequenz
Der Effekt ist:
Zum Beispiel, um eine Sequenz zu summieren:
>>> from functools import reduce
>>> def add(x, y):
... return x + y
>>> reduce(add, [1, 3, 5, 7, 9])
25
Wenn wir bedenken, dass ein String str
auch eine Sequenz ist, mit einer geringfügigen Änderung des obigen Beispiels map()
, können wir eine Funktion schreiben , in die str
konvertiert werden sollint
:
>>> from functools import reduce
>>> def fn(x, y):
... return x * 10 + y
>>> def char2num(s):
... digits = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
... return digits[s]
>>> reduce(fn, map(char2num, '13579'))
13579
str2int
Die in eins gegliederte Funktion ist:
from functools import reduce
DIGITS = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
def str2int(s):
def fn(x, y):
return x * 10 + y
def char2num(s):
return DIGITS[s]
return reduce(fn, map(char2num, s))
Sie können auch Lambda-Funktionen verwenden, um Folgendes weiter zu vereinfachen:
from functools import reduce
DIGITS = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
def char2num(s):
return DIGITS[s]
def str2int(s):
return reduce(lambda x, y: x * 10 + y, map(char2num, s))
filter(
Funktion, iterierbar)
Wird verwendet, um die Sequenz zu filtern
filter()
Es erhält auch eine Funktion und eine Sequenz. Der map()
Unterschied besteht darin, dass filter()
die übergebene Funktion nacheinander auf jedes Element einwirkt und dann entscheidet, True
ob False
das Element gemäß dem Rückgabewert beibehalten oder verworfen wird . Um die leere Zeichenfolge in einer Sequenz zu löschen, können Sie Folgendes schreiben:
def not_empty(s):
return s and s.strip()
list(filter(not_empty, ['A', '', 'B', None, 'C', ' ']))
# 结果: ['A', 'B', 'C']
Verwenden Sie den Filter, um Primzahlen zu finden
Eine Methode zur Berechnung von Primzahlen ist die Ehrlich-Sieve-Methode , deren Algorithmus sehr einfach zu verstehen ist:
Listen Sie zunächst 2
alle natürlichen Zahlen von Anfang an auf, um eine Sequenz zu erstellen: 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...
Nehmen Sie die erste Nummer der Sequenz 2
, es muss eine Primzahl sein, und filtern Sie dann die Vielfachen 2
der Sequenz heraus 2
: 3, 4 , 5, 6, 7, 8 , 9, 10 , 11, 12 , 13, 14, 15 , 16, 17, 18 , 19, 20 , nehmen Sie die erste Nummer der neuen Sequenz 3
, es muss eine Primzahl sein, und filtern Sie dann die Vielfachen 3
der Sequenz heraus 3
: 5, 6 , 7, 8, 9 , 10, 11 , 12 , 13, 14, 15 , 16, 17, 18 , 19, 20, ... nehmen Sie die erste Nummer der neuen Sequenz 5
und filtern Sie dann die Vielfachen 5
der Sequenz heraus 5
: 7, 8, 9, 10 , 11 , 12, 13, 14, 15, 16, 17, 18, 19, 20 , ... Durchsuchen Sie weiter, und Sie können alle Primzahlen erhalten.
def _odd_iter(): #构造一个从3开始的奇数序列
n = 1
while True:
n = n + 2
yield n
def _not_divisible(n): #定义一个筛选函数
return lambda x: x % n > 0
def primes(): #定义一个生成器,不断返回下一个素数
yield 2
it = _odd_iter() # 初始序列
while True:
n = next(it) # 返回序列的第一个数
yield n
it = filter(_not_divisible(n), it) # 构造新序列
# 打印1000以内的素数:
for n in primes():
if n < 1000:
print(n)
else:
break
Sortiert
sorted()
Die Funktion ist auch eine Funktion höherer Ordnung. Sie kann auch eine key
Funktion empfangen , um eine benutzerdefinierte Sortierung zu erreichen, z. B. das Sortieren nach dem absoluten Wert:
>>> sorted([36, 5, -12, 9, -21], key=abs)
[5, 9, -12, -21, 36]
So sortieren Sie Zeichenfolgen entsprechend der Größe des ASCII-Vergleichs
Angenommen, wir verwenden eine Reihe von Tupeln, um die Namen und Noten der Schüler darzustellen:
L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
Verwenden Sie sorted()
diese Option, um die obige Liste nach Namen zu sortieren:
L = [('Bob',75), ('Admin', 92), ('Bart', 66), ('List', 88)]
def by_name(t):
return t[0].lower()
L2 = sorted(L, key=by_name)
print(L2)
Sortieren einer Liste von Tupeln
Angenommen, wir verwenden eine Reihe von Tupeln, um Namen und Alter darzustellen, und verwenden dann die Funktion sortiert (), um die Namen in aufsteigender Reihenfolge und das Alter in absteigender Reihenfolge zu sortieren:
def sort_by_name(t):
return t[0]
def sort_by_age(t):
return t[1]
L = [('Tom', 18), ('Jerry', 15), ('Peter', 16), ('John', 20)]
list1 = sorted(L, key=sort_by_name)
list2 = sorted(L, key=sort_by_age, reverse=True)
print('sort by name asc: ', list1)
print('sort by age desc: ', list2)
Ausgabeergebnis:
sort by name asc: [('Jerry', 15), ('John', 20), ('Peter', 16), ('Tom', 18)]
sort by age desc: [('John', 20), ('Tom', 18), ('Peter', 16), ('Jerry', 15)]
Beispiel 4: Sortieren des Inhalts eines Wörterbuchs
Es gibt viele Möglichkeiten, ein Wörterbuch zu sortieren, aber die Kernidee ist dieselbe: Trennen Sie den Schlüssel oder Wert oder das Element im Diktat in eine Liste und sortieren Sie dann die Liste, wodurch das Diktat indirekt sortiert wird.
D = {'Tom': 18, 'Jerry': 15, 'Peter': 16, 'John': 20}
list1 = sorted(D.items(), key=lambda d: d[0])
list2 = sorted(D.items(), key=lambda d: d[1], reverse=True)
print('sort by key asc:', list1)
print('sort by value desc:', list2)
Ausgabeergebnis:
sort by key asc: [('Jerry', 15), ('John', 20), ('Peter', 16), ('Tom', 18)]
sort by value desc: [('John', 20), ('Tom', 18), ('Peter', 16), ('Jerry', 15)]