sur un site Web, j'essaie de trier une liste de magasins par leur position relative de l'utilisateur. Laissez-moi vous expliquer.
Un magasin ressemble à ceci comme suit: p> i Obtenez la position de l'utilisateur dans la session. P> def distance_of_the_shop(shop):
# compute the distance between the shop and the user and return it
return computed_distance
sorted(shop_list, key=distance_of_the_shop)
3 Réponses :
Il suffit de envelopper l'appel dans une Lambda: et ajoutez deux autres arguments à la Le Vous pouvez également utiliser un En supposant que la définition est la suivante: p> puis utilisez p> et distance_of_the_shop () code> fonction pour recevoir la longitude et la latitude. P > Trié () code> Appelle la fonction code> code> pour chaque valeur dans shop_list code>, mais rien n'indique que l'appelable ne peut pas appeler d'autres fonctions. Un lambda code> est le moyen le plus simple de créer une nouvelle fonction wrapper qui fait exactement cela. P> functools.partiale () code> objet , à condition que les valeurs de longitude et latitude puissent être transmises sous forme d'arguments de mots clés , ou accepte ces deux valeurs comme les deux premiers arguments de position. Les traiter comme des arguments de mots clés est probablement préférable, même s'ils reçoivent une position (pas de valeur par défaut), vous pouvez utiliser leurs noms comme arguments de mots clés dans le partial () code>. P> trié () code> passera chaque magasin code> vers le partial () code>, qui à tour appelle distance_of_the_shop (magasin, long = ulong, lat = ulat) p> p> < / p>
Est-il strictement nécessaire que les éléments de la séquence d'entrée (ici: shop_list code>) sont entrés dans le premier argument, en particulier lorsque vous utilisez kwargs i>? J'essaie d'utiliser kwargs i> dans ma définition partielle: partiel (distance_of_the_shop, shop = "foo", long = "bar") code> puis trier sur le manquant> Lat code> argument, mais je reçois l'erreur: a eu plusieurs valeurs pour argument 'Shop' Code>. La documentation indique que les arguments supplémentaires sont annexés à * args code>, c'est pourquoi je m'attendais à ce que mon code fonctionne. Qu'est-ce que je contrôle?
@ N1K31T4 Les arguments de position sont liés en premier. Donc, toutes les valeurs dans * args code> sont attribuées à Boutique code>, puis long code>, puis lat code>. Donc, vous vous retrouvez avec une autre valeur pour Boutique code> des arguments de mots clés. Les arguments de position ne peuvent pas être utilisés pour remplir les paramètres sans mot-clé argument.
Votre question est difficile à comprendre car vous ne définissez jamais une fonction code> distance code> et la fonction que vous fournissez, Si Je comprends correctement, vous souhaitez Notez également qu'il n'a pas de sens d'appeler distance_of_the_shop code>, prend réellement un seul argument. distance_of_the_shop code> pour recevoir l'utilisateur actuel et le magasin étant comparé. Pour atteindre cela, utilisez un lambda code>: p> trié code> sans attribuer sa valeur à une variable ou du conteneur. Si vous souhaitez trier une liste mise en place, utilisez la méthode trier code>, comme indiqué ci-dessus. P> p>
Mon mauvais, il n'y a qu'une seule fonction distance_of_the_shop code>
@Thom il est toujours défini pour recevoir un seul argument, cependant?
Tout d'abord, nous avons besoin d'une fonction de distance (celle-ci calcule les distances de grand cercle): puis nous définissons une fonction de distance par utilisateur: p> et appelez-le comme p>
Voulez-vous dire: «Comment puis-je transmettre l'emplacement de l'utilisateur vers
Distang_of_the_shop code> aussi"?