IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Souci de déclaration de fonction


Sujet :

Python

  1. #21
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par .....1..... Voir le message
    toi en une après-midi tu fais ce que j'ai fait
    Non, juste en 1h. Mais bon, comme je te l'ai dit, j'avais déjà l'exemple en C donc je n'ai eu qu'à reprendre les fonctions C et les porter en tant que méthodes sour Python (ce que je disais quand je parlais du "presque objet" du C).

    Citation Envoyé par .....1..... Voir le message
    Mais curieusement la syntaxe est bien différente de la mienne...pourquoi tu utilises self.__xx ?
    Ca sert à "privatiser" un attribut. Si tu écris self.xxx=valeurA alors de l'extérieur n'importe qui a le droit d'aller voir "xxx" et éventuellement le modifier (ex var.xxx=456 (sous-entendu que "var" est une instance de la classe en question). Et généralement le propriétaire de la classe n'aime pas qu'on touche à ses trucs. Si tu mets un double underscore, alors la variable "__xxx" n'est pas visible du dehors (bon en réalité elle est quand-même visible mais sous un autre nom assez compliqué).
    Ici pour ce petit truc si les attributs avaient été utiles d'être vus depuis l'extérieur je serais passé là dessus mais comme finalement l'extérieur n'en a pas besoin, autant les cacher.

    Citation Envoyé par .....1..... Voir le message
    Sinon le shebang (#!/usr/bin/env python3) il sert à quoi ? J'ai lu que c'était pour indiquer au système où chercher python3, mais en l'enlevant ça fonctionne sans problème...
    Ca dépend comment tu appelles le script. Si le script se nomme "toto.py" et que tu l'appelles de cette façon python toto.py alors oui il est inutile. Mais si tu l'appelles de cette façon ./toto.py alors c'est pour que l'OS sache qu'il faut utiliser Python. Et je spécifie "python3" au cas où tu aurais les 2 pythons sur ta machine.
    T'as la même chose en shell (langage de script Unix). Tu es obligé de faire commencer tes scripts par #!/bin/sh ou #!/bin/bash ou #!/bin/csh ou #!/bin/ksh selon que tu écris en Bourne Shell, Bourne Again Shell, C-Shell, Korn Shell. Comme ça l'OS sait quel interpréteur utiliser si tu appelles le script de façon directe (sans préciser l'interpréteur).
    C'est expliqué ici (partie III-D. Qui exécute ?).

    Citation Envoyé par .....1..... Voir le message
    Sinon c'est pas bête l'idée de demander à l'utilisateur de passer ne paramètre le port d'écoute/de connexion. Si ça ne te dérange pas je te la pique volontiers
    Oui vas-y, c'était juste un exemple de cours socket en C donc déjà offert au public.

    Citation Envoyé par .....1..... Voir le message
    Plus qu'à essayer de comprendre ce que tu as fait afin de comprendre ce qui ne passe pas chez moi.
    Comme je te l'ai expliqué: le fils ne s'occupe que du client et le père ne s'occupe que d'écouter le réseau. Chacun son job. Ensuite le client écrit et le serveur (enfin la partie "fils" du serveur) lit.

    Citation Envoyé par .....1..... Voir le message
    En fait, je ne comprends pas bien le self
    Il faut aller lire les tutoriels Python concernant les objets. Si tu as fait du C++, alors "self" Python équivaut au "this" C++. Ca permet à l'objet de pouvoir identifier en interne l'instance qui l'a invoqué. "self" veut dire "soi" en français (raccourci de "soi-même"). Donc identifie le "qui m'a invoqué" dans l'objet.
    Si par exemple tu crées 2 variables a=cSocket(); b=cSocket() alors tu as 2 instances de l'objet "cSocket" dans ton programme. Si maintenant tu appelles a.listen() alors dans la fonction "listen" comment identifier que c'est "a" qui l'a appelée ? Grâce à "self" qui récupère la variable "a". L'écriture a.listen() est en fait un raccourci équivalent de l'écriture cSocket.listen(a). Donc la variable "a" passée à "listen" est récupérée dans "self" (qui aurait pu aussi s'appeler "zorglub" puisque c'est un nom de paramètre mais "self" est une convention).

    Citation Envoyé par .....1..... Voir le message
    ce que je trouve étrange c'est que tu définis __fils() comme devant être appelée avec self, mais tu l'appelles de cette façon : self.__fils() : cette syntaxe est une façon de passer self à __fils
    "__fils" est une méthode elle aussi cachée de l'extérieur (le double underscore). Quand le client se connecte, l'objet doit effectuer un travail. Comme ce travail est assez lourd, je l'ai encapsulé dans une méthode (une fonction) de l'objet ce qui évite de tout mettre dans le "listen" (j'aurais pu mais ça aurait alourdi la lisibilité). Comme cette méthode ne sert qu'en interne, je la cache de l'extérieur. Et quand j'en ai besoin, je l'appelle depuis l'objet lui-même grâce à "self". De même qu'un objet a parfaitement le droit d'utiliser ses attributs quand il en a besoin, il a aussi parfaitement le droit d'utiliser ses propres méthodes s'il a besoin.

    Citation Envoyé par .....1..... Voir le message
    Re-re : finalement, je n'ai pas dû bien saisir : le serveur me génère des erreurs à chaque fois que le client se ferme, mais même s'il continue de tourner, le script semble s'être arrêté (j'ai une variable qui prend certaines valeurs, et je perds ces valeurs chaque fois que le script stoppe, ce qui semble être le cas).
    As-tu remarqué que dans mon exemple, quand le client se ferme, il envoie un message spécial (la chaine "EOT") au serveur pour que le serveur (enfin la partie "fils" qui gère le client) puisse savoir que le client s'arrête ? Il te faut implémenter un truc similaire (ce que Wiztricks nomme "protocole") chez-toi. il faut absolument que ton serveur sache que le client s'arrête. Tout comme tu dis "au revoir" quand tu raccroches au tel.

    Citation Envoyé par .....1..... Voir le message
    Alors là j'ai fait fort : en essayant de corriger mon script, je me retrouve avec la comportement attendu...sauf que du coup quand je suis le fil d'exécution à partir du code (break, return, les appels, etc...) je ne comprends pas du tout ce qu'il se passe, ni pourquoi ça fonctionne
    Si Wiztricks était là, il dirait que ton truc est "tombé en marche" et généralement dans le monde de l'informatique professionnelle on n'aime pas trop ça. Parce qu'on n'est pas sûr qu'ils "tomberont" à chaque coup. Imagine que tu montes dans un avion à destination de Londres (ville bien brumeuse) et que tu entendes l'informaticien dire "oui je comprends pas trop l'ILS (système d'atterrissage aux instruments quand le pilote ne voit rien) ne fonctionnait pas mais là ça marche mais j'ai pas trop compris pourquoi" tu serais pas fou de joie...
    Désolé mais c'est comme en maths: on ne veut pas qu'un résultat, on veut un résultat démontré. Il me semble qu'il s'agit d'un TP donc si ton prof voit que ça marche "par hasard" il ne validera pas.

    Citation Envoyé par .....1..... Voir le message
    Bon, je commence à mieux comprendre ce qu'il se passe : déjà je croyais que sys.exit() demandait la fermeture du script, mais visiblement c'est pas le cas.
    Ca demande l'arrêt d'un processus, pas d'un script. Généralement quand le processus est lié au script alors oui ça arrête le script. Mais si le script génère plusieurs procesus (via os.fork()) alors chaque processus devra invoquer exit() s'il veut s'arrêter (et comme exit() est interne Python, pas besoin d'utiliser celle du module "sys")

    Citation Envoyé par .....1..... Voir le message
    Sinon, je me demandais : la variable global var_glo est initialisée par le Père --> Mais si le fils cherche à en récupérer le contenu, sera-t'elle réinitialisée ? La question parait peut-être idiote mais j'ai l'impression que la seule réponse vient de là...
    Non. Comme je l'ai dit, le fils récupère une copie de toutes les variables créées avant sa génération. Mais comme le fils possède son espace personnel et totalement isolé, il peut jouer avec ses variables sans souci de collision avec celles du père. Les processus sont tellement isolés que la majorité des soucis des dev viennent du besoin de transférer des infos les uns aux autres.

    Ceci dit, rien ne vaut un bon exemple qui démontre cela
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #!/usr/bin/env python3
    # coding: utf-8
     
    import os
    import time
     
    glob=123
    pid=os.fork()
    if pid == 0:
    	print("Je suis le fils %d (glob=%d)" % (os.getpid(), glob))
    	glob*=2
    else:
    	time.sleep(1)
    	print("Je suis le père %d et mon fils est %d (glob=%d)" % (os.getpid(), pid, glob))
    # if
     
    print("Ici %d bosse toujours: Etat des variables: pid=%d, glob=%d" % (os.getpid(), pid, glob))
    Donc le fils commence par travailler (car le père dort). Il affiche ses infos et modifie "glob". Puis il termine sur la dernière ligne du script (qui fait partie aussi du fils !!!) et affiche le "glob" modifié.
    Puis le père se réveille et fait la même chose. On voit bien que sa variable à lui n'est pas impactée par les modifs de celle du fils...


    Citation Envoyé par .....1..... Voir le message
    Edit : ma question ne semblait finalement pas si bête : https://stackoverflow.com/questions/...riables-shared
    La réponse reste la même et en survolant le lien, il me semble que c'est ce qu'ils disent.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  2. #22
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Salut,
    Citation Envoyé par Sve@r Voir le message
    ici un tuto Python client/serveur basé sur les thread. Sauf qu'il est pour P2 et que j'ai pas réussi à le porter sous P3.
    Juste pour info il y a une version P3 de ce bouquin, et je pense que le lien correspondant au chapitre dont tu parles doit être ici...

  3. #23
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Beginner. Voir le message
    et je pense que le lien correspondant au chapitre dont tu parles doit être ici...
    Super
    Effectivement j'avais un souci à cause des différences entre les strings P2/P3 (le send() P2 me disait que le message n'était pas au bon format)
    Merci, je vais aller tester cet exemple de suite

    PS: en regardant rapidement le lien P3, je vois que les messages sont encodés avant d'être envoyés. Et en fait je me rends compte que j'avais eu le même souci quand j'ai tapé mon propre exemple (un peu plus haut dans la discussion) mais là, la solution de l'encodage m'était venue tout naturellement. Peut-être là le point de départ d'une réflexion sur la facilité à débugguer son propre code (qu'on comprend instinctivement car il est le reflet de notre façon de penser) face au code d'un autre...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #24
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 64
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Non, juste en 1h. Mais bon, comme je te l'ai dit, j'avais déjà l'exemple en C donc je n'ai eu qu'à reprendre les fonctions C et les porter en tant que méthodes sour Python (ce que je disais quand je parlais du "presque objet" du C).
    Ah une heure...quand-même. Des fois je me dis que j'aurai jamais un niveau correct en programmation. Ceci dit difficile quand on ne programme pas et qu'on a aucune idée de quoi programmer...


    Citation Envoyé par Sve@r Voir le message
    Ca sert à "privatiser" un attribut. [...]
    Ça marche, c'est bien noté - j'ai splitté pour raccourcir ma réponse -.


    Citation Envoyé par Sve@r Voir le message
    Ca dépend comment tu appelles le script. Si le script se nomme "toto.py" et que tu l'appelles de cette façon python toto.py alors oui il est inutile. Mais si tu l'appelles de cette façon ./toto.py [...]
    Oui, c'est ce que j'ai fini par découvrir, en faisant ./script.py


    Citation Envoyé par Sve@r Voir le message
    Il faut aller lire les tutoriels Python concernant les objets. Si tu as fait du C++, alors "self" Python équivaut au "this" C++. Ca permet à l'objet de pouvoir identifier en interne l'instance qui l'a invoqué. "self" veut dire "soi" en français (raccourci de "soi-même"). Donc identifie le "qui m'a invoqué" dans l'objet.

    [...]

    "__fils" est une méthode elle aussi cachée de l'extérieur (le double underscore). [...]
    Merci pour toutes ces informations


    Citation Envoyé par Sve@r Voir le message
    As-tu remarqué que dans mon exemple, quand le client se ferme, il envoie un message spécial (la chaine "EOT") au serveur pour que le serveur (enfin la partie "fils" qui gère le client) puisse savoir que le client s'arrête ? Il te faut implémenter un truc similaire (ce que Wiztricks nomme "protocole") chez-toi. il faut absolument que ton serveur sache que le client s'arrête. Tout comme tu dis "au revoir" quand tu raccroches au tel.
    Oui, c'est ce que j'avais fait, mais pas correctement je crois ^^


    Citation Envoyé par Sve@r Voir le message
    Si Wiztricks était là, il dirait que ton truc est "tombé en marche" et généralement dans le monde de l'informatique professionnelle on n'aime pas trop ça. Parce qu'on n'est pas sûr qu'ils "tomberont" à chaque coup. Imagine que tu montes dans un avion à destination de Londres (ville bien brumeuse) et que tu entendes l'informaticien dire "oui je comprends pas trop l'ILS (système d'atterrissage aux instruments quand le pilote ne voit rien) ne fonctionnait pas mais là ça marche mais j'ai pas trop compris pourquoi" tu serais pas fou de joie...
    Désolé mais c'est comme en maths: on ne veut pas qu'un résultat, on veut un résultat démontré. Il me semble qu'il s'agit d'un TP donc si ton prof voit que ça marche "par hasard" il ne validera pas.
    En fait la syntaxe est correct, le code aussi, mais en le parcourant je n'arrive pas à comprendre la logique. Tu me diras c'est peut-être qu'il n'y en a pas et que, comme tu l'as fait remarquer, c'est juste un coup de chance. Sinon non, c'était un test pour un stage. Du coup j'ai pas été pris. Les recruteurs j'ai l'impression qu'ils cherchent des stagiaires, mais des stagiaires avec 5 ans d'expérience et des skills de ouf, alors que théoriquement un stage c'est aussi pour apprendre des bases à quelqu'un avant de potentiellement le recruter. Bref. Au moins j'ai appris des trucs en écrivant ce bout de code ^^


    Citation Envoyé par Sve@r Voir le message
    Ca demande l'arrêt d'un processus, pas d'un script. Généralement quand le processus est lié au script alors oui ça arrête le script. Mais si le script génère plusieurs procesus (via os.fork()) alors chaque processus devra invoquer exit() s'il veut s'arrêter (et comme exit() est interne Python, pas besoin d'utiliser celle du module "sys")
    Ok, je faisais un peu " l'amalgame " entre processus et script, d'où mon incompréhension.


    Citation Envoyé par Sve@r Voir le message
    Non. Comme je l'ai dit, le fils récupère une copie de toutes les variables créées avant sa génération. [...]

    Ceci dit, rien ne vaut un bon exemple qui démontre cela
    [...]
    Merci pour l'exemple !! Je vais reprendre toute ta réponse et tout résumer dans mon fichier de note Python

    Sinon je me demande vraiment comment je peux progresser en programmation : je cherche un stage pour qu'enfin je puisse bosser et programmer des choses concrètes...mais on me recale sans arrêt parce que j'ai pas le niveau. Sauf que si personne ne me donne ma chance, le niveau, je ne l'aurai jamais...le serpent qui se mord la queue

    Edit : on m'a notamment reproché de ne pas avoir mis de setup.py dans mon Git ; ça sert à quoi ? J'ai regardé deux ou trois Git autres, j'ai pas bien compris.

  5. #25
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par .....1..... Voir le message
    Ceci dit difficile quand on ne programme pas et qu'on a aucune idée de quoi programmer...
    Un de mes premiers programmes "sérieux" en Python a été la résolution du jeu "le compte est bon". On lui passe le nombre à atteindre puis les plaques pour le trouver et il trouve. Selon le principe suivant: pour trouver 123 avec 1, 2, 3, 4, 5 et 6 je regarde si je peux trouver 123 avec 3, 3, 4, 5 et 6 et etc (récursif). Avec les opérations +, -, * et // (plus quelques optimisations comme déjà ranger les plaques dans l'ordre décroissant ce qui permet de ne pas refaire un même traitement quand on a des nombres identiques et simplifie la gestion des soustractions et divisions).
    Et s'il trouve pas 123, alors il cherche 122 puis 124 puis 121 puis 125 puis 120 puis 126 etc jusqu'à ce qu'il finisse par trouver.

    Ensuite je te recommande de t'intéresser à PyQt5 qui permet de créer des IHM avec Python. Voici un petit exemple rapide
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    #!/usr/bin/env python3
    # coding: utf-8
     
    from sip import *
    from PyQt5.QtCore import *
    from PyQt5.QtGui import *
    from PyQt5.QtWidgets import *
     
    # Application principale
    class QtAppli(QApplication):
    	def __init__(self, argv):
    		super().__init__(argv)
     
    		trans=QTranslator()
    		trans.load(
    			"qt_fr", #% QLocale.system().name(),
    			QLibraryInfo.location(QLibraryInfo.TranslationsPath),
    		)
    		self.installTranslator(trans)
    		self.__mainWid=QtMainWindow()
    	# __init__()
     
    	def run(self):
    		self.__mainWid.show()
    		return self.exec_()
    	# run()
    # class QtAppli
     
    # Fenêtre principale
    class QtMainWindow(QMainWindow):
    	def __init__(self, *args, **kwargs):
    		super().__init__(*args, **kwargs)
     
    		self.setCentralWidget(QWidget(self))
    		self.setAttribute(Qt.WA_DeleteOnClose)
     
    		self.__edit1=QLineEdit(textChanged=self.__slotEdited)
    		self.__edit2=QLineEdit()
    		self.__edit2.textChanged.connect(self.__slotEdited)
    		self.__result=QLineEdit()
    		self.__result.setReadOnly(True)
    		calcLayout=QHBoxLayout()
    		calcLayout.setContentsMargins(0, 0, 0, 0)
    		calcLayout.setSpacing(0)
    		calcLayout.addWidget(self.__edit1, 1)
    		calcLayout.addWidget(QLabel("+"), 0)
    		calcLayout.addWidget(self.__edit2, 1)
    		calcLayout.addWidget(QLabel("="), 0)
    		calcLayout.addWidget(self.__result, 1)
     
    		mainLayout=QVBoxLayout(self.centralWidget())
    		mainLayout.setContentsMargins(0, 0, 0, 0)
    		mainLayout.setSpacing(0)
    		mainLayout.addLayout(calcLayout, 0)
    		mainLayout.addSpacing(10)
    		mainLayout.addWidget(
    			QPushButton("Quitter", clicked=self.close),
    			0,
    		)
    	# __init__()
     
    	def __slotEdited(self, text):
    		if not self.__edit1.text() or not self.__edit2.text(): return
    		self.__result.setText("%d" % (int(self.__edit1.text()) + int(self.__edit2.text())))
    # class QtMainWindow
     
    if __name__ == "__main__":
    	import sys
    	print(QtAppli(sys.argv).run())
    # if
    Et le résultat
    Nom : calc.jpg
Affichages : 132
Taille : 12,4 Ko

    T'as juste à installer python3-pyqt5 avec apt (si t'es sur une Debian ou analogue): apt install python3-pyqt5. Mon second programme Python a été d'intégrer le premier (que j'avais pensé à mettre dans une fonction) dans une IHM (n'ai donc eu qu'à intégrer ladite fonction).
    Nom : compte.jpg
Affichages : 146
Taille : 58,8 Ko

    Et ici un autre intervenant propose le source d'un truc multimedia fait avec PyQt pour écouter la radio sur le net.

    Citation Envoyé par .....1..... Voir le message
    Edit : on m'a notamment reproché de ne pas avoir mis de setup.py dans mon Git ; ça sert à quoi ? J'ai regardé deux ou trois Git autres, j'ai pas bien compris.
    C'est un programme Python destiné à installer automatiquement ton projet. Il est prévu généralement pour recevoir un paramètre nommé "install" (donc on le lance sous cette syntaxe: python3 setup.py install). Les setup des projets plus complexes ou compilables possèdent d'autres mots clefs comme "build", "config" et "make" qui font d'autres actions.
    Et donc il place automatiquement tous les dossiers et fichiers de ton projet au bon endroit dans la machine. Télécharge par exemple le source de psycopg2 (une librairie pour attaquer une bdd Postgres depuis Python). Tu y trouveras un "README.rst" qui te dit comment exécuter le "setup.py" puis exerce-toi à installer cet outil via le setup. Si tu fais de la virtualisation de machine avec VirtualBox c'est assez pratique car tu peux rendre une machine ou une partie de la machine immuable => tu la figes dans un état précis puis tant qu'elle tourne tu la tritures dans tous les sens à installer/désinstaller plein de trucs puis au reboot suivant elle est réinitialisée dans l'état que tu avais figé. Vraiment super quand on veut tester des installations de logiciels (moi je rends immuable le disque système mais pas le disque contenant /home).
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #26
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,

    Citation Envoyé par .....1..... Voir le message
    mais on me recale sans arrêt parce que j'ai pas le niveau. Sauf que si personne ne me donne ma chance, le niveau, je ne l'aurai jamais...le serpent qui se mord la queue
    Oui enfin, pour l'instant, toutes les questions que vous avez posé montrent que vous n'avez pas pris le temps de potasser un cours/tuto. sur Python.

    C'est quelque chose que vous auriez pu/pouvez faire tout seul.
    Après mettez vous à la place d'un employeur, un ou des stagiaires, c'est un ou plusieurs employés qui vont les suivre et pendant qu'ils encadrent le stagiaire, ils ne bossent pas.

    Entre des candidats qui savent se dépatouiller à qui on pourra confier des bouts de projets et ceux qui vont passer leur temps à lire des tutos pour apprendre les bases, le choix sera vite fait.

    Un stage en entreprise, c'est pas pour apprendre les bases de la programmation, mais plutôt la construction d'un projet informatique, le travail en équipe, le suivi qualité,...
    La vrai vie de programmeur qu'on ne peut pas vous apprendre dans des tutos.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #27
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Salut,
    Citation Envoyé par Sve@r Voir le message
    Un de mes premiers programmes "sérieux" en Python a été la résolution du jeu "le compte est bon". On lui passe le nombre à atteindre puis les plaques pour le trouver et il trouve. Selon le principe suivant: pour trouver 123 avec 1, 2, 3, 4, 5 et 6 je regarde si je peux trouver 123 avec 3, 3, 4, 5 et 6 et etc (récursif). Avec les opérations +, -, * et // (plus quelques optimisations comme déjà ranger les plaques dans l'ordre décroissant ce qui permet de ne pas refaire un même traitement quand on a des nombres identiques et simplifie la gestion des soustractions et divisions).
    Et s'il trouve pas 123, alors il cherche 122 puis 124 puis 121 puis 125 puis 120 puis 126 etc jusqu'à ce qu'il finisse par trouver.
    Ah intéressant...Cela ne me semble pas évident de trouver l'algorithme permettant de tester toutes les possibilités... Je ne sais pas si j'aurais trouvé tout seul... J'ai regardé ce site : https://www.dcode.fr/compte-est-bon

    Bon il te reste à faire "Le Mot le Plus Long"...lol

  8. #28
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Beginner. Voir le message
    Ah intéressant...Cela ne me semble pas évident de trouver l'algorithme permettant de tester toutes les possibilités...
    Sisi, pas compliqué
    Tu pars de ta liste de nombres que tu classes par ordre décroissant. Exemple 75, 25, 10, 5, 5 et 1.
    De là tu entames une boucle sur le premier nombre (75). Puis une boucle interne sur tous les autres (25, 10, 5, 5 et 1). Puis une 3° boucle sur toutes les opérations (+, -, * et -). Tu calcules le résultat de l'opération des nombres (75+25) et tu regardes si ce résultat correspond au nombre à trouver.
    Si c'est pas le cas, tu remplaces les deux nombres en cours par le résultat ce qui donne une nouvelle liste 100, 10, 5, 5 et 1.
    Et de là tu recommences en récursif avec cette nouvelle liste.
    Plus quelques petits tests surl la possibilité de diviser ou l'utilité de multiplier (par 1), un test dans la première boucle voir si le nombre à traiter est identique à celui d'avant (comme avec 5 et 5) ce qui permet de sauter une itération déjà effectuée et quand l'ensemble se termine, t'as absolument tout testé.
    Et quand j'ai fait ce code, je ne connaissais pas le module itertools et sa fonction "combinations". Maintenant je pourrais m'éviter carrément les deux premières boucles.

    Citation Envoyé par Beginner. Voir le message
    Bon il te reste à faire "Le Mot le Plus Long"...lol
    Ca j'aime moins.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  9. #29
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Merci.
    Citation Envoyé par Sve@r Voir le message
    Sisi, pas compliqué
    Je ne sais pas car je n'ai pas vraiment essayé, je veux dire que j'ai lu des explications avant d'avoir essayé et bien sûr une fois qu'on te donne la solution on se dit que ce n'était pas si compliqué en fin de compte...

    Citation Envoyé par Sve@r Voir le message
    Tu pars de ta liste de nombres que tu classes par ordre décroissant. Exemple 75, 25, 10, 5, 5 et 1.
    Bien vu. Cette astuce par contre ils n'en ont pas parlé dans le site que j'ai visité...

  10. #30
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 64
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    [Je cite pour la notification]
    Salut, merci pour votre intervention. Je comprends tout à fait votre point de vue, cependant :
    • Je passe beaucoup de temps à essayer de me remettre à niveau sur beaucoup de choses. Je lis énormément de tutos, énormément de man, je me débrouille au maximum tout seul. Pour Python par exemple, les seuls "programmes" que j'ai analysés étaient des codes assez simples, avec des syntaxes simplistes, donc facilement compréhensible mais assez éloigné de l'Orienté Objet en général. Donc forcément, devant toutes ces nouveautés, j'ai préférés demander directement entre autre parce que j'avais ouvert un sujet.
    • Je comprends aussi votre point de vue concernant celui des recruteurs. Cependant la plupart me convoquent pour divers entretiens après avoir pris connaissance de mon CV, qui se trouve être à mon sens assez clair par rapport à mon niveau en programmation et en général. En tout cas j'espère que c'est le cas. Donc quand je suis recalé pour mon trop faible niveau, je trouve cela dommage puisque je l'indique d'emblée clairement.
    • Parfois, demander plutôt que de chercher se traduit par un choix de rapidité/facilité - ou de la flemme, pour certains -. En ce qui me concerne, j'étais confronté à un test, j'avais quelques bémols, alors je suis passé du côté obscur afin d'obtenir rapidement des informations plutôt que de prendre le temps pour chercher. Je conçois tout à fait que ce n'est pas la chose à faire, cependant là j'ai estimé que demander une information pendant que j'avançais sur autre chose pouvait me faire gagner du temps.
    • Demander permet aussi d'obtenir des réponses claires et concises, ce qui est souvent le cas ici, et ça résume parfois très bien un ou plusieurs chapitres entiers.
    • Pour conclure, j'apprends énormément seul, mais à l'occasion de ce test, je me suis permis des écarts de conduite.


    @Sve@r, merci pour toutes ces indications. En ce qui me concerne je suis plutôt attiré par la programmation système et non algorithmique - après peut-être qu'elles sont intimement liées -. Pour le moment, je vais déjà améliorer mon petit test
    J'ai eu des cours de Java cette année, mais n'ayant pour le coup rien retenu - je vais d'ailleurs les ressortir -, j'espère que ce que je vais dire par la suite ne comporte pas d'erreur :
    • Méthode == fonction ( == Classe) ?
    • Objet == structure ?
    • Attribut == variable ?
    • Classe == ensemble de méthodes et de variables (== Objet) ?
    • Instance d'une classe == variable déclarée dans cette classe ?


    Sinon je n'ai pas bien compris ton exemple concernant l'instance et self : a.listen(), c'est donc l'objet cSocket qui appelle sa méthode listen() en lui passant le paramètre a ? Car je comprends mal l'écriture a.cSocket(), je pensais que a était un objet de type cSocket() du coup.

    A l'occasion je pourrais te montrer mon script sur Github

  11. #31
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par .....1..... Voir le message
    [*] Méthode == fonction ( == Classe) ?
    Méthode = fonction intégrée dans une classe oui

    Citation Envoyé par .....1..... Voir le message
    [*] Objet == structure ?
    Objet = structure + méthodes

    Citation Envoyé par .....1..... Voir le message
    [*] Attribut == variable ?
    Attribut = variable de classe oui

    Citation Envoyé par .....1..... Voir le message
    [*] Classe == ensemble de méthodes et de variables (== Objet) ?
    Oui

    Citation Envoyé par .....1..... Voir le message
    [*] Instance d'une classe == variable déclarée dans cette classe ?
    Oui

    Citation Envoyé par .....1..... Voir le message
    Sinon je n'ai pas bien compris ton exemple concernant l'instance et self
    Ok. Imagine le code suivant
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class toto():
    	def __init__(self, n): self.n=n
     
    var=toto(123)

    Maintenant tu veux rajouter une méthode d'affichage qui doit afficher "toto.n". Tu modifies donc ton code et commences la méthode ainsi
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    class toto():
    	...
    	def affich...
    Et là, un blanc. Comment afficher le "n" de l'instance qui appelle cette méthode ? Il faut le récupérer ce "n". Du dehors c'est var.n (membre "n" de l'instance "var") mais dans la classe, c'est le membre "n" de quelle instance ?
    Il faut référencer cette instance. Et pour ça, cette référence doit être envoyée dans la méthode. Et si elle est envoyée, il faut que la méthode possède un paramètre pour la recevoir => son premier paramètre. Tu peux donc finir le code
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class toto():
    	...
    	def affich(xxx): print(xxx.n)				# Puisque "xxx" contient l'instance qui l'invoque, alors c'est un objet "toto". Donc il contient le membre "n" qu'on peut utiliser
    # class toto()
     
    var=toto(123)
    var.affich()						# Ou alors toto.affich(var)

    Une fois que tu as compris ça, tu as tout compris. Ensuite ne reste qu'à apprendre que par convention (donc par consensus librement consenti entre les dev Python), la variable dédiée à recevoir l'instance se nomme "self".

    Citation Envoyé par .....1..... Voir le message
    a.listen(), c'est donc l'objet cSocket qui appelle sa méthode listen() en lui passant le paramètre a ?
    C'est ça.

    Citation Envoyé par .....1..... Voir le message
    Car je comprends mal l'écriture a.cSocket()
    a.cSocket() n'existe pas. C'est soit a.listen() qui est une autre écriture simplifiée de cSocket.listen(a), soit a=cSocket() identique sur le fond avec b=int() (création d'une variable de type "cSocket" dans le premier cas, création d'une variable de type "int" dans le second)

    Citation Envoyé par .....1..... Voir le message
    je pensais que a était un objet de type cSocket() du coup.
    Ben oui. Donc il a le droit d'utiliser les attributs et méthodes publiques de l'objet.

    Citation Envoyé par .....1..... Voir le message
    A l'occasion je pourrais te montrer mon script sur Github
    Ben ta deadline était jeudi dernier ?
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  12. #32
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Salut,

    Citation Envoyé par Sve@r Voir le message
    Citation Envoyé par .....1..... Voir le message
    [*] Classe == ensemble de méthodes et de variables (== Objet) ?
    Oui

    Citation Envoyé par .....1..... Voir le message
    [*] Instance d'une classe == variable déclarée dans cette classe ?
    Oui
    Perso je vois la classe comme une espèce de modèle sur lequel les objets sont construis, elle définie effectivement un ensemble de méthodes et d'attributs mais je ne dirais pas que c'est un objet... Les classes permettent en quelque sorte de définir ses propres types de données (qui viennent s'ajouter aux types primitifs déjà présent nativement)...

    Et je dirais qu'une "Instance d'une classe" ---> c'est un objet (ayant les propriétés (méthodes et attributs) définies par la classe) du type correspondant à la classe plutôt qu'une "variable déclarée dans cette classe"... Tout objet est une instance d'une classe...

    Mais il faut faire attention à la distinction (source: ici) : En programmation orientée classe, l'instanciation est la création d'un objet à partir d'une classe. En programmation orientée prototype, l'instanciation consiste à créer un nouvel objet à partir d'un objet existant (clonage).

    Le premier me fait penser par exemple à Java (et C++) tandis que le deuxième me fait penser par exemple à JavaScript... Et j'aurais tendance à penser que Python correspond au premier cas...

    Bon chacun aura sa terminologie, ce n'est pas facile ces concepts mais l'essentiel c'est que chacun s'y retrouve...

  13. #33
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Beginner. Voir le message
    Bon chacun aura sa terminologie
    Ce n'est pas tout à fait ça. Il existe des définitions très précises des choses, mais ces définitions sont (en général) totalement incompréhensibles.
    On n'explique pas de la même façon les choses à un débutant qu'à un professionnel. Et c'est valable pour toute matière scientifique. Les choses qu'on apprend à un débutant sont plus simples (pour qu'il comprenne l'essentiel de l'idée) mais ipso-facto totalement fausses pour un professionnel.
    Et au fur et à mesure de l'apprentissage, on désapprend ce qui a été appris pour le remplacer par la nouvelle notion à la fois plus précise mais plus complexe (le fameux "il te faut désapprendre tout ce que tu as appris" à la zen qu'on trouve dans Star Wars ou dans les films de karaté de 3° ordre). Mais c'est la compréhension de la couche précédente qui permet alors de comprendre la couche suivante.
    Exemple: au petit enfant qui regarde le soleil, on lui dira qu'il tourne autour de la Terre. Plus tard, il apprendra qu'en fait le soleil ne bouge pas mais c'est en réalité la Terre qui tourne autour. Plus tard (s'il se spécialise dans l'astronomie), il apprendra qu'en fait le soleil tourne autour du centre de la galaxie immobile. Et après que la galaxie en fait se déplace vers une destination à la con.
    Autre exemple: pour le pékin moyen (toi, moi, .....1.....), la Terre est ronde. Pour le géographe professionnel, elle n'est pas ronde mais a la forme d'une patate.
    Autre exemple: pour 7,9 milliards de gens, un nombre relatif c'est simplement un nombre allant dans un sens (+5) ou dans l'autre (-4) par rapport à un sens de référence (encore que là déjà je suis sûrement au delà de la compréhension du premier tiers de ces 7,9 milliards qui ne comprend même pas qu'il puisse exister des distances négatives). Mais pour les 12 mathématiciens totalement déconnectés de la réalité qu'on a dans le monde, un nombre relatif c'est un couple (a;b) de nombres naturels pour lequel tout nombre m fait que (a+; b+m) équivaut à (a; b). T'as compris quelque chose toi ? Moi non pourtant c'est la définition exacte d'un nombre relatif dans la théorie des ensembles (j'ai cherché dans ma biblothèque pour retrouver le livre qui en parle). M. Jourdain fait peut-être de la prose sans le savoir (Le bourgeois gentilhomme, Molière) mais en réalité il s'en bat totalement le steak de savoir qu'il fait de la prose quand il parle. Et j'ai suivi un cours Python dit "avancé" sur Mooc où les questions posées étaient de donner la différence entre "itérateur" et "iterable" ce qui, dans ma vie de tout les jours (même de dev python) me sert absolument à que dalle.

    La simplification des choses permet de comprendre ces choses, mais fatalement détruit l'exactitude de la chose. Exactement comme le principe d'incertitude d'Heinsenberg: on ne peut pas connaitre à la fois la position et la vitesse d'une particule ; on ne peut pas non plus expliquer à la fois avec clarté et avec exactitude une notion. Je préfère la clarté au détriment de l'exactitude qui pourra alors venir plus tard

    Citation Envoyé par Beginner. Voir le message
    mais l'essentiel c'est que chacun s'y retrouve...
    Exactement
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  14. #34
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 64
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    [...]
    Une fois que tu as compris ça, tu as tout compris. Ensuite ne reste qu'à apprendre que par convention (donc par consensus librement consenti entre les dev Python), la variable dédiée à recevoir l'instance se nomme "self".
    [...]
    Pour le moment je n'ai pas encore tout saisi...ça va venir, probablement quand je le réécrirai

    Citation Envoyé par Sve@r Voir le message
    a.cSocket() n'existe pas.
    Pardon oui, j'ai écrit un peu vite et n'ai pas fait gaffe à l'erreur lors de la relecture.

    Citation Envoyé par Sve@r Voir le message
    Ben ta deadline était jeudi dernier ?
    Oui, mais je pleurniche parce que je ne sais pas quoi programmer, et là j'ai entamé un truc qui n'est visiblement pas optimal, alors autant profiter de l'occasion et le reprendre de façon à ce qu'il ressemble à quelque chose de correct

  15. #35
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Salut,
    Citation Envoyé par Sve@r Voir le message
    Ce n'est pas tout à fait ça. Il existe des définitions très précises des choses, mais ces définitions sont (en général) totalement incompréhensibles.
    On n'explique pas de la même façon les choses à un débutant qu'à un professionnel. Et c'est valable pour toute matière scientifique.
    ...
    Effectivement.

Discussions similaires

  1. Déclaration de fonction dans le "main".
    Par Pragmateek dans le forum C++
    Réponses: 14
    Dernier message: 23/06/2006, 19h32
  2. déclaration de fonctions externes
    Par poukill dans le forum C++
    Réponses: 40
    Dernier message: 17/05/2006, 16h15
  3. Réponses: 4
    Dernier message: 11/05/2006, 15h34
  4. Réponses: 6
    Dernier message: 20/11/2005, 02h53
  5. [JS] Problème déclaration de fonction
    Par glloq8 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 23/09/2005, 10h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo