LoginSignup
0
0

More than 3 years have passed since last update.

配列内の要素が持つ関数を実行する

Posted at

タイトルそのままですが,配列の要素が持つ関数を実行する方法をメモ的に残したいと思って書いておきます.
配列と言いつつメモ程度なのでlistで記述してますが,そこはご愛嬌でお願いします✌︎('ω'✌︎ )

環境

  • macOS Mojave 10.14.5
  • python 3.7.3

対象読者

  • 筆者自身(万が一読まれても不快に思われない程度に書いてるつもりです)

実行方法

仮に下記のようなclassが存在するとします.

sample_class.py
class sample():
    def __init__(self, hoge, fuga):
        self.hoge = hoge
        self.fuga = fuga

    def add(self):
        return self.hoge + self.fuga

そして配列はこんな感じです.

run.py
from sample_class import sample

hogehoge = [sample(hoge=i, fuga=i*2) for i in range(10)]

当たり前ですが,以下のような実行はできません.

>>> from sample_class import sample
>>> hogehoge = [sample(hoge=i, fuga=i*2) for i in range(10)]
>>> hogehoge.add()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'list' object has no attribute 'add'

こんな風にlistオブジェクトにaddなんて関数は存在しないと怒られてしまいます.
考えれば当然ですがaddを持っているのは配列内の要素だからです.
なので要素を取り出す必要があり,取り出した要素の関数を1つずつ実行していきます.

for文で実行する

このやり方が一番わかりやすいかと思います.先ほど作成した配列hogehogeから1つずつ取り出して要素h.add()で実行しています.ただこれだけだと新しい配列にならないので,空の配列hoge_addappendで追加しています.

>>> hoge_add = []
>>> for h in hogehoge:
...     hoge_add.append(h.add())
...
>>> hoge_add
[0, 3, 6, 9, 12, 15, 18, 21, 24, 27]

内包表記を使用する

わざわざ実行してリストに追加するなら,それを1行にしてしまえ!という感じでかけます.

>>> hoge = [h.add() for h in hogehoge]
>>> hoge
[0, 3, 6, 9, 12, 15, 18, 21, 24, 27]

わざわざ空の配列を宣言する必要もなくなり,appendも不要になりました!とてもシンプルですね!

mapを使用する

一風変わって関数を使用して実行します.
mapの説明やlambdaの紹介はここでは省きます.

>>> hoge = list(map(lambda x: x.add(),hogehoge))
>>> hoge
[0, 3, 6, 9, 12, 15, 18, 21, 24, 27]

内包表記との違いは速度面などにあるみたいです.これについても詳しく知りたい方はこちらをご覧ください.

まとめ

今回は3つの方法で配列の要素の持つ関数を実行してみました.一概にどの方法がいいとかいうわけではなく,場合によっては冗長でもforで書く必要もあると思います.なので,コーディングする際の引き出し程度に覚えておくと便利かと思います.
また,この他にもっと楽な方法とかご存知の方は,コメントお待ちしてます!!

参考

map と filter ってなに?
Python の map とfor内包表記(リスト内包表記)は結局どっちが速い?
Pythonのlambdaって分かりやすい

0
0
6

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0