Maison > Questions et réponses > le corps du texte
*和**为可变形参,但是平时在使用的时候感觉很少能有使用到的情况,有些不是很理解它们的用法和用处场景?
而且形参不是可以传递任意类型么?这样我写成:
a = (1,2,3,4)
def test(a):
print a
print a[1]
加不加*貌似没什么区别?字典也是一样只不过变成print['keyname']而已。
那么*和**这玩意到底有什么用呢?
巴扎黑2017-04-18 09:17:29
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
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)
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.
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')
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