Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
61
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

Python3系の基礎文法(関数の使い方、クロージャ、ラムダ関数)

概要

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]
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
61
Help us understand the problem. What are the problem?