デカ文字Python

デカ文字&短文でPythonを簡潔にまとめたブログ

Python SoloLearn Pythonicness & Packaging

 

Sololearnも最後になってきました。

 

 

 

Function Arguments

*args

Using *args as a function parameter enables you to pass an arbitrary numeber of arguments to that function.

 defで関数を定義する際、関数のパラメータを指定するが、Pythonという言語はそのパラメータの個数に煩い。その例を書いてみる。

def func(a, b):
print(a,b)

func(1,2,3)
>>>TypeError: func() takes 2 positional arguments but 3 were given

 def funcで定義したパラメータの数がa,bの二つだけだから、それ以上の変数を渡すとこのようにエラーになってしまう。

エラーを起こさないようにするにはどうしたらいか。定義の際に、

def func(a, b, c):

とすれば早い話なのだが、それでも四つ以上の変数を渡す際はエラーが生じてしまう。そもそも定義時において、将来何個の変数を渡す関数にするかなんて前もって決めることは難しい。

そうしたときに活躍するのが、パラメータ*argなのである。

これはタプルとして定義されるパラメータである。

def func(a, *args):
print(a, args)

func(1,2,3)
>>>1 (2, 3)

パラメータargsの位置にある2,3はタプル(2,3)としてfuncに渡された。

 

**kwargs

**kwargs allows you to handle named arguments that you have not defined in advance.

The keyword arguments return a dictionary in which keys are the arguments names ,and the values are the argument values.

def func()においてパラメータに**kwardを設定しておけば、その関数は引数に代入式を入れるだけで辞書型を渡すことができる。

def func(a, **kwargs):
print(a, kwargs)


func(2, c=5)
>>>2 {'c': 5}

 

こんなまどろっこしいことせずとも、
引数を辞書型で直接渡せばいいだけでは……

 

と思うのはぼくだけか……

def func(a, b):
print(a, b)


func(2, {"c":5})
>>>2 {'c': 5}
 

 

引数内で、パラメータに使った文字に代入する形を書くと、

()で括ることでグループ化できる。 グループを含むmatchオブジェクトは数字の引数で呼び出すことができる。

 

__main__

Most Python code is either a module to be imported, or a script that does something.However, sometimes it is useful to make a file that can be both imported as a module and run as a script.

 modulesというのは便利なもので、関数、クラスみたいな名前空間の一種として、関数を含む変数を保存することができる。

fname.py
def func(a, *args):
print(a, args)
main.py
import fname
func.func(1,2,"s")
>>>1 (2, 's')

 fnameというmodule内で定義した(保存した)func関数を、main内において、fnameをimportすることで呼び出した。

 

関数を使うために公式ライブラリをimportする
いつもの方法もこれを利用しているんだね

 

 しかしこのimportというのが曲者で、moduleをimportすると、そのmodule内に記載されたコードを全て実行する、ということになってしまっている。

fname.py
def func(a, *args):
print(a, args)

print("This is fname code")
main.py
import fname
func.func(1,2,"s")

>>>This is fname code
1 (2, 's')

別moduleに保存された関数を使いたいだけなのに、そのたび毎にそのmoduleが実行されたらたまったものではない。

 

これを制御する方法として使われるのが、予約変数__name__だ。この予約変数__name__は実行元のmoduleにおいては"__main__"になり、呼び出し先のmoduleにおいてはそのmodule名になる、という特性がある。

fname.py
print(__name__)
main.py
print(__name__
)

>>>fname
__main__

これを利用するのだ。

 

fname.py
def func():
print("This is fname's func")


if __name__ == "__main__":
print("fname is __main__ code")
main.py
import fname
fname.func()

>>>This is fname's func

 

Sololearnはこれまで。最後までありがとうございました。