Autor Tema: Dudas con escribir codigo  (Leído 6098 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Dudas con escribir codigo
« en: 24 de Julio de 2016, 05:54:32 »
Abro este apartado para dudas en la manera de escribir instrucciones y así no mezclar temas.
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re:Dudas con escribir codigo
« Respuesta #1 en: 24 de Julio de 2016, 06:19:25 »
Hola KILLERJC lo que comentas al final de este post http://www.todopic.com.ar/foros/index.php?topic=46580.msg389282;topicseen#msg389282 lo tengo mas o menos claro, la duda que tengo es que si escribo
Código: Python
  1. valor = 2563
y despues en la otra instrucción pongo
Código: Python
  1. str(valor)
me imprime el entero entre comillas simples como si de un string se tratara, pero con
Código: Python
  1. print(("Valor: " + str(valor)))
me lo imprime sin ningún tipo de comillas y no se si es correcto, de todos modos si después de imprimir en pantalla el valor hago type(valor) en los dos casos me dice que es un int.
En el caso del valor entre comillas al hacer
Código: Python
  1. type(valor)
¿no debería de decirme que valor ahora es de tipo string?

Gracias y perdón por preguntar tanto.
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Dudas con escribir codigo
« Respuesta #2 en: 24 de Julio de 2016, 12:13:50 »
Código: Python
  1. >>> valor = 1234
  2. >>> str(valor)
  3. '1234'
  4. >>> print(("Valor: " + str(valor)))
  5. Valor: 1234
  6. >>> type(valor)
  7. <class 'int'>
  8. >>> type(str(valor))
  9. <class 'str'>
  10. >>> type(("Valor: " + str(valor)))
  11. <class 'str'>
  12. >>> "Valor: " + str(valor)
  13. 'Valor: 1234'

Valor es un entero... el hacer str(valor) NO convierte a valor en un string, pensalo como en una funcion que vos le pasas un valor numerico y te devuelve un string. Por lo tanto valor SIGUE siendo un entero.

espero que con los ejemplos de arriba te des cuenta que todos los demas son strings. ya que los pasas por el str().

Lo que no te imprima las comillas es por que vos estas pidiendo que no te imprima comillas con el Printf, es decir no tenes puestas comillas. Observaras cuando hice:

Código: Python
  1. "Valor :" + str(valor)

el resultado es con comillas pero al hacerlo con el printf no, Por que vos no estas pidiendo esto: "\'Valor: " +str(valor) + "\'"
Espero hacerme entender.
« Última modificación: 24 de Julio de 2016, 12:50:00 por KILLERJC »

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re:Dudas con escribir codigo
« Respuesta #3 en: 24 de Julio de 2016, 12:20:31 »
Gracias KILLERJC ya entiendo la diferencia.
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado tsk

  • PIC18
  • ****
  • Mensajes: 255
Re:Dudas con escribir codigo
« Respuesta #4 en: 24 de Julio de 2016, 21:53:22 »
print esta diseñado para imprimir a pantalla
str NO

Al ejecutar str(valor) dentro de la consola de python este retorna en pantalla el resultado de convertir Valor a string. El objetivo es que puedas ver/inspeccionar el resultado y/o el contenido de una función o variable en la consola de python de forma interactiva.

Si realizas un programa en python que contenga

Código: [Seleccionar]
Valor = 1234
str(1234)
print(("Valor: %s")%Valor)
print("Valor: "+str(Valor))

Lo guardas en un archivo llamado prueba.py y lo ejecutas desde la terminal con

Código: [Seleccionar]
python prueba.py

Los únicos que te dará salida son los print, el otro sólo dará salida cuando estés en la consola de python

Otro ejemplo donde se aprecia claramente la diferencia entre inspeccionar el contenido e imprimir a pantalla es el siguiente:

Código: [Seleccionar]
import os
os.__doc__
print(os.__doc__)

La salida del primer comando va a ser

Código: [Seleccionar]
>>> os.__doc__
"OS routines for NT or Posix depending on what system we're on.\n\nThis exports:\n  - all functions from posix, nt or ce, e.g. unlink, stat, etc.\n  - os.path is either posixpath or ntpath\n  - os.name is either 'posix', 'nt' or 'ce'.\n  - os.curdir is a string representing the current directory ('.' or ':')\n  - os.pardir is a string representing the parent directory ('..' or '::')\n  - os.sep is the (or a most common) pathname separator ('/' or ':' or '\\\\')\n  - os.extsep is the extension separator (always '.')\n  - os.altsep is the alternate pathname separator (None or '/')\n  - os.pathsep is the component separator used in $PATH etc\n  - os.linesep is the line separator in text files ('\\r' or '\\n' or '\\r\\n')\n  - os.defpath is the default search path for executables\n  - os.devnull is the file path of the null device ('/dev/null', etc.)\n\nPrograms that import and use 'os' stand a better chance of being\nportable between different platforms.  Of course, they must then\nonly use functions that are defined by all platforms (e.g., unlink\nand opendir), and leave all pathname manipulation to os.path\n(e.g., split and join).\n"

Puedes observar que no formatea la salida, puedes ver los saltos de línea  y demás caracteres de escape

La salida del segundo

Código: [Seleccionar]
>>> print(os.__doc__₎
OS routines for NT or Posix depending on what system we're on.

This exports:
  - all functions from posix, nt or ce, e.g. unlink, stat, etc.
  - os.path is either posixpath or ntpath
  - os.name is either 'posix', 'nt' or 'ce'.
  - os.curdir is a string representing the current directory ('.' or ':')
  - os.pardir is a string representing the parent directory ('..' or '::')
  - os.sep is the (or a most common) pathname separator ('/' or ':' or '\\')
  - os.extsep is the extension separator (always '.')
  - os.altsep is the alternate pathname separator (None or '/')
  - os.pathsep is the component separator used in $PATH etc
  - os.linesep is the line separator in text files ('\r' or '\n' or '\r\n')
  - os.defpath is the default search path for executables
  - os.devnull is the file path of the null device ('/dev/null', etc.)

Programs that import and use 'os' stand a better chance of being
portable between different platforms.  Of course, they must then
only use functions that are defined by all platforms (e.g., unlink
and opendir), and leave all pathname manipulation to os.path
(e.g., split and join).

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re:Dudas con escribir codigo
« Respuesta #5 en: 25 de Julio de 2016, 06:45:37 »
Gracias tsk entre esto y lo demás ya tengo para estrujarme la cabeza.

Miquel_S
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re:Dudas con escribir codigo
« Respuesta #6 en: 02 de Agosto de 2016, 11:49:33 »
Me surge una duda con lo que hace esta instrucción:
Código: Python
  1. >>> sys.path = ['..'] + sys.path
despues de ella he probado con hacer un
Código: Python
  1. >>> print(sys.path)
y me imprime en pantalla
Código: Python
  1. ['..', '', '/usr/lib/python35.zip', '/usr/lib/python3.5', '/usr/lib/python3.5/plat-x86_64-linux-gnu', '/usr/lib/python3.5/lib-dynload', '/usr/local/lib/python3.5/dist-packages', '/usr/lib/python3/dist-packages']
lo que parece ser la ruta donde están instaladas las librerías que usa python, de ser así ¿Seria correcto poner esta instrucción en todos los programas o por el contrario no es esto lo que esta haciendo dicha instrucción?

Gracias.
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado tsk

  • PIC18
  • ****
  • Mensajes: 255
Re:Dudas con escribir codigo
« Respuesta #7 en: 02 de Agosto de 2016, 14:35:20 »
sys.path contiene las rutas donde python irá a buscar los módulos que importes con import.

Por lo general no es común que uses el sys.path, el mismo sistema de encarga de ubicar los módulos que se importan y que se encuentran dentro del árbol de directorios de tu proyecto con tan sólo añadir un archivo llamado __init__.py dentro de cada directorio.

al tu añadir el directorio .. a tu ruta este buscará también los módulos un directorio atrás de donde tu programa se esté ejecutando actualmente, no con respecto al archivo .py.

Por ejemplo:

Código: [Seleccionar]
import os
import sys


sys.path.append('..')

print(os.listdir(sys.path[-1]))

Código: [Seleccionar]
$ pwd
/home/alex/proyectos/python/tests
$ python3 test1.py
['tests', 'ANU', 'hashtables_tests']
$ cd ..
$ python3 tests/test1.py
['wimdAPI', 'MicrochipData', 'RaspberryPi', 'arm_ide', 'au', '.gitignore', 'Cordova', 'MSP340', 'Electron', 'nodejs', 'repuve', 'Pomodoro', 'cloud', 'python', 'RecyBot', 'electron', 'libs', 'microcontrollers', 'wave', 'RealTime', 'mosquitto', 'MonitorS', '.git', '8051', 'ghdl', 'games', 'TestM', 'Ada', 'OpenERP', 'Odoo', 'esp8266', 'ARMIDE', 'PCBExample', 'VHDL', 'BMLP', 'TivaC', 'FacturaSAT']

Como puedes observar, no es realmente útil para fines prácticos agregar sólo el ..

Probablemente lo que quieres hacer es añadir al sys.path un directorio que se encuentra por encima de tu archivo .py

Para ello puedes obtener la ruta de tu actual archivo, y con respecto a esa ruta añadir el .. a tu sys.path

Código: [Seleccionar]
import os
import sys


#sys.path.append('..')

#print(os.listdir(sys.path[-1]))

#print(sys.path[-1])

print(__file__)
print(os.path.abspath(__file__))

Código: [Seleccionar]
$ python3 tests/test1.py
tests/test1.py
$ cd tests
$ python3 test1.py
test1.py
/home/alex/proyectos/python/tests/test1.py

Y extraemos sólo le nombre del directorio donde el archivo test1.py se encuentra
Código: [Seleccionar]
import os
import sys


#sys.path.append('..')

#print(os.listdir(sys.path[-1]))

#print(sys.path[-1])

print(__file__)
print(os.path.abspath(__file__))
print(os.path.dirname(os.path.abspath(__file__))

Código: [Seleccionar]
$ python3 test1.py
test1.py
/home/alex/proyectos/python/tests/test1.py
/home/alex/proyectos/python/tests
$ cd ..
$ python3 tests/test1.py
tests/test1.py
/home/alex/proyectos/python/tests/test1.py
/home/alex/proyectos/python/tests

¿Cómo añades a tu sys.path .. con respecto al directorio de tu archivo .py?

Código: [Seleccionar]
import os
import sys

file_dir = os.path.dirname(os.path.abspath(__file__))

sys.path.append(os.path.join(file_dir,'..'))

print(sys.path[-1])
print(os.listdir(sys.path[-1]))

No importa desde que directorio se ejecute o sea llamado tu archivo .py, siempre vas a obtener el mismo resultado
Código: [Seleccionar]
$ python3 tests/test1.py
/home/alex/proyectos/python/tests/..
['tests', 'ANU', 'hashtables_tests']
$ cd tests
$ python3 test1.py
/home/alex/proyectos/python/tests/..
['tests', 'ANU', 'hashtables_tests']

¿Porqué es mejor usar os.path.join?, porque Windows y Linux no manejan las rutas de la misma forma. Lo podrías hacer con file_dir+”/..”, pero no sería portable.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re:Dudas con escribir codigo
« Respuesta #8 en: 02 de Agosto de 2016, 18:08:42 »
Gracias por la explicación tsk, quería empezar a hacer algo mas aparte de multiplicar dos números y ver su resultado con print y me estoy dando cuenta que estoy a años luz de poder hacerlo.  :( :(
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re:Dudas con escribir codigo
« Respuesta #9 en: 07 de Agosto de 2016, 09:35:52 »
Por que este simple codigo no funciona como deberia:
Código: Python
  1. #!/usr/bin/env python3.5
  2. # -*- coding: iso-8859-15 -*-
  3.  
  4. '''Escribir una función que tome un carácter y devuelva True
  5. si es una vocal, de lo contrario devuelve False.'''
  6. def es_vocal(vocal):
  7.         for letra in ['a', 'e', 'i', 'o', 'u']:
  8.                 if(vocal == letra):
  9.                         return True
  10.                 else:
  11.                         return False
Solo es True con la vocal 'a' las demas dan como resultado False

Gracias.
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado ma4826

  • PIC16
  • ***
  • Mensajes: 130
Re:Dudas con escribir codigo
« Respuesta #10 en: 07 de Agosto de 2016, 10:40:10 »
Con eso hace lo que quieres:

Código: Python
  1. #!/usr/bin/env python3.5
  2. # -*- coding: iso-8859-15 -*-
  3.  
  4. '''Escribir una función que tome un carácter y devuelva True
  5. si es una vocal, de lo contrario devuelve False.'''
  6. def es_vocal(vocal):
  7.         for letra in ['a', 'e', 'i', 'o', 'u']:
  8.                 if(vocal == letra):
  9.                         return True
  10.         return False

 En tu caso sólo llega a comprobar la 'a' porque sino es la 'a' sales de la función devolviendo un False. Siempre ejecutas un sólo ciclo del for.

 Saludos,

 Miguel.
万人の友は誰の友でもない。

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Dudas con escribir codigo
« Respuesta #11 en: 07 de Agosto de 2016, 11:18:26 »
No seria mejor algo asi?, no estoy en linux para probarlo.


Código: Python
  1. def es_vocal(vocal):
  2.         return (vocal in ['a', 'e', 'i', 'o', 'u'])

O en su defecto:

Código: Python
  1. def es_vocal(vocal):
  2.         if vocal in ['a', 'e', 'i', 'o', 'u']:
  3.                  return True
  4.         return False

---------------

Y una mas que encontre:


Código: Python
  1. a = ['a', 'e', 'i', 'o', 'u']
  2.  
  3. try:
  4.     b=a.index(vocal)
  5. except ValueError:
  6.     return False
  7. Else:
  8.     return True
« Última modificación: 07 de Agosto de 2016, 11:24:38 por KILLERJC »

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re:Dudas con escribir codigo
« Respuesta #12 en: 07 de Agosto de 2016, 18:43:45 »
Gracias a los dos por vuestra ayuda, he probado los códigos y parecen funcionar excepto el ultimo, voy a estudiarlo a ver si consigo saber el porque no funciona, igual es fallo mio.

Saludos!
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Dudas con escribir codigo
« Respuesta #13 en: 07 de Agosto de 2016, 19:55:54 »
Tal ves por que el else tiene una mayuscula .. esto si funciona:

Código: Python
  1. vocal = 'b'
  2. a = ['a', 'e', 'i', 'o', 'u']
  3. try:
  4.         b = a.index(vocal)
  5. except ValueError:
  6.         print("False")
  7. else:
  8.         print("True")

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re:Dudas con escribir codigo
« Respuesta #14 en: 08 de Agosto de 2016, 03:55:24 »
Ya veo donde tenia el error, hice como tu al principio, me deje:
Código: Python
  1. vocal = 'b'

Gracias KILLERJC
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.