Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anterior Revisión previa Próxima revisión | Revisión previa | ||
|
script:python [2011/09/22 16:12] alfred |
script:python [2020/05/09 09:25] (actual) |
||
|---|---|---|---|
| Línea 3: | Línea 3: | ||
| * [[script:python:docs|Documentos externos (artículos, tutoriales...)]] | * [[script:python:docs|Documentos externos (artículos, tutoriales...)]] | ||
| - | + | ===== Básico ===== | |
| - | ===== Sintaxis básica ===== | + | |
| - | * Escribir por pantalla: ''print "Hola"'' | + | |
| - | * Declarar variable: ''iNum = 4'' | + | |
| - | * Comentarios: ''#'' | + | |
| - | * Comentarios de más de una línea: ''""" ... """'' | + | |
| - | * Pedir por consola: ''var = raw_input("Opcion: ")'' | + | |
| - | * Pedir por consola un integer: ''var = input("Opcion: ")'' | + | |
| - | * Booleanos: ''True\False'' ...uso... ''b = True'' | + | |
| - | * Para redondear un float (el segundo parámetro son los dígitos): ''round(3.232, 1)'' | + | |
| - | * Dar a varias variables varios valores en una sola línea: ''a, b, c = 1, 2, 3'' | + | |
| - | * Intercambiar el valor de dos variables: ''a, b = b, a'' | + | |
| - | * ''var1 'is' var2'' devuelve True si la referencia de var1 es la misma que la de var2 | + | |
| - | * Saber el carácter de un código ASCII: ''chr(57)'' | + | |
| - | * Saber el código ASCII de un carácter: ''ord('9')'' | + | |
| - | * Métodos que devuelven el mínimo y el máximo de dos numeros: ''min'' y ''max'' | + | |
| - | * Importar un módulo: ''import <nombre de módulo>'' | + | |
| - | * Importar varios módulos: ''import <mod1>, <mod2>...'' | + | |
| - | + | ||
| Línea 62: | Línea 43: | ||
| </code> | </code> | ||
| * Un foreach sería: ''for <var temp> in <agrupacion elementos>:'' | * Un foreach sería: ''for <var temp> in <agrupacion elementos>:'' | ||
| - | ==== Funciones ==== | ||
| - | * Definimos la función como: ''def <nombre> (<parámetros>)'' | ||
| - | <code python> | ||
| - | def suma (a, b): | ||
| - | return a + b | ||
| - | print suma(2,3) | ||
| - | # 5 | ||
| - | </code> | ||
| - | * También podemos dar valores por defecto a los parámetros | ||
| - | <code python> | ||
| - | def suma (a = 2, b = 4): | ||
| - | return a + b | ||
| - | </code> | ||
| - | Y llamarla de formas distintas: | ||
| - | <code python> | ||
| - | print suma() # 6 | ||
| - | print suma(4) # 8 | ||
| - | print suma(b=1) # 3 | ||
| - | </code> | ||
| - | * Podemos indicar, en una función, que tendrá un número indefinido de parámetros: | ||
| - | <code python> | ||
| - | def testArgLists_1(*args): | ||
| - | print args[0] | ||
| - | print len(args) | ||
| - | print 'args:', args | ||
| - | </code> | ||
| - | Que llamandola así: ''testArgLists_1('aaa', 'bbb')'', nos mostrará... | ||
| - | <code> | ||
| - | aaa | ||
| - | 2 | ||
| - | args: ('aaa', 'bbb') | ||
| - | </code> | ||
| - | * También podemos usar un diccionario de argumentos: | ||
| - | <code python> | ||
| - | def testArgLists_1(**kwargs): | ||
| - | print 'kwargs:', args | ||
| - | </code> | ||
| - | Que llamandola así: | ||
| - | <code python>testArgLists_1(arg1='ccc', arg2='ddd')</code> | ||
| - | Mostraría: | ||
| - | <code python>kwargs: {'arg1': 'ccc', 'arg2': 'ddd'}</code> | ||
| - | Ahora podemos tratar kwargs como si fuese un diccionario, es más, lo es! | ||
| - | * Podemos guardar funciones en en variables, por ejemplo imaginemos una función "Hacer()" | ||
| - | <code python> | ||
| - | a = Hacer # Vuelca Hacer sobre a | ||
| - | a() # Llama a Hacer | ||
| - | </code> | ||
| - | * El valor de una variable que se usa dentro de una función, es tomado del entorno donde se llama a la función: | ||
| - | <code python> | ||
| - | def DobleX (): | ||
| - | return x * 2 | ||
| - | ... | ||
| - | x = 3 | ||
| - | print DobleX() # 6 | ||
| - | </code> | ||
| - | Si no queremos que esto ocurra deberíamos declarar x dentro de la función. | ||
| - | |||
| - | |||
| - | |||
| Línea 126: | Línea 48: | ||
| ===== Orientado a objetos ===== | ===== Orientado a objetos ===== | ||
| ==== Clases ==== | ==== Clases ==== | ||
| - | * Definimos una clase como: ''class <nombre>:'' | + | |
| - | * Siempre, a cada método de la clase, debemos pasar como primer argumento la palabra 'self', que corresponde a sí mismo, algo así como el this de otros lenguajes. | + | |
| - | * Las propiedades de la clase son definidas mediante el self dentro de la clase. Esto es, si definimos algo así: self.prop = 4, luego podremos hacer <objeto>.prop, pero si no lo hemos definido esto nos dará error. Es cuando la definimos cuando se crea. | + | |
| - | * El método constructor por defecto en una clase sería: | + | |
| - | <code python> | + | |
| - | def __init__ (self) | + | |
| - | </code> | + | |
| - | * Para crear un objeto haríamos: <nombre> = <clase>() | + | |
| - | * Ejemplo de definición de una clase: | + | |
| - | <code python> | + | |
| - | class cPrueba: | + | |
| - | def __init__ (self): | + | |
| - | print "constructor" | + | |
| - | def method (self): | + | |
| - | print "metodo" | + | |
| - | def params (self, num): | + | |
| - | print num | + | |
| - | </code> | + | |
| - | * Ejemplo de llamadas: | + | |
| - | <code python> | + | |
| - | c = cPrueba () # constructor | + | |
| - | c.method() # metodo | + | |
| - | c.params(33) # 33 | + | |
| - | </code> | + | |
| * Para tener constructores con argumentos estos han de tener un valor por defecto, sino no furrulará: | * Para tener constructores con argumentos estos han de tener un valor por defecto, sino no furrulará: | ||
| <code python> | <code python> | ||
| Línea 169: | Línea 68: | ||
| * <del>El orden de llamada a los constructores en las clases que participan en la herencia es el de siempre: primero el de la base y luego el de las heredadas.</del> MENTIRA!!, has de llamarlos tú: <nowiki>nombreBase.__init__(self))</nowiki> | * <del>El orden de llamada a los constructores en las clases que participan en la herencia es el de siempre: primero el de la base y luego el de las heredadas.</del> MENTIRA!!, has de llamarlos tú: <nowiki>nombreBase.__init__(self))</nowiki> | ||
| * Para acceder a la clase base de una derivada desde esta, no tenemos que hacer más que <NombreClaseBase>.<NombreMetodo> | * Para acceder a la clase base de una derivada desde esta, no tenemos que hacer más que <NombreClaseBase>.<NombreMetodo> | ||
| - | * Un método curioso, que haría como el .toString() de Java, sería el ''<nowiki>__str__</nowiki>''. Si en una clase definimos este método, cuando dicha clase se use como string devolverá lo que retorne dicho método: | + | |
| - | <code python> | + | |
| - | class cClase: | + | |
| - | ... | + | |
| - | def __str__ (self): | + | |
| - | return "hola" | + | |
| - | ... | + | |
| - | obj = cClase() | + | |
| - | print obj # hola | + | |
| - | </code> | + | |
| - | * Otro método es el de la documentación (''<nowiki>__doc__</nowiki>''), para redefinir este no tenemos que reescribir nada, únicamente debemos, después del nombre de clase, insertar un string, este será su documentación: | + | |
| - | <code python> | + | |
| - | class cHi: | + | |
| - | "Clase de prueba" | + | |
| - | nombre = "" | + | |
| - | + | ||
| - | x = cHi() | + | |
| - | x.nombre = "Pepe" | + | |
| - | print x.nombre # Pepe | + | |
| - | print x.__doc__ # Clase de prueba | + | |
| - | </code> | + | |
| === Notas de clases === | === Notas de clases === | ||
| * Si metes una propiedad dentro de una clase, le das un valor, creas objetos y luego la cambias. Esa propiedad será cambiada para todos los objetos. | * Si metes una propiedad dentro de una clase, le das un valor, creas objetos y luego la cambias. Esa propiedad será cambiada para todos los objetos. | ||
| Línea 200: | Línea 80: | ||
| def __delattr__(self, name): | def __delattr__(self, name): | ||
| </code> | </code> | ||
| - | ==== Sobrecarga de operadores ==== | + | |
| - | Por defecto no podemos operar con dos objetos (sumarlos, restarlos...). Pero si queremos hacerlo únicamente debemos definir ciertas funciones especiales: | + | |
| - | <code> | + | |
| - | __add__ Suma | + | |
| - | __sub__ Resta | + | |
| - | __mul__ Multiplicación con otro elemento del mismo tipo | + | |
| - | __rmul__ Si el operando de la derecha es un tipo primitivo | + | |
| - | __div__ División | + | |
| - | __neg__ Negación, poniendo signo - delante. | + | |
| - | </code> | + | |
| - | También existen el <nowiki>__radd__</nowiki>, el <nowiki>__rdiv__</nowiki>...) | + | |
| - | <code python> | + | |
| - | def __add__(self, otro): | + | |
| - | return Punto(self.x + otro.x, self.y + otro.y) | + | |
| - | </code> | + | |
| ===== Funciones del lenguaje ===== | ===== Funciones del lenguaje ===== | ||
| Línea 241: | Línea 109: | ||
| </code> | </code> | ||
| - | ==== Otras funciones especiales ==== | ||
| - | <code> | ||
| - | __mod__ A%B | ||
| - | __pow__ A**B | ||
| - | __and__ A&B | ||
| - | __or__ A|B | ||
| - | __xor__ A^B | ||
| - | __eq__ A==B | ||
| - | __ne__ A!=B | ||
| - | __gt__ A>B | ||
| - | __lt__ A<B | ||
| - | __ge__ A>=B | ||
| - | __le__ A<=B | ||
| - | __lshift__ A<<B | ||
| - | __rshift__ A>>B | ||
| - | __contains__ A in B, A not in B | ||
| - | __pos__ +A | ||
| - | __inv__ ~A | ||
| - | __abs__ abs(A) | ||
| - | __len__ len(A) | ||
| - | __getitem__ A[i] def __getitem__(self, index): | ||
| - | __setitem__ A[i] = v | ||
| - | __delitem__ del A[i] | ||
| - | __getslice__ A[s:e] | ||
| - | __setslice__ A[s:e] = v | ||
| - | __delslice__ del A[s:e] | ||
| - | </code> | ||
| - | ==== Funciones lambda ==== | + | |
| - | Una función lambda es una función sencilla de una sola línea. Estas funciones son virtuales y no tienen un nombre con el que llamarlas. Se crean, se ejecutan y desaparecen, pero puedes guardarlas en una variable y llamarlas desde ella. | + | |
| - | * Sintaxis: ''lambda <parametro1, parametro2...> : <línea de código devuelta>'' | + | |
| - | <code python> | + | |
| - | >>> a = lambda x,y : x*y | + | |
| - | >>> a(3,4) | + | |
| - | 12 | + | |
| - | </code> | + | |
| - | También podemos llamar a una función lambda sin almacenarla en una variable: | + | |
| - | <code python> | + | |
| - | >>> (lambda x: x*2)(3) | + | |
| - | 6 | + | |
| - | </code> | + | |
| ===== Python avanzado ===== | ===== Python avanzado ===== | ||
| ==== Valores booleanos ==== | ==== Valores booleanos ==== | ||
| Línea 368: | Línea 199: | ||
| - | ==== Ficheros ==== | + | |
| - | * Para leer un fichero únicamente tenemos que declarar una variable que reciba el valor que retorna el método ''open (varString)'', donde varString es el string correspondiente al fichero. | + | |
| - | * Recuerda que cuando hayamos acabado con el fichero, debemos cerrarlo con el método close. | + | |
| - | * El siguiente ejemplo lee y muestra todas las líneas de un fichero (c:\prueba.txt) que luego cierra: | + | |
| - | <code python> | + | |
| - | var = open ("c:\\prueba.txt") | + | |
| - | for file in var.readlines(): | + | |
| - | print file, | + | |
| - | var.close() | + | |
| - | </code> | + | |
| - | * Fíjate en la coma de "''print file,''", hace que no se muestren con retorno de carro después de cada línea, por qué???? Porque la coma se pone para que no haga el salto de línea tras escribir dicha línea | + | |
| - | <code python> | + | |
| - | print "Hola", | + | |
| - | print " caracola" | + | |
| - | # Hola caracola | + | |
| - | </code> | + | |
| - | * Para escribir debemos llamar a open pasandole, a parte del nombre del fichero, el string "w", escribiremos mediante el método write. | + | |
| - | * El siguiente código copia un archivo (prueba.txt) e otro (prueba2.txt): | + | |
| - | <code python> | + | |
| - | var = open ("c:\\prueba.txt") | + | |
| - | var2 = open ("c:\\prueba2.txt", "w") | + | |
| - | for file in var.readlines(): | + | |
| - | var2.write(file) | + | |
| - | var.close() | + | |
| - | var2.close() | + | |
| - | </code> | + | |
| - | * Para añadir datos al final de un fichero existente usaríamos como segundo parámetro, en vez de 'r' o 'w' la letra 'a'. | + | |
| - | === Notas para ficheros === | + | |
| - | * Puedes leer un fichero entero mediante el comando: ''file.read()'' | + | |
| - | * Puedes leer una serie de carácteres con: ''file.read(varInt)'', cuando usas este método una especie de cursor se queda donde acabó de leer. | + | |
| Línea 412: | Línea 214: | ||
| * El módulo **gc** es el recolector de basura, puedes activarlo y desactivarlo | * El módulo **gc** es el recolector de basura, puedes activarlo y desactivarlo | ||
| * El módulo **pickle** nos permite guardar variables de tipos de datos "especiales" de python en ficheros. | * El módulo **pickle** nos permite guardar variables de tipos de datos "especiales" de python en ficheros. | ||
| + | |||
| Línea 419: | Línea 222: | ||
| ===== Notas ===== | ===== Notas ===== | ||
| - | * Los bloques de código son diferenciados por tabulaciones. | ||
| - | * Es case sensitive. | ||
| - | * Si programamos un script con linux la primera línea ha de ser: ''#!/usr/bin/python'' | ||
| * En cualquier momento puedes poner: ''<nowiki><>.__doc__</nowiki>'' y accederás a la documentación de ese método\propiedad: <code python>print string.split.__doc__</code> | * En cualquier momento puedes poner: ''<nowiki><>.__doc__</nowiki>'' y accederás a la documentación de ese método\propiedad: <code python>print string.split.__doc__</code> | ||
| - | * Todos los métodos sirven para todos los objetos, ej: | ||
| - | <code python> | ||
| - | for i in range (0, len(lista)): | ||
| - | print "Elemento " + str(i) + ": " + str(lista[i]) | ||
| - | </code> | ||
| * Parece ser que ''None'' equivale a ''NULL''. | * Parece ser que ''None'' equivale a ''NULL''. | ||
| - | * Podemos hacer: dir(<paquete>), esto nos devolverá una lista de strings con los métodos contenidos en ese paquete. | ||
| - | * Cuando hagamos un print "algo", si ponemos una coma al final no hará el salto de línea. | ||
| * Python es tan flexible que podemos crear una función dentro de otra y llamarla: | * Python es tan flexible que podemos crear una función dentro de otra y llamarla: | ||
| <code python> | <code python> | ||
| Línea 438: | Línea 231: | ||
| return func(a) | return func(a) | ||
| print Func("Aa") | print Func("Aa") | ||
| - | </code> | ||
| - | * Para realizar lo que sería una creación temporal de un objeto para llamar a un método es tan sencillo como: | ||
| - | <code python> | ||
| - | >>> class A: | ||
| - | def Func(self): | ||
| - | print "ahfs" | ||
| - | |||
| - | >>> A().Func() | ||
| - | ahfs | ||
| </code> | </code> | ||
| * Podemos trabajar con números complejos, para ello usamos la 'j' detrás del número: 3j ... o ... 2 + 4j | * Podemos trabajar con números complejos, para ello usamos la 'j' detrás del número: 3j ... o ... 2 + 4j | ||
| Línea 453: | Línea 237: | ||
| * Existe una función sumatorio, a la cual le pasas una lista y la suma: ''sum(range(0,10))'' | * Existe una función sumatorio, a la cual le pasas una lista y la suma: ''sum(range(0,10))'' | ||
| * La función ''mktmp()'' del módulo tempfile devuelve una cadena con la dirección de un nombre de fichero que podría usarse como fichero temporal (que no tenga el nombre de otro). | * La función ''mktmp()'' del módulo tempfile devuelve una cadena con la dirección de un nombre de fichero que podría usarse como fichero temporal (que no tenga el nombre de otro). | ||
| - | * Puedes escribir strings de más de una línea usando **"""** en vez de **"**. P.Ej: | ||
| - | <code python> | ||
| - | print """ Hola Caracola!! | ||
| - | Qué haces aquí... | ||
| - | tan sola????""" | ||
| - | </code> | ||
| * Podemos hacer que el print, en vez de imprimir por pantalla lo haga por otro canal, para ello, en el módulo sys hay una propiedad que es stdout, por ahí es por donde escribirá el print. Para escribir el print usa un método write pasandole a este un string. | * Podemos hacer que el print, en vez de imprimir por pantalla lo haga por otro canal, para ello, en el módulo sys hay una propiedad que es stdout, por ahí es por donde escribirá el print. Para escribir el print usa un método write pasandole a este un string. | ||
| * Si creas una clase con un método write, asignas un objeto de esta a sys.stdout al hacer print se llamará a ese método. | * Si creas una clase con un método write, asignas un objeto de esta a sys.stdout al hacer print se llamará a ese método. | ||
| Línea 465: | Línea 243: | ||
| </code> | </code> | ||
| * ''PrintRedirect'' es una clase que guarda el string pasado por el constructor internamente. Cuando se llama a print también se llama al método write de PrintRedirect (def write(self, msg): ...) que escribe en el fichero que se llama como el string. | * ''PrintRedirect'' es una clase que guarda el string pasado por el constructor internamente. Cuando se llama a print también se llama al método write de PrintRedirect (def write(self, msg): ...) que escribe en el fichero que se llama como el string. | ||
| - | * Para omitir los \n, \t... en python debemos colocar una 'r' antes del string: | ||
| - | <code python>str = r"c:\windows\nvidia"</code> | ||
| - | * Podemos ver el id de un objeto/variable haciendo: ''id(objeto)'' | ||
| * Para copiar un objeto lo que debemos hacer es usar el método copy del módulo copy: | * Para copiar un objeto lo que debemos hacer es usar el método copy del módulo copy: | ||
| <code python> | <code python> | ||
| Línea 478: | Línea 253: | ||
| * Puedes acceder al nombre de la clase de un objeto haciendo: | * Puedes acceder al nombre de la clase de un objeto haciendo: | ||
| <code python>obj.__class__</code> | <code python>obj.__class__</code> | ||
| - | * Puedes dividir una línea de código en varias colocando \ al final: | ||
| - | <code python> | ||
| - | >>> print \ | ||
| - | "manolo" | ||
| - | manolo | ||
| - | </code> | ||
| - | * En Windows puedes tener varias versiones de Python instaladas, solo que únicamente una podrá hacer un ''Register Extensions'', es decir, ser la oficial del sistema. | ||
| * A Python también se le llama ''CPython'', es la implementación por defecto del lenguaje y está escrita en C, además de este existen otros dos desarrollos importantes, el de Java (''Jython'') y el de .NET ([[fw:ironpython:ironpython|IronPython]]). | * A Python también se le llama ''CPython'', es la implementación por defecto del lenguaje y está escrita en C, además de este existen otros dos desarrollos importantes, el de Java (''Jython'') y el de .NET ([[fw:ironpython:ironpython|IronPython]]). | ||
| - | * Si en windows quieres ejecutar un script en Python sin que se muestre la consola únicamente has de hacerlo ejecutandolo desde ''pythonw.exe'' en vez de desde el ''python.exe''. O cambiando su extensión de ''.py'' a ''.pyw''. | ||