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

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

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

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

Q&A

解決済

3回答

2345閲覧

【pyhon3の質問】lambda式の引数を**argsとし、要素を1つずつ出力したい

pypanman

総合スコア15

Python 3.x

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

0グッド

1クリップ

投稿2018/04/25 05:57

ご覧いただきありがとうございます。

python

1 2sample_lambda = lambda **args: [print(arg) for arg in args]) 3sample('aaa', 'bbb', 'ccc') 4

上記のプログラムを実行し、下記のように出力したいです。

aaa bbb ccc

正しい書きかたを教えて頂けませんでしょうか。

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

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

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

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

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

guest

回答3

0

python

1print_w_args = lambda *args: print(*args, sep='\n') 2print_w_kwargs = lambda **kwargs: print(*kwargs.items(), sep='\n') 3 4print_w_args(1, 2, 3) 5print_w_kwargs(a=1, b=2, c=3)

実行結果

1 2 3 ('a', 1) ('b', 2) ('c', 3)

投稿2018/04/25 10:26

編集2018/04/25 10:29
YouheiSakurai

総合スコア6142

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

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

KSwordOfHaste

2018/04/25 11:23

引数を都合のよい形に変形して別の関数へパスするのはlambdaの使いどころと思います。濫用はよくないと思うものの、この例だととてもスッキリしてコードを見たときに「おかしい」とは思えなくなりますね。脱帽です。
YouheiSakurai

2018/04/25 11:49

そこまで言っていただくと恐縮&嬉しいです。帽子はかぶっておいてください。ありがとうございます、引き続き精進します。
guest

0

ベストアンサー

その場合可変長キーワード引数より、可変長位置引数の方が適当かと。

Python

1sample = lambda *args: [print(arg) for arg in args]

ただ、この使い方はラムダ式の濫用に他なりません。
学習目的を除いては、普通の関数として定義した方が良いでしょう。

投稿2018/04/25 06:01

LouiS0616

総合スコア35658

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

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

pypanman

2018/04/25 09:08

ご回答ありがとうございます。 可変長位置引数と間違えておりました。 学習中にふと気になって質問させていただきました。
guest

0

lambdaはその本体に文は書けず単一の式しか書けません。それが意味するのは何かの値を計算する目的で使うものということです。ですから値の計算ではなく何かの処理(本件では出力)の目的で使うのは不自然に思えることが多いと思います。

もしどうしてもlambda式を使って書くとしたらどうすればいいでしょう。LouiS0616さんご指摘の通り可変長位置引数として書いてみると

python

1def prog(something): pass 2 3(lambda *args: prog([print(arg) for arg in args]))(1, 2) 4 5# or 6 7(lambda *args: (lambda something: None)( 8 [print(arg) for arg in args] 9 ))(1, 2) 10

でもこんなことまでしてlambdaを使う気にはなりません。「単なるトンチ」としかいえないと思います。見やすくなっているわけでも何か利点がある訳でもありませんので。

ちなみにlambda式をそのまんま変数に束縛(代入)するならdefで関数定義しないことの意味がますますない気がします。

結局のところ正しい書き方はlambdaを使わないことのように思えます。

投稿2018/04/25 08:57

編集2018/04/25 09:09
KSwordOfHaste

総合スコア18392

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

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

pypanman

2018/04/25 09:06

ご回答ありがとうございます。 学習中にどんな動作するのかな?程度の気持ちで質問させていただきました。 記載頂いたコードの仕組みが理解できないので、併せて勉強してみようと思います。
KSwordOfHaste

2018/04/25 09:08

なるほど、文字通り言語の機能を調べていたわけですね。それならこういうトンチも役立つと思います!
pypanman

2018/04/25 09:14

pass文というのもあるんですね。 勉強になります! ありがとうございました!
hayataka2049

2018/04/25 09:30 編集

回答のコード、Noneを返却したいだけなのに大げさな感があります (lambda *args: [print(arg) for arg in args][-1])(1, 2) (lambda *args: ([print(arg) for arg in args], None)[-1])(1, 2) このくらいで・・・駄目ですか?
KSwordOfHaste

2018/04/25 09:32

lambda式がどんな値を計算しても「それを無視する」というコードがいかにばからしいかを強調したくてこのように書いたつもりです。実際の場面でどうしてもそうしたいときは、場合によってはおっしゃるようなコードを工夫するかも知れませんが・・・どちらにせよトンチっぽくないでしょうか?w;
hayataka2049

2018/04/25 09:49

確かに副作用のあるlambdaは気持ち悪いですね。参照等価な関数を書いて使うならともかく トンチというなら、こういうのもありますよ >>> [(lambda x:(print(x), x)[-1])(x) for x in "hoge"] h o g e ['h', 'o', 'g', 'e'] リスト内包の動作を追いかけるのに使えます、とか主張してみる
KSwordOfHaste

2018/04/25 09:53

なるほどです。質問意図からするとこのようなコード例もきっと参考になると思います。色々見たり使っているうちに仕様がだんだん頭にしみこんでくるというのはよくありますよね。少なくとも自分などはそうでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問