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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

926閲覧

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

Sayre

総合スコア23

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/08/29 02:19

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

python

1#a,bがTrueならTrue。それ以外はFalse 2def AND(a,b): 3 return a and b 4 5#aかbどちらか一方がTrueならTrue。それ以外はFalse 6def OR(a,b): 7 return a or b 8 9#aとbがどちらも同じならTrue。それ以外はFalse 10def EQ(a,b): 11 return a == b 12 13 14def table(a): 15 16 17(a)には【lambda a, b: AND(a, OR(a, b))】か 18lambda a, b, c: EQ(AND(a, OR(b, c)), OR(AND(a, b), AND(a, c)))】が入る想定。 19 20<lambda a, b: AND(a, OR(a, b))入力時の想定> 21[ 22 [True, True, True], 23 [True, False, True], 24 [False, True, False], 25 [False, False, False] 26] 27 28<lambda a, b, c: EQ(AND(a, OR(b, c)), OR(AND(a, b), AND(a, c)))入力時の想定> 29[ 30 [True, True, True, True], 31 [True, True, False, True], 32 [True, False, True, True], 33 [True, False, False, True], 34 [False, True, True, True], 35 [False, True, False, True], 36 [False, False, True, True], 37 [False, False, False, True] 38]

試したこと

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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

Python

1 2from itertools import product 3from pprint import pprint 4 5#a,bがTrueならTrue。それ以外はFalse 6def AND(a,b): 7 return a and b 8 9#aかbどちらか一方がTrueならTrue。それ以外はFalse 10def OR(a,b): 11 return a or b 12 13#aとbがどちらも同じならTrue。それ以外はFalse 14def EQ(a,b): 15 return a == b 16 17def table(a): 18 n = a.__code__.co_argcount # 引数の数 19 ls = [] 20 for vals in product([True,False], repeat=n): 21 ls.append(list(vals) + [a(*vals)]) 22 23 return ls; 24 25ls = table( lambda a, b: AND(a, OR(a, b))) 26pprint(ls) 27""" 28[[True, True, True], 29 [True, False, True], 30 [False, True, False], 31 [False, False, False]] 32""" 33 34ls = table( lambda a, b, c: EQ(AND(a, OR(b, c)), OR(AND(a, b), AND(a, c)))) 35pprint(ls) 36""" 37[[True, True, True, True], 38 [True, True, False, True], 39 [True, False, True, True], 40 [True, False, False, True], 41 [False, True, True, True], 42 [False, True, False, True], 43 [False, False, True, True], 44 [False, False, False, True]] 45"""

投稿2019/08/29 03:45

編集2019/08/29 03:56
can110

総合スコア38262

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Sayre

2019/08/29 04: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)のようになってしまうのではと思いましたが、ちゃんとラムダ式に代入されているので疑問に思いました。
can110

2019/08/29 10:44

> これはラムダ式の引数を取る以外にも使えるのでしょうか? はい。普通の関数でも使えます。 「a(*vals)」はPythonのアンパックという機能を利用しています。 「python 引数 アンパック」で検索すると解説ページがいろいろ見つかりますので参照ください。
Sayre

2019/08/29 11:32

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問