TODOPIC

Lenguajes de programación para PC => Python => Mensaje iniciado por: KILLERJC en 27 de Agosto de 2015, 07:15:56

Título: Ejercicios de Python. Curso edX
Publicado por: KILLERJC en 27 de Agosto de 2015, 07:15:56
Por fin los primeros practicos, los 2 primeros los vi bastante faciles. el otro hasta ahora creia que lo tenia pero me fallo en algunos :/

Para el que no esta anotado:

1ero:
Citar
Assume s is a string of lower case characters.

Write a program that counts up the number of vowels contained in the string s. Valid vowels are: 'a', 'e', 'i', 'o', and 'u'. For example, if s = 'azcbobobegghakl', your program should print:

Number of vowels: 5

2do:
Citar
Assume s is a string of lower case characters.

Write a program that prints the number of times the string 'bob' occurs in s. For example, if s = 'azcbobobegghakl', then your program should print

Number of times bob occurs is: 2

3ero y el cual estoy peleando:
Citar
Write a program that prints the longest substring of s in which the letters occur in alphabetical order. For example, if s = 'azcbobobegghakl', then your program should print

Longest substring in alphabetical order is: beggh


In the case of ties, print the first substring. For example, if s = 'abcbcd', then your program should print

Longest substring in alphabetical order is: abc

No se si poner los codigos o no, cuando ustedes lo terminen lo ponemos de esa forma comparamos.

EDIT: Completados todos.
Estaba aproximandome mal a la solucion del ultimo.
En ves de hacer una comparacion valor anterior con valor actual, hacia valor actual con proximo valor, y eso daba mas dolores de cabeza que nunca.

Lo que si me parecio bastante raro es que en la lina del interprete poniendo esto:

Código: Python
  1. a = 10
  2. def f(x):
  3.       return x + a
  4. a = 3
  5. f(1)
Resultado: 4

Sea valido ( a pesar que "a" no es un parametro que se paso a la funcion, y no de un error.

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

Hasta ahora la primer semana hubo varios ejemplos en el que te hace usar el interprete y ver los resultados, especialmente el tipo de resultado:

Código: Python
  1. 2**3 + 1
  2. (2 + 3) * 4
  3. 2 + 3 * 4
  4. 10/3
  5. 10.0/3.0
  6. - - 4
  7. 2.2 * 3.0 #( este es uno de los mas geniales ya que se ve cuando hay errores por la representacion binaria., y termina dando un resultado 6.600000000005 o algo por el estilo)

Despues algunas con logica y resultados booleanos

Código: Python
  1. 3 > 4 or (2 < 3 and 9 > 10)
  2. not(4 > 3 and 100 > 6)
  3. 3.0 - 1.0 != 5.0 - 3.0

Luego asignacion a variables ( todo un solo codigo )

Código: Python
  1. b = 10
  2. c = b > 9
  3. c
Que tipo da y cual es el valor, obviamente es un bool y es True

Luego empezamos con los valores no escalares como las strings:

Código: Python
  1. "a" + "bc"
  2. 3 * "bc"

Y su forma de indexarlas

Código: Python
  1. "abcd"[1]
  2. "abcd"[0:2]
  3. "abcd"[:2]

Lo que si aprendi aca es esto s[i:j:k], que no lo sabia o no me acordaba.
comienzo:fin:pasos

entonces algo asi:

Código: Python
  1. 'helloworld'[::-1]
Resultado: dlrowolleh

es decir a la inversa por el paso en -1

Código: Python
  1. 'helloworld'[1:9:2]
Resultado: elwr

Finalizando la semana aprendes sobre AND/OR , type(), int(), float(), una introduccion a raw_input(), print().
Conjunto con if/elif/else

Esto acerca de python. habia una introduccion que me durmio acerca de la ciencia de la computacion. Que por cierto tengo a los videos a la velocidad de 1.25x por que sino te duerme, es muy lento hablando, y por ahi hay unos videos en el que el sonido es MUY malo.
Solo resta esperar la proxima semana.
Título: Re: Curso de edx por arrancar
Publicado por: Picuino en 27 de Agosto de 2015, 11:40:26
Quiero avisarles que ya arranco.
Todo en ingles xD al menos el primer video y no habia subtitulos. No problem at all
En YouTube (Pinchando el logo de YouTube) se pueden ver subtítulos en inglés.
También se pueden traducir al español, aunque la traducción automática es mala.
Título: Re: Curso de edx por arrancar
Publicado por: Miquel_S en 27 de Agosto de 2015, 12:30:30
Gracias KILLERJC.
Título: Ejercicios de Python. Curso edX
Publicado por: KILLERJC en 29 de Agosto de 2015, 08:24:32
Por fin los primeros practicos, los 2 primeros los vi bastante faciles. el otro hasta ahora creia que lo tenia pero me fallo en algunos :/

Para el que no esta anotado:

1ero:
Citar
Assume s is a string of lower case characters.

Write a program that counts up the number of vowels contained in the string s. Valid vowels are: 'a', 'e', 'i', 'o', and 'u'. For example, if s = 'azcbobobegghakl', your program should print:

Number of vowels: 5

2do:
Citar
Assume s is a string of lower case characters.

Write a program that prints the number of times the string 'bob' occurs in s. For example, if s = 'azcbobobegghakl', then your program should print

Number of times bob occurs is: 2

3ero y el cual estoy peleando:
Citar
Write a program that prints the longest substring of s in which the letters occur in alphabetical order. For example, if s = 'azcbobobegghakl', then your program should print

Longest substring in alphabetical order is: beggh


In the case of ties, print the first substring. For example, if s = 'abcbcd', then your program should print

Longest substring in alphabetical order is: abc

No se si poner los codigos o no, cuando ustedes lo terminen lo ponemos de esa forma comparamos.

EDIT: Completados todos.
Estaba aproximandome mal a la solucion del ultimo.
En ves de hacer una comparacion valor anterior con valor actual, hacia valor actual con proximo valor, y eso daba mas dolores de cabeza que nunca.

Lo que si me parecio bastante raro es que en la lina del interprete poniendo esto:

Código: Python
  1. a = 10
  2. def f(x):
  3.       return x + a
  4. a = 3
  5. f(1)
Resultado: 4

Sea valido ( a pesar que "a" no es un parametro que se paso a la funcion, y no de un error.
Título: Re: Curso de edx por arrancar
Publicado por: Picuino en 29 de Agosto de 2015, 14:04:20
Solución al primero:
Código: Python
  1. import re
  2. print(len(re.findall('[aeiou]', 'azcbobobegghakl')))


Solución al segundo:
Código: Python
  1. import re
  2. print(len(re.findall('(?<=bo)b', 'azcbobobegghakl')))


El último es un poco más largo:
Código: Python
  1. # -*- coding: cp1252 -*-
  2. s = 'azcbobobegghakl'
  3.  
  4. # Divide la cadena en subcadenas ordenadas
  5. subs = [[]]
  6. old_c = None
  7. for c in s:
  8.    if c >= old_c:
  9.       subs[-1].append(c)
  10.    else:
  11.        subs.append([c])
  12.    old_c = c
  13.    
  14. # Une los caracteres de cada subcadena en orden inverso
  15. subs = [''.join(s)  for s in subs[::-1]]
  16.  
  17. # Encuentra la última cadena más larga
  18. maxs = ''
  19. for s in subs:
  20.     if len(s) > len(maxs): maxs = s
  21. print (maxs)

Un saludo.
Título: Re: Curso de edx por arrancar
Publicado por: Miquel_S en 29 de Agosto de 2015, 16:19:41
¿Esto se supone que es nivel básico? Hay instrucciones que ni había visto en los tutoriales que estoy leyendo.

Código: Python
  1. a = 10
  2.     def f(x):
  3.           return x + a
  4.     a = 3
  5.     f(1)
En este trozo de código entiendo el resultado lo que no entiendo el porque usa el valor de a = 3 que esta fuera de la función y no usa el valor de a = 10 el cual también se encuentra fuera de la función.

Saludos!
Título: Re: Curso de edx por arrancar
Publicado por: Picuino en 29 de Agosto de 2015, 17:57:52
El código que he puesto no es difícil de entender... después de estudiarlo. Tiene muchos conceptos propios de Python que se tienen que ver poco a poco. Imagino que todo se irá viendo más adelante. Lo importante por ahora es saber que Python es muy potente para esas operaciones.


El segundo ejemplo es sencillo, igual que c.
a es una variable global, funciona igual que c.

a = 10
f(1)
Dará un resultado de 11

Si luego haces:
a=5
f(2)
Dará un resultado de 7

En cada momento toma el valor actual de a.
Un saludo.
Título: Re: Curso de edx por arrancar
Publicado por: Miquel_S en 29 de Agosto de 2015, 18:11:26
Entiendo gracias Picuino, lo que no encuentro es que hace el import re ni lo que hace findall aunque la traducción parece que seria buscar todos los 'aeiou'

Gracias de nuevo.

Ya lo encontré:

re.findall(pattern, string, flags=0)

    Return all non-overlapping matches of pattern in string, as a list of strings. The string is scanned left-to-right, and matches are returned in the order found. If one or more groups are present in the pattern, return a list of groups; this will be a list of tuples if the pattern has more than one group. Empty matches are included in the result unless they touch the beginning of another match.

    New in version 1.5.2.

    Changed in version 2.4: Added the optional flags argument.
Título: Re: Curso de edx por arrancar
Publicado por: KILLERJC en 29 de Agosto de 2015, 19:12:32
Primero
Citar
Entiendo gracias Picuino, lo que no encuentro es que hace el import re ni lo que hace findall aunque la traducción parece que seria buscar todos los 'aeiou'

Lo bueno de python que tenes toda la API en internet

https://docs.python.org/2/library/re.html
https://docs.python.org/2/howto/regex.html

Y lo correcto, por que esta entre [], es que busca todos los 'a','e','i','o','u'

Citar
¿Esto se supone que es nivel básico?

Si es basico, nomas que tenes mas herramientas para hacerlo ademas de "lo basico", por ejemplo como Picuino uso, las RE

Con regular expresion era mucho mas "corto" facil de hacerlo, MI primer idea fue hacerlo asi tambien, pero parece que SU(la gente de los cursos) idea era no meter justamente re. sino hacerlo con lo "basico" y las funciones built-in que habia.

Tu ultimo codigo Picuino se acerca bastante al mio, aunque no lo especifique deberia ser la primera cadena mas larga que encuentre, en la condicion lo dice, en caso de haber un "empate" debe ser la primera. Y tu codigo en este string:

s = 'loyqgcosalsdaosbrlr'

da como resultado: aos
cuando deberia dar: loy

Imagino que con un simple cambio de una codicion ya estaria.

Igual esta:

s = 'zyxwvutsrqponmlkjihgfedcba'

ocurre exactamente lo mismo. o podes tomar 'z' o podes tomar 'a' , aunque si es la primera es 'z'.

Con respecto a los primeros codigos no se si se pueda hacer con regular expresion, en realidad deberias evitarlo a mas no poder a las RE por la lentitud de las mismas (si es que no mal recuerdo cuando lei sobre su funcionamiento). Aunque es una solucion valida. Presento la solucion a los primeros 2 codigos que son demasiados simples:

Código: Python
  1. x=0
  2. for a in ['a','e','i','o','u']:
  3.     x += s.count(a)
  4. print ('Number of vowels: '+str(x))

Código: Python
  1. x = 0
  2. count = 0
  3. while True:                 #do..While
  4.     x = s.find('bob',x)+1
  5.     if(x<=0):
  6.         break               #it can't find anything more
  7.     else:
  8.         count += 1          #it found 1
  9.  
  10. print ('Number of times bob occurs is: '+str(count))

Me recuerda cuando me pidieron en el curso que debia sumar los numeros del 1 a end, e imprimirlas. Mi solucion fue:

Código: Python
  1. print ((end*(end+1))/2)
  2. #o
  3. print(sum(range(end)))

Pero queria que lo hiciera con un while, asi que no fue valido.


----------

Lamentablemente no se usar el timeit como para probar realmente cuanto tarda el codigo
Título: Re: Curso de edx por arrancar
Publicado por: Picuino en 30 de Agosto de 2015, 05:40:49
Para usar timeit:
Código: Python
  1. import timeit
  2.  
  3. init = """
  4. import re
  5. s = 'azcbobobegghakl'
  6. """
  7.  
  8. prog1 = "len(re.findall('[aeiou]', s))"
  9.  
  10. prog2 = """
  11. x=0
  12. for a in ['a','e','i','o','u']:
  13.   x += s.count(a)
  14. """
  15.  
  16. def runtime(init, prog):
  17.    return 10*min(timeit.Timer(prog, setup=init).repeat(3, 100000))
  18.  
  19. print(runtime(init, prog1))
  20. print(runtime(init, prog2))

Tu código es más rápido (resultados en microsegundos):

Código: [Seleccionar]
prog1 = 3.42162068642
prog2 = 2.39134226419


El problema con el orden de las subcadenas está en una errata de mi programa. donde pone:

Código: Python
  1. for s in subs:
  2.    if len(s) > len(maxs): maxs = s

debería poner

Código: Python
  1. for s in subs:
  2.    if len(s) >= len(maxs): maxs = s

¡¡¡Que cuidadín hay que tener con las condiciones!!!

Un saludo.
Título: Re: Curso de edx por arrancar
Publicado por: KILLERJC en 30 de Agosto de 2015, 06:44:35
Citar
¡¡¡Que cuidadín hay que tener con las condiciones!!!

Por eso decia que seguro era una condicion y se arreglaba xD, pero si un error y seguro que anda todo mal.

Como ya pusiste el codigo que da la solucion, aca dejo el mio.

Código: Python
  1. ans=''
  2. temp=s[0]
  3. for x in s[1:]:
  4.     if(temp[-1]<=x):
  5.         temp+=x
  6.     elif(temp[-1]>x):
  7.         if(len(ans)<len(temp)):
  8.             ans=temp
  9.         temp=x
  10. if(len(temp)>len(ans)):
  11.    ans=temp
  12.  
  13. print ('Longest substring in alphabetical order is: '+str(ans))

Mi anterior programa tenia el problema que me habia centrado en tomar valores por delante de lo que iba. Me explico:

Código: Python
  1. for x in range(len(s)-1):
  2.     if s[x]<=s[x+1]:
  3.         #...

Eso hacia que si usaba len(s) me pasaba del indice. Y luego era un dolor de cabeza intentar arreglar ese ultimo valor.
Y bueno para el que no entiende el codigo, a diferencia de Picuino que va guardando todas las posibilidades y luego revisa cual es mayor (te digo que se me paso por la cabeza hacer lo mismo, pero me encerre que deberia ser un poco mas simple).
Yo guardo la primera posibilidad en "ans" mientras voy creando la nueva en "temp", cuando termina de encontrar una posibilidad pregunta si es mayor a la guardada en ans y va en busca de otra hasta terminar el string. en caso de ser la ultima ( o que no se haya actualizado ans para nada) el ultimo if carga el valor.

Esta asumido que la string contiene al menos 2 letras.
Título: Re: Ejercicios de Python. Curso edX
Publicado por: Picuino en 30 de Agosto de 2015, 07:30:33
He divivido el hilo para tratar aparte los problemas del curso edX
Por un pequeño fallo al dividir el tema, he tenido que editar el primer mensaje de KILLERJC para juntar dos mensajes en uno.
Un saludo.
Título: Re: Ejercicios de Python. Curso edX
Publicado por: Picuino en 30 de Agosto de 2015, 07:42:25
Yo guardo la primera posibilidad en "ans" mientras voy creando la nueva en "temp", cuando termina de encontrar una posibilidad pregunta si es mayor a la guardada en ans y va en busca de otra hasta terminar el string. en caso de ser la ultima ( o que no se haya actualizado ans para nada) el ultimo if carga el valor.

Python maneja listas de forma muy eficiente y con poco código. Cuando programo en Python intento centrarme más en hacer el programa sencillo de entender y genérico:
  Primero formateo los datos para conseguir todas las soluciones en una base de datos ordenada (una lista)
  Luego extraer los datos que interesa.
Si más tarde te interesa extraer otros datos, la modificación es trivial.

Hay que tener en cuenta que Python es interpretado. Su fuerte no es la rapidez (aunque sea muy rápido), sino la legibilidad y facilidad de mantenimiento.
Python es uno de los lenguajes más fáciles de mantener. Si programas bien, puedes volver a el dos años despues y reutilizar el código, quitar un bug o añadir funcionalidades con mucha facilidad.

Si quieres código muy rápido, mejor ir al c
En Python hay que esforzarse por hacer código sencillo de entender.


Copio aquí el Zen de Python:
https://www.python.org/dev/peps/pep-0020
http://mundogeek.net/archivos/2007/07/02/el-zen-de-python/
Citar
Hace mucho tiempo el entusiasta de Python Tim Peters plasmó de forma concisa los principios de diseño por los que guiarse al escribir en Python según el BDFL (NT: Benevolent Dictator for Life o Dictador Benévolo de por Vida, en este caso Guido van Rossum, el creador de Python) en 20 aforismos, de los cuales sólo 19 han pasado a forma escrita.

    1. Hermoso es mejor que feo.
    2. Explícito es mejor que implícito.
    3. Simple es mejor que complejo.
    4. Complejo es mejor que complicado.
    5. Plano es mejor que anidado.
    6. Disperso es mejor que denso.
    7. La legibilidad cuenta.
    8. Los casos especiales no son suficientemente especiales como para romper las reglas.
    9. Aunque lo pragmático gana a la pureza.
    10. Los errores nunca deberían dejarse pasar silenciosamente.
    11. A menos que se silencien explícitamente.
    12. Cuando te enfrentes a la ambigüedad, rechaza la tentación de adivinar.
    13. Debería haber una — y preferiblemente sólo una — manera obvia de hacerlo.
    14. Aunque puede que no sea obvia a primera vista a menos que seas holandés. (NT: Guido van Rossum es holandés)
    15. Ahora es mejor que nunca.
    16. Aunque muchas veces nunca es mejor que *ahora mismo*.
    17. Si la implementación es difícil de explicar, es una mala idea.
    18. Si la implementación es sencilla de explicar, puede que sea una buena idea.
    19. Los espacios de nombres son una gran idea — ¡tengamos más de esas!

Atención a la 13. Es la que diferencia Python de Ruby. Python intenta que las cosas se hagan de una sola manera, Ruby de muchas maneras.
Esto hace a Ruby más divertido, y mucho menos mantenible.

Saludos.
Título: Re: Ejercicios de Python. Curso edX
Publicado por: Picuino en 30 de Agosto de 2015, 07:54:31
6. Disperso es mejor que denso.
(http://images.slideplayer.es/14/4609358/slides/slide_8.jpg)
Título: Re: Ejercicios de Python. Curso edX
Publicado por: KILLERJC en 30 de Agosto de 2015, 09:36:10
Entiendo...

Es una cosa que no tuve en cuenta al ser interpretado.
Yo toque un poco de Perl en un momento y si no mal recuerdo Ruby me parecia una mezcla de Perl/Python
Título: Re: Ejercicios de Python. Curso edX
Publicado por: Picuino 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.
Título: Re: Ejercicios de Python. Curso edX
Publicado por: KILLERJC 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.
Título: Re: Ejercicios de Python. Curso edX
Publicado por: Picuino 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.
Título: Re: Ejercicios de Python. Curso edX
Publicado por: Nocturno 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.
Título: Re: Ejercicios de Python. Curso edX
Publicado por: KILLERJC 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
Título: Re: Ejercicios de Python. Curso edX
Publicado por: Miquel_S 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!
Título: Re: Ejercicios de Python. Curso edX
Publicado por: KILLERJC 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.
Título: Re: Ejercicios de Python. Curso edX
Publicado por: KILLERJC 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  :-/
Título: Re: Ejercicios de Python. Curso edX
Publicado por: KILLERJC 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.