recherche

Maison  >  Questions et réponses  >  le corps du texte

关于python*和**的问题

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


a = (1,2,3,4)
def test(a):
    print a
    print a[1]

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

PHP中文网PHP中文网2889 Il y a quelques jours217

répondre à tous(1)je répondrai

  • 巴扎黑

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

    Supplément

    Je pense que la raison pour laquelle nous nous sentons inutiles est que nous tombons souvent dans une situation de réflexion :

    La personne qui écrit function et la personne qui utilise function sont la même personne, c'est moi

    Parce que si l'écrivain et l'utilisateur sont la même personne, alors bien sûr, vous pouvez être très libre dans la façon dont vous concevez l'interface. Peu importe si vous choisissez * ou utilisez directement la liste

    .

    Mais aujourd’hui, lorsque nous utilisons les API d’autres personnes ou écrivons des fonctions que d’autres peuvent utiliser, nous n’avons pas beaucoup de flexibilité

    En ce moment, * peut nous aider beaucoup


    Ces deux choses sont très utiles !

    Donnez quelques exemples pour démontrer

    Lorsqu'il est utilisé pour les arguments de fonction

    Supposons qu'il existe une fonction intro :

    def intro(name, age, city, language):
        print('I am {}. I am {} years old. I live in {}. I love {}'.format(
            name, age, city, language
        ))

    Aujourd'hui, je vais vous donner un ensemble de données de liste lst et de données de dict dic :

    lst = ['dokelung', 27, 'Taipei', 'Python']
    dic = {'name': 'dokelung', 'age': 27, 'city': 'Taipei', 'language': 'Python'}

    Au lieu de * ou **, vous souhaiterez peut-être :

    test(lst[0], lst[1], lst[2], lst[3])
    test(dic['name'], dic['age'], dic['city'], dic['language'])

    Utilisez * et ** :

    test(*lst)
    test(**dic)

    Lorsqu'il est utilisé pour les paramètres de fonction

    Aujourd'hui, nous allons écrire une fonction d'addition :

    def add2(a, b):
        return a + b

    Si vous souhaitez développer pour multiplier trois nombres :

    def add3(a, b, c):
        return a + b + c

    Il y a deux questions ici :

    • La première est que la liste des paramètres peut être très longue

    • La première est que Python n'autorise pas plusieurs chargements, vous ne pouvez donc pas utiliser le même nom de fonction

    Mais * peut résoudre ce problème :

    def add(*n):
        return sum(n)

    Bien sûr, vous pensez peut-être que je peux également concevoir le paramètre ici comme une liste ou un tuple, mais parfois cette approche est plus pratique. Vous pouvez vous référer au concept de print (Python3) :

    .
    print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
          ^^^^^^^^

    C'est le concept ici

    Deuxièmement, cette approche est à la base de l'écriture des décorateurs :

    def mydeco(func):
        def newfunc(*args, **kwargs):
            return func(*args, **kwargs)
        return newfunc

    Car si vous n'utilisez pas cette approche, vous ne pourrez pas gérer les différents paramètres que peut avoir la fonction que vous souhaitez modifier.

    Lorsqu'il est utilisé pour le déballage de tuples (Python3)

    Cette fonction est très utile :

    >>> t = ('start', 1 ,2 ,3 ,4 ,5, 'end')
    >>> s, *nums, e = t
    >>> s, nums, e
    ('start', [1, 2, 3, 4, 5], 'end')

    Conclusion

    En fait, il y a des choses plus merveilleuses que celles-ci, elles n'attendent que que vous les découvriez !


    Questions auxquelles j'ai répondu : Python-QA

    répondre
    0
  • Annulerrépondre