ホームページ  >  記事  >  バックエンド開発  >  Pythonカスタム関数の作成、呼び出し、関数パラメータの詳細な説明

Pythonカスタム関数の作成、呼び出し、関数パラメータの詳細な説明

WBOY
WBOYオリジナル
2016-06-16 08:44:542019ブラウズ

関数は、単一の関数または関連する関数を実装するために使用される、整理された再利用可能なコード セグメントです。
関数により、アプリケーションのモジュール性とコードの再利用が向上します。 Python には print() などの多くの組み込み関数が用意されていることはすでにご存知でしょう。ただし、ユーザー定義関数と呼ばれる独自の関数を作成することもできます。
1. 関数を定義します。
必要な関数を使用して関数を定義できます。

は次のとおりです。

1. 関数コード ブロックは def キーワードで始まり、その後に関数識別子名と括弧 () が続きます。
2. 入力パラメータと独立変数は括弧で囲む必要があります。パラメータは括弧内で定義できます。
3. 関数ステートメントの最初の行では、関数の説明を保存するために使用されるドキュメント文字列をオプションで使用できます。
4. 関数の内容はコロンで始まり、インデントされます。
5.Return[expression] は関数を終了し、オプションで呼び出し元に値を返します。式を指定せずに返すことは、None を返すことと同じです。

構文

コードをコピー コードは次のとおりです:
def functionname(parameters):
"Function_docstring"
function_suite
return [expression]
デフォルトでは、パラメータ値とパラメータ名は関数宣言で定義された順序で照合されます。

以下は、文字列を入力パラメータとして受け取り、それを標準の表示デバイスに出力する単純な Python 関数です。

コードをコピー コードは次のとおりです:
def printme( str ):
"受信した文字列を標準ディスプレイに出力しますデバイス "
print str
return

2. 関数呼び出し
関数を定義するには、関数に名前を付け、関数に含まれるパラメーターとコード ブロック構造を指定するだけです。この関数の基本構造が完成したら、別の関数呼び出しを通じて、または Python プロンプトから直接実行できます。

次の例は printme() 関数を呼び出します:

コードをコピーします コードは次のとおりです:
#!/usr /bin/python

# 関数定義はここです
def printme( str ):
"受信文字列を出力します"
print str;
return;

# これで printme 関数を呼び出すことができます
printme("ユーザー定義関数を呼び出したい!");
printme("もう一度同じ関数を呼び出します");
#上記の例の出力結果:

#ユーザー定義関数を呼び出したい!
#同じ関数をもう一度呼び出したい

3. パラメータの値渡しとパラメータの参照渡し
Python のパラメータ (独立変数) はすべて参照渡しです。関数内のパラメータを変更すると、この関数を呼び出す関数内の元のパラメータも変更されます。例:

コードをコピー コードは次のとおりです:
#!/usr/bin/python

#書き込み可能な関数の説明
def changeme( mylist ):
"受信リストを変更します"
mylist.append([1,2,3,4]);
print "関数の値: " , mylist
return

# changeme 関数を呼び出します
mylist = [10,20,30];
changeme( mylist );
print "関数外の値: ", mylist
#関数に渡されるオブジェクトと最後に新しいコンテンツを追加するオブジェクトは同じ参照を使用します。したがって、出力結果は次のようになります:

#関数内の値: [10, 20, 30, [1, 2, 3, 4]]
#関数外の値: [10, 20, 30, [1, 2] 、 3、 4] ]]

4. 関数パラメータ
Python 関数で使用できるパラメータの種類:

1. 必須パラメータ
2. 名前付きパラメータ
3. デフォルトパラメータ
4. 可変長パラメータ

1. 必要なパラメータ

必須パラメータは正しい順序で関数に渡す必要があります。コール時の数量は申告時の数量と同じである必要があります。
printme() 関数を呼び出すときは、パラメーターを渡す必要があります。そうしないと、構文エラーが発生します:

コードをコピーします コードは次のとおりです。
#!/usr/bin/python

#書き込み可能な関数の説明
def printme( str ):
"受信文字列を出力します"
print str;
return;

#printme 関数を呼び出す
printme();
#上記の例の出力結果:

#Traceback (最新の呼び出しは最後):
# ファイル "test.py"、11 行目、
# printme();
#TypeError: printme() は正確に受け取ります引数 1 つ (0 が与えられます)


2. 名前付きパラメータ

名前付きパラメータは関数呼び出しと密接に関連しています。呼び出し元はパラメータの名前を使用して、渡されるパラメータの値を決定します。 Python インタープリターはパラメーター名とパラメーター値を照合できるため、渡されていないパラメーターをスキップしたり、パラメーターを順序どおりに渡すことができません。名前付きパラメータを使用して printme() 関数を呼び出します:

コードをコピーします コードは次のとおりです:
#!/usr/bin/python

#可写函数说明
def printme( str ):
   "打印任何传入的字符串"
   print str;
   return;

#调用printme函数
printme( str = "My string");
#以上实例输出结果:

#My string


下例能将命名参数顺序不重要展示得更清楚:
复制代码 代码如下:
#!/usr/bin/python

#可写函数说明
def printinfo( name, age ):
   "打印任何传入的字符串"
   print "Name: ", name;
   print "Age ", age;
   return;

#调用printinfo函数
printinfo( age=50, name="miki" );
#以上实例输出结果:

#Name:  miki
#Age  50


3、缺省参数

调用函数时,缺省参数的值如果没有传入,则被认为是默认值。下例会打印默认的age,如果age没有被传入:

复制代码 代码如下:
#!/usr/bin/python

#可写函数说明
def printinfo( name, age = 35 ):
   "打印任何传入的字符串"
   print "Name: ", name;
   print "Age ", age;
   return;

#调用printinfo函数
printinfo( age=50, name="miki" );
printinfo( name="miki" );
#以上实例输出结果:

#Name:  miki
#Age  50
#Name:  miki
#Age  35

4、不定长参数

你可能需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数,和上述2种参数不同,声明时不会命名。基本语法如下:

复制代码 代码如下:
def functionname([formal_args,] *var_args_tuple ):
   "函数_文档字符串"
   function_suite
   return [expression]
加了星号(*)的变量名会存放所有未命名的变量参数。选择不多传参数也可。如下实例:
复制代码 代码如下:
#!/usr/bin/python

# 可写函数说明
def printinfo( arg1, *vartuple ):
   "打印任何传入的参数"
   print "输出: "
   print arg1
   for var in vartuple:
      print var
   return;

# 调用printinfo 函数
printinfo( 10 );
printinfo( 70, 60, 50 );
#以上实例输出结果:

#输出:
#10
#输出:
#70
#60
#50

五、匿名函数
用lambda关键词能创建小型匿名函数。这种函数得名于省略了用def声明函数的标准步骤。

Lambda函数能接收任何数量的参数但只能返回一个表达式的值,同时只能不能包含命令或多个表达式。
匿名函数不能直接调用print,因为lambda需要一个表达式。
lambda函数拥有自己的名字空间,且不能访问自有参数列表之外或全局名字空间里的参数。
虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。
语法

lambda函数的语法只包含一个语句,如下:

复制代码 代码如下:
lambda [arg1 [,arg2,.....argn]]:expression
如下实例:
复制代码 代码如下:
#!/usr/bin/python

#可写函数说明
sum = lambda arg1, arg2: arg1 + arg2;

#调用sum函数
print "Value of total : ", sum( 10, 20 )
print "Value of total : ", sum( 20, 20 )
#以上实例输出结果:

#Value of total :  30
#Value of total :  40

六、关于return语句
return语句[表达式]退出函数,选择性地向调用方返回一个表达式。不带参数值的return语句返回None。之前的例子都没有示范如何返回数值,下例便告诉你怎么做:

复制代码 代码如下:
#!/usr/bin/python

# 可写函数说明
def sum( arg1, arg2 ):
   # 返回2个参数的和."
   total = arg1 + arg2
   print "Inside the function : ", total
   return total;

# 调用sum函数
total = sum( 10, 20 );
print "Outside the function : ", total
#以上实例输出结果:

#Inside the function :  30
#Outside the function :  30


7. 変数のスコープ
プログラムのすべての変数にどこからでもアクセスできるわけではありません。アクセス許可は、変数が割り当てられている場所によって異なります。

変数のスコープによって、プログラムのどの部分に特定の変数名にアクセスできるかが決まります。最も基本的な 2 つの変数スコープは次のとおりです:
1. グローバル変数
2. ローカル変数

8. 変数とローカル変数
関数内で定義された変数はローカル スコープを持ち、関数の外で定義された変数はグローバル スコープを持ちます。

ローカル変数は宣言されている関数内でのみアクセスできますが、グローバル変数はプログラム全体からアクセスできます。関数が呼び出されると、関数内で宣言されたすべての変数名がスコープに追加されます。次の例:

コードをコピー コードは次のとおりです:
#!/usr/bin/python

total = 0; # これはグローバル変数です。
# 書き込み可能な関数の説明
def sum( arg1, arg2 ):
# 2 つのパラメータの合計を返します。"
total = arg1 + arg2; #ここの total はローカル変数です。
print "関数内 local total : ", total
return total;

#sum 関数を呼び出す
sum( 10, 20 );
print "関数外のグローバル合計: ", total
#上記の例の出力結果:

#関数内ローカル合計 : 30
#関数外グローバル合計 : 0

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。