Funktionsparameter
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; # 調(diào)用 print_user_info 函數(shù) 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 作為默認(rèn)值 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; # 調(diào)用 print_user_info 函數(shù) 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; # 調(diào)用 print_user_info 函數(shù) 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; # 調(diào)用 print_user_info 函數(shù) 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; # 調(diào)用 print_user_info 函數(shù) print_user_info( name = '兩點水' ,age = 18 , sex = '女' ) # 這種寫法會報錯,因為 age ,sex 這兩個參數(shù)強制使用關(guān)鍵字參數(shù) #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.