SlideShare una empresa de Scribd logo
1 de 127
HowtoThinkLike a ComputerScientist Juan G. VélezRodríguez Joane M. De JesúsDátiz 23 de junio de 2010
Capítulo 6: “Interation”
Multiple Assignment Podemos asignar distintos valores a una misma variable. Es legal asignarle el mismo nombre a diferentes variables ya que al hacerlo, la variable deja de hacer referencia al valor anterior (valor original) y comienza a referirse a un nuevo valor.
Ejemplo bruce = 5 print bruce,  bruce = 7 print bruce La coma se interpone y tomaprioridad ante el “new line” paraque los resultadosquedenuno al lado del otro y no en distintaslíneas. Resultado en la Pantalla: 5 7
Diagrama de Estado bruce 5 7 Deja de ser un 5 para ser un 7.
[object Object]
Porejemplo, en Matemáticassi a = 7 entonces 7 = a.
 En Phytones legal decirque a = 7 perodecirque 7 = a no lo es.,[object Object]
Repetirtareasidénticasesunatareaquelascomputadorasrealizanbastantebien, algoque los sereshumanos no realizaríanmuybien.
Estasrepeticiones se conocencomo “Iteration”.,[object Object]
Lo queocurre en el While es lo siguiente:  Se evalúa la condición, 0 ó 1 Si la condiciónesfalsa (0), se sale del While y continúa con el próximoestado. Si la condiciónescierta (1),  se ejecutancadauno de los estados en el “body” y se regresa al paso 1. 	El “body” o cuerpoconsiste de todos los estadosbajo el encabezamientoquecontienen la mismaalineación, “tabs”, dentro del loop.
Loop (Lazo) Este tipo de estado se conocetambiéncomo un “loop” debido a queluego del tercerpaso, regresanuevamente  al comienzo de la función. Notemosquesi la condiciónesfalsadesde el comienzo, los estadosdentro del lazo no seránejecutadospues no seránecesario. El cuerpo del lazodebecambiar el valor de una o más variables paraqueeventualmente la condición sea falsa y el lazotermine.
LazoInfinito (Infinite Loop) Se puededar el caso en el que un lazo no tenga final y  sigarepitiéndoseparasiempre. Los Científicos de Computadorascomparanesto con lasdirecciones al usar un “Shampoo”. Ejemplo: Lavado, enjuague, repetir.
LazoInfinito (Infinite Loop) En el caso de la función “countdown”, podemoscomprobarque el lazoterminayaque  el  valor de nesfinito, podemosverquenvadecreciendocadavezque el lazo se ejecuta y eventualementeobtenemos el valor de 0.
Otroscasos… Hay vecesque no es tan fácil de mostrar: def  sequence (n): 	while n != 1: 		print n,  		if  n%2 ==0:        # n es un número par 			n = n/2 		else:                       # n es un númeroimpar 		n = n*3+1
Cadavezque el programaejecuta, compruebasi el númeroes par o impar. Si es par lo divide entre 2. Si esimpar, reemplaza el valor por n*3+1. Debido a que n algunasvecesaumenta o disminuye, no hay pruebaobviaparadecirquenalcanzará el 1 o que el programatermine. Una de lasventajasquetienen los lazosesque son buenosparagenerartablas.
Tablas	 Antes de queexistieranlascomputadoras, las personas teníanquecalcularlogaritmos, senos, cosenos y otrasfuncionesmatemáticas a mano. Para facilitarse la vida,  en los libros de matemáticas  se incluíangrandestablasqueincluíanestosvalores.  Crearlastablas era lento y aburrido y podíancontenererrores.
Ejemplo de Tablas El siguienteprogramamuestraunasecuencia de valores en la columna de la izquierda y suslogartimos en la columna de la derecha. x= 1.0 while x <10.0: 	print x, ‘’ , math.log(x) 	x = x +1.0
Tabla ,[object Object],[object Object]
Vimosque los números 1, 2, 4 y 8 son potencias del 2 yaquesuslogaritmos de base 2 son númerosenteros.  Si queremosencontrarotroslogaritmos de potencia 2 podemosmodificar el programa de éstamanera: x = 1.0 while x < 100.0 	print x, 	‘/t’, 	math.log(x)/math.log(2.0) 	x = x * 2.0
Resultado
Tabla de dos dimensiones Tabla en la cual se leen los valores en la intersección entre unafila y unacolumna.  Ejemplo: tabla de multiplicar. Crearemosunatabla de multiplicar del 1 al 6 utilizando un lazoqueimprima los múltiplos de dos en unalínea. i = 1                     #counter 				while i <= 6: 				     print 2*1, ‘	’, i = i + 1 				print	                 #Resultados: 2, 4, 6, 8, 10, 12
Encapsulación y Generalización Encapsulaciónes el proceso de empacarunapieza del código en unafunción. Generalizaciónsignificatomaralgo en específico, comoimprimir los múltiplos de 2 y hacerlomásgeneralizado, comoimprimir los múltiplos de cualquiernúmeroentero.
Ejemplo La siguientefunciónencapsula el lazo anterior  y lo generalizaparaqueimprima los múltiplos de n: def  printMultiples(n): i = 1 			while I <= 6: 			     print n*i, 	     ‘’, i = i  + 1 		print Para encapsular, lo quedebemoshaceresañadir la primeralíneaquees la quedeclara el nombre de la función y la lista de parámetros. Para generalizar, solo reemplazamos el 2 por el parámetron.
ContinuaciónEncapsulación y Generalización Si invocamoséstafunción con el argumento 2, obtenemos los mismosvalores en pantalla. Con el argumento 3 obtenemos: 		3, 6, 9, 12, 15, 18 Con el argumento 4 obtenemos: 		4, 8, 12, 16, 20, 24 Si invocamosprintMultiples en repetidasocasiones con diferentesargumentosobtenemosunatabla de multiplicar.
ContinuaciónEncapsulación y Generalización En esecasopodemosutilizarotrolazo (Loop): i = 1 while i  <= 6: printMultiples(i) i  = i + 1 Obtenemos:
Variables Locales Las variables quehansidodefinidasdentro de unafunción no pueden ser accesadasdesdeafuera de esafunción. Se puedetenermúltiples variables con el mismonombresiempre y cuando no esténdentro de la mismafunción.
Stack Diagram Dos variables distintasllamadasiquecambian de valor sin afectarseuna con la otra.
Ejemplo de Generalización Para crearunatabla de multiplicación de cualquiertamaño, sólo hay queañadir un parámetro a printMultTable: def  printMultTable(high): i = 1 	while i  <= high: printMultiples(i) i = i  + 1
Reemplazamos el valor 6 por el de “high”. Si llamamos  “printMultTable ” con el argumento 7 nosmuestra:
Funciones Darle un nombre a unasecuencia de estados (statements) hacesuprogramafácil de leer y de ejecutar. Dividir un programa en variasfuncionesnospermiteseparar el programa en partes, ejecutarellasporseparado y luegoadjuntarlas en un solo componente.
Facilitan la recursión y la iteración. (Loops) Funcionesbiendiseñadas son útilesparavariosprogramas. Unavez se escribe y se ejecutaalguna, se puedenreusar.
Capítulo 7: “Strings”
Datos Hastaestepunto, hemosvistodistintostipos de datos, porejemplo, “int”, “float”, “string”. Los “strings”  son cualitativamentedistintos de los otros dos tipos de datosyaqueestancompuestos de pequeñaspiezas– caracteres. Tipos de datosquecontienenpiezaspequeñas son conocidoscomo “compound data types.”
Los corchetesseleccionan un solo caracter  del string: >>> fruit = “banana” 	>>> letter = fruit[1] 	>>> print letter La expresión fruit [1] selecciona el caracter en la posición 1 de la palabra fruit.  Cuando “letter” aparece en la pantalla, nosmuestra  la letra a. La primeraletra de la palabra banana es b, peroestaletraesta en la posición 0 y esporesoqueaparece la letra a, quees la queestá en la posición 1.
Índice La expresiónqueestá en corchetes se conocecomoíndice (index). Un índiceespecifica un miembro de un conjuntoordenado, en estecaso, el conjunto de caracteres en el string. El índiceindicaquecaracteres el quequeremos, en vez de sunombre. Puede ser un entero.
Length (Longitud) La función “len” nosdevuelve el número de caracteres en un “string”. >>> fruit = “banana” >>> len(fruit) 6
Length Para obtener el últimocaracter de un “string”, debemosrestar 1 del “length” length  = len(fruit) last = fruit[length-1] Si utilizamosíndicesnegativos, contaremosdesde el últimohasta el primer caracter. Ejemplo: fruit [-1] últimocaracter, fruit[-2] penúltimocaracter, etc.
Traversal & for Loops “Traversal” son los recorridosque se hacen a los caracteres de un “string” desde el primerohasta el último, realizando los cambiosnecesarios a cadauno de los caracteres en eseproceso. Este procesoes tan común en Python, queexisteunaalternativapredefinidallamada “for loop”.
Ejemplo de un “for”: 	for char in fruit: 	print char Cadavezque se ejecuta el lazo (loop), el próximocaracterdisponible en el “string” esasignado a la variable “char”. El “loop” continúahastaque no hayamasningúncaracter en el “string”.
String Slices Un segmento de un “string ” se conocecomo un “slice”. Seleccionar un “slice” es similar a seleccionar un caracter. El operador [n:m] nosdevuelve la parte del “string” desde la posición n hasta la posición m.
String Slices Ejemplo: Si se omite el primer índice, (anterior a la comilla), el “slice” comenzaría al principio del “string”. >>> fruit = “banana” >>> fruit [:3] ‘ban’ >>> fruit [3:] ‘ana’
Comparación de Strings Se puedencomparar “strings”. Para hacerlo, veamos el siguienteejemplo: 	if  word == “banana” 	print “Yes, we have bananas!” Se puedenhacercomparacionesparaponerpalabras en ordenalfabético, perodebemostener mucho cuidadoyaque Python no ve la diferencia entre letrasmayúsculas y letrasminúsculas. Las letrasmayúsculastomanprioridad ante lasletrasminúsculas.
Immutable Strings  Los “strings” no se puedenmodificarluego de ser creados. Si necesitahacercambios, lo mejorescrear un nuevo “string” con lasvariaciones del original.
Función “find” Es lo contrario del operador []. En vez de tomar un índice (index) y extraersucorrespondientecaracter, lo quehaceestomar el caracter  y encuentra el índicedondeapareceesecaracter. Si el caracter no aparece, la funciónnosdevuelve un -1.
Conteos (Counter) El siguienteprogramarealiza un conteodentro de un lazo (loop): 	Al declararseuna variable llamada “count”, ésta se inicializa a 0 y se vaincrementandocadavezque se encuentra un ‘a’.
Módulo “String” Móduloquecontienevariasfuncionesútilesparamanipular “strings”. >>> import string Incluyeunafunciónllamada “find” quehace lo mismoquevimosanteriormente.
Clasificación de Caracteres Es muyútilexaminar un caracter y comprobarsies de letramayúscula o minúscula, o sies un caracter o un dígito. El “string” ‘string.lowercase’ contienetodaslasletrasque el sistemapodríaconsiderarletrasminúsculas. El “string” ‘string.uppercase’ contienetodaslasletrasque el sistemapodríaconsiderarletrasmayúsculas.
Clasificación de Caracteres El “string” ‘string.whitespace’ contienetodos los espacios en blanco, incluyendo ‘space’, ‘tab’ () y ‘newline’ ().
Capítulo 8: Listas
Listas  Una lista es un conjunto de valores, donde cada valor es identificado por un índice.  Los valores que componen una lista son llamados elementos.   Las listas son similares a los “strings”,que son una cadena de caracteres, a excepción de que los elementos de una lista pueden ser de cualquier tipo.   Las listas y las cadenas de caracteres son llamados secuencias.
8.1 Listas de valores Hay varias maneras de formar una nueva lista; la forma más simple es encasillar los elementos en unos corchetes  ([y]). Ejemplos: Lista de cuatro enteros [10, 20, 30, 40] Listas de “strings” [“un”, “dos”, ”tres”] Lista dentro de otra lista [“hola”, 2.0, 5, [10,20] ] Si una lista esta dentro de otra entonces se dice que la lista esta anidada.
Las listas que contienen enteros consecutivos son comunes, por lo que Phyton provee una forma simple para crearlas: 	>>> range (1,5) 		[1, 2, 3, 4] La función rango toma dos argumentos y devuelve una lista que contiene todos los enteros desde el primero hasta el segundo, sin incluir el segundo.
Hay dos formas del alcance. Argumento simple: se crea una lista que comienza en 0. >>> range(10) 			[0, 1, 2, 3, 4, 5, 6, 7, 8, 9 Si existe un tercer argumento, este específica el espacio entre los valores sucesivos, lo que es llamado “stepsize”. Ejemplo: Cuenta desde 1 al 10 de 2 en 2. >>>range(1, 10, 2) [1, 3, 5, 7, 9]
Una lista vacía es una lista especial que no contienen elementos. Este tipo de lista se denota por corchetes []. Podemos usar todas las formas anteriores de listas para asignar valores a variables.
8.2 Acceso de elementos La sintaxis para accesar elementos de una lista es igual a la sintaxis utilizada para accesar caracteres de un “string”. Para esto utilizamos los corchetes [], donde la expresión dentro de los mismos especifica el índice. Recordemos que los índices comienzan en 0. printnumbers[0] numbers[1] = 5
Los corchetes pueden apareces en cualquier lugar de una expresión. Cuando estos aparecen en el lado izquierdo de lo asignado, cambia uno de los elementos de la lista, por lo que el enésimo elemento de la lista ”numbers”, que era 123, es ahora 5. Cualquier expresión  con un número entero puede se utilizada como índice. >>> numbers[3-2] 	5 >>>numbers[1.0] TypeError: sequence index must be integer
Sin embargo, si intentamos leer o escribir un elemento que no existe, entonces obtenemos un error al correr el programa. >>> numbers[2] = 5 IndexError: list assignment index out of range Si un índice tiene un valor negativo, este cuenta desde el final de la lista >>> numbers[-1] 	5 >>> numbers[-3] IndexError: list index out of range
En el ejemplo anterior: numbers[-1] es el último elemento de la lista numbers[-2] es el penúltimo elemento de la lista numbers[-3] no existe en la lista Es muy común usar un “loop” como el índice de una lista. Ejemplo: horsemen = ["war", "famine", "pestilence", "death"] 	i = 0 while i < 4: printhorsemen[i] 	i = i + 1
Este “whileloop” cuenta desde 0 a 4. Cuando el “loop” de la variable i es 4, la condición falla y el “loop” termina. Por lo tanto, el cuerpo del “loop” se ejecuta cuando i es 0, 1, 2 y 3. Cada vez que pasamos por el “loop”, la variable i es utilizada como un índice en la lista, y se imprime el elemento i de la lista en ese momento. (lista de recorrido)
8.3 Largo de la lista La función “len” devuelve el largo de la lista. Es buena idea utilizar este valor como el límite superior de un “loop” en lugar de una constante. En ese caso, si el tamaño de la lista cambia, no tenemos que ir a través del programa cambiando todos los “loops”, pues estos trabajarán correctamente con una lista de cualquier tamaño.
Ejemplo: 		horsemen = ["war", "famine", "pestilence", "death"] i = 0 whilei < len(horsemen): printhorsemen[i] 		i = i + 1 La última vez que el “loop” fue ejecutado, i es len(horsemen)-1, que es el índice del último elemento.
Cuando i es igual a len(horsemen), la condición falla y el cuerpo del programa no es ejecutado, lo cual es bueno, porque este valor  no es un índice legal. A pesar de que una lista puede contener otra, la lista anidada cuenta solo como un elemento. [’spam!’, 1, [’Brie’, ’Roquefort’, ’Pol le Veq’], [1, 2, 3]] En este ejemplo el largo de la lista es 4.
8.4 Membrecía de una lista “in” es un operador “booleano” que prueba la membrecía en una lista. Además de ser utilizado con “strings”, también se usan con listas y otras secuencias. Podemos usar “not” en combinación con “in” para probar si un elemento no es miembro de la lista. El “forloop” también puede ser utilizado con listas.
8.5 Listas y “forloops” La sintaxis general de un “forloop” es: forVARIABLE in LIST: 	BODY Este enunciado es equivalente a : 	i = 0 while i < len(LIST): 	VARIABLE = LIST[i] 	BODY 	i = i + 1 El “forloop” es más conciso porque podemos eliminar el “loop” de la variable i.
8.6 Operaciones con listas Operador + 	>>> a = [1, 2, 3] 	>>> b = [4, 5, 6] 	>>> c = a + b 	>>> print c 	[1, 2, 3, 4, 5, 6] Operador * Repite una lista el número dado de veces 	>>> [1, 2, 3] * 3 	[1, 2, 3, 1, 2, 3, 1, 2, 3]
8.7 Partes de una lista Las operaciones de particiones también trabajan con listas. 	>>> list = [’a’, ’b’, ’c’, ’d’, ’e’, ’f’] 	>>> list[1:3] 	[’b’, ’c’] 	>>> list[:4] 	[’a’, ’b’, ’c’, ’d’] 	>>> list[3:] 	[’d’, ’e’, ’f’]
Si omitimos el primer índice, la partición comienza desde el principio. Si omitimos el segundo, la partición va al final. Si omitimos ambas, la partición es realmente una copia de la lista completa. 	>>> list[:] 	[’a’, ’b’, ’c’, ’d’, ’e’, ’f’]
8.8 Las listas son mutables A diferencia de los “strings”, las listas son mutables, lo que quiere decir que podemos cambiar sus elementos. Usando corchetes al lado izquierdo de la asignación, podemos actualizar uno de los elementos.
Con el operador de partición podemos actualizar varios elementos a la vez. 	>>> list = [’a’, ’b’, ’c’, ’d’, ’e’, ’f’] 	>>> list[1:3] = [’x’, ’y’] 	>>> printlist 	[’a’, ’x’, ’y’, ’d’, ’e’, ’f’] También podemos remover elementos de una lista asignándoles una lista vacía. 	>>> list = [’a’, ’b’, ’c’, ’d’, ’e’, ’f’] 	>>> list[1:3] = [] 	>>> printlist 	[’a’, ’d’, ’e’, ’f’]
Podemos añadir elementos a una lista moviéndolos a una partición vacía. 	>>> list = [’a’, ’d’, ’f’] 	>>> list[1:1] = [’b’, ’c’] 	>>> printlist 	[’a’, ’b’, ’c’, ’d’, ’f’] 	>>> list[4:4] = [’e’] 	>>> printlist 	[’a’, ’b’, ’c’, ’d’, ’e’, ’f’]
Eliminación de una lista Usando particiones para eliminar elementos de una lista puede ser difícil, por lo que entonces estamos propensos a errores. “del” remueve un elemento de una lista. Ejemplo: 	>>> a = [’one’, ’two’, ’three’] 	>>> del a[1] 	>>> a 	[’one’, ’three’]
Como esperamos “del” maneja índices negativos y causa un error en la corrida si el índice esta fuera del alcance. Podemos usar una partición como un índice para “del”. 	>>> list = [’a’, ’b’, ’c’, ’d’, ’e’, ’f’] 	>>> del list[1:5] 	>>> printlist 	[’a’, ’f’]
8.10 Valores y objetos Si ejecutamos las siguientes asignaciones: 	a = "banana" 	b = "banana“ sabemos que a y b se refieren a un “string” con letras “banana”.  Sin embargo, no podemos decir que ambos apuntan al mismo “string”.
Hay dos estados posibles: En el primer caso, a y b se refieren a dos cosas diferentes que tienen el mismo valor. En el segundo caso, ambos se refieren a la misma cosa.
Estas “cosas” tienen nombre y se conocen como objetos. Un objeto es algo a lo que una variable se puede referir. Cada objeto tiene un identificador único, el que puede ser obtenido con la función “id”.
Imprimiendo el identificador de a y b, podemos decir que ambos se refieren al mismo objeto. 	>>> id(a) 	135044008 	>>> id(b) 	135044008 De hecho, obtenemos el mismo identificador doble, lo que significa que Phyton solo ha creado un “string”, y a y b se refieren a el.
Las listas se comportan diferente. Cuando creamos dos listas, tenemos dos objetos: 	>>> a = [1, 2, 3] 	>>> b = [1, 2, 3] 	>>> id(a) 	135045528 	>>> id(b) 	135041704 Entonces el diagrama de estado es el siguiente:  	donde a y b tienen el mismo valor pero no se refieren al mismo objeto.
8.11 Alias Dado que las variables se refieren a objetos, si asignamos una variable a otra, ambas variables se refieren al mismo objeto. 	>>> a = [1, 2, 3] 	>>> b = a En este caso, el diagrama de estado es: Como la misma lista tiene dos nombres diferentes, a y b, decimos que esta es un alias.
Cambios hechos a un alias afectan al otro. A pesar de que este comportamiento puede ser beneficioso, en algunos casos puede ser inesperado o indeseable. En general, es más seguro evitar los alias cuando estamos trabajando con objetos mutables. Claro que para elementos inmutables, no hay problema porque Phyton es libre de “strings” alias, cuando se presenta la oportunidad de economizar.
8.12 Clonando listas Si deseamos modificar una lista y a la vez guardar una copia de la lista original, necesitamos ser capaces de crear una copia de la lista misma, no solo una referencia. A veces este proceso se conoce como clonación, para evitar la ambigüedad del término copia.  La manera más fácil de clonar una lista es usar el operador de partición. 	>>> a = [1, 2, 3] 	>>> b = a[:] 	>>> print b 	[1, 2, 3]
Tomando cualquier partición de a se crea una nueva lista, que en este caso consiste de la lista completa. Ahora podemos realizar cualquier cambio a b sin la preocupación de modificar a. 	>>> b[0] = 5 	>>> print a 	[1, 2, 3]
8.13 Parámetros de listas Pasar una lista como un argumento pasa una referencia a la lista, no una copia de la lista. Por ejemplo, la función “head” toma una lista como un argumento y devuelve el primer elemento. defhead(list): returnlist[0] Se utiliza la siguiente forma: 	>>> numbers = [1, 2, 3] 	>>> head(numbers) 	1
El parámetro “list” y la variable “numbers” son alias para el mismo objeto. El diagrama de estado es: Como el objeto de la lista es compartido por dos marcos, entonces lo dibujamos entre ambos. Si una función modifica el parámetro de una lista, entonces se elimina el cambio.
Por ejemplo, “deleteHead” remueve el primer elemento de una lista. defdeleteHead(list): 	del list[0] Entonces mostramos como se utiliza el comando “deleteHead”. 	>>> numbers = [1, 2, 3] 	>>> deleteHead(numbers) 	>>> printnumbers 	[2, 3]
Si una función devuelve una lista, esta devuelve una referencia a la lista. Por ejemplo, “tail” devuelve una lista que contiene todo menos el primer elemento de la lista. deftail(list): returnlist[1:]
“tail” funciona de la siguiente forma: 	>>> numbers = [1, 2, 3] 	>>> rest = tail(numbers) 	>>> printrest 	[2, 3] Como el valor devuelto fue creado por el operador de particiones, es una lista nueva. Por lo que haber creado “rest” no tiene ningún efecto en “numbers”.
8.14 Listas anidadas Una lista anidada es una lista que aparece como un elemento de otra lista. En esta lista, el tercer elemento es una lista anidada: 	>>> list = ["hello", 2.0, 5, [10, 20]] Si imprimimos “list[3]”, obtenemos “[10, 20]”.
8.15 Matrices Las listas anidadas también son utilizadas para representar matrices. Por ejemplo, la matriz puede ser  	representada como: 	>>> matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] “matrix” es una lista con tres elementos, donde cada elemento es una fila de la matriz.
Podemos seleccionar una fila entera de una matriz de la siguiente forma: >>> matrix[1] 	[4, 5, 6] Podemos extraer un solo elemento de la matriz usando un doble índice: 	>>> matrix[1][1] 	5 El primer índice selecciona una fila, el segundo índice selecciona una columna.
8.16 Listas y “strings” Dos de las funciones más utilizadas en el módulo “string” envuelve listas de “strings”. La función “split” rompe un “string” como una lista de palabras. Cada espacio en blanco entre los caracteres es considerado el límite de una palabra. >>> importstring 	>>> song = "The rain in Spain..." 	>>> string.split(song) 	[’The’, ’rain’, ’in’, ’Spain...’]
Existe un argumento opcional llamado delimitador, el cual puede ser usado para especificar cuales caracteres son utilizados como límites de las palabras. El siguiente ejemplo usa el “string” ai como el delimitador 	>>> string.split(song, ’ai’) 	[’The r’, ’n in Sp’, ’n...’] Notemos que el delimitador no aparece en la lista.
Esta toma una lista de “strings” y une los elementos con un espacio entre cada par. 	>>> list = [’The’, ’rain’, ’in’, ’Spain...’] 	>>> string.join(list) 	’The rain in Spain...’ Como “split”, “join” toma un delimitador opcional que es insertado entre los elementos. 	>>> string.join(list, ’_’) 	’The_rain_in_Spain...’
Capítulo 9: Tuplas
9.1 Mutabilidad y tuplas Un “string” está compuesto de caracteres; mientras una lista está compuesta de elementos de cualquier tipo. Una de las diferencias más notables es que los elementos de una lista pueden ser modificados, pero los caracteres de un “string” no. En otras palabras, los “strings” son inmutables y las listas mutables.
En Phyton también existen las tuplas, la cual es similar a una lista con la excepción de que es inmutable. Sintácticamente, una tupla es una lista de valores separados por comas. Ejemplo: >>> tuple = ’a’, ’b’, ’c’, ’d’, ’e’
Aunque no es necesario, convencionalmente las tuplas se escriben entre paréntesis. 	>>> tuple = (’a’, ’b’, ’c’, ’d’, ’e’) Para crear un tupla con un solo elemento, tenemos que incluir una coma al final. >>> t1 = (’a’,) 	>>> type(t1) 	<type ’tuple’>
Sin la coma, Phyton trata (‘a’) como un “string” entre paréntesis. >>> t2 = (’a’) 	>>> type(t2) 	<type ’str’> Si dejamos la sintaxis a un lado, las operaciones en las tuplas son igual a las operaciones en las listas.
El operador índice selecciona un elemento de una tupla. 	>>> tuple = (’a’, ’b’, ’c’, ’d’, ’e’) 	>>> tuple[0] 	’a’ El operador partición selecciona el alcance de los elementos. 	>>> tuple[1:3] 	(’b’, ’c’)
Si intentamos modificar uno de los elementos de la tupla obtenemos un error. 	>>> tuple[0] = ’A’ TypeError: object doesn’t support item assignment Como no podemos modificar los elementos de una tupla, podemos reemplazarlo con una diferente. 	>>> tuple = (’A’,) + tuple[1:] 	>>> tuple 	(’A’, ’b’, ’c’, ’d’, ’e’)
9.2 Asignando tuplas A veces es bueno cambiar los valores de dos variables. Con la forma convencional de asignación, teníamos que utilizar una variable temporera. Ejemplo para cambiar a y b: >>> temp = a 	>>> a = b 	>>> b = temp
Si tenemos que hacer esto a menudo, este proceso sería engorroso. Phyton provee una forma de asignación de tuplas que resuelve este problema: 	>>> a, b = b, a  El lado izquierdo es la tupla de las variables y el lado derecho es el de los valores. Cada valor es asignado a su variable correspondiente.
Todas las expresiones en el lado derecho son evaluadas antes de cualquier asignación. Esto hace que la asignación de tuplas sea versátil. El número de variables en el lado izquierdo y el número de variables en el derecho tienen que ser iguales. Ejemplo: >>> a, b, c, d = 1, 2, 3 ValueError: unpack tuple of wrong size
9.3 Tuplas como valores devueltos Las funciones pueden devolver tuplas como respuestas. Por ejemplo, podemos escribir una función que cambia dos parámetros: def swap(x, y): return y, x Después podemos asignar el valor devuelto a una tupla con dos variables: a, b = swap(a, b)
En este caso, no es ventajoso realizar una función “swap”. De hecho, existe un peligro en intentar encapsular “swap”, el cual es el siguiente error: def swap(x, y): # incorrectversion 	x, y = y, x Si llamamos la función de la siguiente manera: swap(a, b) 	entonces a y x son alias para el mismo valor.
Cambiando x dentro de “swap” hace que x se refiera a un valor diferente, pero no tiene efecto en “in_main_”. Similarmente, cambiar y no tiene ningún efecto en b. Esta función corre sin producir un mensaje de error, pero no realiza lo que se pretende. Este es un buen ejemplo para un error de semántica.
9.4 Números aleatorios Muchos programas de computadoras hacen lo mismo cada vez que son ejecutados, por lo que podemos llamarlos determinísticos. El determinismo es usualmente bueno, porque esperamos que el mismo cálculo arroje el mismo resultado. Para algunas aplicaciones, queremos que la computadora sea impredecible. Ejemplo: Juegos
Hacer un programa no determinístico no es sencillo, pero existen formas para que lo sea lo menos posible. Una de las formas es generando números aleatorios y utilizarlos para determinas la salida del programa. Phyton provee una función pre-construida que genera números seudo-aleatorios, los cuales no son completamente aleatorios en sentido matemático, pero para nuestros propósitos si lo son.
El módulo “random” contiene una función llamada “random” que devuelve un número decimal entre 0.0 y 1.0. Cada vez que realizamos la operación, obtenemos el siguiente número en una serie larga. Ejemplo: importrandom for i in range(10): 	x = random.random() print x
9.2 Lista de números aleatorios El primer paso es generar una lista de valores aleatorios. “randomList” toma un argumento entero y devuelve una lista de números aleatorios con el largo dado. Se comienza con una lista de n ceros. Cada vez que pasamos a través del “loop”, este reemplaza uno de los elementos con un número aleatorio.
El valor devuelto es una referencia a la lista completa. def randomList(n): 	s = [0] * n 	for i in range(n): 	s[i] = random.random() 	return s Los números generados por “random” son distribuidos uniformemente, lo que significa que cada valor es igualmente probable.
Si dividimos el alcance de los valores posibles en “buckets” del mismo tamaño, y contamos el número de veces que el valor aleatorio cae en cada “bucket”, tendremos seguramente el mismo número en cada uno. Podemos probar esta teoría escribiendo un programa que divida el alcance en “buckets” y cuente el número de valores en cada uno.
9.6 Contando Una buena propuesta para problemas como este es dividir el problema en partes y buscar soluciones computacionales a estos problemas. En este caso, deseamos recorrer una lista de números y contar el número de veces que un valor cae en el rango dado. Podemos proceder copiando el programa y adaptándolo para el problema actual.
El programa original es:count = 0 forchar in fruit: ifchar == ’a’: count = count + 1 printcount Este primer paso es para reemplazar “fruit” with “t” y “char” con “num”. Esto no cambia el programa, solo lo hace más fácil para leer.
El segundo paso es cambiar la prueba. No tenemos la intención de encontrar valores, deseamos saber si “num” esta entre los valores “low” y “high”. Ejemplo: count = 0 forchar in fruit: ifchar == ’a’: count = count + 1 printcount
El último paso es encapsular este código en la función “inBucket”. Los parámetros son la lista y los valores “low” y “high”. definBucket(t, low, high): count = 0 fornum in t: iflow < num < high: count = count + 1 returncount
Copiando y modificando un programa existente, somos capaces de escribir esta función rápidamente y economizar tiempo. Este plan de desarrollo se conoce como pareo de patrones. Si trabajamos en un problema que hemos resuelto anteriormente, reusamos la solución.
9.7 Muchos “buckets” Si el número de “buckets” aumenta, la función “inBucket” se vuelve un poco difícil.  Con dos “buckets”: low = inBucket(a, 0.0, 0.5) high = inBucket(a, 0.5, 1) Con cuatro “buckets” se vuelve engorroso: bucket1 = inBucket(a, 0.0, 0.25) 	bucket2 = inBucket(a, 0.25, 0.5) 	bucket3 = inBucket(a, 0.5, 0.75) 	bucket4 = inBucket(a, 0.75, 1.0)
Existen dos problemas. Tenemos que declarar un nombre nuevo para cada resultado de la variable. Tenemos que calcular el rango para cada “bucket”. Podemos resolver el segundo problema primero. Si el número de “buckets” es “numBuckets”, entonces el ancho de cada “bucket” es “1.0/numBuckets”. Usamos un “loop” para calcular el rango de cada “bucket”.
La variable “loop”, i, cuenta desde 0 a “numBuckets-1” bucketWidth = 1.0 / numBuckets for i in range(numBuckets): low = i * bucketWidth high = low + bucketWidth printlow, "to", high Para calcular el limite inferior para cada “bucket”, multiplicamos la variable “loop” por el ancho del “bucket”.
El limite superior es la suma del inferior y el “bucketWidth”. Ejemplo:Con“numBuckets=8”, el “output” es: 0.0 to 0.125 		0.125 to 0.25 		0.25 to 0.375 		0.375 to 0.5 		0.5 to 0.625 		0.625 to 0.75 		0.75 to 0.875 		0.875 to 1.0
Podemos confirmar que cada “bucket” tiene el mismo ancho, que no se solapan, y que cubren completamente el alcance desde 0.0 a 1.0. Para el primer problema, necesitamos una forma para guardar ocho enteros, usando la variable “loop” para indicar uno a la vez. Tenemos que crear una lista “bucket” fuera del “loop”, porque solo queremos recorrerla una vez
Dentro del “loop”, llamaremos el “inBucket” repetidamente y actualizaremos el enésimo elemento i de la lista. Ejemplo: numBuckets = 8 buckets = [0] * numBuckets bucketWidth = 1.0 / numBuckets for i in range(numBuckets): low = i * bucketWidth high = low + bucketWidth buckets[i] = inBucket(t, low, high) printbuckets
Con una lista de 1000 valores, el código produce la siguiente lista “bucket”: 	[138, 124, 128, 118, 130, 117, 114, 131] Estos números están bien cerca de 125, que es lo que esperamos.  Al estar tan cerca podemos creer que el generador de números aleatorios está funcionando.
9.8 Solución por una prueba A pesar de que el programa funciona, no es tan eficiente como podría ser. Cada vez que se llama el “inBucket”, se recorre la lista completa. Si el numero de “buckets” aumenta, también el número de recorridas. Sería mejor si pasamos una sola vez por la lista y computamos el índice del “bucket” en el cual falla para cada valor.
Luego podemos aumentar el contador apropiado. Deseamos tomar un valor en el rango de 0.0 a 1.0 para calcular el índice del “bucket” en el cual se falla. Dado que el problema es el inverso del problema anterior, podemos pensar que debemos dividir por el “bucketWidth” en vez de multiplicar, como en el ejemplo anterior. Dado que “bucketWidth”=“1.0/numBuckets”, dividiendo por “bucketWidth” es lo mismo que multiplicar por “numBuckets”.
Si multiplicamos un número en el rango 0.0 a 1.0 por “numBuckets”, obtenemos un número en el rango desde 0.0 hasta “numBuckets”. Si redondeamos ese número al entero menor, obtenemos exactamente lo que estamos buscando, un índice del “bucket”. numBuckets = 8 buckets = [0] * numBuckets for i in t: index = int(i * numBuckets) buckets[index] = buckets[index] + 1

Más contenido relacionado

La actualidad más candente

La actualidad más candente (8)

Vb script hx-c-wd
Vb script hx-c-wdVb script hx-c-wd
Vb script hx-c-wd
 
Greenfoot 10
Greenfoot 10Greenfoot 10
Greenfoot 10
 
41 Php. Bucles For
41 Php. Bucles For41 Php. Bucles For
41 Php. Bucles For
 
Aprendiendo php 2
Aprendiendo php 2Aprendiendo php 2
Aprendiendo php 2
 
Jyoc java-cap03 bucles
Jyoc java-cap03 buclesJyoc java-cap03 bucles
Jyoc java-cap03 bucles
 
Python03
Python03Python03
Python03
 
Greenfoot 5
Greenfoot 5Greenfoot 5
Greenfoot 5
 
Python02
Python02Python02
Python02
 

Destacado

Modelos de producción y relaciones laborales
Modelos de producción y relaciones laboralesModelos de producción y relaciones laborales
Modelos de producción y relaciones laboralesAndrea Villamarín
 
A N O V A Formal
A N O V A FormalA N O V A Formal
A N O V A Formaljoanem28
 
Mantenimiento productivo pdf
Mantenimiento productivo pdfMantenimiento productivo pdf
Mantenimiento productivo pdfAlexandra797
 
Oee (Overall Equipment Efficiency)
Oee (Overall Equipment Efficiency)Oee (Overall Equipment Efficiency)
Oee (Overall Equipment Efficiency)GRUPO FDS
 
Método de mínimos cuadrados
Método de mínimos cuadradosMétodo de mínimos cuadrados
Método de mínimos cuadradosCynthiia Lucíía
 
Minimos Cuadrados Presentacion Final
Minimos Cuadrados Presentacion FinalMinimos Cuadrados Presentacion Final
Minimos Cuadrados Presentacion FinalJuan Coronel
 
Calculo linea recta minimos cuadrados
Calculo linea recta minimos cuadradosCalculo linea recta minimos cuadrados
Calculo linea recta minimos cuadradosFIDEL GUEVARA LARA
 
Tpm Para Operarios
Tpm Para OperariosTpm Para Operarios
Tpm Para Operariosguest7e48ee
 
Método de mínimos cuadrados
Método de mínimos cuadradosMétodo de mínimos cuadrados
Método de mínimos cuadradoscriollitoyque
 

Destacado (16)

Modelos de producción y relaciones laborales
Modelos de producción y relaciones laboralesModelos de producción y relaciones laborales
Modelos de producción y relaciones laborales
 
A N O V A Formal
A N O V A FormalA N O V A Formal
A N O V A Formal
 
Estadística II (II Bimestre)
Estadística II (II Bimestre)Estadística II (II Bimestre)
Estadística II (II Bimestre)
 
Mantenimiento productivo pdf
Mantenimiento productivo pdfMantenimiento productivo pdf
Mantenimiento productivo pdf
 
Oee (Overall Equipment Efficiency)
Oee (Overall Equipment Efficiency)Oee (Overall Equipment Efficiency)
Oee (Overall Equipment Efficiency)
 
Balance de lineas
Balance de lineasBalance de lineas
Balance de lineas
 
Método de mínimos cuadrados
Método de mínimos cuadradosMétodo de mínimos cuadrados
Método de mínimos cuadrados
 
ESTADISTICA II
ESTADISTICA IIESTADISTICA II
ESTADISTICA II
 
Calculo del O.E.E.
Calculo del O.E.E.Calculo del O.E.E.
Calculo del O.E.E.
 
Minimos Cuadrados Presentacion Final
Minimos Cuadrados Presentacion FinalMinimos Cuadrados Presentacion Final
Minimos Cuadrados Presentacion Final
 
Calculo linea recta minimos cuadrados
Calculo linea recta minimos cuadradosCalculo linea recta minimos cuadrados
Calculo linea recta minimos cuadrados
 
Tpm Para Operarios
Tpm Para OperariosTpm Para Operarios
Tpm Para Operarios
 
Minimos cuadrados
Minimos cuadradosMinimos cuadrados
Minimos cuadrados
 
Regresión por Mínimos Cuadrados
Regresión por Mínimos CuadradosRegresión por Mínimos Cuadrados
Regresión por Mínimos Cuadrados
 
Método de Mínimos Cuadrados
Método de Mínimos CuadradosMétodo de Mínimos Cuadrados
Método de Mínimos Cuadrados
 
Método de mínimos cuadrados
Método de mínimos cuadradosMétodo de mínimos cuadrados
Método de mínimos cuadrados
 

Similar a How to Think Like a Computer Scientist

Similar a How to Think Like a Computer Scientist (20)

Mathlab tutorial
Mathlab tutorialMathlab tutorial
Mathlab tutorial
 
Graficas con Matlab
Graficas con Matlab Graficas con Matlab
Graficas con Matlab
 
Programacion MatLab
Programacion MatLabProgramacion MatLab
Programacion MatLab
 
Suma de imagenes
Suma de imagenesSuma de imagenes
Suma de imagenes
 
4072954.ppt
4072954.ppt4072954.ppt
4072954.ppt
 
Ambientedeprogramacinenpascal 111015091809-phpapp02
Ambientedeprogramacinenpascal 111015091809-phpapp02Ambientedeprogramacinenpascal 111015091809-phpapp02
Ambientedeprogramacinenpascal 111015091809-phpapp02
 
Ambiente
 Ambiente Ambiente
Ambiente
 
Ambiente de programación en pascal
Ambiente de programación en pascalAmbiente de programación en pascal
Ambiente de programación en pascal
 
Ambiente de programacin en pascal
Ambiente de programacin en pascalAmbiente de programacin en pascal
Ambiente de programacin en pascal
 
Ambiente de programación en pascal
Ambiente de programación en pascalAmbiente de programación en pascal
Ambiente de programación en pascal
 
1 fundamentos
1 fundamentos1 fundamentos
1 fundamentos
 
Manual de c
Manual de cManual de c
Manual de c
 
Mod 2 algoritmos
Mod 2 algoritmosMod 2 algoritmos
Mod 2 algoritmos
 
1 fundamentos
1 fundamentos1 fundamentos
1 fundamentos
 
Matlab teoria
Matlab teoriaMatlab teoria
Matlab teoria
 
Matlabteoria 130808215706-phpapp01
Matlabteoria 130808215706-phpapp01Matlabteoria 130808215706-phpapp01
Matlabteoria 130808215706-phpapp01
 
Matlabteoria 130808215706-phpapp01
Matlabteoria 130808215706-phpapp01Matlabteoria 130808215706-phpapp01
Matlabteoria 130808215706-phpapp01
 
Aa javaaa intro
Aa javaaa introAa javaaa intro
Aa javaaa intro
 
Programacion en java_inicio apeuntes para ems
Programacion en java_inicio apeuntes para emsProgramacion en java_inicio apeuntes para ems
Programacion en java_inicio apeuntes para ems
 
T9
T9T9
T9
 

Último

NUEVAS DIAPOSITIVAS POSGRADO Gestion Publica.pdf
NUEVAS DIAPOSITIVAS POSGRADO Gestion Publica.pdfNUEVAS DIAPOSITIVAS POSGRADO Gestion Publica.pdf
NUEVAS DIAPOSITIVAS POSGRADO Gestion Publica.pdfUPTAIDELTACHIRA
 
🦄💫4° SEM32 WORD PLANEACIÓN PROYECTOS DARUKEL 23-24.docx
🦄💫4° SEM32 WORD PLANEACIÓN PROYECTOS DARUKEL 23-24.docx🦄💫4° SEM32 WORD PLANEACIÓN PROYECTOS DARUKEL 23-24.docx
🦄💫4° SEM32 WORD PLANEACIÓN PROYECTOS DARUKEL 23-24.docxEliaHernndez7
 
TEMA 14.DERIVACIONES ECONÓMICAS, SOCIALES Y POLÍTICAS DEL PROCESO DE INTEGRAC...
TEMA 14.DERIVACIONES ECONÓMICAS, SOCIALES Y POLÍTICAS DEL PROCESO DE INTEGRAC...TEMA 14.DERIVACIONES ECONÓMICAS, SOCIALES Y POLÍTICAS DEL PROCESO DE INTEGRAC...
TEMA 14.DERIVACIONES ECONÓMICAS, SOCIALES Y POLÍTICAS DEL PROCESO DE INTEGRAC...jlorentemartos
 
Prueba de evaluación Geografía e Historia Comunidad de Madrid 4ºESO
Prueba de evaluación Geografía e Historia Comunidad de Madrid 4ºESOPrueba de evaluación Geografía e Historia Comunidad de Madrid 4ºESO
Prueba de evaluación Geografía e Historia Comunidad de Madrid 4ºESOluismii249
 
Posición astronómica y geográfica de Europa.pptx
Posición astronómica y geográfica de Europa.pptxPosición astronómica y geográfica de Europa.pptx
Posición astronómica y geográfica de Europa.pptxBeatrizQuijano2
 
Biografía de Charles Coulomb física .pdf
Biografía de Charles Coulomb física .pdfBiografía de Charles Coulomb física .pdf
Biografía de Charles Coulomb física .pdfGruberACaraballo
 
Proyecto de aprendizaje dia de la madre MINT.pdf
Proyecto de aprendizaje dia de la madre MINT.pdfProyecto de aprendizaje dia de la madre MINT.pdf
Proyecto de aprendizaje dia de la madre MINT.pdfpatriciaines1993
 
La Sostenibilidad Corporativa. Administración Ambiental
La Sostenibilidad Corporativa. Administración AmbientalLa Sostenibilidad Corporativa. Administración Ambiental
La Sostenibilidad Corporativa. Administración AmbientalJonathanCovena1
 
Prueba libre de Geografía para obtención título Bachillerato - 2024
Prueba libre de Geografía para obtención título Bachillerato - 2024Prueba libre de Geografía para obtención título Bachillerato - 2024
Prueba libre de Geografía para obtención título Bachillerato - 2024Juan Martín Martín
 
origen y desarrollo del ensayo literario
origen y desarrollo del ensayo literarioorigen y desarrollo del ensayo literario
origen y desarrollo del ensayo literarioELIASAURELIOCHAVEZCA1
 
INSTRUCCION PREPARATORIA DE TIRO .pptx
INSTRUCCION PREPARATORIA DE TIRO   .pptxINSTRUCCION PREPARATORIA DE TIRO   .pptx
INSTRUCCION PREPARATORIA DE TIRO .pptxdeimerhdz21
 
RESULTADOS DE LA EVALUACIÓN DIAGNÓSTICA 2024 - ACTUALIZADA.pptx
RESULTADOS DE LA EVALUACIÓN DIAGNÓSTICA 2024 - ACTUALIZADA.pptxRESULTADOS DE LA EVALUACIÓN DIAGNÓSTICA 2024 - ACTUALIZADA.pptx
RESULTADOS DE LA EVALUACIÓN DIAGNÓSTICA 2024 - ACTUALIZADA.pptxpvtablets2023
 
Tema 10. Dinámica y funciones de la Atmosfera 2024
Tema 10. Dinámica y funciones de la Atmosfera 2024Tema 10. Dinámica y funciones de la Atmosfera 2024
Tema 10. Dinámica y funciones de la Atmosfera 2024IES Vicent Andres Estelles
 
2 REGLAMENTO RM 0912-2024 DE MODALIDADES DE GRADUACIÓN_.pptx
2 REGLAMENTO RM 0912-2024 DE MODALIDADES DE GRADUACIÓN_.pptx2 REGLAMENTO RM 0912-2024 DE MODALIDADES DE GRADUACIÓN_.pptx
2 REGLAMENTO RM 0912-2024 DE MODALIDADES DE GRADUACIÓN_.pptxRigoTito
 
Prueba de evaluación Geografía e Historia Comunidad de Madrid 2º de la ESO
Prueba de evaluación Geografía e Historia Comunidad de Madrid 2º de la ESOPrueba de evaluación Geografía e Historia Comunidad de Madrid 2º de la ESO
Prueba de evaluación Geografía e Historia Comunidad de Madrid 2º de la ESOluismii249
 
SESION DE PERSONAL SOCIAL. La convivencia en familia 22-04-24 -.doc
SESION DE PERSONAL SOCIAL.  La convivencia en familia 22-04-24  -.docSESION DE PERSONAL SOCIAL.  La convivencia en familia 22-04-24  -.doc
SESION DE PERSONAL SOCIAL. La convivencia en familia 22-04-24 -.docRodneyFrankCUADROSMI
 
Plan-de-la-Patria-2019-2025- TERCER PLAN SOCIALISTA DE LA NACIÓN.pdf
Plan-de-la-Patria-2019-2025- TERCER PLAN SOCIALISTA DE LA NACIÓN.pdfPlan-de-la-Patria-2019-2025- TERCER PLAN SOCIALISTA DE LA NACIÓN.pdf
Plan-de-la-Patria-2019-2025- TERCER PLAN SOCIALISTA DE LA NACIÓN.pdfcarolinamartinezsev
 
6°_GRADO_-_MAYO_06 para sexto grado de primaria
6°_GRADO_-_MAYO_06 para sexto grado de primaria6°_GRADO_-_MAYO_06 para sexto grado de primaria
6°_GRADO_-_MAYO_06 para sexto grado de primariaWilian24
 

Último (20)

NUEVAS DIAPOSITIVAS POSGRADO Gestion Publica.pdf
NUEVAS DIAPOSITIVAS POSGRADO Gestion Publica.pdfNUEVAS DIAPOSITIVAS POSGRADO Gestion Publica.pdf
NUEVAS DIAPOSITIVAS POSGRADO Gestion Publica.pdf
 
🦄💫4° SEM32 WORD PLANEACIÓN PROYECTOS DARUKEL 23-24.docx
🦄💫4° SEM32 WORD PLANEACIÓN PROYECTOS DARUKEL 23-24.docx🦄💫4° SEM32 WORD PLANEACIÓN PROYECTOS DARUKEL 23-24.docx
🦄💫4° SEM32 WORD PLANEACIÓN PROYECTOS DARUKEL 23-24.docx
 
TEMA 14.DERIVACIONES ECONÓMICAS, SOCIALES Y POLÍTICAS DEL PROCESO DE INTEGRAC...
TEMA 14.DERIVACIONES ECONÓMICAS, SOCIALES Y POLÍTICAS DEL PROCESO DE INTEGRAC...TEMA 14.DERIVACIONES ECONÓMICAS, SOCIALES Y POLÍTICAS DEL PROCESO DE INTEGRAC...
TEMA 14.DERIVACIONES ECONÓMICAS, SOCIALES Y POLÍTICAS DEL PROCESO DE INTEGRAC...
 
Prueba de evaluación Geografía e Historia Comunidad de Madrid 4ºESO
Prueba de evaluación Geografía e Historia Comunidad de Madrid 4ºESOPrueba de evaluación Geografía e Historia Comunidad de Madrid 4ºESO
Prueba de evaluación Geografía e Historia Comunidad de Madrid 4ºESO
 
Posición astronómica y geográfica de Europa.pptx
Posición astronómica y geográfica de Europa.pptxPosición astronómica y geográfica de Europa.pptx
Posición astronómica y geográfica de Europa.pptx
 
Biografía de Charles Coulomb física .pdf
Biografía de Charles Coulomb física .pdfBiografía de Charles Coulomb física .pdf
Biografía de Charles Coulomb física .pdf
 
Supuestos_prácticos_funciones.docx
Supuestos_prácticos_funciones.docxSupuestos_prácticos_funciones.docx
Supuestos_prácticos_funciones.docx
 
Interpretación de cortes geológicos 2024
Interpretación de cortes geológicos 2024Interpretación de cortes geológicos 2024
Interpretación de cortes geológicos 2024
 
Proyecto de aprendizaje dia de la madre MINT.pdf
Proyecto de aprendizaje dia de la madre MINT.pdfProyecto de aprendizaje dia de la madre MINT.pdf
Proyecto de aprendizaje dia de la madre MINT.pdf
 
La Sostenibilidad Corporativa. Administración Ambiental
La Sostenibilidad Corporativa. Administración AmbientalLa Sostenibilidad Corporativa. Administración Ambiental
La Sostenibilidad Corporativa. Administración Ambiental
 
Prueba libre de Geografía para obtención título Bachillerato - 2024
Prueba libre de Geografía para obtención título Bachillerato - 2024Prueba libre de Geografía para obtención título Bachillerato - 2024
Prueba libre de Geografía para obtención título Bachillerato - 2024
 
origen y desarrollo del ensayo literario
origen y desarrollo del ensayo literarioorigen y desarrollo del ensayo literario
origen y desarrollo del ensayo literario
 
INSTRUCCION PREPARATORIA DE TIRO .pptx
INSTRUCCION PREPARATORIA DE TIRO   .pptxINSTRUCCION PREPARATORIA DE TIRO   .pptx
INSTRUCCION PREPARATORIA DE TIRO .pptx
 
RESULTADOS DE LA EVALUACIÓN DIAGNÓSTICA 2024 - ACTUALIZADA.pptx
RESULTADOS DE LA EVALUACIÓN DIAGNÓSTICA 2024 - ACTUALIZADA.pptxRESULTADOS DE LA EVALUACIÓN DIAGNÓSTICA 2024 - ACTUALIZADA.pptx
RESULTADOS DE LA EVALUACIÓN DIAGNÓSTICA 2024 - ACTUALIZADA.pptx
 
Tema 10. Dinámica y funciones de la Atmosfera 2024
Tema 10. Dinámica y funciones de la Atmosfera 2024Tema 10. Dinámica y funciones de la Atmosfera 2024
Tema 10. Dinámica y funciones de la Atmosfera 2024
 
2 REGLAMENTO RM 0912-2024 DE MODALIDADES DE GRADUACIÓN_.pptx
2 REGLAMENTO RM 0912-2024 DE MODALIDADES DE GRADUACIÓN_.pptx2 REGLAMENTO RM 0912-2024 DE MODALIDADES DE GRADUACIÓN_.pptx
2 REGLAMENTO RM 0912-2024 DE MODALIDADES DE GRADUACIÓN_.pptx
 
Prueba de evaluación Geografía e Historia Comunidad de Madrid 2º de la ESO
Prueba de evaluación Geografía e Historia Comunidad de Madrid 2º de la ESOPrueba de evaluación Geografía e Historia Comunidad de Madrid 2º de la ESO
Prueba de evaluación Geografía e Historia Comunidad de Madrid 2º de la ESO
 
SESION DE PERSONAL SOCIAL. La convivencia en familia 22-04-24 -.doc
SESION DE PERSONAL SOCIAL.  La convivencia en familia 22-04-24  -.docSESION DE PERSONAL SOCIAL.  La convivencia en familia 22-04-24  -.doc
SESION DE PERSONAL SOCIAL. La convivencia en familia 22-04-24 -.doc
 
Plan-de-la-Patria-2019-2025- TERCER PLAN SOCIALISTA DE LA NACIÓN.pdf
Plan-de-la-Patria-2019-2025- TERCER PLAN SOCIALISTA DE LA NACIÓN.pdfPlan-de-la-Patria-2019-2025- TERCER PLAN SOCIALISTA DE LA NACIÓN.pdf
Plan-de-la-Patria-2019-2025- TERCER PLAN SOCIALISTA DE LA NACIÓN.pdf
 
6°_GRADO_-_MAYO_06 para sexto grado de primaria
6°_GRADO_-_MAYO_06 para sexto grado de primaria6°_GRADO_-_MAYO_06 para sexto grado de primaria
6°_GRADO_-_MAYO_06 para sexto grado de primaria
 

How to Think Like a Computer Scientist

  • 1. HowtoThinkLike a ComputerScientist Juan G. VélezRodríguez Joane M. De JesúsDátiz 23 de junio de 2010
  • 3. Multiple Assignment Podemos asignar distintos valores a una misma variable. Es legal asignarle el mismo nombre a diferentes variables ya que al hacerlo, la variable deja de hacer referencia al valor anterior (valor original) y comienza a referirse a un nuevo valor.
  • 4. Ejemplo bruce = 5 print bruce, bruce = 7 print bruce La coma se interpone y tomaprioridad ante el “new line” paraque los resultadosquedenuno al lado del otro y no en distintaslíneas. Resultado en la Pantalla: 5 7
  • 5. Diagrama de Estado bruce 5 7 Deja de ser un 5 para ser un 7.
  • 6.
  • 7. Porejemplo, en Matemáticassi a = 7 entonces 7 = a.
  • 8.
  • 10.
  • 11. Lo queocurre en el While es lo siguiente: Se evalúa la condición, 0 ó 1 Si la condiciónesfalsa (0), se sale del While y continúa con el próximoestado. Si la condiciónescierta (1), se ejecutancadauno de los estados en el “body” y se regresa al paso 1. El “body” o cuerpoconsiste de todos los estadosbajo el encabezamientoquecontienen la mismaalineación, “tabs”, dentro del loop.
  • 12. Loop (Lazo) Este tipo de estado se conocetambiéncomo un “loop” debido a queluego del tercerpaso, regresanuevamente al comienzo de la función. Notemosquesi la condiciónesfalsadesde el comienzo, los estadosdentro del lazo no seránejecutadospues no seránecesario. El cuerpo del lazodebecambiar el valor de una o más variables paraqueeventualmente la condición sea falsa y el lazotermine.
  • 13. LazoInfinito (Infinite Loop) Se puededar el caso en el que un lazo no tenga final y sigarepitiéndoseparasiempre. Los Científicos de Computadorascomparanesto con lasdirecciones al usar un “Shampoo”. Ejemplo: Lavado, enjuague, repetir.
  • 14. LazoInfinito (Infinite Loop) En el caso de la función “countdown”, podemoscomprobarque el lazoterminayaque el valor de nesfinito, podemosverquenvadecreciendocadavezque el lazo se ejecuta y eventualementeobtenemos el valor de 0.
  • 15. Otroscasos… Hay vecesque no es tan fácil de mostrar: def sequence (n): while n != 1: print n, if n%2 ==0: # n es un número par n = n/2 else: # n es un númeroimpar n = n*3+1
  • 16. Cadavezque el programaejecuta, compruebasi el númeroes par o impar. Si es par lo divide entre 2. Si esimpar, reemplaza el valor por n*3+1. Debido a que n algunasvecesaumenta o disminuye, no hay pruebaobviaparadecirquenalcanzará el 1 o que el programatermine. Una de lasventajasquetienen los lazosesque son buenosparagenerartablas.
  • 17. Tablas Antes de queexistieranlascomputadoras, las personas teníanquecalcularlogaritmos, senos, cosenos y otrasfuncionesmatemáticas a mano. Para facilitarse la vida, en los libros de matemáticas se incluíangrandestablasqueincluíanestosvalores. Crearlastablas era lento y aburrido y podíancontenererrores.
  • 18. Ejemplo de Tablas El siguienteprogramamuestraunasecuencia de valores en la columna de la izquierda y suslogartimos en la columna de la derecha. x= 1.0 while x <10.0: print x, ‘’ , math.log(x) x = x +1.0
  • 19.
  • 20. Vimosque los números 1, 2, 4 y 8 son potencias del 2 yaquesuslogaritmos de base 2 son númerosenteros. Si queremosencontrarotroslogaritmos de potencia 2 podemosmodificar el programa de éstamanera: x = 1.0 while x < 100.0 print x, ‘/t’, math.log(x)/math.log(2.0) x = x * 2.0
  • 22. Tabla de dos dimensiones Tabla en la cual se leen los valores en la intersección entre unafila y unacolumna. Ejemplo: tabla de multiplicar. Crearemosunatabla de multiplicar del 1 al 6 utilizando un lazoqueimprima los múltiplos de dos en unalínea. i = 1 #counter while i <= 6: print 2*1, ‘ ’, i = i + 1 print #Resultados: 2, 4, 6, 8, 10, 12
  • 23. Encapsulación y Generalización Encapsulaciónes el proceso de empacarunapieza del código en unafunción. Generalizaciónsignificatomaralgo en específico, comoimprimir los múltiplos de 2 y hacerlomásgeneralizado, comoimprimir los múltiplos de cualquiernúmeroentero.
  • 24. Ejemplo La siguientefunciónencapsula el lazo anterior y lo generalizaparaqueimprima los múltiplos de n: def printMultiples(n): i = 1 while I <= 6: print n*i, ‘’, i = i + 1 print Para encapsular, lo quedebemoshaceresañadir la primeralíneaquees la quedeclara el nombre de la función y la lista de parámetros. Para generalizar, solo reemplazamos el 2 por el parámetron.
  • 25. ContinuaciónEncapsulación y Generalización Si invocamoséstafunción con el argumento 2, obtenemos los mismosvalores en pantalla. Con el argumento 3 obtenemos: 3, 6, 9, 12, 15, 18 Con el argumento 4 obtenemos: 4, 8, 12, 16, 20, 24 Si invocamosprintMultiples en repetidasocasiones con diferentesargumentosobtenemosunatabla de multiplicar.
  • 26. ContinuaciónEncapsulación y Generalización En esecasopodemosutilizarotrolazo (Loop): i = 1 while i <= 6: printMultiples(i) i = i + 1 Obtenemos:
  • 27. Variables Locales Las variables quehansidodefinidasdentro de unafunción no pueden ser accesadasdesdeafuera de esafunción. Se puedetenermúltiples variables con el mismonombresiempre y cuando no esténdentro de la mismafunción.
  • 28. Stack Diagram Dos variables distintasllamadasiquecambian de valor sin afectarseuna con la otra.
  • 29. Ejemplo de Generalización Para crearunatabla de multiplicación de cualquiertamaño, sólo hay queañadir un parámetro a printMultTable: def printMultTable(high): i = 1 while i <= high: printMultiples(i) i = i + 1
  • 30. Reemplazamos el valor 6 por el de “high”. Si llamamos “printMultTable ” con el argumento 7 nosmuestra:
  • 31. Funciones Darle un nombre a unasecuencia de estados (statements) hacesuprogramafácil de leer y de ejecutar. Dividir un programa en variasfuncionesnospermiteseparar el programa en partes, ejecutarellasporseparado y luegoadjuntarlas en un solo componente.
  • 32. Facilitan la recursión y la iteración. (Loops) Funcionesbiendiseñadas son útilesparavariosprogramas. Unavez se escribe y se ejecutaalguna, se puedenreusar.
  • 34. Datos Hastaestepunto, hemosvistodistintostipos de datos, porejemplo, “int”, “float”, “string”. Los “strings” son cualitativamentedistintos de los otros dos tipos de datosyaqueestancompuestos de pequeñaspiezas– caracteres. Tipos de datosquecontienenpiezaspequeñas son conocidoscomo “compound data types.”
  • 35. Los corchetesseleccionan un solo caracter del string: >>> fruit = “banana” >>> letter = fruit[1] >>> print letter La expresión fruit [1] selecciona el caracter en la posición 1 de la palabra fruit. Cuando “letter” aparece en la pantalla, nosmuestra la letra a. La primeraletra de la palabra banana es b, peroestaletraesta en la posición 0 y esporesoqueaparece la letra a, quees la queestá en la posición 1.
  • 36. Índice La expresiónqueestá en corchetes se conocecomoíndice (index). Un índiceespecifica un miembro de un conjuntoordenado, en estecaso, el conjunto de caracteres en el string. El índiceindicaquecaracteres el quequeremos, en vez de sunombre. Puede ser un entero.
  • 37. Length (Longitud) La función “len” nosdevuelve el número de caracteres en un “string”. >>> fruit = “banana” >>> len(fruit) 6
  • 38. Length Para obtener el últimocaracter de un “string”, debemosrestar 1 del “length” length = len(fruit) last = fruit[length-1] Si utilizamosíndicesnegativos, contaremosdesde el últimohasta el primer caracter. Ejemplo: fruit [-1] últimocaracter, fruit[-2] penúltimocaracter, etc.
  • 39. Traversal & for Loops “Traversal” son los recorridosque se hacen a los caracteres de un “string” desde el primerohasta el último, realizando los cambiosnecesarios a cadauno de los caracteres en eseproceso. Este procesoes tan común en Python, queexisteunaalternativapredefinidallamada “for loop”.
  • 40. Ejemplo de un “for”: for char in fruit: print char Cadavezque se ejecuta el lazo (loop), el próximocaracterdisponible en el “string” esasignado a la variable “char”. El “loop” continúahastaque no hayamasningúncaracter en el “string”.
  • 41. String Slices Un segmento de un “string ” se conocecomo un “slice”. Seleccionar un “slice” es similar a seleccionar un caracter. El operador [n:m] nosdevuelve la parte del “string” desde la posición n hasta la posición m.
  • 42. String Slices Ejemplo: Si se omite el primer índice, (anterior a la comilla), el “slice” comenzaría al principio del “string”. >>> fruit = “banana” >>> fruit [:3] ‘ban’ >>> fruit [3:] ‘ana’
  • 43. Comparación de Strings Se puedencomparar “strings”. Para hacerlo, veamos el siguienteejemplo: if word == “banana” print “Yes, we have bananas!” Se puedenhacercomparacionesparaponerpalabras en ordenalfabético, perodebemostener mucho cuidadoyaque Python no ve la diferencia entre letrasmayúsculas y letrasminúsculas. Las letrasmayúsculastomanprioridad ante lasletrasminúsculas.
  • 44. Immutable Strings Los “strings” no se puedenmodificarluego de ser creados. Si necesitahacercambios, lo mejorescrear un nuevo “string” con lasvariaciones del original.
  • 45. Función “find” Es lo contrario del operador []. En vez de tomar un índice (index) y extraersucorrespondientecaracter, lo quehaceestomar el caracter y encuentra el índicedondeapareceesecaracter. Si el caracter no aparece, la funciónnosdevuelve un -1.
  • 46. Conteos (Counter) El siguienteprogramarealiza un conteodentro de un lazo (loop): Al declararseuna variable llamada “count”, ésta se inicializa a 0 y se vaincrementandocadavezque se encuentra un ‘a’.
  • 47. Módulo “String” Móduloquecontienevariasfuncionesútilesparamanipular “strings”. >>> import string Incluyeunafunciónllamada “find” quehace lo mismoquevimosanteriormente.
  • 48. Clasificación de Caracteres Es muyútilexaminar un caracter y comprobarsies de letramayúscula o minúscula, o sies un caracter o un dígito. El “string” ‘string.lowercase’ contienetodaslasletrasque el sistemapodríaconsiderarletrasminúsculas. El “string” ‘string.uppercase’ contienetodaslasletrasque el sistemapodríaconsiderarletrasmayúsculas.
  • 49. Clasificación de Caracteres El “string” ‘string.whitespace’ contienetodos los espacios en blanco, incluyendo ‘space’, ‘tab’ () y ‘newline’ ().
  • 51. Listas Una lista es un conjunto de valores, donde cada valor es identificado por un índice. Los valores que componen una lista son llamados elementos. Las listas son similares a los “strings”,que son una cadena de caracteres, a excepción de que los elementos de una lista pueden ser de cualquier tipo. Las listas y las cadenas de caracteres son llamados secuencias.
  • 52. 8.1 Listas de valores Hay varias maneras de formar una nueva lista; la forma más simple es encasillar los elementos en unos corchetes ([y]). Ejemplos: Lista de cuatro enteros [10, 20, 30, 40] Listas de “strings” [“un”, “dos”, ”tres”] Lista dentro de otra lista [“hola”, 2.0, 5, [10,20] ] Si una lista esta dentro de otra entonces se dice que la lista esta anidada.
  • 53. Las listas que contienen enteros consecutivos son comunes, por lo que Phyton provee una forma simple para crearlas: >>> range (1,5) [1, 2, 3, 4] La función rango toma dos argumentos y devuelve una lista que contiene todos los enteros desde el primero hasta el segundo, sin incluir el segundo.
  • 54. Hay dos formas del alcance. Argumento simple: se crea una lista que comienza en 0. >>> range(10) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9 Si existe un tercer argumento, este específica el espacio entre los valores sucesivos, lo que es llamado “stepsize”. Ejemplo: Cuenta desde 1 al 10 de 2 en 2. >>>range(1, 10, 2) [1, 3, 5, 7, 9]
  • 55. Una lista vacía es una lista especial que no contienen elementos. Este tipo de lista se denota por corchetes []. Podemos usar todas las formas anteriores de listas para asignar valores a variables.
  • 56. 8.2 Acceso de elementos La sintaxis para accesar elementos de una lista es igual a la sintaxis utilizada para accesar caracteres de un “string”. Para esto utilizamos los corchetes [], donde la expresión dentro de los mismos especifica el índice. Recordemos que los índices comienzan en 0. printnumbers[0] numbers[1] = 5
  • 57. Los corchetes pueden apareces en cualquier lugar de una expresión. Cuando estos aparecen en el lado izquierdo de lo asignado, cambia uno de los elementos de la lista, por lo que el enésimo elemento de la lista ”numbers”, que era 123, es ahora 5. Cualquier expresión con un número entero puede se utilizada como índice. >>> numbers[3-2] 5 >>>numbers[1.0] TypeError: sequence index must be integer
  • 58. Sin embargo, si intentamos leer o escribir un elemento que no existe, entonces obtenemos un error al correr el programa. >>> numbers[2] = 5 IndexError: list assignment index out of range Si un índice tiene un valor negativo, este cuenta desde el final de la lista >>> numbers[-1] 5 >>> numbers[-3] IndexError: list index out of range
  • 59. En el ejemplo anterior: numbers[-1] es el último elemento de la lista numbers[-2] es el penúltimo elemento de la lista numbers[-3] no existe en la lista Es muy común usar un “loop” como el índice de una lista. Ejemplo: horsemen = ["war", "famine", "pestilence", "death"] i = 0 while i < 4: printhorsemen[i] i = i + 1
  • 60. Este “whileloop” cuenta desde 0 a 4. Cuando el “loop” de la variable i es 4, la condición falla y el “loop” termina. Por lo tanto, el cuerpo del “loop” se ejecuta cuando i es 0, 1, 2 y 3. Cada vez que pasamos por el “loop”, la variable i es utilizada como un índice en la lista, y se imprime el elemento i de la lista en ese momento. (lista de recorrido)
  • 61. 8.3 Largo de la lista La función “len” devuelve el largo de la lista. Es buena idea utilizar este valor como el límite superior de un “loop” en lugar de una constante. En ese caso, si el tamaño de la lista cambia, no tenemos que ir a través del programa cambiando todos los “loops”, pues estos trabajarán correctamente con una lista de cualquier tamaño.
  • 62. Ejemplo: horsemen = ["war", "famine", "pestilence", "death"] i = 0 whilei < len(horsemen): printhorsemen[i] i = i + 1 La última vez que el “loop” fue ejecutado, i es len(horsemen)-1, que es el índice del último elemento.
  • 63. Cuando i es igual a len(horsemen), la condición falla y el cuerpo del programa no es ejecutado, lo cual es bueno, porque este valor no es un índice legal. A pesar de que una lista puede contener otra, la lista anidada cuenta solo como un elemento. [’spam!’, 1, [’Brie’, ’Roquefort’, ’Pol le Veq’], [1, 2, 3]] En este ejemplo el largo de la lista es 4.
  • 64. 8.4 Membrecía de una lista “in” es un operador “booleano” que prueba la membrecía en una lista. Además de ser utilizado con “strings”, también se usan con listas y otras secuencias. Podemos usar “not” en combinación con “in” para probar si un elemento no es miembro de la lista. El “forloop” también puede ser utilizado con listas.
  • 65. 8.5 Listas y “forloops” La sintaxis general de un “forloop” es: forVARIABLE in LIST: BODY Este enunciado es equivalente a : i = 0 while i < len(LIST): VARIABLE = LIST[i] BODY i = i + 1 El “forloop” es más conciso porque podemos eliminar el “loop” de la variable i.
  • 66. 8.6 Operaciones con listas Operador + >>> a = [1, 2, 3] >>> b = [4, 5, 6] >>> c = a + b >>> print c [1, 2, 3, 4, 5, 6] Operador * Repite una lista el número dado de veces >>> [1, 2, 3] * 3 [1, 2, 3, 1, 2, 3, 1, 2, 3]
  • 67. 8.7 Partes de una lista Las operaciones de particiones también trabajan con listas. >>> list = [’a’, ’b’, ’c’, ’d’, ’e’, ’f’] >>> list[1:3] [’b’, ’c’] >>> list[:4] [’a’, ’b’, ’c’, ’d’] >>> list[3:] [’d’, ’e’, ’f’]
  • 68. Si omitimos el primer índice, la partición comienza desde el principio. Si omitimos el segundo, la partición va al final. Si omitimos ambas, la partición es realmente una copia de la lista completa. >>> list[:] [’a’, ’b’, ’c’, ’d’, ’e’, ’f’]
  • 69. 8.8 Las listas son mutables A diferencia de los “strings”, las listas son mutables, lo que quiere decir que podemos cambiar sus elementos. Usando corchetes al lado izquierdo de la asignación, podemos actualizar uno de los elementos.
  • 70. Con el operador de partición podemos actualizar varios elementos a la vez. >>> list = [’a’, ’b’, ’c’, ’d’, ’e’, ’f’] >>> list[1:3] = [’x’, ’y’] >>> printlist [’a’, ’x’, ’y’, ’d’, ’e’, ’f’] También podemos remover elementos de una lista asignándoles una lista vacía. >>> list = [’a’, ’b’, ’c’, ’d’, ’e’, ’f’] >>> list[1:3] = [] >>> printlist [’a’, ’d’, ’e’, ’f’]
  • 71. Podemos añadir elementos a una lista moviéndolos a una partición vacía. >>> list = [’a’, ’d’, ’f’] >>> list[1:1] = [’b’, ’c’] >>> printlist [’a’, ’b’, ’c’, ’d’, ’f’] >>> list[4:4] = [’e’] >>> printlist [’a’, ’b’, ’c’, ’d’, ’e’, ’f’]
  • 72. Eliminación de una lista Usando particiones para eliminar elementos de una lista puede ser difícil, por lo que entonces estamos propensos a errores. “del” remueve un elemento de una lista. Ejemplo: >>> a = [’one’, ’two’, ’three’] >>> del a[1] >>> a [’one’, ’three’]
  • 73. Como esperamos “del” maneja índices negativos y causa un error en la corrida si el índice esta fuera del alcance. Podemos usar una partición como un índice para “del”. >>> list = [’a’, ’b’, ’c’, ’d’, ’e’, ’f’] >>> del list[1:5] >>> printlist [’a’, ’f’]
  • 74. 8.10 Valores y objetos Si ejecutamos las siguientes asignaciones: a = "banana" b = "banana“ sabemos que a y b se refieren a un “string” con letras “banana”. Sin embargo, no podemos decir que ambos apuntan al mismo “string”.
  • 75. Hay dos estados posibles: En el primer caso, a y b se refieren a dos cosas diferentes que tienen el mismo valor. En el segundo caso, ambos se refieren a la misma cosa.
  • 76. Estas “cosas” tienen nombre y se conocen como objetos. Un objeto es algo a lo que una variable se puede referir. Cada objeto tiene un identificador único, el que puede ser obtenido con la función “id”.
  • 77. Imprimiendo el identificador de a y b, podemos decir que ambos se refieren al mismo objeto. >>> id(a) 135044008 >>> id(b) 135044008 De hecho, obtenemos el mismo identificador doble, lo que significa que Phyton solo ha creado un “string”, y a y b se refieren a el.
  • 78. Las listas se comportan diferente. Cuando creamos dos listas, tenemos dos objetos: >>> a = [1, 2, 3] >>> b = [1, 2, 3] >>> id(a) 135045528 >>> id(b) 135041704 Entonces el diagrama de estado es el siguiente: donde a y b tienen el mismo valor pero no se refieren al mismo objeto.
  • 79. 8.11 Alias Dado que las variables se refieren a objetos, si asignamos una variable a otra, ambas variables se refieren al mismo objeto. >>> a = [1, 2, 3] >>> b = a En este caso, el diagrama de estado es: Como la misma lista tiene dos nombres diferentes, a y b, decimos que esta es un alias.
  • 80. Cambios hechos a un alias afectan al otro. A pesar de que este comportamiento puede ser beneficioso, en algunos casos puede ser inesperado o indeseable. En general, es más seguro evitar los alias cuando estamos trabajando con objetos mutables. Claro que para elementos inmutables, no hay problema porque Phyton es libre de “strings” alias, cuando se presenta la oportunidad de economizar.
  • 81. 8.12 Clonando listas Si deseamos modificar una lista y a la vez guardar una copia de la lista original, necesitamos ser capaces de crear una copia de la lista misma, no solo una referencia. A veces este proceso se conoce como clonación, para evitar la ambigüedad del término copia. La manera más fácil de clonar una lista es usar el operador de partición. >>> a = [1, 2, 3] >>> b = a[:] >>> print b [1, 2, 3]
  • 82. Tomando cualquier partición de a se crea una nueva lista, que en este caso consiste de la lista completa. Ahora podemos realizar cualquier cambio a b sin la preocupación de modificar a. >>> b[0] = 5 >>> print a [1, 2, 3]
  • 83. 8.13 Parámetros de listas Pasar una lista como un argumento pasa una referencia a la lista, no una copia de la lista. Por ejemplo, la función “head” toma una lista como un argumento y devuelve el primer elemento. defhead(list): returnlist[0] Se utiliza la siguiente forma: >>> numbers = [1, 2, 3] >>> head(numbers) 1
  • 84. El parámetro “list” y la variable “numbers” son alias para el mismo objeto. El diagrama de estado es: Como el objeto de la lista es compartido por dos marcos, entonces lo dibujamos entre ambos. Si una función modifica el parámetro de una lista, entonces se elimina el cambio.
  • 85. Por ejemplo, “deleteHead” remueve el primer elemento de una lista. defdeleteHead(list): del list[0] Entonces mostramos como se utiliza el comando “deleteHead”. >>> numbers = [1, 2, 3] >>> deleteHead(numbers) >>> printnumbers [2, 3]
  • 86. Si una función devuelve una lista, esta devuelve una referencia a la lista. Por ejemplo, “tail” devuelve una lista que contiene todo menos el primer elemento de la lista. deftail(list): returnlist[1:]
  • 87. “tail” funciona de la siguiente forma: >>> numbers = [1, 2, 3] >>> rest = tail(numbers) >>> printrest [2, 3] Como el valor devuelto fue creado por el operador de particiones, es una lista nueva. Por lo que haber creado “rest” no tiene ningún efecto en “numbers”.
  • 88. 8.14 Listas anidadas Una lista anidada es una lista que aparece como un elemento de otra lista. En esta lista, el tercer elemento es una lista anidada: >>> list = ["hello", 2.0, 5, [10, 20]] Si imprimimos “list[3]”, obtenemos “[10, 20]”.
  • 89. 8.15 Matrices Las listas anidadas también son utilizadas para representar matrices. Por ejemplo, la matriz puede ser representada como: >>> matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] “matrix” es una lista con tres elementos, donde cada elemento es una fila de la matriz.
  • 90. Podemos seleccionar una fila entera de una matriz de la siguiente forma: >>> matrix[1] [4, 5, 6] Podemos extraer un solo elemento de la matriz usando un doble índice: >>> matrix[1][1] 5 El primer índice selecciona una fila, el segundo índice selecciona una columna.
  • 91. 8.16 Listas y “strings” Dos de las funciones más utilizadas en el módulo “string” envuelve listas de “strings”. La función “split” rompe un “string” como una lista de palabras. Cada espacio en blanco entre los caracteres es considerado el límite de una palabra. >>> importstring >>> song = "The rain in Spain..." >>> string.split(song) [’The’, ’rain’, ’in’, ’Spain...’]
  • 92. Existe un argumento opcional llamado delimitador, el cual puede ser usado para especificar cuales caracteres son utilizados como límites de las palabras. El siguiente ejemplo usa el “string” ai como el delimitador >>> string.split(song, ’ai’) [’The r’, ’n in Sp’, ’n...’] Notemos que el delimitador no aparece en la lista.
  • 93. Esta toma una lista de “strings” y une los elementos con un espacio entre cada par. >>> list = [’The’, ’rain’, ’in’, ’Spain...’] >>> string.join(list) ’The rain in Spain...’ Como “split”, “join” toma un delimitador opcional que es insertado entre los elementos. >>> string.join(list, ’_’) ’The_rain_in_Spain...’
  • 95. 9.1 Mutabilidad y tuplas Un “string” está compuesto de caracteres; mientras una lista está compuesta de elementos de cualquier tipo. Una de las diferencias más notables es que los elementos de una lista pueden ser modificados, pero los caracteres de un “string” no. En otras palabras, los “strings” son inmutables y las listas mutables.
  • 96. En Phyton también existen las tuplas, la cual es similar a una lista con la excepción de que es inmutable. Sintácticamente, una tupla es una lista de valores separados por comas. Ejemplo: >>> tuple = ’a’, ’b’, ’c’, ’d’, ’e’
  • 97. Aunque no es necesario, convencionalmente las tuplas se escriben entre paréntesis. >>> tuple = (’a’, ’b’, ’c’, ’d’, ’e’) Para crear un tupla con un solo elemento, tenemos que incluir una coma al final. >>> t1 = (’a’,) >>> type(t1) <type ’tuple’>
  • 98. Sin la coma, Phyton trata (‘a’) como un “string” entre paréntesis. >>> t2 = (’a’) >>> type(t2) <type ’str’> Si dejamos la sintaxis a un lado, las operaciones en las tuplas son igual a las operaciones en las listas.
  • 99. El operador índice selecciona un elemento de una tupla. >>> tuple = (’a’, ’b’, ’c’, ’d’, ’e’) >>> tuple[0] ’a’ El operador partición selecciona el alcance de los elementos. >>> tuple[1:3] (’b’, ’c’)
  • 100. Si intentamos modificar uno de los elementos de la tupla obtenemos un error. >>> tuple[0] = ’A’ TypeError: object doesn’t support item assignment Como no podemos modificar los elementos de una tupla, podemos reemplazarlo con una diferente. >>> tuple = (’A’,) + tuple[1:] >>> tuple (’A’, ’b’, ’c’, ’d’, ’e’)
  • 101. 9.2 Asignando tuplas A veces es bueno cambiar los valores de dos variables. Con la forma convencional de asignación, teníamos que utilizar una variable temporera. Ejemplo para cambiar a y b: >>> temp = a >>> a = b >>> b = temp
  • 102. Si tenemos que hacer esto a menudo, este proceso sería engorroso. Phyton provee una forma de asignación de tuplas que resuelve este problema: >>> a, b = b, a El lado izquierdo es la tupla de las variables y el lado derecho es el de los valores. Cada valor es asignado a su variable correspondiente.
  • 103. Todas las expresiones en el lado derecho son evaluadas antes de cualquier asignación. Esto hace que la asignación de tuplas sea versátil. El número de variables en el lado izquierdo y el número de variables en el derecho tienen que ser iguales. Ejemplo: >>> a, b, c, d = 1, 2, 3 ValueError: unpack tuple of wrong size
  • 104. 9.3 Tuplas como valores devueltos Las funciones pueden devolver tuplas como respuestas. Por ejemplo, podemos escribir una función que cambia dos parámetros: def swap(x, y): return y, x Después podemos asignar el valor devuelto a una tupla con dos variables: a, b = swap(a, b)
  • 105. En este caso, no es ventajoso realizar una función “swap”. De hecho, existe un peligro en intentar encapsular “swap”, el cual es el siguiente error: def swap(x, y): # incorrectversion x, y = y, x Si llamamos la función de la siguiente manera: swap(a, b) entonces a y x son alias para el mismo valor.
  • 106. Cambiando x dentro de “swap” hace que x se refiera a un valor diferente, pero no tiene efecto en “in_main_”. Similarmente, cambiar y no tiene ningún efecto en b. Esta función corre sin producir un mensaje de error, pero no realiza lo que se pretende. Este es un buen ejemplo para un error de semántica.
  • 107. 9.4 Números aleatorios Muchos programas de computadoras hacen lo mismo cada vez que son ejecutados, por lo que podemos llamarlos determinísticos. El determinismo es usualmente bueno, porque esperamos que el mismo cálculo arroje el mismo resultado. Para algunas aplicaciones, queremos que la computadora sea impredecible. Ejemplo: Juegos
  • 108. Hacer un programa no determinístico no es sencillo, pero existen formas para que lo sea lo menos posible. Una de las formas es generando números aleatorios y utilizarlos para determinas la salida del programa. Phyton provee una función pre-construida que genera números seudo-aleatorios, los cuales no son completamente aleatorios en sentido matemático, pero para nuestros propósitos si lo son.
  • 109. El módulo “random” contiene una función llamada “random” que devuelve un número decimal entre 0.0 y 1.0. Cada vez que realizamos la operación, obtenemos el siguiente número en una serie larga. Ejemplo: importrandom for i in range(10): x = random.random() print x
  • 110. 9.2 Lista de números aleatorios El primer paso es generar una lista de valores aleatorios. “randomList” toma un argumento entero y devuelve una lista de números aleatorios con el largo dado. Se comienza con una lista de n ceros. Cada vez que pasamos a través del “loop”, este reemplaza uno de los elementos con un número aleatorio.
  • 111. El valor devuelto es una referencia a la lista completa. def randomList(n): s = [0] * n for i in range(n): s[i] = random.random() return s Los números generados por “random” son distribuidos uniformemente, lo que significa que cada valor es igualmente probable.
  • 112. Si dividimos el alcance de los valores posibles en “buckets” del mismo tamaño, y contamos el número de veces que el valor aleatorio cae en cada “bucket”, tendremos seguramente el mismo número en cada uno. Podemos probar esta teoría escribiendo un programa que divida el alcance en “buckets” y cuente el número de valores en cada uno.
  • 113. 9.6 Contando Una buena propuesta para problemas como este es dividir el problema en partes y buscar soluciones computacionales a estos problemas. En este caso, deseamos recorrer una lista de números y contar el número de veces que un valor cae en el rango dado. Podemos proceder copiando el programa y adaptándolo para el problema actual.
  • 114. El programa original es:count = 0 forchar in fruit: ifchar == ’a’: count = count + 1 printcount Este primer paso es para reemplazar “fruit” with “t” y “char” con “num”. Esto no cambia el programa, solo lo hace más fácil para leer.
  • 115. El segundo paso es cambiar la prueba. No tenemos la intención de encontrar valores, deseamos saber si “num” esta entre los valores “low” y “high”. Ejemplo: count = 0 forchar in fruit: ifchar == ’a’: count = count + 1 printcount
  • 116. El último paso es encapsular este código en la función “inBucket”. Los parámetros son la lista y los valores “low” y “high”. definBucket(t, low, high): count = 0 fornum in t: iflow < num < high: count = count + 1 returncount
  • 117. Copiando y modificando un programa existente, somos capaces de escribir esta función rápidamente y economizar tiempo. Este plan de desarrollo se conoce como pareo de patrones. Si trabajamos en un problema que hemos resuelto anteriormente, reusamos la solución.
  • 118. 9.7 Muchos “buckets” Si el número de “buckets” aumenta, la función “inBucket” se vuelve un poco difícil. Con dos “buckets”: low = inBucket(a, 0.0, 0.5) high = inBucket(a, 0.5, 1) Con cuatro “buckets” se vuelve engorroso: bucket1 = inBucket(a, 0.0, 0.25) bucket2 = inBucket(a, 0.25, 0.5) bucket3 = inBucket(a, 0.5, 0.75) bucket4 = inBucket(a, 0.75, 1.0)
  • 119. Existen dos problemas. Tenemos que declarar un nombre nuevo para cada resultado de la variable. Tenemos que calcular el rango para cada “bucket”. Podemos resolver el segundo problema primero. Si el número de “buckets” es “numBuckets”, entonces el ancho de cada “bucket” es “1.0/numBuckets”. Usamos un “loop” para calcular el rango de cada “bucket”.
  • 120. La variable “loop”, i, cuenta desde 0 a “numBuckets-1” bucketWidth = 1.0 / numBuckets for i in range(numBuckets): low = i * bucketWidth high = low + bucketWidth printlow, "to", high Para calcular el limite inferior para cada “bucket”, multiplicamos la variable “loop” por el ancho del “bucket”.
  • 121. El limite superior es la suma del inferior y el “bucketWidth”. Ejemplo:Con“numBuckets=8”, el “output” es: 0.0 to 0.125 0.125 to 0.25 0.25 to 0.375 0.375 to 0.5 0.5 to 0.625 0.625 to 0.75 0.75 to 0.875 0.875 to 1.0
  • 122. Podemos confirmar que cada “bucket” tiene el mismo ancho, que no se solapan, y que cubren completamente el alcance desde 0.0 a 1.0. Para el primer problema, necesitamos una forma para guardar ocho enteros, usando la variable “loop” para indicar uno a la vez. Tenemos que crear una lista “bucket” fuera del “loop”, porque solo queremos recorrerla una vez
  • 123. Dentro del “loop”, llamaremos el “inBucket” repetidamente y actualizaremos el enésimo elemento i de la lista. Ejemplo: numBuckets = 8 buckets = [0] * numBuckets bucketWidth = 1.0 / numBuckets for i in range(numBuckets): low = i * bucketWidth high = low + bucketWidth buckets[i] = inBucket(t, low, high) printbuckets
  • 124. Con una lista de 1000 valores, el código produce la siguiente lista “bucket”: [138, 124, 128, 118, 130, 117, 114, 131] Estos números están bien cerca de 125, que es lo que esperamos. Al estar tan cerca podemos creer que el generador de números aleatorios está funcionando.
  • 125. 9.8 Solución por una prueba A pesar de que el programa funciona, no es tan eficiente como podría ser. Cada vez que se llama el “inBucket”, se recorre la lista completa. Si el numero de “buckets” aumenta, también el número de recorridas. Sería mejor si pasamos una sola vez por la lista y computamos el índice del “bucket” en el cual falla para cada valor.
  • 126. Luego podemos aumentar el contador apropiado. Deseamos tomar un valor en el rango de 0.0 a 1.0 para calcular el índice del “bucket” en el cual se falla. Dado que el problema es el inverso del problema anterior, podemos pensar que debemos dividir por el “bucketWidth” en vez de multiplicar, como en el ejemplo anterior. Dado que “bucketWidth”=“1.0/numBuckets”, dividiendo por “bucketWidth” es lo mismo que multiplicar por “numBuckets”.
  • 127. Si multiplicamos un número en el rango 0.0 a 1.0 por “numBuckets”, obtenemos un número en el rango desde 0.0 hasta “numBuckets”. Si redondeamos ese número al entero menor, obtenemos exactamente lo que estamos buscando, un índice del “bucket”. numBuckets = 8 buckets = [0] * numBuckets for i in t: index = int(i * numBuckets) buckets[index] = buckets[index] + 1
  • 128. Usamos le función “int” para convertir un número decimal en un entero. Una lista que cuenta el número de valores en cada rango se conoce como un histograma, el cual se realiza con la función “histogram”.