Bonjour,
N'est-il pas possible comme en C de passer à une fonction l'adresse d'une variable ?
Code:
1
2
3
4
5
6
7
8
9 def modif (uneVariable): uneVariable += 10 maVariable1 = 1 modif(maVariable1) maVariable2 = 2 modif(maVariable2)
Version imprimable
Bonjour,
N'est-il pas possible comme en C de passer à une fonction l'adresse d'une variable ?
Code:
1
2
3
4
5
6
7
8
9 def modif (uneVariable): uneVariable += 10 maVariable1 = 1 modif(maVariable1) maVariable2 = 2 modif(maVariable2)
Salut,
Avec Python, vous pouvez passer un objet qui sera (ou pas) mutable.
et si la variable n'est pas mutable, on doit assigner un autre objet à la variable (qui a ce moment là devra être globale et non un paramètre de la fonction)Code:
1
2
3
4
5
6
7
8 >>> def f(x): ... x += ['x'] ... >>> L = [1] >>> f(L) >>> L [1, 'x'] >>>
- W
Merci pour la réponse.
Suivant ce code et si je comprends bien une variable du type liste est mutable ce qui n'est pas le cas du type int.
Dans ce cas il faut assigner un autre objet à la variable --> ce qui veux dire que la variable change de nom ?
Or dans mon cas le nom je ne peux que le passer en paramètre.
J’appelle ma fonction pour traiter la variable1 ou la variable2.
Et je dois récupérer mes 2 variables sans utiliser de "return"
Par une fonction j’effectue un calcul dans lequel intervient la valeur d’une variableX
A l’issu cette variableX prend la valeur calculée.
Dans la fonction Je pourrais faire un test pour savoir quelle variable utiliser, mais je ne le souhaite pas pour raccourcir le temps de traitement (ce qui est relatif car la parade pourrait coûter plus de temps).
De plus je ne peux pas utiliser de return car l’ensemble doit se faire dans la fonction.
Cest bon c'est compris :-)
Merci encore
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 def f(x): x[0] *= 2 maVar1 = 1 L1 = [maVar1] f(L1) maVar2 = 2 L2 = [2] f(L2) print (L1) print (L2)
Salut,
Je ne sais pas ce que vous avez compris mais il manque des lignes pour modifier maVar...
Dans les tutos vous apprenez à écrire:
ou plus simple:Code:
1
2
3
4
5
6
7 def f(): global maVar maVar += 1 maVar = 0 f() print(maVar)
Et s'il ne vous est pas possible d'utiliser l'un ou l'autre c'est que vous êtes en train de faire un exercice et non "programmer".Code:
1
2
3
4
5 def f(v): return v + 1 maVar = 1 maVar = f(maVar)
- W
Je ne sais pas ce que vous avez compris mais il manque des lignes pour modifier maVar...
Ah bon pourtant le code effectue bien ce que j'atendais
Dans les tutos vous apprenez à écrire:
???
Et s'il ne vous est pas possible d'utiliser l'un ou l'autre c'est que vous êtes en train de faire un exercice et non "programmer".
Je ne comprends pas
Salut,
Vous avez juste omis de faire un print:
et donc d'assigner à maVar1 le résultat (le premier élément de la liste).Code:
1
2
3
4
5
6
7 def f(x): x[0] *= 2 maVar1 = 1 L1 = [maVar1] f(L1) print(maVar1)
Ce qui est quand même lourdingue par rapport à ce qu'on est supposé utiliser.
Après, si vous programmez, c'est vous qui décidez donc il n'est pas interdit d'utiliser return ou global (et éviter ces jongleries).
- W
Bonjour
Non. Mais en fait c'est parce que, contrairement au C, en Python c'est totalement inutile.
En effet, en C une fonction ne peut retourner qu'une chose simple. Et donc une fonction qui devrait modifier plusieurs variables ne pourra pas retourner plusieurs valeurs à la fois. On est alors obligé de passer par un mécanisme où la fonction va modifier directement les variables d'origine et pour ce, doit recevoir leurs adresses.
Code:
1
2
3
4
5
6
7
8
9
10 void modif(int *a, int *b, int n) { (*a)=n; (*b)=n*2; } int main() { int x, y; modif(&x, &y, 5); printf("x=%d, y=%d\n", x, y); }
Python, lui, peut retourner directement plusieurs trucs en passant par le tuple, qu'on peut éclater par unpacking directement dans plusieurs variables
Code:
1
2
3
4
5
6 def modif(n): return (n, n*2) # modif() (x, y)=modif(5) print("x=%d, y=%d" % (x, y))
La fonction n'a plus besoin d'aller modifier directement x et y puisqu'on peut les remplir par les valeurs qu'elle renvoie. Elle n'a donc pas besoin de recevoir leurs adresses.
Jusque là...
Code:
1
2 def fonction(variableX): variableX=calcul
Ou simplement affecter la variable de ton choix au moment de ton choix
Code:
1
2 a=fonction(a) b=fonction(b)
Ok là tes raisons m'échappent...:weird:
Bonjour,
Je ne me fixe pas de contraintes mais par rapport à tous les choix précédents je pense que ce n'est pas judicieux.
Ce serait long de tout expliquer clairement, mais cette dernière question est liée à une autre discussion "gestion interruptions"
J’ai parmi d’autres 2 possibilités :
Comme je traite 2 interruptions
Je peux :Code:
1
2 GPIO.add_event_detect(11, GPIO.FALLING, callback=sauveVal,bouncetime=150) GPIO.add_event_detect(12, GPIO.FALLING, callback=sauveVal,bouncetime=150)
Appeler un même callback où je teste quel pilote est concerné ou alors
Appeler 2 callback distincts adaptés à chaque pilote
Code:
1
2 GPIO.add_event_detect(11, GPIO.FALLING, callback=sauveVal1,bouncetime=150) GPIO.add_event_detect(12, GPIO.FALLING, callback=sauveVal2,bouncetime=150)
J’ai choisi un seul Callback et de ce fait, je dois faire passer des paramètres…
Le return d’une valeur dans le callback est à mon sens pas adapté étant donné que tous les autres résultats sont empilés pour traitement ultérieur.
Pour revenir à la question, le code suivant fonctionne
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 def f(x): x[0] *= 2 maVar1 = 2 L1 = [maVar1] f(L1) maVar1=(L1[0]) maVar2 = 4 L2 = [maVar2] f(L2) maVar2=(L2[0]) print (L1) print (L2) print (maVar1) print (maVar2)
Salut,
Pour faire çà avec une seule fonction, il faut "fabriquer" une association entre fonction et donnée/état qui survive à l'appel de la fonction (pour le retrouver le coup d'après).
C'est à çà que sert la POO.
Avec Python, çà se met en oeuvre avec des class (et les fonctions sont alors des méthodes) ou des closures (des fonctions qui retournent des fonctions) comme dans l'exemple que je vous ai donné dans la discussion en question.
- W
Merci pour le retour
J'ai encore beaucoup de chemin à parcourir, le peu de compétences acquises en programmation date de l'époque avant la POO.
Pour l'instant il me faut du temps pour comprendre les exemples reçus.
Salut,
Ouvrez un tuto: la programmation évènementielle s'apprend au chapitre "tkinter", c'est là qu'on se frotte aux callbacks et qu'on fait ses premiers pas en POO.
Essentiellement parce qu'un GUI, c'est un tas d'objets qu'on va vouloir "factoriser" en classe pour usiner des objets aux comportements identiques (un tas de Button qui...).
Ces notions là sont "compliquées": il faut du temps et des tas d'exercices pour que le cerveau apprenne à jouer avec.
Si vous n'avez pas pris ce temps là, vous avez 2 soucis: le premier est que vous n'avez pas le bagage technique pour imaginer le type de solution à appliquer à un problème (vous ne savez même pas où chercher), le second est que si on vous donne du code, c'est juste incompréhensible et çà ne vous aide pas sauf à constater que vous avez des tas de choses à apprendre.
Passer du temps dans un tuto est la seule solution (même si cela doit repousser de quelque temps votre envie de jouer avec des robots).
- W
Vous avez totalement raison.
Je n'ai trouvé que ce lien qui décrit tous les objets de Tkinter
https://vincent.developpez.com/cours...nter-python-3/
En auriez vous un autre qui décrit plus la construction de classes en python avec Tkinter
Merci d'avance
Salut,
Le Swinnen devrait être suffisant pour démarrer.
- W