Pythonファンデーションを統合
5、機能
関数はPythonで重要な役割を果たします。カプセル化された関数は、コードの再利用性を高めるだけでなく、Pythonでの関数の適用においてより高い柔軟性を備えています。関数をうまく利用できるかどうかは、真のPythonマスターであるかどうかの重要な指標になる可能性があります。
(1)機能、最初はオブジェクト
まず第一に、Pythonは動的に強く型付けされた言語であるだけでなく、本当に強く型付けされた言語でもあります。 pythonのすべては、それについて話すだけでなく、オブジェクトです。定数はオブジェクトであり、変数はオブジェクトであり、4つのデータ構造もオブジェクトです(互いにネストできることを覚えていますか?)では、関数についてはどうでしょうか。はい、関数もオブジェクトです。
**例1:**文字列の長さを計算する関数を作成する
def func_1(strs):
return len(strs)
func_1("How are you!")
12
Pythonオブジェクトとして、通常、オブジェクトモデルに必要な3つの属性、つまりid、type、およびvalueがあります。上記の関数のID、タイプ、および値を見てみましょう:
id(func_1)
47027880
type(func_1)
< class 'function'>
func_1
< function func_1 at 0x02CD96A8>
強力なオブジェクトタイプとして、通常は次の特性があります。
そして、これらの機能はPython関数で利用できます。
1、 関数は変数への割り当てを可能にします
func_2 = func_1
PS:関数が別の変数に割り当てられている場合、その関数は呼び出されず、新しい名前のみが関数オブジェクトにバインドされることに注意してください。
func_2("what’s this?")
12
もちろん、オブジェクトへの参照を追加するだけなので、実際には、プログラムが必要とする限り、さらに参照を追加できますが、さらに参照を追加できます。本質的に、これらの変数はすべて同じものを指します。関数オブジェクト。
func_3 = func_1
if func_3 == func_2 : print(‘ok!’)
ok!
リスト、辞書、辞書、コレクションなど、多くのコンテナオブジェクトがあります。それらは、整数、文字列を含む任意のオブジェクトを格納でき、同様に、関数もコンテナオブジェクトに格納できます。例えば
**例2:**関数は独立した要素としてリストに含まれています
list1 = [func_1, len]
for x in list1:
print(x("abcde"))
5
5
コード分析:
(1)list1の2つの要素:func_1はカスタム関数であり、lenはpythonの組み込み関数です。
(2)ループ反復の場合、関数オブジェクトはx変数に割り当てられます。
(3)x( "abcde")を呼び出して表示します。
もちろん、より直接的な方法は、要素のインデックスを介して関数オブジェクトを取得してから、関数を呼び出すことです。
list10
5
3、 関数は、引数として別の関数に渡すことができます
例3:
def func_4(func):
ln = func( "関数の魔法の関数!")
print( "文字列の長さは次のとおりです:" + ln)
func_4(func_1)
文字列の長さは次のとおりです:7
別の関数の戻り値としての関数。次に例を示します。
def func_5():
return func_1
my_func = func_5()
my_func("my_python")
9
func_5()("my_python")
9
ここで、func_5は実際には高次の関数です。 (高次関数とは何ですか?本を読むことをお勧めします!)
PS:Pythonの組み込み関数の中で、* map *関数などの一般的な高次関数。
例: mapは、関数と反復オブジェクトをパラメーターとして受け入れます。mapを呼び出すときは、反復オブジェクトの要素をパラメーターとして関数を繰り返し呼び出します。
map(func_1, ["abcde","def","gh","lmnopqr"])
lens = map(func_1, ["abc","def","gh","lmnop"])
list(lens)
[5, 3, 2, 7]
**map の機能は次と同等です:
[ func_1(i) for i in ["abc","def","gh","lmnop"]]
[5, 3, 2, 7]
それに比べて、マップの実行効率は速くなります。
リストにはリストが含まれ、辞書には辞書が含まれていますが、関数に関数を含めることはできますか?答えは「はい」です。関数を含むこの種の関数は、ネストされた関数と呼ばれます。
**例4:**文字列の最初の2文字を削除した後、その長さを計算します
def func_6(my_str):
def func_7(a):
return a[2:]
new_str = func_7(my_str)#call組み込み関数
return len(new_str)
func_6("i_python")
6
PS:ネストされた関数にある関数はローカル変数と同等であることに注意してください。そのスコープはネストされた関数の内部に限定されており、関数の外部からアクセスすることはできません。
**例5:**呼び出すことができるクラスを作成する
class get_sum:
def init(self, x):
self.x = x
def call(self, y):
return self.x + y
my_sum = get_sum(1)#初期値を割り当てる
my_sum(5)#カスタムクラスを呼び出す
6
my_sum(5)を実行することは、get_sum._call __(self、4)を呼び出すことと同等であり、selfはインスタンスオブジェクトget_sumであり、初期値self.xは1に等しいため、my_sum(5)を呼び出すことの戻り値は1 +5です。
**PS:オブジェクトが呼び出し可能オブジェクトであるかどうかを判断するには、組み込み関数呼び出し可能を使用して判断できます。 ****
callable(func_1)
True
callable(3)
False
callable(len)
True
関数を関数として扱うだけでなく、
カプセル化されたコードブロックだけではありません。
それもオブジェクトです、
他のすべてのオブジェクトと同じようにすることができます。
含まれ、割り当てられ、渡され、返され、
ネストすることもできます。
模倣することができます。 (そしてそれは高い模倣です〜!)
機能をよく見ると、
それでもこのように使えるとき(666〜)、
あなたが偉大な人にならないのは難しいです!
ステートメント:
この記事は、ブログガーデンのYangGuoによる記事から抜粋したものです。
https://www.cnblogs.com/duex/p/6725694.html
(一部変更)
Recommended Posts