Survey
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
Aprendiendo a programar con Python Curso en 8 horas ¿Qué es un programa? Un programa es un conjunto de instrucciones diseñadas para ordenar a la computadora a hacer algo. Es similar a una receta de cocina, que consiste en una lista de ingredientes e instrucciones paso a paso donde se usan dichos ingredientes. Receta Tomates fritos. Ingredientes: 1 Tomate 200 gr Queso 1 huevo 100 gr Pan rallado Aceite Instrucciones: Cortar el tomate en 2 rodajas. Poner queso entre las rodajas, mezclar con huevo, cubrir con pan rallado y freir en aceite hasta que se dore. Primer programa Código seq1 = 'Hola' seq2 = ' mundo!' total = seq1 + seq2 print total Resultado Hola mundo! Niveles de abstracción Ejemplo bajo y alto nivel Bajo nivel (código máquina x86) 8B542408 FA027706 B9010000 C84AEBF1 83FA0077 06B80000 0000C383 B8010000 00C353BB 01000000 008D0419 83FA0376 078BD98B 5BC3 Alto nivel (Python) def fib(n): a, b = 0, 1 for i in range(n): a, b = b, a + b return a Ejemplo bajo y alto nivel Bajo nivel (bytecode de Python) 0 LOAD_CONST 3 PRINT_ITEM 4 PRINT_NEWLINE 1 ('Hello, world!') Alto nivel (Python) print 'Hello, world!' Compilación “Traducción” desde el código fuente a instrucciones “ejecutables” Gráfico CC-SA-NC 3.0 Fuente: https://www.cs.utk.edu/~help/doku.php?id=compile:c Consecuencias de la compilación •Tiempo de compilación •Aceleración en la ejecución del software •Software dependiente de una plataforma Paradigmas de programación • • • Procedural / Estructurada: C, Pascal, Perl. Orientada a Objetos: C++, Java. Lógico: Prolog, Lisp. Programación procedural Los programas tienen rutinas o funciones con los pasos a seguir. Beneficios: •Estructurar el código en bloques para reutilizarlos. •Seguimiento de la lógica del programa (sin saltos a posiciones arbitrarias, aka “go to”). POO (OOP) Se usan objetos para diseñar los programas. Los objetos son estructuras de datos que tienen propiedades (caracteristicas) y métodos (acciones) que le son propios. Caracteristicas: •Encapsulación •Abstracción de datos •Polimorfismo •Herencia Python: Especificación e implementación Especificación: Definición de caracteristicas del lenguaje Implementación: Programa que cumple con dicha especificación. Ej.: CPython, IronPython, Jython Características de Python • • • • • • • • • Fácil de aprender y de programar Fácil de leer (similar a pseudocódigo) Interpretado (Rápido para programar) Datos de alto nivel (listas, diccionarios, sets, etc) Libre y gratuito Multiplataforma (Win, Linux y Mac) Pilas incluidas Cantidad de bibliotecas con funciones extras Comunidad Leer archivo y cargarlo en array VB Dim i, j, Array_Used As Integer Dim MyArray() As String Dim InBuffer, Temp As String Array_Used = 0 ReDim MyArray(50) 'open a text file here . . . Do While Not EOF(file_no) Line Input #file_no, MyArray(Array_Used) Array_Used = Array_Used + 1 If Array_Used = UBound(MyArray) Then ReDim Preserve MyArray(UBound(MyArray) + 50) End If Loop 'simple bubble sort For i = Array_Used - 1 To 0 Step -1 For j = 1 To i If MyArray(j - 1) > MyArray(j) Then 'swap Leer archivo y cargarlo en lista Python # Abrir un archivo de texto . . . file_object = open(FILENAME) # Leer todas las lineas del texto en una lista (similar a un array) lista = file_object.readlines() # Ordenar la lista lista.sort() Las pilas puestas La biblioteca estándar ayuda con... Servicios del sistema, fecha y hora, subprocesos, sockets, i18n y l10n, base de datos, threads, formatos zip, bzip2, gzip, expresiones regulares, XML (DOM y SAX), Unicode, SGML, HTML, XHTML, email, manejo asincrónico de sockets, clientes HTTP, FTP, SMTP, NNTP, POP3, IMAP4, servidores HTTP, SMTP, debugger, random, curses, logging, compilador, decompilador, CSV, análisis lexicográfico, interfaz gráfica incorporada, matemática real y compleja, criptografía, introspección, unit testing, doc testing, etc., etc... Bibliotecas externas • Bases de datos – • Interfaces gráficas – • Qt, GTK, win32, wxWidgets, Cairo Frameworks Web – • MySQL, PostgresSQL, MS SQL, Informix, DB/2, SQLite Django, Turbogears, Zope, Plone, webpy Y un montón más de temas... – – Biopython: Manejo de secuencias genéticas PIL: para trabajar con imágenes Mas pilas... • Bases de datos – • Interfaces gráficas – • Qt, GTK, win32, wxWidgets, Cairo Frameworks Web – • MySQL, PostgresSQL, MS SQL, Informix, DB/2, SQLite Django, Turbogears, Zope, Plone, webpy Y un montón más de temas... – – Biopython: Manejo de secuencias genéticas PIL: para trabajar con imágenes CPython e IDLE Práctica en intérprete interactivo >>> 2+2 4 >>> _*4 16 >>> 10/3 3 >>> float(10)/3 3.3333333333333335 >>> 10.0/3 3.3333333333333335 >>> int(2.1) 2 >>> int(2.9) 2 >>> round(2.9) 3.0 >>> int(round(2.9)) 3 >>> round(2.932224,2) 2.9300000000000002 >>> print round(2.932224,2) 2.93 Práctica en intérprete interactivo II >>> "hola" + " mundo!" 'hola mundo!' >>> ("hola" + " mundo!").upper() 'HOLA MUNDO!' >>> ' 123'.strip() '123' >>> 123.strip() File "<stdin>", line 1 123.strip() ^ SyntaxError: invalid syntax >>> >>> str(123) '123' >>> int('123') 123 Help incorporado >>> help() Welcome to Python 2.6! This is the online help utility. If this is your first time using Python, you should definitely check out the tutorial on the Internet at http://docs.python.org/tutorial/. Enter the name of any module, keyword, or topic to get help on writing Python programs and using Python modules. To quit this help utility and return to the interpreter, just type "quit". To get a list of available modules, keywords, or topics, type "modules", "keywords", or "topics". Each module also comes with a one-line summary of what it does; to list the modules whose summaries contain a given word such as "spam", type "modules spam". Tipo de datos: Primarios y derivados Primarios (o primitivos): No necesitan de otro tipo de datos, como numericos (int, float, decimal, complex) y str (cadenas). Derivados: Agrupan a alguno de los anteriores, como listas, diccionarios, tuplas, etc. Se pueden subclasificar según distintos parámetros: Ordenados (o secuenciales) – Desordenados Mutables – Inmutables >>> type(5) <type 'int'> >>> type(5.0) <type 'float'> >>> type(5 + 5.0) <type 'float'> >>> 5 + 5.0 10.0 >>> type(2+3j) <type 'complex'> >>> (2+3j).real 2.0 >>> (2+3j).imag 3.0 >>> type('Hola!') <type 'str'> >>> 'hola' + ' mundo!' 'hola mundo!' >>> 'hela' + 2 Traceback (most recent call last): File "<pyshell#32>", line 1, in <module> 'hela' + 2 TypeError: cannot concatenate 'str' and 'int' objects >>> 'hela' + str(2) 'hela2' Decimal El “problema” de los números flotantes: >>> 0.1 + 0.1 + 0.1 - 0.3 5.5511151231257827e-17 Una manera de evitar esto: >>> round(0.1 + 0.1 + 0.1 - 0.3,1) 0.0 Alternativamente, para no perder precisión: >>> from decimal import Decimal >>> Decimal('0.1') + Decimal('0.1') + Decimal('0.1') - Decimal('0.3') Decimal('0.0') Mas información: http://docs.python.org/library/decimal.html str (String o Cadenas) >>> 'Hola mundo!' 'Hola mundo!' >>> a='Hola mundo!' >>> len(a) 11 >>> a.lower() 'hola mundo!' >>> a.count('o') 2 >>> a.find('H') 0 >>> a.find('mundo') 5 >>> a.find('e') -1 >>> a.index(' ') 4 >>> a.index('e') Traceback (most recent call last): File "<pyshell#52>", line 1, in <module> a.index('e') ValueError: substring not found >>> a.split(' ') ['Hola', 'mundo!'] http://docs.python.org/library/string.html Datos ordenados: Listas >>> >>> >>> [1, >>> 5 >>> [1, >>> [1, >>> [1, >>> >>> [1, >>> >>> [1, >>> 1 >>> 4 >>> [4, >>> 5 mi_lista = [1,2,3] mi_lista.append(5) mi_lista 2, 3, 5] mi_lista.pop() mi_lista 2, 3] mi_lista + [4] 2, 3, 4] mi_lista 2, 3] mi_lista = mi_lista + [4] mi_lista 2, 3, 4] mi_lista.extend([5,6]) mi_lista 2, 3, 4, 5, 6] mi_lista[0] mi_lista[3] mi_lista[3:5] 5] mi_lista[-2] Mas sobre listas: >>> variada = ['boga', 'cornalito', 'tararira'] >>> variada[2] 'tararira' >>> variada[2][2:8] 'rarira' >>> variada[2][2:] 'rarira' >>> variada.append('pulpo') >>> variada ['boga', 'cornalito', 'tararira', 'pulpo'] >>> variada.remove('cornalito') >>> variada ['boga', 'tararira', 'pulpo'] >>> variada.sort() >>> variada ['boga', 'pulpo', 'tararira'] >>> variada.index('pulpo') 1 >>> variada.index('pulpa') Traceback (most recent call last): File "<pyshell#33>", line 1, in <module> variada.index('pulpa') ValueError: list.index(x): x not in list >>> 'pulpo' in variada True >>> 'pulpa' in variada False List comprehesion >>> vec = [2, 4, 6] >>> [3*x for x in vec] [6, 12, 18] >>> [3*x for x in vec if x > 3] [12, 18] >>> [3*x for x in vec if x < 2] [] >>> [[x,x**2] for x in vec] [[2, 4], [4, 16], [6, 36]] Tuplas: Similares a listas, aunque inmutables. >>> t1 = ('sgn1545',5,45) >>> t1[0] 'sgn1545' >>> 5 in t1 True >>> t1.index(45) 2 >>> t1.count(45) 1 >>> t1.append(4) Traceback (most recent call last): File "<pyshell#39>", line 1, in <module> t1.append(4) AttributeError: 'tuple' object has no attribute 'append' >>> t1.pop() Traceback (most recent call last): File "<pyshell#40>", line 1, in <module> t1.pop() AttributeError: 'tuple' object has no attribute 'pop' >>> t1.remove(45) Traceback (most recent call last): File "<pyshell#44>", line 1, in <module> t1.remove(45) AttributeError: 'tuple' object has no attribute 'remove' Diccionarios: Datos agrupados por clave-valor, sin orden. >>> en2es = {'blue':'azul','red':'rojo','black':'negro'} >>> en2es['blue'] 'azul' >>> en2es['azul'] Traceback (most recent call last): File "<pyshell#47>", line 1, in <module> en2es['azul'] KeyError: 'azul' >>> 'blue' in en2es #verifico que una clave exista en 1 dict. True >>> en2es.keys() ['blue', 'black', 'red'] >>> en2es.values() ['azul', 'negro', 'rojo'] >>> en2es.items() [('blue', 'azul'), ('black', 'negro'), ('red', 'rojo')] >>> en2es.get('green','N/D') 'N/D' >>> es2en = {} #Diccionario vacio >>> es2en['azul'] = 'blue' #Cargo un par clave-valor >>> es2en {'azul': 'blue'} Ejemplo de diccionario tom_map = { 1992: { 1:[ ('1A', 8.9), ('1B', 13.6), ('1C', 22.3), ('1D', 60.8), ('1E', 70.4), ('1F-G', 93.6), ('1H', 111.7), ('1I', 129.2), ('1J', 10000)], 2:[ ('2A', 1.6), ('2B', 16.2), ('2C', 18.6), ('2D', 22.5), ('2E', 27.6), ('2F', 44.8), ('2G', 68), ('2H', 72.4), ('2I', 76.1), ('2J', 100.5), ('2K', 122.9), ('2L', 10000)], 3:[ ('3A', 24.2), ('3B', 30.4), ('3C', 54.8), ('3D', 61.1), ('3E', 64.4), ('3F', 97), ('3G', 98.4), ('3H', 108), ('3I', 100000)], 4:[ ('4A', 2), ('4B', 6.6), ('4C', 32.9), ('4D', 38), ('4E', 50), ('4F', 58.4), ('4G', 100.5), ('4H', 113.2), ('4I', 10000)], 5:[ ('5A', 4.6), ('5B', 17.2), ('5C', 42.8), ('5D', 44.6), ('5E', 72.7), ('5F', 75), ('5G', 84.9), ('5H', 92.3), ('5I', 10000)], 6:[ ('6A', 25), ('6B', 31.8), ('6C', 42), ('6D', 61.9), ('6E', 69.6), ('6F', 89.6), ('6G', 10000)], 7:[ ('7A', 3), ('7B', 11), ('7C', 21), ('7D', 36.8), ('7E', 52.6), ('7F', 70.6), ('7G', 75.7), ('7H', 10000)], 8:[ ('8A-B', 18.2), ('8C', 20.1), ('8D', 41.1), ('8E', 61.3), ('8F', 80.6), ('8G', 89.1), ('8H', 10000)], 9:[ ('9A', 8.9), ('9B', 22), ('9C', 28.9), ('9D', 39), ('9E', 56.4), ('9F', 57.4), ('9G', 64.2), ('9H', 69.1), ('9I', 79), ('9J', 102.6), ('9K', 10000)], 10:[ ('10A', 12), ('10B', 37.3), ('10C-D', 48.8), ('10E', 64.6), ('10F', 84.1), ('10G', 10000)], 11:[ ('11A', 20.8), ('11B', 32.3), ('11C', 45.4), ('11D', 59.3), ('11E', 79.9), ('11F', 83.3), ('11G', 83.8), ('11H', 10000)], 12:[ ('12A', 13.8), ('12B', 28.2), ('12C', 32.5), ('12D', 41), ('12E', 47.6), ('12F', 67.3), ('12G', 86), ('12H', 91.8), ('12I', 10000)]} , 2000 :{1:[ ('1A', 19.5), ('1B', 25), ('1C', 31.8), ('1D', 70), ('1E', 92.7), ('1F-G', 127.6), ('1H', 142), ('1I', 163), ('1J', 10000)], 2:[ ('2A', 4), ('2B', 13), ('2C', 16), ('2D-E', 31), ('2F', 45.1), ('2G', 81.2), ('2H', 85), ('2I', 90.1), ('2J', 116.1), ('2K', 143), ('2L', 10000)], 3:[ ('3A', 32), ('3B', 33), ('3C', 71.5), ('3D', 83), ('3E', 85), ('3F', 129), ('3G', 140), ('3H-I', 10000)], 4:[ ('4A-B', 12), ('4C', 46), ('4D', 56), ('4E', 72.5), ('4F', 75), ('4G', 101), ('4H', 124), ('4I', 10000)], 5:[ ('5A', 13.5), ('5B', 30), ('5C', 69), ('5D', 71.1), ('5E', 102), ('5F', 104), ('5G', 110.1), ('5H', 112), ('5I', 10000)], 6:[ ('6A', 33.5), ('6B', 38.6), ('6C', 50), ('6D', 71), ('6E', 81), ('6F', 96), ('6G', 10000)], 7:[ ('7A', 2), ('7B', 7), ('7C', 21.5), ('7D', 45.5), ('7E', 48), ('7F', 72.3), ('7G', 73), ('7H', 10000)], 8:[ ('8A', 2), ('8B', 23.8), ('8C', 30), ('8D', 40), ('8E', 57), ('8F', 68.3), ('8G', 84), ('8H', 10000)], 9:[ ('9A', 4), ('9B', 28), ('9C', 32), ('9D', 35), ('9E', 50.3), ('9F', 53.7), ('9G', 57.5), ('9H', 62), ('9I', 72.5), ('9J', 102), ('9K', 10000)], 10:[ ('10A', 11), ('10B', 43), ('10C-E', 61.5), ('10F', 80), ('10G', 10000)], 11:[ ('11A', 20.5), ('11B', 36.5), ('11C', 49), ('11D', 76), ('11E', 90), ('11F-G', 92), ('11H', 10000)], 12:[ ('12A', 21), ('12B', 32.5), ('12C', 38), ('12D', 55.3), ('12E', 68.5), ('12F-G', 114), ('12H', 117), ('12I', 10000)]}} Sets (Conjuntos) >>> mi_set = set() >>> mi_set.add('jose') >>> mi_set.add('juan') >>> mi_set.add('natalia') >>> mi_set.add('viki') >>> mi_set set(['jose', 'juan', 'viki', 'natalia']) >>> mi_set.pop() 'jose' >>> mi_set set(['juan', 'viki', 'natalia']) >>> mi_set.add('jose') >>> mi_set set(['jose', 'juan', 'viki', 'natalia']) >>> mi_set.add('jose') >>> mi_set set(['jose', 'juan', 'viki', 'natalia']) >>> otro_set = set(['juan','karina','diana']) >>> otro_set set(['diana', 'juan', 'karina']) >>> mi_set.intersection(otro_set) set(['juan']) >>> mi_set.union(otro_set) set(['jose', 'viki', 'natalia', 'diana', 'juan', 'karina']) >>> mi_set.difference(otro_set) set(['jose', 'viki', 'natalia']) Conversión de datos: En Python siempre es explicito >>> rgb=dict([('blue','#0000FF'),('black','#000000'),('red','#FF0000')]) >>> rgb['black'] '#000000' >>> list(t1) ['sgn1545', 5, 45] >>> lista = list('Hago 1 lista') >>> lista ['H', 'a', 'g', 'o', ' ', '1', ' ', 'l', 'i', 's', 't', 'a'] >>> tuple(lista) ('H', 'a', 'g', 'o', ' ', '1', ' ', 'l', 'i', 's', 't', 'a') >>> str(lista) "['H', 'a', 'g', 'o', ' ', '1', ' ', 'l', 'i', 's', 't', 'a']" >>> ''.join(lista) 'Hago una lista' >>> 'Hago una lista'.split(' ') ['Hago', 'una', 'lista'] Data I/O Entrada: input('prompt') raw_input('prompt') >>> edad = Ingrese la >>> edad 33 >>> edad = Ingrese la >>> edad '33' input('Ingrese la edad: ') edad: 33 raw_input('Ingrese la edad: ') edad: 33 Python 3: input() es raw_input() Salida: print Python 3: print() Estructuras de control de flujo if: Condición for: Repetición while: Repetición if if <expresion1>: <Instrucciones> elif <expresion2>: <Instrucciones> else: <Instrucciones> if coord != 'N/A': year = int(coord[0][-4:]) for for <var> in <iterable>: <instrucciones> for x in [1, 3, 4]: print x while while <expresion>: <instrucciones> while mi_set: print mi_set.pop() Ejercicios Archivos Lectura: (1) Abrir (open) (2) Leer (read, readlines, readline) (3) Cerrar (close) Escritura: (1) Abrir (open) (2) Guardar (write) (3) Cerrar (close) Leyendo un archivo: (1) La función open crea un “filehandle”. open(filename[, mode[, bufsize]]) Ej: fh = open('mi_archivo.txt','r') (2) read(n): Lee n bytes, por defecto lee el archivo entero. readline(): Devuelve str con una sola linea readlines(): Devuelve una lista con str por cada línea fh = open('archivo.txt') contenido = fh.read() print contenido fh = open('archivo.txt') contenido = fh.readlines() print contenido contenido = '' fh = open('archivo.txt') while True: line = fh.readline() contenido += line if line='' break print contenido # Para todos: fh.close() Apertura secuencial de un archivo fh = open('archivo.txt') contenido = '' for line in fh: contenido += line fh.close() Leyendo con 'with' (Python 2.6 en adelante) with EXPRESION as VARIABLE: BLOQUE DE CODIGO with open('archivo.txt') as fh: for line in fh: print line Escribiendo archivos Modos de escritura: w: Write, graba un archivo nuevo, si existe, borrarlo. a: Append (agregar), agrega información al final de un archivo preexistente. Si no existe, crea uno nuevo (uso típico: logs). Ejemplo: fh = open('/home/yo/archivo.txt','w') fh.write('1\n2\n3\n4\n5\n') fh.close() Archivos CSV (Comma separated file) Ejemplo: Sebastián,Perez,33,23566777 Jose,Martinez,23,42121329 Karina,Gonzalez,32,24159857 Maria Laura,Yañes,19,43852144 Otro separador: Sebastián;Perez;33;23566777 Jose;Martinez;23;42121329 Karina;Gonzalez;32;24159857 Maria Laura;Yañes;19;43852144 Leyendo CSV sin usar módulo CSV: fh = open('archivo.txt') for line in fh: linea = line.split(',') # procesar elementos: nombre = linea[0] apellido = linea[1] # etc, etc fh.close() CSV con módulo CSV import csv lineas = csv.reader(open('fn.csv')) for line in lineas: nombre = line[0] apellido = line[1] Cambiando separador (delimitador): lineas = csv.reader(open('fn.csv'),delimiter=';') Dialectos: >>> csv.list_dialects() ['excel-tab', 'excel'] Escribiendo archivos CSV >>> >>> ... >>> >>> import csv spamWriter = csv.writer(open('eggs.csv', 'w'), delimiter=' ', quotechar='|', quoting=csv.QUOTE_MINIMAL) spamWriter.writerow(['Spam'] * 5 + ['Baked Beans']) spamWriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam']) Lectura y escritura de Excel: xlrd y xlwt Instalando Easy_install: En Windows: http://pypi.python.org/pypi/setuptools Leyendo Excel: import xlrd iedb = {} # Empty dictionary book = xlrd.open_workbook('sampledata.xls') sh = book.sheet_by_index(0) for i in range(1,sh.nrows): #skips fist line. iedb[sh.cell_value(rowx=i, colx=1)] = \ sh.cell_value(rowx=i, colx=2) Creando planillas Excel: import xlwt list1 = [1,2,3,4,5] list2 = [234,267,281,301,331] wb = xlwt.Workbook() ws = wb.add_sheet('Primera hoja') ws.write(0,0,'Column A') ws.write(0,1,'Column B') i = 1 for x,y in zip(list1,list2): #Walk 2 list @ once. ws.write(i,0,x) # Fila, Columna, Datos. ws.write(i,1,y) i += 1 wb.save('mynewfile.xls') Pickle: Persistencia simple de datos. Pickle vs. cPickle Grabar: >>> spdict = {'blue':'azul','red':'rojo'} >>> spdict {'blue': 'azul', 'red': 'rojo'} >>> import cPickle >>> fh = open('spict.data','w') >>> cPickle.dump(spdict, fh) >>> fh.close() Leer: >>> spdict = cPickle.load(open('spict.data')) >>> spdict {'blue': 'azul', 'red': 'rojo'} Modularizando el código Ejemplo de función: Parámetros fijos: >>> len('Hola') 4 Parámetros variables: >>> [0, >>> [2, >>> [2, range(5) 1, 2, 3, 4] range(2,5) 3, 4] range(2,5,2) 4] Definición de función: def Nombre_Funcion(parametro1, parametro2, etc): ''' Descripcion optativa ''' … código de la función … return DATA Ejemplo: def tair_data(f_in): tair9_d = {} for rec in SeqIO.parse(open(f_in),'fasta'): tair9_d[rec.id] = rec.description return tair9_d Importante: Ambito de variables Mas ejemplos: def sgn_u(bacsgn,rango_ini,rango_end,sgn_u_tomato_d): """ Procesa un nombre tipo 'C02HBa0106H06.1' con sus posiciones, compara con datos en sgn_u_tomato_d y retorna cuales son. """ sgn_u = [] if bacsgn in sgn_u_tomato_d: for gendata in sgn_u_tomato_d[bacsgn]: if gendata[0] <= rango_ini <= rango_end <= gendata[1]: sgn_u.append(sgns.get(gendata[2],gendata[2])) return sgn_u def august(name,rango_ini,rango_end,crms_d): """ Procesa un nombre tipo 'C02HBa0106H06.1' con sus posiciones, compara con datos en crms_d y dice si es AUGUST + o -. """ if name in crms_d: for x in crms_d[name]: if x[0] <= rango_ini <= rango_end <= x[1]: return True return False Función que “no devuelve nada” (devuelve None) def savelist(L, fn): ''' Una lista (L) es grabada como archivo con nombre fn ''' fh = open(fn,'w') for x in L: fh.write(x+'\n') fh.close() return None Parametros por defecto def savelist(L, fn='tmp.txt'): ''' Una lista (L) es grabada como archivo con nombre fn ''' fh = open(fn,'w') for x in L: fh.write(x+'\n') fh.close() return None Número indeterminado de argumentos No se conoce de antemano cuantos argumentos irán en la función. El argumento que tenga el * (asterisco) será pasado como una tupla. def promedio(*numeros): if len(numeros)==0: return None else: return(float(sum(numeros))/len(numeros)) Número indeterminado de argumentos con claves Los argumentos en exceso son pasados como diccionario def cli(nombre,**parametros): linea = '' for p_key,p_vals in parametros.iteritems(): linea += ' -' + p_key + ' ' + p_vals return nombre+linea Módulos Los módulos son archivos con instrucciones (funciones, clases) y datos para ser usado desde un programa. Usando módulos >>> import os >>> os.getcwd() '/home/sbassi' >>> from os import getcwd >>> getcwd() '/home/sbassi' >>> from os import * >>> getcwd() '/home/sbassi' >>> sep '/' >>> import xml.etree.ElementTree as ET Instalando módulos (1) Copiar al PYTHONPATH >>> import sys >>> sys.path ['', '/usr/local/lib/python2.6/dist-packages/xlrd0.7.1-py2.6.egg', '/usr/local/lib/python2.6/distpackages/biopython-1.52-py2.6-linux-i686.egg', '/usr/lib/python2.6', '/usr/lib/python2.6/platlinux2', '/usr/lib/python2.6/lib-tk', '/usr/lib/python2.6/lib-old', '/usr/lib/python2.6/libdynload', '/usr/lib/python2.6/dist-packages', '/usr/lib/python2.6/dist-packages/Numeric', '/usr/lib/python2.6/dist-packages/PIL', '/usr/lib/python2.6/dist-packages/gst-0.10', '/var/lib/python-support/python2.6', '/usr/lib/python2.6/dist-packages/gtk-2.0', '/var/lib/python-support/python2.6/gtk-2.0', '/usr/lib/python2.6/dist-packages/wx-2.6-gtk2unicode', '/usr/local/lib/python2.6/dist-packages'] Instalando módulos (2) Usar gestor de paquetes rpm, apt-get, etc (3) Easy Install (easy_install) $ sudo apt-get install python-setuptools $ sudo easy_install NOMBRE_DEL_MODULO Modulos como programas: if __name__ == "__main__": # hacer algo Biblioteca estándar (PSL): http://docs.python.org/library/ import os # directorio actual? print os.getcwd() # listo todos los archivos del dir actual ma = os.listdir(os.getcwd()) # necesito solo los terminados en .txt ma2 = [] for x in ma: if x.endswith('.txt'): ma2.append(x) print ma2 # otra manera de retener los terminados en .txt ma2 = [x for x in ma if x.endswith('.txt')] print ma2 import glob # directorio actual? print os.getcwd() # listo todos los archivos del dir actual ma = os.listdir(os.getcwd()) # necesito solo los terminados en .txt ma2 = [] for x in ma: if x.endswith('.txt'): ma2.append(x) print ma2 # otra manera de retener los terminados en .txt ma2 = [x for x in ma if x.endswith('.txt')] print ma2 import zipfile a_list = ["Test1.txt", "Test2.txt", "Test3.txt"] # Guardar archivos en un zip zfilename = "mi_archivozipeado.zip" zout = zipfile.ZipFile(zfilename, "w") for fname in a_list: zout.write(fname) zout.close() import zipfile myfile = zipfile.ZipFile('archivo.zip') if myfile.is_zipfile(archivo.zip): print "Es un archivo zip OK" for fn in myfile.namelist(): print fn myfile.extractall() else: print "No es un archivo zip valido" >>> import time >>> # esperar n segundos. >>> time.sleep(2) >>> time.asctime() 'Tue Dec 1 20:07:34 2009' >>> time.time() 1259708878.824398 >>> time.time() 1259708882.5425911 >>> a = time.time() >>> b = time.time() >>> b-a 6.0693800449371338 Para medir tiempo de procesos, usar módulo timeit import sys from optparse import OptionParser usage = "usage: %prog [password_file] [dictionary_file]\n" usage += "or %prog [options] [password_file]\n\n" usage += "Type %prog -h for more information" parser = OptionParser(usage, version="%prog 1.0") parser.add_option("-i", "--input", dest="input_file", help="Input file. ") parser.add_option("-d", "--dictionary", dest="dict_file", help="Use a dictionary file. ") (opts, args) = parser.parse_args() if opts.input_file: fh = open(opts.input_file) elif args: fh = open(args[0]) elif sys.stdin: fh = sys.stdin else: parser.error("Enter an input file") if len(args)==2: fd = open(args[1]) elif opts.dict_file: fd = open(opts.dict_file) else: parser.error('Enter a dictionary file or aspell dictionary') Subprocess import subprocess cmd = ['ps', '-eo', 'pcpu'] p = subprocess.Popen(cmd, stdout=subprocess.PIPE) std = p.communicate()[0] allstatus = str(std).split('\n') webbrowser >>> import webbrowser >>> webbrowser.open('http://www.py4bio.com') True >>> b = webbrowser.get('opera') >>> url = 'http://www.py4bio.com' >>> b.open(url) True Mas ayuda... Manual de Python: http://pyspanishdoc.sourceforge.net/tut/tut.html Mailing list: http://python.org.ar/pyar/ListaDeCorreo List para incio: http://groups.google.com/group/a-python Mas recursos: http://python.org.ar/pyar/AprendiendoPython