0

まず第一に、私はPythonに非常に慣れていないので、実際に問題を探していますが、例が多すぎて理解できませんでした。

これは私の宿題です; 2 つの関数を引数として取り、2 つの関数の結果が同じかどうかを返す関数が必要ですか? 基本的に、TRUE または FALSE のいずれかを返します。

そのために私は書いた:

def f(x,y,z):
    k=x(*z)
    l=y(*z)
    return k == l

単一の関数用に書いた以前のコードは機能していましたが、上記のように 2 つの関数用に変更すると、次のようなエラーが発生します。

import math
>>> f(math.sqrt,math.cos,5)

Traceback (most recent call last):
  File "<pyshell#56>", line 1, in <module>
    f(math.sqrt,math.cos,5)
  File "D:/Users/karabulut-ug/Desktop/yalanmakinesi.py", line 2, in f
    k=x(*z)
TypeError: sqrt() argument after * must be a sequence
>>> 

関数を与えるエラーは通常、シーケンスを取らないので、私はそれを理解できませんでした。だから私はそれが理にかなっているとは思わない:)どんな助けも大歓迎です..ありがとう:)

4

3 に答える 3

11

zは単一の数値ですが、*引数展開構文では、シーケンスを渡す必要があります (たとえばlisttupleやなど)。str

を削除する*(そして関数を単一の引数だけで機能させる) か、関数シグネチャで を使用し*zて、z0 個以上のキャプチャされた引数のタプルを作成します。

def f(x, y, z):
    k = x(z)
    l = y(z)
    return k == l

また

def f(x, y, *z):
    k = x(*z)
    l = y(*z)
    return k == l

後者は、複数の引数を持つ関数でも機能するようになりました。

f(math.pow, math.log, 10, 10)

署名に引数を追加する**kwと、キーワード引数も処理できます。

def f(x, y, *args, **kwargs):
    k = x(*args, **kwargs)
    l = y(*args, **kwargs)
    return k == l

ここでは、その目的をよりよく反映するために名前を に変更zしました。args

于 2013-10-29T13:56:24.923 に答える
2

この構文は、 で引数のアンパック*z呼び出します。が単なる整数の場合、反復子の動作が定義されていないため、このエラーが表示されます。試す:zz

>>> f(math.sqrt, math.cos, [5])
于 2013-10-29T13:56:53.943 に答える
1

を取り除く必要があり*ます。開梱用です。そう:

def f(x,y,z):
    k=x(z)
    l=y(z)
    return k == l

or*のような反復可能なオブジェクトを渡したい場合は、この演算子を使用します。たとえば、次のようになります。listtuple

a = [1,2,3,4,5]

したがって、任意の関数の場合、f次のようになります。

f(*a) = f(1,2,3,4,5)
于 2013-10-29T13:57:04.800 に答える