Heim > Backend-Entwicklung > Python-Tutorial > So legen Sie Funktionsparameter in Python fest und verwenden sie

So legen Sie Funktionsparameter in Python fest und verwenden sie

高洛峰
Freigeben: 2017-03-06 13:34:20
Original
2003 Leute haben es durchsucht

1. Parameter und gemeinsame Referenzen:

In [56]: def changer(a,b):
  ....:   a=2
  ....:   b[0]='spam'
  ....:   
In [57]: X=1
In [59]: L=[1,2]
In [60]: changer(X,L)
In [61]: X,L
Out[61]: (1, ['spam', 2])
Nach dem Login kopieren

Funktionsparametern werden beim Aufruf Werte zugewiesen Gemeinsam genutzte Objekte werden durch Variablen implementiert, und entfernte Änderungen an variablen Objektparametern in Funktionen können sich auf den Aufrufer auswirken.

Änderung variabler Parameter vermeiden:

In [67]: X=1
In [68]: a=X
In [69]: a=2
In [70]: print(X)
1
In [71]: L=[1,2]
In [72]: b=L
In [73]: b[0]='spam'
In [74]: print(L)
['spam', 2]
In [75]: changer(X,L[:]) 
#不想要函数内部在原处的修改影响传递给它的对象,可以创建一个对象的拷贝

In [77]: changer(a,b)
In [78]: def changer(a,b): 
....:   b=b[:] 
#如果不想改变传入对象,无论函数怎么调用,同样可以在函数内部进行拷贝。
....:   
In [79]: a=2
In [80]: b[0]='spam'
Nach dem Login kopieren

2. Spezifisches Parameteranpassungsmodell:

Funktionsabgleichssyntax:

So legen Sie Funktionsparameter in Python fest und verwenden sie

Beispiel:

Schlüsselwortparameter:

In [2]: def f(a,b,c):print (a,b,c)
In [3]: f(1,2,3) #位置参数调用
(1, 2, 3)
In [4]: f(c=3,b=2,a=1) #关键字参数调用
(1, 2, 3)
Nach dem Login kopieren

Standardparameter:

In [5]: def f(a,b=2,c=3):print (a,b,c)
In [6]: f(1)  #给a赋值,b,c使用默认赋值 
(1, 2, 3)
In [7]: f(a=1) 
(1, 2, 3)
In [8]: f(1,4) 
(1, 4, 3)
In [9]: f(1,4,5) #不适用默认值
(1, 4, 5)
In [10]: f(1,c=6) #a通过位置得到1,b使用默认值,c通过关键字得到6
(1, 2, 6)
Nach dem Login kopieren

3. Beliebige Parameter:

1. Sammlungsparameter:

#*和**出现在函数定义或函数调用中。

In [11]: def f(*args):print (args)
In [12]: f()  #将所有位置相关的参数收集到一个新的元祖中
()
In [13]: f(1)
(1,)
In [14]: f(1,2,3,4)
(1, 2, 3, 4)
In [15]: def f(**args):print (args)
In [16]: f() 
{}
In [17]: f(a=1,b=2) #**只对关键字参数有效
{'a': 1, 'b': 2}

In [19]: def f(a, *pargs,**kargs):print(a,pargs,kargs)
In [20]: f(1,2,3,4,5,6,x=1,y=2,z=3)
(1, (2, 3, 4, 5, 6), {'y': 2, 'x': 1, 'z': 3})
Nach dem Login kopieren

2. Entpackparameter:

Hinweis: Verwechseln Sie nicht die Syntax von Funktionsheadern oder Funktionsaufrufen */**: Im Header bedeutet es das Sammeln einer beliebigen Anzahl von Parametern, während es im Aufruf eine beliebige Anzahl von Parametern akzeptiert.

In [21]: def func(a,b,c,d):print(a,b,c,d)
In [22]: args=(1,2)
In [23]: args += (3,4)
In [24]: func(*args)
(1, 2, 3, 4)
In [25]: args={'a':1,'b':2,'c':3}
In [26]: args['d']=4
In [27]: func(**args)
(1, 2, 3, 4)
In [28]: func(*(1,2),**{'d':4,'c':4})
(1, 2, 4, 4)
In [30]: func(1,*(2,3),**{'d':4})
(1, 2, 3, 4)
In [31]: func(1,c=3,*(2,),**{'d':4})
(1, 2, 3, 4)
In [32]: func(1,*(2,3,),d=4)
(1, 2, 3, 4)
In [33]: func(1,*(2,),c=3,**{'d':4})
(1, 2, 3, 4)
Nach dem Login kopieren

3. Anwendungsfunktionsvielfalt:

In [34]: def tracer(func,*pargs,**kargs):
  ....: print ('calling:',func.__name__)
  ....: return func(*pargs,**kargs)
  ....: 
In [35]: def func(a,b,c,d):
  ....: return a+b+c+d
  ....: print (tracer(func,1,2,c=3,d=4))
  ....: 
('calling:', 'func')
10
Nach dem Login kopieren

4. Die integrierte Funktion „Apply“

In [36]: pargs=(1,2)
In [37]: kargs={'a':3,'b':4}
In [41]: def echo(*args,**kargs):print (args,kargs)
In [42]: apply(echo,pargs,kargs)
((1, 2), {'a': 3, 'b': 4})
Nach dem Login kopieren

wird in Python3 aufgegeben

In [43]: echo(*pargs,**kargs)
((1, 2), {'a': 3, 'b': 4})
In [44]: echo(0,c=5,*pargs,**kargs)
((0, 1, 2), {'a': 3, 'c': 5, 'b': 4})
Nach dem Login kopieren

4. Nur-Schlüsselwort-Parameter in python3.x

python3.x fügt den Funktionsheader ein. Die Sortierregeln werden verallgemeinert. Damit wir Parameter angeben können, die nur Schlüsselwörter enthalten, d.

In [1]: def kwonly(a,*b,c):
  ...: print(a,b,c) 
In [2]: kwonly(1,2,c=3)
1 (2,) 3
In [3]: kwonly(a=1,c=3)
1 () 3
In [4]: kwonly(1,2,3) #c必须按照关键字传递
TypeError: kwonly() missing 1 required keyword-only argument: 'c'

In [6]: def kwonly(a,*,b,c):print(a,b,c)
In [7]: kwonly(1,c=3,b=2)
1 2 3
In [8]: kwonly(c=3,b=2,a=1)
1 2 3
In [9]: kwonly(1,2,3)
TypeError: kwonly() takes 1 positional argument but 3 were given
Nach dem Login kopieren

1. Sortierregeln:

** dürfen nicht allein in Parametern erscheinen, wie folgt: Falsch Verwendung:

In [11]: def kwonly(a,**pargs,b,c):
  ....: 
 File "<ipython-input-11-177c37879903>", line 1
def kwonly(a,**pargs,b,c):  ^
SyntaxError: invalid syntax

In [13]: def kwonly(a,**,b,c):
  ....: 
 File "<ipython-input-13-46041ada2700>", line 1
def kwonly(a,**,b,c):
  ^
SyntaxError: invalid syntax
Nach dem Login kopieren
Das heißt, in einem Funktionsheader müssen nur Schlüsselwortparameter vor jeder Schlüsselwortform von *args geschrieben werden oder erscheinen in vor oder nach args und kann in **args enthalten sein.

In [14]: def f(a,*b,**d,c=6):print(a,b,c,d)
 File "<ipython-input-14-43c901fce151>", line 1
def f(a,*b,**d,c=6):print(a,b,c,d)
 ^
SyntaxError: invalid syntax
In [15]: def f(a,*b,c=6,**d):print(a,b,c,d) #keyword-only在*args之后,**args之前
In [16]: f(1,2,3,x=4,y=5)
1 (2, 3) 6 {&#39;x&#39;: 4, &#39;y&#39;: 5}

In [20]: f(1,c=7,*(2,3),**dict(x=4,y=5)) #keyword-only在
1 (2, 3) 7 {&#39;x&#39;: 4, &#39;y&#39;: 5}
In [21]: f(1,*(2,3),**dict(x=4,y=5,c=7))
1 (2, 3) 7 {&#39;x&#39;: 4, &#39;y&#39;: 5}
Nach dem Login kopieren

2. Warum nur Schlüsselwortparameter verwenden?

Es ist einfach, einer Funktion zu erlauben Akzeptieren Sie mehrere zu verarbeitende Positionsargumente und akzeptieren Sie auch Konfigurationsoptionen, die als Schlüsselwörter übergeben werden. Dies kann den Code reduzieren, ohne den Sie *args und **args verwenden und Schlüsselwörter manuell überprüfen müssten.

3. Min ruft

auf, um eine Funktion zu schreiben, die den Mindestwert in jedem Parametersatz und jedem Objektdatentypsatz berechnen kann.

Methode 1: Verwenden Sie Slicing

In [23]: def min(*args):
  ....: res=args[0]
  ....: for arg in args[1:]:
  ....: if arg < res:
  ....: res = arg
  ....: return res
  ....:
Nach dem Login kopieren

Methode 2: Lassen Sie Python es automatisch abrufen, um Slicing zu vermeiden.

In [28]: def min2(first,*rest):
  ....: for arg in rest:
  ....: if arg < first:
  ....: first = arg
  ....: return first
  ....:
Nach dem Login kopieren
Methode 3: Rufen Sie die integrierte Funktionsliste auf, konvertieren Sie den Vorfahren in eine Liste und rufen Sie dann die integrierte Sortiermethode der Liste auf . Hinweis: Da die Python-Sortierroutine in C geschrieben ist und einen hochoptimierten Algorithmus verwendet, ist die Ausführungsgeschwindigkeit viel schneller als bei den ersten beiden.

In [32]: def min3(*args):
  ....: tmp=list(args)
  ....: tmp.sort()
  ....: return tmp[0]
  ....:

In [29]: min2(3,*(1,2,3,4))
Out[29]: 1
In [31]: min(*(5,6,6,2,2,7))
Out[31]: 2
In [33]: min3(3,4,5,5,2)
Out[33]: 2
Nach dem Login kopieren

5. Simulieren Sie die allgemeine Set-Funktion:

Schreiben Sie eine Funktion, die den gemeinsamen Teil der beiden Sequenzen zurückgibt, und schreiben Sie die Datei inter2.py wie folgt:

Test:

#!/usr/bin/python3
def intersect(*args):
  res=[]
  for x in args[0]:
    for other in args[1:]:
      if x not in other: break
    else:
      res.append(x)
  return res
def union(*args):
  res=[]
  for seq in args:
    for x in seq:
      if not x in res:
        res.append(x)
  return res
Nach dem Login kopieren

2. Python 3.x-Druckfunktion simulieren

In [3]: from inter2 import intersect,union
In [4]: s1,s2,s3="SPAM","SCAM","SLAM"
In [5]: intersect(s1,s2),union(s1,s2)
Out[5]: ([&#39;S&#39;, &#39;A&#39;, &#39;M&#39;], [&#39;S&#39;, &#39;P&#39;, &#39;A&#39;, &#39;M&#39;, &#39;C&#39;])
In [6]: intersect([1,2,3],(1,4))
Out[6]: [1]
In [7]: intersect(s1,s2,s3)
Out[7]: [&#39;S&#39;, &#39;A&#39;, &#39;M&#39;]
In [8]: union(s1,s2,s3)
Out[8]: [&#39;S&#39;, &#39;P&#39;, &#39;A&#39;, &#39;M&#39;, &#39;C&#39;, &#39;L&#39;]
Nach dem Login kopieren
Schreiben Sie die Datei python30. py

(1) Verwenden Sie *args- und **args-Methoden

Umgebung Python2.7

Interaktion Ergebnisse:

#!/usr/bin/python
import sys
def print30(*args,**kargs):
  sep = kargs.get(&#39;sep&#39;,&#39; &#39;)
  end = kargs.get(&#39;end&#39;,&#39;\n&#39;)
  file = kargs.get(&#39;file&#39;,sys.stdout)
  if kargs:raise TypeError(&#39;extra keywords: %s&#39; %kargs)
  output = &#39;&#39;
  first = True
  for arg in args:
    output += (&#39;&#39; if first else sep)+str(arg)
    first = False
  file.write(output + end)
Nach dem Login kopieren

(2) Verwenden Sie die Nur-Schlüsselwort-Methode, um den gleichen Effekt wie Methode eins zu erzielen:

In [5]: print30(1,2,3)
1 2 3
In [6]: print30(1,2,3,sep=&#39;&#39;)
123
In [7]: print30(1,2,3,sep=&#39;...&#39;)
1...2...3
In [8]: print30(1,[2],(3,),sep=&#39;...&#39;)
1...[2]...(3,)
In [9]: print30(4,5,6,sep=&#39;&#39;,end=&#39;&#39;)
456
In [11]: print30(1,2,3)
1 2 3

In [12]: print30()
Nach dem Login kopieren

Weitere verwandte Artikel zum Festlegen und Verwenden von Funktionsparametern in Python finden Sie auf der chinesischen PHP-Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage