Python-Funktion höherer Ordnung / map / redu / filter () / Sorted

Inhaltsverzeichnis

Funktion höherer Ordnung

Karte verkleinern

Filter()

Sortiert


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 Iterabledarin 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 fist das Funktionsobjekt selbst. Da das Ergebnis reins ist Iterator, handelt es sich Iteratorum 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 undreducedas 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 strauch eine Sequenz ist, mit einer geringfügigen Änderung des obigen Beispiels map(), können wir eine Funktion schreiben , in die strkonvertiert 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

str2intDie 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, Trueob Falsedas 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 2alle 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 2der 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 3der 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 5und filtern Sie dann die Vielfachen 5der 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 keyFunktion 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)]

 

Ich denke du magst

Origin blog.csdn.net/zangba9624/article/details/106186117
Empfohlen
Rangfolge