1. Standardwertparameter
Wenn in unseren benutzerdefinierten Funktionen beim Aufruf keine Parameter festgelegt sind, müssen wir dies tun Verwenden Sie den Standardwertparameter.
# -*- coding: UTF-8 -*- def print_user_info( name , age , sex = '男' ): # 打印用户信息 print('昵称:{}'.format(name) , end = ' ') print('年龄:{}'.format(age) , end = ' ') print('性别:{}'.format(sex)) return; # 调用 print_user_info 函数 print_user_info( '两点水' , 18 , '女') print_user_info( '三点水' , 25 )
Ausgabeergebnis:
昵称:两点水 年龄:18 性别:女 昵称:三点水 年龄:25 性别:男
Wie Sie sehen können, wird beim Festlegen des Standardparameters beim Aufrufen der Funktion der Standardwert verwendet, wenn Sie den Parameter nicht übergeben. Hierbei ist jedoch zu beachten, dass nur die Parameter am Ende der formalen Parameterliste Standardparameterwerte haben können. Das heißt, Sie können beim Deklarieren von Funktionsparametern nicht zuerst formale Parameter mit Standardwerten deklarieren und dann Parameter deklarieren ohne Standardwerte. Dies liegt daran, dass die den formalen Parametern zugewiesenen Werte positionell zugewiesen werden. Beispielsweise ist def func(a, b=1) gültig, aber def func(a=1, b) ist ungültig.
Ist dies das Ende der Standardwertparameter? Noch nicht, denken Sie sorgfältig darüber nach: Wenn der Parameter ein veränderbarer Container wie lsit (Liste) oder dict (Wörterbuch) ist, welchen sollten wir dann als Standardwert verwenden? Wir können None als Standardwert verwenden. Genau wie das folgende Beispiel:
# 如果 b 是一个 list ,可以使用 None 作为默认值 def print_info( a , b = None ): if b is None : b=[] return;
Schauen Sie sich das Beispiel genau an. Haben Sie solche Fragen? Können wir b=[] nicht einfach direkt in den Parametern verwenden? Das heißt, es würde so geschrieben werden:
def print_info( a , b = [] ): return;
, oder? Nach dem Ausführen wurden keine Fehler gefunden. Kann ich es so schreiben? Eine Sache, die hier besondere Aufmerksamkeit erfordert: Der Wert des Standardparameters ist ein unveränderliches Objekt, z. B. None, True, False, Number oder String. Wenn Sie wie oben vorgehen, treten Probleme auf, wenn der Standardwert an anderer Stelle geändert wird alle möglichen Probleme. Diese Änderungen wirken sich auf den Standardwert aus, wenn diese Funktion das nächste Mal aufgerufen wird.
Beispiele sind wie folgt:
# -*- coding: UTF-8 -*- def print_info( a , b = [] ): print(b) return b ; result = print_info(1) result.append('error') print_info(2)
Ausgabeergebnis:
[] ['error']
Beobachten Sie sorgfältig, Sie werden feststellen, dass der zweite Ausgabewert überhaupt nicht das ist, was Sie wollen, also nicht Ich kann das nicht tun.
Noch etwas: Manchmal möchte ich einfach nicht den Standardwert. Ich möchte nur beurteilen, ob der Standardparameter einen übergebenen Wert hat. Was soll ich tun? Wir können Folgendes tun:
_no_value =object() def print_info( a , b = _no_value ): if b is _no_value : print('b 没有赋值') return;
Das Objekt hier ist die Basisklasse für alle Klassen in Python. Sie können Instanzen der Objektklasse erstellen, aber diese Instanzen haben keinen praktischen Nutzen, da sie weder über nützliche Methoden noch über Instanzdaten verfügt (da sie über kein Instanzwörterbuch verfügt, können Sie nicht einmal eine Eigenschaft festlegen). Werte). Das Einzige, was Sie tun können, ist einen Identitätstest. Mit dieser Funktion kann auch festgestellt werden, ob eine Werteingabe vorliegt.
2. Schlüsselwortparameter
In Python können Sie Parameter über Parameternamen an eine Funktion übergeben, ohne sich um die Reihenfolge zu kümmern, in der die Parameterliste definiert ist namens Es ist ein Schlüsselwortparameter. Die Verwendung von Schlüsselparametern bietet zwei Vorteile:
Erstens wird die Verwendung von Funktionen einfacher, da wir uns nicht um die Reihenfolge der Parameter kümmern müssen.
2. Unter der Annahme, dass andere Parameter Standardwerte haben, können wir nur den gewünschten Parametern Werte zuweisen
# -*- coding: UTF-8 -*- def print_user_info( name , age , sex = '男' ): # 打印用户信息 print('昵称:{}'.format(name) , end = ' ') print('年龄:{}'.format(age) , end = ' ') print('性别:{}'.format(sex)) return; # 调用 print_user_info 函数 print_user_info( name = '两点水' ,age = 18 , sex = '女') print_user_info( name = '两点水' ,sex = '女', age = 18 )
Ausgabewert:
昵称:两点水 年龄:18 性别:女 昵称:两点水 年龄:18 性别:女
3. Unbestimmte Längenparameter
Manchmal benötigen wir beim Entwerfen einer Funktionsschnittstelle möglicherweise Parameter variabler Länge. Mit anderen Worten: Wir können die Anzahl der übergebenen Parameter nicht im Voraus bestimmen. Python bietet eine Tupelmethode zum Akzeptieren von Parametern, die nicht direkt definiert sind. Diese Methode fügt vor dem Parameter ein Sternchen * hinzu. Werden beim Aufruf der Funktion keine Parameter angegeben, handelt es sich um ein leeres Tupel. Wir können der Funktion auch keine unbenannten Variablen übergeben.
Zum Beispiel:
# -*- coding: UTF-8 -*- def print_user_info( name , age , sex = '男' , * hobby): # 打印用户信息 print('昵称:{}'.format(name) , end = ' ') print('年龄:{}'.format(age) , end = ' ') print('性别:{}'.format(sex) ,end = ' ' ) print('爱好:{}'.format(hobby)) return; # 调用 print_user_info 函数 print_user_info( '两点水' ,18 , '女', '打篮球','打羽毛球','跑步')
Ausgabeergebnis:
昵称:两点水 年龄:18 性别:女 爱好:('打篮球', '打羽毛球', '跑步')
Aus dem Ausgabeergebnis können wir erkennen, dass *hobby ein variabler Parameter ist und hobby eigentlich ein Tupel (original Vorfahr)
Parameter mit variabler Länge unterstützen auch Schlüsselparameter, die in einem Wörterbuch abgelegt werden. Bei dieser Methode wird ** vor dem Parameter hinzugefügt und das obige Beispiel wie folgt geändert:
# -*- coding: UTF-8 -*- def print_user_info( name , age , sex = '男' , ** hobby ): # 打印用户信息 print('昵称:{}'.format(name) , end = ' ') print('年龄:{}'.format(age) , end = ' ') print('性别:{}'.format(sex) ,end = ' ' ) print('爱好:{}'.format(hobby)) return; # 调用 print_user_info 函数 print_user_info( name = '两点水' , age = 18 , sex = '女', hobby = ('打篮球','打羽毛球','跑步'))
Ausgabeergebnis:
昵称:两点水 年龄:18 性别:女 爱好:{'hobby': ('打篮球', '打羽毛球', '跑步')}
Durch den Vergleich des obigen Beispiels mit diesem Beispiel können wir es wissen dass *hobby ein variabler Parameter ist und hobby tatsächlich ein Tupel (ursprünglicher Vorfahre) ist, **hobby ein Schlüsselwortparameter ist und hobby ein Diktat ist (Wörterbuch)
4. Akzeptieren Sie nur Schlüsselwortparameter
Schlüsselwortparameter sind einfach zu verwenden und nicht anfällig für Parameterfehler. Manchmal erwartet die von uns definierte Funktion Einige Parameter müssen mithilfe von Schlüsselwortparametern übergeben werden. Was soll ich zu diesem Zeitpunkt tun?
Dieser Effekt kann erreicht werden, indem der obligatorische Schlüsselwortparameter nach einem bestimmten *-Parameter oder einem einzelnen * platziert wird, zum Beispiel:
# -*- coding: UTF-8 -*- def print_user_info( name , *, age , sex = '男' ): # 打印用户信息 print('昵称:{}'.format(name) , end = ' ') print('年龄:{}'.format(age) , end = ' ') print('性别:{}'.format(sex)) return; # 调用 print_user_info 函数 print_user_info( name = '两点水' ,age = 18 , sex = '女' ) # 这种写法会报错,因为 age ,sex 这两个参数强制使用关键字参数 #print_user_info( '两点水' , 18 , '女' ) print_user_info('两点水',age='22',sex='男')
Wie Sie am Beispiel sehen können, wenn Alter und Geschlecht Schlüsselwörter sind sind nicht anwendbar. Parameter melden Fehler.
In vielen Fällen macht die Verwendung obligatorischer Schlüsselwortparameter die Bedeutung klarer als die Verwendung von Positionsparametern und das Programm wird besser lesbar. Die Verwendung obligatorischer Schlüsselwortparameter ist auch besser als die Verwendung von **kw-Parametern und obligatorische Schlüsselwortparameter sind auch in einigen komplexeren Situationen nützlich.
nächsten Abschnitt