Azərbaycan dili Bahasa Indonesia Bosanski Català Čeština Dansk Deutsch Eesti English Español Français Galego Hrvatski Italiano Latviešu Lietuvių Magyar Malti Mакедонски Nederlands Norsk Polski Português Português BR Românã Slovenčina Srpski Suomi Svenska Tiếng Việt Türkçe Ελληνικά Български Русский Українська Հայերեն ქართული ენა 中文
Subpage under development, new version coming soon!

Subject: Asesoramiento: Programación para aficionados

2011-10-28 04:23:27
Como usar variables globales no es una buena práctica, Python tiene un forma de salvaguardar al programador haciéndolo consciente de lo que está haciendo y obligándolo a declarar las variables globales con la palabra clave "global".

En tu caso, suponiendo que declaraste numjug como explicaste en tu post anterior y estás llamando a la función CDJ() desde adentro de main(), lo lógico es que adentro de main() hagas algo así:

import _string, time, os
numjug = 0
numcol = 14

def main():
....global numjug # Acá le estás deciendo que use la variable global
....numjug = CDJ()

En realidad todas esas variables que estás declarando globales podrían declararse localmente dentro de la función que la use, pero no quiero embarullarte demasiado con ese tema porque si estás siguiendo un tutorial capaz que te hago lío, pero eso que estás haciendo no es para nada recomendable. :-)
(edited)
2011-10-28 05:10:37
Como dice Yogurtu, variables globales son muy peligrosas a la hora de programar, mayormente por colision de nombres, que el lenguaje de programacion sin importar la politica que use, siempre da margen para el error.

Por ejemplo si por una de esas casualidades (que pasa y muy seguido aunque te parezca raro) reusas el nombre de una variable en un metodo que ya la tenes declarada globalmente, que carajo hace el compilador/ interprete? Asume que es la misma variable o que en realidad es una nueva. Si asume que es la misma variable, ese metodo esta modificando la variable global, y podes cometer un error, si asume que es una nueva variable estas en el otro caso.

Por eso python te fuerza de manerea explicita a decir : "Si, la verdad lo que estoy por hacer es bastante bestia, pero quiero modificar en el contexto de mi metodo una variable que esta en otro contexto".

Agregando global el compilador/interprete no tiene dudas de cual era tu intencion.

Ahora, por infinitas razones, y si bien lo haces ahora a forma de tutorial, usar variables globales esta muy pero muy mal, inclusive un tipo sin vision como Steve Jobs lo sabia, asi que imaginate.

En general, como regla, evita compartir cualquier objeto/dato, si este dato/objeto puede ser modificado. Y en general, cuanta mas tiempo perdure ese dato/objeto en tu aplicacion, mas peligroso se torna ese objeto/dato. El caso de una variable global es el peor caso, porque esa variable vive a lo largo de la vida de toda tu aplicacion.

El tema es muy largo y si queres nos ponemos a discutir, pero te diria que uno de los pilares de cualquier aplicacion es esa, no compartas datos que puedan ser modificados sin un mecanismo correcto para compartir.
2011-10-28 05:14:19
Me imaginé que el tema de usar variables globales debía ser algo excepcional (en particular cuando el programa se expande, no podés tener 500), pero como estaba arrancando y tengo más bien conceptos rudimentarios, dije: "Bueno, hasta que me vaya curtiendo, uso un par".

Pero lo que me desorientó es por qué unas sí las interpretaba como globales y otras no... eso es lo que me generó la duda más grande. Después del post que escribí, incluso, ya me hice una idea de cómo puedo transformarla en una variable "local" y seguir teniendo el programa "customizable" cuando quiera cambiar algo, pero de todas maneras me intrigaba (y me intriga todavía) por qué dejó de tomar a numjug como variable global... o, en realidad, por qué sí la tomó como global (porque el valor que le da "Imprime plantel" es 0, que es el que le asigno globalmente, o sea que la pregunta es por qué ignora la asignación que hago en main(), pero bueno, tal vez sea por eso, porque la llamo dentro de una función y después la mando a otra función, o quién sabe qué).

Ya lo voy a saber.

Y gracias por el dato de global, no estaba en mi tutorial así que es bueno saberlo para salir del paso también!
2011-10-28 05:19:49
Tranquilo, tranquilo, yo no voy a ser como esos mediocres de Gates o Jobs, me van a sacar bueno... es más, soy un visionario, tengo una visión... voy a hacer el "Catassistant", un asistente para SK que no sólo te va a ordenar la info de tu equipo, sino que va a sugerirte la alineación, te la va a copiar directamente en las órdenes del partido para que no la pifies, y además, como voy a "crackear" el motor de SK y voy a desenmascarar la variable "gregancia" (que es la única variable global de SK), en la versión "Catassistant Plus" (que va a ser paga, la voy a cobrar la mitad de lo que sale el plus en SK) también va a programar la "gregancia" de tu partido a favor tuyo. Imaginate, todos los usuarios de SK me van a comprar "Catassistant Plus" y me voy a hacer millonario...

Es así, algunos tratan, y otros somos visionarios y la vemos, viste...
2011-10-28 05:22:26
que es el que le asigno globalmente, o sea que la pregunta es por qué ignora la asignación que hago en main(),

En realidad no ignora la asignacion que haces en el main, simplemebte ese numjugador que tenes en el main es una variable que solo tiene vida dentro del main, despues se borra. Dentro del main, si seguis usando numjugador vas a ver que te dice 14, en el momento que el main termina esa variable local (que desafortunadamente tiene el mismo nombre que una variable que esta en otro contexto) desaparece.

No se si me explique
2011-10-28 05:25:47
Clarísimo.

Pero entonces, dentro de main(), no interpreta que cuando digo numjug=lo que sea, estoy hablando de la misma numjug que definí al principio de todo en el programa, ¿no? La toma como local, aunque se llame igual que la que definí global.

En cambio a numcol, como no la modifico nunca, siempre queda como la definí al principio.

Ahora que lo pienso, el error tal vez está en que que mientras que numjug sí es una verdadera variable (porque esa va a cambiar según cuántos jugadores tenga un plantel), numcol no lo es, es una constante, un dato que yo, de momento, quiero definir una vez y no tocarlo más, y sólo cambiarlo (en el código mismo, no desde la aplicación) si mañana amplío el "scope" del programa.

Ahora que lo pienso, por eso sí tengo quilombos con numjug y no con numcol: numcol nunca es "tocada", sólo es utilizada como referencia en un par de loops.
2011-10-28 19:40:05
Pero entonces, dentro de main(), no interpreta que cuando digo numjug=lo que sea, estoy hablando de la misma numjug que definí al principio de todo en el programa, ¿no? La toma como local, aunque se llame igual que la que definí global.

Es exactamente como decís. Siempre tiene prioridad la variable local, salvo que la definas con la palabra clave global, que indica que querés usar la definición global.

En cambio a numcol, como no la modifico nunca, siempre queda como la definí al principio.

Ahora que lo pienso, el error tal vez está en que que mientras que numjug sí es una verdadera variable (porque esa va a cambiar según cuántos jugadores tenga un plantel), numcol no lo es, es una constante, un dato que yo, de momento, quiero definir una vez y no tocarlo más, y sólo cambiarlo (en el código mismo, no desde la aplicación) si mañana amplío el "scope" del programa.

Ahora que lo pienso, por eso sí tengo quilombos con numjug y no con numcol: numcol nunca es "tocada", sólo es utilizada como referencia en un par de loops.


Exacto! ;-)
2011-10-28 20:04:28
No me dijiste nada sobre el tema de compartir datos/objetos. Pense que me ibas a saltar a la yugular
2011-10-28 20:12:55
Jaja, por qué pensaste eso?
2011-10-28 20:15:37
No se, me dio la impresion que ibas a venir con algo
2011-10-28 20:18:21
Qué mal concepto tenés de mi!
2011-10-28 21:03:32
Bueno, salí del atolladero. Además, los jugadores dejaron de ser una 'lista dentro de una lista" y ahora son un diccionario (!): el del tutorial armó una agenda (nombre, apellido, dirección, teléfono, etc.) y recomendó para ese tipo de cosas (que es parecido a lo que busco yo) el dict porque dice que así es más fácil. Y como los jugadores tienen un núm. ID, pues así hice.

Ahora, además, cargo datos desde el txt, puedo agregar manualmente jugadores desde el programa, y cuando salgo, graba esa info encima del txt, con lo cual la próxima, al cargar el txt, tengo la última versión de la base.

No me convence todavía grabar el txt un dato por renglón, pero bueno, de a poco. Voy a ver con qué temática sigue ahora el tutorial y en qué la puedo aplicar al programita.

De momento, es todo "consola", si bien el del tutorial nos presentó "easygui", no sé si me va a servir,. En todo caso, voy avanzando...
2011-10-28 22:30:58
felicitaciones! Creo que ya casi le podes sacar el laburo a Yogurtu
2011-11-10 22:26:32
Gente, me recomiendan algun editor y un compilador para ANSI C. Para Windows 7 si no es mucho pedir.
Ya que estamos el proyecto gnu o algo asi funca bien??, entre a la paginola pero es un quilombete para bajar. Un poco de orientacion no me vendria mal.

Saludos
2011-11-10 22:33:26
Yogurtu te puede orientar, yo ni idea de C.
2011-11-11 03:47:08
Si querés algo integrado (editor + compilador) y no renegar demasiado, el Visual Studio es quizás lo más simple.
Si te interesa la calidad del compilador y el código que genera, la respuesta es gcc (del proyecto GNU). Para que funcione en Windows, te recominedo leer este tutorial. Ahí te da 2 opciones: Cygwin o MinGW+MSYS. Para mi laburo yo uso Cygwin, pero tengo entendido que los dos andan bien. En el tutorial te aclara las diferencias y las limitaciones de cada uno.
Como editores el Vim y el Emacs son muy potentes (no estoy seguro si Emacs está soportado nativamente en Windows) y algo más sencillo son el UltraEdit y el Notepadd++.
Cualquier duda preguntá.