概要
O'Reilly Japan の「入門 Python 3」を参考に、Python3系の基礎文法を勉強します。
同じようにPythonを勉強したいと思ってる方の参考になれば幸いです。
##関数の基本的な使い方
###関数の定義
>>> def print_sum(num1, num2):
... print(num1 + num2)
###関数の呼び出し
>>> print_sum(10, 20)
30
関数定義で使われる引数のことを仮引数(parameter)、
呼び出し時に渡される引数のことを実引数(argument)と呼ぶ。
##位置引数
先頭から順に対応する位置の仮引数に値をコピーする引数のことを「位置引数」と呼ぶ。
>>> def print_args(arg1, arg2, arg3):
... print('arg1:', arg1, 'arg2:', arg2, 'arg3:', arg3)
...
>>> print_args(1111, True, 'Python')
arg1: 1111 arg2: True arg3: Python
##キーワード引数
仮引数の名前を指定して実引数を指定することもでき、この場合は「キーワード引数」として扱われる。
>>> def print_args(arg1, arg2, arg3):
... print('arg1:', arg1, 'arg2:', arg2, 'arg3:', arg3)
...
>>> print_args(arg2='two', arg1='one', arg3='three')
arg1: one arg2: two arg3: three
##デフォルト引数値の指定
仮引数にデフォルト値を指定することもできる。
呼び出し元が対応する実引数を渡さなかった場合に、デフォルト値が使われる。
>>> def print_args(arg1, arg2, arg3='default value'):
... print('arg1:', arg1, 'arg2:', arg2, 'arg3:', arg3)
...
>>> # デフォルト値が使われる場合(実引数を渡していない)
>>> print_args('one', 'two')
arg1: one arg2: two arg3: default value
>>>
>>> # デフォルト値が使われない場合(実引数を渡している)
>>> print_args('one', 'two', 'three')
arg1: one arg2: two arg3: three
##による位置引数のタプル化
関数定義時に、仮引数の一部としてを使うと、可変個数の位置引数をタプルにまとめてセットする。
>>> def print_args(*args):
... print('args tuple:', args)
...
>>> # 引数を複数個指定
>>> print_args('one', 'two', 'three')
args tuple: ('one', 'two', 'three')
>>>
>>> # 引数なし
>>> print_args()
args tuple: ()
必須の位置引数がある場合には、下記のような使い方も可能。
>>> def print_args(arg1, arg2, *args):
... print('arg1:', arg1)
... print('arg2:', arg2)
... print('args:', args)
...
>>> print_args('one', 'two', 1, 10, 100)
arg1: one
arg2: two
args: (1, 10, 100)
##**によるキーワード引数の辞書化
関数定義時に、**を使うと、キーワード引数を辞書にまとめてセットすることができる。
>>> def print_kwargs(**kwargs):
... print('kwargs:', kwargs)
...
>>> print_kwargs(arg1='one', arg2='two', arg3='three')
kwargs: {'arg1': 'one', 'arg2': 'two', 'arg3': 'three'}
##引数に関数をセット
関数の引数として関数を扱ったり、関数からの戻り値として関数を返したりできる。
>>> def print_string():
... print('print_string')
...
>>> def execute_func(arg_func):
... arg_func()
...
>>> execute_func(print_string)
print_string
##関数内関数
関数の中で関数を定義することもできる。
>>> def outer():
... def inner():
... print('inner function')
... inner()
...
>>> outer()
inner function
###クロージャ
関数内関数をクロージャとして機能させ、動的に関数を生成することも可能。
>>> def todays_weather(arg1):
... def return_weather():
... return 'It’s ' + arg1 + ' today.'
... return return_weather
...
>>> day1 = todays_weather('sunny')
>>> day2 = todays_weather('cloudy')
>>>
>>> day1()
'It’s sunny today.'
>>> day2()
'It’s cloudy today.'
##ラムダ関数
ラムダ関数を使わない実装
>>> def return_sum(num1, num2):
... return num1 + num2
...
>>> print('answer:', return_sum(10, 20))
answer: 30
ラムダ関数を使った実装
>>> return_sum = lambda num1, num2 :num1 + num2
>>> print('answer:', return_sum(10, 20))
answer: 30
###map()と組み合わせたラムダ関数の活用例
map()と組み合わせると、引数で渡されたリストのようなiterablesな要素を、
funcに渡して処理してくれる下記のような実装も可能。(※1)
[追記]
※1:値を返す場合に限られ、内容は式のみで文(if文、for文、while文など)は書けない。
[/追記]
>>> help(map)
Help on class map in module builtins:
class map(object)
| map(func, *iterables) --> map object
|
| Make an iterator that computes the function using arguments from
| each of the iterables. Stops when the shortest iterable is exhausted.
実装例
>>> num_list = list(range(1, 6))
>>> num_list
[1, 2, 3, 4, 5]
>>>
>>> list(map(lambda x: x**2, num_list))
[1, 4, 9, 16, 25]