質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.49%

関数の引数で受け取るラムダ式を判別したい

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 433

score 10

お世話になっております。
下記のような真偽値表が出力できるリストを作成したいです。
ラムダ式を引数でとるのですが、どう扱ったらよいのかわかりません。
ぜひ、ご回答お願いいたします。

#a,bがTrueならTrue。それ以外はFalse
def AND(a,b):
    return a and b

#aかbどちらか一方がTrueならTrue。それ以外はFalse
def OR(a,b):
    return a or b

#aとbがどちらも同じならTrue。それ以外はFalse
def EQ(a,b):
    return a == b


def table(a):


(a)には【lambda a, b: AND(a, OR(a, b))】か
       【lambda a, b, c: EQ(AND(a, OR(b, c)), OR(AND(a, b), AND(a, c)))】が入る想定。

<lambda a, b: AND(a, OR(a, b))入力時の想定>
[
 [True, True, True],
 [True, False, True],
 [False, True, False],
 [False, False, False]
]

<lambda a, b, c: EQ(AND(a, OR(b, c)), OR(AND(a, b), AND(a, c)))入力時の想定>
[
 [True, True, True, True],
 [True, True, False, True],
 [True, False, True, True],
 [True, False, False, True],
 [False, True, True, True],
 [False, True, False, True],
 [False, False, True, True],
 [False, False, False, True]
]

試したこと

from itertools import product

def table(a): 
    lamb = a
    ls = []

下記でそれぞれ出力したい結果は得られるのですが、どうにか条件等指定して、
欲しい結果だけを出力させたいです。

    for x,y in product([True,False],repeat=2):
            ls.append([x,y,lamb(x,y)])

    for x,y,z in product([True,False],repeat=3):
            ls.append([x,y,z,lamb(x,y,z)])

    return ls
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+3

ラムダ式の引数の数も渡してあげるようにすると、以下のように書けます。

from itertools import product
from pprint import pprint

#a,bがTrueならTrue。それ以外はFalse
def AND(a,b):
    return a and b

#aかbどちらか一方がTrueならTrue。それ以外はFalse
def OR(a,b):
    return a or b

#aとbがどちらも同じならTrue。それ以外はFalse
def EQ(a,b):
    return a == b

def table(a):
    n = a.__code__.co_argcount # 引数の数
    ls = []
    for vals in product([True,False], repeat=n):
        ls.append(list(vals) + [a(*vals)])

    return ls;

ls = table( lambda a, b: AND(a, OR(a, b)))
pprint(ls)
"""
[[True, True, True],
 [True, False, True],
 [False, True, False],
 [False, False, False]]
"""

ls = table( lambda a, b, c: EQ(AND(a, OR(b, c)), OR(AND(a, b), AND(a, c))))
pprint(ls)
"""
[[True, True, True, True],
 [True, True, False, True],
 [True, False, True, True],
 [True, False, False, True],
 [False, True, True, True],
 [False, True, False, True],
 [False, False, True, True],
 [False, False, False, True]]
"""

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/08/29 13:57

    回答ありがとうございます!
    引き数をとるもので「__code__.co_argcount」というのがあるんですね。
    少々質問させていただきたいのですが、
    これはラムダ式の引数を取る以外にも使えるのでしょうか?

    また、 [a(*vals)]の部分で、もしrepeat = 2の場合、valsに渡される値は
    for vals in product([True,False],repeat=2):
    print(*vals)
    True True
    True False
    False True
    False False
    の形になりますが、a(*vals)とすることで、
    a(True,True)の形になるということでしょうか?
    そのまま代入されるとa(True True)のようになってしまうのではと思いましたが、ちゃんとラムダ式に代入されているので疑問に思いました。

    キャンセル

  • 2019/08/29 19:44

    > これはラムダ式の引数を取る以外にも使えるのでしょうか?
    はい。普通の関数でも使えます。

    「a(*vals)」はPythonのアンパックという機能を利用しています。
    「python 引数 アンパック」で検索すると解説ページがいろいろ見つかりますので参照ください。

    キャンセル

  • 2019/08/29 20:32

    回答ありがとうございます。とても勉強になりました!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る