4.1 正式なパラメータ、実際のパラメータ、関数のドキュメント
4.2 キーワードパラメータとデフォルトパラメータ
4.3 パラメータを収集する
7.1 内蔵機能
7.2 閉鎖
8.1 ラムダ式
8.2 Python組み込みBIF:フィルター機能
8.3 Python組み込みBIF:マップ関数
9.1 再帰的要因
9.2 フィボナッチシーケンス
9.3 ハノイの塔
Defは関数を作成するためのキーワードであり、関数の呼び出しは括弧付きの関数名です。
def MYFirstFunction():print('これは最初に作成された関数です')print('とても寒かったと言った。 。 。 。 。')
# 関数を呼び出す
MYFirstFunction()
# 動作結果:
これは最初に作成された関数です
とても寒かったと言った。 。 。 。 。
次のコードから渡された実際のパラメーターには一貫性がなく、結果が異なることがわかります。
def MYSecondFunction(name):print('ようこそ'+name +'私のpython関数に来てください。')MYSecondFunction('張さん')MYSecondFunction('Li Si')MYSecondFunction('王呉')
# 動作結果:
ZhangSanを私のpython関数にようこそ。
LiSiを私のpython関数にようこそ。
WangWuを私のpython関数にようこそ。
次のコードは2つの関数を定義し、それぞれに2つの正式なパラメーターがあります。最初のadd関数が呼び出され、直接割り当てられ、情報が出力されます。 add1関数はprintを使用して呼び出されますが、add1に戻るための組み込みのBIF関数returnがコードに含まれているため、printを使用して情報を印刷できます。
def add(num1,num2):
suum = num1 + num2
print('計算結果は以下のとおりです。')print(suum)
def add1(num1,num2):return(num1 + num2)add(999,150)print(add1(7,8))
# 結果は次のとおりです。
計算結果は以下のとおりです。
114915
正式なパラメーター:定義された関数の名前の後の括弧内のパラメーターは、正式なパラメーター(パラメーター)と呼ばれます。
引数:関数が呼び出されたときに渡されるパラメーターは引数です。
関数のドキュメント:関数を作成する過程で、コード本体が大きい場合、他の人がコードをすばやく識別できると便利です。
def MyFUN(name):'関数定義プロセスの名前は、正式なパラメーターと呼ばれます'
# taは単なるフォームであり、パラメータの位置を占めることを意味すると考えてください
print('渡された'+ name +'Taは特定のパラメータ値であるため、実際のパラメータと呼ばれます。')MyFUN('張さん')print(MyFUN.__doc__)print(help(MyFUN))
# 結果は次のとおりです。
Taが特定のパラメータ値であるため、渡されたZhangSanは実際のパラメータと呼ばれます。
関数定義プロセスの名前は、正式なパラメーターと呼ばれます
Help on function MyFUN in module __main__:MyFUN(name)
関数定義プロセスの名前は、正式なパラメーターと呼ばれます
None
キーワードパラメータ:関数を呼び出すときに定義され、パラメータ名で値を割り当てます。例:MyFUN(name = '张三')
デフォルトパラメータ:デフォルト値を定義するパラメータはデフォルトパラメータと呼ばれ、割り当ては関数定義パラメータのプロセスでデフォルトパラメータになります。
def animal(name='モンキー',action='木登り'):print(name +'お気に入り'+ action)animal()animal('泳ぐ','アヒル')animal(action='泳ぐ',name='アヒル')
# 結果は次のとおりです。
サルは木に登るのが好きです
アヒルのように泳ぐ
水泳のようなアヒル
パラメータの収集:収集パラメータを表すために、正式なパラメータの前に記号を追加します。たとえば、MyFUN( name)のように複数のパラメータを収集できます。実際、pythonはコレクションパラメータの正式なパラメータ名をタプルに設定し、このタプルから実際のパラメータを呼び出します。関数に収集パラメーター以外のパラメーターがある場合は、このパラメーターをデフォルトパラメーターとして設定してください。デフォルトパラメーターを設定しない場合、関数はエラーを報告し、すべての実際のパラメーターはデフォルトで収集パラメーターになります。
def add(*num,mon='ゴリラ'):print('この関数の収集されたパラメーターの長さは次のとおりです。',len(num))print('2番目のパラメーターは次のとおりです。',num[2])print('この関数のデフォルトパラメータは次のとおりです。'+ mon)add('白いうさぎ','小さなカメ','象','カバ','ヒョウ',mon ='モンキー')
# 結果は次のとおりです。
この関数の収集されたパラメーターの長さは次のとおりです。5
2番目のパラメータは:象
この関数のデフォルトパラメータは次のとおりです。monkey
プログラミング言語では、関数関数には戻り値があると考えていますが、プロシージャプロシージャは単純で特別であり、戻り値はありません。
「Pythonには関数のみがあり、プロセスはありません」、なぜそう言うのですか?たとえば、関数を定義し、次のようにhelloとwordを出力します。
def hello():print('Hello,word!')
temp =hello()print(temp)print(type(temp))
# 結果は次のとおりです。
Hello,word!
None
< class'NoneType'>
Pythonは複数の値を返すことができます。リストについて考えることができます。リストでのコンマの使用はタプルになる可能性があります。次の例では、pythonでの戻りが、このデータのセットを1つのデータにパックして返すことがわかります。
def MyFun():return[1,'list','done']print(MyFun())
def MyFun1():return1,'list','done'print(MyFun1())
# 結果は次のとおりです。
[1,' list','done'](1,'list','done')
def discounts(price,rate):
final_price = price * rate
return final_price
old_price =float(input('元の価格を入力してください:'))
rate =float(input('割引率を入力してください:'))
new_price =discounts(old_price,rate)print('割引価格は次のとおりです。',new_price)print('ローカル変数finalを出力しようとしています_価格の価値:', final_price )
# 結果は次のとおりです。
元の価格を入力してください:100
割引率を入力してください:0.8
割引価格は:80.0Traceback(most recent call last):
File "D:/Backup/PyCharm/study_py.py", line 25,in<module>print('ローカル変数finalを出力しようとしています_価格の価値:', final_price )
NameError: name 'final_price' is not defined
上記の例のリストから、ローカル変数を出力するとエラーが報告され、final_priceが定義されていないことを見つけるのは難しくありません。つまり、定義したfinal_priceは、discounts関数でのみ有効です。この関数が出力されると、この変数は無効になります。実際、pythonが関数を呼び出すと、これらのコードがスタックに格納され、コードが実行されます。このコードはスタックスペースから削除されます。上記のコードでは、old_priceとnew_priceはグローバル変数であり、ローカル変数よりも権限があります。スコープはコード全体、つまり実際のモジュールですが、グローバル変数を変更する場合にも注意が必要です。関数内にある場合グローバル変数を変更すると、pythonは、次の例のold_priceなど、グローバル変数と同じローカル変数を作成します。
def discounts(price,rate):
final_price = price * rate
old_price =50print('これは、変更された変数oldを出力する試みです。_価格の価値:', old_price )return final_price
old_price =float(input('元の価格を入力してください:'))
rate =float(input('割引率を入力してください:'))
new_price =discounts(old_price,rate)print('割引価格は次のとおりです。',new_price)print('これは、変更されたグローバル変数oldを出力する試みです。_価格の価値:', old_price )
# 結果は次のとおりです。
元の価格を入力してください:100
割引率を入力してください:0.8
これは、変更された変数oldを出力する試みです。_価格の価値:50
割引価格は:80.0
これは、変更されたグローバル変数oldを出力する試みです。_価格の価値:100.0
グローバル変数は関数内でアクセスできますが、グローバル変数を変更しようとしないでください。pythonはシールドシャドウイングを使用してグローバル変数を保護します。どのように保護しますか?
Pythonは、グローバル変数と同じ変数を作成し、それをローカル変数として設定します。しかし、グローバル変数を変更したい場合、それは達成できますか?答えはイエスです。たとえば、次のように、globalキーワードを使用する必要があります。
count =5
def MyFUN():
count =10print(count)MyFUN()print(count)
# 結果は次のとおりです。
105
# グローバルキーワードをテストに追加できます。
count =5
def MyFUN():
global count
count =10print(count)MyFUN()print(count)
# 結果は次のとおりです。
1010
実際、pythonの関数は内部で定義することもでき、埋め込み関数または内部関数と呼ぶことができます。埋め込み関数に注意する必要があります。内部関数の範囲は外部関数内にあります。つまり、Fun2関数はFun1関数内で有効になります。Fun1関数を終了すると、Fun2関数は有効になりません。例を挙げましょう
def Fun1():print('Fun1が呼び出されています')
def Fun2():print('Fun2が呼び出されています')Fun2()Fun1()
# 結果は次のとおりです。
Fun1が呼び出されています
Fun2が呼び出されています
pythonのクロージャは、内部関数が外部スコープ(グローバルスコープではない)の変数を参照するかのように形式で定義され、内部関数はクロージャと見なされます。
def Funx(x):
def Funy(y):return x * y
return Funy
# ここでFunyに注意してください。私たちのパイソンのほとんどすべてがオブジェクトであるため、パイソンで彼の名前を覚えることができます。データ、タイプ、変数を覚えておく必要はありません。直接できます。関数オブジェクトは直接返されます。
i =Funx(8)print(i)print(type(i))print(i(5))print(Funx(8)(5))print(Funy(5))
# 結果は次のとおりです。
< function Funx.<locals>.Funy at 0x0355B610><class'function'>4040Traceback(most recent call last):
File "D:/Backup/PyCharm/study_py.py", line 54,in<module>print(Funy(5))
NameError: name 'Funy' is not defined
# クロージャの概念を理解しましょう。内部関数の場合、Funxの場合、Funyは内部関数に属します。外部スコープの場合、この関数Funyの外部スコープは、それを参照するFunxの関数空間全体の変数xです。 。これらの2つのポイントに達すると、このFunyは閉鎖であると言えます。.
def Fun1():
x =5
def Fun2():
x *= x
return x
returnFun2()Fun1()
# 結果は次のとおりです。
Traceback(most recent call last):
File "D:/Backup/PyCharm/study_py.py", line 63,in<module>Fun1()
File "D:/Backup/PyCharm/study_py.py", line 62,in Fun1
returnFun2()
File "D:/Backup/PyCharm/study_py.py", line 60,in Fun2
x *= x
UnboundLocalError: local variable 'x' referenced before assignment
**注:UnboundLocalError:割り当て前に参照されるローカル変数「x」****このエラーの理由は次のとおりです。戻り値Fun2()が実行されると、Fun2に実行され、Fun1の内部空間全体が実行されます。 x = 5、Fun2のグローバル変数に属しますが、コード全体ではローカル変数です。実際、x = 5はグローバル変数ではない外部変数です。Fun2のxとFun1のxは変数ではなく、前のグローバル変数とローカル変数で説明したように、python関数でグローバル変数を定義します。Pythonはシャドウイングによってこのグローバル変数をシールドし、グローバル変数と同じ変数xを作成しますが、このxはローカル変数です。 、つまり、Fun1のx = 5はFun2に渡されず、Fun2のこのxはローカル変数です。 ****
Fun1のxがFun2に渡されることを認識したい場合は、次の図に示すように、Fun2のこのパラメーターをxに設定して、xの2乗を実現できます。
def Fun1():
x =5
def Fun2(x):
x *= x
return x
returnFun2(x)print(Fun1())
python2では、
def Fun1():
x =[5]
def Fun2():
x[0]*= x[0]return x[0]returnFun2()print(Fun1())
# 結果は次のとおりです。
25
python3の世界では、別のキーワードnonlocalが発明されました。このキーワードは、globalキーワードと同じように使用されます。Fun1のx変数は、Fun2で直接参照されるように設定されています。
def Fun1():
x =5
def Fun2():
nonlocal x
x *= x
return x
returnFun2()print(Fun1())
# 結果は次のとおりです。
25
ラムダ関数は匿名関数とも呼ばれます。匿名関数は名前のない関数です。名前のない関数はどうですか?もちろん。一部の関数が一時的にのみ使用され、そのビジネスロジックが非常に単純な場合は、名前を付ける必要はありません。
pythonで実行スクリプトを作成する場合、ラムダを使用すると、関数を定義するプロセスを節約できます。たとえば、サーバー時間を管理するための単純なスクリプトを作成する必要がある場合は、関数を具体的に定義してから、ラムダを使用して記述して呼び出す必要はありません。コードをより合理化する
より抽象的で、プログラム全体の実行後に1〜2回呼び出すだけでよい関数の場合、関数に名前を付けるのが面倒な場合があります。ラムダを使用すると、名前の問題を考慮する必要がありません。
通常のdiaosi関数の読み取りは、多くの場合、最初のdef定義部分に転送する必要があるため、コードの読みやすさを簡素化します。ラムダ関数を使用すると、そのような手順を節約できます。
def Fun(x):return x *2+ x
print(Fun(5))
# 結果は次のとおりです。
15
g = lambda x : x *2+ x
print(g(5))
# 結果は次のとおりです。
15
# 上記の結果から、2つのコードの結果は同じであり、ラムダはコードの量を単純化できることがわかります。
filter()filter。filter()関数は、シーケンスをフィルター処理し、条件を満たさない要素をフィルターで除外し、イテレーターオブジェクトを返すために使用されます。リストに変換する場合は、list()を使用して変換できます。
1つ目は関数、2つ目はシーケンスの2つのパラメーターを受け取る必要があります。シーケンスの各要素は、パラメーターとして関数に渡されて判断され、TrueまたはFalseが返されます。最後に、Trueを返す要素が新しいリストに配置されます。例を挙げましょう:
print(filter(None,[0,1,False,True]))print(list(filter(None,[0,1,False,True])))
# 結果は次のとおりです。次の結果から、フィルター機能が以前のNoneをフィルターで除外し、新しいリストを出力できることがわかります。
< filter object at 0x0345D0D0>[1, True]
# 0から9のリストを作成し、奇数を削除します
def odd(x):return x %2
temp =range(10)
show =filter(odd,temp)print(list(show))
# 結果は次のとおりです。
[1,3,5,7,9]
# 上で関数が定義されており、さらに多くのコードがあることがわかります。ラムダ式が使用されている場合は、見てみましょう。
print(list(filter(lambda x : x %2,range(10))))
# 結果は次のとおりです。
[1,3,5,7,9]
# ラムダ式を使用すると、Pythonにとって非常に美しいコード行を取得できることがわかります。
map()は、提供された関数に従って指定されたシーケンスをマップします。
最初のパラメータ関数は、パラメータシーケンスの各要素を使用して関数関数を呼び出し、各関数関数の戻り値を含む新しいリストを返します。
print(list(map(lambda x : x * x ,range(5))))
# 結果は次のとおりです。
[0,1,4,9,16]
再帰とは何ですか?再帰とは、関数内で自分の関数を呼び出すことで、再帰と呼ばれます。
sysモジュールはpythonで呼び出すことができます。sys.setrecursionlimit(100)#再帰レベルの数を設定できます。python3のデフォルトは100レベルです。
整数の因数分解を見つけます。たとえば、5を指定すると、因数分解は5 * 4 * 3 * 2 * 1になります。
# 関数を使用しない場合、この因数分解はどのように記述されるべきですか?これは、for関数を使用するだけで実現できます。
multiplication =1
n =int(input('番号を入力してください:'))for i inrange(1,n):
multiplication *= i
print(multiplication)
# 関数を使用して記述する必要がある場合はどうなりますか?しかし、それは非再帰的なバージョンです。
def factorial(n):
result = n
for i inrange(1,n):
result *= i
return result
number =int(input('正の整数を入力してください:'))
result =factorial(number)print("%dの因数分解は次のとおりです。%d"%(number,result))
# 再帰バージョンは次のとおりです
def factoria2(m):if m ==1:return1else:return m *factoria2(m-1)
number2 =int(input('正の整数を入力してください:'))
result2 =factoria2(number2)print("%dの因数分解は次のとおりです。%d"%(number2,result2))
def rabbit(n):if n ==1 or n ==2:
rabbit_num =1else:
rabbit_num =rabbit(n-1)+rabbit(n-2)return rabbit_num
print(rabbit(int(input("整数を入力してください:"))))
# 結果は次のとおりです。
整数を入力してください:206765
def hanoi(n,x,y,z):if n ==1:print(x,'-->',z)else:hanoi(n-1,x,z,y) #nの前-1つのプレートがxからyに移動しました
print(x,'-->',z) #n番目のプレートをxからzに移動します
hanoi(n-1,y,x,z) #N on y-1枚のプレートがzに移動します
n =int(input('番号を入力してください:'))hanoi(n,'X','Y','Z')
# 結果は次のとおりです。
番号を入力してください:4
X --> Y
X --> Z
Y --> Z
X --> Y
Z --> X
Z --> Y
X --> Y
X --> Z
Y --> Z
Y --> X
Z --> X
Y --> Z
X --> Y
X --> Z
Y --> Z
Recommended Posts