Python3関数
関数は、単一または関連する関数を実装するために使用される、編成された再利用可能なコードセグメントです。
関数は、アプリケーションのモジュール性とコードの再利用を向上させることができます。 Pythonには、print()などの多くの組み込み関数が用意されています。直接呼び出すことができます。関数を呼び出すには、関数の名前とパラメーターを知っている必要があります。ドキュメントは、Pythonの公式Webサイトから直接表示できます。
https://docs.python.org/3/library/functions.html
ヘルプ(印刷)を介してインタラクティブコマンドで印刷機能のヘルプ情報を表示することもできます。
ただし、ユーザー定義関数と呼ばれる関数を自分で作成することもできます。
# 1. 機能コードブロックはdefキーワードで始まり、その後に機能識別子名と括弧が続きます()
# 2. 入力パラメータとカスタム変数は、括弧の中央に配置する必要があります。括弧の間は、パラメータを定義するために使用できます。.
# 3. 関数の最初の行では、オプションでdocstringを使用して関数の説明を格納できます
# 4. 関数の内容はコロンで始まり、インデントされています。
# 5. reture[表現]结束函数,选择性地返回一个值调用方,不带表現的return相当于返回None.
# 関数:機能別(1つのことを達成する)指向,ログインする,登録済み,len,一个関数就是一个功能
# チューニングしながら使用
#
# 関数
# 1. コードの重複を減らす.
# 2. コードを読みやすくする.
構文:** Pythonはdefキーワードを使用して関数を定義します。一般的な形式は、次のとおりです。**
def関数名(パラメータリスト):
機能本体
# デフォルトでは、パラメーター値とパラメーター名は、関数宣言で定義された順序で照合されます.
# defキーワードは関数名で始まり、スペースの後に括弧で囲まれます(),最後に1つあります":"
# defは固定されており、変更できません,つまり、関数を定義するキーワード
# 関数名: 関数名只能包含字符串、下划线和数字且不能以数字开头。虽然関数名可以随便起,但我们给函数起名字还是要尽量简短,并且要具有可描述性
**例1 **関数を使用して「HelloWorld!」を出力します
def hello():print('hello world')hello()
# hello world
関数内にパラメータ変数がある、より複雑なアプリケーション
# 要素の数を見つける,長さ,従来の方法は低い
li1 =[1,2,3,4,5]
count =0for i in li1:
count +=1print(count)
# この関数は、リスト内の要素の数を認識します
def my_len(l):
count =0for i in l:
count +=1print(count)my_len(li1)
def area(width, height):return width * height
def print_welcom(name):print("Welcome",name)print_welcom("You-Men")
w =4
h =5print("width = ",w,"height = ",h,"area =",area(w,h))
Example2
関数の定義:関数に名前を付け、関数に含まれるパラメーターとコードブロックの構造を指定します。
この関数の基本構造が完成したら、別の関数呼び出しを介して、またはPythonコマンドプロンプトから直接実行できます。
次の例では、printme()関数を呼び出します。
# 関数が関数名に遭遇したとき+()、関数が実行されます
def printme(str):print(str)returnprintme("カスタム関数を呼び出したい")
関数の戻り値
関数は関数をカプセル化することです。この関数は通常、最終結果をもたらします。たとえば、ログイン関数を作成した場合、最終ログインは成功しますか、それとも結果を返す必要はありませんか?そして、私たち全員がlen関数を使用しましたか?オブジェクトの要素の総数を取得し、最終的に要素の数のような結果を確実に返します。
では、この戻り値をどのように設定するのでしょうか。これには、pythonのキーワードが必要です:return
def date():print("電話を取り出します")print("モモを開く")print('左スワイプ')print('右にスワイプ')print("美しい女の子を探す")returnprint("彼女に聞いて,予約なし!")print("わかった")
# 総括する
# 1. 関数でreturnが発生すると、関数は終了し、実行は続行されません。
# 2. returnは、関数の実行の値を返します
#戻り後に何も書き込まれない場合、または関数に戻りがない場合、返される結果は「なし」です。
# 戻り後に値が書き込まれた場合は、この値を呼び出し元に返します
#複数の値が返される場合、それはタプルです(タプル)の形で返される,调用者可以直接使用タプル的
上記では、関数の構造、関数の実行、関数の戻り値、関数の予備的な理解、そして関数のパラメーターについて説明しました。
関数は関数指向です。上記で記述した関数のコードはすべてハードコードされています。つまり、関数の変更は非常に面倒なので、この種のハードコードされたコードはパラメーターを渡すことで解決できます。
Pythonでは、型はオブジェクトに属し、変数には型がありません
a=[1,2,3]
a="YouMen"
上記のコードでは、** [1,2,3] はList型、 "Runoob" **はString型、変数aには型がなく、オブジェクト(ポインタ)への参照にすぎません。 List型のオブジェクトまたはString型のオブジェクトを指すことができます。
可変および不変オブジェクト
pythonでは、文字列、タプル、数字は変更できないオブジェクトですが、リスト、辞書などは変更できるオブジェクトです。
不変タイプ:変数a = 5、次にa = 10を割り当てます。これは、実際には新しく生成されたint値オブジェクト10であり、ポイントを彼に任せます。5は破棄され、aの値を変更する代わりに、aを新しく生成するのと同じです。
変数タイプ:変数割り当てla = [1,2,3,4]そして割り当てla [2] 5はリストlaの3番目の要素の値を変更することであり、la自体は変更されず、その内部値の一部のみが変更されます。編集。
Python関数パラメーターの受け渡し
不変タイプ:整数、文字列、fun(a)などのタプルなど、C ++のような値の転送。aの値のみが渡され、オブジェクト自体は影響を受けません。たとえば、fun(a)はaの値を内部的に変更しますが、別の割り当てられたオブジェクトを変更しても、それ自体には影響しません。
変数タイプ:リスト、辞書など、C ++と同様の参照渡し。たとえば、fun(la)は、実際にはlaを通過し、funの外側で変更されたlaも影響を受けます。
Pythonのすべてがオブジェクトです。厳密に言えば、値の受け渡しや参照の受け渡しとは言えません。不変のオブジェクトと可変のオブジェクトの受け渡しと言う必要があります
Pythonは不変のオブジェクトインスタンスを渡します
def ChangeInt(a):
a =10
b =2ChangeInt(b)print(b)
# 上記の例の結果は次のとおりです。:
# この例にはintオブジェクト2があり、それを指す変数はbです。,ChangeInt関数を渡すと、変数bが値によってコピーされ、aとbの両方が同じIntオブジェクトを指します。=10時に、新しいint値オブジェクト10が生成され、彼をポイントします。
変数オブジェクトインスタンスを渡す****変数オブジェクトは関数内のパラメーターを変更し、次に元のパラメーターもこの関数を呼び出す関数内で変更されます。たとえば、
# 書き込み可能な機能の説明
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]]
以下は、関数の呼び出しに使用できる正式なパラメータータイプです。
パラメータは正しい順序で関数に渡される必要があり、パラメータの数は宣言の数と同じである必要があります
printme()関数を呼び出すには、パラメーターを渡す必要があります。そうしないと、構文エラーが発生します。
# 書き込み可能な機能の説明
def printme(str):"着信文字列を印刷します"print(str)
# return
# パラメータは報告されません
printme('Hello')
キーワードパラメータは関数呼び出しと密接に関連しています。関数呼び出しはキーワードパラメータを使用して、渡されたパラメータの値を決定します。
Pythonインタープリターはパラメーター値をパラメーター名と照合できるため、キーワードパラメーターを使用すると、関数呼び出しの順序を宣言の順序とは異なるものにすることができます。
次の例では、関数printme()を呼び出すときにパラメーター名を使用します。
# 2つの数字のみを受け入れる関数を書く,intパラメータ、関数関数はより大きな数を返します
def sum(a,b):if a > b:return a
elif a == b:return"等しい"else:return b
print(sum(2,2))
# 実際の角度
# 1. ロケーションパラメータ,順番に、1対1の対応
# 2. キーワードパラメータ,1対1の対応
# 3. 混合パラメータ,位置パラメータは、キーワードパラメータの前にある必要があります
次の例は、関数パラメーターの使用に指定された順序が必要ないことを示しています
def printfo(name,age):print("ファーストネーム",name)print("年齢",age)returnprintfo(age=10,name='youmen')
# あなたに名前を付ける
# 10歳
関数を呼び出すときに、パラメーターが渡されない場合はデフォルトのパラメーターが使用されます。次の例でageパラメーターが渡されない場合は、デフォルト値が使用されます
# 設定の意味は、一般的に使用されることにあります
# 書き込み可能な機能の説明
def printfo(name,age=15):"着信文字列を印刷します"print("ファーストネーム",name)print("年齢",age)returnprintfo(age=50,name='YouMen')print("--------------")printfo(name='Flying')
# YouMenに名前を付けます
# 50歳--------------
# 名前フライング
# 15歳
最初に宣言されたよりも多くのパラメーターを処理できる関数が必要になる場合があります。これらのパラメーターは不定長パラメーターと呼ばれ、上記の2種類のパラメーターとは異なり、宣言時に名前が付けられません。基本的な構文は次のとおりです。
# 書き込み可能な機能の説明
def printfo(arg1,*vartuple):"入力パラメータを出力します"print("出力:")print(arg1)print(vartuple)
# printfo関数を呼び出す
printfo(30,40,50,60)
# 出力:
# 30
# (40,50,60)
2つのアスタリスクが付いたパラメーターもあります基本的な構文は次のとおりです:**
# 書き込み可能な機能の説明
def printfo(arg1,**vardict):print("出力:")print(arg1)print(vardict)printfo(1234,a=2,b=3)
# 2つのアスタリスクを追加しました**辞書としてインポートされます
# 出力:
# 1234
# {' a':2,'b':3}
*のみの後のパラメータである場合は、キーワードを付けて渡す必要があります。
# 書き込み可能な機能の説明
def printfo(a,b,*,c):print("出力:")print(a)print(b)print(c)printfo(1,2,c=3)
# printfoの場合(1,2,3)エラーを報告します
# 出力:
# 1
# 2
# 3
( args)*
# ユニバーサルパラメータ
# * args,従来名,
# * 関数定義,*代表的な集計,彼はすべての位置パラメータをプリミティブな祖先に集約し、それを引数に割り当てます
# 関数を書く:関数に渡すすべての数値の合計を計算します
def func(*args):
count =0for i in args:
count += i
return count
print(func(1,2,3,4,5,6,7))
*(*kwargs)
# **kwargs
# 関数定義,**すべてのキーワードパラメータを辞書に集約します,この辞書をkwargsに割り当てました
def func(**kwargs):print(kwargs)func(name='youmen',age=18,sex='boy')
# {' name':'youmen','age':18,'sex':'boy'}
def func(a,b,*args,sex='男性',c,**kwargs):print(a,b)print(sex)print(args)print(c)print(kwargs)func(1,2,3,4,5,6,sex='女性',c=60)
# 12
# 女性
# (3,4,5,6)
# 60
# {}
Pythonはラムダを使用して匿名関数を作成します。いわゆる匿名とは、関数を定義するためにdefステートメントの標準形式を使用しなくなったことを意味します。
文法
# ラムダ関数の構文には、次のように1つのステートメントしか含まれていません。:
lambda [arg1 [,arg2,....argn]]:expression
# 次の例:
# 書き込み可能な機能の説明
sum = lambda arg1,arg2 : arg1 + arg2
# 合計関数を呼び出す
print("付加価値は:",sum(10,20))print("付加価値は:",sum(20,20))
付加価値は:30
付加価値は:40
return [expression]ステートメントは、関数を終了し、オプションで式を呼び出し元に返すために使用されます。パラメータ値のないreturnステートメントはNoneを返します。前の例では、値を返す方法を示していませんでした。次の例は、returnステートメントの使用法を示しています。
# 書き込み可能な機能の説明
def sum(arg1,arg2):"2つのパラメータの合計を返します"
total = arg1 + arg2
print("内部機能:",total)return total
# 合計関数を呼び出す
total =sum(10,20)print("機能外:",total)
内部機能:30
機能外:30
def f(a, b,/, c, d,*, e, f):print(a, b, c, d, e, f)
# 次の使用方法が正しい:f(10,20,30, d=40, e=50, f=60)
次の方法ではエラーが発生します:f(10, b=20, c=30, d=40, e=50, f=60) #bキーワードパラメータの形式は使用できません
f(10,20,30,40,50, f=60) #eはキーワードパラメータの形式を使用する必要があります
pythonインタープリターが実行を開始すると、メモリ内のスペースが開きます。変数が検出されると、変数名と値の関係が記録されますが、関数定義が検出されると、インタープリターは関数名をメモリに読み込むと、関数が存在することがわかります。関数内の変数とロジックについては、インタプリタは気にしません。つまり、関数が呼び出されたときにのみ、関数が最初に読み込まれるだけです。アクセス時に、インタプリタは関数内で宣言された変数に従って変数の内部スペースを開きます。関数が実行されると、関数の内部変数が占めるスペースも関数の実行時にクリアされます。
まず、関数に遭遇したときにPythonコードがどのように実行されるかを思い出してみましょう。Pythonインタープリターの実行が開始されると、メモリにスペースが開かれます。変数に遭遇すると、変数の名前と値が分離されます。対応する関係が記録されますが、関数定義に遭遇すると、インタプリタは関数名をメモリとしてシンボリックに読み取るだけで、関数が存在することを認識していることを示します。関数内の変数とロジックについては、インタプリタはまったく気にしません。
関数が呼び出されると、Pythonインタープリターは関数の内容を格納するためにメモリを開きます。このとき、関数内の変数に注意し、関数内の変数は新しく開いたメモリに格納されます。関数内の変数は関数内でのみ使用でき、関数が実行されると、このメモリのすべての内容がクリアされます。
この「名前と値の関係を保存する」という名前、つまり名前を付けました。
コード実行の開始時に、「変数名と値の関係」を格納するために作成されたスペースは、グローバル名前名と呼ばれます。関数の操作中に作成される一時スペースは、ローカル名前名または一時名前名と呼ばれます
pyファイルでは、変数と値の関係を格納するスペースはグローバル名前名と呼ばれ、関数が実行されると、変数と値の関係を関数に一時的に格納するためのスペースがメモリに一時的に開かれます。これは一時的な名前名と呼ばれます。またはローカル名前名。
組み込みネームスペースと呼ばれるpythonのスペースもあります。組み込みネームスペースには、すぐに使用できる組み込み関数(input、print、listなど)などの特別な変数が格納されます。
# 1. グローバルネームスペース--->pyファイルで直接、関数の外部で宣言された変数はグローバル名前名に属します
# 2. ローカル名前名--->関数で宣言された変数は、ローカル名前名に格納されます
# 3. 組み込みの名前付け--->pythonインタープリターから提供された名前を保存します,list,tuple,str,これらは組み込みの名前空間です.
いわゆるロード順序とは、これら3つのスペースがメモリにロードされる順序、つまり、これら3つのスペースがメモリに作成される順序です。これらは同時に作成できると思いますか?確かにそうではないので、誰が最初に来るのでしょうか?簡単に見てみましょう。Pythonインタープリターを開始した後、変数や関数が作成されていなくても、Pythonインタープリターを開始すると、abs(-1)、max(1,3)などの直接使用できる関数がいくつかあります。使用するためにすでにメモリにインポートされているため、最初に組み込みの名前名をロードしてから、ファイルの先頭から次の行まで実行を開始する必要があります。この時点で、初期化変数が検出されると、グローバル名前付けが作成されます。 、これらの対応をに格納し、関数の実行時にメモリ内のスペースを一時的に開いたり、関数にいくつかの変数をロードしたりします。したがって、これら3つのスペースのロード順序は次のとおりです。組み込みネームスペース(プログラム操作の開始時にロード)->グローバルネームスペース(プログラム実行中:上から下にロード)->ローカルネームスペース(プログラム実行中:呼び出された場合にのみロード)。
値の順序は変数を参照することです。参照を開始するスペースから、重要なポイントがあります。この変数を参照するためにそのスペースから開始して、例を示します。
# グローバル名前付けで変数を参照する場合は、最初にローカル名前付けを参照し、そうでない場合はグローバル名を参照し、次に組み込み名前名を参照します
# sum=666print(sum)
def func():
# sum =555print(sum)func()
name='flying'
def func():
# name='youmen'print(name)func()
# バリューオーダー(近接の原理)
# から(ローカル変数ルックアップ)ローカル名前名--->グローバルネームスペース--->ビルトインネームスペース
スコープはスコープのスコープであり、有効なスコープを制御してグローバルスコープとローカルスコープを確認します
グローバルスコープ:組み込みの名前空間とグローバル名前空間が含まれ、ファイル全体のどこでも使用できます(上から下への行ごとの実行に従います)
ローカルスコープ:関数内で使用できます
スコープ名義
# 1. グローバルスコープ:グローバルネームスペース+組み込みの名前付け
# 2. ローカルスコープ:ローカル名前名
def func1():print('in fun1')print(3)
def fun2():print('in fun2')print(4)func1()print(1)fun2()print(2)
# in fun1
# 3
# 1
# in fun2
# 4
# 2 print("#############################")
def fun2():print(2)
def func3():print(6)print(4)func3()print(8)print(8)fun2()
func()
# 1. 関数名は、関数のメモリアドレスを指します.
# 関数名+()機能を実行できます
# 2. 関数名は変数です,変数なので割り当て可能
# 3. 関数名は、コンテナデータタイプの要素として使用できます
def fun1():print("in fun1")
def fun2():print("in fun2")
def fun3():print("in fun3")
li1 =[fun1,fun2,fun3]for i in li1:i()
# 4. 関数名は関数パラメーターとして使用できます
def func():print('in func')
def func1(x): # x = func
print('in func1')return x
ret =func1(func)ret()
# プログラムでグローバルスコープの一部の変数を変更するためにローカルスコープが必要になった場合は、キーワードglobalを使用できます。:
# グローバルファースト機能:グローバルスコープの変数はローカルスコープで変更できます.
a =1
def func():print(a)func()
# a =1
def func():
global a
a +=1print(a)func()
Recommended Posts