2009-07-17 5 views
18

この言語構​​造は何と呼ばれていますか?このPython/Ruby言語構造に名前をつけてください(関数のパラメータを満たすために配列の値を使用します)

def a(b,c): return b+c 
a(*[4,5]) 

をし、Rubyで同様に9を得る:

Pythonでは私が言うことができる

1は、そうでない場合は、複数の必要とする関数への単一の配列を渡し、このいわゆる
def a(b,c) b+c end 
a(*[4,5]) 

、議論?

*オペレータの名前は何ですか?

このクールな機能をサポートする他の言語は何ですか?

+0

重複http://stackoverflow.com/questions/918449/what-is-the-operator-doing-to-this-string-in-ruby/918475 – seth

+2

@seth:いいえ、重複しません。あなたがリンクしている質問は、この演算子の*セマンティクス*についてです(Rubyで)。この質問は*用語*についてです。 – ThomasH

答えて

26

Pythonのドキュメントでは、これをUnpacking Argument Listsと呼びます。それはかなり便利な機能です。 Pythonでは、ダブルアスタリスク(**)を使用して辞書(ハッシュ)をキーワード引数に展開することもできます。彼らはまた逆に働く。私はこのような関数を定義することができます:

def sum(*args): 
    result = 0 
    for a in args: 
     result += a 
    return result 

sum(1,2) 
sum(9,5,7,8) 
sum(1.7,2.3,8.9,3.4) 

すべての引数を任意のサイズのリストにまとめる。

+2

私はしばらくこれについて知っていて、盲目的にそれを一度もしばらく使っていましたが、それは本当に理解できませんでした。ニース明確で簡単な説明。 – monkut

+0

+1「引数解凍」は私がいつも聞いた一般的な言葉です。それはほとんど最後の引数としてハッシュを持つことによって近似することができるが、 – Chuck

+0

詰め替えトリックは、とりわけ、** kwargsからは、特色ルビーには直接アナログを持っていないルビー – rampion

2

私はそれを「リストの拡張」と呼んでいますが、それは標準的な用語ではないと思います。 Lispはすべてのバージョン(Schemeが含まれています)とHaskellやその他の関数型言語では十分簡単に​​実行できますが、私は "主流"言語で行うのは簡単ではないと思います(おそらく、 "反射"スタントいくつか! - )。

+0

私は標準的な用語についても知らないが、私はいつも '* args'を 'star args'と '** kwargs' 'kay word args'と発音してきた。私は他の人が自分の専門用語を持っていると確信しています。私はそれを聞いて興味があります。 –

10

ルビーでは、しばしば「スプラット」と呼ばれます。

また、ルビーでは、「リストの他のすべての要素」を意味するためにも使用できます。

a, *rest = [1,2,3,4,5,6] 
a  # => 1 
rest # => [2, 3, 4, 5, 6] 

また、代入演算子のいずれかの側に表示されることがあります。この用法で

a = d, *e 

それはすべてが、頭である必要はありませんが、それは、少しスキームのcdrのようなものですリスト。

+1

splat演算子はRubyプログラミング言語で使用されている用語で、Matz(Rubyの作成)と共同で作成されたものです。 – Svend

+4

"リストの他のすべての要素"構文(代入)がPython 3で追加されました。あなたの例は変更されずに動作します。また、(Python 3)では、 'a、b、* middle、y、z = range(10)'のように、スター付き変数を最後に使う必要はありません。しかし、割り当ての右側には表示されませんが、 'l = list(a、* b)'を実行できるので、実際には必要ありません。 – Miles

+0

ええ、私はそれを読んで覚えていると思います。私はまだ仕事でPython 2.4-2.6を使用しています(そしてそうし続けるでしょう、私は疑います)。私はちょうどルビー1.8でテストを行い、* varはリストの最後でなければなりません。 –

5

これの典型的な用語は、「リストに機能を適用する」と呼ばれ、 または「申請」と省略されています。

参照http://en.wikipedia.org/wiki/Apply

それは奇妙1960年にかなりの創業以来バックLISPになっています。 うれしいPythonはそれを再発見: - }

リスト又は 配列などリストの表現に典型的に適用します。しかし、 が構造体などの他のパースから来た引数に関数を適用することはできます。私たちのPARLANSE言語 には、型(int、float、string、...)と構造体があります。 奇妙なことに、関数の引数リストは構造 の定義とよく似ており、PARLANSEでは構造体の定義 であり、互換性のある構造体にPARLANSE関数を「適用」することができます。 あなたも、このように、構造体のインスタンスを「作る」ことができます。

 

(define S 
    (structure [t integer] 
       [f float] 
       [b (array boolean 1 3)] 
    )structure 
)define s 

    (= A (array boolean 1 3 ~f ~F ~f)) 

    (= s (make S -3 19.2 (make (array boolean 1 3) ~f ~t ~f)) 


    (define foo (function string S) ...) 

    (foo +17 3e-2 A) ; standard function call 

    (foo s) ; here's the "apply" 

PARLANSEは、Lispのように見えるがありません。

+1

"リストに関数を適用する"という可変構文を呼び出すことは、まったく間違っています。 PARLANSEへの参照は貢献していないようです。 – ThomasH

+1

@Thomas:OPは明らかに "複数の引数の関数に配列を渡します"。それともそうでなくても、それはリストの表現に関数を適用しています。 OPはまた、この「クールな機能」を備えた他の言語を求めました。 PARLANSEの例は、類似しているが異なっており、コントラストとして提供されています。 –

+0

私は、ThomasHのように、リストの項目に対して同じ関数をn回実行するapplyと、リストの要素で一度関数を呼び出すsplat/var-argsとの間に大きな違いがあると主張しますパラメーター。 –

3

デビッド・ブラックも質問の大半はすでにされているきちんとしunar {、RA} Y演算子(すなわち単項unarrayオペレータ

1

を打ち出しているもののRubyは、スプラットそれを呼び出します「*演算子の名前は何ですか?」という質問に対しては、技術用語は「アスタリスク」です(ラテン語のアスタスチム、「小さな星」を意味します)。ギリシャ語ἀστερίσκος)。しかし、それはしばしば「スター」と呼ばれるか、または前述のように「スプラット」と呼ばれます。

+1

+1が笑いのために意図されていなくても。 – nilamo

2

Haskellはuncurry機能で、あまりにも(ペアの)それを持っています

ghci> f `uncurry` (1,2) 
4 
ghci> let (***) = uncurry 
(***) :: (a -> b -> c) -> (a, b) -> c 
ghci> f *** (10,3) 
23 

そしてかかわら:それはより多くのスプラットのようですので、

ghci> let f x y = 2*x + y 
f :: (Num a) => a -> a -> a 
ghci> f 1 2 
4 
ghci> f 10 3 
23 
ghci> uncurry f (1,2) 
4 
ghci> uncurry f (10,3) 
23 

あなたはまた、オペレータにそれを行うことができます3タプル、4タプルなどの場合に同様の関数を定義するのは簡単ですが、Haskellの厳密な型付けのためにnタプル(他の言語のスプラットのような)のための一般的な関数はありません。

関連する問題