Autor Tema: Ejercicios de Python. Curso edX  (Leído 8760 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re: Ejercicios de Python. Curso edX
« Respuesta #15 en: 30 de Agosto de 2015, 10:26:49 »
Perl es muy confuso, pero tiene muy buen soporte de su comunidad y muchos módulos. Su manejo de cadenas es más rápido.

Ruby es muy semejante a Python. Pero, en mi opinión, mucho menos serio.

En tu caso, yo aplicaría el punto "5. Plano es mejor que anidado."
Cuanto menos anidado sea un programa, menos errores tendrá y más sencillo será entenderlo y mantenerlo. Cuantos menos bucles y condiciones anidadas, mejor.

Una frase que me gusta mucho y se puede aplicar a la filosofía de Python:
Citar
"Programs must be written for people to read, and only incidentally for machines to execute."  Abelson & Sussman, SICP

Saludos.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Ejercicios de Python. Curso edX
« Respuesta #16 en: 31 de Agosto de 2015, 04:50:54 »
Bueno para los que no estan en el curso hace poco pusieron a dispocision un poco mas de informacion. Ya que falta bastante tiempo para que continuen con el curso (Hoy se habilita el 2do Problem Set es decir los ejercicios para hacer codigo y recien el 8/9 se habilita los nuevos contenidos). Traigo un poco de info. Para no colgar los PDF que son de 2 hojas y que tienen por ahi cosas demasiados simples (como diferencia entre return y printf). pongo lo unico "interesante", y que pueden servir de solucion para cosas que se vieron en el post.

Variable scope (what parts of my code know about what variables)
Consider the following code:

Código: Python
  1. def f(x):
  2.    b = x + c
  3.    return b
  4. c = 0
  5. print f(1) <----- outputs 1
  6. print c <----- outputs 0

This code runs with no errors.
Line 4 sets a variable c to 0. Line 5 calls the function f(x) with 1 substituted for x. Inside f(x), create a variable called b to be x+c, which is 1+0.
Here is the interesting thing. f(x) does not have its own variable called c, so it looks outside of itself to see if the program has a variable called c, which it finds and uses.
Now consider the modified code:

Código: Python
  1. def f(x):
  2.   b = x + c <----- ERROR
  3.   c += 1
  4.   return b
  5. c = 0
  6. print f(1)
  7. print c

This code has an error!

UnboundLocalError: local variable 'c' referenced before assignment

Again, line 5 sets a variable c to 0. Line 6 calls the function f(x) with 1 substituted for x. Inside f(x), create a variable called b to be x+c.
Here lies the problem. Python sees that in line 3, we are assigning a variable called c to some value. Therefore, it assumes that c is a variable that exists only in this function.
It does not look outside the function for a variable called c there! Therefore, since the variable c is never given some initial value, line 2 results in an error – the function f(x) does not know what the value of c is.
So it seems that you can access variables defined outside of a function as long as they are in a read-only way!

Nuevamente esto desde la linea del interprete y no de un archivo.

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re: Ejercicios de Python. Curso edX
« Respuesta #17 en: 31 de Agosto de 2015, 05:35:56 »
Se puede hacer también desde un archivo.
Yo lo hago pinchando un enlace a:  Todos los programas... Python 2.7 ... IDLE (Python GUI)
Luego en el menu pincho Ctrl + n o bien pincho File... New file

En la ventana nueva que aparece copio el programa del foro. Para que no aparezca sangría, no copio la primera letra del programa y luego la escribo a mano.

Ahora a correr: F5

Para programas un poco grandes es la mejor forma de ejecutar Python.

De todas formas la línea de comandos, al ser interactiva, es muy util para ver los resultados y los errores poco a poco.

Un saludo.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: Ejercicios de Python. Curso edX
« Respuesta #18 en: 31 de Agosto de 2015, 08:55:34 »
Ten cuidado al publicar soluciones a los ejercicios del curso KyllerJC. Va en contra de las normas y te pueden expulsar.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Ejercicios de Python. Curso edX
« Respuesta #19 en: 31 de Agosto de 2015, 09:22:22 »
Ten cuidado al publicar soluciones a los ejercicios del curso KyllerJC. Va en contra de las normas y te pueden expulsar.

Si.. es cierto. Yo por ejemplo no lo publico en la pagina de edx, pero si buscas por google te vas a encontrar seguro con codigos de lo mismo.

Con solo buscar :

"Longest substring in alphabetical order is"

Ya aparecen como 3 resultados de los cuales 1 es este:
http://stackoverflow.com/questions/19581585/longest-substring-in-alphabetical-order
« Última modificación: 31 de Agosto de 2015, 09:26:35 por KILLERJC »

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Ejercicios de Python. Curso edX
« Respuesta #20 en: 31 de Agosto de 2015, 12:46:25 »
Gracias KILLERJC por los aportes, para mi aunque alguno me cuesta me son de mucha utilidad pero cuidado no te la juegues.

Saludos!
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Ejercicios de Python. Curso edX
« Respuesta #21 en: 09 de Septiembre de 2015, 13:22:59 »
Bueno para dejar un poco de constancia habian salido nuevos problemas, en si no son complejos, pero que exigian hacer una busqueda de un valor por incrementos o utilizando una biseccion de los valores.

Es decir si por ejemplo tengo que buscar el cuadrado de un numero puedo hacerlo por pasos

numero = 25

Pruebo con 0 = 0 , sumo un paso (supongo de 1)
Pruebo con 1 = 1 , sumo otro paso
Pruebo con 2 = 4 , sumo otro paso
....
Pruebo con 5 = 25, encontre la solucion.

Sino daba el mas cercano. Esto se complica cuando los pasos son de 0.1 o peor aun de 0.01

Y la otra forma que pide es biseccionar los valores. Supongamos que comenzamos con los valores

high =25
low = 0
middle = (high + low)/2

Probamos con la mitad ( middle**2 )
Si es mas grande que 25 simplemente hacemos high = middle , y volvemos a repetir
Si es mas pequeño hacemos low = middle, y volvemos a repetir

Repetimos hasta que el resultado sea un valor que querramos, si quisieramos una presicion de 0.01, simplemente probamos

abs(25-(middle**2))<0.01


De esto se trato casi todo lo de la segunda semana.
--------------------------------------------------------------------------------------


3era semana, comenzamos a ver tuplas/listas/diccionarios y algunos programitas recursivos como por ejemplo

Si quisieramos obtener el valor exponencial de un numero podriamos hacerlo de muchas formas, la mas simple base**exp , pero vamos a suponer que lo hacemos iterativamente, es decir multiplicando una y otra ves por la base.

Asi x^3 es x * x * x

Código: Python
  1. def exponencial(base,exp)
  2.     total=1
  3.     while exp>0:
  4.         total*=base
  5.         exp-=1
  6.     return total

Pero tambien podemos hacerlo de forma recursiva. Si observamos x^5 es igual a x * x^4 .
De esa forma podemos hacer esto:

Código: Python
  1. def exponencial(base,exp)
  2.     if exp==0:
  3.         return 1
  4.     return base*exponencial(base,exp-1)l


Otro ejemplo que se dio fue el de encontrar el maximo comun divisor de 2 numeros. Suponiendo que fueran 2 numeros enteros positivos, por iteracion seria algo parecido a esto:

Elegir el menor, probar si ese valor divide a ambos valores , si es asi encontramos nuestro MCD, sino vamos disminuyendo por 1 hasta que se cumpla la condicion.

Código: Python
  1. def MCDIteracion(a, b):
  2.     x=0
  3.     if a>b:
  4.         x=a
  5.         a=b
  6.         b=x
  7.     x=a
  8.     while a>1:
  9.         if (b%a==0 and x%a==0):
  10.             break;
  11.         a-=1
  12.     return a

Otra forma seria buscar el MCM ( minimo comun multiplo ) y con eso obtener el valor. Pero utilizando un algoritmo recursivo. Podemos hacer uso del algoritmo de euclides
https://es.wikipedia.org/wiki/M%C3%A1ximo_com%C3%BAn_divisor

Código: Python
  1. def MCDRecursivo(a, b):
  2.     if b==0:
  3.         return a
  4.     return MCDRecursivo(b,a%b)

Otros ejemplos que aparecieron aplicando la recursividad:

Contar la cantidad de letras ( aunque len() lo haga )

Código: Python
  1. def lenRecur(aStr):
  2.     if aStr=='':
  3.         return 0
  4.     return 1+lenRecur(aStr[:-1])

O encontrar si 2 palabras son palindromos

Código: Python
  1. def semordnilap(str1, str2):
  2.     if len(str1)==1:
  3.         return str1==str2
  4.     if str1[0] == str2[-1]:
  5.         return semordnilap(str1[1:],str2[:-1])
  6.     return False

Finalmente llegan la parte de las listas/diccionarios/tuplas

Lo mas curioso de esto:

1 sola Tupla  -> ('lo que sea',)

x = (1, 2, (3, 'John', 4), 'Hi')

Funciona todo tipo de cosas que le quieran hacer:

x[0] -> 1
x[2][1] -> John
x[-1][-1] -> i
x[0] = 8 -> error, no se pueden modificar

Luego las listas:

x = [1, 2, [3, 'John', 4], 'Hi']

Igual que lo anterior nomas que se pueden editar.
Y lo que hay que tener en cuenta es que son objetos
Supongamos que tenemos

a = ['asd','dsa']
b = ['bvc,'cvb']

c= a + b -> ['asd','dsa', 'bvc,'cvb']
d = [['asd','dsa'], ['bvc,'cvb']]
g = [a,b] -> [['asd','dsa'], ['bvc,'cvb']]

Pero ojo que g no es lo mismo que d, por que g contiene a "a" y a "b"

Si uno cambia "a" por

a = [123,456]

d -> [['asd','dsa'], ['bvc,'cvb']]
g -> [[123,456], ['bvc,'cvb']]

De aqui se presto un poco de atencion a los metodos ya que posee python
https://docs.python.org/2/tutorial/datastructures.html


Y antes de entrar con los diccionarios, mostrar que las funciones tambien son objetos. Y que pueden ser pasados como argumentos.
Ejemplo:

Código: Python
  1. def applyToEach(L, f):
  2.     for i in range(len(L)):
  3.         L[i] = f(L[i])

Y tenemos la lista:

testList = [1, -4, 8, -9]

podemos hacer e imprimir testlist:

applyToEach(testList, abs) -> [1, 4, 8, 9]

Si suponemos que queremos hacerlo al cuadrado a cada uno de los valores, definimos nuestra funcion y llamamos a la otra funcion para que se lo aplique a cada uno

Código: Python
  1. def pwr2(a):
  2.     return a ** 2
  3.  
  4. applyToEach(testList, pwr2)

incluso podemos crear una lista de funciones y pasarlo a una funcion para que lo ejecute en todos los elementos a cada una.
python ya posee una funcion para eso que es map(), pero era para dar el ejemplo

Luego finalmente los diccionarios, que no son ordenados, por lo cual no tienen indice sino que se manejan por una key.
En si no pongo ningun ejemplo por que estaban todos simples.
Y cualquier tutorial que uno encuentre va a tener lo que habia en el curso

--------------------------------------------------

Finalmente lo mas divertido, que fue la practica de esta semana.

Hubo 2 casos, uno un calculo de una integral por medio de sumas de Riemman, teniendo en cuenta no la mitad del intervalo, sino el comienzo, te dan una funcion f(x):

return 10*math.e**(math.log(0.5)/5.27 * x)

Donde x esta dado en años, y te pide que crees una funcion que calcule el area debajo de la curva, haciendo una funcion con 3 parametros. start,stop,step
Lo que resta es calcular las areas de lso rectagulos

f(y)*step

Bastante simple este tema

Por otro lado ahora si lo mas divertido
Se trato de crear un juego como el ahorcado. En el que te pide bajarte 2 archivos, un .py y uno con texto el cual tiene muchas palabras separadas con espacios.
El archivo .py no posee mucho, Lo que hace es tomar una palabra de forma random de este archivo de texto. Y luego te pide que completes 3 funciones auxiliares y crees el programa completo.
Basicamente la unica funcion que te dan es la de tomar el valor random del archivo.txt.

Luego hay que generar las funciones

isWordGuessed(secretWord, lettersGuessed)

Esa funcion toma 2 valores, la palabra secreta que es un string, y las letras usadas que es una lista.
Como salida debe devolver un boolean True/False segun si se descubrio toda la palabra o no

getGuessedWord(secretWord, lettersGuessed)

Esta funcion lo que hace es generar la palabra "incompleta" para el usuario. Supongamos que tenemos la palabra "abajo" y el usuario elige una "a" entonces como resultado debe dar: a _ a _ _
Si ademas el usuario elije una "o" el valor de retorno seria: a _ a _ o

getAvailableLetters(lettersGuessed)

Esta funcion lo que hace es retornar las letras que no se usaron, esto por que el programa debe decirle al usuario que opciones les quedan.
Ejemplo:
Te quedan estas opciones: abcdefghijklmnopqrstuvwxyz
Si elijo una "c", entonces deberia devolverme:
Te quedan estas opciones: abdefghijklmnopqrstuvwxyz

hangman(secretWord)

Finalmente la funcion principal, esta es la encargada de pedirle letra al usuario, el usuario tiene 8 intentos cuando se equivoca.
Si repite la letra (sea mala o buena) directamente no se cuenta como una oportunidad perdida. Debe mostrar la cantidad de intentos que le quedan, las letras que le queda para elegir y la palabra como la que devuelve getGuessedWord()

Realizada las 3 funciones que pide, luego crear la funcion hangman se vuelve demasiado simple. Esas 3 funciones llevaran 7 lineas realizarlas la mas larga. La que es un poco larga y por el texto que debe entregar es la principal.

Esto adjunto a los archivos, tambien incluyo ejemplos de salidas buenas y malas. Por si alguno no esta en las clases. Todavia no hago publico las soluciones que encontre.
Para ejecutar el archivo, una ves lista todas las funciones, hay 2 lineas comentadas al final del .py, la descomentan y eso les permite que se ejecute el programa, que se busquen las palabras etc
El archivo words.txt debe estar en la misma carpeta que el .py, sino deberan incluir la ruta completa dentro del .py hacia donde esta el archivo words.txt

Espero que les sirva para los que no estan inscriptos, aunque sea para jugar.
« Última modificación: 09 de Septiembre de 2015, 13:36:54 por KILLERJC »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Ejercicios de Python. Curso edX
« Respuesta #22 en: 09 de Septiembre de 2015, 14:48:46 »
Bueno demasiado python por hoy, solo quiero anunciar por que estoy contento de decirles que las funciones que decia que podian llevar 7 lineas como maximo, todas se pueden resolver en una linea sola, logre hacerlas de esa forma cuando pueda las paso  :-/

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Ejercicios de Python. Curso edX
« Respuesta #23 en: 24 de Septiembre de 2015, 23:15:20 »
Solo para avisar que no hubo mayores avanzes en el tema de programacion.

Se introdujo manejo de excepciones ( try .. catch ) y tambien el asegurarse que los valores ingresados sean los correctos, assert
Nada nuevo ni complejo.