FantasiaGames Sitio personal de Charly R.

Aprendiendo Python 2: Funciones

Aprendiendo a programar junto a Python 2: Funciones

Aclaración: La mayor parte de este tutorial esta basado en “Think Python: How to Think Like a Computer Scientist” de Allen Downey y “A Byte of Python” (pronto escribo el autor)

2.1.1- ¿Qué son las funciones?

La definición de funciones fue dada anteriormente. En programación, se llama función a una secuencia de declaraciones que realizan una tarea. Cuando uno define una función, es necesario especificar el nombre y los argumentos de la misma. Posteriormente se llama a la función por su nombre.

2.1.2- Llamar funciones

Para llamar una función es necesario conocer su nombre y los argumentos que la componen.

Recordemos el ejemplo dado para conocer el tipo de variable que tenemos:

>>> a='soy una cadena de texto...'

>>> type(a)

<class 'str'>

En este caso la función que llamamos se denomina type, el argumento es la variable a y el resultado es . A ese resultado se lo denomina valor de retorno

La función type es una función incluída en el interprete de python. Hay muy muchas funciones incluídas, algunas por defectos y otras hay que importarlas (esto se verá más adelante)

2.1.2.1- Funciones para convertir el tipo de datos:

Ejemplos son int, float y str.

int convierte por ejemplo la string ‘32′ en el número entero 32 o trunca 32.1 a 32.

float convierte el entero 32 en 32.0 o la string ‘3.14159′ en 3.14159

str convierte un entero o un decimal en una cadena de texto…

2.1.2.2- Funciones matemáticas:

Python posee las funciones matemáticas más comunes dentro del modulo math. Un módulo es un archivo que contiene funciones relacionadas. El nombre del mismo usualmente es representativo de lo que contiene.

Antes de usar las funciones incluidas en el módulo es necesario importarlo. Al importar el módulo, le estamos diciendo al interprete de donde buscar las funciones.

Para importar se utiliza la sentencia import

Ejemplo:

>>> import math

>>> print(math)

<module 'math' (built-in)>

Como vemos math esta incluído en python, pero para usarlo es necesario importarlo primero. La sentencia import es algo que usaremos con mucha frecuencia en nuestros programas, por lo que es bueno recordarlo…

Al importar un módulo creamos un objeto de modulo (en este caso llamado math). Para llamar las funciones del módulo es necesario usar ese objeto. Para hacerlo se escribe el nombre del modulo y el nombre de la función a llamar separados por un punto. Esta notación recibe el nombre de notación punto.

Ejemplo:

>>> math.sin(0)

0.0

Para conocer las funciones que tenemos en python lo mejor es ir a la referencia (manual) del mismo, la información es muy completa.

2.1.3- Composición

La mayoría de los lenguajes de programación permiten combinar declaraciones, variables y constantes en una sola línea. Esto permite utilizar pequeños bloques de código para realizar varias tareas en una linea. Un ejemplo sería:

>>> x=1

>>> x = math.exp(math.log(x+1))

>>> print(x)

2.0

Como vemos, en la segunda declaración de la variable x estamos cambiando su valor, y utilizando 2 funciones al mismo tiempo. Primero se ejecuta la suma, luego el logaritmo natural y por último se realiza la potencia.

Es importante aclarar que no es posible hacer lo mismo del lado derecho del signo igual. Esto daría un error de sintaxis.

2.1.4- Creando nuestras funciones

Definir una función implica especificar el nombre de la misma, los argumentos de entrada y las tareas que se ejecutaran cuando se llame a la función.

Ejemplo:

Crearemos un archivo llamado funciones.py

Colocamos en el el código siguiente:

def mifuncion():

    print('holasssss')

def repite():

    mifuncion()

    mifuncion()

Aprendemos del ejemplo lo siguiente:

def es una palabra clave, indica la definición de una función. Lo que sigue es el nombre de la función (mifuncion y repite en el ejemplo). Las reglas de nomenclatura son iguales a las variables. En los paréntesis no hay nada porque la función no posee argumentos.

La primer linea se llama header (cabecera) y el resto body (cuerpo). La cabecera DEBE terminar con dos puntos (:). No hay límite a las operaciones realizadas en el cuerpo de la función.

Si trabajamos en el interprete, para terminar una función es necesario colocar una linea en blanco al final de la función. En el interprete, luego de la cabecera, vemos que escribe 3 puntos y deja la indexación de forma automática.

Por ejemplo:

>>> def mifuncion():

...     print('holas')

...     

>>> mifuncion()

holas

Para llamarla se llama como se mostro anteriormente. Si la función fue creada en un archivo y usamos otro archivo o el interprete es necesario importarla. Eso puede hacerse desde la Interfaz gráfica del interprete o con import. Si la función fue creada desde el interprete simplemente se llama.

Luego importamos nuestras funciones y ejecutamos repite():

>>> import funciones

>>> repite()

holasssss

holasssss

Como vemos es posible llamar funciones dentro de otras funciones, siempre que las mismas hayan sido importadas.

La definición de funciones es ejecutada como cualquier otra declaración, pero el efecto es crear objetos función. Estos objetos no se ejecutan hasta ser llamados, punto en el cual realizan las tareas que se encuentran dentro de la función.

Al definir una función se crea una variable con el mismo nombre, cuyo tipo es function

>>> type(mifuncion)

<class 'function'>

Queda claro que para poder llamar una función, es necesario haberla definido primero.

Aclaración: Para Python las comillas simples y dobles tienen la misma función al crear strings, simplemente se usan dobles si necesitamos colocar una simple en la string

2.1.5- Flujo de ejecución

Un script siempre se ejecutará de arriba hacia abajo, desde la primer declaración a la última. Se ejecuta una declaración a la vez. La definición de funciónes no altera el sentido de flujo, sino que hace que la ejecución salte (omita) el código en el cuerpo de la misma y siga por la línea siguiente.

Al llamar a la función, la ejecución ingresa al la primer linea del cuerpo de la función, realiza las declaraciones internas de la función y retorna (o no) un valor a la linea donde se llamó la función. En si, llamar una función es desviar hacia un punto en concreto el flujo de ejecución.

Python realiza esto de forma correcta, siempre que el programa este correctamente hecho. Cuando nosotros leemos un programa, debemos tratar de leerlo en el mismo sentido en que se ejecuta.

2.1.6- Parámetros y argumentos

Veamos la siguiente función definida:

def mifuncion2(string):

    print(string)

Si revisamos el código, vemos que esta función a diferencia de las mostradas anteriormente posee un argumento. El argumento es lo que está entre paréntesis y permite ingresar valores a la función. Cuando llamamos a esa función es necesario ingresar el argumento de la misma.

>>> mifuncion2('hola como va genteeeee')

hola como va genteeeee

Si revisamos la ejecución, lo que ocurre es que la string ‘hola como va genteeeee’ es el valor asignado a la variable string que se usa dentro de la función.

Dentro de la función, los argumentos son asignados a variables llamadas parámetros.

Los argumentos pueden ser constantes, variables o incluso expresiones. Los mismos son evaluados antes de llamar la función.

En si:

>>> print('hola '*3)

hola hola hola 

>>> hola='hola como va amigos'

>>> print(hola)

hola como va amigos

>>> print('casa')

casa

En el primer caso se realiza la repetición de la string y luego se imprime en pantalla. En el segundo, se usa el valor de una variable definida y el último simplemente se imprime la string. El nombre de la variable que se ingresa a la función NO TIENE NADA QUE VER con el nombre del parámetro. Puede ser igual o diferente y NO DEBE afectar el resultado.

Los parámetros y todas las variables definidas dentro de la función son LOCALES, en si, su declaración y valor existen solo en la función.

2.1.7- Resultado de funciones

Podemos dividir las funciones en dos clases en base a sus resultados. Las funciones que retornan un valor y las funciones que ejecutan una acción pero que no retornan un valor.

Cuando uno ejecuta una función con retorno, uno luego realiza algo con el valor retornado. En esto es importante conocer una diferencia claro en el trabajo con script y con interprete.

Cuando uno llama una función en el interprete y la misma debe retornar algo, si no asignamos ese resultado a una variable, el intérprete imprime el resultado. ESTO NO OCURRE AL TRABAJAR EN FORMA DE SCRIPT.

Cuando trabajamos en un archivo, para que tenga sentido el uso de la función, es necesario asignar su valor a una variable y luego realizar la operación que queremos.

Ejemplo de función con retorno:

>>> def holas(string):

...     a=string * 4

...     return a

... 

>>> holas('holas')

'holasholasholasholas'

>>> a=holas('dhasdas')

>>> print(a)

dhasdasdhasdasdhasdasdhasdas

A excepción de esta función, el resto fueron todas funciones vacias (sin retorno).

2.1.8- ¿Porqué usar funciones?

  1. Crear nuevas funciones te permite agrupar tus declaraciones de forma que el código será más fácil de leer y de depurar.
  2. Pueden reducir el tamaño de un programa, al evitarse repeticiones. A su vez, al tener un tipo de operación agrupado, al cambiar una operación solo hay que modificar código en un lugar.
  3. Dividir un programa de gran tamaño en pequeñas funciones te permite revisar el código por partes y luego ejecutarlo como un todo.
  4. Funciones correctamente diseñadas sirven para varios programas. Por ende podes reutilizar el código

2.1.9- Depuración de funciones

Es conveniente usar un editor de textos (en mi caso uso Pyscripter) que realice la indexación automáticamente. Esto reducirá el tiempo de depuración y errores simples en el desarrollo del programa.

Es fundamental siempre salvar el archivo del programa que estamos ejecutando, ya que si no lo hacemos se ejecutará el programa sin las modificaciones.

Es importante ejecutar el programa para el cual estamos viendo el código. Para asegurarnos podemos agregar una sentencia que imprima en pantalla algo (ejemplo print(’ando’))…

Aprendiendo Python: Introducción

Aprendiendo a programar junto a Python 1:Introducción

Aclaración: La mayor parte de este tutorial esta basado en “Think Python: How to Think Like a Computer Scientist” de Allen Downey y “A Byte of Python” (pronto escribo el autor)

1.1.1- ¿Qué es python?

Según la página oficial del mismo:

Python es un lenguaje de programación que te permite trabajar más rápido e integrar tus sistemas de forma más eficiente. Puedes aprender a usar Python y ver de forma casi inmediata ganancias en productividad y reducción en costos de mantenimiento.

Python se ejecuta en Windows, Linux/Unix, Mac OS X, y ha sido portado a máquinas virtuales Java y .NET.

Python es gratuíto para usar, incluso para productos comerciales, debido a sus licencia opensource reconocida por OSI.

Más allá de la propaganda, en sí Python es un lenguaje Interpretado de alto nivel que permite desarrollar aplicaciones complejas en un tiempo reducido. Posee estructuras de datos de alto nivel y una simple pero efectiva aproximación a la programación orientada a objetos (esto dicho por el tutorial de python, a mi consideración su sintaxis de POO es excelente). A su vez tiene una sintaxis muy límpia que facilita su lectura, por lo que es un lenguaje ideal para el desarrollo de aplicaciones rápido o para utilizar como script de aplicaciones en otros lenguajes.

1.1.2- El lenguaje en si

  • La primer diferencia que nos vamos a encontrar entre python y otros lenguajes (como PHP,C,C++;java) es el uso de las sangrías (indentation) para la agrupación de declaraciones en lugar de las llaves ({}) o el uso de punto y comas (;) para separar líneas. Esto a muchos les puede gustar y a otros no. Igualmente al final un script desarrollado en python resulta siempre con una estética fácil de entender.
  • Al ser un lenguaje que maneja tipos de datos de alto nivel, es posible realizar operaciones complejas con una simple declaración[/li>

  • Por último no es necesaria la declaración de argumentos o variables (como lo es en C)

1.1.3- Obtener e instalar Python

Para descargar Python, es necesario ir a: http://www.python.org/download/

Y descargar la versión de Python para el sistema operativo que cada uno use.

IMPORTANTE:

Hay dos mayores versiones de python (en realidad hay más pero en si…)

2.7

3.4

Para la versión 2.7 hay muchos más módulos armados y más información, es la que más programadores usan estadísticamente.

La versón 3.4 tiene cambios importantes que hacen que no haya retrocompatibilidad especialemente en los módulos. Tiene soporte completo a UTF-8 y muchas otras cosas.

Debido a que este tutorial se centrará en aprender el lenguaje y NO en desarrollar una aplicación espectacular de altísimo rendimiento, trabajaré con la versión 3.4 ya que seguramente en algún momento pasará a ser la versión más usada. En la misma hay una nueva estructura de clases y demás.

Una vez descargado simplemente lo instalamos.

Iniciandos(m)é en python 1.2: El Interprete

Una vez descargado e instalado en nuestro sistema operativo, python introduce a la variable path de nuestro sistema la dirección de los binarios de python.

Esto varía según sea windows o linux, pero el final es el mismo.

1.2.1- Invocando el Interprete

Como había dicho anteriormente, python es un lenguaje interpretado, por ende para empezar a usarlo, necesitamos invocar el interprete que ejecuta los comandos del mismo.

1.2.1.1- Invocando el intérprete desde la consola de windows o terminal en sistemas unix:

Invocando el interprete en sistemas Unix:

python

Puede darse el caso que al ejecutar python en la terminal de linux ejecute la versión 2 en lugar de la 3, en esos casos basta con probar el comando python3

Invocando el interprete en sistemas Windows:

Antes que nada la variable path debe contener la ruta de instalación de python, si no se encuentra debemos agregar en la lineas de comando:

set path=%path%;C:python34

Suponiendo que instalamos python en el directorio C:python34

Posteriormente simplemente ejecutamos el comando:

python

y se el interprete se carga en la consola

Debería escribir algo como:

Python 3.1  (r265:79096, Mar 19 2010, 21:48:26) [MSC v.1500 32 bit (Intel)] on

win32

Type "help", "copyright", "credits" or "license" for more information.

>>>

Vemos que el prompt cambio del normal a >>>

Saliendo del interprete:

Simplemente ejecutamos el siguiente comando, el cual cierra el interprete:

exit()

1.2.1.2- Invocando el intérprete con GUI (usando IDLE):

Windows:

En la sección Python 3.4 del menú inicio, ejecutamos: IDLE (Python GUI)

Tipo Unix:

Debemos tener instaladas todas las dependencias primero… (pronto…)

1.2.2- Usando python

Una vez iniciado el interprete en cualquiera de sus formas (recomiendo usar la IDLE o alguna GUI mas completa) procederemos a usar python.

Yo utilizo Ninja-IDE: Ninja-IDE

El mismo es un entorno de desarrollo integrado para diferentes plataformas. La ventaja de trabajar con entornos es que acelera (al menos en mi caso) el desarrollo de aplicaciones. Pueden ver las ventajas del uso de IDE en diferentes lenguajes buscando en google.

Aclaro, utilizar un IDE no es una obligación, y para los ejemplos iniciales es absolutamente innecesario.

1.2.2.1- Valores y tipos de datos:

Los valores son simplemente datos que pueden ser parte de un programa o no. Los mismos pueden ser letras, números, diccionarios y otras cosas.

Los tipos son las clases a las que un valor puede pertencer. Por ejemplo: 1 es un número entero o integer, mientras que ‘hola’ es una cadena de texto o string.

Para saber el tipo de valor con el que estamos tratando, se puede utilizar la función type.

Por ejemplo:

>>> type(0.3)
>>> type(34)
<class 'int'>
>>> type(0.343)
<class 'float'>
>>> type(-5+4j)
<class 'complex'>
>>> type('holacomova')
<class 'str'>
>>> type([1,3])
<class 'list'>
>>> type({1,3})
<class 'set'>
>>> type((1,3))
<class 'tuple'>

Vemos que python puede trabajar con números complejos, esto es muy útil a la hora de trabajar en aplicaciones destinadas para el área de la electrónica.

A los números con decimales se los llama float debido a la forma en que son representados, la cual es llamada floating-point.

Es importante aclarar que para colocar decimales se utiliza el punto (.) y no la coma (,). También al ingresar valores mayores que mil no hay que dividir el valor con comas (,) para que se vea más estético. Prueben a ingresar en el intérprete de python lo siguiente:

1,100,100,110

Y verán que el resultado no es el número 1100100110. (Aclaro esto para las personas que usan la coma como separador de miles, en mi país se usa el punto y si uno escribiese 1.100.100.110 python arrojaría un error de sintaxis).

Las clases las mostre de forma ilustrativa solamente. Posteriormente describiré cada tipo de datos.

1.2.2.2- Variables:

Una de las características más importantes de los lenguajes de programación es la capacidad de manipular variables.

Una variables es un nombre al que se le asigna un dato.

Para asignar un nombre a un dato hay que realizar una declaración de asignación, que no es más que a un nombre ( ejemplo n) seguido de un signo igual al que luego se le agrega el dato.

Ejemplo:

>>> n=10

>>> flot=0.96

str='holacomova'

Para imprimir el valor de una variable se usa la función print (print es función desde python 3).

Ejemplo:

>>> print(n)
10

Para saber el tipo de dato que manejamos usamos la función type.

Ejemplo:

>>> type(n)

1.2.2.3- Nombres de variables y palabras claves (keywords):

Normalmente los programadores le dan nombres significativos a las variables que les ayudaran a entender que datos contienen o para que se usan.

No hay demasiadas restricciones sobre como nombrar las variables. Pueden ser cortas o largas pero:

1.- Deben iniciar si o si con una letra del alfabeto

Ejemplo de error:

>>> 2a=3
  File "", line 1
    2a=3
     ^
SyntaxError: invalid syntax

2.- No deben contener caracteres especiales que no esten admitidos.

El caracter admitido que suele usarse es el guión bajo (_) para separar palabras normalmente.

Ejemplo de error:

>>> @hola=2
  File "", line 1
    @hola=2
        ^
SyntaxError: invalid syntax

3.- El nombre de la variable no debe ser una palabra clave (keyword)

Lista de palabras claves: keywords

Ejemplo de error:

>>> and= 'y'

  File "", line 1

    and= 'y'

      ^

SyntaxError: invalid syntax

1.2.2.4- Declaraciones:

Las declaraciones son unidades de código que el intérprete puede ejecutar. Vimos anteriormente el uso de las funciones print y type y además la asignación de un valor a una variable.

Si estamos trabajando en modo interactivo del intérprete, luego de cada declaración el intérprete arroja el resultado.

Un script usualmente tiene una secuencia de declaraciones.

Hay que aclarar que la asignación de una variable no produce salida (output).

1.2.2.5- Operadores y operandos:

Los operadores son símbolos especiales que representan operaciones, tales como suma o resta.

Los valores a los que se le aplica un operador se llaman operandos.

Los operadores +, -, *, / y ** se usan para realizar operaciones de adición, sustracción, multiplicación, división y exponenciación.

Ejemplos:

>>> 1+1
2

>>> 2-1
1

>>> 3/4
0.75

>>> 4*3
12

>>> 2**3
8

ACLARACIÓN FUNDAMENTAL (DIFERENCIA PYTHON 3 con PYTHON 2…)

En python 2 el operador / mostraba el resultado entero si el tipo de valor a dividir eran enteros. Por ende una división como 3/4 resultaba en 0 en lugar de 0.75 . Para que el resultado tenga decimales, uno de los números debía ser flotante. En python 3 esto se cambió, y el operador / actúa como la división que nosotros conocemos, mientras que para obtener el resultado entero de la división se utiliza //

1.2.2.5- Expresiones:

Una expresión es una combinación de valores, variables y declaraciones. Un valor por si mismo y la asignación de una variable son consideradas expresiones.

Ejemplos (todas expresiones válidas)

3

x=54

x+16/3

Si uno escribe una expresión en modo interactivo, el intérprete la evalua y luego imprime en pantalla el resultado de la misma. En cambio si uno escribe una serie de expresiones en un script, no se imprime nada en pantalla a menos que nosotros usemos la función print. (Diferencia entre interactivo y por script)

1.2.2.6- Orden de operación:

En todo lenguaje, el orden de ejecución de operaciones depende de las reglas de prioridad o precedencia. Para operaciones matemáticas, python sigue las reglas matemáticas. El resto de las reglas puede recordarse por las siglas PEMDAS

  • Los paréntesis tienen la máxima prioridad y pueden ser usados para obligar a ejecutar el código en el orden que uno quiere. El código entre paréntesis se ejecuta antes que otro código.
  • La exponenciación es el siguiente en prioridad de ejecución. En si 2**2+1 es 5 y no 8 o 3*1**3 es 3 y no 27
  • Los siguientes en prioridad son la multiplicación y división, los cuales tienen la misma precedencia.
  • Los operadores de igual precedencia se ejecutan de izquierda a derecha.

1.2.2.7- Operaciónes con cadenas de texto:

En general no pueden usarse operadores matemáticos para el trabajo con strings (cadenas de texto). Igualmente los operadores de suma y producto tienen un trabajo especial con las strings.

El operador suma (+) realiza una operación llamada concatenación, la cual une las cadenas de texto de extremo a extremo.

Ejemplo:

>>> 'hola'+ 'Charly'

'holaCharly'

El operador producto (*) realiza una operación llamada repetición, la cual simplemente repite la string dada el numero de veces multiplicado.

Ejemplo:

>>> 'hola'*5

'holaholaholaholahola'

1.2.2.8- Comentarios:

Los comentarios en el código se utilizan para ayudar a comprender el funcionamiento del mismo. En python para realizar comentarios se utiliza el numeral (#)

Los comentarios pueden estar en una linea libre o pueden estar luego de una operación.

Ejemplo:

#En esta operacion se calcula el numero de Reynolds

#Diametro de tuberia: D

#Densidad del fluído: dens

#Velocidad del fluído: Vel

#Viscocidad del fluído: visc

Re=(D*dens*Vel)/visc #Numero de Reynolds

Todo lo que esta a la derecha del # en una linea se considera comentario.

Es importante un equilibrio entre el nombre de la variable y la necesidad de comentarios. Siempre debemos buscar el punto óptimo que permita leer el código de la forma más cómoda.

1.2.2.8- Depuración:

La depuración es el proceso por el cual conocemos los errores que va presentando el código y lo vamos reparando. Dependiendo del tipo de error será la simplicidad de la depuración.

Actualizar paquetes de python usando pip

El día de ayer me puse a revisar si tenía los paquetes que normalmente uso en Python actualizados, y me encontre que varios estaban bastante desactualizados.

Como antes era un usuario cómodo de windows instalando todo por los instaladores tradicionales, no estaba familiarizado con el uso real del paquete pip.

Hay varios códigos armados que realizan lo siguiente de manera automática, pero para saber que iba haciendo decidí ir por lo báisco.

pip tiene un comando muy útil a la hora de revisar el estado de los paquetes (o a la hora de revisar si realmente tenemos instalados los paquetes), el mismo es el comando list

Si utilizamos el comando list sin ningún tipo de opciones, nos mostrará todos los paquetes instalados a través de pip, en mi instalación de windows estan los siguientes paquetes

C:\Users\Usuario>pip.exe list
Cantera (2.1.0)
matplotlib (1.3.1)
numpy (1.8.0)
Pillow (2.3.0)
pip (1.5.2)
PyOpenGL (3.0.2)
PyOpenGL-accelerate (3.1.0b1)
scikit-image (0.9.3)
scikits.odes (2.0.2)
scipy-umfpack (0.13.3)
setuptools (0.7.4)
wxpython-phoenix (3.0.1.dev76110)

Vale destacar que la necesidad de usar la extensión .exe se debe a que estoy en windows. Si estuviese en linux el comando simplemente sería

pip list

Ahora lo útil, saber que paquetes estan desactualizados. Para ello utilizaremos la opción outdated al ejecutar la lista en pip. Para colocar opciones a la hora de ejecutar pip, simplemente utilizamos 2 guiones antes de la opción. En windows se vería algo así:

C:\Users\Usuario>pip.exe list --outdated
setuptools (Current: 0.7.4 Latest: 3.3)
Could not find any downloads that satisfy the requirement wxpython-phoenix
Some externally hosted files were ignored (use --allow-external wxpython-phoenix
 to allow).
Could not find any downloads that satisfy the requirement cantera
Some externally hosted files were ignored (use --allow-external cantera to allow
).
Pillow (Current: 2.3.0 Latest: 2.3.1)
pip (Current: 1.5.2 Latest: 1.5.4)
Could not find any downloads that satisfy the requirement scipy-umfpack
Some externally hosted files were ignored (use --allow-external scipy-umfpack to
 allow).

Recuerden que en linux no deben agregar la extensión a pip. Los paquetes que necesitan actualización figuran en la lista, colocando la versión instalada (Current) y la última versión en el repositorio de paquetes (Latest).

Para actualizar un paquete específico utilizamos el comando install con la opción upgrade. Este paso en algunos casos es conveniente ejecutarlo como administrador.

C:\Windows\system32>pip.exe install --upgrade setuptools
Downloading/unpacking setuptools from https://pypi.python.org/packages/3.4/s/set
uptools/setuptools-3.3-py2.py3-none-any.whl#md5=fa55df9cab63a418d155a8b97ef7426e

Installing collected packages: setuptools
  Found existing installation: setuptools 0.7.4
    Uninstalling setuptools:
      Successfully uninstalled setuptools
Successfully installed setuptools
Cleaning up...

Si todo salio bien debería mostrar algo como lo anterior. Repetir para los paquetes desactualizados

Pagina de inico ← Publicaciones mas antiguas