検索

ホームページ  >  に質問  >  本文

关于python*和**的问题

*和**为可变形参,但是平时在使用的时候感觉很少能有使用到的情况,有些不是很理解它们的用法和用处场景?
而且形参不是可以传递任意类型么?这样我写成:

1

2

3

4

5

<code>

a = (1,2,3,4)

def test(a):

    print a

    print a[1]</code>

加不加*貌似没什么区别?字典也是一样只不过变成print['keyname']而已。
那么*和**这玩意到底有什么用呢?

PHP中文网PHP中文网2890日前223

全員に返信(1)返信します

  • 巴扎黑

    巴扎黑2017-04-18 09:17:29

    補足

    私たちが役に立たないと感じる理由は、次のような思考状況に陥ることが多いためだと思います。

    関数を書く人と関数を使う人は同一人物、つまり私です

    作成者とユーザーが同じ人であれば、当然ながら、* を選択するか、リストを直接使用するかは問題ではありません。

    しかし今日、他の人の API を使用したり、他の人が使用できる関数を作成したりする場合、それほど柔軟性はありません

    現時点では、* が私たちを大いに助けてくれます


    これら 2 つは非常に便利です!

    例をいくつか挙げて説明します

    関数の引数に使用する場合

    関数 intro があるとします:

    リーリー

    今日はリストデータ lst と dict データ dic のセットを提供します:

    リーリー

    * または ** の代わりに、次のようにすることもできます。

    リーリー

    *** を使用します:

    リーリー

    関数パラメータに使用する場合

    今日は加算関数を書きます:

    リーリー

    3 つの数値を乗算するように拡張したい場合:

    リーリー

    ここで 2 つの質問があります:

    • 1 つは、パラメーター リストが非常に長くなる可能性があることです

    • 1 つは、Python では複数のロードが許可されていないため、同じ関数名を使用できないことです

    しかし、* はこの問題を解決できます:

    リーリー

    もちろん、ここでパラメータをリストまたはタプルとして設計することもできると思うかもしれませんが、場合によっては、このアプローチの方が便利な場合があります。print (Python3) の概念を参照できます。 リーリー

    それがここでのコンセプトです

    第 2 に、このアプローチはデコレーターを作成するための基礎となります。

    リーリー

    このアプローチを使用しない場合、変更したい関数が持つ可能性のあるさまざまなパラメーターを扱うことができないためです。

    タプルのアンパックに使用する場合(Python3)

    この機能は非常に便利です:

    リーリー

    結論

    実際には、これらよりも素晴らしいものがたくさんあり、あなたが発見するのを待っています!


    私が回答した質問: Python-QA

    返事
    0
  • キャンセル返事