出典:Pexels
プログラミングでは、関数が命です!
それはプログラミングに新しいものであるか、または別の言語に精通している方 - - 初心者としてPythonを使用して関数定義内のパラメータの数が、引数の数と一致し、伝えたいかを学ぶためのすべての必要性を。
!
これは、知識の基礎である - 世界を理解するのに役立ちます。
しかし、関数定義へのアクセス*引数と** kwargsからは、初心者には心理的な障壁に遭遇し始めることができます。
Pythonのコードでは、多くの場合、我々は二つの言葉引数とkwargsからは、一般的に1つのまたは2つのアスタリスクの前に追加されます参照してください。
これらの記述につまずくことがないようにしてください。実際には、これらは何もスーパー特別なパラメータではありません、それは不思議ではないですが、プログラマは変数名を合意し、引数は位置パラメータを示し、略語の引数であり、kwargsからはキーワード引数の略で、キーワード引数を表明しました。
これは実際には、*引数と** kwargsからはキーワード引数で前方位置パラメータので、目の前に配置する必要があり、Pythonの変数パラメータの二つの形式です。
次に、我々は、具体的にそれらを使用する方法を学習します。
キーワード引数対位置パラメータ
*引数と** kwargsからは何かを学ぶために、私たちは二つの概念を区別する必要があります。
まず、位置パラメータとキーワードパラメータの違いを区別します。パラメータ1、パラメータマッチング、パラメータとパラメータ2 2試合、というように - その最も基本的な機能では、マッチングゲームを作ります。
def printThese(a,b,c):
print(a, "is stored in a")
print(b, "is stored in b")
print(c, "is stored inc")printThese(1,2,3)
"""
1 is stored in a
2 is stored in b
3 is stored in c
"""
三つのパラメータが必要とされている、の欠如は、故障の原因となります。
def printThese(a,b,c):
print(a, "is stored in a")
print(b, "is stored in b")
print(c, "is stored inc")printThese(1,2)
"""
TypeError: printThese() missing 1 required positional argument: 'c'
"""
パラメータのデフォルト値は、このパラメータはオプションとなり、関数定義を与えています。
def printThese(a,b,c=None):
print(a, "is stored in a")
print(b, "is stored in b")
print(c, "is stored inc")printThese(1,2)
"""
1 is stored in a
2 is stored in b
None is stored in c
"""
また、これらのオプションのパラメータは、キーワードの選択は、あなたが今、関数名とそれに対応するマップを指定されたパラメータを呼び出すことができるでしょう。
三つの変数のデフォルト値はNoneに設定し、状況マップを考慮せずにどのように順序を確認しています。
defprintThese(a=None,b=None,c=None):
print(a, "is stored in a")
print(b, "is stored in b")
print(c, "is stored inc")printThese(c=3, a=1)
"""
def printThese(a=None,b=None,c=None):
print(a, "is stored in a")
print(b, "is stored in b")
print(c, "is stored inc")printThese(c=3, a=1)
"""
1 is stored in a
None is stored in b
3 is stored in c
"""
スプラットオペレータ
出典:Pexels
私が開始するオペレータの名前を愛していると言うために最初から - あまりにも......可視化しました。*乗算は、多くの場合に関連しますが、Pythonで、二回スプラットオペレータです。
この演算子は箱のようなものです。オペレータが伸びる - スプラット相当JavaScript--プロセスをより大きな配列を形成する、ドミノオープンとして見られるが、必要より強力な類似のスプラットすることができます。
利用以下例子更容易解释清楚。
a = [1,2,3]
b = [*a,4,5,6]print(b) # [1,2,3,4,5,6]
在代码实例中,将a的内容移入(解包)到新列表b中。
如何使用*args和**kwargs
我们知道splat运算符解包多个值,并且知道函数参数有两种类型。若现在还未弄明白,那么可以将*args理解为变元的缩写,而**kwargs理解为关键字变元的缩写。
各参数用于解压其各自的变元类型,允许使用可变字长变元列表进行函数调用。例如,创建一个函数表示学生的考试分数。
def printScores(student,*scores):
print(f"Student Name:{student}")
for score in scores:
print(score)printScores("Jonathan",100, 95, 88, 92, 99)
"""
Student Name: Jonathan
100
95
88
92
99
"""
噢,等等,我并未称呼其为*args?是的,“args”是一个标准化规范,但仍然只是一个名称。事实上,在*args中,唯一的星号是真正的参与者,创建了列表,其内容则是来自函数调用的位置参数(在这些定义变元后)。
这些理清楚之后,**kwargs就很容易理解了。名称并不重要,重要的是双星号创建了字典,其内容是关键字参数,来自函数调用(在这些定义变元后)。
为了更好地演示,我们创建一个函数,输出参加全国英语等级考试的人员名单。
def printPetNames(owner,**pets):
print(f"Owner Name:{owner}")
for pet,name in pets.items():
print(f"{pet}:{name}")printPetNames("Jonathan", dog="Brock",fish=["Larry", "Curly", "Moe"],turtle="Shelldon")"""
Owner Name: Jonathan
dog: Brock
fish: ['Larry', 'Curly', 'Moe']
turtle: Shelldon
"""
来源:Pexels
最后,再给大家提供一些额外的“知识福利”。
下面一些谏言可有助于大家规避常见的陷阱并扩展知识面。
· 利用*args和**kwargs作为标准化规范,把握好位置参数和关键字参数;
· 不能将**kwargs置于*args前,否则将产生错误;
· 清楚意识到关键字参数和**kwargs之间的冲突,该值本是传达**kwarg的意思,但是却不明就里的成为关键字参数的名称;
· 在函数调用时可以采用splat运算符。