Python M. en C. Erika Vilches Dirección del Tutorial http://docs.python.org/tut/ Despertando la Curiosidad Python es más simple de usar que Java, C o C++ Disponible en Windows, Mac OS X, Linux y Unix Facil de usar, pero es un lenguaje de programación real Ofrece más chequeo de errores que C Siendo un lenguaje de muy alto nivel, tiene tipos de datos de alto nivel built-in (ej: arreglos flexibles, diccionarios, etc.) Permite partir el programa en módulos que pueden ser reutilizados en otros programas Python. Viene con una gran colección de módulos estándar que se pueden utilizar como base de programas (ej: file I/O, system calls, sockets, etc.) Python es un lenguage interpretado Ahorro de tiempo al programar No compilacion, No linking El interprete se puede utilizar de manera interactiva Experimentar con características del lenguaje Escribir programas de prueba Probar funciones durante el desarrollo de un programa Calculadora, etc. Los programas de Python son compactos y legibles Mucho mas cortos que su equivalente en C, C++ o Java Los tipos de datos de alto nivel permiten expresar operaciones complejas en un solo enunciado La agrupación de enunciados se hace mediante indentación (en vez de llaves) No se requiere declarar variables o argumentos Python es extensible Se puede añadir una función o módulo en C al interprete Llevar a cabo funciones criticas a máxima velocidad Ligar programas en Python a librerías que sólo estén disponibles en forma binaria Nombre inspirado en el show de BBC “Monty Python’s Flying Circus” Hacer referencias a sketches de Monty Python en la documentación no solo esta permitido, sino que se fomenta!!! Utilizando al Interprete de Python Invocando al Interprete Para iniciar el interprete en Mac / Unix: python Windows → Verificar la ruta en la que se instaló y añadirla al path. Para terminar al interprete: Control-D en Mac / Unix, Control-Z en Windows Si ninguna de las anteriores funciona para terminar el interprete, typear los siguientes comandos: >>> import sys; sys.exit() Modo Interactivo Cuando los comandos se leen de una tty, se dice que el intérprete se encuentra en modo interactivo. En este modo, pide el siguiente comando con el prompt primario, que es >>> Para líneas de continuación, utiliza el prompt secundario ... El intérprete imprime la versión y el copyright antes del primer prompt. python Python 2.4.3 (#1, Aug 28 2006, 01:25:34) [GCC 4.0.1 (Apple Computer, Inc. build 5250)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> Se requieren líneas de continuación cuando se utiliza un construct multilínea Ej: >>> the_world_is_flat = 1 >>> if the_world_is_flat: ... print "Be careful not to fall off!" ... Be careful not to fall off! Manejo de Errores Cuando ocurre un error, el intérprete imprime un mensaje de error y el stack trace. En modo interactivo, regresa después al prompt primario. Cuando el input proviene de un archivo, sale con status no cero despues de imprimir el stack trace. Utilizar el caracter de interrupción (Ctrl-C o DEL) en el prompt primario o secundario → Regresa al prompt primario Si utilizamos la interrupción mientras un comando se esta ejecutando, se genera la excepción KeyboardInterrupt Se puede manejar con un try Scripts Ejecutables En los ambientes Unix (BSD) los scripts se pueden hacer directamente ejecutables (como shell scripts) poniendo la línea #! /usr/bin/env python ← Line break : Unix \n al inicio del script y dándole al archivo modo ejecutable. #! deben ser los primeros dos caracteres del archivo. Para darle al script el modo ejecutable $ chmod +x myscript.py El caracter # se utiliza para iniciar un comentario Encoding del Código Fuente Es posible utilizar encodings diferentes a ASCII en nuestros códigos fuentes. La mejor forma de hacerlo es poner un comentario especial más justo después del #! para definir el encoding # -*- coding: encoding -*- Todos los caracteres en el archivo fuente serán tratados con ese encoding y permite escribir Strings en el encoding seleccionado. Ej: Imprimiendo una ñ en un script ejecutable. programa.py ← Editor: TextEdit Haciéndolo ejecutable: Ejecutandolo: Salida Ej: Imprimiendo una ñ en un script común. programa2.py ← Editor: TextEdit Ejecutandolo: Salida Otra forma de hacerlo: Si el editor te permite guardar el archivo como UTF-8 con UTF-8 byte marker order (también llamado BOM) En lugar de la declaración de encoding. Ej: Line breaks tipo Unix, Encoding UTF-8 con BOM en TextWrangler Para que no crean que sólo las Macs pueden hacer esto... :) IDLE es un GUI para Python que te permite hacer esto: http://www.python.org/idle/doc/idle2.html si la opción Options/General/Default Source Encoding/UTF-8 esta activada. Esta opción no se entiende en versiones viejas de Python (2.2 para atrás) Utilizar UTF-8 (via signature o declaración de encoding) se pueden utilizar simultáneamente caracteres de la mayoría de los lenguajes del mundo En Strings y comentarios NO esta soportado utilizar caracteres no ASCII en identificadores Introducción Informal a Python En los ejemplos, la entrada y salida se diferencian por la presencia o ausencia de prompts Para repetir el ejemplo → Escribir todo lo que se encuentre despues del prompt Lineas que no empiezan con prompt → salida del intérprete Una línea con un promt secundario por si misma → Debes dejar una línea en blanco Terminar un comando multilínea Los comentarios inician con un hash # (1 línea) Comentarios pueden estar: Al inicio de una línea Después de espacio en blanco Después de una línea de código Comentarios no pueden estar: Dentro de un string Un # dentro de un string es solo un # # this is the first comment SPAM = 1 # and this is the second comment # ... and now a third! STRING = "# This is not a comment." Utilizando Python como una Calculadora Inicie el interprete y espere el prompt primario >>> Números El intérprete actúa como una calculadora simple Escribir una expresión → Escribirá el valor Los operadores +. -. * y / funcionan como en otros lenguajes Se pueden usar paréntesis para agrupar >>> 4 >>> ... 4 >>> 4 >>> 5 >>> ... 2 >>> -3 2+2 # This is a comment 2+2 2+2 # and a comment on the same line as code (50-5*6)/4 # Integer division returns the floor: 7/3 7/-3 El signo de igual (=) se utiliza para asignar un valor a una variable >>> width = 20 >>> height = 5*9 >>> width * height 900 Se puede asignar valor a varias variables de manera simultánea >>> >>> 0 >>> 0 >>> 0 x = y = z = 0 x y z # Zero x, y and z Hay soporte completo para variables flotantes Operadores con operandos de tipo mixto convierten los enteros a flotantes >>> 3 * 3.75 / 1.5 7.5 >>> 7.0 / 2 3.5 Los números complejos también son soportados Los números imaginarios se escriben con un sufijo “j” o “J” Números complejos con componente real no cero se escriben con "(real+imag j)" También pueden ser creados con la función "complex(real, imag)" >>> 1j * 1J (-1+0j) >>> 1j * complex(0,1) (-1+0j) >>> 3+1j*3 (3+3j) >>> (3+1j)*3 (9+3j) >>> (1+2j)/(1+1j) (1.5+0.5j) Los números complejos se representan siempre como dos números de punto flotante La parte real La parte imaginaria Para extraer esas partes de un número complejo z z.real z.imag >>> a=1.5+0.5j >>> a.real 1.5 >>> a.imag 0.5 Las funciones de conversión a punto flotante y entero float() int() long() NO funcionan para números complejos No hay forma correcta de convertir un numero complejo a un número real. Utilice abs(z) para obtener su magnitud (como un flotante) Utilize z.real para obtener su parte real Ejemplos: >>> a=3.0+4.0j >>> float(a) Traceback (most recent call last): File "<stdin>", line 1, in ? TypeError: can't convert complex to float; use abs(z) >>> a.real 3.0 >>> a.imag 4.0 >>> abs(a) # sqrt(a.real**2 + a.imag**2) 5.0 >>> En modo interactivo, la última expresión impresa se asigna al a variable _ Hace mas fácil continuar cálculos si estamos utilizando a Python como calculadora Debe ser tratada como read only >>> tax = 12.5 / 100 >>> price = 100.50 >>> price * tax 12.5625 >>> price + _ 113.0625 >>> round(_, 2) 113.06 >>> Strings Además de números, Python puede manipular Strings Se pueden expresar de diversas formas Pueden tener comillas simples o dobles >>> 'spam eggs' 'spam eggs' >>> 'doesn\'t' "doesn't" >>> "doesn't" "doesn't" >>> '"Yes," he said.' '"Yes," he said.' >>> "\"Yes,\" he said." '"Yes," he said.' >>> '"Isn\'t," she said.' '"Isn\'t," she said. Los strings pueden ocupar varias líneas de diversas formas: hello = "This is a rather long string containing\n\ several lines of text just as you would do in C.\n\ Note that whitespace at the beginning of the line is\ significant." print hello Note que el retorno de línea igual se indica con \n Este ejemplo imprimiría lo siguiente: This is a rather long string containing several lines of text just as you would do in C. Note that whitespace at the beginning of the line is significant. Si hacemos al string “raw”, los \n NO son convertidos a líneas nuevas, sino que tanto el backslash al final de la línea como el \n se incluyen en el string. El ejemplo: hello = r"This is a rather long string containing\n\ several lines of text much as you would do in C." print hello Imprimiría: This is a rather long string containing\n\ several lines of text much as you would do in C. Otra opción es rodear al string con un par de comillas triples “ “ “ o ‘ ‘ ‘ Cuando usamos comillas triples, no se necesita escapar el fin de línea y aún así se incluirá en el string. print """ Usage: thingy [OPTIONS] -h -H hostname """ Display this usage message Hostname to connect to Imprimirá: Usage: thingy [OPTIONS] -h -H hostname Display this usage message Hostname to connect to Los strings se pueden concatenar con el operador + y repetir con el operador * >>> word = 'Help' + 'A' >>> word 'HelpA' >>> '<' + word*5 + '>' '<HelpAHelpAHelpAHelpAHelpA>' Dos literales string juntas se concatenan automáticamente. Solo funciona con dos strings literales, no con expresiones de strings >>> 'str' 'ing' 'string' >>> 'str'.strip() 'string' >>> 'str'.strip() File "<stdin>", 'str'.strip() # + 'ing' # <- 'ing' # <line 1, in ? 'ing' ^ SyntaxError: invalid syntax <- This is ok This is ok This is invalid Los caracteres se pueden indexar como en C. El primer caracter de un string tiene el indice 0 No hay tipo caracter → String tamaño 1 Los substrings se pueden especificar con la notación de rebanada → dos indices separados por (:) dos puntos >>> word[4] 'A' >>> word[0:2] 'He' >>> word[2:4] 'lp' Si se omite el primer indice → default 0 Si se omite el segundo indice → default el tamaño del string >>> word[:2] 'He' >>> word[2:] 'lpA' # The first two characters # Everything except the first two characters A diferencia de C, los strings no pueden cambiarse: >>> word[0] = 'x' Traceback (most recent call last): File "<stdin>", line 1, in ? TypeError: object doesn't support item assignment >>> word[:1] = 'Splat' Traceback (most recent call last): File "<stdin>", line 1, in ? TypeError: object doesn't support slice assignment Sin embargo, crear un nuevo string con el contenido combinado es fácil y eficiente >>> 'x' + word[1:] 'xelpA' >>> 'Splat' + word[4] 'SplatA' Invariant util de las operaciones slice → s[:i] + s[i:] es igual a s. >>> word[:2] + word[2:] 'HelpA' >>> word[:3] + word[3:] 'HelpA' Rebanadas de indices degenerados → manejadas con gracia Indice demasiado largo → Reemplazado por el tamaño del string Limite superior menor que el límite inferior → Regresa un string vacío >>> word[1:100] 'elpA' >>> word[10:] '' >>> word[2:1] '' Los indices pueden ser números negativos, para empezar a contar desde la derecha >>> word[-1] 'A' >>> word[-2] 'p' >>> word[-2:] 'pA' >>> word[:-2] 'Hel' # The last character # The last-but-one character # The last two characters # Everything except the last two characters Note que -0 es realmente lo mismo que 0, asi que NO empieza a contar desde la derecha. >>> word[-0] 'H' # (since -0 equals 0) Las rebanadas negativas fuera de rango son truncadas. NO intentar esto para indices de 1 solo elemento >>> word[-100:] 'HelpA' >>> word[-10] # error Traceback (most recent call last): File "<stdin>", line 1, in ? IndexError: string index out of range La función len() devuelve la longitud de un string >>> s = 'supercalifragilisticexpialidocious' >>> len(s) 34 Strings Unicode Dede Python 2.0 se tiene un nuevo tipo de datos → el objeto Unicode Se puede utilizar para almacenar y manipular datos Unicode Se integra bien con los objetos string existentes. Autoconversiones donde es necesario Crear string Unicode es igul de sencillo que crear strings normales >>> u'Hello World !' u'Hello World !' La u minuscula antes de las comillas indica que debe crearse un string Unicode Para incluir caracteres especiales en el string se puede utilizar el unicode-escape encoding. >>> u'Hello\u0020World !' u'Hello World ! Listas