Pythonカスタム関数の基礎


1フォーマット:
def functionName(パラメータリスト):
メソッドボディ
例1:
>>>def greet_user():
        print(“hello”)
>>>greet_user()
hello

 
例2:
>>>def greet_user(username): #username  
       print(“hello,”+ username+“!”)
>>>greet_user(“zhangsan”)#zhangsan   
hello, zhangsan!

関数定義に複数のパラメータが含まれる場合があるため、関数呼び出しに複数の実パラメータが含まれる場合もあります.関数に実パラメータを伝達する方法は多く、位置実パラメータを使用することができ、これは実パラメータの順序と形パラメータの順序が同じであることを要求する.キーワードパラメータも使用できます.各実パラメータには変数名と値から構成されています.リストや辞書も使用できます.
                                                       
(1)位置実パラメータ
実パラメータの順序とパラメータの順序が同じであることが要求される
例:
        
def describe_pet(animal_type,pet_name):
                   print(“
 I have a”+animal_type+”.”)                    print(“My ”+animal_type+”’sname is ”+pet_name+”.”)  describe_pet(‘hamster’,’harry’)

2つのパラメータの位置が交換されると、表現の意味が間違ってしまいます.
このような伝参方式は最も理解されるべきで、大部分の言語はこのような伝参方式である.
(2)デフォルトパラメータ
関数を記述するときに、各パラメータにデフォルト値を指定できます.呼び出し関数でパラメータに実パラメータが指定されている場合、Pythonは指定された実パラメータを使用します.そうでない場合はデフォルト値を使用します.
def describe_pet(pet_name,animal_type=‘dog’):
    print(“
 I have a”+animal_type+”.”)     print(“My ”+animal_type+”’sname is ”+pet_name+”.”)

注:デフォルトパラメータを使用する場合は、デフォルト値のないパラメータをリストしてから、デフォルト値のあるパラメータをリストする必要があります.
もちろん、デフォルト値は文字列、数字などではなく、さまざまなシーケンスもサポートされています.
def f(a, L=[]):
    L.append(a)
    return L
 
print(f(1))
print(f(2))
print(f(3))

 
出力結果は
[1]
[1, 2]
[1, 2, 3]
 
間で共有されるデフォルト設定を呼び出したくない場合は、このように書くことができます.
def f(a, L=None):
    if L is None:
        L = []
    L.append(a)
    return L

Javaの単例モードの怠け者式に似ているような気がしますが、これとは比べものになりません.
 
(3)キーワード実パラメータ
キーワードの実パラメータは、関数に渡される名前-値のペアです.名前と値を実パラメータに直接関連付けるので、関数に実パラメータを渡すときに混同されません.
def parrot(voltage, state='a stiff', action='voom',type='Norwegian Blue'):
    print("--This parrot wouldn't", action, end=' ')
    print("ifyou put", voltage, "volts through it.")
    print("--Lovely plumage, the", type)
    print("--It's", state, "!")
 
parrot(1000)                                          # 1positional argument
parrot(voltage=1000)                                  # 1 keywordargument
parrot(voltage=1000000,action='VOOOOOM')             # 2 keywordarguments
parrot(action='VOOOOOM',voltage=1000000)             # 2 keywordarguments
parrot('amillion', 'bereft of life', 'jump')        # 3 positional arguments
parrot('athousand', state='pushing up the daisies') # 1 positional, 1 keyword

実行後の結果
>>>
===========RESTART: D:/python/pythonLearning/KeywordArguments.py ===========
-- This parrotwouldn't voom if you put 1000 volts through it.
-- Lovelyplumage, the Norwegian Blue
-- It's a stiff!
-- This parrotwouldn't voom if you put 1000 volts through it.
-- Lovelyplumage, the Norwegian Blue
-- It's a stiff!
-- This parrotwouldn't VOOOOOM if you put 1000000 volts through it.
-- Lovelyplumage, the Norwegian Blue
-- It's a stiff!
-- This parrotwouldn't VOOOOOM if you put 1000000 volts through it.
-- Lovelyplumage, the Norwegian Blue
-- It's a stiff!
-- This parrotwouldn't jump if you put a million volts through it.
-- Lovelyplumage, the Norwegian Blue
-- It's bereftof life !
-- This parrotwouldn't voom if you put a thousand volts through it.
-- Lovelyplumage, the Norwegian Blue
-- It's pushingup the daisies !
 
しかし、次の呼び出し方法は間違っています.
parrot()#必要なパラメータは入力されていません
parrot(voltage=5.0,'dead')#キーワードパスの後ろにあるのもキーワードパスに違いない
parrot(110,voltage=220)#同じパラメータが異なる実パラメータを伝達
parrot(actor='John Cleese')#関数定義にはこのパラメータはありません.
キーワード実パラメータの後に位置実パラメータを追加することはできません.
必須パラメータがない場合は、エラーが表示されます.
必須パラメータが位置実パラメータで渡される場合、デフォルトパラメータはキーワード実パラメータで渡されてもよいし、位置実パラメータで渡されてもよいし、この場合、必須パラメータは必ずデフォルトパラメータの前にある.
必須パラメータがキーワード実パラメータで渡される場合、デフォルトパラメータが渡される場合も、位置に関係なくキーワード実パラメータで渡されるに違いありません.
キーワード実パラメータのキーワードは、パラメータにある必要があります.そうしないと、エラーが発生します.
(4)任意多数のパラメータ"*"
最も頻繁に使用されないオプションは、任意の数のパラメータを使用して呼び出すことができる関数を指定することです.これらのパラメータはメタグループに包まれます.可変数のパラメータの前に、0以上の通常のパラメータが発生する可能性があります.
def write_multiple_items(file, separator, *args):
   file.write(separator.join(args))

 
通常、可変パラメータはパラメータリストの最後に表示されます(デフォルトパラメータが含まれている場合、デフォルトパラメータは可変パラメータの後ろに表示されます.また、辞書パラメータも可変パラメータの後に表示されます.辞書パラメータも可変パラメータであるため).
可変パラメータの後ろにあるパラメータは、キーワードの実パラメータでのみ伝達でき、位置の実パラメータ伝達では使用できません.
def concat(*args, sep="/"):
    return sep.join(args)
 
print(concat("earth", "mars", "venus"))
print(concat("earth", "mars", "venus",sep="."))

結果:
>>>
===========RESTART: D:/python/pythonLearning/KeywordArguments.py ===========
earth/mars/venus
earth.mars.venus
(5)辞書タイプのパラメータ「**」が必要
次の例では、*keywordsは辞書タイプのパラメータを表し、*は必ず**の前にします.
def cheeseshop(kind, *arguments, **keywords):
    print("--Do you have any", kind, "?")
    print("--I'm sorry, we're all out of", kind)
    for arg inarguments:
        print(arg)
   print("-" * 40)
    keys =sorted(keywords.keys())
    for kw in keys:
        print(kw,":", keywords[kw])

このように呼び出すことができます
        cheeseshop("Limburger", "It's very runny, sir.",

          "It's really very, VERY runny, sir.",
          shopkeeper="Michael Palin",
          client="John Cleese",
          sketch="Cheese Shop Sketch")
もちろん結果は次のとおりです.
         >>>
===========RESTART: D:/python/pythonLearning/KeywordArguments.py ===========
-- Do you haveany Limburger ?
-- I'm sorry,we're all out of Limburger
It's very runny,sir.
It's reallyvery, VERY runny, sir.
----------------------------------------
client : JohnCleese
shopkeeper :Michael Palin
sketch : CheeseShop Sketch
(6)Unpacking Argument Lists
これは前にリストにデータを組み合わせたのとは逆の操作です.リストのデータを開梱して、中のデータを全部取り出して使います.ちょっとわかりにくいですが、例を見てみましょう.
 
>>> list(range(3,6))
[3, 4, 5]
>>> args=[3,6]
>>> list(range(*args))
[3, 4, 5]
>>> args=(3,6)
>>> list(range(*args))
[3, 4, 5]

>>>ここでargsのデータを開梱操作し、中のデータをrangeのパラメータリストとする.明らかに、この開箱操作はメタグループにも適用できる.
 
また、辞書に対して開梱操作を行うもよく、必要とするのは2つの*番号でよい.
def parrot(voltage, state='a stiff',action='voom'):
   print("-- This parrot wouldn't", action, end=' ')
   print("if you put", voltage, "volts through it.",end=' ')
   print("E's", state, "!")

 
d = {"voltage": "fourmillion", "state": "bleedin' demised","action": "VOOM"}
parrot(**d)
 
結果:
>>>
=========== RESTART:D:/python/pythonLearning/KeywordArguments.py ===========
-- This parrot wouldn't VOOM if you putfour million volts through it. E's bleedin' demised !
>>> 
(7)lambda式
Lambdaキーワードを使用して、小さな匿名関数を作成できます.この関数は、2つのパラメータの合計lambda a,b:a+bを返します.
Lambda関数は、任意の関数オブジェクトに使用できます.彼らは文法的に単一の表現に限られている.意味的には、彼らは正常な関数で定義された文法糖にすぎない.ネストされた関数定義は類似しており、lambda関数は含む範囲から変数を参照できます.(後の記事ではlambda式に関する操作を詳しく説明します)
def make_incrementor1(n):
    return lambdax:x+n
 
f=make_incrementor1(42)
 
print(f(1))
 
>>>
=========== RESTART:D:/python/pythonLearning/KeywordArguments.py ===========
43
>>> 
(8)Function Annotations関数注記
まず簡単な例です
def f(ham:str,eggs:str='eggs2')->str:
   print("Annotations:",f.__annotations__)
   print("Arguments:",ham,eggs)
   return str(ham)+' and ' +eggs
s=f(‘abc’)
print(s)
結果:
>>>
=========== RESTART:D:/python/pythonLearning/KeywordArguments.py ===========
Annotations: {'ham': ,'eggs': , 'return': }
Arguments: abc eggs2
abc and eggs2
>>>  
 
関数注記は、この関数が返すタイプがどのようなタイプであるべきか、関数パラメータがどのようなタイプであるべきかを示す完全にオプションのメタデータ情報です.しかし、他のタイプに転送するとエラーが発生する可能性があります.もちろん、これは絶対ではありません.開発者が呼び出し者にアドバイスしたにすぎません.上の例では,実パラメトリックが数字に入っても誤りは報告されない.(このpython 3.6ヘルプドキュメントの説明は頭が痛くて、散らかっていて、精神的に書いたものを理解しています)
 
注記は__に保存されます.annotations__属性には、辞書として存在し、他の部分の機能には影響しません.
≪パラメータ注釈|Parameter Comments|emdw≫:パラメータ名の後にコロンを付け、次に実パラメータを期待するタイプを付けます.
戻り値注記:関数のパラメータリストの外に、コロンの前に->を付け、戻りたいタイプを返します.