python3.doc_09
R e i - D r e a m
for Laravel
TOP > Python3 > Python基本(関数)
Guest
login

最終投稿日:2022年6月18日

Python基本(関数)
コメント
関数内にコメントを入れ、参照する事ができる 例)
def hoge( a, b ):
    """
    これはhoge関数です。                                          ※["""]と["""]の間がコメントとなる
    """
    return a + b
print( hoge.__doc__ )                                               ※コメントの部分を参照できる
基本
def add( a, b ):                                          ※[def]関数の宣言、[add]関数名(任意の名前)
    return a + b
● キーワード引数
引数を渡す際に引き渡す変数名を指定する事ができる
例)
add( a = 1, b = 2 ) ※受け手側の変数名を指定できる
※ただし、最初にキーワードを指定すると、以降の引数もキーワード付きにする事
add( 1, 2 )
add( 1, b = 2 )
add( 1, a = 2 )                                          ※エラー      2つの引数を[a]に渡そうとしている
add( a = 1, 2 )                                          ※エラー      構文エラー
● 可変長引数
動的に引数の数を変更したい場合[*]を付与して受ける
例)
def add( *values ):
    result = 0
    or v in values:
        result += v
    return result
print( add(1,2,3) ) ※6となる
hoge = [ 1, 2, 3 ]
print( add( *hoge ) )                      ※リストを渡す場合は渡し手も[*]を付与する。
                                                              ※タプル型、セット型でも同様の動きをします
print( add( 1, 2, 3 ) )                      ※上と同じ動き。こういう場合が可変長が必要となる
【メモ】
あくまで可変長の引数にする可能性がある場合のみ[*]を意識する。
リスト変数を引数にし、リスト変数で受ける場合は[*]は不要です。
● キーワードの可変長引数
動的に引数の数を変更したい場合[**]を付与して受ける
例)
def add( values ):
    result = 0
    for v in values:
        result += v
    return result
def sumKeyVal( **keyVal ):        ※可変長の辞書型を受ける
    result = dict()                               ※辞書型変数を宣言
    for k, v in keyVal.items():
        result[k] = add( v )                 ※取り出した値をaddメソッドで集計する ※値が全てリスト型を前提としている
    return result
print( sumKeyVal( a = [1], b = [ 1, 2 ], c = [ 1, 2, 3, 4, 5 ] ) )      ※{'b': 3, 'a': 1, 'c': 15}となる
hoge = { 'a':[10], 'b':[1,2] }
print( sumKeyVal( **hoge ) )        ※メソッド側に合わせ[**]を付与する
● キーワードオンリー引数
メソッドを呼び出す際に必ずキーワード引数にしてもらいたい場合は単独で[*]を引数に追加する
例)
def keyHisu( *, a, b ):
    return a + b
print( keyHisu( a = 1, b = 2 ) )                                          ※必ずキーワード付きで引数を渡す
def keyHisu( a, *, b ):
    return a + b
print( keyHisu( 1, b = 2 ) )                                          ※第2引数のみキーワード必須となる
関数はオブジェクトとして扱える
例)
def myAdd( a, b):
    return a + b
def my2Add( f, a, b ):                                          ※引数fは、関数myAddのオブジェクトを受ける
    return f( a, b) + f( a, b)
f = myAdd                                                               ※関数myAddを変数fに代入
print( my2Add( f, 1, 2 ) )
関数を返す関数
例)
def add_n( n ):
    def func( m ):
        return n + m
    return func
add_4 = add_n( 4 )                                          ※メソッドadd_nは、メソッド内のメソッドfuncを返却する。
                                                                                ※格納した変数add_4は、常にパラメータn=4の状態となる。
print( add_4( 10 ) )                                          ※メソッドadd_4は、n=4で初期化されたメソッドfuncのインスタンスなので 4 + 10 = 14が表示される
無名関数
上記の例は、関数funcの内容が1行です。
1行の場合は、[lambda]式を使い無名関数にする事が可能です。
例1)
def add_n( n ):     return lambda m: n + m                                          ※lambda式です。
add_4 = add_n( 4 ) print( add_4( 10 ) )                                                ※答えは 14
例2)
def add_n( x, y ):
    return lambda a, b: a + b + x + y                                ※lambda式です。(引数はカンマで区切る)
例3)
    三項演算子を使ったラムダ式です
import re
fn = lambda n: float(n) if re.match(r'[0-9\.]+$', str(n)) else n
print(fn('10'))                                                                                                           ※結果 10.0
print(fn('hoge'))                                                                                                      ※結果 hoge
    数値に変換可能な文字はフロート型に変換します。
    更に、map 関数を使えば配列の中を再帰的に処理できます。
import re
fn = lambda n: float(n) if re.match(r'[0-9\.]+$', str(n)) else n
l = ['hoge', '10', 10, 'foo']
print(list(map(fn, l)))                                                                                          ※結果 ['hoge', 10.0, 10.0, 'foo']
例4)
ラムダ式を入れ子(ネスト)にする
-------------------
"hoge","foo","bar"
"A","1","あ"
"B","2","い"
"C","3","う"
-------------------
上記 CSV(hoge.csv)を読込み、2次元配列にします。
その際、ダブルクォーテーションを外し、数値に置換できるものはフロート型に変換します。
import os, re
dir = os.path.dirname(__file__)
fname = os.path.join(dir, 'data', 'hoge.csv')
lines = open(fname, 'r', encoding='utf-8').read().strip().split('\n')
str2float = lambda n: float(n.replace('"','')) if re.match(r'[0-9\.]+$', str(n).replace('"','')) else n.replace('"','')
cols2arr = lambda li: list(map(str2float,li.strip().split(',')))
arr_csv = list(map(cols2arr, lines))
print(arr_csv)
文字列を関数名として実行する
関数 eval を使うと文字列が python コードとして処理されます。
例)
hoge() と eval('hoge')() は同じです。
hoge.foo() と eval('hoge.foo')() は同じです。
ログインしてコメントを残そう!!


レンズモード 【新規購入限定用】
きっぷる