String en Python
Résolu
lionelronaldo
-
fiddy Messages postés 11069 Date d'inscription Statut Contributeur Dernière intervention -
fiddy Messages postés 11069 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
Le compilateur Python (version 3.1.3) bloque sur la première ligne, et surligne le dernier '.
Comment l'expliquez-vous ? Quelle est d'ailleurs la différence entre les guillements ordinaires " " et ' ' ?
Merci par avance
Le compilateur Python (version 3.1.3) bloque sur la première ligne, et surligne le dernier '.
if data == 'q' : break
Comment l'expliquez-vous ? Quelle est d'ailleurs la différence entre les guillements ordinaires " " et ' ' ?
Merci par avance
A voir également:
- String en Python
- Citizen code python avis - Accueil - Outils
- \R python ✓ - Forum Python
- Mot secret python pix ✓ - Forum Python
- Python est introuvable. exúcutez sans argument pour procúder ó l ✓ - Forum Python
- Ce programme est écrit en python il construit un mot secret ✓ - Forum Python
6 réponses
Bonjour,
À ma connaissance, il n'y a pas de différence entre l'utilisation de " et celle de ' pour les chaînes, même en Python 3.
Les deux sont des délimiteurs de chaînes et c'est bien pratique pour écrire par exemple:
"il l'a pris"
'Zinedine, dit "Zizou", ne joue plus'
Pour le reste je ne serai pas aussi affirmatif car je n'utilise que Python 2 et la représentation des chaînes est différente en Python 3, pour lequel les chaînes sont toutes Unicode de base.
En Python 2, il n'y a pas de types séparés chaîne et caractère, un caractère est une chaîne de longueur 1:
The items of a string are characters. There is no separate character type; a character is represented by a string of one item.
https://docs.python.org/3/reference/datamodel.html#the-standard-type-hierarchy
En Python 3, je ne suis pas sûr de pourvoir affirmer la même chose, on retrouve pas la même formulation dans la doc de Python 3.
Mais je trouve assez bizarre l'idée qu'il y ait un type char et un type str en Python 3 et qu'on ne puisse pas comparer les deux. C'est à mon avis faux, on doit pouvoir écrire data = 'q' oû data sera une chaîne
En Python 3, il y a des petites choses qui changent dans la yntaxe. Peut être Python 3 exige-t-il des parenthèses autour du test, alors que ce n'est pas le cas en Python 2....:
if (data == 'q'):
????
Est-ce que data est bien une chaîne ? Tu dervais faire print type(data) pour vérifier son type.
Il faudrait aussi que tu montres le message d'erreur, ce serait mieux pour comprendre.
Sinon , en l'état, je donne ma langue au chat
À ma connaissance, il n'y a pas de différence entre l'utilisation de " et celle de ' pour les chaînes, même en Python 3.
Les deux sont des délimiteurs de chaînes et c'est bien pratique pour écrire par exemple:
"il l'a pris"
'Zinedine, dit "Zizou", ne joue plus'
Pour le reste je ne serai pas aussi affirmatif car je n'utilise que Python 2 et la représentation des chaînes est différente en Python 3, pour lequel les chaînes sont toutes Unicode de base.
En Python 2, il n'y a pas de types séparés chaîne et caractère, un caractère est une chaîne de longueur 1:
The items of a string are characters. There is no separate character type; a character is represented by a string of one item.
https://docs.python.org/3/reference/datamodel.html#the-standard-type-hierarchy
En Python 3, je ne suis pas sûr de pourvoir affirmer la même chose, on retrouve pas la même formulation dans la doc de Python 3.
Mais je trouve assez bizarre l'idée qu'il y ait un type char et un type str en Python 3 et qu'on ne puisse pas comparer les deux. C'est à mon avis faux, on doit pouvoir écrire data = 'q' oû data sera une chaîne
En Python 3, il y a des petites choses qui changent dans la yntaxe. Peut être Python 3 exige-t-il des parenthèses autour du test, alors que ce n'est pas le cas en Python 2....:
if (data == 'q'):
????
Est-ce que data est bien une chaîne ? Tu dervais faire print type(data) pour vérifier son type.
Il faudrait aussi que tu montres le message d'erreur, ce serait mieux pour comprendre.
Sinon , en l'état, je donne ma langue au chat
lionelronaldo
Merci heyquem
lionelronaldo
J'ai donné le code ci-dessous.
lionelronaldo
Le message d'erreur précis, c'est "invalid syntax".
En C
" " indique une chaine de caractères
' ' indique un caractère seul
Edit : apparemment pour Python pas de différence
je ne vois pas par contre pourquoi le compilateur bloque dessus. data peut contenir plusieurs caractères?
peut être un problème de type...
Je crois qu'en comparaisons de caractères ou de chaines le "==" n'est pas toujours approprié car il compare bit à bit.
" " indique une chaine de caractères
' ' indique un caractère seul
Edit : apparemment pour Python pas de différence
je ne vois pas par contre pourquoi le compilateur bloque dessus. data peut contenir plusieurs caractères?
peut être un problème de type...
Je crois qu'en comparaisons de caractères ou de chaines le "==" n'est pas toujours approprié car il compare bit à bit.
Bonjour,
Pas de différence entre " " et ' '.
As-tu bien fait attention à l'indentation ?
Comment lances-tu ton programme ? Via : python programme.py
ou via : programme.py ?
Dans ce dernier cas, as-tu bien mis l'entête ?
Pas de différence entre " " et ' '.
As-tu bien fait attention à l'indentation ?
Comment lances-tu ton programme ? Via : python programme.py
ou via : programme.py ?
Dans ce dernier cas, as-tu bien mis l'entête ?
A l'origine de ma question, il y a un code trouvé sur un forum internet, et qui ne fonctionne pas chez moi. Le forum en question n'ayant pas l'air très actif, j'ai préféré poser ma question sur commentcamarche.net.
Donc voici le code :
Je l'ai enregistré sous un fichier serveur_pythonforum.py. Et ensuite dans IDLE, j'ai cliqué sur "Run Module" (F5).
Le programme fonctionne-t-il chez vous ?
Donc voici le code :
from socket import * import string from time import ctime HOST = '' PORT = 1001 BUFSIZ = 1024 ADDR = (HOST, PORT) ssock = socket(AF_INET, SOCK_STREAM) ssock.bind(ADDR) ssock.listen(5) try: while True: c = 1 print 'Waiting for a connection...' csock, addr = ssock.accept() hostname, aliases, addresses = gethostbyaddr(addr[0]) lip, lport = ssock.getsockname() print ''' Connected ... Remote Host : %s Remote host IP : %s Remort Port : %d Connected time : %s Local IP : %s Local Port : %d \n''' % (hostname , addr[0], addr[1], ctime(), lip, lport) while True: data = csock.recv(BUFSIZ) if data == 'q': break elif data == 'shut': ssock.close() break elif data == ' ': csock.send('Server Responce: <> \n') print 'srv responces: %d : <>' % c c += 1 else: data1 = data.upper() csock.send('Server Responce: %s \n' % data1) print 'srv responces: %d : <%s>' % (c, data1) c += 1 csock.close() except: print 'Server socket closed !!!'
Je l'ai enregistré sous un fichier serveur_pythonforum.py. Et ensuite dans IDLE, j'ai cliqué sur "Run Module" (F5).
Le programme fonctionne-t-il chez vous ?
Alors justement j'avais corrigé ceci en transformant
en
Mais je n'ai pas réussi à corriger
J'ai moi aussi soupçonné un problème de version car un autre programme que j'avais écrit moi-même en Python, il y a environ 5 ans, ne fonctionne plus :-(
print 'Waiting for a connection...'
en
print('Waiting for a connection...')
Mais je n'ai pas réussi à corriger
if data == 'q': break
J'ai moi aussi soupçonné un problème de version car un autre programme que j'avais écrit moi-même en Python, il y a environ 5 ans, ne fonctionne plus :-(
J'ai beau chercher, je ne vois pas de syntaxe mal écrite.
Ce que je pense , c'est que csock.recv(BUFSIZ) ne renvoie pas une chaîne.
Il faudrait que tu insères une ligne pour afficher des renseignements sur data :
Je n'ai pas a possibilité de regarder moi-meme le résultat car ce programme est un programme de réception d'un message via soket. Or personne n'est censé m'envoyer un message par socket. Il faudrait que je crée et lance un programme qui envoie un message par socket de et vers mon propre ordinateur, mais je ne connais pas suffisamment les sockets.
Tu devrais aussi enlever les deux lignes qui posent problème, pour voir si celui-ci se déplace sur if data == 'shut' ou si a le fait disparaître :
Ce que je pense , c'est que csock.recv(BUFSIZ) ne renvoie pas une chaîne.
Il faudrait que tu insères une ligne pour afficher des renseignements sur data :
data = csock.recv(BUFSIZ) print 'type(data)==',type(data) print 'len de data==',len(data) print 'data==',data if data == 'q': break
Je n'ai pas a possibilité de regarder moi-meme le résultat car ce programme est un programme de réception d'un message via soket. Or personne n'est censé m'envoyer un message par socket. Il faudrait que je crée et lance un programme qui envoie un message par socket de et vers mon propre ordinateur, mais je ne connais pas suffisamment les sockets.
Tu devrais aussi enlever les deux lignes qui posent problème, pour voir si celui-ci se déplace sur if data == 'shut' ou si a le fait disparaître :
data = csock.recv(BUFSIZ) print 'type(data)==',type(data) print 'len de data==',len(data) print 'data==',data if data == 'shut': ssock.close() break elif data == ' ': csock.send('Server Responce: <> \n') print 'srv responces: %d : <>' % c c += 1
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
« Ce que je pense , c'est que csock.recv(BUFSIZ) ne renvoie pas une chaîne. »
Idée idiote:
socket.recv(bufsize[, flags])
Receive data from the socket. The return value is a string representing the data received.
https://docs.python.org/3/library/socket.html#socket.socket.recv
À part ça,
j'ai spécifié HOST = 'localhost' à la place de HOST = '' et inséré une ligne
print '\ndata :',type(data),' de len',len(data),' :\n',data
dans le code de socket serveur que tu avais donné,
j'ai créé un autre code pour jouer le rôle de socket client avec la même spécification HOST = 'localhost' ,
et j'ai obtenu une réception de données par le socket serveur
qui n'a pas produit d'erreur au niveau de if data == 'q': break
lionelronaldo,
étant donné qu'il n'est pas possible de reproduire l'erreur, que tu joues au fantôme sur CCM et que le code que tu avais posté a disparu (!?) , je me désintéresse de ce sujet.
Idée idiote:
socket.recv(bufsize[, flags])
Receive data from the socket. The return value is a string representing the data received.
https://docs.python.org/3/library/socket.html#socket.socket.recv
À part ça,
j'ai spécifié HOST = 'localhost' à la place de HOST = '' et inséré une ligne
print '\ndata :',type(data),' de len',len(data),' :\n',data
dans le code de socket serveur que tu avais donné,
j'ai créé un autre code pour jouer le rôle de socket client avec la même spécification HOST = 'localhost' ,
et j'ai obtenu une réception de données par le socket serveur
qui n'a pas produit d'erreur au niveau de if data == 'q': break
lionelronaldo,
étant donné qu'il n'est pas possible de reproduire l'erreur, que tu joues au fantôme sur CCM et que le code que tu avais posté a disparu (!?) , je me désintéresse de ce sujet.
Dans Python 3, il faut faire attention à ce que print soit bien une fonction (i.e. il faut rajouter des parenthèses). On en avait déjà parlé plus haut mais j'avais oublié des parenthèses à un moment. Maintenant ça marche. Voici le code corrigé :
Autre nouveauté de Python 3, raw_input a été remplacée par input. J'ai aussi dû jouer avec encode() et decode().
Merci à tous, drackenshtein, heyquem et fiddy. J'espère n'en oublier aucun !
from socket import * import string from time import ctime HOST = '' PORT = 1044 BUFSIZ = 1024 ADDR = (HOST, PORT) ssock = socket(AF_INET, SOCK_STREAM) ssock.bind(ADDR) ssock.listen(5) try: while True: c = 1 print('Waiting for a connection...') csock, addr = ssock.accept() hostname, aliases, addresses = gethostbyaddr(addr[0]) lip, lport = ssock.getsockname() print(''' Connected ... Remote Host : %s Remote host IP : %s Remort Port : %d Connected time : %s Local IP : %s Local Port : %d \n''' % (hostname , addr[0], addr[1], ctime(), lip, lport)) while True: data = csock.recv(BUFSIZ) if data == 'q': break elif data == 'shut': ssock.close() break elif data == ' ': csock.send('Server Responce: <> \n') print('srv responces: %d : <>' % c) c += 1 else: data1 = data.upper() csock.send('Server Responce: %s \n' % data1) print('srv responces: %d : <%s>' % (c, data1)) c += 1 csock.close() except: print('Server socket closed !!!')
Autre nouveauté de Python 3, raw_input a été remplacée par input. J'ai aussi dû jouer avec encode() et decode().
Merci à tous, drackenshtein, heyquem et fiddy. J'espère n'en oublier aucun !
Tiens je croyais que tu avais disparu.
Comment se fait il que tu arrives à poster des questions et des réponses alors que tu n'es pas inscrit comme membre ? :
- ton pseudo en grisé et non pas en bleu=lien
- https://www.commentcamarche.net/communaute/profil-lionelronaldo
Cet utilisateur n'est pas membre de CommentCaMarche.net !
------------------------------------
Bon, il semble que le problème soit résolu. Je ne voyais plus quoi faire d'autre.
J'en conclus la chose suivante:
- en Python 2, quand il y a une erreur , c'est parfois à propos de la ligne suivante que l'interpréteur signale une erreur. Il faut regarder alors au dessus de la ligne dénoncée
- j'y avais pensé pour ton erreur, mais il semble qu'avec Python 3, le piège se soit accru. C'est apparemment parce qu'il manquait les parenthèses dans l'instruction print plusieurs lignes plus haut qu'une erreur était signalé sur if data == 'q', à tort. Ça doit tenir à la complexité accrue de ce qu'est capable de faire print dans Python 3.
Eh ben , je ne savais pas ! Encore appris quelque chose aujourd'hui.
Merci pour l'information.
Comment se fait il que tu arrives à poster des questions et des réponses alors que tu n'es pas inscrit comme membre ? :
- ton pseudo en grisé et non pas en bleu=lien
- https://www.commentcamarche.net/communaute/profil-lionelronaldo
Cet utilisateur n'est pas membre de CommentCaMarche.net !
------------------------------------
Bon, il semble que le problème soit résolu. Je ne voyais plus quoi faire d'autre.
J'en conclus la chose suivante:
- en Python 2, quand il y a une erreur , c'est parfois à propos de la ligne suivante que l'interpréteur signale une erreur. Il faut regarder alors au dessus de la ligne dénoncée
- j'y avais pensé pour ton erreur, mais il semble qu'avec Python 3, le piège se soit accru. C'est apparemment parce qu'il manquait les parenthèses dans l'instruction print plusieurs lignes plus haut qu'une erreur était signalé sur if data == 'q', à tort. Ça doit tenir à la complexité accrue de ce qu'est capable de faire print dans Python 3.
Eh ben , je ne savais pas ! Encore appris quelque chose aujourd'hui.
Merci pour l'information.