Transcripciones
1. Introducción: Bienvenido a esta introducción
a la programación Python. Mi nombre es Fernando Ortega. Soy Director Técnico en la industria de animación y
efectos visuales, además de ex animador 3D. En este curso, te voy
a enseñar los conceptos básicos de codificación en Python
creando una serie de diversión. Mencionaste herramientas
dentro de Maya. Pero a pesar de que los
proyectos que vamos a crear nos enfocamos en la
animación en Maya, las habilidades que aprenderás, nuestras habilidades de programación que son altamente aplicables
a otros departamentos, otro software e incluso
otros lenguajes de programación. Al final de este curso, tendrás las habilidades
y la capacidad de crear tus propias herramientas y hacer que tu propio flujo de trabajo sea
mucho más eficiente. Gracias por
acompañarnos. Empecemos.
2. Resumen de Editor de Script: Familiaricémonos con el editor de
guiones dentro de Maya. Primero, ¿cómo lo encontramos? Por cierto, este es mi add 2020. Pero lo que les voy
a mostrar es prácticamente lo mismo en
todas mis aversiones. Para abrir el editor de scripts, podemos hacerlo a través este botón en la esquina
inferior derecha, o desde el menú de Windows. Editores generales y
rasparlo o lo que es este error descriptivo es la herramienta de
Maya para
escribir, correr. O estoy mostrando la
salida de código que
escribes o código o comandos que se están ejecutando cuando
estás usando Maya. Entonces hay dos partes principales para ello. La primera es
la ventana Script, que es esta de
aquí abajo donde está mi cursor. Aquí es donde escribes el número de
código aquí arriba. Esta es la
ventana de salida que
mostrará el resultado de ese código. Así que vamos a escribir algo. Hagamos un poco de matemáticas. Dos más dos,
algo muy sencillo. Ahora esto es un poco pequeño. Podemos presionar la tecla Control y la rueda y la masa para hacerla
un poco más grande, Eso es lo mismo aparecen en la ventana de salida te
mostraré en un segundo. Entonces, para ejecutar tu código, digamos que queremos hacer
este poco de matemáticas aquí. Hay algunas opciones, pocas formas de ejecutar el código. Uno de ellos es a través de
este botón Reproducir. Se llama ejecutar. Ahora ya ves, una vez más, voy a hacer esto un
poco más grande con la tecla Control y el mouse
y la rueda en el mouse. Verás que
Maya siempre te muestra el código que ejecutas. Y luego el resultado
de ese código. Esto puede ser un
poco confuso al principio, pero te
acostumbrarás muy rápidamente. Entonces te das cuenta de que tu
código desapareció aquí abajo. Si eso
te sucede, no te preocupes, solo presiona Control Z o
Control Z para recuperarlo. Ahora, la forma más fácil evitar eso es solo
resaltar tu código. Normalmente uso las teclas de acceso rápido
Controlar a para seleccionar todo y luego hacer clic en
ese botón Ejecutar. Para ejecutar sin
hacer clic en ese botón. Puedes usar la tecla Enter
en el teclado numérico o hacer clic en Control e Ingresar
esa combinación de teclas ejecutará ese código. Otra forma de ejecutar el
código sin que ninguno desaparezca es a través de
estos botones Double Play. Parece jugar íconos. Hará lo mismo, pero lo hará,
no eliminará tu código. Dicho esto,
ya que normalmente estás con las manos en el teclado, me resulta fácil simplemente presionar
Control a Control
Enter para ejecutar el código. Ahora, como estamos resaltando, permítanme escribir otra
línea de código aquí. Sólo otra pieza de matemáticas. Cuando Maya, puedes correr
todo, como puedes ver. Una vez más, me dio el
decodificador y funcionando hasta aquí. Y luego el resultado
para cada código de línea. Pero también puedes simplemente
resaltar una sola línea, por ejemplo aquí, Control Enter
para ejecutar esa línea. Y sólo se está ejecutando
ejecutando esa línea. Entonces la ventana de salida,
como estás viendo, muestra el código
que estás ejecutando, pero también muestra lo que
está sucediendo dentro
de Maya. Entonces, por ejemplo si tuviera que crear un cubo
y luego seleccionar el cubo, por ejemplo verá que todo lo que
estoy haciendo está siendo enviado, se muestran en esta ventana de salida.
Lo cual es genial. Es una forma de saber para
averiguar los comandos que Maya necesita para
crear un cubo, por ejemplo, así que en algún momento, esta ventana de salida
se volverá un
poco abarrotada. Como se puede ver. Claro que con este botón de
aquí, claro la historia. Y antes de seguir adelante, quiero mostrarle eso. Como dije, ¿Qué
haces dentro de Maya se
está mostrando aquí, pero no todo
se está mostrando. ejemplo, si cambio mi
modo de sombreado a través de este menú aquí, ves que
cambia en la pantalla. Yo vuelvo a hacer eso. Cambios en la ventana, lo siento. Pero en realidad no te
dice lo que pasó. Hay una manera de mostrar más
información de Maya. Se llama Echo todos los comandos. Es este botón de aquí. Y lo que eso hará es mostrar aún más cosas que pueden
llegar a ser un poco verbosas. Como pueden ver, todo lo que estoy haciendo se está sacando aquí. Puede ser un poco
verboso, como dije, pero a veces es útil saber lo que sucede
dentro del capó. Entonces voy a
apagarlo por ahora. Despeja de
nuevo mi ventana de salida con este botón. Aquí abajo, probablemente hayas
notado estas pestañas, estas son la pestaña MEL. Una vez más, nos estamos
enfocando en Python. Así que vamos a
apegarnos a la pestaña Python. Puedes crear nuevas pestañas
con este botón más aquí. Vamos a crear otra pestaña de Python. Vamos a rociar una función. Si no sabes
lo que es una función, no te
preocupes, llegaremos
a eso muy pronto. Entonces volvamos a hacer esto un
poco más grande. Puedes ver que mis regalos te colorea para cosas diferentes. Por ejemplo esto es amarillo, esto es una cadena,
esto es un comentario. Esto se llama resaltado de
sintaxis. Esta es mi forma S de
ayudarte a leer tu código un poco mejor,
lo cual es muy agradable. Entonces tenemos esta ficha. Esta es una buena manera de
organizar tu código. Y puedes nombrar esos pasos
desde el menú de comandos. Puede cambiar el nombre de esta pestaña. Llamemos a esta pestaña
número dos, por ejemplo llamemos a esta
pestaña número uno. Así que ahora puedes reconocer
fácilmente lo que tiene cada pestaña. Y también puedes eliminar el tipo que las
pestañas por aquí. Y lo que es realmente bueno de
esto es que cuando cierras Maya
y la vuelvas a abrir, recordará las pestañas y el código que tenías en ella. Para que no pierdas nada de eso. A veces lo haces, pero normalmente
no? Por lo general mi sí. Muy bueno guardando
ese código para ti. Lo último que quiero
mostrarles es
cómo poner código en una estantería. Entonces por ejemplo I. Sé que para crear un cubo, tuve que usar este comando. Muy pronto nos familiarizaremos con
estos comandos. Esto es sólo para,
estamos en el ejemplo. Entonces sé que, um, que si vuelvo a ejecutar este
comando, estoy golpeando Control a y Enter o Control Enter
para ejecutar el código. Estoy creando estos cubos. Eso es genial. Entonces, ¿y si quisiera
poner esto en una repisa? Puedes resaltar tu código, hacer clic en él y luego simplemente
arrastrarlo a la repisa. Y Maya te dará esta
opción para crear un botón. Haremos clic en
la opción Python. Cuando hacemos clic en el botón
, creará el cubo para nosotros. Eso es genial. Entonces si cuando vamos a
editar ese botón, ves que tu código está aquí y está en
el modo Python. Y además no olvides guardar tus estantes cada vez que
hagas un cambio en la repisa. Um, y eso es que en general, hay muchas más opciones. Como puedes ver, hay
muchos más botones, aquí
hay muchos más menús. Hay muchas cosas
que puedes hacer cualquier guión o lo que te mostré
será lo que necesitarás. 95, 99% del tiempo. Ya sea que estés haciendo
algunas secuencias de comandos simples o más complejas,
digamos desarrollo. Estas son las principales opciones
que vas a necesitar. Así que sigamos adelante y escribamos
tu primer trozo de código.
3. Tu primer programa de Python: Hello Maya: Bien, vamos a crear tu
primer programa Python. Entonces una de las primeras
cosas que podemos hacer, una de las
cosas más simples que podemos hacer es mostrar algo también
conocido como esprint. Entonces escribe conmigo, imprime
paréntesis
abiertos, abre comillas y escribamos nuestro mensaje. Hola mundo. Ahora cerrando comillas
y cerramos los paréntesis. Ahora vamos a ejecutar este código. Una vez más,
puedo, voy a presionar Control
a para resaltar todo. Y voy a hacer clic en
el botón Ejecutar. Y como mencioné antes, los mayas imprimirán o sacarán el código
que estás ejecutando. Y luego los resultados reales
o salida de ese código. Y por cierto, si la
fuente es demasiado pequeña, recuerde que puede
hacer clic en la tecla Control y la rueda del mouse para
hacerla más pequeña o grande. Así que vamos a
descomponer esto un poco. Primero, tenemos las declaraciones
impresas. Ahora. Me escucharán decir
declaración y funciones. Significan cosas diferentes. Pero por ahora
pensemos en una impresión como una función. Esta es una palabra especial en
Python que simplemente
mostrará algo en la consola o la ventana de salida aquí arriba. Después el paréntesis, usamos un paréntesis para
ejecutar algo, para llamar a funciones a la acción
o ejecutar funciones. Así que recuerda siempre abrir
y cerrar paréntesis. Y luego en el medio
aquí en amarillo. Y recuerda que
Maya resaltará cosas para que te sea
más fácil decirlo, para saber de un vistazo
lo que hay en tu código. Esto es una cadena. Una cadena es básicamente un trozo
de texto debajo del capó. Es un poco
más complicado que solo un trozo de texto. Pero se puede pensar en ello como
sólo una cadena de caracteres. Podría ser una secuencia,
perdón, una oración. Podría ser una sala o un símbolo, o un solo carácter, un
solo dígito. En este caso. Siempre se
hará o creará una cadena usando comillas. Puede usar comillas
simples o comillas dobles. No importa siempre y cuando
uses el mismo tipo al
principio y al final. Hay otro tipo especial de cadena que usa tres
comillas. Pero vamos a reservar eso para documentación y
hablaremos de eso más adelante. Entonces, si has hecho esto antes, posible
que hayas visto la impresión realizada sin el paréntesis. Entonces probemos eso.
Voy a hacer clic en Controlar a. y ahora esta vez
voy a hacer clic en Control Entrar para
ejecutar mi código. Entonces es el mismo resultado. Entonces, ¿qué está pasando aquí? Lo que está pasando es que imprime
inversiones a Maya 2020, que es lo que estamos usando aquí. Maya usa una versión de
Python que es 2.7. Y en esa versión de Python, print es un tipo especial de
función que se llama las sentencias que puedes usar con o sin el
paréntesis, en este caso. Ahora a partir de Maya 2022, que es la siguiente versión, porque Autodesk
decidió saltarse
Tony, tony one, comenzando por
mi abogado, 22 Python. La versión de Python
será Python tres. Y en ese caso, impresión sólo podrá
ejecutarse con
el paréntesis. Entonces por eso me
verás usando paréntesis. Nuestra convención. Creo que es un buen hábito. Pero solo debes saber que para la versión más
actual de Maya, tendrás la opción de
hacerlo con o sin ella. Siempre y cuando deje
un espacio entre la declaración print
y la cadena. Ahora, permítanme aclarar. La diferencia
entre enunciados y funciones es un poco técnica y realmente no
necesitas preocuparte por ello. En este punto. No tienes que importarlo, así que no
pienses demasiado en esa distinción. Así que vamos a hacer esto un
poco mejor. Almacenemos esto
dentro de una variable. Así que hagamos algo de espacio aquí. Ahora, variables, voy a
llamar a esta variable mi mensaje. Las variables son contenedores de valor y un
nombre de variable depende de usted. Puedes nombrar tus
variables lo que
quieras asignarles valor es a través del
signo igual, solo signo igual. Y luego voy a asignar esta cadena que tenemos aquí. Así que HelloWorld en una variable
llamada por mensaje. Y ahora en lugar de imprimir
esa cadena directamente, voy a imprimir mi forma controlada variable
para resaltar todo, Control Enter para ejecutar. Y ahí tienes. Entonces, ¿qué está pasando aquí? Una vez más, como dije, una variable es un
contenedor de valor, lo que significa que puedes asignar cualquier valor que quieras
siempre y cuando sea válido para Python, por
supuesto, a cualquier
variable que quieras. Entonces por ejemplo el valor diez, el número diez, eso funciona, puedes asignar el
resultado de algo. Entonces volvamos a hacer un
poco de matemáticas. Tres más tres. Seis, ahí tienes. Ahora bien, ¿por qué estoy usando
un guion bajo? Esto es simplemente una
convención que me gusta
usar se llama Snake casing. Cuando separas palabras
usando guiones bajos. A algunas personas les gusta
usar tritura de camello, lo que significa que usan una letra mayúscula
para separar palabras, cuál usar. No importa. Depende de usted o del equipo con el
que esté trabajando. Tiendo a usar esto y solo
me quedo con eso. Yo diría que sólo hay
dos reglas sobre las variables. Una de ellas es que
deben tener sentido. ¿A qué me refiero con eso? Quiero decir que podrías nombrar
tu variable x. Y a Python no le importa. Seguirá
funcionando igual. Pero cuando
vuelvas a tu código, digamos dentro de seis meses, x realmente no va a tener
mucho sentido para ti. Pero voy a nombrar variable
como mi mensaje por ejemplo vamos a tener un
poco más de sentido o algo así si
solo lo llamas MSG, incluso ese es un nombre
mejor que x o simplemente mensaje. Y la otra regla es que mantengas tu
nomenclatura consistente. ejemplo, si tienes esto, perdón, por el error tipográfico, estás
mezclando convenciones. Estás usando
subrayado aquí en, estás usando
letras mayúsculas aquí. Esto no es un
problema para Python, pero es una buena práctica aras de
mantener tu código limpio y legible para apegarte a las mismas convenciones
que has establecido. Pero hablaremos de
eso un poco más tarde. Entonces esto es genial, pero no es muy emocionante. Todo lo que estamos haciendo es imprimir. A pesar de que la impresión
es muy potente y estarás usando
mucho cuando estés codificando. Pero así ahora, ahora que tenemos mi respuesta a nuestras
órdenes de alguna manera, aprovechemos eso. Usemos mi un
poquito más directamente. Entonces voy a escribir desde
Maya Importante CMBS. Hablaremos de
esto un poco más con más detalle en
las próximas lecciones. Pero sepa que esta
es la biblioteca CMBS, también
conocida como biblioteca
de comandos
o la biblioteca de comandos mayas. Y lo que esto hace es que nos da acceso a muchos comandos
que Maya va a entender. A uno de ellos se le llama
a la vista mensaje. Ahora note que mi otro atornillado fechado o simplemente resaltó
estos en azul. Y hay una
representación hermosa
y metálica en la fuente. Eso es porque Maya lo
reconoce como un comando que está disponible
en la biblioteca de comandos. Entonces esto, este comando
también se conoce como una función, y voy a estar llamándolo
función porque ese es el término adecuado
en, en Python. Entonces esta es una función. Y fíjate que estamos
usando esta notación de puntos. Veremos esto con más detalle
como ya mencioné. Pero la explicación simple
es que estamos accediendo a esta función desde esta biblioteca que estamos importando aquí arriba. Entonces la biblioteca de Comandos
tiene esta función y
accedemos a funciones desde esa
a través de la notación de puntos. Ahora, usamos los paréntesis
para llamar a esa función. Y las funciones pueden
y suelen hacerlo, tener unas opciones especiales que podemos usar para modificar la
salida de la función. Y esas opciones se
llaman argumentos. En este caso, esta función tiene un argumento llamado mensaje de
asistencia. Ahora, sé que dije
que debes mantener las cosas consistentes
a la hora de nombrar tus variables. Y estás diciendo que esto tiene tripa de
camello o las letras
mayúsculas. Esto se debe a que Maya decidió
que es convención mayas. Puedes ceñirte a eso si
quieres o crear el tuyo propio. Pero a la hora de
usar las funciones de Maya, hay
que usar lo que
mis desarrolladores aéreos han decidido usar. Entonces este es el
mensaje de asistencia meso aceptará una cadena. En este caso, me
gustaría que usaras la variable que ya
he creado. Y déjenme traer esto de vuelta
a decir Hola mundo. Después hay otro
argumento llamado pagado. Diré que eso es
cierto y
veremos en un segundo por qué
estoy haciendo eso. Y hay otro
argumento llamado posición que toma
otra cadena. Y voy a decir que quiero que
esto esté en el centro superior. Primavera esto un poco más
al centro y hazlo
un poco más grande. Entonces ejecutemos este código
y veamos qué pasa. Ves este pequeño mensaje aquí y va a desvanecerse un poquito porque
tenemos esa opción
fade es igual a true. Ahora, como viste, estamos usando estos argumentos para modificar el comportamiento
de la función. Si quiero que aparezca en
el lado derecho, e.g. I. Solo di arriba a la derecha. Si quiero modificar el mensaje, simplemente modifico mi variable. Y esa variable
se está utilizando aquí. Y ahora tenemos el mensaje
diferente. Ya lo has visto antes. Bueno, no sé
si tienes es muy probable que lo hayas visto. ejemplo, cuando alternas el modo de
sombreado en este menú, verás este
mensaje bajo el capó, mis ojos usando exactamente el mismo
comando que estamos usando. Con algunos argumentos diferentes. Por supuesto. Muy pronto hablaremos
de funciones a detalle. Aprenderemos cómo podemos averiguar los argumentos
que tenemos disponibles para cada una de las funciones que existen
en la misma biblioteca ds. Por ahora lo sé de memoria solo por el
bien del ejemplo. Pero te mostraremos cómo encontrar eso en su
recomendación. Pero ahora estás listo para comenzar
tu primer proyecto en Maya. Entonces sigamos adelante y hagamos eso.
4. Biblioteca e importación de ingredientes de cmds: Antes de saltar
al primer proyecto, necesitamos hablar sobre
la biblioteca Maya CMBS. Entonces, ¿qué es una biblioteca? Una biblioteca es una
colección de código, una colección de funciones. Ejemplo perfecto ya lo
hemos usado. Es esto a la vista mensaje. Vamos a refrescar tu
memoria sobre cómo funciona. Ahí tienes, recibes un pequeño
mensaje en la ventana gráfica. Entonces una biblioteca, en este caso
el MIS él, la biblioteca, también
conocida como la biblioteca de comandos
malloc, tiene una colección de funciones. Y funciones. les puede pensar como, como cajas negras en que no
sabes cómo
funcionan bajo el capó, pero ya sabes cómo puedes
obtener un resultado de ello. Entonces en este caso, sabemos que se puede
acceder al mensaje
imbue a través de la notación
de puntos de la escena, esta biblioteca. Y podemos modificar la salida
con estos argumentos. No sabemos cómo muestra
un mensaje bajo el capó. Pero honestamente, no
nos importa. Nos importa es el resultado. Entonces esa es una biblioteca, básicamente una colección de código. Entonces ahora para obtener acceso a
una biblioteca, antes que nada, debes
asegurarte de que Python, maya tenga acceso
al código que está
dentro de la biblioteca. Porque las bibliotecas
al final del día son básicamente solo archivos de texto con código Python dentro de ellas. Lo segundo que
hay que hacer es importante, que es lo que estamos haciendo aquí. Entonces lo que estaba haciendo, lo que estoy haciendo
aquí es de Maya, esta pasa a ser
otra biblioteca. Entonces estoy diciendo desde
la biblioteca Meyer, importar la biblioteca CMBS. Y luego aquí abajo digo
desde la biblioteca de C&DH, acceder a la función de
mensaje de entrevista. Entonces verás que esta
importación se hace de manera diferente. Algo así como importar Maya, el obsceno punto ds como CMBS. Esto te dará
exactamente el mismo resultado que puedes ver aquí. Ahora, ni siquiera necesita ingresar C y D ya que puede acceder a bibliotecas desde otras bibliotecas
a través de la notación de puntos. Podríamos simplemente decir
importante maya, así. Ahora tenemos que decir desde
la biblioteca Meyer,
acceder a la biblioteca C&DH
a través de esa notación de puntos. Y a partir de esto en esta biblioteca, accediendo a tu función de mensaje, esto es mucho mecanografiar. Entonces por eso preferimos
hacer esto desde mi entrada CMBS. Ahora, verás que esto se hace
de una manera diferente también. Algo como esto. Esto es muy común si
ves scripts en línea, verás estos, esta forma de importar lo que está sucediendo aquí. Esto se llama espacios de nombres. Así que seguimos importando
de la Biblioteca Meyer. Estamos importando este hemo, esta biblioteca, pero lo
estamos llamando MC. Por eso entonces estas como MC. Ahora el AMC es
como una variable. Básicamente estás almacenando
la biblioteca CMBS en la variable de tu elección. Se podría llamar a estos comandos. Funcionará igual. Se puede ver aquí arriba el resultado. Muchas personas optan por
hacer MC porque
piensan que es más rápido de escribir
y más conveniente. Sea o no ese
el caso para usted. Eso depende de usted. Puedes pensar en el espaciado de nombres como cuando espacias
nombres a un personaje, cuando importas una
plataforma en la escena, estás importando tu
referencia al archivo rakefile. Le estás dando un espacio de nombres para que sea para que funcione
dentro de la escena. Ahora bien, en este caso, para mí, cmd es lo suficientemente simple como para escribir, así que tiendo a ceñirme a eso. Pero depende de ti si quieres o no usar
el espaciado de nombres. Y sí uso
namespace y muchas veces, pero suele ser cuando la biblioteca que estoy
importando es demasiado larga para escribir que voy por algo más eficiente o
más conveniente. Entonces ahí lo tienes. Ese es mi SEM, esta biblioteca, solo para
llevar el punto a casa. Vamos a acceder a otra
función que
conozco de memoria, poly cube. Simplemente creará un cubo. Entonces, una vez más, estamos accediendo a la función poly cube desde esta biblioteca a través de
esta notación de puntos. Y qué pasa
solo como ejemplo, ¿qué pasa si ejecuto esto? Recuerde que puede ejecutar líneas
simples de código
resaltando el código y
haciendo clic en Controlar Entrar. Si ejecuto esto, Python simplemente me
está diciendo que este es un método
también conocido como función. Pero nada está pasando, como dije antes, a la acción o a
ejecutar una función. Hay que llamarlo a
través del paréntesis. Y ahí lo tienes. Esto creará un cubo para ti. Acabamos de cambiar mi modo
de sombreado. Perfecto. Entonces vamos, déjame
darte antes pasar a un
ejemplo más de una biblioteca. Hay una
biblioteca incorporada en Python. Esto no es de, mi consejo
es de la propia Python. Obtendrá pase. Y get pass tiene una función que es muy útil
llamada getUser. Lo que esto va a hacer, y
permítanme asignarlos a mi variable aquí. Entonces en mi variable de mensaje, en vez de decir hola Maya, quiero obtener el
resultado de estos, de llamar a esta función. Lo que esto hará es darme el nombre de usuario que está
registrando mi computadora. Déjame despejar mi ventana de salida. Voy a deshacerme de
esta función poly cube. Ahora vamos a ejecutar esto. Una vez más, recordando
que estoy almacenando la salida de GetUser. En realidad, vamos a
hacerlo más obvio primero, vamos a imprimir la
salida de GetUser. En primer lugar, voy a
ingresar que se pase biblioteca. Y luego voy a
imprimir la salida de la función getUser de esa biblioteca. Ahí lo tienes. Entonces este es el nombre de usuario
dentro de mi máquina. Si ejecutas estas líneas de código, será
diferente para ti, claro, porque tu computadora tiene un nombre de usuario diferente. Así que ahora vamos a ejecutar
este código que está asignando el resultado de
getUser, esta variable aquí. Y ahí tienes. Ahora imbuyen mensaje. La función está mostrando
mi nombre de usuario en la ventana gráfica. Ahí vas. Entonces ahora en realidad estamos listos para comenzar en
el primer proyecto.
5. Proyecto 1 - Herramienta de aparejo de prop: introducción: Estás listo para crear
tu primera herramienta Python. Vamos a empezar
con algo sencillo. Esta será la herramienta apropiada. Déjame mostrarte a lo que me refiero. Este es el resultado. Yo sólo lo puse aquí en
la repisa como ejemplo. Por lo que te dará una
sencilla pieza de geometría. En este caso es un cubo, pero puede ser otra cosa. Te dará un controlador. Así que puedes hacer animar tu utilería e imaginar que estás bloqueando un
tiro y tienes, necesitas algo para que tu
personaje interactúe. O imagina que estás creando una pieza de anterior
y necesitas establecer traza de tu toma para determinar el
tiempo de la secuencia, o para resolver el
encuadre de la cámara. Hay muchos usos para
este tipo de herramienta. Entonces es muy útil. Pero lo más importante,
te mostrará los principios de Python que necesitas para crear
tus propias herramientas. Te mostrará los conceptos básicos
de interactuar con mi app. Y
te ayudará a descubrir cómo acciones
muy simples como
crear un cubo y un círculo, pueden sumarse rápidamente a
crear herramientas muy poderosas.
6. Desglose de herramientas: Entonces un desglose de
lo que está pasando aquí. Si miramos aquí a la
izquierda, en el outliner, tenemos nuestra curva para un
círculo llamado control. Y debajo de eso, tenemos una pieza de geometría que es un cubo. Se llama prop. Prop es parenteral bajo control para que
pueda ser animada. Esta es una configuración muy simple, y de hecho, podemos
hacerlo manualmente. Y de hecho, esa
suele ser una de las mejores formas de empezar a desarrollar una herramienta cuando
no sabes por dónde empezar. Vamos, déjame
mostrarte a lo que me refiero. Vamos a abrir el editor de guiones. Y recordarás que en el primer
par de lecciones te
mostramos que
la ventana de salida no solo te muestra la
salida de tu código, sino que también te muestra
lo que hacen mis ojos. Entonces veamos eso en acción. Déjame despejar la ventana de salida. Déjame borrar este código que
ya no lo necesitamos. Empecemos por
crear un círculo. Ahora, comencemos nuestro
entrenamiento del cubo. Y después quiero seleccionar
el cubo y el círculo. Y voy a dar click en
la tecla P a los padres. Ahora obtenemos resultados muy
similares. Por supuesto que no es lo mismo. No tenemos los nombres
y queremos que el círculo sea un poco más pequeño que hecho
lo que nos está dando la herramienta. Pero es un buen comienzo y
nos consiguió la mayor parte del camino al hacer
estos pasos manualmente. Ahora bien, si notas aquí
en la ventana de salida, Maya nos ha dado
mucha información. Ahora hagamos esto de nuevo y
veamos la ventana de salida. A medida que creo mis objetos. Comienza con el círculo, cubo. Seleccione, desvíe, seleccione
el círculo y padre. Genial. Entonces ya ves a Maya se le han dado todos los comandos que
necesitamos para crear esto. Ahora bien, este es Malcolm, estos son los comandos de MEL. Este es el código Mel. Como mencioné antes, no
vamos a estar usando MEL. Pero saber leer un poco de
correo te será muy útil porque puedes
traducir ese Python. Entonces vamos, vamos a tratar de hacer eso. Este código que Maya te
da no siempre es,
no siempre limpio. Ves que aquí hay
muchas opciones que probablemente no necesitemos. Y además notarás
que está creando dos círculos. Al igual que si ejecuto este
código tal como
está, creó la
configuración que queremos. Como puedes ver aquí, está el cupón impreso
en el registro, pero también creó objetos
adicionales. ¿Por qué mi Aggie se
repetía comandos? Honestamente, no lo
sé. Pero sabemos que simplemente
tenemos que
ignorar al primero. Y una vez más, esto
es sólo una pauta. Esta no será tu pieza de código
resultante, aunque no podría serlo. Si necesitas hacer algo
tan sencillo como esto, tal vez esto es todo
lo que necesitas hacer. Pero para nuestros propósitos,
esto no es suficiente. La principal comida para llevar de esto serán los comandos
que Maya está ejecutando. En estos casos, el comando
circle, el comando poly cube y el comando padre. Y además de eso,
vamos a tener que hacer un
poco de limpieza. Como mencioné, el naming no
es exactamente lo que necesitamos y el tamaño del círculo se conoce como fácil de usar como
nos gustaría que fuera. Entonces, traduzcamos
estos comandos a Python y comencemos a crear
la herramienta nosotros mismos.
7. Crear la herramienta: Empecemos traduciendo
estos comandos a Python. Entonces todo lo que necesitamos son los nombres
de los propios comandos. Círculo, cubo. Es posible que
necesitemos o no el comando select. Entonces vamos a
ignorarlo por ahora. Y el comando de impresión. Así que vamos, vamos a copiar esto y
llevarlo a un laboratorio de Python. Va a hacer que la
fuente sea un poco más grande. Control en la
rueda, en el ratón. Permítanme eliminar esta configuración
que teníamos de antes. Entonces sabemos que estos comandos, y por lo general cuando se ven
estos de color azul y las cursivas significa que están viniendo del MIS
él es biblioteca. Entonces una vez más, si recuerdas, necesitamos importar esa biblioteca
y aprenderás estas. Estos de memoria. Escribirás
de importación Maya, consulta MDS. Genial. Así que ahora vamos a acceder a
estas funciones desde la Biblioteca CMBS
a través de esa notación de puntos, TMDL, el círculo
aparentemente como un cubo poli. Ahora fíjense el caso aquí, La capitalización.
Esto es importante. Si no tienes
esa C mayúscula, no
será el comando
correcto. Cmd como indulto. Entonces comencemos con un
círculo primero. Recuerda que para
ejecutar una función, voy a simplemente despejar
la historia de aquí, así que eso está menos desordenado. Para ejecutar una función, es necesario usar el paréntesis de abrir
y cerrar. Sólo sigamos adelante y hagamos eso. Y vamos a ejecutar estas tres
primeras líneas de código. Entonces obtenemos, obtenemos un círculo. Excelente. Ahora,
hagamos lo mismo, pero con un cubo, poli cubo. Vamos a ejecutar esa línea de código. En realidad, vamos a
ejecutar el círculo y los comandos
o funciones de poly cube. Excelente. Ese es un buen comienzo. Tenemos un cubo y
tenemos un círculo. Ahora fíjense que no estamos
pasando ningún argumento. Entonces mi S está agregando
el nombre para nosotros. Sé que muy pronto te
enterarás de
cómo conocer estos argumentos. Pero sé que hay un argumento
name en la mayoría de estas funciones que puedes usar para pasar en una cadena que, que se usará para nombrar
al objeto resultante. Entonces en este caso, habíamos dicho que queremos que el
círculo se llame control. Habíamos dicho que
queremos que el cubo o cualquier geometría que
vamos a
usar se llame prop. Entonces déjame hacer esto. Y vamos a ejecutar esto una vez más. Excelente, Eso se ve
un poco mejor. Entonces ahora tenemos un
círculo llamado control, y tenemos una pieza de
geometría o cubo llamado prop. Ahora bien, estos aún no están parentales. Así que hazlo para imprimirlos, vamos a usar
el comando print. Ahora voy a
mostrarte cómo padres de ellos. Y luego justo después de esto, voy a mostrar
cómo averiguar qué necesita
cada comando y eso se hará usando
su documentación. Pero entonces ahora lo que queremos
hacer es querer ser padre del utilero a su control. Entonces ahora fíjate en lo
que estoy haciendo aquí. Sabemos que esto es un cubo y el nodo cubos se llama prop. Y reforzemos
eso diciendo el nombre aquí en
la caja del canal. Entonces, qué gran cantidad de
estos comandos
mayas, vas a usar
el nombre de los nodos. Y los nombres de esos
nodos serán cadenas. Así que recuerda una vez más, las
cadenas se crean
usando comillas. Puede usar comillas
simples o comillas dobles. Esa elección depende de usted. Voy a usar
comillas simples. Entonces voy a decir, voy a pedirle al nodo padre que
policíe
el poder y
el utilería, perdón, fui a como la
función padre a policía padre, el nodo prop al
nodo de control. Entonces, si tuviera que ejecutar
esta línea de código, en realidad
lo hará por mí. Déjame, déjame demostrar que
estos aún no están parentales. Y vamos a ejecutar eso. Y ahí tienes. Este es
el resultado que queremos. Y ahora aquí se puede
ver a los pro-negocios, están bajo el nodo de control. Así que vamos a ejecutar todo este
trozo de código desde cero. Excelente. Por lo que ahora está apadrinado. Y es algo así como hacer
¿qué queremos? Todavía quedan algunas
cosas que tenemos que modificar. Probablemente te diste cuenta de
que el círculo no
está en la misma posición
que lo teníamos antes. Es vertical y queremos que
quede plano en el suelo. Y tampoco es no es
el tamaño que queremos. Así que vamos a limpiar eso. Pero también, te
habrás dado cuenta antes de que
arreglemos
estos pequeños detalles, deberíamos limpiar nuestro código. Entonces te
habrás dado cuenta de que estamos
codificando duro los nombres que
queremos aquí por marketing, quiero decir, escribiendo las cuerdas directamente y estamos repitiendo
esos nombres aquí dentro. Entonces, una buena manera de saber
que tienes que empezar a usar variables es si
empiezas a repetirte, ya sea repitiéndote
o copiando pegando. Si te encuentras, por ejemplo copiar pegando este nombre, prop es una buena indicación que probablemente puedas
usar una variable. Entonces hagámoslo. Digamos, digamos que el nombre
de control será control. Ahora digamos que el nombre de
la geometría será prop. Ahora también fíjate
como tengo cuidado en unas variables mínimas para que no
tengan sentido
cuando las lees. Y vamos a reemplazar
esas cadenas, estas cadenas codificadas
con esas variables. Entonces este será tu nombre
apadrinado al nombre de control. Excel. Ejecutemos esto de nuevo solo
para asegurarnos de que todo esté bien. Excelente, lo es. Entonces ahora una vez más, el poder de las variables. Si desea nombrar este
control en lugar de CTRL. Y si quieres nombrar a
estos algún prop por ejemplo o algo más,
todavía funciona y
solo tienes que hacerlo en un lugar lugar de hacerlo en
múltiples lugares. Excelente. Así que vamos, sigamos
limpiando esto.
8. Modificar el control: Queremos hacer algunos
ajustes al círculo. Una de ellas es que queremos que
sea un poco más grande. Y también queremos que esté mirando hacia arriba en la dirección del eje Y. Entonces, ¿cómo podemos hacer eso? Como mencionamos antes, vamos, eliminemos esto ahora mismo, solo
ejecutemos las primeras
líneas para crear el círculo. Como mencionamos antes, podemos pedirle a Maya
que nos diga cómo hacerlo. Voy a aclarar la historia. Simplemente podríamos rotar esto aproximadamente,
ojalá apuntando hacia arriba. También podríamos hacerlo
un poco más grande. Entonces como decíamos, esto podría funcionar, podríamos robar el comando rotar
y escalar. Vamos a hacer
algo un poco más limpio, si se puede, un poco más, más fácil de controlar. Para eso. Tenemos que meternos en
el comando circulo. Entonces echemos un vistazo. Aún así, vamos a pedirle a Maya que nos
ayude un poco. Vamos a crear un círculo
desde este botón aquí arriba en el menú de modelado y
los círculos y superficies. Y voy a
crear un círculo de nurbs. Entonces, ¿qué está pasando aquí? Déjame hacer esto un
poco más grande. Mis ojos, claro, usando el comando circle que ya
estamos usando. Y está usando
algunos argumentos más. Ahora no necesitamos todos
esos argumentos, pero sí necesitamos algunos de ellos. Ahora bien esto podría ser,
esto podría parecer un poco confuso. Pero sé con un hecho
que r para radio. Entonces r en este caso es uno que podría querer sea un
poco más de uno, pero eso está bien por ahora. Y n son, toma tres valores. Y cuando estás, cuando estás convirtiendo de macho a Python, si ves tres valores, esto significa que esta es una lista. Y necesitarás
separarlos con comas. Así que vamos a ejecutar esto. Ejecutemos este comando de círculo
por sí mismo. Eso es genial. Veamos qué pasa si aumentamos
el, el, nuestro argumento. Permítanme borrar esta. Así que de nuevo, ejecuta el código. Y ahora eso es un
poco más grande. Entonces, ¿cómo sé esto y
cómo sé que nuestro radio significa? ¿Que necesitas revisar
la documentación? La forma más fácil de llegar a eso es aquí a través del menú de ayuda en el editor de scripts y haga clic
en la referencia de comandos de Python. Ahora, una vez que hagas clic en
eso, lo llevará a esta documentación de
Ayuda. Ahora bien, esta es la implementación para el mi aberración 2020. Y estos son todos
los comandos que
tienes disponibles en Maya. Entonces el que nos
importa
ahora mismo es el comando circle. Puedes usar esta barra
de búsqueda aquí. Y encontramos el comando circulo. Ahora, un par de cosas a tener en cuenta. Aquí arriba en la parte superior
derecha de esta sección. Puedes tener ya sea
la versión masculina o la versión Python. Y queremos estar en la versión
Python, claro. Esta sinopsis aquí,
esta es
una especie de resumen de los comandos
que están disponibles para usted, lo siento, de los argumentos
que están disponibles para usted. Ahora bien, todas estas son las opciones de
argumentos que puedes aplicar a este, este comando. Ahora bien, si te desplazas un poco hacia
abajo, y ojalá pudiera deshacerme de esto aquí mismo, pero no
puedo ahora mismo. Ella se desplaza un
poco hacia abajo. Ves flujo. Flujo es otra
palabra para argumentos. Se pueden ver todos ellos. Entonces algo a tener en cuenta
también es que cada flor, cada argumento tiene un
nombre largo y un nombre corto, por
lo que vimos son un NR, que es un poco
críptico en mi opinión. Entonces si nos desplazamos un poco hacia
abajo, vamos a tratar de encontrar a nuestros curadores son el
nombre largo para r es radio. Ahora bien, si ves aquí, esto te está diciendo
el tipo de valor, argumento, tipo, tipo de valor que mis ojos esperan para
este argumento específico. Cubriremos la mayor parte de esto. Booleano es básicamente un verdadero
o falso o sí o no. En el caso del
radio, lineal. Lineal significa un número, ya sea un entero, que
es un número entero, o un float, que
en términos de Python de float es básicamente un número
con puntos decimales. Entonces en este caso, si quieres, realidad
te está diciendo aquí mismo que el argumento radius tiene
un valor predeterminado de 1.0. Estos porque tiene los
números decimales, esto es a flote. Pero por ahora piensas en
lineal como, como un número. Es un poco
desafortunado que Maya no use el vocabulario que usa
Python, pero está bien. Te conseguirás a través de eso
en este caso en secciones. Así que está esperando un
int cuando es lineal, en realidad
significa float o int un entero en
short for integer. Entonces esa es la primera. Ahora el otro
que nos importa. Como mencioné, es una R. Ahora, N-R significa normal. Normal es esencialmente un vector. Es la línea que, déjame volver a mi anuncio, explicarte esto un
poco mejor. Es la línea que es paralela al plano
que estamos tratando. En este caso, lo normal
básicamente está subiendo de esta manera. No vamos a entrar en los detalles de cómo
crear vectores y todos esos detalles más específicos. Pero por ahora, solo tenga en cuenta que
esto toma tres valores. Puedes pensar en estos
valores generalmente como tus ejes x, y y z. Y tenga en cuenta que
tiene estos corchetes. Ahora bien, estos corchetes
significan que es una lista. Nos vamos a
meter en listas muy pronto. Pero al menos es básicamente una lista de valores o
colección de valores. En este caso, se esperan
tres valores específicos. Entonces ahora que sabemos eso, volvamos a Maya. Oh, lo siento. Antes de que me olvide, si te
desplazas todo el camino hacia abajo, usualmente
tendrás ejemplos
y esto es realmente genial. Esto es muy útil porque mi, mi otra recomendación te
da ejemplos de cómo usar el comando. Así que puedes
ejecutar esto muy fácilmente y ver
cómo funcionan las cosas. En este caso, esto es
usar el argumento normal, que es lo que nos
importa ahora mismo. Y si cambias
a la versión masculina, verás esos mismos
ejemplos en el libro de texto Nelson. Estamos usando Python en este momento, así que vamos a pegarnos a comprarlos. Bien, entonces volvamos. De hecho, cambiemos
al nombre completo de
estos argumentos. Ahora, en el caso
de los comandos mayas, puedes usar tanto el nombre
corto el nombre largo
que depende de ti. Mucha gente
prefiere el nombre largo. Pero cuando es fácil escribir, prefiero ser un poco más explícito y simplemente
escribir el juego largo. Voy a hacer el radio
un poco más grande que el predeterminado, que es 1.0. Yo también voy a lograrlo. Podría escribir dos o 2.0 o
2.5, lo que quieras. En este caso, voy
a dejarlo como cierto. Ahora por lo normal. Vamos, juguemos un poco. Digamos
que queremos esté mirando hacia el eje x. Ahora bien, si notas aquí, en caso de que no estés familiarizado con este eje aquí abajo en
la esquina inferior izquierda. Esto te está diciendo qué, qué actos es lo que estás viendo. Entonces esto es x, esto será z, y luego hacia arriba, ese
será el eje y. ¿Qué pasa si ejecutamos esto? Bueno, nuestro círculo estará
apuntando hacia el eje x. Pero una vez más, queremos que esté apuntando hacia el eje y. Ahora bien, como mencioné, estos valores representan un vector, así que no es del todo el eje. Pero por ahora, para este ejemplo, para nuestros propósitos, se puede
pensar en ellos como solo los ejes x, y, y z. Y una vez más recordemos ese
menos esperando una lista, y eso se hace a través esta notación de corchete
que tenemos aquí. Pero nos meteremos en
eso muy pronto. Entonces vamos a ejecutar este control
ocho, resaltar todo. Control Enter para ejecutar mi código. Excelente, Esto se ve
un poco mejor. Entonces este círculo es un
poco más grande, más fácil de seleccionar. Ahora podemos animarlo. Y claro, está
manejando el cubo. Excelente. Entonces, ¿qué más podemos hacer? Veamos si hay algún
bicho que podamos encontrar. Hay uno y es
un error un poco importante. ¿Qué pasa si
ejecutamos el mismo código? Una vez más, obtenemos un
error. Es genial. Los errores son buenos porque te
dicen exactamente lo que está mal. Entonces esto te está diciendo que
más de un objeto coincide con el nombre prop. ¿Cómo es eso posible? Entonces ven aquí tenemos dos geometrías que
tienen el nombre prop. Este es este cubo de aquí. Y parece que tenemos
dos curvas distintas. Ahora recuerda que
mencionamos que cada vez que Maya, cada vez que damos, le damos
el argumento del nombre, Maya intentará usar el
nombre que le dimos. Pero si ya existe, agregará un número, que es, que es el
caso aquí, agregó uno. Entonces eso significa que nuestro, que cuando estamos tratando de
alimentar y controlar, sondear o arrepentirse, control
productivo. Control. Es engañoso porque esta es una anterior
que creamos. No es realmente el más nuevo el que tiene el número uno en él. Ahora, veamos un claro
ejemplo de esto. ¿Y si simplemente creo
algunos círculos diferentes? Permítanme destacar un
pedazo del círculo loco de Kodak. Ejecutemos este código tres veces. Tres. Ves el
primero tiene el nombre que yo, que yo, que quiero tener
o darle al círculo. Pero ahora los otros
tendrán este sufijo, este número extra en ellos. ¿Podemos evitar esto? No, no podemos. Maya tiene una manera de
asegurarse de que los nombres de los
nodos sean únicos. En el caso anterior. Creo que debería aclarar esto. En el caso anterior, sólo
voy a
ejecutar el código dos veces, va a fallar de nuevo. Prob tiene el mismo nombre. Esto se debe a que como nota, propiedad en realidad está
anidada bajo otro nodo. Entonces en este caso, mi permite que eso suceda. Pero no te preocupes por eso. Eso es un eso es un detalle que no te
va a afectar
demasiado por ahora. Entonces, ¿cómo hacemos frente este caso cuando mi SID y números
extra extra
a nuestros nombres Vamos a llegar a eso.
9. Deep Dive - Ayuda y documentación: Antes de continuar, demos un
paso atrás y hablemos un poco más
de documentación. Así que volvamos a la
página de documentación aquí una vez más, para llegar a ella, puedes ir desde el editor de guiones
en el menú de ayuda. Haga clic en la referencia
del comando Python. Y te traeré
a esta página aquí. Ahora, todos estos ejecutan
otros comandos que están disponibles para usted en
la
biblioteca de comandos Maya , la biblioteca CMBS. Están organizados por
categorías. Entonces, por ejemplo tienes los de
animación aquí. Estarás usando
estos bastante. O tienes la parte
de búsqueda aquí. Entonces veamos el otro
comando que estamos usando. Oh, en realidad, tal vez echemos un
vistazo al cubo. Ahora. Una vez más, un resumen rápido. Tienes por aquí en la esquina superior derecha
de esta sección, puedes cambiar entre versiones
macho y Python. Nos quedaremos con
la versión Python. Sinapsis. Synapsis tiene un resumen de los argumentos que
puedes tener disponibles
en este comando. Hay una pequeña descripción. Y lo más importante,
en la parte inferior, la
hay,
habrá ejemplos. Esto será lo más útil para ti cuando empieces
a usar un nuevo comando. A veces puedes obtener
toda la información que necesitas probando
ahora estos ejemplos. Genial. Entonces, cuanto más aún
parte de esto es la bandera, la sección de flujo,
también conocida como argumentos. Cada bandera o argumento
tiene un nombre largo. Así,
historia de la construcción o un nombre corto
él H. Depende de ti
si quieres usar un nombre corto o largo. Normalmente recomiendo un nombre largo porque son más explícitos, pero cada persona tiene
preferencias para esto. Tienes las descripciones
de los comentarios aquí. Ahora un argumento escribe,
como dije antes, es un poco desafortunado
que Maya no siempre use los nombres que corresponden
al tipo Python. En este caso, lineal
en realidad significa flotante, que es un número con
decimales en él. Ain't existe en Python
en este corto para entero, que es básicamente un número sin decimales, en este caso, uno por sí mismo
sería un entero, punto algo
sería un float. Siempre que veas estos paréntesis, esto significará una
lista o una tupla. Llegaremos a eso muy pronto. Lo harás, probablemente te estés
dando cuenta de que hay, ahí están estas cartas
aquí. ¿Qué significa esto? ¿En inmuebles? Esto significa que puedes usar estos comandos
cuando estés creando, consultando o editando el nodo o el objeto para el que
estás usando esto. En este caso, la construcción del historial de construcción de montón
fijo
solo se utiliza para crear
y consultar. La mayoría de los otros
argumentos se pueden utilizar para la edición. ¿Qué significa esto? Esto significa que se puede usar el mismo argumento en
el mismo comando, en este caso un poli cube. Puedes usarlo
para crear un nuevo cubo. Puede usarlo para consultar información de
un cubo existente, o puede usarlo para editar
un cubo existente, por ejemplo, si desea cambiar
el ancho de su cubo, usará el indicador de
edición para eso, pero
también llegaremos a eso en, en otros proyectos. Ahora, hay otras formas de
obtener ayuda de Maya. La principal, para ser sinceros, es esta página que acabamos de ver. Probablemente el segundo mejor lugar
para hacerlo es el propio Google. Y Google en sí mismo puede ser una habilidad que
querrás desarrollar. Pero sí recomiendo normalmente escribir lo que
quieras hacer. Y por ejemplo digamos que querías
encontrar el comando actual que padre mi Python. Esto generalmente te dará un buen ejemplo o un buen resultado, ya sea de vuelta a la
documentación. Solo ten en cuenta que a veces
obtienes una versión anterior de Maya o podría enviarte
a algunos otros sitios web. Uno de ellos que es muy, muy útil
será StackOverflow. Esta es una comunidad
para desarrolladores. Y hay mucha ayuda para preguntas
muy específicas
respondidas aquí. Por lo que sí recomiendo
buscar ayuda en StackOverflow, ya sea directamente Google que TI, o en la barra
de búsqueda de un StackOverflow. Siempre hay muchos foros. No puedo recomendar
ninguna específica. Hay muchos foros de artistas
técnicos que te
darán alguna ayuda. Así que definitivamente no tengas
miedo de buscar en Google tu, tu información o errores
que puedas tener porque Google
será tu mejor amigo en tu carrera de desarrollo. Entonces, ¿de qué otra manera podemos obtener ayuda? Déjame abrir una nueva pestaña de Python. Una forma de obtener ayuda es
literalmente escribir en salud. Ahora help es una función incorporada dentro de Python que
toma una función. Y lo hará, si la función tiene alguna documentación
dentro de
ella, le dará
esa información. Así que vamos a importante biblioteca CMBS. De hecho, ejecutemos la ayuda de
CMBS directamente. Para ejecutar esto. Ahora, ve que
le dio toda esta información. Esto es mucho. Esto es básicamente lo que
los desarrolladores de la biblioteca CMBS ponen dentro de esa recomendación
de la biblioteca, y todo esto está
disponible para ti. No es muy minucioso
para ser honesto, pero es algo y en realidad te dice dónde puedes encontrarlo en tu computadora. Estos casos, este camino, y todas las funciones
que se encuentran dentro de él. Podríamos por ejemplo este cheque ABC importante
en olímpico importante. Ahora bien, fíjate que para
verificar la ayuda, no
estoy ejecutando la función. Perdón por eso. No voy a agregar el paréntesis porque
no quiero ejecutar la función. Yo sólo quiero conseguir
la ayuda de él. ¿Bien? Bueno, esta
sí tiene mucha ayuda, lo cual es lamentable, pero a veces
obtendrás alguna ayuda de
esta función de ayuda. Déjame, déjame,
déjame encontrar una función
que pueda ser útil. Éste podría tener mejor
ayuda. Sí, ahí tienes. Simplemente echó un
poco de descripción, pero es lo suficientemente útil. Incluso te da
una recomendación que es genial, excelente. Otra forma de obtener ayuda, especialmente con la biblioteca de comandos
Maya, es habilitando la ayuda rápida. Ahora esto está en el menú de comandos. Mostrar Ayuda rápida. Obtendrás esta pequeña, esta pequeña sección de aquí. Puedes encontrar información,
encontrar tus comandos. Digamos, volvamos a encontrar
poli cube. Ahora bien esto no
tiene ningún detalle, pero tendrá los argumentos
que tienes disponibles. Por ejemplo, hemos estado usando. Volvemos a esta pestaña. Hemos estado usando
el argumento name. Entonces ya sabes que eso
viene de ahí. 11. 11 te dice
que es una cuerda, lo cual es muy bonito. Otro es aparente yendo. Eso es genial. Entonces no es muy detallado, pero es suficiente para
que
al menos puedas saber de un vistazo qué argumentos tienes a tu
disposición. No suelo usar esto, sobre todo porque le
quita espacio
al editor de guiones, pero es útil
de vez en cuando. Entonces voy a apagarlo. Otra forma de obtener ayuda es
mediante esta ayuda Mostrar información sobre herramientas. Ahora bien, la forma en que esto funciona es, digamos que empiezo a escribir
el comando circle. Cuando abro el paréntesis, verás estos Tooltip. Ahora bien, esto es similar a
cuando pasas el cursor sobre como un botón de repisa. Te dará algún tipo
de información sobre herramientas de desplazamiento hacia arriba, ayuda de información sobre
herramientas que sucede
cuando pasas el cursor sobre algo. Te dará que
tiene un poco
más de información. Y tiene el, los tipos de
argumento. Y también los argumentos son banderas que están
disponibles para ese comentario. Este, personalmente,
es un poco intrusivo
porque cubre mi código y realmente no me gusta eso. Pero es una buena opción. A mucha gente le gusta y es una buena opción
para conocer. Generalmente lo tengo apagado, pero una vez más, se
reduce a preferencias personales. Entonces esa es una buena visión general
de las formas de obtener ayuda. Volvamos al código.
10. Trabajar con nombres de nodos y listas: Para encontrar qué nombre es Maya
usaremos o estamos usando una vez
que creamos nuestras notas. Veamos el resultado de
esta función aquí mismo. Así que comencemos en el resultado en
una variable llamada control. Ahora bien, no se confunda
entre el nombre de esta variable y
este control de cadena porque lo son,
son muy diferentes. No tienen nada que
ver el uno con el otro. Yo de hecho, evito confusiones. Voy a cambiar estos
dos pasos de control. Entonces, vamos a correr eso. Y vamos a imprimir la
salida de control. Esta, esta variable que
estábamos almacenando la salida, la salida del comando circle o la función circle
en esta variable. Vamos a ejecutar eso. Sólo para que sea un
poco más limpio. Borremos esto. Déjame aclarar mi historia. Y ahí tienes. Entonces esta es la salida. Ahora fíjense que hay dos, una vez más, tenemos
estos paréntesis. Esto quiere decir que es una lista. Ahora esta celda está con
dos cuerdas en ellas. No te preocupes por la
u. U significa Unicode, pero para estos fines es esencialmente
lo mismo que una cadena. Así que no te preocupes por la UE. Te das cuenta de que tenemos el control. Tenemos algo más
llamado Hacer círculo nervioso. Uno es un poco críptico. Ahora, vamos a ejecutar esto
un par de veces más. Ahora, ya verás que la
segunda vez que lo ejecutamos es aquí. En realidad tenemos el nombre
del nodo que Maya creó. Entonces, ¿qué significa esto? Digamos que voy a
copiar y pegar esto
aquí abajo solo para que quede
un poco más claro. Ahora bien, el primer ítem de la lista, este es el nombre real
del nodo que creé, que es lo que
queremos saber, ¿verdad? Déjame simplemente deshacerme de la U. Una vez más, la UE no
importa. Puedes dejarlo
ahí si quieres. Pero por ahora me voy
a deshacer de él. Y luego está esta cosa. Este es el, este es
el constructor
del nodo que
utilizan los mayas para crearlo. ¿Qué significa eso? Vamos, hagamos
otro ejemplo. Haciendo lo
mismo con el cubo. Creo que esto podría ser un
poco más claro. Así que vamos a almacenar el
resultado del cubo. Esta variable llamada prop. Permítanme borrar este
círculo que he creado. Ahora voy a destacar
sólo estas dos líneas de código. Te estás dando cuenta de que no estoy
resaltando a los otros. Esto se debe a que una vez que
ejecutas estas líneas de código, una vez que
Maya las atrape, maya básicamente almacenará el último valor de
estas variables, lo cual puede ser muy conveniente. Entonces en este caso,
mi ya una vez, una vez que ejecuto estas
tres líneas de código, mi ya guardó el nombre de esta variable o el
valor de esta variable. Entonces ahora puedo simplemente ejecutar
estas dos líneas de código. Y lo hará,
funcionará igual de bien. Entonces hagámoslo. Hagámoslo tres veces también. Entonces, una vez más, note que mis manos usando el
nombre que sugerí, que se almacena en la variable
geo name, que es prep, esa es
la cadena de valor. Pero como se trata de encontrar que cualquiera de ellos ya fue creado, es agregar esos nombres
y el resultado de cada uno, cada uno de esos comandos. Una vez más, es el
nodo real que se creó. Y luego este constructor. Ahora, no te
preocupes por estos a partir de ahora. ¿Por qué nos importa
es este primer valor? Entonces, ¿cómo accedemos a ese valor? Bueno, como dije, déjeme pegar de nuevo. Déjame pegar esto de
nuevo aquí abajo, solo para que sea un
poco más
fácil de ver y deshacerse de EU porque no
necesariamente lo son ahora mismo. Esta es una lista. Como mencioné antes, ya
sabes que es Alice
por estos corchetes. Y alist es básicamente
una lista de ítems, una colección de valores. Puedes tener enteros, que son solo números. Puedes tener cuerdas, puedes tener una mezcla de ellas. Ahora en este caso, es
solo una lista de cadenas. ¿Cómo puedo, cómo
obtengo el primer artículo? Lo hacemos usando
otra notación de corchetes. Ahora bien, a la hora de
contar en programación, y esto será cierto para la
mayoría de los lenguajes de programación, pero sobre todo en Python, empezamos a contar a cero. Entonces el índice o la posición, o digamos que el número
de este ítem es cero, entonces esta es la posición cero, y luego esta es la posición uno. Ahora vamos a cubrir menos
que más detalles muy pronto. Pero por ahora, sepa que para obtener el primer ítem de esta lista, lo
vamos a conseguir
a través del índice cero. Empezamos a contar a cero
por diversas razones. Es un estándar muy común, un estándar en lenguajes
de programación. Así que vamos a ejecutar esta línea de código. Vamos a imprimir esto. Ahora recuerda, estoy
imprimiendo el primer artículo, el artículo de la lista, y ahí tienes. Eso es
lo que estamos recibiendo. Entonces intentemos hacer esto
un poco limpiamente. Entonces llamemos a esto,
cambiemos esta variable. Vamos a llamarlo control. Vamos a llamarlo control. Ahora una vez más, sabemos que el resultado de eso es la lista con tanto el nombre del nodo como
luego el constructor, lo que no nos
importa en este momento. Llamemos al nodo de control
será el primero, el primer ítem, el ítem de la lista de
control. Y ahora el nodo será
el primer ítem en eso, en ese resultado que
estamos obteniendo de Maya. Ahora bien, si esto es
confuso, no te preocupes. vamos a explicar Muy pronto vamos a explicar
listas de nuevo
con más detalle. Ahora, como se puede imaginar, ya no íbamos a estar
usando estos nombres. Estas se han convertido en
sugerencias para que Maya use tanto como puede ser cuatro, tiene
que agregar
números al nombre. Así que vamos a imprimir estas
dos variables aquí. Las nuevas variables
que creamos, así control nodo y luego nodo. Entonces ahora estas dos variables representan los
nodos reales que fueron creados. Ahí vas. Así que controlamos y prácticas es la primera
vez que las creamos. Si volvemos a ejecutar esto,
controlar una sonda, una, ejecutar esto muchas veces más. Ves que el número
crece a medida que ejecutamos el código. Esto es exactamente lo que queremos. Ahora. Arreglemos nuestro poder al mando. Entonces ahora queremos ser padres
del nodo de control creativo. Queríamos apaciguar
a la sonda. Nota. Permítanme borrar
estas dos líneas, eliminar algunas líneas y ejecutemos este código. Excelente. Entonces estos son los resultados con los
que estamos familiarizados. En realidad. No
, no funcionó. Oh, lo hice de la manera
equivocada. Queremos padre del
nodo prop al nodo de control. Queremos que el control sea
el padre del problema. Lo cual tiene sentido. Lo siento por eso. Depurando a medida que avanzamos. A partir de eso otra vez. Excelente. Entonces ahora esto es como esperamos, si nos movemos esto a un lado, volvamos a ejecutar nuestro código solo para asegurarnos de
que esto funcione. Genial. Ahora bien, esto es
controlado uno y gota. Una vez más, como ya dije, porque estos son cubo está
parentado bajo algo, mi permite que se
repita el nombre, pero eso está bien. Eso no nos importa porque recuerden, estamos recibiendo el nombre
directamente de Maya. No estamos adivinando ningún nombre. Mi strlen, ¿nos estás diciendo exactamente el nombre que usó
para crear ese cubo de poli? Sólo para verificar la cordura, hagamos esto una vez más. tercera vez es el encanto como
dicen. Y ahí vamos. Ahora tenemos todos estos. Ahora tenemos múltiples accesorios
trabajando al mismo tiempo. Hagamos un pequeño ajuste antes de pasar
a la siguiente lección. El pequeño ajuste
que quiero que hagas es esencialmente un ajuste de
flujo de trabajo. No sería bueno si
cuando creas tu plataforma, no
queremos estar
animando el cubo directamente. Lo más probable es que probablemente
queramos estar animando la plataforma. Entonces vamos, vamos a hacer que
seleccione ese control. Tenemos, estos son el comando
selecto es genial. Entonces veamos. Simplemente
podemos hacer eso. Cmbs Dot selecciona eso,
eso está funcionando. Y queremos seleccionar el nodo de control que
creamos, ¿verdad? Entonces es pasar el
nodo de control a esa función. Déjame aclararlo a través
de mi historia. Y volvamos a ejecutar el
código. Y ahí tienes. Ahora, en cuanto
crees tu preparación, podrás empezar a animar.
11. Extender la herramienta con declaraciones "si": Tenemos nuestro trabajo en ello
esencialmente hace lo que necesitamos. Pero hagámoslo un
poco más interesante. Yo sí dije al principio que el utilería no tenía
que ser solo un cubo. Agreguemos un poco,
mantengámonos algunas opciones más. Y vamos a introducir
también un nuevo concepto. Y esa es la declaración if. Si se le pregunta si pasa
algo, haga esto más o de otra manera
haga otra cosa, es
decir, que puede hacer un interruptor y elegir una opción diferente
dependiendo de una condición. Así funcionan las
declaraciones iif. Entonces, ¿cómo hacemos eso? Primero, vamos, identifiquemos dónde
cambiaría esa condición. En este caso estaría aquí, que es como el cubo. Sabemos que el control, no
queremos cambiar
eso donde solo quieres sea el círculo simple. Sólo queremos
cambiar la geometría. Entonces comencemos
cambiando la geometría. En lugar de que sea un cubo. Hagamos una esfera, por ejemplo, vamos a, una vez más, dejar que Maya nos diga lo que necesitamos. Este caso parece
esferas de poli, todo lo que necesitamos. Entonces, en realidad vamos a escribir
eso antes agregar la declaración que
significa, limpiar esto. Así que vamos a escribir una
vez más Pauli capital S. Ahora vamos a ejecutar este código. Ahora fíjate que el código es
exactamente el mismo que teníamos. Todos cambiamos el
cubo o la esfera de uno. Y ahí tienes.
El código funciona perfectamente. Bueno, igual que lo teníamos antes. Ahora, digamos que queremos,
digamos un cono. Bastante fácil, simplemente escriba
cono en lugar de esfera. Ver la belleza de la consistencia que Maya
proporciona, proporciona. Lo siento, me refería a escribir cono. Vamos a escribir eso. Perfecto. Entonces vamos, apegémonos
a esas tres opciones. Ahora sabemos que todo lo que necesitamos es depender de la
opción que queramos. Queremos cambiar eso,
ese comando o esa función. Ahora, agreguemos una variable que nos ayude a
decidir la opción. Vamos a llamarlo tipo. Y esto también será
una cuerda. Puede ser lo
que quieras, puede, también puede ser un número si
quieres decidir de esa manera. Pero para que sea más
fácil de usar, vamos a usar una cadena. Digamos que el valor por defecto
será en cubos. Ahora, fíjate que
lo estoy llamando
intencionalmente tipo prop, no solo tipo. La razón de esto
es porque hay una función incorporada en
Python que es type. Y no suele ser
una buena idea crear variables que tengan el
mismo nombre que las funciones incorporadas. Eso es porque si haces eso, tu código no se va a romper, pero básicamente vas a
anular la función que está integrada en Python y no vas a
tener acceso a ella. En este caso, no
necesitamos esa función, así que está bien hacerlo. Pero es en general, es una buena práctica
no hacer eso. Voy a decir prototipo. Voy a decir
restablecerlo como cubo. Por ahora. Vamos a decir si el
tipo prop es igual, igual a qb. Ahora presta atención aquí y
estoy diciendo dobles iguales. En lugar de un solo igual, cuando usas un solo igual, estás asignando un
valor a una variable. Estás usando un doble igual, estás haciendo una comparación. Y ahora aquí viene algo, algo nuevo llamado sangría para que podamos trabajar dentro
de esta declaración if. Vamos a tener que
sangrar esto dentro de él. La sangría estándar
en Python es cuatro espacios o así
que de nuevo, 1234. O también podrías usar la pestaña, en este caso, la parte superior
justo encima del bloqueo de mayúsculas, junto a la tecla Q. En este caso, Maya guionado
o en maya traducido, se traduce a tap
a cuatro espacios. Solo ten en cuenta
que en general, es una buena práctica tener las bases de fuerza en Python 1234. Ahora voy a usar una tabulación
porque es equivalente, porque estamos dentro de Maya. Si estuviéramos dentro de
algo como Bloc de notas, por ejemplo esto aquí, la pestaña. Déjame hacer eso un poco. Digamos solo a una, entonces esta es una ficha. Se trata de cuatro espacios, 1234. No son lo mismo. Entonces esa es una distinción muy importante. sangría es algo
que hace que Python sea muy fácil de leer porque
no necesitas mucha sintaxis extra, pero sí necesitas estar al
tanto de la sangría. Si hay menos sangría
desactivada por un espacio, vas a obtener un error. Eso lo podemos ver en un poco. Así que una vez más, si el tipo
prop
es igual, es igual a cubo, entonces
vamos a hacer eso. En realidad. Tipo cono. Entonces digamos cubo. Ahora digamos l. Si esto es el equivalente a
decir otra cosa si. Pero en este caso hay que
escribir LF prop type equals, equals b or e.g. Poland. Ahora fíjese que al
final de la declaración if, estoy escribiendo una columna. Esto es muy importante.
Si no haces eso, Python te dará un error. Y también notar que después los dos puntos cuando
escribo entrar Maya, guionado o en Maya automáticamente me da
ese espaciado porque sabe que tengo que
inventar algo ahí esa otra sentencia si. Entonces este caso, vamos, vamos a copiar esto. Ahora. Esfera en lugar de cubo
o esfera, perfecta. Y ahora la última opción de la que
hablamos fue un cono. Entonces el prototipo LA es igual,
igual a colon, colon. Vamos a copiar y pegar esto. Y tal vez veas ya
una redundancia en este código, lo cual es genial si hiciste
bien por ti, Bien hecho. Si no, voy a mencionar
eso en un segundo. Así cono de poli. Excelente. Ahora bien, qué pasa si, ahora recuerda, perdón, esta, esta variable, estamos comparando esta cadena con el valor
de esta variable aquí arriba. Ahora, ¿qué pasa si
no hay opción que aceptemos? Vamos a tener un
valor por defecto, digamos. Entonces para eso se puede
decir otra cosa, si no. Vamos a asignar. Digamos que el
valor predeterminado será cube. Digamos también al usuario que no
proporcionó un valor en, que estamos usando
un valor predeterminado. Entonces hay una función llamada
advertencia, igual el abordaje. Y la advertencia nos permite simplemente
dar una opción
inválida a un mensaje usando cube x Así que este podría ser
un mejor mensaje, pero en realidad opción de tipo
prop inválida usando cube como defecto. Ahí vas. Eso es un
poco más claro. Excelente. Así que vamos a ejecutar este código antes de
sumergirnos en él un poco más profundo. Déjame limpiar
un poco mi espaciado y
tal vez un espacio más, pero nos ponemos un
poco más fáciles de leer. Ahí vas. Bien,
así que vamos a ejecutar este código y conseguimos un cubo. Ahora, agreguemos escriba
otra opción. Digamos una esfera. Ahí vamos, obtenemos una esfera. Ahora bien, ¿qué pasa si
tuviéramos que hacer una mesa, por ejemplo esta? Ahora siéntete libre de
pausar el video ahora mismo e intentar adivinar
qué va a pasar. Así que vamos a correr eso. Ahí vas. Entonces veis
que tenemos esa advertencia aquí. opción de tipo prop no válida está en Cuba por defecto
y obtuvimos un cubo. Entonces lo que pasó ahí
es que dado que
el, el valor no coincidió con ninguna
de estas opciones
que nosotros, que pusimos ahí, entonces
estamos incumpliendo con la otra. Ahora también note que
esto distingue entre mayúsculas y minúsculas. Entonces si escribo esfera con una S, S
mayúscula en vez
de S minúscula, vamos a conseguir otro cubo. Y estos están molestos porque compensan porque he movido
el otro anteriormente. Así que vamos a probar nuestra última
opción que es un cono. Excelente. Ahí vas. Entonces ahora el total es un
poco más robusto. Tenemos más opciones. Y esto es genial. Incluso
podrías haber hecho tres botones de repisa
y simplemente cambiar esta variable y te
dará las tres formas
diferentes. Así que profundicemos un poco en el
código. Una vez que puedo notar
que estamos usando la declaración if para
validar o condicionar. Esto se llama una condición. Estás, estás
haciendo una comparación. Estás diciendo que si esta
variable es igual a este valor, entonces vamos a
crear un polígono. De lo contrario, si esta variable es igual a
este otro valor, vamos a usar
esta otra función. Y al final tenemos, digamos una declaración
else en blanco. No tenemos una condición
específica que estamos comprobando como en esta
otra declaración if. Esto básicamente es decir lo contrario si pasa
algo más, aunque esto, ahora esto no
es necesario. Puedes tener una declaración if
solo por sí misma y
funciona, funciona, funciona bien. Esto es solo darle
más flexibilidad para tener condiciones adicionales o un poco de un tipo de situación general que es lo
más en este caso. Genial. Entonces sí mencioné que había una
redundancia en este código. Y esa es esta línea de aquí. Así que recordamos
una vez más que
si ejecutas el comando poly cube
y me dejas simplemente hacer eso. Si simplemente selecciono esa
función y la ejecuto, verás el resultado. Maya te da el resultado. Ese es el nombre del nodo. Y luego está esta
otra forma que es lo que está construyendo
el cubo en este caso, pero no nos importa para estos fines.
Pero así es como lista. Una vez más, recuerda que la
lista está con los corchetes. Y la cosa es que lo que nos
importa es el primer
ítem de esa lista, en este caso el nombre
del nodo que se creó. Y accedemos a eso
a través de esta indexación. Entonces esta notación,
empezamos a contar a cero cuando se trata
de listas en Python. Entonces accedemos al primer índice, al índice de ceros, y lo
asignamos a esta variable. Ahora hay redundancias que estamos haciendo
lo mismo cada vez. Entonces no importa. No importa
qué comando ejecutemos. Seguimos almacenando ese
resultado en el mismo, el mismo nombre de variable, ¿verdad? Entonces sólo tenemos que hacer esto una vez. Entonces, eliminemos esta sangría y saquemos eso de las declaraciones
if else. Y ahora no necesitamos
estas líneas aquí dentro. Ahora, preste atención aquí
a la sangría. Sangría una
vez más, observe que esta variable de barra de utilería está
sangrada bajo el if. De lo contrario, si declaraciones. Y el
nodo final real que estamos obteniendo está fuera
de esas declaraciones. Eso es importante. Porque una vez más,
si sangramos aquí, si sangramos esto, ahora esto se ejecutará sólo
dentro de la sentencia else. Y si nosotros, si ingresamos la declaración if en
ella al principio, nunca
llegaremos a eso. E incluso podríamos obtener un error. Vamos a sacar eso
de esas declaraciones. Y además, si
aún no era obvio , ellos tienen, tienen declaración. Las declaraciones if-else
funcionan como un interruptor. La primera vez que, si coges la
condición la primera vez, se detendrá ahí, no pasará a las
siguientes condiciones. Si esta condición no es cierta, intentará pasar a
la siguiente de lo contrario. Entonces siguiente de otra manera a
la última 1 barra, si puedes, si
se cumple la condición en alguno de esos pasos anteriores,
se detendrá ahí. Genial. Así que vamos a ejecutar esto solo para asegurarnos de que no
hemos roto el código. Ahí vas. Cono. Una vez más. Esfera. Excelente, esto está
funcionando como esperábamos. Ahora, veamos qué pasa
si cometiste algún error. Y hay muy
buenas posibilidades de que lo hicieras. Y si lo hiciste, es
increíble porque los errores te permiten
aprender mucho más rápido. Entonces digamos que
que tu sangría
aquí fue un poco, o en realidad esto podría estar bien porque es
la misma declaración if. Para probar ese punto. Vamos, agreguemos algunas declaraciones
impresas. Cubo auxiliar de impresión. Déjame cambiar esto
aquí arriba a la a en cubos, así entramos esa declaración IF. Entonces ahora cuando ingresemos a
esto, debería imprimir grado
en un cubo ahí. Excelente. Ahora para probar mi punto
sobre la sangría, eliminemos un espacio
para esta invitación. Ahora bien, fíjate que estas dos
líneas de código no están alineadas. Ahí tienes,
obtienes ese error. Esta es la importancia
de la sangría. Siempre que tengas
múltiples líneas de código, una tras otra,
la sangría en ellas tiene que coincidir. Y en general, solo
apégate a cuatro espacios. O si estás trabajando dentro de
un editor de texto de codificación, que van a
estar haciendo muy pronto. Usar la pestaña
será más que suficiente. Hagámoslo a escala de nuevo
a la normalidad. Excelente. De hecho me voy a deshacer de esa línea porque realmente
no la necesitamos. Y lo otro que
mencioné fue la columna. Si no tienes esa
columna por alguna razón, déjame borrar la ventana de salida. Te dará un error de sintaxis. Sintaxis significa que
no se le da la sintaxis ni escribe
los caracteres que
Python espera de usted. Lo que es genial, y esto
va a ser muy útil. Observe que
tiene todos estos. Esto se llama rastreo de pila. Stack rastrea los pasos que conducen al error
que se encuentra. Y Maya muy
convenientemente te da la línea donde falló tu código. En este caso,
línea por línea 13. Ahora dice la línea 13, pero en realidad es la
línea justo antes. Pero realmente te dice el, el lugar donde falló. No siempre va a hacer
eso en este caso, es muy claro y realidad
no
te dice lo que falta, sino que te dice
el área general. Para que puedas, puedes volver y revisar tu código
e intentar encontrar el error. Entonces eso va a ser muy útil. Ahora antes de que
terminemos el video, hagamos
otra cosa que
haga que nuestro código sea un
poco más agradable. Agreguemos algunos comentarios. Entonces por ejemplo aquí en la línea siete, justo antes de
crear este círculo, ese es nuestro tipo de control, la clave libra o el signo
numérico o hashtag, quieras llamarlo. Y solo escribe una nota. Solo voy a escribir
crear control para break, e.g. Este es un comentario. Este no es un código que se
ejecutará. Python esencialmente lo ignora. Esto es solo
para que escribas una nota para ti mismo o para quien más vaya a estar
ejecutando tu código. Ahora, vamos aquí, Digamos que
crear geometría debería decir geo basado en el tipo sería
lo suficientemente claro y rodar hacia abajo aquí. Aquí es donde obtenemos el nodo
real que se creó. Nodo creado. Y aquí no lo están, IR A troll. Después hemos seleccionado. Voy a seleccionar esta
muy autoexplicativa. Yo diría que el padre también se explica
muy por sí mismo, así que no me importa
el otro comentario, pero dejémoslo ahí. No hay una regla general
cuando se trata de comentarios. Está a su discreción. Demasiados comentarios pueden
obtener sobre el código de la oblea. Pero ningún comentario también puede hacer que sea más difícil entender lo que está
sucediendo en tu código. Así que encuentra tu propio saldo a la hora de
escribir comentarios. A veces nuestra
variable bien nombrada, por ejemplo prototipo, podría no necesitar
un comentario coseno en sí mismo. Es muy autoexplicativo, así
mismo que el nombre de control, el nombre GO, una función bien nombrada, y vamos a estar creando
nuestras propias funciones muy ciertas también podemos evitar la
necesidad de comentarios, por ejemplo padre es muy
autoexplicativo. Seleccione. No hace falta decir
qué van a
hacer los selectores porque sabes exactamente
lo que va a hacer. Entonces sí,
tal vez podríamos agregar algunos más, pero creo que esto es lo suficientemente
bueno por ahora.
12. Buca profunda - "si" Declaraciones y booleanos: Hablemos de declaraciones if. Si las declaraciones son muy simples y para
entenderlas completamente, hay
que estar familiarizado
con dos conceptos. Una de ellas son las condiciones, también conocidas como declaraciones
condicionales. Y esta es la base
de una declaración if, porque yo soy la declaración IF básicamente
está diciendo, si esta condición es cierta, hacer algo, de lo contrario,
hacer otra cosa. Lo que esta condición o, o no hagas nada si
tú, si quieres. Y
a lo que se reduce esta condición
las declaraciones es algo llamado
un tipo de datos booleano, llamado booleano,
también conocido como cuenco. Es un tipo de
datos muy simple que puede tener uno de dos valores, ya sea verdadero o falso. Se llama un valor binario, puede ser como un cero o uno, esencialmente un
valor sí o no, verdadero o falso. Cierto. Ten en cuenta la T mayúscula Esa es la sintaxis
para Python o false. Entonces hagamos un ejemplo. Vamos a crear una variable, solo un número simple,
num es igual a diez. Sólo por el bien de un ejemplo. Vamos a decir
si num es igual, es igual a diez, vamos
a imprimir si, por ejemplo, lo contrario, vamos a imprimir. No. Excelente. Vamos a ejecutar este código.
Bien, lo siento, ese fue mi mal. En realidad no estoy
imprimiendo nada. Déjame arreglarlo. Ahí vamos. Ahí vas. Ahora estamos imprimiendo. Sí. Ahora bien, si cambiamos
esto a ser un nueve o imprenta
y no, Excelente. Entonces, vamos a analizar
lo que está pasando aquí. Esta es tu
condición aquí mismo. Num es igual a diez. Ahora fíjate, bueno, antes que nada, tomemos nota, ¿existe
la intención aquí? Y en el caso de este error, cada vez que presione enter, me
va a dar esa
sangría automáticamente. Pero recuerden que Python necesita inundación y por
lo general son cuatro espacios. O en el caso de mi editor de
programación ahora mismo, va a ser una tabulación, que será el
equivalente a cuatro espacios. Eso es muy importante. Si no tenemos eso,
Python lanzará un error. También observe la columna
al final de las, las declaraciones if y else. Pero eso es muy importante. Así que ahora volvamos a esto. Esta es tu condición.
Lo que estamos haciendo es decir, básicamente preguntar, ¿
el número es igual? Ahora igual, igual,
esto es una comparación. Se llama comparación
o por operador. Y un solo signo igual
es un operador de asignación. Entonces básicamente significa que un solo signo igual
asignará un valor a algo, en este caso una variable. Y un
signo doble igual intentará
hacer una comparación entre
dos valores diferentes. Excelente. Entonces hay diferentes tipos
de operadores de comparación. No vamos a mencionarlos todos porque el foco de este video va a estar en
If Statements y booleanos. Pero déjame
mostrarte un par más. Lo opuesto de los
iguales, iguales no iguales. Esto es un signo de exclamación. Y un solo igual
se llama
nulo igual y comprueba
lo contrario. Entonces se pregunta ¿el
número o el num es variable no es igual a diez? Entonces si ejecutas este código, sí, nueve no equivale a
diez, alrededor de 20. Tan cierto, 20 no
equivale a diez ni diez. Bueno, ahora eso no es cierto
porque diez es igual a diez, por lo que no cumple con
esta condición. Excelente. Entonces
hagamos un ejemplo más. Digamos que estamos comprobando
un rango de números. Digamos que se le pregunta si el número
es menor que cero. Digamos que queremos que
nuestro rango vaya 0-100 si el número
es menor que cero. Demasiado bajo, Vamos a traer demasiado bajo. Si esto tiene sintaxis específica l, si le permite verificar
otra condición, L, si el número es
superior a 100, dirá demasiado alto. De lo contrario, no estamos comprobando ninguna
condición específica de lo contrario. Lo que vamos a decir,
número dentro de rich, que es uno que tengo un error de sintaxis porque
aquí nos faltan los paréntesis. Excelente. Número conseguido dentro del rango. ¿Qué pasa si vamos al 100? ¿Número dentro del rango? 101? Alto, y solo por
el bien de la finalización, menos cinco es demasiado bajo. Excelente. Así que recuerda que dije que las declaraciones
condicionales
básicamente se resumen a un booleano, ya sea verdadero o falso. Entonces, vamos a ver eso. Veamos ese ejemplo.
Permítanme borrar todo esto. Y asignemos esto, esta comparación a una variable. Llamaremos a una impresión a. Entonces, ¿qué estamos, qué
estamos haciendo aquí? En realidad non ya no
existe, así que no puedo hacer eso porque
borramos esa variable. Vamos a hacer algo sencillo que hicimos al principio. Entonces cinco es igual, igual a cinco. Entonces estamos asignando el resultado de esta comparación
a esta variable. Ahora, trata de pensar
lo que va a pasar. Es tocar eso. Y es verdad. Cinco es igual, igual a cinco. Genial. Ahora, digamos
que son cinco o menos, o es igual a cinco. Es verdad. Cinco, menos o igual a seis. Bueno, no. No, lo es. Es verdad. Lo siento. Sí, es cinco, menos o es igual a cuatro. No, no lo es, que es falso. Entonces fíjate cómo estamos
obteniendo este resultado. Verdadero o falso cuando se
trata de esa condición. Ahora déjenme deshacer un
poco para
volver a nuestras
declaraciones if anteriores. Eso es exactamente lo que está
pasando aquí. Así que tienen declaración es básicamente evaluar
esa condición, hirviéndola a
un verdadero o falso. Entonces ahora tal vez se esté preguntando, ¿podemos entonces simplemente
decir verdadero o falso? Y va a estar en lo correcto si
decimos si es cierto, imprima, sí. De lo contrario, imprimir,
no. Ahí vas. Entonces en este caso, ya no
necesitamos la
variable num. En este caso, la verdad siempre
será verdad. Genial. Ahora, ¿qué tal falso? Falso siempre será falso. Entonces vamos a estar
imprimiendo en este caso. Ahora déjame mostrarte
una cosa más. Se puede invertir. También se pueden hacer operaciones
con booleanos. Se puede decir, se puede hacer lo
contrario para que no sea falso. Y en realidad vamos a ejecutar esto
en un ejemplo aislado. Imprimimos no bolas. Ahora, una vez más, pausa
el video y solo piensa por un par de segundos por lo
tuyo esto
va a imprimir. Ahora vamos a ejecutarlo cierto. Ahora bien, si no lo hacemos verdad, ¿qué va a imprimir falso? Porque no verdadero es
esencialmente falso. Genial. Entonces vamos a decir si
no es falso, imprenta, SÍ. De lo contrario imprimir saber, esto podría ser un poco artificial, un poco confuso. Pero una vez que lo piensas, tiene perfecto sentido. No falso es cierto. Entonces vamos a imprimir sí. Y si digo si no es verdad, no verdad, no verdad es falso. Entonces esto puede ser que la
división no se cumplirá. Esto será falso. Entonces vamos a
terminar en esta otra cosa. Entonces. Ahí vas. Ojalá, si las declaraciones son
un poco más claras ahora, son sumamente poderosas. Son muy simples, pero los usarás como interruptores para guiar el
flujo de tu código y permitir que tu
código sea muy versátil y muy
elegante de alguna manera.
13. Introducción a las funciones: Bien, así que has recorrido un largo camino en tan solo
tu primer proyecto. Y realmente en muy
pocas líneas de código, puede ver que estas
son solo 31 líneas y hay mucho espacio
vacío en el medio. Has adquirido algunas habilidades muy poderosas y muy útiles,
habilidades que te van
a permitir crear algunas variables. Llegar a este punto es
un muy buen logro. Deberías estar orgulloso de ti mismo. Entonces enhorabuena por eso. Aunque algunos de estos sigan siendo
un poco confusos, tenga en cuenta
que aunque
eso es normal, eso se espera de alguna manera
esta es mucha información y no se preocupe porque vamos a estar reutilizando
todo este conocimiento, toda esta información en los siguientes ejemplos y
las siguientes lecciones. Una vez más, esto es muy buen progreso y eso significa que estás
listo para subir de nivel. Entonces, ¿qué necesitamos para
subir de nivel nuestras habilidades de codificación? Una cosa que tenemos que hacer es salir de este grupo
donado o en Maya. Y quiero decir, esto
es lo suficientemente grande. Es lo suficientemente bueno para
teclear coordenada como lo hemos
estado haciendo hasta ahora. Pero realmente deberíamos
estar usando un editor de texto o con habilidades de programación, funcionalidad de
programación. No solo te permitirá
escribir código fuera de Maya, sino que también hará que tu experiencia de
codificación un poco más agradable,
más agradable. Y será el primer paso para aprender
a crear tus propios módulos o tus propias bibliotecas para que
puedas importar tu propio código, igual que hacemos con la biblioteca CMBS
menos propia. Pero antes de llegar a eso, necesitamos aprender
un concepto más. Y este es uno de los conceptos
más claves en lo que se conoce como programación
orientada a objetos. Y es, te permitirá
aprender a crear código escalable
y organizado. Y realmente desbloqueará el poder de la
programación para ti. Y ese es el
concepto de funciones. Vamos a
salir de Maya por un
segundo para hablar de funciones. Y espero que no te
moleste que use pintura. Sé que no es la
mejor herramienta de dibujo, pero es lo suficientemente buena para
lo que necesitamos ahora mismo. Entonces las funciones, hay dos formas de pensar sobre las funciones. Uno de ellos
ya lo mencionamos, que es pensar en
ellos como una caja negra. Déjame dibujar. Intenté hacer una caja aquí. Entonces es una caja misteriosa
en el sentido de que no
sabemos y realmente no nos importa lo que esté pasando
dentro de ella. Todo lo que sabemos y nos importa
es que se necesita una entrada. Y es, bueno, las entradas
son funciones. No siempre tomar una entrada. Muy a menudo lo hacen, pero
no es obligatorio, pero siempre, siempre
devuelven algo. Y esta es una palabra clave. Regreso. Las funciones, siempre
devolverán un valor que es la
salida de la función. Y como ya hemos visto, podemos almacenar ese
valor en una variable. Ahora bien, si el valor de retorno de
una función no está definido, por defecto
le dará algo llamado monja, que es básicamente un valor nulo. Muy pronto vamos a
enterarnos de eso. Entonces, repasemos un ejemplo que nos debería
ser familiar. La función de cubo de poli. Así que una vez más,
realmente no sabemos y no nos
importa cómo mi ojo está
creando ese cubo, ¿verdad? Todo lo que nos importa
es que tome algunas entradas, como sabemos que toma un nombre para que podamos nombrar al cubo. ¿Perdón por mi letra? Y en base a la documentación, también
sabemos que toman cualquier otro número de argumentos que usemos
para modificar la salida. Y entonces el resultado de
eso es por supuesto un cubo. Pero como ya vimos, el valor devuelto de esa
función es en realidad una lista. Y esa lista contiene
dos elementos en ella. Uno de ellos es el nombre
del nodo y el
otro es otro objeto, otra forma que es la construcción real
del cubo. Pero hasta ahora
solo nos ha importado
realmente el primer
ítem de esa lista. Nuevamente, así es como
piensas acerca de una función
cuando la estás usando. Ahora la otra forma en que lo estás
pensando es cuando realmente estás
creando la función. Y en ese caso, serás tú quien defina lo que va dentro
de esa caja azul, dentro de esa misteriosa caja. Y eso es simplemente código. Muy similar al código que
has estado escribiendo hasta ahora, con un par de
pequeñas excepciones, pero básicamente es un
conjunto de instrucciones. Básicamente es una colección de pasos o colección
de instrucciones que pueden o
no tomar una entrada, hacer algo con la entrada, y luego darle al
quien esté llamando a la función, devolver un valor. O ahora pueden entonces almacenar en
una variable si quieren. Por ejemplo vamos a repasar por ahí
hay ejemplo muy sencillo. Digamos que queremos
hacer una función de receta de pastel. Receta de pastel. Y digamos que queríamos tomar en el número de personas. Digamos n. n significará que el número de personas para las que
queremos el pastel, la función tomará
n, que es un número. En este caso se trata de un entero. Un entero es sólo
un número entero, como ya hablamos antes. Y luego resolverá las cantidades y
los ingredientes y cualquier cosa que tenga que hacer para
dar una receta a ese
número de personas. Y entonces por ejemplo digamos que
devuelve una cadena, que es solo el texto, serán los textos pero
la receta dentro de él. Ahora cuando alguien esté
usando esta función, llamarán pastel. Receta de pastel. Sabemos que está esperando n, que es un entero. Ahora n eres tú, tú, tú decides qué nombrar. Esto se convertirá en una variable. Tú decides cómo llamarlo, pero sabemos que es un número entero, así que toma un número. Entonces digamos que queremos un
pastel para cuatro personas. Ahora, quien esté
llamando a esta función, simplemente puede decir, simplemente
pueden almacenar el
resultado de eso en una variable. En este caso, estoy llamando a
esa receta variable. Entonces lo que está pasando
aquí es que vamos a
volver a pensar en
la función
como una, como una caja que
no sabemos lo que está pasando dentro de ti como
desarrollador, claro, ya
sabes lo que está
pasando dentro, pero alguien más que usa la función,
no necesita saber. Incluso podrías cambiar el, las instrucciones dentro
de la función. Y aún así simplemente llamarán receta de
pastel con los argumentos que definas
la nueva función. Entonces lo que va a pasar es que tu función
tomará esta entrada. Hará algún tipo de
codificación dentro de ella para procesar la receta y luego devolver ese valor
al usuario para que pueda ser ignorado o
se pueda almacenar, en este caso en esta
variable llamada receta. Entonces ojalá eso sea lo suficientemente
claro. Ahora, sigamos adelante y
creamos algunas funciones reales. Entonces, cuando estás
haciendo una función, en realidad se llama definir. Una función. Tipo
significaría muerte, escena definir plus en
definición, D, E, F espacio, y luego el
nombre de tu función. Hagamos algo sencillo. Digamos, hagamos una
función que diga hola. Entonces escribe, di guión bajo Hola, ahora abre y cierra paréntesis. Y empecemos simple. Tengamos una función que no tome argumentos,
ninguna entrada en absoluto. Y luego dos puntos, presione Enter. Notarás que mi automáticamente
me dio esta sangría. Siempre que estés
creando una función, cualquier cosa que entre en la
función tiene que ser sangrada. Recuerda que son cuatro espacios. O en el caso del editor de
scripts puede haber una pestaña en todo el código,
todas las instrucciones, como mencionamos antes, que queramos tener en la función irán
sangradas de esta manera. Entonces, vamos a tener un mensaje, y este mensaje
se mantendrá muy sencillo. Sólo digamos hola. Ahora, no devolvamos
nada
ahora mismo, simplemente
imprima este mensaje. Excelente, Así que
probemos esto. Vamos a ejecutar este código. No hubo errores pero no pasó nada. Acabamos de
recuperar nuestro código constitucional. Digamos, vamos a escribir
una función aquí abajo. Ahora, no lo llamemos todavía. Vamos a escribir eso, a
ver qué pasa. No está pasando nada. Ahora vamos a imprimir la función
real sólo para inspeccionarla un poco. Interesante,
tenemos esta cosa rara. Dice función decir hola en algún número aleatorio, aparentemente
aleatorio. Entonces lo que está pasando aquí es, como mencioné antes, mencioné la idea de la programación orientada a
objetos. Una función, y casi todo en Python se llama un objeto. Ahora bien, no te preocupes demasiado por esta definición de un objeto. Pero básicamente sabemos que esta función ahora
existe en la memoria, razón por la
cual conseguimos este número. Su función básicamente se
guarda en ron nuevo. Nuevamente, no te
preocupes demasiado por estos detalles técnicos. Pero sepan que esta
función va a existir, pero
aún no nos está dando su valor hasta que llamemos a la función. Entonces llamemos a esa
función y ejecutemos el código. Excelente. Ahora en realidad es decir hola. Ahora hablamos de valores de
retorno. Así que vamos a comprobar lo que esta
función está devolviendo. Voy a escribir resultado igual, decir hola, abrir y
cerrar paréntesis. Ahora vamos a almacenar el
resultado o el valor
de retorno de esta función en esta
variable llamada result. Vamos a imprimirlo. Imprimir resultados. Excelente. Entonces seguimos diciendo hola, Como puedes ver aquí. Y tenemos esta
cosa llamada ninguno. Como mencioné antes, desconocido es que es como un valor nulo, algo así como un valor vacío
o vacío. Se puede tratar a un no
similar a un falso, que de alguna manera es
como un falso en un booleano. Pero es su propio tipo
especial de valor. En realidad es muy útil. No solo
está vacío es en realidad bastante útil para comprobar
si
vas o no a un valor
de vuelta de una función como
vamos a ver muy pronto. Pero si recuerdas, dije que las funciones siempre devuelven un valor. Ahora, ya que no estamos devolviendo nada
explícitamente, python volverá por defecto
desconocido. Entonces esto es similar a decir
explícitamente devolver ninguno. Entonces cambiemos
esto un poco. Y en lugar de
imprimir el mensaje, devolvamos el mensaje. Ahora fíjate que aquí
no hay paréntesis, se acaba de devolver
el mensaje espacial. Ahora bien, una cosa a notar es que retorno significa el fin
de la función. No sólo
devolverá el valor, sino que también
terminará la función. O vamos a ver
eso en un segundo. Vamos a ejecutar esto. Por ahora me voy a deshacer de
los resultados de la impresión. Y vamos a ejecutar este código. Permítanme borrar primero la ventana de salida. Vamos a ejecutar este código. No pasa nada de manera similar. ¿Por qué no? Bueno, la razón es porque ya no
estamos imprimiendo. Simplemente estamos
devolviendo el mensaje en lugar de mostrarlo. Ahora bien, si realmente imprimimos el
resultado que tenemos aquí, asignamos nuevamente, una vez más, asignamos el valor de retorno de la función a esta
variable llamada result. Vamos a ejecutar ese código. Ahora la palabra imprimiendo
algo excelente. Ahora decimos hola. Genial. Entonces vamos a expandir la función. Pero antes de hacer eso,
quería
mostrarles cómo el retorno significa
el fin de la función. Imprimimos después de la devolución,
Imprimimos algo. Digamos que después de Regreso. Y vamos a ejecutar este código. Ya ves como
seguimos imprimiendo hola, pero no estamos realmente,
no estamos llegando a este punto, una vez más es porque
devuelto significa el final de la función y
va a devolver ese valor. Sólo para que esto quede
aún más claro, qué pasa si en lugar
de devolver mensaje, devuelvo un número. Volvamos 100. Ahora. Haz una pausa e imagina
lo que va a pasar aquí. Pero creo que está muy claro. Va a imprimir
100 y estamos ignorando
por completo
este mensaje aquí arriba. Genial. Entonces volvamos a
devolver mensaje. Y vamos a ampliar un poco esta
función. Ahora, hagámoslo un
poco más sofisticado. Y agreguemos un
argumento a través de él. Digamos que queríamos
saludar a alguien. Di, Bueno,
tomarías en una variable o un argumento llamado name y
queremos saludar a name. Ahora, vamos a esperar que el
nombre sea una cadena, igual que este tipo de aquí. Entonces, cuando tienes dos cuerdas, en realidad
puedes
juntarlas simplemente diciendo más, podemos decir hola más nombre. Volvamos a ejecutar este código. Oh, genial, tenemos,
tenemos un error. Por qué él, veamos
qué está pasando ahí. Error decir hola, toma
exactamente un argumento, cero dado exactamente, porque ahora estamos
esperando un argumento. Entonces pasemos en un nombre. Digamos Adam. Y yo una vez más, como decíamos, el nombre va
a ser una cadena. Entonces ahora nombre. Una vez que ejecutemos esto, observe cómo tomará el nombre
en forma de anime. Básicamente estamos diciendo, bien, entonces esta variable llamada
name será Adam. Entonces ahora deberíamos estar
diciendo hola más Adam. Ahora vamos a correr eso
y a ver qué pasa. Excelente. Nos falta un espacio. Solo agreguemos ese espacio después de Hello y ejecutemos
ese código una vez más. Hermoso. Eso es excelente. Una cosa a notar
también es que esta variable aquí solo existe dentro del
alcance de esta función. Ahora, hay otra
palabra específica que estoy usando. Lo estoy usando intencionalmente. Alcance. Alcance significa que esta
función, lo siento, esta variable, ya sea la
variable name o incluso esta variable de
mensaje. Esto existirá sólo dentro
del alcance de la función. Ellos, básicamente viven
mientras se ejecute la función. Así que solo para aclarar ese punto, para que el punto lo atraviese, vamos a imprimir el nombre
en lo que sucede. Tenemos un error
porque name no está definido porque named no existe fuera de la función. Una vez que recordamos de nuevo, cualquier cosa que esté dentro
de la función vive después de esta sangría. Una vez que volvamos fuera de
esa sangría, terminamos. Ya no tenemos acceso
a eso. Ahora bien, si tuviera
que poner esa huella dentro de la
función, ¿qué pasa? Ahora estamos imprimiendo átomo
aquí, que es el nombre. Y si cambiamos el nombre
aquí también, como George, por ejemplo, ahora estamos imprimiendo a George. Excelente, así que vamos a ampliar
esto un poco más. Y vamos a conseguir un segundo argumento. Digamos que queríamos
saludar al,
al nombre completo de la persona. Agreguemos una variable más. Llamemos a esto LastName.
Vamos a ejecutar esto. Ahora, tenemos otro error porque se necesitan dos argumentos. Sólo estamos de paso en uno. Eso tiene perfecto sentido. Digamos George Smith, apellido
muy común. Entonces vamos a pasar
en ese apellido. Y vamos, vamos a ejecutar este. El único saludar a George, claro, porque no
hemos agregado el apellido. Ahora, podríamos hacer esto, podríamos hacer más LastName. Y esto va a funcionar. Pero de nuevo, no
tenemos un espacio. Podríamos crear otra cadena con solo un espacio en ella y luego seguir
agregando un plus. Eso va a funcionar. Pero esto se está volviendo un
poco verboso. Esto es demasiado mecanografiar. Entonces aprendamos otra forma
de armar cuerdas. Déjame deshacerme de todas
estas variables plus. Ahora, escribe conmigo aquí, vamos a decir Hola, espacio, abre y cierra
llaves. Para dejar esto claro,
estos corchetes, estos no son paréntesis, estos son llaves
, tipo de espacio. Y luego los corchetes otra vez. Ahora vamos a decir al
final de la cadena, vamos a decir formato de punto. Abrir, cerrar paréntesis,
vamos a decir nombre, coma, apellido, apellido. Así que tómate un segundo para hacer una pausa e imaginar lo que
va a pasar aquí. Podría ser un
poco confuso o podría ser muy claro. Pero lo que va a pasar
es que este corchete, por lo que estas llaves se
van a convertir en marcadores de posición cuando estemos usando
esta función de formato de punto, python sabe esperar algo para reemplazar estos
corchetes ancho. En este caso hay
dos corchetes y hay dos variables. Entonces nombre será, son estos corchetes
serán reemplazados por nombre, y este segundo color los corchetes serán reemplazados por apellido. Solo hagamos que nuestro mensaje sea
un poco mejor. Diciendo hola a nombre y
apellido. Excelente. Ahora nuestro mensaje o resultado es
saludar al juicio. Genial. Ojalá esté claro hasta el momento, pero sólo para que sea
un poco más claro, repasemos
otro ejemplo. Estaba pensando en algo
completamente ajeno a animación para tratar de que sea
un poco interesante, divertido, y quizás más claro, hagamos algo
relacionado con tus finanzas. Si has oído hablar de estos
pagos movimiento llamado Fuego, lo que significa
independencia financiera, jubilarse temprano. Esto es por supuesto que no
vamos a estar
hablando de finanzas. No soy un experto financiero. Esto no es de ninguna manera
ningún tipo de consejo. Este es solo un ejemplo un poco
divertido. Hay este tipo
de cálculo que estas personas en llamas la mitad
que básicamente dicen, bien, si quieres saber cuánto
dinero necesitas invertir para jubilarte temprano o jubilarte en algún
momento, básicamente dicen, toma cualquiera que sean tus gastos
anuales y haz que sea el cuatro por ciento de tus inversiones
o estás ahorrando. La idea detrás de esto es
que el mercado en general, como el mercado de valores o
algo así como bonos o algún tipo de inversiones te
darán un rendimiento del 4% cada año. Entonces, si puedes vivir de
ese 4% de rendimiento cada año, básicamente
puedes vivir de esas inversiones durante
algunos años. Entonces, por ejemplo digamos que
sus gastos anuales son de 40,000 dólares, por ejemplo ,
bien, 40,000 dólares son
4% de $1 millón. Eso es mucho dinero. Pero nuevamente, esta no es
una clase financiera. Esto significa que
necesitas
invertir $1 millón y cada año
obtendrás el 4% de eso, que son tus 40,
40,000 dólares que necesitas para cubrir tus gastos como
sean tus gastos. Entonces escribamos estas
calculadoras solo como ejemplo. Una vez más, escriba
conmigo definición con el
hallazgo de espacio funcional. Y pongamos nombre a la función, digamos fuego, guión bajo,
guión bajo, calculadora, paréntesis
abierta, paréntesis
cerrada. Excelente. Entonces, ¿qué
queremos que sea nuestro insumo? Queremos gastos, ¿verdad? Queremos calcular
cuánta inversión necesitas. Amor, vamos a recibir los gastos y vamos
a devolver cuánto dinero
necesitas invertir para llegar a vivir del
4% de esas
inversiones, ¿verdad? Entonces digamos que el monto
será igual y este será el cálculo de
los gastos divididos por 4/100. Y devolvamos esta cantidad. Así que simplemente vamos a imprimir el
resultado de esta función. Ahora gastos, claro, tenemos que
reemplazarlo por un número. Esto será de 40 mil. Y vamos a ejecutar este código. Nos dieron 100. Ahora bien, esto está claramente equivocado. Veamos por qué. Esto en realidad es parte de por qué quería un
ejemplo con números es mostrarte otro aspecto
peculiar de esta versión de Python. Déjame abrir una nueva
pestaña y hagámoslo. Hagamos este
cálculo juntos. Entonces digamos que estamos
dividiendo cuatro por 100. Vamos a decir,
solo guarda estos en una variable llamada R.
Imprimimos ese resultado. Oh, perdón, esto
no es una división. Un personaje que fue mi mal es el
slash delantero para dividir. Genial. Entonces, de nuevo, esto está claramente equivocado. Entonces, ¿qué esperamos de esta división si
divide cuatro por 100, o estamos esperando 0.04, verdad? Entonces lo que está pasando aquí es que estamos dividiendo
dos enteros. Y ahora en cualquier momento para cualquier versión por debajo de cualquier
versión de Python por debajo de Python tres, cuando divides dos enteros, obtienes un entero de vuelta, lo que significa que el valor
se está truncando. ¿Qué significa eso
si tengo 1.5 por ejemplo, recuerda que dije
antes de que un número entero. Básicamente un número entero que no tiene un punto decimal. Entonces porque estamos dividiendo
dos enteros, esto, si esto fuera un resultado 1.5, este número se truncará y solo tendremos el uno. Básicamente estábamos
quitando los decimales. Ahora, cuando es
difícil cuando se tiene un punto decimal que
se llama flotador. Ahora, una vez más, esto es int, es sólo un número entero. Y un flotador tiene decimales. Entonces, ¿qué tenemos que
hacer para obtener este resultado? Bueno, tenemos que dividir
un entero por a flote. Ahí vas. Esto se
parece más a lo que estamos esperando. Esto también funciona al
revés. Por cierto, también podemos dividir un flotador por un entero siempre uno de los
números esté a flote, Python te dará
el valor correcto. Pero si no es un flotador, una vez más, si es
solo un entero, entonces lo truncará, en realidad te está dando es
realmente obtener este resultado. Y luego lo está
truncando porque piensa que estás
pidiendo una cuadrícula entera. Entonces esa es una peculiaridad
importante que encontrarás en Python. Y si estás tratando de
hacer cálculos y te encuentras con este problema, puede ser extremadamente confuso, pero solo debes saber que por lo general es una buena idea simplemente a un 0.0 para convertir un número en un flotador, entonces evitas este
problema por completo. Entonces otro sabemos que necesitamos. Este es el
valor real que necesitamos. Sólo vamos a reemplazarlo aquí. Una vez más, esto es
solo matemáticas y
realmente no necesitas aprender muchas matemáticas o ¿qué tenemos que hacer? Así que no te preocupes por
los detalles de esto. Sólo debes saber que
básicamente estamos calculando cuál es el, qué es esto. El cuatro por ciento de
gastos excelentes dividido por 0.40, 0.04 nos llevará ahí el monto
final que necesitamos. Y eso es un millón de dólares. Y fíjate aquí que tenemos una
carroza, lo cual es genial. No importa si es un float y un entero
en este caso. Vamos a probarlo de nuevo. Digamos que necesitas 80.000 dólares
para sobrevivir un año entero. Entonces necesitarías, por supuesto, 2 millones de dólares. Ahí vas. Una vez más, esta no es
una discusión financiera. Esto es sólo un ejemplo. Pero sí quería mostrarte
ese lado peculiar de Python. Somos cargas y
divisiones enteras pueden ser un
poco complicadas. Ahora antes de seguir adelante, hay una última cosa de la
que quiero hablar, y esto es sumamente importante. Y hay una
documentación que mencioné antes de que no hay
otra para crear cadenas. Puedes hacer
comillas simples, dobles, o puedes usar comillas triples. Ahora, también mencioné
que las comillas triples están reservadas para algo
llamado docstrings. Docstrings es básicamente
documentación para una función. ¿Qué quiero decir con eso? Tipo significaría cotizaciones
triples, 123. Estas son tres
comillas dobles, por cierto. Y luego vamos a escribir un mensaje. Digamos que esto
calculará cuánto
necesita para calcular el monto del
retiro, por ejemplo, monto del
retiro. Ahora escribe y otras tres comillas, 123, pero tres comillas dobles.
Y vamos a ejecutar este código. Mismo resultado. Entonces esto es solo una cadena
y esto realmente no está afectando tu código de ninguna manera. Pero es sumamente útil para algo que
hemos visto antes. Ahora vamos, recordemos
ese comando de ayuda. Vimos esa función de ayuda. Ejecutemos nuestra función dentro
de esa función de ayuda. Entonces ahora, una vez más, presta atención, no estoy
llamando a esta función. No estoy abriendo y cerrando el paréntesis y simplemente escribiendo el nombre
de la función. Así que vamos a ejecutar este código. Ayuda a abrir paréntesis,
calculadora lejana, cerrar paréntesis. Y ves que dice ayudarles a funcionar para una calculadora
en Módulo principal. Eso solo significa que estás dentro. Siempre que no tengas un módulo que sea básicamente
un archivo Python, lo vamos a ver
muy pronto. Simplemente lo llama media, así que no te preocupes demasiado por
esta parte, pero básicamente
te está diciendo el nombre de la función. Y puedes ver aquí, te
está mostrando ese
poquito de ayuda. Entonces, si alguien
estuviera usando tu función, puede ejecutar ayuda en ella. Y pueden recibir un
poco de un mensaje tuyo, el desarrollador diciéndoles qué hacer o qué está haciendo la
función. Ahora algo más que es muy importante cuando se
trata de docstrings. Y vamos
a estar usando esto. Vamos a estar haciendo
esto a partir de ahora, es decir R están mencionando lo que se
espera en este insumo. Entonces ahora recuerda una
vez más, por alcance, esta o esta
variable solo existe dentro de la, dentro de la función. Y como es Python, podríamos estar pasando, sujetando cualquier cosa que
queramos esta función. Por lo que es importante mencionar en la documentación lo que
se espera que sea, lo que sea que esta función
esté esperando recibir. Para ello, simplemente podrías
decir gastos o quemar, cerrar paréntesis, y escribir en el cuerpo se espera
que reciba este caso, digamos que es un entero. En realidad, hay diferentes
formas de escribir esto. Voy a apegarme
a uno que es,
es un
estándar convencional de Google. Y lo que hacen es decir args, que ha sido argumentos dos puntos. Y entonces vamos a
sangrar esto en los args. Vamos a escribir una vez más
gastos. Entre paréntesis. Vamos a escribir el
tipo de esta variable, y esta será un entero porque estamos esperando
un número, ¿verdad? Entonces vamos a escribir
un pequeño comentario al respecto. Digamos tus gastos anuales. Una vez más, todo esto
es sólo documentación, pero ayudará a quien
esté usando esta función, que podría ser usted mismo
en unos meses, saber lo que se espera. Ahora se menciona algo más
que
es útil cuál es
el valor de retorno. Vamos a
escribir return colon. Y luego voy a escribir el valor que
se ha devuelto. En este caso, sabemos
que es un flotador. Vamos a ejecutar esto de nuevo. Genial. Una vez más, la
función de ayuda nos está dando toda esta información
aquí mismo. Una vez que ejecutes la ayuda
de alguien que esté usando tu función
sabrás,
bien, tiene una variable que
está esperando un entero. Y puedo estar esperando un flotador a cambio
en
cuanto a un valor de retorno. Entonces ojalá esto, esto ayude a aclarar qué funciones
son un poco más. Esto fue solo una breve
introducción a ellos. Ahora, vamos a convertir nuestro
código en una función.
14. Convierte el código en una función: Bien, volvamos a nuestro código. Ahora vamos a convertir todo
este código en una función para que sea un
poco más reutilizable. Ahora que sabemos qué
son las funciones, cómo hacerlas, podemos convertir muy fácilmente esta pieza de código
en una de ellas. Puede parecer mucho, pero en realidad es muy fácil
convertir todo esto
en una función. Pero primero pensemos, pensemos ¿qué
necesitamos que haga la función? Empecemos con los
argumentos son la entrada, ¿cuál te gustaría que fuera
la entrada? Probablemente queremos
dejar a un lado quien esté usando la función qué tipo de PrEP
quieren hacer, ¿verdad? Imagino que
también podríamos querer que decidan el nombre del
control y la nueva geometría. Pero mantengámoslo
simple por ahora. Digamos que tomamos
la decisión ejecutiva de simplemente irnos, darles control sobre
el tipo de agarre de utilería. Hagámoslo. Digamos que creamos una
función una vez más para comenzar a definir una función
que escribes def space. Ahora vamos a nombrar la función que
voy a nombrar
crea guión bajo,
guión bajo, reg, abrir
y cerrar paréntesis. Déjame hacer esto un
poco más grande. Ahora, necesitamos el, el insumo. Bueno, es muy fácil. Simplemente podemos reutilizar
este nombre aquí. Ya que estamos, ya que ya
estamos usando estos nombres
a lo largo del código. Aquí abajo. Lo que en realidad estamos escuchando
esto si declaraciones. ¿Por qué no solo reutilizar eso y
ponérselo fácil para nosotros mismos? Prop subrayado. Y luego cerraremos
paréntesis y luego dos puntos. Y ahora sabemos que estas instrucciones para estar
dentro de la función, tenemos que sangrarlas. ¿Cómo hacemos, cómo
creamos esa sangría? Podemos resaltar todo ese código y simplemente
presionar la tecla Tab. Ahí vas. Eso es todo. Eso es todo lo que necesitas. Acabamos
de convertir todo esto en función. Genial. ¿Qué hacemos con esto aquí arriba? Realmente
ya no lo necesitamos así que podemos eliminar eso. Entonces ahora todo este código
está dentro de una función, así que vamos a ejecutarlo, a
ver qué pasa. Bueno, no
pasa nada y lo siento, esto se está poniendo un poco
difícil de leer porque es, el código está creciendo,
pero es genial porque estás
escribiendo más código. Así que en realidad no pasó nada. Esto es un, todo esto es solo la definición
de nuestra función. Recuerda, tenemos que llamar a esta función para
poder usarla. Bueno, vamos,
hagámoslo aquí abajo. Vamos a llamarlo aquí abajo. Crear apropiado,
permítanme solo escribir que crea plataforma abrir y
cerrar paréntesis. Y ahora recuerda que
estamos esperando un insumo. En este caso, se
llama tipo prop. Estamos esperando una
cadena y de hecho, escribamos un poco
de documentación para nuestra función a través de cadenas de documentos. Una vez puedo recordar citas
triples. Y por cierto, estas también pueden ser
comillas simples. Comillas simples triples, comillas
simples o
tres comillas dobles. Prefiero los dobles. Sólo escribamos una carta
de recomendación. Ir sin control. Entonces voy a simplemente
escribir, crear un pedazo de geo con control en él. Ahora, vamos a escribir en los argumentos que se
necesita args, colon. Y entonces estamos
esperando tipo prop. Sabemos que esto es una cuerda. Y sabemos
que puede ser un cubo, una esfera o un cono. Una vez más, todo esto es
solo documentación. Esto es solo para
quien necesite usar la función para obtener un
poco de ayuda. No es necesariamente
que el código funcione, pero es sumamente útil. Y yo diría que es un hábito muy, muy útil para
entrar porque él
hará que tu
vida de recubrimiento sea mucho más fácil. Una vez que tienes documentación, honestamente te
distingue de cualquiera, de muchas personas ese código es muy útil y es muy apreciado
por otros programadores. Te recomiendo que te metas
en el hábito de esto. A veces puede ser frustrante, a veces es trabajo extra. Pero a la larga
merece mucho la pena. Y regresa, bueno, en
realidad no hemos devuelto nada todavía. Entonces, no agreguemos el valor de
retorno en este momento. Sólo dejémoslo como está. Genial. Entonces sabemos que estamos esperando una cuerda y sabemos que
tenemos estas opciones, cubos, esfera o un cono. Vamos a escribir, en realidad, lo siento, sabemos que por defecto tenemos el cubo. Entonces, solo agreguemos eso al
escuchar el docstring. Vamos a escribir cube, por ejemplo vamos a ejecutar este código. Ahí vas. Excelente. Excelente. Ahora vamos, vamos a
crear otra cosa. Ahora ya ves
lo hermoso que es tener una función. No es necesario copiar y
pegar todo este código. Simplemente puedes copiar
esta función, pegarla en la línea de abajo. Ahora digamos que
también
queremos tener un cono . Eso es todo lo que tenemos que hacer. Sólo ejecuta ese código. Ahora tienes un cubo, ahora tienes un cono. Excelente. Eso es todo lo que necesitas hacer. Tienes una función
y ahora puedes reutilizar tu código muy fácilmente. Digamos solo por
el bien de ello, vamos a crear
también una esfera. Porque ¿por qué no? Porque podemos hacerlo. Ahí vas, esfera, cubo y cuenta. Hermoso. Ahora, por el bien, antes de ir por el bien de terminación y por el
bien de la curiosidad, permítanme ejecutar de nuevo este código. Se está poniendo un
poco más desordenado. Me gusta cada vez que creas la sonda solo se superpone
encima de la anterior. ¿Y si pudiéramos simplemente
organismo un poco? Ahora ves que tenemos
esta función de movimiento. Vamos, vamos, pasemos a las indicaciones a
medida que las creamos. Así que vamos a tomar esto y
convertirlo en Python muy rápido. Sé que estos son
muchos argumentos. Una vez más, como
nos ha dado Maya conseguimos el comando malloc. Voy a seguir adelante
improvisar un poquito. Solo estoy convirtiendo esto
en un comando Python. Pero antes de hacer eso, necesitamos saber
lo que nos estamos moviendo, verdad? ¿Qué nos estamos moviendo? El control? Bueno, no lo hemos hecho, realidad no estamos
devolviendo el control. Por ejemplo, si guardo esto como en
una variable llamada cube, déjame deshacerme de Conan sphere, ese simple cubo de impresión. Ninguno, claro que se desconoce porque no hemos
devuelto nada. ¿Qué sería
bueno para regresar? Creo que controlan el nombre
del controlador que se
creó sería bueno que regresara para que una vez creado
el ladrillo, el usuario sepa cuáles los controladores para que
puedan manipularlo. Esta es una adaptación que estoy haciendo ahora mismo a medida que avanzamos. Entonces lo que queremos devolver es en realidad el nodo del
controlador que Occidente creó, ¿verdad? Entonces nodo de control, devuelve
el nodo de control. Antes de olvidar, ya que
estamos regresando eso, agreguémoslo a
la documentación. Regresa y estamos
regresando en realidad. Así que vamos a agregar el
tipo que se está devolviendo. Sabemos que ese es el
nombre del control. Entonces ese es un nombre
de cadena de nodo de control creado. Esto es solo una nota para
que sea un poco más obvio. Excelente. Entonces, permítanme borrar estos
dos rayos aquí dentro. Vamos a ejecutar este
código una vez más. Control. Me siento corriendo
otra vez, control uno. Ahí vas. Entonces ahora
estamos recibiendo el nombre de esto,
estos controles. Ahora, déjeme ser más explícito. Déjame cambiar el nombre de esta
variable llamada cube. Déjame renombrarlo kube, control. Genial. Ahora podemos usar la función
move. Entonces, tomemos esto
y peguémoslo aquí abajo. Si esto se vuelve confuso, por favor solo intenta seguirlo. Aquí estoy improvisando, pero sé que podríamos mover este
objeto una vez creado. Entonces nosotros, digamos,
digamos supongamos el movimiento del punto S. Eso parece correcto.
Se resalta aquí. Ahora, ¿qué estamos moviendo? Bueno, vamos a mover
el control de Kube. Entonces vamos, vamos a dar eso
como primer argumento. Control de Kube, sin espacio. Ahora ellos, el valor por el que se mueve es esto,
esto aquí mismo. Solo usemos ese argumento
y veamos qué pasa. Vamos a
deshacernos de estos dash r. Voy a
deshacerme de este dash 0 S. Voy a usar este W, D. No
estoy muy seguro de lo que es. Pero recuerden que tenemos
nombres largos y nombres cortos, así que sólo voy a asumir que este es el
nombre corto de un argumento. Voy a quitar
el guión que hay en él. Y recuerda en Python, usamos iguales, así que
vamos a decir w d es igual. Y como vimos antes, estos son tres valores. ¿Qué hacemos cuando
vemos tres valores? Bueno, suponemos
que es una lista. Y una lista es un grupo de ítems separados por una
coma como ya nosotros. Entonces apliquemos ese y
ese número por una coma. Y entonces el siguiente
número será una coma. Me imaginé que estos son, estos son el eje, esto es x, y, y z, o z, coma, coma. Y luego cerrar la lista. No necesitamos el punto y coma. Ahora necesitamos cerrar la
función para que podamos llamarla. Excelente. Así que muévete por esta cantidad. Solo ten paciencia conmigo mientras, mientras improviso esto, pero esto es bueno tuyo. Me estás viendo probar las cosas, la vida en cierto modo. Voy a
deshacerme de esa huella. Vamos a crear este lag w d se
debe pasar un argumento
booleano. Bien, Interesante. Digamos que w d es igual a verdadero. En realidad, déjame,
déjame quitar esto. Como dije, estaba improvisando. Intentemos la misma función sin ninguno de estos argumentos. Solo pasemos tres
valores a esta función. Veamos qué pasa. Voy a pasar
esos valores sin que sea una lista. Son sólo básicamente
tres argumentos. Como quitar eso. Ahí vas. Eso funciona. Bien. Entonces me equivoqué completamente. Pido disculpas por eso y pido disculpas si esto fue un
poco confuso. No probé esto de antemano, pero creo que fue
bueno para ti verme probar toda
esta vida porque será parte de tu experiencia probando las cosas
hasta que funcionen. A veces algo
puede ser un poco, puede parecer obvio, pero
como viste en este caso, claramente no era obvio. Sí. Entonces esta función de movimiento, la forma en que está funcionando, está trabajando en
lo último que seleccionamos. Ahora sabemos que seleccionamos ese nodo de control
antes de que se creara. Lo siento, después de que se creó. Entonces eso estaba siendo seleccionado. Entonces todo lo que estamos diciendo es mover el objeto seleccionado,
sea lo que sea. Y esta función de movimiento se
toma en esos tres valores, que serán x, y y z. Por
supuesto, como vimos que tiene, déjenme hacer esto de nuevo
solo para mostrarlo. Tiene más, más argumentos. Esto probablemente signifique relativo. Esto, no estoy seguro de lo que es, pero no es
importante en estos momentos. Entonces solo tomemos,
solo sigamos con esto. Déjame hacer de esta
una buena ronda seis. Sabemos que funciona. Entonces digamos que queríamos
crear un cono de cubo. Vamos a crear un cono. Y probablemente estés
pensando que si ya no estamos usando este control,
ya no lo necesitamos. Eso es correcto. Eso es correcto. Ya no
lo necesitamos, así que me voy a deshacer de esto. Pero creo que sigue siendo
una buena idea mantener el valor de retorno para estar
ahí ellos controlan. Pero en fin, esta es, esta es tu herramienta,
esta es tu función. Así que siéntete libre de modificar
esto de la manera que quieras. Al final del día,
usted está en pleno control de todo esto es crear un cubo. Vamos a crear un cono. A menos que en realidad
no se mueva el cubo. Nos vamos a deshacer de ellos. Muévete en el cubo. Vamos a crear un cono, vamos a mover el cono. Esto lo único que queremos es la
distancia entre ellos. Y entonces vamos a crear una esfera. Y movamos este miedo el
doble que el cono. Así que vamos a moverlo 12 unidades, 12 unidades
negativas. Bien, vamos a
terminar con esto. Vamos a ejecutar esta pieza de código. Y ahí tienes. Cubo, cono, esfera,
todo lejos. Muy bien presentado, listo para ser animado por ti o por cualquier otra persona. Genial, así que gracias de nuevo por llevarme a través
de toda esta experimentación. Ojalá eso te haya sido
útil, y te veré en
la siguiente lección. Gracias.
15. PyCharm - instalar y configurar: Te voy a mostrar cómo
instalar inquieto por encanto porque eso es lo que me
vas a ver usar para el
resto de este curso. Por supuesto, puedes usar cualquier otro IDE o
editor de texto que quieras. Si quieres usar Sublime, sé nota de código VS, pero si quieres, es todo herramientas. Todos ellos proporcionan
este resultado final. Recomiendo PyCharm. Es bastante agradable para
Python y
realmente fue hecho para desarrolladores de
Python. Su página web
va a ser jet, brains.com, dash
pie, mismo PY, encanto. Voy a proporcionar un
enlace a esto, por supuesto. O muy fácilmente también. Puedes simplemente Google
PyCharm otra vez, encanto PY. Y el primer enlace que
consigas debería estar ahí. El mismo resultado en
la portada. Haga clic en el botón Descargar. Vas a tener dos opciones. Elige la versión comunitaria. Hay una
versión profesional que puedes pagar. Pero honestamente la integración
comunitaria es más que suficiente. Así que vamos a descargar eso. Una vez descargado el archivo,
basta con hacer clic en él. Se abrirá el instalador. Ahora haz clic en Siguiente. Siguiente. Recomiendo crear un atajo, y sí recomiendo crear
estas asociaciones. Dot p-y es simplemente la
extensión para archivos Python. Por lo que sí recomiendo usar eso. Puedes dejar todo lo
demás desmarcado. Haga clic en Siguiente. Instalar. Bien, y al final de
lo instalado tendrás esta ventana. Haga clic en ejecutar PyCharm Community
Edition y haga clic en Finalizar. Si tienes esta ventana, estoy recibiendo esto porque
tenía una versión anterior, pero solo voy a dar click, no importes la configuración. Haga clic en OK. Y deberíamos tener pycharm
abriendo ahora mismo. Una vez que PyCharm se abra,
te van a presentar estas ventanas. Simplemente puede abrir
archivos con él. Pero recomiendo
montar un nuevo proyecto porque por lo general se hace
para trabajar con, con proyectos. Si bien también te recomendamos tomar este
tour por el centro comercial si quieres. Por ahora vamos a
hacer la configuración básica. Así que vamos a hacer clic en nuevos proyectos. Su ubicación. Te recomiendo usar
la carpeta de scripts mayas. Entonces eso va a estar bajo la unidad
UC, tu carpeta de usuarios. Una vez más, ve usuarios, tu nombre de usuario y
puedes seguir aquí la ruta que estoy siguiendo
y luego ir a Documentos. Ahora en vez de
documentos van a tener tu carpeta Maya. Y luego dentro de esa carpeta
hay una carpeta de scripts. Vamos a estar usando
eso bastante. Así que vamos a hacer clic Bien en eso. Aquí abajo tienes
algunas opciones más. Elija un nuevo entorno
usando ENV virtual y virtual. Este es un entorno virtual, pero no te preocupes
demasiado por eso. Esto es algo que creará
pycharm, pero en realidad no
vamos a usar ahora mismo. Entonces todo esto nos
deja una serie. Lo siento, no
quise comprobarlo. Deja
todo lo demás. La serie en la parte inferior. Crear PY principal, guión de bienvenida. Voy a marcar esa casilla
solo para que veas
algo una vez que iniciemos
un proyecto, haz clic en Crear. Y PyCharm va a
empezar a tener algunas
cosas listas para ti. Podría tardar unos minutos. Sólo le das algo de tiempo. Una vez hecho esto,
vas a ver este rápido recorrido por lo
que vas a ver. Esta es la ventana de tu
proyecto. Y esta es realmente la carpeta donde
va a vivir tu proyecto. Déjame mostrarte qué,
qué está pasando aquí. Si vas en tu Explorador de Archivos, si vas a tu carpeta
Documentos, ve a Maya, y luego scripts. Eso es lo que estás
viendo aquí arriba, que es el mismo gráfico circular de
carpetas y creó esta carpeta
llamada idea punto idea. Eso se puede ignorar. También creó esta carpeta
v, v ENV. Eso se puede ignorar. En realidad puedes
eliminarlo si quieres, pero por ahora
realmente no nos molesta, así que podemos dejarlo ahí. Y debido a
que marcamos esa última casilla, tenemos este archivo main.py. La única razón por la que verifico eso es solo para crear un
archivo Python para que lo veas. Pero vamos a estar
borrando eso muy pronto. Una vez más, esto está dentro de tus documentos carpeta de
scripts mayas. Puedes crear este
proyecto en cualquier lugar que quieras. Pero como
vamos a estar trabajando dentro de esta
carpeta de scripts muy pronto, recomiendo usar esta ubicación. Una vez más, este es
básicamente tu árbol de archivos. Es solo para ayudarte a navegar. Este es el archivo Python que
vamos a eliminar muy pronto
porque realmente no necesitamos. Así que vamos a configurar un par de
ajustes antes de comenzar. Vaya al menú Archivo luego baje a la configuración. También puede presionar Control Alt, Alt S para abrir la ventana
Configuración. Ahora hay dos configuraciones
que queremos actualizar. Vamos a mantenerlo sencillo. El primero está bajo
la sección anterior. Ampliar eso en su general. La primera casilla de verificación que veas cambiar el tamaño de fuente
controlaría esos modos. Sólo marcaremos esa casilla. Eso es solo para imitar la funcionalidad
donde podemos aumentar o disminuir el
tamaño de fuente y mi salida con control y la
rueda en el mouse. Ahora la siguiente configuración, vaya a la sección Herramientas, expanda eso y luego desplácese hacia abajo hasta las herramientas
integradas de Python. Ahora cerca de la parte inferior hay docstring
section rumor de que una docstring es una cadena
que podemos poner en una función que actúa
como documentación, ahí el nombre docstring. Bajo formato docstring,
voy a elegir Google. Este es un estándar
que me gusta usar. Una vez más,
siempre es tu elección. Puedes elegir otro
formato si quieres, pero voy a
estar usando este para el resto de estos ejemplos. Una vez
que elija ese clic, Aplicar, haga clic en Bien, o enviando
que cambiamos. Vamos a probarlo. control en la rueda y las calificaciones del mouse lo hace cada vez más grande y más pequeño,
lo cual es bastante agradable. Déjame borrar todo este código porque realmente no lo necesitamos. Es solo, por ejemplo, vamos a
crear una función, solo una función de ejemplo, def ejemplo de espacio, paréntesis
abiertos. Agreguemos dos argumentos. Sólo porque quería
mostrarte lo que harán los docstrings. Así argumentó uno, solo
por el ejemplo, o dos, por ejemplo, paréntesis cercanos. Ahora fíjate como en
cuanto abro un paréntesis, pycharm completó el segundo
paréntesis, lo cual es genial. Está haciendo mucho de
ese trabajo para mí. Así que volvamos a hacer eso en uno o dos dos puntos yo
presentador una vez más, note que Python
me da esta sangría
automáticamente, lo cual también es bastante agradable. Entonces ahora para los docstrings se
ha mencionado antes, voy a escribir tres
comillas dobles, 123. Observe cómo PyCharm también
autocomplete eso para mí. Si presiono Enter it, auto completó esos
argumentos por mí. Me da un espacio para mis argumentos y una
sección para mis devoluciones, y también un poco de espacio aquí para nuestra descripción,
lo cual es genial. Entonces dame una descripción
de esta función de muestra. Necesitamos agregar los
tipos manualmente. Pycharm no es lo suficientemente inteligente como
para saberlo ahora mismo. Entonces, una vez más, esto es sólo
una convención que sigo. Voy a decir que
esto es una cuerda. Digamos cadena de ejemplo. Ahora bien este,
digamos que es un entero y un número entero de muestra. Y digamos que
devolverá un booleano. Sólo, sólo un ejemplo. Esto no es realmente algo
que vayamos a usar. Observe cómo hay
resaltado de sintaxis también. Los colores son
diferentes a los de Maya, pero sigue siendo agradable ver de
un vistazo lo que
sucede. En este caso. Observe que estos
argumentos son grises. Incluso podrían ser un
poco difíciles de ver. Eso es porque PyCharm te está diciendo que no los
has usado. Pycharm hace muchas cosas muy
inteligentes por ti que te ayudan a inspeccionar tu código. Como ves aquí abajo en realidad, día a la derecha
tienes este marcador. Es como una advertencia. Y aquí arriba también, te
está diciendo que
hay dos advertencias. En su mayor parte, no te
preocupes por esto demasiado en este momento, pero
a veces es agradable ver lo que está pasando. Es simplemente decirte
que no has usado esos argumentos.
Así que arreglemos eso. Vamos a imprimir una de
ellas para poder usarla. Ahora ves que ya
no está atenuado. Y también si notas que en
cuanto empiezo a escribir, PyCharm
me está ofreciendo una sugerencia. En este caso, es
el otro argumento que no he usado. Entonces si presiono Enter,
ahí tienes. Lo hace por mí,
lo cual es genial. Se auto-completa el formulario. Ahí vamos. Igual que antes. Está cerrando los
paréntesis para mí. Así que escribir PyCharm
será mucho más rápido. Solo devolvamos
algo aquí. En cuanto empiece a escribir F, sé que quiero un booleano, así que me ofrecerá las faltas
o si empiezo a escribir t, él permitirá true
como sugerencia. Excelente. No voy a
entrar demasiado en detalles sobre PyCharm. Hay mucha
funcionalidad que
puedes explorar o hay
muchos tutoriales, mucha documentación
en internet. Pero para lo que necesitamos ahora mismo, esto debería ser más que suficiente. Ahora antes de irnos, hagamos un
poco de limpieza. Como mencioné antes, este archivo main.py
es solo un ejemplo. Realmente no lo necesitamos, así que vamos a deshacernos de él. Puedes eliminarlo ya sea desde tu navegador de archivos
o simplemente ir aquí. Cuando este Explorer
aquí en el lateral, haga clic en la tecla Eliminar, le preguntará si
es corto para hacerlo, puede decir Sí, ahí va. Tenemos borrón y cuenta nueva. Así que vamos a seguir adelante y
crear algunos archivos Python.
16. Crear un módulo: Hablemos de
bibliotecas y módulos. Como dijimos antes, un módulo es una conexión, una colección de funciones, y una biblioteca es una
colección de módulos. Un módulo realmente el núcleo
del mismo es solo un archivo. Es un archivo que contiene código tal como hemos estado
escribiendo hasta el momento. Podemos crear nuestros propios e importados como lo
hacemos con mis propios CMBS. Entonces sigamos adelante y hagamos eso. En un explorador de archivos. Navega a documentos, maya y tu carpeta de scripts. Usamos lo mismo para crear la misma ubicación para
crear el proyecto PyCharm. Entonces deberías tener eso ya
del video anterior. Así que dentro de aquí
podemos crear nuestros módulos. Maya sabe leer código
desde esta ubicación. ¿Cómo sabe eso? Vamos a averiguarlo primero para saber de dónde están obteniendo mis datos
el código, podemos usar un módulo llamado sits, SAS, como en sistema. Y en el sistema hay una variable de lista que es realmente
una lista que se llama path. Y esto contiene todo el directorio o los
pads de carpeta para mi fin. Python en general, para esta sesión Maya está
obteniendo el código de. Así que simplemente vamos a imprimirlo. Genial. Entonces obtendrás esta
lista con muchas cadenas, que son solo Rutas de Directorio a carpetas que existen
en tu máquina. Se verán diferentes
para ti porque
tengo algunos plugins que
quizás no tengas, pero muchos de ellos
serán iguales. Por ejemplo, este, Maya 2020. Esta es una carpeta que es solo
para la versión Maya, Maya. Entonces, si tienes código
que está destinado a ser usado solo en una
versión específica de Maya. Puedes ponerlo aquí, por ejemplo, estamos usando una ubicación más
genérica porque nuestro código está destinado
a ser más genérico. Está destinado a ser utilizado por
todas mis aversiones realmente. Entonces eso es lo que estamos usando al final aquí
tenemos ese camino. Intentemos que esto sea un
poco más fácil de leer. Podemos usar nuestro módulo
llamado pretty print. En realidad se llama pwd print. Vamos a decir, Lo siento, déjame deshacer esto de Pip
print, import p, print. Es un poco redundante,
pero así
decidieron llamarlo estrella brillante. De nuevo se destaca
por la impresión bonita. Todo lo que hace es que te dará un resultado más legible por humanos. Así que vamos a ejecutar este código
que es mucho más agradable. En lugar de tener esta
larga lista que tenemos que
desplazarnos para ver, solo la conseguimos. Sigue siendo una lista sigue
siendo el mismo resultado. Simplemente se imprime de una manera
más legible por humanos. Una vez más, puedes crear módulos en cualquier lugar aquí
en cualquiera de estas rutas. Pero por ahora, vamos a estar
apegándonos a los documentos, a los guiones
mayas. Quizás te estés preguntando
qué pasa si quisiera usar una carpeta separada para
que otras personas, digamos en tu
pipeline o en tu equipo, quieras que accedan a
tu código. Eso lo podemos hacer. Podemos editar esta lista y
agregarle más partes. Se llama anexión de caminos. Pero llegaremos a eso en otra lección.
Volvamos aquí. Guiones, documentos mayas, guiones
mayas. Vamos a crear un archivo. Haga clic con el botón derecho. Vaya a Nuevo y cree
un nuevo documento de texto. Ahora vamos a darle un
nombre que tenga sentido. En este caso, queremos, por ejemplo prop underscore reg. Ahora el formato para este
archivo es TXT por defecto, pero queremos que sea punto p-y, como en python, punto p-y. Windows va a preguntar si queríamos
cambiar la extensión, queremos decir que sí, excelente. Entonces ahora podrías
abrir este archivo si hago clic derecho y hago
abrir con el Bloc de notas, podemos escribir código directamente. Tenga en cuenta que esto es
solo un archivo de texto con una extensión diferente. Pero ya hemos
configurado PyCharm, así que vamos a usar eso. Ahora, cuando navegamos en el término
pi porque estamos usando esa misma ubicación
para nuestro proyecto. El archivo aparece aquí. Entonces deberías ver ese archivo
que está vacío, claro, sigamos adelante y creamos una
función solo para probarlo. Entonces el tipo se encontraría con Sordos. Espacio, prueba, abrir, cerrar
paréntesis, colon. Voy a saltarme
los docstrings por ahora porque esto es
solo una prueba rápida. Simplemente devolvamos una cadena. Es solo decir que esto es una prueba. Capitalizar esto. Excelente. Entonces, ¿cómo usamos esto? Eliminemos este código. Déjame vaciar la ventana de salida. Simplemente entreguemos
esta importante plataforma. Vamos a correr eso.
Veamos qué pasa. Sin errores. Eso es genial. Esa es una buena noticia. Simplemente vamos a imprimirlo. A ver qué pasa. Imprimir, prop Break. Excelente. Entonces mi venta te
apropiado usa un módulo proveniente de documentos, manuscritos, problema apropiado del huevo ahí se llama rig dot p-y. Excelente, Ese es nuestro módulo. ¿Cómo lo usamos? Para? Bueno, sabemos que ahí tenemos
una función
que se llama prueba. Así que vamos a hacer una prueba de puntos. Y simplemente
llamemos a la función. Sabemos que está
devolviendo un valor. Así que vamos a almacenar ese valor
en una variable por ahora y simplemente llamarlo t. Ahí vas. Esta es una prueba que es
el valor que estamos obteniendo de nuestra
función en nuestro módulo. Excelente,
enhorabuena, has hecho tu primer módulo. Como puedes ver, es muy fácil. Hay más a los módulos. Lo que vamos a
llegar a eso muy pronto. Lo siguiente que tenemos que hacer es crear algo que realmente
necesitamos, que es convertir nuestro código
adecuado en módulo, lo que dice que vas a
decir que va a ser tan fácil como básicamente copiar y pegar
esto en nuestro módulo. Así que vamos, en realidad sigamos
adelante y hagamos eso. Permítanme llevar de todo, desde la declaración de importación en la parte superior hasta el
final de mi función. Voy a presionar control C. Vamos a nuestro módulo de
tela. Eliminemos este código. Y voy a pegar
esto aquí. Excelente. Entonces tenemos presente el ion bromuro. Sí, notas que PyCharm me
está dando un error. Si coloco el cursor sobre él, efectuaré verificar
los errores aquí. Me está diciendo
referencia no resuelta a Maya, referencia
no resuelta a CMBS. Eso está bien. Eso se debe a que
PyCharm no
sabe de la biblioteca CMBS. Hay formas de
sortear esto y en realidad actúa como el
código fuera de Maya, pero realmente no necesitas eso. Para que puedas ignorar que
son siempre por ahora. Todo lo demás es exactamente
lo mismo que tenemos antes. Simplemente, literalmente, lo copiamos, pegamos dentro de este módulo. Volvamos a Maya. Y vamos aquí. Entonces digamos, permítanme
borrar este código. Simplemente vamos a crear
una plataforma, digamos prop, underscore rig, crear plataforma de cultivo. De hecho, vamos a imprimir esto
directamente y ver qué pasa. Tenemos un error, interesante módulo de error de
atributo,
es decir, Propp Rick no tiene el atributo
create prop brick. ¿Por qué es eso? Eso es porque
ya hemos importado el módulo y lo modificamos
después de que lo importamos, después de nosotros, lo
importamos, agregamos todos estos. Este código no es tu
función después de que ya
habíamos importado a Maya. Maya, a pesar de que lo estamos
importando de nuevo, maya intenta ser inteligente
y como que almacena en la el módulo en su memoria
y solo lo reutiliza. Entonces, ¿cómo le decimos a
Maya que
actualice, actualice o recargue este
módulo? Muy fácil. Simplemente podemos escribir, hay
una función llamada reload. Entonces el tipo cumpliría con
la recarga, la plataforma adecuada. Pero va a pasar es
que va a obligar a Maya a volver a leer el archivo. Y una vez que pueda almacenar en caché, pulsa, Guardar es su
contenido en la memoria. Así que realmente solo necesitamos recargar una vez cada vez que hagamos un cambio. Así que vamos a ejecutar este código. Y ahora permítanme volver a ejecutar esta
declaración impresa. Excelente. Entonces imprimió algo un
poco de función críptica, crear probabilística,
agregar algún número aleatorio. Esta es una buena noticia. Esto quiere decir que sabe que
hay una función. De hecho, vamos a usarlo. Sé que estoy repasando
estos un poco lentamente, pero simplemente vamos a
crear un regular. Sabemos que necesitamos uno
de estos tres valores. Entonces sigamos adelante y digamos, llamemos a esta función. Y pasando el valor
que ya sabemos que espera, vamos a crear un cubo. Sólo voy a ejecutar
esa línea de código. Excelente. Todo esto es muy
familiar para ti. Creó un cubo en, le dio el nombre del
control que se creó. Vamos a crear
otra cosa es crear un cono. El mismo trato te dio la
variable que se creó, que es vino controlado
y él creó un cono. Y ahora todas estas
vidas fuera de mi sí, no
estamos escribiendo todo este
código en el editor de guiones. Tienes tu propio módulo
respaldado por tu sistema de archivos. Es mucho más fácil trabajar con él. Y ahora todo lo que necesitas hacer, no
necesitamos
recargar ahora mismo porque no estamos
haciendo ningún cambio. Todo lo que necesitas hacer para
llamar a tus funciones son estas cuatro líneas de código, limpias, fáciles y
muy, muy escalables. Enhorabuena, ya terminaste
con tu primer proyecto. Ojalá los módulos tengan sentido. Vamos a estar usando esto
mucho más para avanzar. Vamos a seguir
usando módulos, seguir usando PyCharm,
vas a seguir
creando funciones. Así que todos estos te resultarán
aún más familiares. Una vez más, enhorabuena. Pasemos al siguiente paso.
17. Buceo profundo - funciones: Vamos a
sumergirnos un poco en la función. Ya he dicho antes que se
puede considerar una función como contenedor. ¿Un contenedor de qué? Vamos a dibujar un
contenedor muy rápido. Está siendo un contenedor de
instrucciones, siendo
instrucciones código que se ejecuta dentro
de esta función. Ahora bien, siendo esto un contenedor, también
significa que
hay un alcance. Este es un término importante. Alcance básicamente significa
las limitaciones de dónde puede existir algo. Y esto será especialmente importante cuando se
trata de variables. Hay variables
que vivirán fuera del alcance
de la función, y variables que vivirán dentro del alcance
de la función. Esto puede resultar confuso
a veces para la gente, pero vamos a ver un
ejemplo en un poco. Entonces, lo principal que quieres saber sobre las funciones
es lo que realmente hacen. Entonces, como hemos mencionado anteriormente, una función puede opcionalmente
tomar una entrada. Así que imagina que esto
es solo un contenedor que está ejecutando un conjunto de instrucciones y
toma una entrada. Opcionalmente, no todas las
funciones toman una entrada, pero puedes hacer tus
funciones que pueden ingresar. Aún más importante, siempre
hay, siempre una salida
y esa salida, si no se define explícitamente, será un valor llamado Ninguno. Ninguno es como un objeto nulo. Pero también puedes
usarlo como una forma de verificar la existencia de
un valor válido, por ejemplo, pero siempre, siempre una función
devolverá como mínimo, ninguno o algo que haya sido explícitamente establecido
como su valor de retorno. Entonces como una entrada como el vocabulario adecuado
serán los argumentos. Los argumentos serán la entrada, y la salida
será un valor de retorno. Entonces cuando estás
llamando a una función, y vamos a ver
esto en código muy pronto. Solo estoy dibujando esto
tendrá un poco de una visión general como
una
vista de arriba hacia abajo de lo que hacen las funciones. Digamos que tienes
una función llamada, llamémosla mi función. Solo por el bien de ejemplo, para ejecutar una función, está llamando a la función coef. Ese es el nombre de ejecutar una función que dices que
llamaría a una función. Tenemos que usar paréntesis. Y en lugar de este
paréntesis es uno de estos argumentos
que van a ir. Si hay algún argumento,
si hay alguna entrada, entonces los paréntesis
contendrán esa entrada. Una vez que ejecutes la función, obtendrás un valor de retorno. Esto a veces resulta confuso
para la gente porque cómo el, cómo las funciones
devuelven un valor. Bueno, en cuanto
llame a una función proporcionando este paréntesis, va a obtener
un valor a cambio. Y por lo general
querrás almacenar eso en, en una variable a menos que no
te importe
lo que se ha devuelto, a menos que solo quieras que se ejecute la
función. Las instrucciones son
un conjunto de funciones y luego olvídate de ello. Pero normalmente querrás
almacenar eso en una variable. Un amigo mío me dijo que es fácil visualizar este tipo de nosotros obteniendo una moneda al
final de la ejecución. Así que imagina que estás
ejecutando la función. Y luego obtienes una moneda, especie de luz cuando
juegas a Mario Bros, obtienes una pequeña moneda. Intentamos lanzar moneda. Así que moneda muy fea, pero me imaginé que
obtienes esta moneda como resultado. Y luego puedes depositar esa
moneda en tu variable. Una vez más, las variables son
simplemente contenedores de un valor. Entonces puedes pensar en eso De
esa manera si te ayuda, obtienes esta pequeña moneda una vez
ejecutas la función. Y eso se puede usar como
quieras, normalmente como un valor para
almacenar en esta variable. Así que vamos a crear una función. Vamos a crear una función
llamada ejemplo. Crear una función en Python se llama definir una función. Y la manera de
hacerlo es escribiendo def D-E-F, definir el espacio. Puedes llamar a la función como
quieras. Y vamos a
llamar al mío ejemplo, abrir y cerrar paréntesis. Por ahora, no voy a hacer que mi función tome ningún
argumento ni ninguna entrada, luego dos puntos, y
luego presione enter. Ahora fíjate cómo obtuve
esta sangría. Se trata básicamente de cuatro espacios. Esto es muy importante. Esta sangría
es lo que determina lo que va dentro
de la función. Entonces por ahora sólo
voy a escribir pase. Pasar es básicamente decir omitir cualquier ejecución
o no hacer nada. Y voy a
escribir una variable. Voy a imprimir
algo aquí. En realidad, en lugar de escribir
que dices algo. Esto está fuera del
alcance de la función. Esta ruta se encuentra dentro del
alcance de la función. Ahora, hablamos
del alcance de cuatro variables. Hagámoslo un poco
más claro con un ejemplo. Vamos, vamos a crear
una variable llamada bar. Y le voy a
asignar un número. Digamos diez. Y vamos a crear
otra variable. Llamemos a esto dentro, porque está dentro
de la función. Y vamos a asignar
el número tres, el absoluto un arbitrario, pero es sólo por un ejemplo. Vamos a imprimir var. Genial. Entonces obtuvimos la salida de diez, que es exactamente
el valor de bar. Eso es genial. Eso es porque eso está fuera del alcance de la función. Ahora, ¿qué pasa si tratamos
de imprimir aquí esta variable? Obtenemos el error de nombre. Dice nombre dentro no
está definido. No está definido porque eso
está dentro de esta variable, esta función, y vamos a
imprimirla dentro de la función. Imprimimos esta impresión en su interior. Permítanme borrar esta línea. Ahora no pasó nada. Por supuesto, eso es
porque en
realidad no hemos frío la función. Entonces, una vez más, recuerda ejecutar una
función tienes que llamarla. ¿Abrirían y
cerrarían paréntesis? Hagámoslo. Ahí vas. Ahora estamos imprimiendo
el valor tres, que es la variable de la variable dentro
de esta función. Ahora, si tienes curiosidad, quieres ver qué pasa. Si simplemente imprime la
función sin llamarla. Eso se puede hacer. Y esto es lo mismo. Python te dirá
que es una función. Se llama ejemplo,
y vive en estos números aleatorios, aparentemente
aleatorios. Esto se llama
puntero a la memoria. Dices que la función no vive en ningún
archivo en este momento es solo vive en la memoria para esta sesión con la que
estás trabajando. No te preocupes
demasiado por esto. Es un detalle un poco más
técnico. Pero sé que puedes, puedes usar esta función tal como
es, pero yo la estoy llamando. Pero para obtener el valor de ello, hay
que llamarlo. Ahora mencioné que
las funciones siempre, siempre devuelven un valor. Entonces déjame almacenar ese valor dentro de
esta variable de salida. Vamos a sacar eso a colación. Ahí vas. Entonces este tres es de esta
declaración impresa aquí abajo. Entonces déjame, déjame quitar esa declaración impresa para que
sea un
poco menos detallada. Ahí vas. Entonces estamos
imprimiendo el resultado de la salida. Y eso no es ninguno. Eso es porque no
estamos definiendo ningún valor
de retorno de la función. Y ninguno es el
valor predeterminado. Como mencioné antes. Ahora, digamos que en lugar
de no devolver nada, en realidad
queremos
devolver este valor aquí. Digamos que queremos devolver
esa variable dentro. Ahora bien podemos
devolver tres directamente, lo que básicamente estaría ignorando esto, esta
variable aquí. O puedes devolver esa variable. Por ahora. Simplemente mantengámoslo simple
y devolvamos este valor tres. Ahí vas. Ahora estamos imprimiendo tres
de esta variable de salida. Una vez más, es decir, como dije, como decían
mis amigos, es de ayuda imaginar que estás obteniendo
esa pequeña moneda y estás depositando ese valor o esa
moneda en, en una variable. Eso es lo que pasó aquí. Obtienes poco valor
estoy poniendo en salida. No necesariamente
hay que poner esa barrera, almacenar ese valor en una variable, como mencioné antes, simplemente
puede
imprimirlo directamente. Entonces hagámoslo. Observe cómo estoy
llamando a la función. Y solo estoy apuntando
eso directamente. Y es exactamente
el mismo resultado. Eso es porque
vamos a conseguir ese valor. Esto equivale
básicamente a hacer esto. Imprimir tres, porque
en este caso, tres es el valor que
devuelve esa función. Entonces ojalá eso quede claro. Ahora, hagamos algo un
poco más complejo. Vamos, agreguemos argumentos
o entradas a esta función. Agreguemos un argumento llamado a y
un argumento llamado B. Volvamos,
llamemos a esta función, add, la función add porque vamos a sumar
esos valores juntos. Digamos que el resultado
será una lesbiana. Muy sencillo y vamos
a devolver sus resultados. Podemos llamar a la función. Entonces, ¿qué pasa si los
llamamos ahora mismo? Obtienes un error por supuesto, porque dice que la función add toma exactamente dos
argumentos, cero dado. Entonces ahora tenemos que
dar argumentos. Tenemos que dar algunos valores, digamos dos y
luego dos coma tres. Es así como se proporcionan estos
argumentos tesis en orden. Entonces argumento y dos
corresponderán al argumento a, y luego tres
corresponderían al argumento ser. No pasó nada porque no
estamos almacenando ese valor. Voy a decir
salida una vez más. Voy a
imprimirlo, pero excelente. Entonces ahora obtenemos el
resultado que es cinco, porque es dos más tres. Si tuviéramos que hacer diez más tres, claro que serían 13. Hay un tipo diferente de
argumento llamado argumento de palabra clave. ¿Qué hemos visto ahora mismo? Estos se llaman argumentos
posicionales. Eso es porque estos argumentos no tienen un valor por defecto, son básicamente variables. Y una vez más,
esto es importante. Estas son variables que existen dentro del alcance
de esta función. Ahora bien, observe cómo
la ayuda no
existe realmente en ningún otro lugar
fuera de la función. A, es como una caja vacía. Pienso en ello como una
caja vacía y un contenedor vacío. Eso es simplemente ser llamado a con
el propósito de usarlo
dentro de nuestra función. Básicamente estamos diciendo
que cada vez que obtienes un valor, almacenar ese valor dentro de esta caja es contenedor llamado a, y luego usarlo dentro
de la función. Y el alcance de una variable o este argumento que
básicamente se convierte en una variable o está siendo
tratado como una variable, es solo el alcance de
la, de esta función. Una vez que la función sale, sale, que es cuando volvemos o cada vez que terminamos la
función o estando ahí. No tuvieron paciencia, entonces esa variable
ya no existe básicamente. Y también el nombre
de esta variable, por
supuesto, depende de nosotros. Podríamos llamar a éste. Y oh, e.g. Estamos
sumando números. Entonces podemos decir, podríamos
incluso decir primero y segundo. Entonces haríamos
primero más segundo. Y el resultado
será exactamente el mismo. Entonces todo esto depende de nosotros, depende de usted como desarrollador decidir cómo
llamar a estas variables. Entonces nuevamente, estos están en orden. Diez pertenecerán a
estallar en este caso, y tres pertenecerán al segundo. Hay un tipo diferente de argumento que se llama argumento
de palabra clave. Se llama
argumento de palabra clave porque vez de pasar los
argumentos en orden, los
van a pasar por su nombre. Entonces, por ejemplo ,
vamos a crear
un nuevo ejemplo. Digamos que
queremos que la función
determine para saber si
alguien puede conducir o no, si alguien tiene la edad
suficiente para conducir o no. Entonces, una vez más,
definamos una función, llamémosla puede conducir. Que sea un
poco descriptivo. Ahora, queremos saber
la edad de la persona. Queremos saber cuál es el, cuál es el límite de edad para
poder como una especie
de umbral, correcto, para poder conducir. Entonces llamemos a esta edad mínima. Y agreguemos un valor predeterminado. Valor por defecto. Digamos que necesitas tener 16 años
para conducir, por ejemplo, luego colon. Sin los dos puntos,
obtendrá un error. Entonces dos puntos, presione Enter, y ahora estamos dentro
de esta función. Entonces digamos que si h es
menor que mínimo h, mínimo h,
vamos a decir que no. No vamos a decir que no, vamos a devolver false, que es un valor booleano en este caso básicamente diciendo No, esta persona no puede accionar pernos. De lo contrario,
vamos a regresar. Sí. Porque significa que
la persona puede probarlo. Excelente. Entonces, entonces vamos,
llamemos a esta función. Ahora bien, observe de nuevo, ya que
proporcioné un
valor por defecto
para este número, para este argumento,
no necesito proporcionar
necesariamente un valor para eso. Entonces digamos que
alguien tiene 25 años. 25, sí, puede conducir. Alguien tiene tres años. No pueden conducir. Excelente. Ahora bien, ¿y si quisiéramos
cambiar la edad mínima? Pero podrías
cambiarlo aquí o podrías. Hay, hay dos
formas de hacer esto, ya que sólo hay
dos argumentos. Simplemente podrías tratarlo como un argumento posicional, es
decir, en orden. Entonces se podría decir, bien, vamos, hagamos la nueva
edad mínima para ser uno, un año de edad. Ahora esta persona puede conducir, pero nosotros también podemos hacer esto. Podemos decir mínimo h es igual a uno. Ahí tienes el hecho de
que estamos agregando, premiarlo al argumento, lo
convierte en una palabra clave. Argumentos. Cuando agrega una palabra, cuando está negociando argumentos
como argumento de palabra clave, puede ignorar la orden, lo que puede ser un
poco confuso. Pero por ejemplo, si tuviera que decir que H igual a 20 y la edad
mínima para conducir es, cambiemos esto a 22, por ejemplo, ahora observe cómo viene h ahora después del segundo y segundo lugar y la edad mínima
viene en primer lugar. Pero debido a que estamos usando las
palabras clave,
los argumentos de palabras clave, el funcional
sabrá asignarlo a su
argumento o variable correspondiente. Entonces en este caso, es falso como se esperaba. Ahora bien, si cambiamos esto a 19, es cierto como se esperaba. Pero si fuéramos a
eliminar esas palabras clave, simplemente déjelas como argumentos
posicionales. Ahora están volteados. Ahora, 19 pertenecerán a H, y 20 representarán mínimo H. Ojalá esto quede claro. Si no, vamos, probemos un ejemplo más para
tratar de que esto quede un
poco más claro. Hagamos un
tipo diferente de función. Hagamos una función
que tome todo, que tenga todos los argumentos completamente
opcionales, lo que significa que todos los
argumentos tienen un valor predeterminado. Entonces vamos a definirlo. Se llama Sordo. Digamos que es una función
que va a saludar a la gente. Voy a llamarlo saludar. Ahora. Tendrá un mensaje. El mensaje tendrá un valor
predeterminado llamado no frío, pero solo diremos saludos, que es una cadena
que dice saludos. Ahora, tomará
en un nombre de pila. El primer nombre tendrá un valor predeterminado de
una cadena vacía. Entonces tal vez no queremos
tener un argumento de nombre y apellido que
también tendrá una cadena vacía
como un tipo de valor dos puntos. Y entraríamos dentro
de la función. Ahora vamos a
decir lecturas mensaje. Solo comencemos una nueva variable. El mensaje será,
será una cadena. Vamos a decir,
vamos a decir abrir y cerrar el espacio
entre corchetes abrir y cerrar el
espacio entre corchetes entre corchetes abrir y cerrar los
corchetes. Y luego vamos
a escribir al final del formato
de punto de cadena. Ahora lo que va
a pasar aquí es cada uno de estos
corchetes, va a ser reemplazado por lo que sea que pongamos dentro de
esta función de formato de punto. Entonces vamos a decir el primero, el primer corchete
será reemplazado por el mensaje, el segundo por
el nombre de pila, y el tercero por el último. Y luego simplemente
devolvió mensaje. Ahora, por supuesto, podríamos,
podríamos devolverlos directamente en vez de tener que hacer distorsionarlo en una variable
que sea completamente válida. Pero creo que es un
poco más limpio
crear una variable
con nuestro mensaje. Déjame hacer esta ventana
un poco más grande. Crear una variable
que nuestro mensaje, y luego devolver ese valor. Entonces veamos qué pasa aquí. Ahora. Nuevamente, tenemos tres
argumentos en esta función. Para hacer otra
variable llamada salida. Vamos a
almacenar la salida de esa función en esa variable. Voy a imprimirlo. Entonces veamos qué pasa si
llamamos a esta función sin ningún argumento en absoluto, sino un paso en cualquier
argumento en absoluto. Nosotros, dice
saludos, excelente. Entonces sí tiene
algunos espacios vacíos porque agregamos
algunos espacios vacíos. Pero eso está bien por ahora. Esto es sólo un ejemplo. ¿Qué pasa ahora si pasamos en un solo, un solo argumento? Bueno, eso va a ser, eso
va a ocupar el lugar
del primer argumento aquí. Digamos, saluda. En lugar de saludos. Ahí vas. Hola. ¿Y si pasamos en
un segundo argumento? Vamos a decir
FirstName, digamos Josh. Hola, juez. Ahora, ¿qué pasa? Ocurre si pasamos en
una palabra clave argumentos? Entonces fíjense cómo este es
el segundo argumento. Bárbaro en realidad
columnata LastName. Básicamente estamos diciendo, bien, usa este valor, esta cadena
in place o lastName. Ahí vas. Ahora, es difícil de ver porque porque
sólo hay un espacio vacío. Entonces, si cambiamos el valor
predeterminado del nombre de la
persona a un simple guión. Pero ya veremos qué pasa aquí. Observe cómo estamos pasando
en nuestro nombre, nuestro salto directo
al apellido. Y luego tenemos
hola Josh. Genial. Ahora bien, si pasamos en nombre de pila, aunque lo hagamos fuera de orden, siempre y cuando usemos
la palabra clave para ello. Diga. Júnior. Lo sé. Sé que esto
es un poco al revés. El apellido juez, no
es apellido. Pero digamos que Junior
será su primer nombre. Hola, enero Josh. Así que fíjate cómo a pesar de que
esto está fuera de
servicio, FirstName, porque estamos
usando las palabras clave. Está tomando el
lugar de FirstName y LastName está tomando
el lugar del apellido. Ahora bien, si nos deshacemos de
estas palabras clave simplemente
eliminando apellido es igual a
primer nombre es igual. Volvemos a los argumentos
posicionales,
es decir, que el orden
importará en este caso. Así que vamos a ejecutar esto. Ahora ves que la
salida está volteada. Excelente. Quería volver a
devolver valores porque
mencioné que return marca
el final de una función. Y este es uno de los
aspectos más importantes de una función y algo que causa cierta confusión,
confusión a las personas. Entonces déjame intentar volver atrás y hacer mucho y volver a
mi ejemplo anterior. Ahí tienes, puedes cubrir. Entonces aquí mismo estamos usando
la instrucción if else para seguir la decisión dictar el flujo de
esta función, ¿verdad? Entonces solo como un repaso,
estábamos preguntando, ¿puede la persona esta h es la
persona por debajo del mínimo h. diremos, diremos
nodo no puede conducir. De lo contrario, sí, pueden conducir. Por lo que en realidad podemos leer esta otra declaración
no es del todo necesaria. La razón de eso es porque una vez que golpeas
el valor de retorno, ese es el final de la función. Entonces déjame correr esto otra vez. Digamos que esta persona tiene 10 años de edad y el mínimo h. Vamos a eliminar
este argumento y simplemente apegarnos al,
al valor predeterminado. Entonces alguien que tiene
10 años no puede conducir. Es excelente. Entonces, ¿qué pasa si
devuelvo esto más? David, y yo simplemente quitamos la sangría en esta
declaración de retorno también. Bueno, el resultado es el mismo. Esta persona no puede conducir. Lo que está pasando aquí, básicamente
estamos diciendo, si esta persona está por debajo
del límite de edad mínima, devolvió falso, una vez
que llegas a este punto, la función está terminada. No voy a continuar. Aquí abajo. Veamos otro ejemplo. Déjame crear una nueva
función que simplemente diga, llamémoslo prueba por ahora. Y tomarán y numerarán. Yo sólo voy a decir el argumento num colon,
ingrese la función. Vamos a decir si
num es igual, igual a uno, vamos, volvamos. Devolvamos uno. Sólo una cuerda que dice uno. Si num es igual, es igual a
dos, eso se devuelve. De lo contrario, volvamos. Más. Al igual que en esta disfunción
es solo un ejemplo, no tiene mucho sentido. Así que vamos a ejecutar esto. Digamos prueba. Primero uno y
voy a imprimir los resultados. No voy a
almacenarlo en una variable, voy a imprimirlo directamente. Entonces 12, perdón por eso. Si digo 20,
volverá más. Excelente. Entonces esto es el equivalente a
decir si mas, si mas regresan mas. Pero una vez más, debido a que la sentencia return
marca el final, básicamente sale de la función. Esta última otra cosa no es necesaria. Esto es muy poderoso
porque significa que puedes,
puedes dictar el flujo
de tu función de esta manera. Podemos tener muchas condiciones, muchas instrucciones. Y una vez que golpeas
cierta condición, puedes decir, bien,
eso es todo lo que necesitamos. Salga de la función
para devolver un valor, cualquier valor que
desee, que es, por ejemplo aquí estamos devolviendo
diferentes valores. Aquí. No tienes que devolver
el mismo tipo de valor. Incluso podrías
devolver una NAN, por ejemplo y en este caso el 20
no es ni uno ni dos.
Por lo tanto, no devolviendo ninguno. Ahora eso es, una vez más, esa es tu elección,
que depende de ti. Ojalá esto tuviera sentido. Las funciones pueden ser un
poco confusas y especialmente las declaraciones de
retorno pueden ser un poco
confusas para la gente. Pero cuanto más lo uses, más familiares se
volverán. Una última cosa antes que nosotros. Vamos a acabar con esto. Y ese es un tema muy
importante, que es la documentación. Es docstrings. Una vez más, como
mencioné antes, una docstring es básicamente
una cadena que podemos usar dentro de una función que
actúa como documentación, ahí el nombre dark strip. Docstring es una cita triple. Pueden ser o bien
tres comillas simples solo para abrirlas
y cerrarlas. O tres comillas dobles,
me voy a apegar a comillas dobles
en este caso. Ahora bien, lo que hacen los docstrings
es aportar documentación, como ya
mencioné, voy a dar una explicación sencilla. Aquí. Es una descripción, lo siento,
no una explicación. Esta función. Y ahora es algo
que es muy importante incluir
en tu cadena de documentos. No importa qué tipo
de convención
sigas en docstrings es
muy importante de proporcionar. Sus argumentos. O convención que
me gusta seguir es tocando args colon. Y bajo eso,
vamos a aportar
los argumentos que, que hacen
que la óptica funcione en este caso es este argumento num. Sé que num
será un entero. Y me gusta dar
una descripción simple para el segundo año, el lado bueno, por ejemplo y luego si la
función está regresando, algo que me gusta agregar
también es devoluciones. Al igual que una sección del
lado derecho, del tipo que se está
devolviendo en este caso, sabemos que es una cadena. Entonces digamos que
devolverá una cadena, cadena entera pasada adentro. Esto es solo una descripción
de ese valor de retorno. Ahora, escribir los docstrings
puede ser un poco tedioso. Mucha gente no lo hace. Pero créeme, es sumamente importante y te
beneficiará tanto. Y solo el hecho de que
escribas docstrings pool. Si quieres continuar con esta carrera de scripting o
programación, te ayudará
inmensamente en tu carrera. Entonces, ¿cuál es el beneficio
de esos docstrings? Bueno, una de ellas es que de
un vistazo cuando estás
mirando una función, realidad solo
puedes ver
la documentación cuando
regreses a leer tu
código dentro de un año. Ya sabes lo
que sucede cuando
alguien más quiere usar tu función. Ellos saben lo que se espera
como entrada y salida. Pero también, aunque no
tengas acceso a la
función en sí directamente, puedes acceder, aunque no
tengas acceso para leer el código fuente o lo que hay
dentro de la función. Imaginemos que
estamos aquí abajo. Realmente no sabemos
lo que hay dentro de la prueba. Hay una función incorporada
en Python que se llama Help. Puedes pasarlo en tu
función sin llamarlo. Observe como no estoy
poniendo la marca, esto, no la
estoy llamando simplemente pasando en nombre
de la función. Déjame despejar mi ventana de salida. Vamos a ejecutar esto. Y el resultado de
esta función de salud es exactamente la docstring. Entonces dice prueba. Aquí, dice Help one
function tests in Module main. No te preocupes por
lo que esto significa. Simplemente significa que y en realidad solo significa que no
hay módulo. Solo estamos llamando a
esto en Maine, que es una especie de
lugar predeterminado para ejecutar código. Ahora el nombre de la
función es tests. Acepto un
argumento llamado num. Esta es la descripción que
ponemos al principio, y estos son los argumentos y
el tipo de retorno
que brindamos. Ahora, puedes ver lo
útil que puede ser eso si no
tuviéramos esto puesto en, tenemos la docstring
y ejecutamos las pruebas fueron ejecutadas ayuda en test. Veamos qué pasa. Dice Ayuda en pruebas de
función y más dominio te da el
nombre de la función, el argumento que espera, y luego nada, lo cual no
es útil en absoluto. Es mucho más útil tener esa información para ti
o para alguien más que pueda
estar usando tu función. Entonces es un gran hábito
meterse en un poco
más de tiempo, pero en realidad no
es mucho más tiempo. Y usted y
muchas otras personas le agradecerán inmensamente
por escribir documentación. Ojalá, funciones que te sean
mucho más familiares. Son sumamente útiles, sumamente importantes
en la programación. Y te harán la
vida mucho más fácil una vez que te pongas más
cómodo con ellos.
18. Proyecto 2 - Herramienta de transferencia de poste: introducción y aversión: Bienvenido a tu próximo
proyecto para este, y vamos a estar creando
una herramienta que
nos ayudará a traducir post es
entre personajes. Déjame darte una demostración de eso. Por cierto, para esta demo, estoy usando esta plataforma
llamada Morfeo. Esta es una plataforma gratuita, es un Rick increíble Fui
creado por Judge load. Se puede obtener de su página web. Juez horton.com slash
proyectos slash Morfeo lo antes posible. Es un Reagan increíble, lo recomiendo
encarecidamente. Voy a estar usando
eso para esta demo. Pero puedes usar
lo que quieras. Estas herramientas deben funcionar con
diferentes tipos de roturas. Los usaremos
porque los judíos tuvieron la
amabilidad de dejarme
usarlo para estos proyectos. Como pueden ver, tengo
tres características, tres plataformas,
todas son la misma plataforma. Se ven un
poco diferentes. Morfeo me permite
modificar la plataforma, crear diferentes versiones
del personaje, pero
es la misma plataforma. Todos ellos han sido
referenciados en la escena. Y este de aquí
ya ha sido publicado. Así que vamos a transferir esa pose
a las otras dos matrices. Seleccionemos, digamos estos controladores y
tal vez la cabeza también. Entonces vamos a transferir esos valores. Sólo se supone que a estos
otros personajes. Seleccionaré uno de
ellos y ejecutaré los dos. Ahí vas. Ahora ambos consiguieron la pose. Digamos que quiero
transferir ahora, hagamos un cambio y este
personaje aquí, justo adelante. Entonces seleccionaré, diré que quiero transferir
esto a estos dos personajes. No importa lo que seleccione, porque sé que
transferiré esto, los controladores que seleccioné
en el primer carácter a los otros dos caracteres que he seleccionado. Y ahí tienes. Excelente. Y por supuesto, también funciona para
un solo personaje. Si quisieras. Vamos a probar eso muy rápido. Excelente. Así que son dos. Ahora, tenemos que hacer un
poco de configuración. Porque una vez que mencioné antes, estas son todas la misma plataforma. La razón por la que esto
funciona y esta es una forma muy común
de trabajar con tipo de herramientas
es que las herramientas se fabrican en o alrededor de la plataforma. Y cuando estás
trabajando en un estudio o un proyecto con otras
personas en equipo. Por lo general, los riesgos son los mismos. La geometría puede ser diferente, el personaje puede verse
completamente diferente. Como puedes ver que entre estos dos personajes,
son muy diferentes. Pero los controladores en la
plataforma son en su mayoría los mismos. Y eso es lo que es,
lo que está pasando aquí. Así es como la herramienta es
capaz de transferir animación o un post que es solo valores
de una semana a la siguiente. Porque estamos trabajando
en referencias de renta, tenemos espacios de nombres. Como puedes ver,
estos controladores, cada control tiene un espacio de nombres. Este personaje aquí,
y luego siendo Severus. El siguiente aquí es Minerva, y el último es Luna. Así que vamos a seguir adelante y crear esta configuración que
vas a necesitar para esto, no
voy a repasar
demasiado sobre el concepto
de espacios de nombres. Si no estás familiarizado con
referencias y espacios de nombres, te
recomiendo que hagas un tutorial rápido en línea porque
voy a ser muy importante y también es muy útil
saber como animador o cómo trabajar con
referencias y espacios de nombres. Así que sigamos adelante
y hagamos la configuración. Parto de una escena
fresca en Maya. Esta es una escena completamente nueva. Cuando vas al menú Archivo
y al editor de referencias. Una vez más, para que esto funcione, vamos a estar
usando referencias
porque las tarifas
son todas iguales, así que necesitamos referenciarlas
y ponerlas detrás de
ese espacio de nombres. Voy a jugar un
clic en el botón más. Y ya tengo estas
tarifas en una carpeta. Tengo la versión femenina,
la versión masculina. Entonces voy a estar usando esos. Ya está aquí. Pero digamos el primero, el masculino primero. El orden no importa. Es todo lo mismo. Yo sólo voy a hacer esta primera referencia
que interesa. Ahora, Maya me da el espacio de
nombres automáticamente, que es más correo de
subrayado fusel. Puedes dejar
eso como está si quieres. Voy a llamarlo Severus. Es un poco más divertido. Y luego hagamos el otro. Pensando un poco de tiempo. Se trata de una plataforma pesada. Pero de nuevo, es un Rick
muy agradable. Ahora, al siguiente, llamémoslo Minerva. Una vez más, el espacio de nombres no
importa.
Eso depende de ti. Solo estoy eligiendo hacer esto para que sea un poco
más interesante. Excelente. Tenemos las dos plataformas,
Severus y Minerva. Sólo voy a hacer a ahora mismo. Pero esta herramienta funcionará con
dos o más tarifas a tu altura. No tengo la textura está
cargada, pero está bien. No me voy a preocupar
demasiado por las texturas. Solo nos importan los
controladores en este caso, para lo que sea que decidas usar, puedes cargar las
texturas o no. Eso no le
importa a la herramienta. Voy a usar el material
por defecto solo para dar el sombreado de manera uniforme. Y por alguna razón
hay negros. Entonces, encendamos la iluminación de dos
caras de doble cara. Ahí vas. No se ven tan bonitas, sino Herramienta. Simplemente va a estar trabajando en el controlador, así que está bien. Ahí vas. Déjame mover esto hacia arriba. Y vamos a hacer una prueba
rápida en la herramienta. Vayamos de Minerva. Simplemente se separa. Ahí vas. Está funcionando. Excelente. Esta es la configuración que necesitas. Una vez más, si
no estás muy familiarizado con los espacios de nombres y referencias
dentro de Maya, te
recomiendo encarecidamente pases unos minutos solo
aprendiendo sobre eso. No es muy complicado, pero es muy útil. Entonces sigamos adelante y
saltemos al código. En realidad, antes de
saltar al código, desglosemos
lo que está pasando aquí. Veamos cómo, veamos los pasos que estamos
tratando de automatizar. Entonces, permítanme unir estas
restricciones. Déjame poner a cero estos. Bien. ¿Qué significa
transferir puestos? Tomemos este control de
pecho, por ejemplo para que como veas, ambos
son iguales. Así que rig columna vertebral, cero piel,
hombro, hombros, y es un
poco de nombre largo, pero lo importante es
que ambos son iguales. Están justo detrás de
este espacio de nombres. Entonces para estos controles, sus servidores y a través de este
rastrillo los espacios de nombres Minerva. Entonces vamos, cambiemos la
rotación sobre este personaje. Digamos que 90. Perfecto. Para transferir esta pose, básicamente
queremos aplicar
el mismo valor a este
controlador de aquí, que de nuevo es el
mismo controlador, está justo debajo de un espacio de nombres
diferente. ¿Cómo haríamos
eso? Vamos a abrir el editor de guiones. Pidamos una vez más a Maya que nos
dé alguna
información valiosa. Una vez más, voy
a cambiar ese valor, que es rotar x y
ver qué pasa. Bien, Perfecto. Mis ojos
diciéndonos que hay, este es el comando
que está corriendo, dijo sumador. Entonces el nombre del controlador, que es el nombre del objeto, puntean el nombre del atributo. Bien, entonces este es el
nombre completo del atributo. Eso significa que la rotación x y ese controlador
tienen este nombre, que es un controlador, que
es un espacio de nombres, dos puntos. Lo siento, no quise hacer eso. Un espacio de nombres dos puntos, el
nombre del control, y luego punto y luego el
nombre del atributo. Y ahí está este comando set R. Traduzcamos
esto a Python. Yo lo haré, necesito
importar esta biblioteca. Así que desde mi entrada CMBS biblioteca va a hacer CMV como punto sumador conjunto. Y luego entre paréntesis. Recuerda que el sub
aquí es código de olor, por lo que solo lo usamos como
guía, como plano. No necesitamos el
punto y coma en Python. Vamos a abrir
y cerrar paréntesis. El primer argumento
será el nombre, el nombre completo de ese atributo. Y el segundo argumento
será el valor que
queremos establecer sobre ese
atributo. Entonces ahí tienes. Esta es la base de nuestra configuración de herramientas y
obtención de atributos. Vamos a establecer este atributo otra
cosa, digamos 80. Déjame hacerlo otra vez. Para que puedas ver el
cambio aquí. Lo siento. Sé que esto se ve muy
doloroso. Lo siento, soy Nerva. Por favor, perdóname. Volvamos a cero. Vamos a darle un alivio en
su espalda. Ahí vas. Ahora, hagamos lo mismo simplemente cambiando
el espacio de nombres. Ahora el otro espacio de
nombres está separado, y vamos a establecerlo en 80. Vamos a ejecutar este código. Ahí vas. Como puedes ver, todo lo que estamos
cambiando es el espacio de nombres. Ahora, necesitamos saber cuál es el valor de un
controlador. Podemos aplicarlo al
siguiente controlador, ¿verdad? Déjame poner a cero esto. Una vez más. Vamos
a llevarlos de vuelta a, vuelta a la pose por defecto. Permítanme aplicar un valor
en esta rotación. Y así sucede, hay una manera de obtener este
valor y es muy intuitivo. Se llama Get outer. Trabajaríamos de manera similar
como dije, sumador, pero claro que no estamos
estableciendo un atributo, así que no necesitamos pasar
ningún argumento extra. Todo lo que hacemos es llegar a la vídora. Digamos que queremos obtener
el atributo, el valor de este
atributo de rotación, Minerva. Entonces tenemos que cambiar
este namespace Minerva. Y diremos que la
rotación es igual a eso. Vamos a imprimir esto.
Veamos qué pasa aquí. Vamos a imprimir la rotación. Déjame hacer esto un
poco más grande por aquí y aclarar mi historial
de salida. Bien, ahí tienes. Bueno. Sumador con el nombre completo
del atributo básicamente te
dará el valor que
estamos buscando. Como probablemente estés adivinando, todo lo que tenemos que hacer es
establecer el atributo. Voy a, voy a
llamar a esta rotación x porque eso es lo que estamos haciendo. Genial. Así que estamos almacenando
ese valor en rotación x. Así que todo lo que tenemos que hacer es
aplicar el mismo controlador, mismo atributo en los servidores. Ahí vas. Eso es, esa es básicamente
la base de nuestra herramienta. Es muy sencillo, que es bueno, sencillo, Siempre es bueno. Solo necesitamos hacer todo
esto programáticamente, lo que significa que necesitamos
saber cuál
es el personaje que estamos seleccionando, qué controladores
estamos seleccionando. Necesitamos obtener los
atributos de eso, de esos controladores y aplicarlo al siguiente carácter. Ojalá eso tenga sentido. Ahora, vamos a seguir adelante
y echar un vistazo al código.
19. Espacios de nombres y listas: Vamos a estar
cortando fuera de mi principalmente en PyCharm. Si no has visto
el video del patrón, hazlo a menos que estés usando
tu propia elección de un texto, cetera lo son, en cuyo
caso está bien. Pero en el video de PyCharm, repaso cómo
configurar el proyecto. Nosotros configuramos el proyecto en tus documentos carpeta de
scripts mayas. Y la razón de esto
es porque Maya ya sabe leer código de
esa carpeta. Entonces vamos a estar
escribiendo nuestros módulos o código aquí para que sea
fácil para Maya acceder. Vamos a probar con nuestro módulo. Voy a crear un nuevo archivo, ese simple archivo de texto. Podemos hacer esto dentro
de PyCharm por supuesto, pero ya te mostré
esto manualmente primero. Esto es lo que
vamos a estar importando. Voy a llamarlo posts
Transfer dot en lugar de dx, dy dot p-y o Python. Windows me pedirá que lo
confirme. Diré que sí. Ahora bien, si voy a PyCharm y eso no es
gráfico circular, ese es término pi. Verás que ese
archivo aparece aquí. Y claro que está vacío. Pero ahora podemos comenzar a codificar. ¿Qué tenemos que hacer primero? Bueno, la esencia de
la herramienta es básicamente, como mencioné, estamos
trabajando mucho con los espacios de nombres. Poco es básicamente
decir transferencia opuesta de un espacio de nombres a
otro espacio de nombres. Entonces necesitamos poder obtener
los espacios de nombres con los que
queremos trabajar. Ese es uno de los primeros
pasos. Para poder hacer eso. Necesitamos trabajar con la
selección porque estamos obteniendo el espacio de nombres
se basa en la selección. Selecciono un personaje
y luego el siguiente, y luego
transfiero las publicaciones seleccionadas del personaje
uno al personaje. Así que vamos a conseguir, vamos a trabajar en
conseguir ese espacio de nombres primero. Y entonces trabajaremos para
conseguir esta elección. ¿Cómo obtenemos el espacio de nombres? ¿Si seleccionas algo? Verás aquí
en la caja del canal que incluso están aquí como mi
ya sacado esto. El nombre del
controlador es una cadena. O podemos
pensarlo como una cuerda. Por lo menos. Contiene el espacio de nombres, tiene dos puntos y luego contiene el
nombre del controlador. Entonces pongamos esto en una variable. Básicamente necesitamos obtener
la primera parte de esto. Y para ello, podemos dividir
la cadena por esa columna. Podemos hacer control dot split. Esta es una función que
viene con cuerdas. Podemos decir control que se divide. Queremos
dividirlo en la columna. Vamos a imprimir esto. Adelante e imprime esto
directamente. Genial, ahí tienes. Como pueden ver,
tenemos la primera parte y luego la segunda parte. Ahora solía conducir
el ejemplo a casa. ¿Y si nos dividimos en
los guiones bajos? Bueno entonces obtienes más partes. Obtienes todo lo que es antes y después de
cada guión bajo. Pero para nuestros propósitos, todo lo que necesitamos es
dividirlo por el, por el colon. Entonces obtenemos una lista, el resultado de esta función de
división. Es una lista con todas
las partes que se dividieron. Y la que nos
importa es la primera parte. Como ya he mencionado antes. Estaremos aprendiendo sobre la
lista en este proyecto. Nuestra lista es solo una
colección de objetos, de artículos, cualquier cosa
que puedas, tú quieras. Pueden ser cadenas, pueden ser enteros, pueden ser
funciones en sí mismas, pueden ser lo que quieras. Y empezamos a contar
estos ítems a cero. Entonces este primer artículo, así que permítanme
entrar en pintura para esto. Se puede ver una lista. Puedes, como que te puedes
imaginar una lista como esta. También se llama array. Por cierto, algunas personas los
llamarán array, pero nosotros les estaremos
llamando listas. Así que imagina que esto es una lista. Vamos a hacerlo más simple. Esta es una lista con
cuatro ítems. También. 3.4. Empezamos a contar a cero. Esto es cero, el elemento, este es uno, esto es dos. Esto es cierto. Entonces, ¿y si quieres
obtener el segundo elemento de una lista mientras usas el
índice número uno, cuál de estos
se llama índices? Si quieres obtener el
primer elemento de una lista, usas el índice cero. Si quieres obtener el segundo
elemento lista diferente, usas el índice uno, y
así sucesivamente y así sucesivamente. Entonces hagámoslo. La sintaxis para obtener
un elemento de la lista, es otro corchetes abiertos y
cerrados. Entonces digamos que queremos conseguir el
primero, que es uno. Vamos a ejecutar esto y
vamos a conseguir uno. Excelente. Digamos que queremos
conseguir el tercero. Una vez más, estamos
empezando en cero. Entonces obtendremos el segundo índice. Excelente. Vamos, vamos a guardar
esta división en una variable. Llamémoslo piezas de control. Y ahora vamos a imprimir, déjame borrar esto. Imprimimos esa variable. Excelentes meses
otra vez es una lista. Ahora vamos a obtener el primer ítem, que una vez más, anotar
corchetes, ceros, índice. Y eso es lo que
estamos buscando. Esto significa que nuestro espacio principal de espacio de
nombres será ese primer índice. Podemos combinar todos estos. De esta manera. Podemos decir que el espacio de nombres será el
primer elemento de esa división. Genial, así es como
obtenemos namespace. Ahora bien, lo que necesitamos obtener
antes de que podamos obtener espacio de
nombres son estos controladores
basados en la selección? Entonces sigamos adelante y hagamos eso.
20. Selección y bucles "para ": Selección. Necesitamos de nuevo esta biblioteca CMBS. Entonces déjenme poner eso
en mi impulso él, sí, hay una función llamada
ls que significa lista. Observe en un Python listas como las que
hemos estado viendo hasta ahora. Pero he visto una función
que te dará una lista de objetos
en la escena, por ejemplo, si quieres obtener todas
las cámaras de la escena, puedes importar biblioteca.
Vamos a ejecutar esto. Ves que obtienes las
cámaras en la escena
a partir de los respectivos resultados de la cámara. Con algunas cámaras, se
pueden obtener luces, por ejemplo, las cuales no tengo ninguna
luz en este momento. Entonces esa es una lista vacía. Vamos a esperarlo. Puedes obtener selección. Como no tengo nada seleccionado, tengo una lista vacía. Pero en cuanto
seleccione algo, permítanme borrar mi ventana de salida. Tan pronto como selecciono algo, obtengo una lista con estos objetos seleccionados
eléctricos. Y como pueden ver, este es el nombre que
estamos buscando. Entonces si selecciono más de uno, digamos que este brazo
me controla, solo imprima. Ahí vas. Entonces obtengo una lista
de todos esos controladores con su espacio de nombres
y el controlador. Así que ahora podemos empezar a
aplicar esta técnica para extraer el espacio de nombres de
toda la selección. Entonces sigamos adelante y
pasemos al término pi para
empezar a hacer esto. En nuestro módulo post-trasplante, la parte que acabamos de crear, vamos a crear una función def espacio definido la
función, obtener seleccionado. Espacios de nombres, abrir, cerrar
paréntesis, columna. Pero antes que nada, empecemos
por conseguir la selección. podamos almacenar
esa selección como te
mostré antes en una
variable llamada selección. La selección será igual. Y en realidad no he importado mi biblioteca de Maya,
importante CMBS. Estos se mostrarán en rojo. Eso se debe a que Python no sabe de dónde obtener el
CMB como biblioteca. Pero no importa porque PyCharm no está ejecutando el código. En este caso, maya
estará ejecutando este código. Entonces, mientras Maya tenga
acceso a esto, está bien. Entonces la selección equivale a
Cmd S punto ls. La selección es igual a true. Esto nos dará los controles
seleccionados. Entonces, ¿qué pasa si
no se selecciona nada? Podemos verificar la
longitud de una lista. Entonces, una vez más, esta
será una lista. Podemos verificar
cuánto tiempo enumeré con una
función de devolución de llamada funcional llamada Len L-E-N. La selección de Len
básicamente
te dirá cuántos artículos
hay en una lista. Ahora, ya mencioné antes
que empiezas a contar a cero. Pero en el caso de la longitud, en realidad
te está diciendo la cantidad de cosas dentro de la lista. Por lo que no estará
contando a cero si la lista tiene tres
elementos en ella. Tierra, te daremos tres. Queremos decir si len es igual,
igual a cero, es decir que
es que no hay nada
dentro de la lista. Bueno, no podemos obtener ningún espacio de nombres de la nada
así que no podemos continuar, así podemos regresar aquí. Pero estamos haciendo una función
que devolverá espacios de nombres. Así que mantengamos consistente
y devolvamos una lista vacía. Antes de continuar,
fijemos las expectativas de esta función
en el docstring. Una vez más, voy a
presionar 33 comillas dobles. Diríamos que voy
a escribir una pequeña descripción
para la función. Obtener lista de seleccionados. Ahora obtén lista de espacios de nombres
para la raza seleccionada. Y devolverá una lista. Excelente, Así que si no
hay nada seleccionado, devolvemos una lista vacía. De lo contrario, vamos a
tener que iterar a través esa selección para
poder obtener los
espacios de nombres que acabamos de ver. ¿Cómo lo hacemos? Necesitamos
usar un bucle for para esto. La sintaxis para esto es para, llamémoslo ítem. En selección. Vamos a conseguir nuestro
código que acabamos de tener. Teníamos aquí arriba. Déjame pegarlo aquí. En realidad,
llamemos a estos control. Llamemos a este control
en lugar de ítem. En cuyo caso no
necesitamos esto aquí porque
esto está codificado duro. No queremos trabajar
con ese único control. Trabajar en cualquier cosa
que haya sido seleccionada. Para controlar la selección. Obtener el espacio de nombres, que una
vez más hacemos dividiendo el control por los dos puntos y
luego obteniendo el primer elemento. Y ahora para almacenar nuestros espacios de nombres, vamos a comenzar
una lista vacía. Los espacios de nombres equivalen a una lista vacía. Entonces, ¿cómo agregamos este espacio de nombres a ese
listado de espacios de nombres Vamos a llamar a esto
realmente en la lista de espacios. Un poco más explícito. Se puede decir espacio de nombres, lista, punto append, y el espacio de nombres. Ahora algo que probablemente
estés notando es que las listas
pueden ser modificadas. Esto se llama mutabilidad. La lista es inmutable,
eso significa que se puede modificar. Hay otro tipo de datos, ese tipo de datos llamado
tuplas que actúa como una lista, pero no se puede modificar. Es inmutable. Pero vamos a tocar
eso un poco más tarde. Por ahora, es importante
saber que
al menos se puede modificar en su lugar. Así que cada vez que estamos
agregando un espacio de nombres aquí, en realidad
estamos modificando
esta lista aquí arriba. Entonces una vez hecho eso, devolvamos esa lista de
espacios de nombres. Permítanme añadir algunos comentarios. Déjame decir aquí vamos a
extraer el espacio de nombres del control. Aquí vamos a pasar por encima
de la selección. Ahora bien esto es muy redundante, pero es la primera vez que
buscamos bucles. Entonces vamos a agregar algunos
comentarios y luego agregar nombres para
enumerar los espacios de nombres. Una vez más, muy redundante. No hay que
añadir estos comentarios, sino solo para ser un
poco más explícitos. Excelente. Entonces veamos qué nos está dando
esta función. Importemos estos
módulos de transferencia de
publicaciones y simplemente
usemos nuestra función. Entonces volvamos a Maya. Vamos a abrir una nueva pestaña de Python. Y ahora vamos a importar
pose, transferir. Yo, haz que la fuente sea
un poco más grande. Simplemente ejecutemos eso. Ahora bien si destaco el
nombre del módulo y lo
ejecuto, ya sabes
que es,
es, te dice que viene
de esa ubicación documentos, guión
Maya, supongamos transferencia, excelente o por buen camino. Simplemente usemos nuestra función. Almacenemos el resultado
encajado en esta variable. Lo va a llamar
post transferencia. Uno,
lo voy a llamar, vamos a llamar a la función de post
transfer y se
llama get selected namespaces. Entonces, primero probemos el caso
donde no se selecciona nada. Lo siento, no lo imprimí. Así que vamos a imprimir espacios de nombre. Genial, una
lista vacía como se esperaba. Ahora, si selecciono un control, obtenemos ese espacio de nombres. Si selecciono dos caracteres, seleccionemos el
primero y el segundo REG. Bien, estamos obteniendo todos los espacios
de nombres, pero se
repiten. Entonces esto es, esto no es
necesariamente esto es redundante. Tenemos un bicho. Veamos
qué está pasando ahí. Entonces digamos que selecciono un
control en cada personaje. Ahora bien, este es el
resultado que queremos. Lo que está sucediendo ahora es
que estamos obteniendo el, el espacio de nombres varias
veces por carácter. Así que sigamos adelante y arreglemos eso. Volvamos a PyCharm. Eso es cierto. Entonces estamos agregando el espacio de nombres
cada vez. Pero lo que queremos es sólo
anexar a esa lista, la lista de espacios de nombres si
no está ya en la lista. Así que simplemente podemos decir
si no espacio de nombres en la lista de espacios de nombres de lo
que pretendía, y entonces
realmente estás trabajando. Esto es correcto, pero
esto suele ser más, más común
escribirlo de esta manera. Si no, es espacio de nombres,
no en especialista. Esta es una comprobación muy sencilla para ver si hay algo
dentro de toda la lista. Si no lo es, entonces
agregamos, excelente. Volvamos a Maya. Déjame recargar este módulo
porque hicimos algunos cambios. Vamos a recargar eso. Ejecutemos este código una vez más. Excelente. Entonces ahora
¿qué pasa si seleccionamos múltiples controladores? Todavía solo obtienes un solo espacio de
nombres por personaje. Increíble, eso es
exactamente lo que queremos. Es seleccionar
algunas otras cosas. Entonces voy a
apagar todo las
curvas de nervios
para la selección. Genial, eso es exactamente
lo que queremos. Entonces nuestra primera función está lista. Docstring está listo. Genial, Pasemos
a la siguiente función.
21. Resumen de los Loops: Antes de pasar a
la siguiente función, sí
quiero aclarar
qué está
haciendo el bucle for porque ese es un concepto nuevo y lo vamos
a estar usando mucho más. Entonces te va a ser
muy familiar. Pero echemos un vistazo rápido a lo que realmente está sucediendo. Una vez más, teníamos nuestra lista. Vamos a crear una lista de ejemplo. Voy a llamarlo lista de pruebas. Ahora, estoy evitando
llamar a esta lista. Es válido. Se puede llamar a
esta lista de variables. Pero al menos en realidad es un tipo incorporado en
Python o una función, lo que significa que puedes convertir
algo en una lista. Al hacer esto, por ejemplo, puede convertir una
cadena en el más alto, evitando que se convierta en esa función. Por eso estoy evitando
anular esto, porque si llamo a
mi lista de variables, sobrescribiré y
suele ser una mala idea. Quizá no sea mala idea,
pero no es buena idea anular
los
tipos incorporados en Python. Entonces voy a
llamarlo así lista, y solo va a ser
una simple lista de cadenas. Vamos a decir el mismo
ejemplo que antes, 123. Ahora, el bucle for, esto recorrerá estos elementos o iterará sobre cada
uno de estos elementos. Vamos a decir por número en la lista, lista, número de impresión. Vamos a ejecutar este código. Excelente. Entonces, como ves, es simplemente imprimir cada uno de esos elementos dentro de esa lista. Ahora, número es una
variable que elegí, que tú eliges el
nombre de esta variable. Y básicamente estás diciendo para cada uno de estos elementos, así que esta lista almacena eso
en este número variable. Y luego dentro
de ese bucle for, puedes usar ese número. e.g podemos, podemos hacer algunos
enteros, Digamos 235. Ve a sacar eso a colación. Pero también podríamos decir
número de impresión por dos, por ejemplo, estos deberían imprimir
o 6.10, ¿verdad? Ahí vas. Entonces eso es lo que,
lo que está pasando. Básicamente estamos diciendo almacenar, pasar por cada uno de estos
elementos almacenados en una variable, entonces esa variable es accesible para usted
dentro de ese bucle for. Y básicamente
lo estamos haciendo desde la selección funcionando
la biblioteca CMBS. Para completar este ejemplo,
sigamos adelante y usemos
eso que precedió a la onda S. Solo dejemos el número
variable. No es un gran nombre para lo que estamos usando aquí,
pero es válido. Ahí vas. Entonces como puedes ver,
donde simplemente iterando sobre cada
elemento que seleccionará. Ojalá eso quede claro,
pero no te preocupes, vamos a seguir usando
for-loops a lo largo de
este curso. Entonces, pasemos a
la siguiente función entonces.
22. Obtener atributos: Lo siguiente que tenemos que hacer es obtener los atributos que
queremos transferir, ¿verdad? Entonces esta herramienta básicamente está diciendo obtener los controladores seleccionados,
obtener los atributos. También vamos
a tener que almacenar los valores para cada uno
de esos atributos. Vamos a llegar a eso a continuación. Pero primero necesitamos
obtener los atributos para
ello para que podamos transferirlo
a la próxima semana. Entonces, ¿cómo
transferimos atributos? Bien, bueno, vamos,
volvamos a
trabajar con este control . Vamos a ponerlo aquí. Digamos que estamos trabajando
con ese control. Ahora, el nombre del nodo
incluye el espacio de nombres. Eso es importante
porque así sabe Maya qué personaje es. El control pertenece a, a lo que son los pulmones
controlables por sí mismo. Este es el nombre de la base, el nombre base del control. Pero dentro de la escena, vive bajo ese espacio de nombres. Entonces es importante
mantener eso ahí dentro. Hay una función
llamada sumador de lista. Y echemos un vistazo a lo que hace en la documentación. Lo tengo justo aquí. Lista sumador,
simplemente puede buscar. Dice que este comando enumera
los atributos de un nodo. Si no hay flujo o un especificado, se listan
todos los atributos. Bien, bajemos
a los ejemplos. Parece que si no
le das el nombre de ningún nodo, listará los atributos
de las notas seleccionadas. Pero si le das
el nombre de un nodo, listará los
atributos en ese nodo. Entonces probemos eso. Se llama nodo de control. Nodo. Vamos a llamarlo almacenar esto en una
variable llamada atributos, y vamos a imprimir esa variable. Bien, genial. Entonces esto es un montón de atributos,
una lista muy larga. Algunos de ellos son lo que
vemos aquí curso de amplitud. Probablemente vamos a
ver rotación, traslación. Pero también vemos muchas
cosas que
probablemente se heredan
de otra cosa. Ahora, en realidad hay
limitaciones, por
supuesto, hay algunas restricciones de las que deberíamos
preocuparnos, por ejemplo , no queremos obtener
atributos que estén bloqueados. Por ejemplo, solo
queremos obtener atributos es
que somos capaces de establecer. Entonces, si vas a
la documentación, en realidad
verás que hay algunas opciones que puedes
pasar a este comando. Puedes deshacerte solo de los atributos de
acto. Se pueden obtener atributos que
son croquetas, que están bloqueados. Y puedes conseguir
los que son. Entonces aquí, configurable. Echemos un vistazo a
lo que nos van a dar estos. Ajustable es igual a verdadero. Bien, eso no
parece muy diferente. Lo mostré, sé que es diferente. Comienza con cobrar
en lugar de mensaje. Eso sigue siendo mucho.
Lista más pequeña como puedes ver, todavía mucho y
hay cosas que quizás no
nos importen. Entonces, ¿qué tal si nos enfocamos los atributos en
la caja del canal Para eso, hay
otra función. Es una función llamada CMBS, totalmente acaba de hacer un tazón. Ahora busquemos eso en la
lista de documentación animable, cómo encontré este bono
para buscar en foros en internet y buscar la mejor manera de obtener atributos
de la caja del canal. Yo hice ese trabajo por adelantado para ti y ahora solo te estoy
dando la respuesta. De lo contrario
tardaría mucho. Entonces este comando enumera los
atributos animables de un nodo, permite filtrar por el manipulador o
nodo
actual . ¿Bien? Probablemente podamos usar este activo
es sin ningún argumento. Realmente no nos
importan las formas. No nos importa. Tipo. Estos vuelan sólidos, ya
no apoyados. No tenemos que
preocuparnos por eso. Sólo afectado por el manipulador
actual. Definitivamente no
quiero hacer eso. Esto significa que si eres manipulador está en modo de
traducción, solo
vas a obtener
los atributos de traducción. Definitivamente no
queremos hacer eso. Simplemente pasemos
este nodo y
reemplacemos nuestro sumador de listas con
nuestra función lista animable. Vamos a imprimirlo. Bien, esto se ve muy diferente. Para que sea un
poco fácil de leer. De hecho, echemos un vistazo
a esta lista. Entonces digamos para nutria en
atributos, imprime más caliente. Ahora bien, esto es solo para fines de
visualización. Yo solo quería ver la lista en lugar de tener la lista plana. Sí, ahí tienes. Se presenta
como una lista real. Lo que estamos viendo aquí, en realidad
estamos viendo
el camino completo de estos atributos
o el camino completo del, de estos controladores. Entonces como ves, está iniciando
estos todos los nodos de anime. Y luego
entra en grupo de plataformas. Y luego hay otro
grupo llamado
reagrupamiento de mantequilla hasta el final. Al final de cada uno de estos, estará el nombre
del controlador. Y al final estará el
nombre del atributo. Esto es lo que
realmente nos importa. Y esto es lo que vemos
en la caja del canal, traslación x ,
y y z, rotación y
amplitud o amplitud. Eso es genial. Eso es lo que realmente queremos. Realmente no nos
importan todos estos. Honestamente, esto es muy detallado y un poco molesto
si estoy siendo honesto. Así que vamos a limpiar esto. Si miras este
camino con detenimiento, podemos hacer algunas cosas. Pero algo que
ya hemos aprendido a hacer es cómo dividir cadenas. Así que simplemente podemos
dividirnos por el punto. Observe que aquí
no hay otros puntos. Así que eso se guardará para hacer si hay una puerta en tu plataforma. Ese podría ser un caso ligeramente
diferente. En ese caso, aún podemos obtener el último elemento de la cadena. Bien, vamos, imaginemos
que ese es el caso. Entonces, trabajemos con este ejemplo. Digamos que queremos
obtener el nombre de este atributo de
esta lista realmente larga. Bien, así que normalmente
trabaja en una pestaña separada de esa Python y pégala aquí. Todo esto es exterior. El nombre será igual a
estas cadenas realmente largas. Entonces, ¿qué pasa si nos
dividimos por los puntos? Sigamos adelante y
hagamos todo eso. Déjame hacer esta variable un poco más corta, solo pobre. Para que sea fácil de escribir. Completo. Adder punto dividido. Que en vez de
dividirnos por los dos puntos, vamos a dividirnos por el punto. A esto le vamos a llamar partes. Vamos a
imprimir esas partes, que como sabemos, será una lista de las
partes antes y después cualquier duda que encuentre
en las grandes partes. Y veamos en realidad
cuántas partes conseguimos. Podemos imprimir la
longitud de esa lista. Len partes. Bien, hay dos de ellos. Entonces aquí hay una primera parte muy
larga, que es el nombre
del controlador. Entonces al final,
este es el nombre del atributo
que nos importa. Ahora, sí mencioné
lo que pasa si hay otro.en este
nombre por alguna razón. Pongamos un.in aquí solo
por el bien del ejemplo. Bien, vamos a ejecutarlo. Ahora. La longitud de nuestra lista es de tres. Eso es porque por supuesto nos encontramos con otro punto
y otro periodo. Y ahora tenemos tres partes. Pero aún así el que nos
importa es el que está
al final. Si asumimos que no hay, solo
hay uno.en el nombre, simplemente
podemos decir, bien, bien dar el nombre del
atributo será el segundo. ¿Qué pasa si
hay más de uno? Bueno, necesitamos obtener
el último índice, ¿verdad? ¿Cómo lo hacemos? Hay dos formas de hacerlo. De una manera, ya sabemos
cuántos artículos hay en la lista. Entonces simplemente podemos decir, bien, hay tres ítems que queremos el tercer ítem porque
empezamos a contar a cero. En realidad podemos decir, bien, queremos el número
de artículos menos uno. Porque el tercer ítem, si estás contando a cero, será el número 20
será el primero, 11 será el segundo, 12 será el tercero, ¿verdad? Entonces podemos usar esto
a nuestro favor. Partes. Digamos que el número de piezas será que la longitud de la lista de cadenas de
piezas. Y luego el nombre del atributo. Sólo llamémoslo vídora. El sumador será artes y el número de índice será el último índice posible, que es el número de,
número de partes menos uno. Así que vamos a imprimir absoluta. Ahí vas. Eso es. Eso es
lo que nos importa. Ahora, hay una
manera más fácil de conseguir esto. Y eso es simplemente
diciendo menos uno. Sin siquiera saber
cuántos artículos hay en tu lista. Simplemente podemos decir,
dame el índice menos uno, que será el último índice. ¿Cómo funciona esto? Sigamos adelante y rompamos eso
antes de continuar. Como te mostré antes. Imaginemos de nuevo con cuatro elementos como te
mostré antes. El primer ítem es el índice cero, el segundo ítem es el índice uno. El tercero serán dos. Adelante uno será
tres, etc, etc, etc. También hay
índices en negativo. Entonces el último índice de la lista será
índice menos uno. Lo siento, así es como el índice
hacia atrás menos uno. El segundo último
será menos dos. El tercero último, por
supuesto menos tres, y así sucesivamente y así sucesivamente. De esta manera, sin saber cuántos
artículos hay en la lista, simplemente
puedes decir, bien,
dame el último. O si me quieres
el segundo último. Entonces déjame mostrarte
un ejemplo de eso. Volvamos a Maya. Vamos a abrir una nueva pestaña de Python. Hagamos una nueva lista de ejemplos. Vamos a llamarlo ejemplo. Digamos 123. Como es habitual, ya estamos acostumbrados a
este ejemplo. Entonces si digo ejemplo, dame el índice de ceros. Bueno, déjeme encontrar
eso. Es impreso. El índice cero del
ejemplo será uno. Vamos a traer el tercero. El segundo índice será, lo que equivale
al tercer ítem. Eso es tres. Ahora si digo, dame el último, índice menos uno, eso
es lo mismo. Ahora dame un índice menos dos. Eso es equivalente, el mismo. Entonces esa es otra forma para que obtengas el último
ítem de esta lista, sin importar cuántos puntos
tengas aquí. Es un poco
más prueba
fallida alguna manera porque sabemos que la última parte de eso
serán nuestros atributos. Ahí vas. Vamos a poner muy
rápidamente todos
estos juntos. Voy a copiar
esta pieza de código. Ya sabemos cómo obtener esos
nombres de atributos largos de un control. Y voy a pegar
el resto de nuestro código aquí. Haz esto más grande. ¿Bien? Sabemos que los atributos
contendrán estos nombres realmente largos. Y ya sabemos cómo
obtener el nombre simple
o el nombre corto de ese atributo dividiendo sus partes y obteniendo
la última parte dividida. Bien, vamos, vamos,
vamos a combinar estos. Como decíamos,
realmente no necesitamos saber cuántos artículos hay en
la lista del sprint. Podemos hacer todo eso
dentro de este bucle for. Ya que ya
tenemos este código aquí. Pongamos este código y
lo peguemos dentro de este bucle for. Ahora sabemos que la
lista de atributos tendrá estos
nombres largos de atributos. Entonces llamemos a esto sumador completo. Y luego los verbos básicamente
están dando vueltas sobre cada uno de esos
nombres realmente largos que obtuvimos de la función animable lista
o dividiéndola en partes. Estamos recibiendo el nombre corto, que es la última
parte que nos separamos, y ese es el nombre
de nuestros atributos. Entonces, seamos más explícitos. Llamemos a ese nombre. Quitar esto. Bien, ahí tienes. Eso es un poco más limpio. Podemos activar esto en
nombre, yo no nombres. De hecho, podemos crear una lista de estos otros nombres de la misma manera con
los espacios de nombres. Podemos decir
nombres de sumador, punto anexar. Si te lo estás preguntando,
¿necesitamos verificar si ya tenemos el
atributo en otros nombres? Podríamos. Pero estos, esta función te
dará una lista
de atributos únicos, atributos y un
controlador, generalmente único. Entonces no me preocuparía verificar si
ya están en la lista o no porque hay muy buenas posibilidades de que sean únicos. Bien, vamos, vamos,
veamos el flujo de esto. Una vez más, empezamos
con un controlador. En este caso estamos
codificando duro el nombre
del controlador. Obtenemos esos nombres largos de
atributos de la función de escucha
medible. Empezamos una lista vacía para
guardar nuestros nombres cortos. ¿Son solo los
nombres simples de los atributos? Ahora iteramos, recorremos
todos esos nombres largos, y luego comenzamos a dividirnos. Entonces simplemente, una vez que llegamos
al nombre corto que
nos importa, agregamos aquí,
agregamos a esa lista. Y entonces por ahora
simplemente podemos imprimir esa lista. Ahí vas. Esa es la
lista que nos importa. Así que vamos a seguir adelante
y convertir esto en función que no
duro-codifica los nombres, pero vamos a tomar en cualquier
nodo de control
arbitrario y te da los
atributos de él. Déjame copiar esto y pongamos eso en nuestro módulo
en gráfico circular. Pero aún así Clara,
la función final, consigue salidas del nodo. Bien, vamos a pegar eso
dentro de esta función. Como queremos poder
hacer esto para cualquier nodo dado, realidad
podemos usar un
pase que en como entrada. Entonces eso significa que ya
no necesitamos esto. Pasaremos en
el nodo de control. Obtendremos los atributos. Ahora bien, ¿qué pasa si no
hay atributos? Bueno, esa es una buena pregunta. Así que igual que estamos haciendo aquí, si no hay nada seleccionado, devolvemos una lista vacía. Sigamos adelante y hagamos eso. Si len atributos
es igual a cero, devolveremos una lista vacía, igual que hicimos con
los espacios de nombres. A veces estas
funciones en Maya, ellos, si no hay nada para devolver
el retorno un valor distinto de cero. Lo cual no es genial. Yo, para ser honesto,
debería ser consistente. El valor de retorno debe
ser una lista vacía. Pero a veces eso sucede. Entonces, si ese es el caso, y ninguno realmente no va a
fallar si intentas hacer esto. Entonces necesitamos otra alternativa. Cómo verificamos
algo que está, que no está ahí,
algo que está vacío es algo
que es falso. Digamos lo que vimos antes. Podemos decir si no atributos, devolver lista vacía, esto
funcionará para ambos si esto es un non. Entonces si, si esto es, si atributos devuelve
un non, esto funcionará. Pero también si atributo
devuelve una lista vacía, esto también funcionará,
lo cual es genial. Y casualmente, esta
es una cadena vacía,
por ejemplo, esto funcionará. Entonces estos son, la sintaxis en realidad
es muy útil porque no tienes que
saber exactamente qué tipo
estás esperando. Simplemente puedes decir, si es un tipo vacío,
entonces haz algo. A lo que me refiero, si no
está vacío, entonces haz algo. Eso significa que aquí
también podríamos hacer lo mismo. Podríamos estar diciendo,
Si no es selección, entonces devuelve una lista vacía. Ambas, ambas formas en un piloto, si sabes a
ciencia cierta que
será una lista, puedes usar Len. De lo contrario se puede utilizar
no la variable. Sabemos que la selección
es efectivamente una lista, así que no nos vamos
a preocupar por eso. Vamos a dejar
eso como está. Una vez más, obtenemos los atributos
del nodo de control. Si no hay atributos, devolverá una lista vacía. De lo contrario, inicializamos
una lista vacía para almacenar nuestros atributos. Seguimos adelante y dividimos
los nombres de
esos, esos atributos y
simplemente obtenemos el nombre
que nos importa. Probablemente estés
pensando, ¿podríamos combinar estas dos
líneas en una? Sí, podríamos. Simplemente podríamos decir, obtener el último elemento directamente de esa división y decir el
nombre del atributo real será ese. Y quitar esta línea por completo. Ahí vas. Ahora aquí abajo,
en lugar de imprimir, queremos devolver esa
lista de atributos. Y antes de irnos, agreguemos nuestro docstring. Obtener nombres de atributo del nodo. En realidad, lo siento, esto
es de un solo nodo, no sé que es un nodo de
control plural. Estamos esperando una cadena. Nodo abierto. Devolveremos una cadena, no, lo siento, una lista. O devuelva una lista basada en nombres de atributos
simples. Digamos en realidad lunas de atributos
cortos. Eso es lo que es. Bien, perfecto. Vamos, probemos
rápidamente nuestra función. Importamos ese módulo aquí. Así que volvamos a cargar
post transfer porque hemos
hecho algunos cambios. Y luego sostenerlo. Obtener errores del nodo, obtener flechas del nodo. Pasemos este nodo. Por ahora. Una vez más, estamos esperando una cadena
y se llama los sumadores. Vamos a imprimir. Y ahí tienes. Eso es lo que esperábamos. Excelente.
23. Almacenar la postura - introducción a los diccionarios: Ahora que estamos obteniendo los
atributos que nos importan, el siguiente paso es
obtener un mapeo de esos atributos con los valores que queremos establecer en ellos. Porque una vez más,
el objetivo de esta herramienta, y permítanme simplemente establecer algunos
valores y este controlador, el objetivo de esta herramienta es
obtener los atributos
en los controladores. Seleccionamos los valores de
esos atributos y aplicamos esos atributos
y esos valores al
controlador equivalente en otro equipo. Entonces, ¿cómo generamos
ese mapeo? ¿En base a lo que hemos visto? Una forma de hacerlo, simplemente
podemos usar dos listas. Digamos que tenemos una
lista de atributos. Llamemos a esto nutrias
traducir X por ejemplo pizarra. ¿Por qué? Solo
usemos dos ahora mismo. Entonces podemos tener
una lista de valores. Podríamos decir, esto va a ser, solo
estoy copiando este valor
aquí para traducir x será ese valor menos diez
puntos algo. Entonces traducir Y
será -3.90, 54. Entonces podríamos, esto podría funcionar. Podemos decir, bien, bueno el primer ítem de
la lista de valores
pertenecerá al primer ítem de
la lista de direcciones.
Lo mismo para el segundo. Y esa es una forma de
crear un mapeo, ¿verdad? No obstante, hay una mejor
manera de hacerlo. Hay un tipo de datos en
Python llamado diccionarios. Un tipo de datos es simplemente un tipo que
le permite almacenar datos, al
menos aquí mismo. Este es un tipo de datos. String es un tipo de datos. El diccionario o
un **** para abreviar, es un tipo
de datos como una lista, pero cada elemento
del diccionario
contendrá una asignación entre
una clave y un valor. Ahora la forma en que
creamos un diccionario es con las llaves. Se puede ver un
diccionario como un,
como una guía telefónica. Entonces déjame, déjame borrar esto. Y antes de crear
un diccionario real, digamos que queríamos
crear una mayor agenda telefónica. O Ashley, quiero decir, como un diccionario en sí. Diccionario tiene una palabra
y después una descripción. Descripción del mundo. O una vez más, el ejemplo de la guía
telefónica. Digamos que tenemos a Rachel
y tenemos su número. Digamos que tenemos filas
y tenemos su número. Ahora para traducir esto a
un diccionario Python real, llamémoslo teléfonos. Una vez más, vamos a
usar los corchetes, la lista usa los
corchetes. Aquí vamos a estar usando
las llaves. Como dije, cada elemento
del diccionario tendrá una clave. En este caso, la clave
será Rachel, luego dos puntos, y luego el valor, que será su número, luego coma, para
separar los elementos. Entonces esto de aquí, este es el
primer ítem del diccionario. El segundo ítem
, por supuesto, será Ross colon para separar eso. Y luego el 9876. Ahí vas. Entonces este es el equivalente Este ejemplo de la guía telefónica
que creamos aquí. ¿Cómo accedemos al número de
teléfono de Rachel? Llamemos a esto. Dibujemos esto en una
variable llamada número. Es una sintaxis similar es con la lista abrimos y
cerramos corchetes. Pero en lugar de usar un índice, vas a usar la clave que quieres
obtener el valor. Este caso será Rachel. Vamos a traer eso. Ahí vas. Obtenemos el número. Ahora. Obtenemos a Ross. Obtenemos
Ross es el número. Excelente. Entonces así
es como puedes crear mapeos en Python. Antes creamos nuestro diccionario de
atributos reales, que se vería
algo así. Este caso será Traducir. X sería este valor aquí
lo estoy creando de forma manual, pero claro que lo vamos a estar haciendo en base a la selección. Y será este valor aquí. Y entonces vamos a llamar a esto los atributos son
nutrias diccionario. Y déjame sacar el
valor de eso. Sólo estoy cambiando los
nombres de las variables. No importa. Sólo estoy tratando de hacerlo
un poco más obvio. Bien, Esto es genial. Cometí un error. Ross no es clave
en ese diccionario, claro, porque
cambiamos las claves. Si intentas obtener un valor de un poco que no existe,
obtendrás ese error. Entonces déjame conseguir uno
que debería existir. Ahí vas. Antes de crear nuestro diccionario
real, algunas cosas a señalar
sobre los diccionarios es que las claves tienen que ser únicas. ¿Qué quiero decir con esto? Digamos que quiero
agregar una nueva clave Traducir Y. Y el valor será, solo
llamémoslo 100. Ahora bien, si me gusta por ti solo consigue uno de ellos y el
primero es ignorado. Una vez más, eso
es porque si
agregas la misma clave más de una vez, se sobrescribirá
porque las claves tienen
que ser únicas. Excelente. Entonces supongo que deberíamos revisar algunas de las funcionalidades
dentro de los diccionarios. Una vez más, para obtener un valor, se utilizan los corchetes. Déjame quitar esta llave, esa llave, corchete central, y luego usas la clave de la que
quieres obtener el valor. Si quieres obtener todas
las claves en un diccionario, simplemente
puedes decir claves de punto de
diccionario. Esto te dará
lista de las claves. Ahora bien, si quieres obtener
una lista de los valores, entonces haces los valores de punto del
diccionario. Entonces obtienes una lista de valores. Pero la mayoría de las veces, simplemente
estarás usando el nombre de la clave
aquí para obtener los valores. Ahora bien, ¿cómo se agregan
elementos a un diccionario? Es lo mismo, la misma sintaxis, la misma manera se obtiene un valor. Pero en lugar de solo
escribir el valor del coseno, estaremos agregando un
valor como la forma en que almacenamos los valores
en una variable. Estarás almacenando un valor
a una clave en un diccionario. De la misma manera,
especificarás una clave. Déjenme decir, déjenme
llamarlo una nueva clave. Y diremos que el valor
será 123, por ejemplo, si tuviera que imprimir
la celda del diccionario, en
realidad está impresa antes. Entonces agreguemos un
nuevo valor de Cuba nuevo y luego lo imprimiremos después. Como veis, tenemos nuestra nueva clave, pero el nuevo valor, y luego los dos niños mayores
y ya teníamos. También estás notando que
esto no está en orden o aparentemente se
agregó una
nueva clave al principio. En realidad no
se agregó ese comienzo. Los diccionarios no
tienen ningún orden. No hacen un seguimiento
de las listas de pedidos. Realiza un seguimiento del orden en el que agregas artículos a ellos. Los diccionarios no. Eso es porque
accedes a los artículos vía clave. Hay otras razones para ello. Es porque
los diccionarios son realmente muy eficientes a la hora de
acceder a los datos
dentro de ellos a través de algo
llamado HashMap. Pero no te preocupes por eso. Eso son detalles técnicos y realmente
no importan en estos momentos. Sólo debes saber que
los diccionarios no están en orden, pero no
importa porque
siempre obtienes los valores
a través de las claves. Ahora bien, ¿qué pasa
si lo anula aquí? Si quieres anular, me quedo, simplemente
das el
nombre de esa llave. Entonces en vez de -3.90, 54, vamos a sobrescribir
ese valor para que sea 123. Como puedes ver aquí. Ahora en este caso, Estos dos se
imprimen en el mismo orden, pero no necesariamente
no hay ordenar el diccionario. Entonces aquí agregamos y
anulamos esto, este
valor para esa clave. Bien, ojalá
eso tenga sentido. Los diccionarios son muy
divertidos y muy útiles. Vamos a crear uno
con nuestros atributos. Vamos a crear un
diccionario que
realmente queremos que se vea algo así como este atributo
y luego el valor. Pero recuerda que
vamos a estar usando, y déjame quitar
estas líneas de código. Vamos a estar usando las funciones set outer y
outer. Déjame establecer un atributo
para que mi pierna ipsos, esa información muy útil. Recuerden que Maya estará esperando o Masaryk
se haya establecido. Nuestra función estará esperando el nombre completo del
atributo y luego el valor. Entonces parece que esto es lo que tenemos que
establecer, ¿verdad? Entonces nuestro diccionario podría
parecerse más a esto, pero hay algo que
debemos considerar es que queremos almacenar
el controlador y sus atributos y sus valores
independientemente del espacio de nombres porque queríamos
transferir valores de un rig bajo nuestro espacio de
nombres a otro rig. El diccionario en sí en realidad
no quiere saber o necesita saber
sobre el espacio de nombres. Eso significa que nuestro diccionario
se verá más así, que será el nombre
del controlador, luego el nombre del atributo. Alguien podría argumentar
que esto es redundante, así que no necesitamos hacerlo. Podríamos simplemente decir, podríamos simplemente almacenar
los atributos que
queramos y luego agregar el nombre del
controlador más tarde. Eso podría funcionar también, pero creo que es más sencillo
hacerlo de esta manera. Nombre del control, nombre de
los atributos sin
el espacio de nombres. Entonces, una vez que estemos configurando
los atributos, nos proporcionaremos el nombre completo de los atributos,
incluido el espacio de nombres. Entonces podemos, siempre podemos
poner el espacio de nombres por kin, proporcionar el nombre completo
del atributo, y luego simplemente usar esto para obtener el valor de
nuestro diccionario, que se verá
algo así. Así que muy larga línea de código, pero se verá
algo así. Básicamente, creo que
entiendes la idea. Simplemente obtendremos ese valor
y lo aplicaremos ahí mismo. Bien, este es el diccionario
que realmente queremos. Empecemos a construir eso.
24. Almacenar la dosis - Construir el diccionario de poste: Para obtener el
diccionario que queremos, necesitamos considerar
algunas cosas. Sabemos lo que queremos
conseguir en base a la selección. Pero hay que tener cuidado porque sabemos
que queremos obtener el diccionario de los atributos y
los controladores sólo desde el primer carácter
que seleccionamos. Porque decidimos
que el flujo de trabajo de la herramienta va a ser seleccionado controladores
que desea transferir, y luego seleccionar cualquier control
en su plataforma de destino o costillas. Así que necesitamos filtrar de alguna manera los controladores que son sólo una parte de la primera
semana que seleccionamos. ¿Cómo lo hacemos? Hay algunas maneras de hacerlo. Voy a
saltar a PyCharm y comenzar a bloquear mi función. Entonces déjame crear una función, llamémosla get pose
dictionary o simplemente la baraja. Hagamos un
bloqueo rápido primero antes de
escribir cualquier código. Sabemos que necesitamos
obtener la selección. O se nos va a
proporcionar o
podemos meternos dentro
de esta función. Sabemos que necesitamos obtener
los atributos que ya
hemos elaborado
aquí arriba. Entonces es decir, eso está hecho. Tenemos que armar
la selección. Juntos, una selección con
los atributos que obtuvimos. Y luego necesitamos construir un diccionario y luego
devolver el diccionario. Entonces necesitamos obtener la selección, pero también necesitamos
filtrar la selección. Por cierto, solo un pase rápido. Nosotros, esta es una buena manera de empezar
a bloquear. Tu función es decidir cuál quieres que sea el flujo
de tu función. Algo más que
podrías estar notando es que estamos manteniendo funciones
muy especializadas, muy separadas entre sí. Y esa suele ser una buena
manera de organizar tu código. Haz que tus funciones sean lo más simples, casi tan necesariamente
especializadas como puedas. No debería decir innecesariamente, sino que hazlos un
especializado como puedas. Entonces, si notas aquí, esta función aquí arriba, todo lo que está haciendo es
obtener espacio de nombres. No es otra cosa.
Esta función aquí, todo lo que está haciendo es
darte una lista de atributos. Ahora bien, se podría argumentar
que mi primera función, el espacio de nombres es la función
no es solo entrar en espacios, también
es obtener una selección. Y yo diría que una buena manera hacer esto aún
más simple es mediante Ashley proporcionando la selección
a la función para que la función no necesite
trabajar con ninguna selección en absoluto. Creo que en realidad es una buena manera de mejorar
esta función. Pero no te preocupes por eso
ahora mismo podemos
volver y refaccionarlo. Este refactor significa
reescribir la función. Entonces reorganizar o codificar, esto es algo
importante de saber. Es muy bueno planificar con anticipación cómo quieres
estructurar tu código
y tus funciones. Y por lo general intenta
bloquear tu código u organizarlo de manera que tus funciones
sean muy especializadas, como ya dije, pero además no
tienes que preocuparte o hacerte tratar de
conseguirlas perfectas la primera vez. Porque siempre puedes
volver y
reorganizarlos y mejorarlos. Profesor mío me dijo
en la universidad que una de las grandes
cosas de trabajar con 3D es que la
pintura nunca se seca, es
decir, que cuando se trabaja con medios tradicionales, por ejemplo , la
pintura, no se puede
volver un mes después y arreglar algo muy pequeño
porque la pintura ya
está seca y es
más difícil arreglarlo. Pero con 3D, la
pintura nunca se seca. Siempre se pueden hacer cambios. Y es el mismo
caso con código, la pintura y nunca se seca. Siempre puedes volver
y mejorar tu código. Especialmente cuando estás
aprendiendo al principio, tu objetivo debería ser
hacer algo, aunque no sea genial, aunque no sea perfecto, solo hazlo, hazlo funcionar y luego
volver y arreglarlo. Eso no significa que no
debas hacer planeación. Se debe planificar con anticipación el acero. Pero no te limites
haciendo algo perfecto. Entonces con eso dicho, como dije, puedo mejorar esto
aportando selección, pero voy a
dejarlo así por ahora. Y después tal vez, tal vez podamos
volver y mejorarlo. De todas formas. Volviendo a nuestra función de
diccionario, ¿
cómo hacemos el filtrado? Podríamos obtener la selección aquí, ya filtrada y simplemente
confiar en que se filtra. O podríamos obtener
la selección y los espacios de nombres y simplemente usar el primer espacio de nombres
en nuestra selección. Así que básicamente podemos obtener los espacios de nombres y usar el
primero como filtro. Pero creo que podríamos hacer
esto incluso un poco más simple al recibir un espacio de nombres. Entonces esta función estará
esperando un espacio de nombres. Vamos a estar
consiguiendo la selección. Y luego vamos a
filtrar la selección por
el espacio de nombres proporcionado.
Vamos a probar esto. Puede que no sea el mejor diseño, pero probémoslo. Primer paso, vamos
a conseguir esta elección. Ya sabemos cómo
obtener la selección. Lo hemos hecho aquí arriba. Así que vamos a escribir eso otra vez. Cmbs, ls selección es igual a verdadero. Ahora sabemos que
queremos hacer un chequeo. Si no se seleccionó nada, entonces no tenemos nada
que hacer. Entonces vamos a escribir,
si no a la selección. Estamos haciendo algo
ligeramente diferente antes de verificar la
duración de la selección. Puedes hacer eso si quieres o puedes hacer
lo mismo que nosotros hicimos aquí, simplemente diciendo: Si no es
algo, entonces regresa. Pero como estamos
esperando un diccionario, mantengamos nuestro tipo de retorno es consistente y devolvamos
un diccionario vacío. El diccionario vacío es
solo dos llaves. Y eso es todo. Genial. Entonces, si no hay nada seleccionado, tenemos nada que hacer. Vamos a continuar. Podríamos decir otra cosa y luego continuar tu código
dentro del else Bob, porque sabemos que el retorno es el final de la función. Realmente no necesitamos
la declaración else. Simplemente podemos continuar aquí. Porque si ingresamos
a la sentencia if, devolveremos una función de salida. Por lo que no accederá quien no alcanzará nada
después de ese regreso. Eso significa que
simplemente podemos continuar en este nivel de sangría. Entonces, lo siguiente que tenemos que
hacer es que vamos a necesitar trabajar con esta elección. Vamos a usar otro
bucle for para el control en la selección. Ahora aquí es donde
vamos a hacer el resto de nuestros pasos. Sabemos que necesitamos
filtrar la selección, obtener atributos y
construir un diccionario. Así que vamos a hacer todo
eso dentro de nuestro bucle for. ¿Cómo filtramos por,
por el espacio de nombres proporcionado? Dado que los controladores en
la selección o cadenas, las cadenas tienen una función
especial que verifica si algo
comienza con una subcadena, que es otra cadena, o termina con otra cadena. Déjame darte un ejemplo
aquí dentro de Maya. Voy a tomar esta
cadena, por ejemplo, eliminar esto. ejemplo esto aquí quiero
comprobar si esto empieza,
comienza con Minerva, que es
el espacio de nombres que tenemos aquí. Yo sólo voy a imprimir eso. Esta función
devolverá un booleano, ya sea verdadero o falso, que
comienza con Minerva. Sí, exactamente. También podríamos decir
que comienza con MI, e.g y eso será cierto. Pero si quisiéramos decir, empieza con LA
Ejemplo, No va a decir falso. Vamos a usar esto
para filtrar nuestros espacios de nombres. Si el control comienza con el espacio de nombres que
nos proporcionaron. Vamos a hacer nuestro resto
de nuestra lógica dentro de esto. Eso significa que
todo lo que construye el diccionario tendrá que suceder dentro de
esta declaración if. Ahora eso no es problema, pero por lo general prefiero
tener menos sangría. Creo que eso es más limpio y
suele ser más fácil de leer. Entonces, ¿cómo evitamos
esta sangría? Hay una palabra clave que funciona para bucles for o bucles en general, que se llama continuar. Lo que esto significa es que si básicamente
estabas diciendo, si ingresas este for-loop, continúa al siguiente
ítem de la lista,
en la lista seleccionada, decir que cualquier cosa
que sea después la continuación será
completamente ignorada. Y eso también significa que
necesitamos revertir esta lógica. Básicamente estamos diciendo, si no, control comienza con
el espacio de nombres, luego continuar al siguiente
ítem en esta elección. Y no te preocupes por
lo que está pasando a continuación. Y eso significa que
podemos simplemente continuar sin tener que sangrar dentro de
esta declaración if. Entonces ya hemos filtrado
la selección. Y déjame, déjame poner
algunos comentarios aquí. Selección, espacio. Buena selección, Eso es genial. El siguiente paso es
obtener los atributos. Este debería ser fácil. Ya tenemos una
función para eso. Entonces podemos simplemente
copiar esa función, el nombre de esa función. Y podemos decir
animado, animable. Los atributos son nutrias
se obtendrá la dirección del nodo. Y entonces saber que estamos
trabajando con es el control. Para hacer un seguimiento de esto en caso que
esto sea un poco confuso. Recuerda que la
selección
te está dando , el comando de selección, te
está dando exactamente esto, el espacio de nombres más el
nombre del control. Déjame agruparme tan rápido. Vamos a imprimir, vamos a seleccionar un controlador. Cuándo imprimir el comando ls. Esto es
con lo que estamos trabajando dentro del bucle for. Déjame llevar eso
a los gráficos circulares para que podamos hacer un seguimiento de
lo que está sucediendo aquí. Sabemos que el control, cada control será algo así
como este espacio de nombres, plaza nombre del controlador. Una vez más,
por eso empiezan con cheque, va a funcionar. Y ahora estamos obteniendo
los atributos de este nodo controlador que
básicamente se ve así. Excelente. Ahora
necesitamos otra comprobación. Bueno, déjame entrar
aquí y obtener atributos. Necesitamos otra comprobación para decir
si no hay atributos, porque sabemos que si no
hay atributos en absoluto, vamos a obtener
una lista vacía. Podríamos hacer esto de dos maneras. Podemos decir si la longitud de
los atributos animables, es cero, podemos
continuar de nuevo. Así mismo, la misma idea que arriba. Si no hay atributos en absoluto, simplemente
vamos a romper
los cheques en el
bucle for y pasar al siguiente
elemento de la selección. Ahora para que sea sencillo, no
voy a usar
la longitud de la lista. Simplemente voy a decir, si no atributos numéricos, si no hay nada ahí dentro, omita lo que venga después, y continúe al siguiente
ítem de la selección. Excelente, Bueno el siguiente paso es armar el diccionario. Y para eso, necesitamos
inicializar un diccionario vacío. De lo contrario no tenemos nada
que poblar, ¿verdad? Voy a llamarlo diccionario
pose dict. Y será un diccionario
vacío. Una vez más, un diccionario
vacío son solo dos llaves. Déjenme sacar el ejemplo. Teníamos que saber exactamente lo que
intentamos construir. Lo que estamos tratando de construir
es algo así. Básicamente la clave, déjame
poner esto detrás de un comentario. La clave será el
nombre del controlador sin un punto de espacio de nombres
el nombre del atributo. Y entonces el valor
de esa clave
será el valor de ese atributo. Y una vez más, estamos trabajando con controladores de la selección
que se veía así. Así que vamos a mantener, Mantengamos esto aquí solo para
usarlo como referencia. Si bien tenemos que hacer es bucle sobre los atributos
que tenemos aquí. Para sumador en otros animables, es un nombre de variable muy largo, pero está bien. ¿
Algún error médico? Lo primero que tenemos que
hacer es que consigamos este nombre. Necesitamos despojar el nombre
del atributo real,
lo siento, el nombre
del controlador separado del espacio de nombres. Llamemos a este nombre troll. Se dividirá punto de control. Como lo hemos hecho antes. Podemos hacer esta placa en
el, en esta columna. Entonces otra vez,
vamos a dividirlo. Recuerda, la división
básicamente nos
dará el primer ítem y el último ítem de la
misma manera que lo hicimos con los espacios de nombres aquí arriba. Pero ahora en lugar de obtener
el primer artículo que queremos, queremos el último artículo. Vamos a decir, danos el último ítem de esa división. Ese será el nombre de control. Entonces queremos armar el nombre completo del atributo,
que es este aquí. Y así será, llamémoslo sumador completo. Ahora básicamente será el
nombre del punto de control, el nombre del atributo. Entonces, una vez más, podemos usar esta, esta función de formato para usar el reemplazar estos marcadores de posición
con otra cosa. Los vamos a reemplazar por nombre controlado. Y el segundo serán los atributos o
el otro de los
atributos animables que ya obtuvimos. Excelente. Entonces la siguiente parte será obtener el valor
del atributo. Ahora para esto, vamos
a usar como ya. Entonces vamos a usar get outer. Brote. Recuerda, si vuelvo
a mi app o un segundo, get adder realmente espera
dónde está mejorando. Bien, bueno,
vamos a escribirlo. Sal o espera el nombre completo del control con el,
con los atributos. Por supuesto,
porque necesita saber a qué espacio de nombres pertenece el
atributo. Entonces necesitamos construir todo
este nombre del control más
el atributo. Así que tenemos que pasar
eso en get adder. Sigamos adelante y hagamos eso. Que hagamos un
patrón similar al del formato. Pero ahora en este caso
necesitamos pasar el control total que
vino de la selección, que está bajo esta
variable llamada control. Y luego vamos a decir punto. Y luego los atributos, ¿verdad? Misma idea, formato punto. Ahora vamos a
usar el control total, no el nombre de control
que separamos. Vamos a usar
un control total. Y vamos a usar
el editor de atributos, que es el atributo
que obtuvimos. El valor será
básicamente que si esto resulta un poco
confuso, déjame separarlo. Déjame ponerlo en una nueva variable. Vamos a llamarlo
control con absoluto. Y vamos a conseguir el
nombre. Eso es. Vamos a obtener el valor
de ese ancho, se sale de control. Camino. Ahí vas. Ahora tenemos el valor.
Ahora lo único que queda por hacer es poblar
el diccionario real. Recuerda que nuestro diccionario
se llama post decked. Entonces digamos posar. Ahora la clave, recuerda, será el atributo predeterminado nombrado sin el espacio de nombres. Entonces eso sería esto de aquí. Si esto resulta un poco confuso, podemos hacerlo aún
más explícito. Sin NS, sin espacio de nombres. Este es el nombre de la variable
larga del pan. Pero es, está bien
para estos fines. Adder completo sin
realmente dejarme nombrarlo. Adder completo conoce el espacio de
nombres. Ahí vas. Es un poco más corto. Conoce el espacio de nombres. Y el valor para esa clave será el
valor del atributo. Hagamos esto un
poco más explícito también. Y llamémoslo o
subrayemos, subrayemos el valor. Ese será el
valor de nuestro valor t. Una vez más, estamos
construyendo esto aquí mismo. Eso es lo que está haciendo esta línea. Permítanme agregar un comentario aquí. Básicamente vamos a decir que este será el ancho de control,
los atributos. Y la clave será
el valor del atributo. Excelente. Tenemos estamos poblando
nuestro diccionario. Déjame borrar esto aquí porque
ya no lo necesitamos. Voy a decir,
voy a agregar un comentario aquí solo diciendo poblar diccionario
o construir diccionario. Y al final, lo único que queda por
hacer es devolver el diccionario, que se llama pose score, que volvamos a
Maya y lo probemos. Antes de regresar y
agregar nuestros docstrings, déjame copiar el nombre
de esta función. Volvamos a Maya. Y tengo aquí post traslado. Entonces hagámoslo desde cero. Publicaciones importantes
subrayan la transferencia. Ahora bien, si no has
reiniciado Maya, tienes, recuerda que mi
tipo de cachés o guarda tu la última
entrada que hiciste. Entonces, si queremos refrescar
eso o recargar eso, podemos decir Recargar post transferencia. Desde que lo hicimos, le hicimos
algunos cambios. Entonces podemos decir pose, pero este es el diccionario. Entonces vamos a decir
pose adornada es igual a pose, subrayado, transferencia,
transferencia, punto, GET, post. Una vez más, el nombre de
la variable depende de usted. Se le podría llamar pausas así. Simplemente podrías llamarlo
publicaciones si quieres. Eso depende de usted. Seré más explícito
y lo llamaré pose. Vamos, vamos a imprimir esto. Ambos subrayados. Vamos a ejecutarlo y a
ver qué pasa. Oh, claro que se necesita
exactamente un argumento. Entonces vamos a
decir que queremos filtrar por mi nombre nervioso. Entonces vamos a decir Nerva. Y sólo voy a seleccionar
un control en esa plataforma. Y ahí tienes. Esto es exactamente lo
que esperábamos. Como ves, que
solo hay tres atributos
en ese control que seleccioné la traducción
y todos ellos están en cero. Entonces tenemos nombre controlado, traducimos z, x e y, y todos ellos están en cero. Ahora probemos
nuestro filtrado. Entonces, una vez más,
voy a seleccionar ese controlador y
voy a seleccionar algunos
controladores en el otro rig. Entonces ahora hemos seleccionado un controlador en Minerva
y algunos en Severus. Pero recuerda que estamos
filtrando por Nerva, así que el resultado
debería ser el mismo. Así que solo estamos obteniendo
los controladores que pertenecen a ese espacio de nombres. Y claro, esto es agnóstico, como el resultado es
un diccionario con los controladores y los
atributos de ese controlador, lo siento, de ese personaje, pero es agnóstico del espacio de nombres de ese
personaje. Porque ahora podemos
usar esto y aplicarlo a cualquier otro personaje que
tenga los mismos atributos. Si quieres ver esto un
poco más agradable, en realidad no lo harás. Permítanme seleccionar algunos controladores
más para obtener un diccionario más grande. Ahí vas. Entonces esta es una fuerza mucho mayor. Te lo mostré antes. La función print,
podemos decir de Pip print, print, p, print
significa bastante print. Podemos decir imprimir, publicar. Todo esto va a hacer es impreso
de una manera legible por humanos. cual es, oh perdón, no lo
he importado. Lo cual solo hará que sea
más fácil, más agradable de leer. Entonces este es el diccionario
que estamos esperando. Ahora podemos usar esto
y aplicar todos estos valores a
otro personaje. Ahora, solo para asegurarnos de que esto realmente
está obteniendo los
valores que nos importan. Voy a cambiarlo para
que no sea sólo cero. Ahí vas. Entonces hay algunos valores
diferentes. Ahora bien, si vuelvo a ejecutar ese trozo de
código, ahí tienes. Estos son los valores que pertenecen a ese
control. Excelente. El siguiente paso será aplicar este post al
otro personaje. Pero antes de hacer eso, no olvidemos
las cadenas de documentos. Una vez más, triples, códigos
dobles, descripción
pequeña,
pose para posar, diccionario
sin espacios de nombres. El espacio de nombres que
sabemos estamos esperando una cadena. Así que voy a escribir cadena y una pequeña descripción de lo que realmente está haciendo
este argumento. Filtrar selección
por este espacio de nombres. Excelente. Y entonces
el valor de retorno, por supuesto, será un diccionario. Dejémoslo así. Bueno, sí agregué una descripción arriba, así que seamos consistentes
a menos que ese diccionario de controles con atributos y
sus valores. Excelente.
25. Aplicar la dosis: Bien, así que casi
terminamos con la función
solo para tus dos. Ahora que somos capaces de guardar una pose en forma
de diccionario. El siguiente paso es
aplicar esa pose. Veamos rápidamente qué implicaría
eso. Si tuviéramos que hacerlo manualmente, déjame borrar mi ventana de salida. Voy a seleccionar el
controlador, este control de pecho. Una vez más, sólo voy a ver cómo es el
diccionario de pose. Una vez más, tenemos los
atributos con los controladores, con los atributos
y los valores. Entonces, ¿qué necesitaríamos hacer para aplicarlo a este personaje? Bueno, en serio, todo lo que tenemos que
hacer si estuviéramos haciendo esto manualmente
sería establecer atributo. Entonces Cmd S, Vamos a poner sumador. Sabemos que queremos. Digamos que estamos estableciendo el valor de rotación y necesitamos
establecer los valores reales. Entonces ese es este valor
que tenemos aquí mismo. Normalmente digo una
cosa que es decirle al comando qué
espacio de nombres aplica este verdadero. Entonces, todo lo que necesitaríamos hacer, ¿cuál es el nuevo espacio de nombres? Se dirige al espacio de nombres. Y déjame hacer
esto un poco más pequeño y ejecutar
esta línea de código. Y ahí tienes. Aplicamos
ese valor a la rotación. Déjame aplicar algo un
poco más extremo, un poco de cambio más grande el
cual se girará y. ahí vamos. Ahora estamos aplicando ese volumen. Excelente. Entonces eso es básicamente
lo que vamos a hacer. Toma los atributos de
ese diccionario de la pose. Guardamos el espacio de nombres en él
y luego le aplicamos el valor. Entremos en PyCharm
y comencemos a mapear, bloqueando nuestra siguiente función. Llamémoslo publicaciones aplicadas. Sabemos que
para jugar una pose, necesitamos conocer los valores de pose reales que vienen en
forma de diccionario. Entonces llamémoslo post dict para mantener la coherencia con los nombres. Y sabemos cuando
no necesitaba
conocer el espacio de nombres de destino. Puede nombrar este espacio de
nombres de destino o simplemente destinos. Pero creo que Namespace
por sí mismo tiene sentido. Y luego en el docstring podemos especificar un poco más sobre
eso, qué está haciendo eso. Excelente. Así que comencemos
a bloquear la función. Sabemos que necesitamos obtener los,
los nombres de los atributos. Sabemos que necesitamos agregarle
el espacio de nombres. Y entonces simplemente necesitamos
establecer el atributo. Pero ahora puede
haber un problema aquí. Un segundo y
tratar de ver si se puede pensar en lo que podría
salir mal aquí. ¿Qué podría ser un posible error? Qué pasa si
los personajes
no son exactamente iguales o
la raza no es la misma. En mi ejemplo, sé que estos dos son exactamente iguales porque usé
la misma tarifa. Pero ahora imagina
que, digamos mi, mi personaje fuente
tiene un prop extra. Digamos que tiene sombrero, y nosotros seleccionamos el sombrero. Y tratamos de aplicar ese
valor al otro personaje. Y los otros personajes que
tenían el sombrero que fallaría, eso causaría un error
porque mi, yo diría, oye, esto, este controlador o
este objeto no existe. ¿Por qué
atribuyeron está bloqueado? Por ejemplo, si está bloqueado,
podemos configurarlo. Entonces Maya también nos
dará un error. Eso significa que tenemos que hacer un
poco de comprobación de errores. Vamos a escribir eso en, solo errores o comprobaciones de errores. Y pensaremos en
los cheques en un segundo. Comencemos a escribir primero la funcionalidad
base. Lo primero que queremos hacer
es obtener los nombres de los atributos. Y eso significa que necesitamos
recorrer las claves en el diccionario que
básicamente representan el, el nombre de esos atributos. Entonces digamos, vamos
a llamarles su nombre, cada uno de ellos por acrónimo
en post subrayado dict. Ahora, los diccionarios
tienen una función. Llaves Frías. Las claves te
darán una lista de las
claves en el diccionario. Déjame mostrarte eso muy rápido. Dentro de mi, yo, borre esto aquí mismo, y consigamos un nuevo
diccionario con el que jugar. Voy a seleccionar
este controlador. Sabemos que ese controlador
sólo tiene tres atributos. Entonces va a ser un diccionario
tan pequeño. Y voy a
imprimir bastante ese diccionario. Ahí vas. Entonces, si tuviera que imprimir claves dict post
guión bajo, como pueden ver, obtengo
una lista de esas claves, que básicamente es
solo el controlador. Los nombres del controlador
con los atributos. Hay otra
función llamada valores, que como probablemente puedas adivinar, simplemente me dará una
lista de esos valores. Ahora hay
otro llamado artículos,
que me da, me va a dar
por lo menos las pupilas. Ahora, como ya he dicho antes, un polo a polo es como una lista que no se puede modificar y se hace usando el paréntesis
regular. Y los elementos del diccionario
básicamente te darán una lista con los pares de par
clave y valor para cada
elemento del diccionario. Pero por ahora queremos
usar claves para recorrer todos esos nombres de control
con sus atributos. Deslízate sobre esa lista de llaves. Consigamos el valor
de esa clave. Recuerda obtener un valor, usas un diccionario y
obtienes el valor de una clave. Así que abre y cierra los
corchetes. Y usaremos el otro nombre, que es la clave que
estamos recorriendo. Entonces ese será el
valor del atributo. Así que llamemos a ese valor
externo. Ahí vas. Estamos recibiendo la llave y
estamos obteniendo el valor. Ahora recuerda,
necesitamos armar el espacio de nombres y
el nombre del atributo. Llamemos a este nombre completo de sumador. Y este será el espacio de nombres
seguido de dos puntos, porque esa es la
convención en Maya. Y vamos a hacer formato punto. Va a ser espacio de nombres. Y luego el titular del segundo
lugar será reemplazado por el nombre. Ahí vas. Lo siguiente que hay que hacer, ya lo
hemos hecho. Necesitamos agregar espacio de nombres. Entonces déjame, déjame
mover esto aquí arriba. Um, por cierto, muy rápido, si te preguntas cómo me estoy moviendo
tan rápido entre líneas, hay algunas
claves llamadas que
funcionarán en cualquier parte de Windows. Si presionas la tecla Control, puedes saltar entre palabras. Se debe presionar
Control y Shift. Se puede hacer eso pero, pero
resaltando al mismo tiempo. Y si haces tabulación,
sangrarás. Pero si haces Shift Tab,
harás lo contrario. Va a ir en reversa. Entonces así es como puedo hacer
para moverme tan rápido. Pero esas son solo teclas de acceso rápido. No te preocupes demasiado por ellos. Sin embargo, es muy útil, por lo
que sí te permite escribir un
poco más rápido. Pero en fin, volviendo a
nuestro código, tenemos apodos. Agregamos el espacio de nombres, y ahora necesitamos
establecer el atributo. Pongamos esto,
pongamos el atributo. El atributo que conocemos tenemos que
hacer CMBS conjunto de puntos, sumador. Y luego pasamos en
su nombre completo
del atributo, nombre de error. Y el valor que
queremos establecer, que es nuestro valor. Y ahí tienes. Ahí básicamente estás aplicando tu post a tu nuevo personaje. Ahora estamos, nos faltan
las comprobaciones de errores. Pero por ahora vamos, vamos a probar esto para
ver qué está pasando, para ver si realmente está funcionando. Volvamos a Maya esto fuera. Ya que hice algunos
cambios en el código, voy a recargar el módulo. Ahí vas. Usemos un nuevo controlador. Hemos estado usando demasiado ese control de
ajedrez. Voy a usar este brazo, este control de codo aquí mismo. Sólo le apliquemos
algunos valores. Vamos a levantarnos post diccionario. Vamos a conseguir puestos para Minerva del control
seleccionado. Vamos a imprimirlo
para ver qué tenemos. Ahí vamos. Esta es la pose que estamos tratando de transferir. Entonces apliquemos esa pose
al otro personaje. Publicar subrayado, transferencia. Aplicar pose. Y sabemos que estamos esperando un diccionario de post
y un espacio de nombres. Vamos a proporcionar el diccionario pose
que ya creamos. Y el espacio de nombres
está apuntando al espacio, que en este caso
será Severus. Ahí. Ahora bien, esto es
otra cosa que podríamos verificar. Si el espacio de nombres es incluso válido. ¿Y si tuviera que
proporcionar carrera por ejemplo esto no existe en la escena, así que estos podrían fallar? Pero tal vez podamos comprobarlo
en los controles directamente. Así que vamos, vamos a
probar esto por ahora. Déjame mostrar brazo de este
otro personaje para que
podamos aplicar esa pose.
Todo este código. Y ahí tienes. Como puedes ver,
aplicamos los valores. En este caso solo es rotación, pero eso está bien porque
es solo un control de codo. Entonces ahora esto está funcionando. Ahora podrías parar aquí
porque ya está funcionando. Pero como dije, imagina que
estos atributos estaban bloqueados, o no existía, o tal vez el personaje no
tenía ese control. Tenemos que hacer ese
tipo de comprobaciones. Entonces sigamos adelante y simulemos
ese tipo de error para ver cómo podemos prevenir
o cómo podemos verificar, anticipar este tipo de problemas. He seguido adelante y le agregué
un prop a este personaje. Agregué en el
archivo base para la plataforma. Entonces ahora lo que tenemos que hacer
es recargar esa referencia. Que como ya sabes, es la belleza de las referencias. Se pueden hacer cambios en la
propia plataforma y en cualquier cosa que
haga referencia a esa plataforma. Vamos a recibir esas actualizaciones, lo cual es bastante agradable. Déjame recargar esa referencia. Y deberíamos ver un nuevo utilete, un nuevo sombrero aparecer
aquí en un segundo. Ahí vas. Tenemos el utilero. Entonces ahora claramente esto, este otro personaje
no tiene. Ese mismo control. Hay un nuevo controlador llamado Hat under nervosa namespace. Ahora intentemos transferir
estos controladores posan a esos otros personajes tal como lo hicimos con el brazo. Y veamos qué pasa. Déjame hacer más espacio aquí. Entonces, consigamos un nuevo diccionario de
post. Y ahora este es el sombrero. Ahora intentemos aplicarlo
a Severus. Ahí vas. Ese es el error
que estamos esperando. El error es que ningún
objeto coincide con nombre, varias horas hat, dot rotate. Eso es porque cada
no tiene cabeza. Entonces, sigamos adelante y tratemos de
lidiar con este tipo de errores. Lo primero que hay que
verificar es ver si el propio controlador
existe, ¿verdad? Pero también hay otro tipo
de cheques que podríamos hacer. Así que sigamos adelante
y mapeemos eso. Vamos a bloquearlo aquí afuera. Entonces revisa si objeto,
objeto, quistes. Comprueba si el atributo
es separable. Podríamos verificar directamente
si no está bloqueado, podríamos verificar si
es animable. Pero creo que si estamos comprobando
para ver si es configurable, eso es más que suficiente para
lo que tenemos que hacer aquí. Pero antes incluso de verificar si se puede establecer
un atributo, necesitamos verificar si el
atributo incluso existe. Entonces digamos que existe el
atributo check. ¿Bien? Entonces verificar si existe un
objeto es,
es muy sencillo en Maya. Empecemos con eso.
Hay una función en esta biblioteca llamada
Cmd S punto OBJ existe. Muy sencillo. Y por qué lo haces es proporcionar
el nombre de ese objeto. Entonces veamos si Severus
ha tenido alerta de spoiler. Sabemos que no, no lo hace. Pero vamos, vamos a imprimir el
resultado de esa función pernos. Ahora si lo hacemos con Minerva, bueno, la respuesta
es sí, excelente. Para que podamos hacer eso. Pero para ello necesitamos
el nombre del objeto mismo sin los atributos, ¿
verdad? Bueno, no lo es. El objeto es, más
correctamente es el nodo. Sigamos adelante y
consigamos ese nodo. Ahora sabemos que estamos consiguiendo tenemos el nombre completo del
atributo aquí. Entonces básicamente uno esto sin el nombre del
atributo real al final, que está separado por un conducto. Una vez más, sólo como referencia, vamos a traer esto. Esto es básicamente con lo que
estamos trabajando. Sacar su nombre
es básicamente este, que es el espacio de nombres más
un atributo de punto controlador. Entonces queremos extraer
la primera parte de eso. Podemos hacer esto de manera muy sencilla
con nuestro amigo dot split. Como ya lo hemos hecho
varias veces. Podemos decir que el nodo
será nombre externo completo, dividido, dividido por el punto. Y sabemos que esto va a estar
dividiendo la lista en dos partes. Entonces queremos obtener
la primera parte, que es el espacio de nombres más día. Voy a controlar nombre
y ese es el nodo. Por lo que el primer ítem de la lista
será el índice número cero. Entonces ese es el nombre del nodo. Podríamos decir si Cmd
S punto OBJ existe, verificar si existe, que sepa que existe. Ashley, lo siento, queríamos
comprobar lo contrario, ¿verdad? Bueno, mientras que otra vez, podríamos hacerlo depende de cómo
quieras que funcione la lógica. Si solo quieres aplicar esa lógica o establecer el atributo
si el objeto existe, podríamos simplemente en dentina
y esto funcionará. Si el objeto existe
, establezca el atributo. Hagámoslo por ahora. Déjame escribir un comentario aquí. Por cierto, si
también te estás preguntando cómo llego al
final de la línea, estoy usando la N E, que encontrarás
en tu teclado. Y la llave Home
te llevará al inicio de una línea. Si usas eso junto
con la tecla Mayús, entonces puedes seleccionar toda
la luz. Es muy saludable. Entonces vamos a decir
que estamos comprobando aquí. Excelente. Estamos comprobando si
el objeto existe, si establece el atributo, vamos a probarlo. Voy a quitar
esta línea aquí. Y voy a mover
estos dos cheques extra aquí
abajo porque
esa sigue siendo nuestra tarea pendiente. Es como nuestra lista de
tareas pendientes por ahora. Entonces, vamos a probar
esto primero. Una vez más porque
hice algunos cambios. Estoy recargando post transferencia. Vamos a asegurarnos de que está
seleccionado y lo es. Ahí vas. No pasó nada, que
es exactamente lo que
queremos porque el único control que seleccionamos no existe
realmente. Ahora, vamos, probemos
con dos controladores. Es un poco
más complicado. Vamos a mover el brazo. Seleccionemos el sombrero, y apliquemos la
publicación una vez más. Ahora, solo
se aplicó el brazo y se ignoró
el mango
porque no existe. Excelente. ¿Cómo verificamos si realmente existe un
atributo? Porque el objeto puede
existir como estamos comprobando aquí, pero puede que no tenga el
atributo que estamos tratando de establecer. Entonces, como es habitual, la biblioteca de símbolos tiene un comando o función
que nos puede ayudar con esto. Se llama consulta de atributo. Entonces veamos cómo usarlo
usando la documentación. Vamos a la consulta de atributos de
estilo de documentación. Ahí vas. Entonces en la descripción
dice devuelve información sobre la
configuración de un atributo. Parece que eso es
lo que queremos hacer. Sigamos adelante y veamos
los ejemplos en la parte inferior. Determinar el estado oculto
del atributo selector.
Determiné esto. Bien, entonces parece que estás pasando el
atributo que
deseas y luego determinar si
un atributo es curable. Aunque esto
en realidad podría ser algo que queramos hacer. Potencialmente. Estás pasando el
nombre del nodo y luego pasas los
atributos que deseas. Entonces es un poco al revés de la forma en que salga o
funcione, lo cual es lamentable. Ojalá lo mantuviera un
poco más consistente. Pero así recuerda
que sal o obtiene el nombre completo
del atributo, que es el controlador
punto el atributo. En este caso,
tenemos que romperlo. Necesitamos obtener el nodo o el controlador y el
atributo por separado y luego verificar lo que
quiera probar o verificar
el atributo. Entonces en ese caso,
sé que hay una bandera o un argumento para ver si existe
un atributo. Debería ser existe. Sí, ahí tienes. Es un atributo booleano, devolverá true si
el atributo existe, bien, Así que básicamente necesitamos obtener el único nombre del atributo. Después pasando el
nodo en el que queremos obtener el check the attribute in. Genial, Así que donde quiera que
denote el pollo dividiendo
este fin de semana, y ahora necesitamos obtener el justo el nombre del atributo. Vamos a llamarlo el nombre corto
del atributo en contraposición al nombre completo
del atributo. Sabemos que al dividir el nombre
completo del sumador, en realidad
estamos
obteniendo ambos, ¿verdad? Nos estamos dividiendo por el punto, lo que significa trabajar
en esta parte. Y también estamos
consiguiendo esa parte, que es el nombre corto
del atributo que queremos. Así que simplemente podríamos hacer esto. Nombre corto externo es igual a copia, esto es igual a esa división. Pero ahora en lugar de
obtener el primer artículo, queremos obtener el segundo artículo. Entonces esta es la nota, y este es el nombre corto
del atributo. Pero hay una, hay una
mejor manera de hacer esto. Como sabemos que estamos obteniendo
una lista con dos elementos, en realidad
puedes asignar
esos dos elementos de la lista a dos variables a vez en una sola línea en Python, lo haces haciendo esto. nombre corto externo es igual a la lista de la que
obtuvimos de la división. Entonces veamos cómo está funcionando
esto en Maya por si acaso es un
poco confuso. Así que vayamos aquí. Tomemos, bueno, sigamos
el ejemplo que estamos usando. Tomemos este
nombre completo del atributo. Usemos una nueva pestaña de Python. Sabemos que queremos
dividir este punto dividido por el nombre de división de punto. Llamemos a esto, en realidad, vamos a llamarlo, es lista dividida. Imprimamos la lista de partitura
dividida de celdas. Ahí vas. Entonces
obtienes los dos artículos. Como dije,
se puede asignar eso a las variables diciendo
el primer nodo, este primero es el nodo, y el segundo es el atributo real es
igual a
la lista dividida. Y ahora puedes imprimir nodo. Completa el atributo de impresión C. Ahí tienes. Ahora bien, esto funciona porque
sabemos que la lista
tiene dos ítems. Si la lista tenía más artículos. Y eso es, por ejemplo,
reemplacemos la lista dividida con una lista propia. Ellos solo dicen 12.3. Si ejecutamos esto ahora, la lista tiene tres ítems. Estamos tratando de asignar a un hilo de 22 variables
en dos variables. Lo que vamos
a tener más estrecho porque hay
demasiados valores para desempacar. Esto sólo funciona porque sabemos que el split
nos está dando dos artículos. Genial. Sigamos adelante y
comprobemos si el atributo existe. Déjame traer esta
línea aquí abajo, que es donde la necesitamos. Empecemos a preguntar eso. Que la existencia
de los atributos. Entonces digamos que si CMBS
punto, déjame escribirlo. Atribuir, consultar, abrir
y cerrar paréntesis. Ahora recuerda que tenemos el paso el nombre corto de
los atributos. Y una vez más, estamos siguiendo
la documentación aquí. Siguiendo este ejemplo
se muestra el nombre del
atributo y luego nodo. Ahora bien, si quisiéramos ver qué hacen los argumentos de
esa nota , vamos, déjeme buscarlo. Vamos a ello. Anote el nombre de la gente. Utilice todos los atributos
del nombre del nodo. Bien, esto es un
poco engañoso. No hay ningún nodo llamado nombre. Y
nos está diciendo que necesita un valor de tipo nombre
que no existe. Eso en realidad significa una cuerda. Entonces es un poco
desafortunado que a veces la documentación en mi
S no sea muy consistente. Hay algunas adivinanzas educadas que hay que hacer a
veces así. En este caso llamado solo hay que adivinar o asumir
que significa cadena. Sin embargo, con eso dicho,
la documentación sigue siendo sumamente valiosa, razón por la
que sigo
volviendo a ella. Digamos nodo es igual a nombre. No, lo siento, lo siento,
nodo es igual a nodo, que es el nodo que
obtuvimos de dividir. Y entonces lo que necesitamos
verificar es ver si
ellos atributo existe, existe igual a true, o consultando la existencia
del atributo. ¿Correcto? Ahí vas. Llame a largo para terminar
esa declaración IF. Y ahora sangramos esto en. Algo que
probablemente estés notando es que la sangría
se está poniendo demasiado. Tenemos 12 niveles de sangría
y vamos a tener uno más porque necesitamos
verificar si el atributo
es separable. Sigamos adelante y limpiemos esto antes de
hacer la última comprobación. Algo cuando se puede hacer
en lugar de sangría. Evitamos en imitación
de aquí usando la palabra clave continue, continue. Podríamos hacer eso. Podríamos
decir que no existe ningún objeto. Continuar. Y luego
déjeme dessangrar esto. Una vez más, lo mismo. Si no existe atributo, entonces simplemente podemos decir Continuar. Y luego porque nos estamos saltando, estamos usando continuó
para evitar la sangría. Simplemente podemos agregar el mismo nivel que todo
lo demás
dijo que atribuyen. Y ahora, hagamos
nuestro último chequeo. Tenemos que verificar si un
atributo es configurable. Ahora bien, podrías
pensar que puedes
conocer esa información
a partir de la consulta de atributos. Esa es una muy buena suposición. Desafortunadamente, ese no
es el caso. Para ver si
se establece un atributo de todos, necesitamos usar el conjunto, lo siento, obtienen la función sumador. Entonces echemos un vistazo a
eso en la documentación. Fuera o puedes comprobar
si algo es escalable. También puedes verificar si
algo es configurable. Y una vez más, esto devolverá un booleano o uno que en este caso
podemos comerciar como booleano. Entonces sigamos adelante y hagamos eso. Salgamos o básicamente
quieres este nombre de atributo
get adder. Pero ahora, a diferencia de la función de consulta de
atributo, en realidad
necesitamos el
nombre completo del atributo. Una vez más, a veces
estas funciones no
tienen muy
congruentes entre sí. Pero eso está bien. Solo tienes que confiar en la documentación
o en tu experiencia. Cuanto más hagas estas funciones, más sabes
cómo usarlas. Y deja de ser un problema. Nunca es realmente
un problema. Genial. Entonces hagámoslo. Digamos Salir o nombre
del atributo y
establecer double es igual a
true para comprobar si nuestro
atributo es separable. Entonces si CMBS punto obtener sumador. Ahora recuerda en este caso
queremos el nombre completo
del atributo. Entonces dirá nombre completo. Homero, configurable es igual a verdadero. Entonces si no, el atributo
es saturable, así que si el atributo no
es separable, queremos continuar. Entonces no queremos,
queremos básicamente saltarnos cualquier cosa que venga
antes o después eso y pasar al
siguiente valor en el bucle. Genial, Así que vamos, probemos
esto y veamos si esto realmente
está funcionando. Una vez y déjame
volver a mi cuenta. Déjame, ya que
hicimos algunos cambios, voy a recargar mi módulo. Es genial. Y
voy a aplicar algunos valores al brazo otra vez. Una vez más. Así que consigue la pose, el diccionario de
pose, y aplica esa pose
a nuestra carta objetivo. Ahí vas. Sólo se
aplicó el brazo y se había ignorado porque
claro que no existe. Eso es genial. Ahora bien esto está bien, esto funciona, pero hay una
forma más de condensar este código y hacerlo
un poco más limpio. Déjame mostrarte cómo hacerlo
usando el operador OR. Operador. El operador
básicamente le permite encadenar este tipo de cheques. Entonces podemos decir si no existe
objeto o no, consulta de
atributo existe o
no, atributo es configurable. Ahora bien, esto se convirtió en
una fila muy larga, lo que también podría no ser genial. Pero déjame mostrarte
cómo está funcionando. Entonces básicamente estamos diciendo que si el objeto no
existe, continúe. Entonces, si se cumple esta condición, básicamente
ingresamos
la sentencia if. Pero digamos que el
objeto es conjuntos existen. Entonces el objeto existe, genial. O si atribuyen
no existe. Entonces hazlo. Entonces digamos que
el objeto existe y el atributo sí existe. Entonces iremos, entraremos en nuestro siguiente check in el
siguiente o cuál sería, o si el atributo no es
separable, entonces continuar. Esto es lo mismo que nuestros cheques
de tres niveles, pero todos en una línea. Ahora hay otra versión de esto que es lo contrario, que es, y así puedes decir, si pudiéramos revertir la lógica, solo
quería
mostrarte estas dos que conozcas tus opciones. Podríamos revertir la lógica de listas. El objeto existe. No voy a hacerlo, en realidad
estoy, voy
a escribir el código apropiado. Entonces podemos decir si el
objeto dos existe y el atributo existe, por ejemplo, imaginemos que esas son todas
las comprobaciones que queremos hacer. Podemos decir si el objeto existe
y el atributo existe, entonces podemos hacer nuestro sumador
conjunto, por ejemplo esto es revertir la lógica
usando el operador AND. Pero estamos tratando de
evitar la sangría. Entonces estamos haciendo lo contrario
usando el operador OR. Si el objeto no existe, o si el atributo
no existe, o si el atributo no
es separable, entonces continuamos saltando establecer el atributo e ir
al siguiente elemento en el bucle. Bien, para terminar esta
función, necesitamos limpiarla. Límpialo. Sabemos que no
necesitamos esta línea. Este es justo mientras nos estamos
desarrollando para ayudarnos. Aquí vamos a eliminar
estos comentarios, pero vamos a poner un
comentario aquí diciendo check. Simplemente llámenlo comprobaciones de atributos. Y luego establecemos el atributo. Excelente. Ahora antes nos olvidamos nuestros amigos doc strings,
muy importante. Así que vamos a establecer la cadena de documentos, digamos apply provided pose para
proporcionarle espacio de nombres, por ejemplo, ahora sabemos que pose se
espera que sea un diccionario. Diccionario con
valores de pose o datos de pose pose, digamos datos de post, que son las claves y los valores
y el espacio de nombres. Sabemos que es una cuerda. Pero seamos
explícitos aquí y digamos nombres de
destino al que aplicar. Tal vez un poco prolijo, pero siéntete libre de condensar
esa frase si quieres. Y en este caso
no vamos a devolver nada. Entonces voy a
quitar esta línea. Y eso es suficiente. Perfecto. Nuestra función es agradable y ordenada. Es muy pequeña, lo cual es genial. Puedo, como dije, las funciones
pequeñas y especializadas suelen ser el camino a seguir. Vamos a probar esto. Antes de pasar a poner
todos estos juntos. Voy a quitar la huella. Una vez más, voy
a recargar mi perdón. No es lo que quería hacer. Vamos a recargar mi módulo. Y voy a conseguir diccionario
opuesto. Hagamos algunos
controladores más esta vez. Entonces el contrario, el brazo. Hagamos las caderas, por ejemplo, las caderas, el pecho y el brazo. Y seleccioné algunos
controladores más, pero está bien. Y el sombrero, sólo para
checar la prueba son cheques. Y genial, Así que vamos a
sacar el post diccionario de eso y luego aplicarlo
el Cerbero. Ahí vamos. Excelente, eso está funcionando. Así que ya casi terminamos. Si bien tu código
básicamente está hecho. Ahora lo siguiente que
tenemos que hacer es ponerlo en conjunto para el
flujo de trabajo que queremos. Ahora en este punto, tienes toda la
funcionalidad separada en funciones especializadas y
pequeñas. Entonces ahora eres libre de decidir
qué flujo de trabajo
quieres, quieres hacer con esto, qué quieres usar con
esto, con esta herramienta. Estamos haciendo algo
que es muy válido, que es simplemente escribir el
nombre de nuestro espacio de nombres objetivo. Si así es como quieres
que funcione, es genial. Digamos que
quieres crear una interfaz de usuario. Quieres que el usuario escriba en el espacio de nombres que tienes se
relacionan para hacer
eso si quieres. Pero lo que queremos, como mencioné al
principio, es la selección de uso. Y eso es lo que usa la
selección para obtener los espacios de nombres y
oponerse al mismo tiempo. Entonces, vamos a crear una
función que haga eso. Y básicamente reúne todos
estos en una sola función que
hará todo esto por nosotros.
26. Construir la función principal de "transferencia": Bien, vamos a crear una función que reúna todo. Entonces la primera pregunta es, ¿
dónde colocamos esa función
en la parte superior del archivo, en la mitad del archivo,
al final del archivo Hasta el momento, lo hemos estado
haciendo de arriba a abajo. Y eso está bien. Podemos simplemente ponerlo al final y no
es problema. Pero hay
algo que quiero mencionar sobre Python. Es un dato interesante. O si no es interesante, al menos es bueno saberlo. Entonces python es un lenguaje
interpretado. Déjame escribirlo aquí. Interpretarlo en lugar de
ser un lenguaje compilado. Probablemente hayas escuchado
este término antes compilado. Lo que significa es que
tu código fuente, que es realmente el código, el texto que escribes. Todo este
código fuente se
traduce en algo que la
máquina realmente puede ejecutar. En los niveles más bajos de
ejecución en mi computadora. La computadora realmente está
liderando ceros y unos. Entre esos ceros y unos. Y el código fuente
que escribes, hay unos pasos de
diferentes tipos de código. Se llama
código objeto o código máquina. Y esos son
diferentes niveles de traducción para llegar a
esos ceros y unos. Entonces en lenguajes como
C o C plus plus, antes de que puedas ejecutar tu código, tienes que
compilarlo y haces ese paso manualmente o
a veces lo automatizas, pero tienes que hacer el paso antes de poder
ejecutar tu código. Pero eso significa que
el código que se está
ejecutando está más cerca de lo la máquina lee realmente en el nivel más bajo de ejecución, lo
que significa que es más rápido. Entonces ese código que
ejecutas cuando compilas algo es más rápido. Por otro lado, como
mencioné, Python se interpreta. Eso quiere decir que no
hay que compilarlo. Simplemente puedes hacer
un cambio y
ejecutarlo tal como lo hemos
estado haciendo hasta ahora. Tengo que decir que no
es 100% cierto. El hecho de que Python
sea interpretado no significa exactamente
que no esté compilado. Todavía hay un nivel de
finalización sucediendo, pero hay diferencias
que se hacen por ti cada vez que
ejecutas el código. Entonces eso significa que solo
puedes hacer cambios
y ejecutar el código. Pero eso también significa que el
código que estás ejecutando Python suele ser más lento que el código
que ejecutas en C
plus, además la misma
operación en Python será más lenta que la misma
operación en C plus plus. Por el simple hecho de que C plus plus se compila de antemano. Y el código se está ejecutando más directamente a lo que entiende la
computadora. Dicho esto, la diferencia
para la mayor parte de lo que hacemos en animación
realmente no va a importar demasiado. Es por eso que todos
los pipelines en cualquier estudio al que
puedas ir, estaremos usando Python. Porque como no
tienes que hacer ese paso de compilación es muy rápido de
desarrollar con él. Se pueden hacer cambios
muy rápidamente. La sintaxis es muy
similar a la del inglés. Entonces has visto hasta ahora y no
tienes que compilarlo. Como mencioné, el
hecho de que sea un poco más lento que otros idiomas realmente
no
hace la diferencia. Y es agilidad en el desarrollo. Es un beneficio sobre
la falta de velocidad. Lo cual de nuevo, es algo
que nunca notarás. El Espíritu no es
muy notorio por, por los humanos a menos
que hagas algo muy, muy pesado
computacionalmente. ¿Por qué estoy mencionando esto? Es porque el hecho de que
Python
sea interpretado, significa que el código
está siendo leído y ejecutado de arriba a abajo. Entonces una práctica que
mucha gente hace es escribir la función
detener el fondo. Entonces, si voy a necesitar
esta función más adelante, voy a tener primero y luego llamarla aquí abajo, por ejemplo ahora, mientras que eso es
lógicamente cierto, con el caso de las funciones, no
es necesariamente, podría
ser si tengo una función. Entonces, por ejemplo, si llamo a esta función aquí
arriba, esto va a fallar. Incluso por encanto me está diciendo que la función no existe. Esto va a fallar porque la función aún no
ha sido declarada. Pero si lo pongo dentro
de otra función, ya no es el caso. Eso es porque Python
pasará primero por
los nombres de las funciones, registrará todos ellos, y luego tendrás acceso a cualquier función aunque esté por debajo de la
que estás llamando, porque está dentro
de otra función. Es decir que puedes poner la función que estamos a punto de
escribir donde quieras. Como práctica general, yo, ya que esta es una función con la
que vamos a
estar interactuando, este es el
punto de entrada para nuestra herramienta. Normalmente pongo ese tipo de
funciones al inicio
del archivo para que lo primero veas sea esa función. Y a partir de ahí empieza a entender lo
que está pasando en el
resto de la pila. Entonces, pero eso dicho, después de todo ese discurso, ojalá fuera interesante,
útil, poco claro. Pero sigamos adelante y
escribamos la función real. Esta es una función que actúa
como nuestro botón click para nosotros, él hará
todo el flujo de trabajo encendido. Recuerda que dijimos, queremos seleccionar dos o más
caracteres y aplicar el post desde
el primero a los otros personajes objetivo. Entonces voy a
llamarlo transferencia seleccionada. No hay entradas en este momento. Empecemos a bloquearlo. Lo primero que tenemos que hacer
es obtener espacios de nombres seleccionados. Entonces después de eso necesitamos
validar la selección. Porque como, como dije, necesitamos seleccionar al
menos dos caracteres. Tan válida selección de fecha. Entonces necesitamos obtener el diccionario de pose desde
el primer carácter, espacio
FirstName para
el primer carácter. Porque Rick, digamos, entonces aplica la pose a los espacios de nombres objetivo, drogas
objetivo. Entonces llamemos a este
diccionario desde la fuente y apliquemos objetivos. Bien, creo
que eso tiene sentido. Creo que eso es flujo
que vamos a por. Entonces comencemos a llenarlo. Vamos a obtener los espacios de nombres. Este es fácil, ya
tenemos una función para ello. Ahora. En realidad tenemos una función para todo lo que necesitamos
hacer en esta función. O tal vez llamemos a esta
variable namespaces equals, obtengamos espacios de nombres seleccionados, que
es nuestra función aquí abajo. Excelentes nombres. Por eso está
fallando. Espacios de nombres. Ahí vas. Ahora, necesitamos
validar nuestra selección. Como dijimos,
queremos operar en dos o más caracteres selectos
fueron espacios de nombres seleccionados. Entonces digamos que si voy a usar la función length L-E-N, len namespaces es menor que dos. Simplemente podemos salir de
su función aquí y no hacer nada devuelto. Pero me gustaría que fuera un poco más fácil de usar. Me gustaría decirle al
usuario por qué no pasó nada, en lugar de
dejarlos en la oscuridad. Así que podemos usar la biblioteca C&DH
para que ese aviso de punto CMBS, muy convenientemente
llamado,
nos dará la posibilidad de darle
una advertencia al usuario. Todo lo que hace es tomar una cadena como mensaje y
mostrarla al usuario. Entonces podemos decir Por favor
seleccione dos o más tarifas. Ahora déjame mostrarte esto. Seguro que ya has visto este
tipo de advertencias antes. Simplemente se ve así. Es esa advertencia amarilla que aparece en
el fondo de Maya. Excelente. Entonces podríamos mejorar un poco
en esto. De hecho, podemos hacerlo para que si
no hay nada seleccionado, le digas al usuario que
por favor seleccione algo. Si sólo hay uno. Déjame hacerlo, por favor. Entonces, si la longitud de
los espacios de nombres es cero, podemos decir Por favor
seleccione algo. De lo contrario. De lo contrario, si la longitud
de los espacios de nombres es uno, podemos decir mañana. Por favor, seleccione más de uno. ¿Verdad? Si ese es el caso, simplemente
podemos regresar
y salir de la función. Entonces depende de ti. Se puede hacer la sentencia
single if o la sentencia double if. El if y elif es Terminus. Lo he hecho aquí. Voy a ceñirme a éste. Entonces otra vez, si no se pasan mis
cheques, entonces regresamos y no hacemos nada. De lo contrario, queremos
obtener el origen, el diccionario de la fuente y luego aplicarlo a los destinos. Ya que tenemos espacios de nombres, este espacio de nombres fuente, fuente, vamos a llamarlo fuente. En realidad, no, perdón,
seamos más explícitos. Espacio de nombre de origen. Sabemos que será el
primer espacio de nombres seleccionado. Entonces simplemente podemos decir espacios de nombres, corchetes abiertos y cerrados,
corchetes. El índice cero
será el primero. Y luego queremos aplicar
eso al resto de
los espacios de nombres antes
de llegar a eso, porque eso
realmente introducirá un nuevo concepto en alistar. Déjame hacerlo con un
solo objetivo. Así que vamos a ignorar cualquier
cosa, cualquier otra cosa que no sean
dos plataformas seleccionadas por ahora,
vamos a arreglar eso. Muy pronto. Voy a llamar a este
espacio objetivo, serán espacios. El índice número uno, que es el segundo
ítem de la lista. Y sabemos que tenemos suficiente
porque estamos comprobando para asegurarnos de que tenemos
al menos más de uno, al
menos dos en este caso. Genial. Entonces, consigamos el diccionario
post. Vamos a llamarlo post dict
es igual a GET post deck. Como nosotros, como sabemos, estamos pidiendo un espacio de
nombres para esa función. Y ese será nuestro espacio de
nombres fuente , espacio de
nombres fuente, diccionario. Y entonces todo lo que tenemos que
hacer es aplicar pose. Proporcionar, aplicar pose. Podemos proporcionar el diccionario
post y proporcionar el espacio de nombres de
destino. Bien, vamos a probar esto. Y entonces podemos volver y hacer esto por más de
dos plataformas si esto está funcionando. Bien, vamos a entrar en Maya. Una vez más, porque
hicimos algunos cambios. Vamos a
recargar el módulo. Déjame limpiar mi editor de guiones porque es un
poco desordenado. Y ya no necesitamos almacenar ninguna de estas variables. Entonces vamos a decir
traslado, no, perdón, transferencia de
puestos, tanto en esos transbordo
portuario, traslado. Selecciónelo. Y entonces llamemos a
esa función. Así que
probemos primero nuestros cheques. Déjame ejecutar esta pieza de código. Los índices están arreglados, Bien, tengo un error en este
momento. Jugando 13. El índice está fuera de rango. Bien, ya veo lo que está pasando. Cometiste un error,
pero esto es genial. Entonces como pueden ver mi
advertencia, se apagarían. Pero entonces mi código siguió ejecutándose. Y estamos tratando de obtener el primer espacio de nombres de
la lista de espacios de nombres. Pero Python me está diciendo que el índice de la lista está fuera de rango. Eso significa que
no hay nada en los espacios de nombres. Y estoy tratando de
obtener algo de nada esencialmente que
por supuesto no va a funcionar. Entonces arreglemos eso. Volver al término pi. Entonces esto es un problema, es que nosotros, llegamos
a este punto. La longitud de los
espacios de nombres era cero. Tiramos una advertencia. Y aún así fuimos aquí porque no
volvimos en
esta declaración if. Entonces déjame mostrarte
que si selecciono solo un espacio de nombres
vamos a entrar aquí. Vamos a recibir esta advertencia, y luego vamos
a salir sin error. Déjame hacerlo muy rápido. Selecciona uno de ellos y ejecuta esto. Ahí vas. Nos dieron la
advertencia pero no hubo errores. Entonces, ¿cómo arreglamos eso? Muy sencillo,
simplemente podemos regresar aquí, salir de la función aquí. Eso también significa que la declaración
if no es
realmente necesaria. Simplemente podemos decir si ahora
eso no lo equivoca, funcionará en ambos sentidos. Pero ahora porque estamos
saliendo de la función de todos modos, no lo sabemos, no necesitamos
la otra cosa si en este caso. Bien, así que esto
debería arreglar nuestro error. Déjame deseleccionar todo
para que recibamos la primera advertencia. Por favor, seleccione algo. Excelente. Ahora selecciona
solo una cosa. Diga Por favor seleccione
más de un Rick. Excelente. Y ahora hagamos la transferencia
real. Déjame mover las caderas hacia atrás. Ahí vas. Déjame seleccionar mi personaje
objetivo. Y ahí tienes, Se traslada el
puesto. Ahora dijimos, bueno, déjame probarlo con el utilete que no existe
en el objetivo. Ahí va, no se produjo ningún error. La pose es la misma. Sonidos. Está funcionando. Genial. Ahora, vamos, hagamos que esto funcione con
múltiples personajes. Y para eso, necesito agregar un personaje más
a la escena. He seguido adelante y duplico
nuestro carácter Minerva. Entonces hay otra plataforma de
referencia en la escena, y voy a cambiar
su espacio de nombres para que sea bajo. Ahora. Sólo dame un
segundo para responder. Ahí vamos. Entonces ahora tenemos a
tres personajes referenciados en la escena. Déjame mover este por aquí. Y volvamos a aplicar una publicación. Pero ahora intentemos aplicarlo
a dos personajes
en lugar de solo uno. Ahí vas. Entonces, como era de esperar, sólo
funcionó en el segundo que
seleccionamos porque pusimos
esa limitación en su lugar. Pero ahora vamos a seguir adelante y
hacerlo más versátil para que podamos aplicar el post a
tantos personajes como queramos. Para que esto funcione, necesitamos obtener una lista
de espacios de nombres de destino. Entonces voy a cambiar
esto para apuntar a espacios de nombres. Ahora en lugar de
ser una sola cadena, tiene
que ser una lista de cadenas. Y eso lo hacemos haciendo
algo llamado rebanado de listas. Tenemos que rebanar una lista y llevarnos todo excepto el
primer ítem de la lista. Y podemos hacer eso
usando esta sintaxis. Entonces sigue dentro de
estos paréntesis de puntuación. Usaremos esta columna. Esto será del lado izquierdo. Déjame hacer algo de espacio
aquí. En el lado izquierdo. Este será el primer
ítem o el primer índice en el que quieres iniciar la copia de la
lista que estás haciendo. Por lo que se
indexará el número uno. Y entonces aquí, este será el último índice en el
que se quiere parar. Ahora lo que pasa con este
es que no es inclusivo. Eso significa que si quieres
parar en el índice número dos, realidad
tienes que
proporcionar el índice tres. Eso podría ser un
poco confuso. Esto quiere decir que
vamos a empezar en el índice uno y terminar en el índice dos. O en este caso ahora mismo, queremos ir
hasta el final de la función. Así que simplemente puedes
dejar esto vacío. Entonces para nuestro propósito, podemos usar dejar esto vacío. Entonces esto significa que
vamos a obtener todo desde el segundo ítem, que es el índice número uno, hasta el final de la lista. Déjame mostrarte esto en
Maya antes de continuar. Porque esto puede ser un
poco confuso. Así que vamos, vamos a
obtener una lista de espacios de nombres. Espacios de nombres es igual a
publicar guión bajo, transferir, ser seleccionado. Hay espacio de coordenadas dice déjame mover esto por
aquí, nombrar espacios. Y vamos a seguir adelante e imprimir
eso. Bien, ahí tienes. Entonces tenemos tres, estos
tres espacios de nombres. Entonces, en realidad,
vamos a poner esa
lista aquí para que sea más obvia. ¿Bien? Entonces imprimimos esa lista. Tenemos esos tres espacios de nombres. Si imprimo, si hago esto, por ejemplo estoy cortando la lista. Pero si no
incluyo ningún índice, tomará desde el
principio mismo de la lista hasta el
final de la lista. Entonces básicamente haciendo una copia
completa de la lista. Ahora recuerda antes
que te dije que las listas se pueden modificar. Eso significa que puedes modificar espacios de Britney de
nombre
una y otra vez. Cuando haces esto,
estás haciendo una copia de la misma. Entonces es como una lista separada. Y si estás
modificando la copia, no
estarás afectando
la original. Entonces en este caso, básicamente
estamos imprimiendo
una copia de esa lista. Ahora como mencioné, queremos todo
menos el primero. Entonces podemos comenzar en el índice, en el segundo ítem, que es índice número uno porque
empezamos a contar en cero. Entonces veamos qué nos da esto. Ahí vas. Obtenemos a Severus y Linda. Ahora bien, ¿y si
solo quisiéramos el último? Bueno, para AC, podemos empezar en el índice dos y sólo
conseguimos esa maravilla. Ahora, sí mencioné que se puede, se
le puede decir el corte de
la lista a trabajar para parar. Entonces en este caso, ¿y si quisiéramos parar? Número dos,
digamos que queremos todo desde cero
hasta el segundo ítem. El segundo ítem lógicamente
debe ser el índice número uno. Pero si hago eso, sólo
me sale uno. Eso es porque como dije, el segundo lugar aquí después
del colon no es inclusivo. Eso quiere decir
que hay que repasar uno. Entonces, si hago índice
número dos entre, básicamente
voy a
obtener el índice número cero y índice número uno hasta
uno antes del número dos. Sé que puede ser un
poco confuso. Incluso para mí. A veces
olvido cuál es inclusivo, ¿cuál es exclusivo? Pero es, así es como
funciona Python y hay, hay algunas razones detrás de esto, pero no necesitamos
meternos en eso ahora mismo. Pero una vez más, si
dejo esto vacío, voy a conseguir, en realidad voy a empezar en el índice uno. Voy a ir todo
el camino hasta el final. Entonces voy a dejarla vacía. Ahí vas. Si tienes curiosidad,
si puedes usar el índice menos uno, puedes. Funciona de la misma manera que,
como si estuvieras escribiendo el índice
número cuatro en este caso. Entonces este es el índice 01.2, lo siento, índice número tres. Si estás escribiendo el
índice número tres aquí, obtendrás 12.3. ¿Se ignorará menos uno? Porque como dijimos, menos uno igual es
lo mismo que el último índice. Menos uno básicamente
es lo mismo que tres. Entonces conseguirás
uno. Y eso es todo. De todas formas solo obtendrá servidores. Espero que no haya sido muy confuso. Repasaremos listas con más
detalle Después de este proyecto. Por ahora, todo lo que necesitamos es, todo lo que necesitamos saber es que
queremos una copia de la lista, saltándose el primer ítem, por lo que es mantener el índice cero. Entonces comenzando en el índice uno hasta
el final de esa lista. Volvamos y hagamos eso. Bueno, ya nosotros,
ya no lo hicimos. Tenemos una nueva lista de target, de espacios de nombres, que son
los espacios de nombres de destino. Entonces, lo que podemos hacer ahora, necesitamos recorrer
estos espacios de nombres objetivo. Entonces voy a llamar a esto, voy a decir por objetivo. En espacios de nombres objetivo. Simplemente vamos
a recorrer eso y aplicar la publicación a cada uno
de los espacios de nombres de destino. En lugar de los espacios de
nombres del espacio de argumentos. Ahí vas. Entonces, sigamos adelante
y probemos esto. Como de costumbre, voy a recargar el módulo porque
hice algunos cambios. Ya no necesitamos esto,
así que voy a eliminarlo. Y vamos, probemos
nuestra función. Hagámoslo,
volvamos a repasar nuestra prueba. Entonces, si no tengo nada seleccionado, recibimos la advertencia. Si sólo tengo uno seleccionado, obtenemos la advertencia. Y ahora si nosotros, hagamos un cambio en la pose. Digamos esto. De hecho, seleccionemos también
el sombrero. Vamos a aplicar todos esos controladores
que seleccioné. 21.2 plataformas. Ejecute el código. Está repasando esos homenajes
y perfecto, ahí tienes. Entonces incluso el sombrero en la otra
referencia mientras abastece, porque sí encontró que el controlador sí
encontró ese atributo. Mantengamos el sombrero en este
personaje de aquí mismo. Así que disculpas por
mis horribles publicaciones. Sé que esto no es
muy atractivo, no es una silueta muy buena. Pero como puedes ver, todas las poses son
exactamente iguales, que es lo que estamos buscando. Entonces ahí lo tienes. Has creado el
back-end de tu herramienta. Back-end significa la
funcionalidad de la herramienta. Ahora, sí dije que vamos
a crear una interfaz de usuario que será el front-end de la herramienta porque por muy divertido que
sea ejecutar código,
es aún más divertido
presionar un botón. Entonces, sigamos adelante y
hablemos de cómo vamos a acercarnos
a la interfaz de usuario.
27. Intro a las UIs: Volvamos a pintar
y diseñar o UI. Entonces necesitamos una ventana que sea el contenedor principal
de nuestras herramientas. Vamos a dibujar esto rápidamente. Esta será una ventana. Ahora para lo que necesitamos. Realmente no necesitamos
demasiado para esta herramienta. Vamos a necesitar un botón, pero eso es demasiado sencillo. Así que vamos a añadir un poco más que
un botón tendrá este botón aquí
tendrá pequeño título. Se llama etiqueta que dice supongamos transferencia,
algo así. ¿Necesita ser perfecto? Es sólo una maqueta del hilo. Entonces intentemos
replicar esto en código. Como mencioné, el inicio
eres tú, necesitas una ventana. Entonces hay un comando de
la misma esta biblioteca. Déjeme importar eso como de costumbre. Mis entradas en la S, hay un comando de ventana que podemos usar para
crear una ventana, y luego hay que
mostrar una ventana. Entonces antes de seguir adelante con esto, echemos un vistazo a
la documentación. Este diseño de ventana para esta función de
ventana, lo siento. Bien, entonces esta es una función de
ventana. Bajemos a los ejemplos y veamos si
podemos sacar algo de ellos. Bien, aquí mismo,
haz una nueva ventana. Parece así,
emocionante. Unos botones. Vamos, copiemos este código y veamos si podemos
empezar desde aquí. Y pegamos el código aquí. Vamos a seguir adelante y
ejecutarlo. Bien, ahí vamos. Tenemos ventana, tenemos
un par de botones. Tenemos un título sobre ellos
que no hace nada, y un botón que está
cerrando la interfaz de usuario. Bien, entonces veamos
qué está pasando aquí. Ignoremos los
argumentos por ahora. Volveremos a
esos en un segundo. En primer lugar, estamos
creando una ventana y estamos almacenando esa ventana en
esta variable de ventana. Entonces veamos cuál es
esa variable de ventana, simplemente
va a ejecutar el comando window e
imprimir la variable. ¿Bien? Entonces ese es un trozo de cuerda. Eso es porque al igual que
los objetos son notas en Maya, por ejemplo, si estás trabajando
con un controlador, si selecciono este controlador, interactuamos con el
controlador a través de su nombre. Ese nombre representa
cualquier objeto que esté sucediendo dentro de Maya. Eso es similar con nosotros. Ustedes tienen nombre
e interactúan con esos dos ojos a través de
su nombre en este caso, sin darle un nombre, nombre explícito, el hombre nos ha dado
su creatinina. Entonces iniciamos ese nombre
en la variable de ventana, que en realidad solo
va a ser una cadena. Y al final de este código, mostramos esa ventana
usando su nombre. Podemos, si quieres, darle un nombre, por ejemplo mi UI. Y si ejecuto
esto y lo imprimo, va a imprimir el
nombre que le di. Pero por ahora,
no nos preocupemos por eso. No es necesario
para este ejemplo. Bien, vamos, sigamos adelante y veamos qué más
está pasando aquí. A continuación, estamos
creando un layout. El diseño son muy importantes. Los layouts son básicamente lo que tienen los contenedores
que gestionan la interfaz de usuario. Y permítanme tratar de
explicar este concepto. Aquí están independientes. Entonces hay dos
tipos principales de diseños. Hay diseños de columna
y hay Diseño de fila. Hay más tipos,
pero estos son los principales que vas
a usar. Un diseño de columna
fluirá hacia abajo como una columna
de arriba a abajo. Entonces, si agregas un widget con Jerry es algo
así como un botón, como un fragmento de texto TextField. Entonces, si agregas un diseño de columna, habrá fluyendo hacia abajo. Si agrega widgets
a un diseño de fila, fluirá de
izquierda a derecha horizontalmente. Entonces este concepto es, es básicamente cómo se
manejan las UI en Maya, pero también cómo funcionan en otros frameworks de UI
como q, D, por ejemplo van a entidad ahí se
llamará horizontal y
vertical tus ojos, pero es un concepto
similar al de los diseños de columnas y filas. Y cómo es importante
saber que puedes poner layout dentro de todos
sus demás layouts. Y así es como se puede
crear UI más complejas. Así que imagina que tienes
un diseño de columna grande, por ejemplo, tienes un diseño de columna. Vuelve a fluir de arriba a abajo y le estás
agregando botones. Y luego, de pronto,
déjame cambiar el color. Se le agrega un diseño de fila. Y luego estás agregando
botones a ese diseño de fila. Entonces, una vez más, eso
fluirá de izquierda a derecha. Los botones
vendrán de esta manera. Y luego agregas
otro diseño de fila. Y ahora aquí es donde
se está complicando. Y dentro de ese diseño de fila, agrega diseños de columna. Agrega tres diseños de columna que fluyen
de izquierda a derecha. Pero cuando añades botones o widgets dentro de
esos diseños de columna. Esos widgets volverán a
fluir de arriba a abajo. Entonces así es, así es como
creas este flujo en estas UI
más, más complejas dentro de Maya. Así que ten en cuenta este concepto
mientras trabajamos con layouts. Volvamos a Maya. Así que estamos agregando un diseño de columna. Ahora dentro de ese diseño de
columna, tenemos dos botones. Entonces estamos fijando al padre. Vamos, vamos a quedarnos con esto por ahora. Volveré a ello
en sólo un segundo. Entonces estamos mostrando la ventana. Entonces, ¿qué pasa si ejecutamos todo sin
mostrar la ventana? Se creará tu interfaz de usuario. Pero no se ha mostrado. Puedes mostrarlo en un momento posterior, pero en este caso necesitas
ejecutar show window para mostrar eso. Entonces como pueden ver,
como mencioné, porque estamos en
un diseño de columnas, los botones están fluyendo de
arriba a abajo. Entonces, si agrego algunos botones más, fluirán hacia arriba por la parte inferior. Ahora bien, y si tuviera que
insertar un diseño de fila aquí, cmd S diseño de fila de puntos. Vamos a agregar eso en. Demasiados niños maquetación. Bien, creo que tenemos que definir el número de elementos
para el diseño de filas. Echemos un vistazo a eso
en la documentación. Desenrollar. Ahí vas. Bien, vamos a ver. Los ejemplos suelen ser una buena
indicación de qué hacer. Diseño de filas, número de columnas. Bien, ahí vamos.
Creo que el número de columnas es lo que
estamos buscando. Entonces estamos agregando, solo
vamos a agregar dos botones. Sólo para probarlo. Para mostrar este ejemplo, digamos que el número de
columnas es igual a. Demuéstralo. Bien, ahí tienes. Entonces tenemos el primer diseño, el diseño columnas de arriba a abajo, luego un diseño de fila que va
de izquierda a derecha. Ahora agreguemos otro
diseño de columna justo después de esto, y luego dos botones más. Déjame dejar algo de espacio
para que sea un poco más fácil de ver y
agregar algunos comentarios. Entonces esto será una fila, esta será una columna. Y el primero aquí arriba, esta voluntad, esto
también es una capa de columna. Bien, vamos a maximizar esto. Pero mira lo que pasa aquí. Demasiados niños maquetación. Es porque estamos agregando el diseño de columna
a ese diseño de fila. Entonces ese diseño de columna es otro hijo de
ese diseño de fila. Entonces, si decimos que queremos tres
columnas en este diseño de fila, debería acomodar a
esos niños adicionales. Niño extra. Ahí vas. Entonces esto es lo que está
pasando aquí. Déjame tomar una
captura de pantalla rápida para que pueda hacer, puedo dibujar sobre ella. Lo que está sucediendo aquí es que primero tenemos un diseño de
columna, yendo de arriba a
abajo, diseño de columna. Y luego tenemos disposición de filas, que es esta de aquí, que va de
izquierda a derecha. Pero ahora dentro de
ese diseño de fila para insertar otro diseño de columna, que nuevamente fluye
de arriba a abajo. Eso se remonta a
esta idea de la que
hablé de layouts
dentro de otros layouts. Ahora bien, ¿qué pasa con esa función padre
establecida aquí? Siempre que cree un diseño, sin diseño será
el padre actual. Entonces, lo que sea que
agregues después, justo después de ese diseño se
pondrá en esa última capa
que creaste. Entonces, este diseño de fila, en realidad
se ha agregado
a este diseño de columna. Y esta disposición de columna
se está agregando a ese rodillo. Sí, Entonces la
parte actual en que el momento es este diseño de
columna. Así que imaginemos,
déjame correr esto otra vez. Digamos que queremos
este diseño de columna. Entonces estos dos botones para
seguir fluyendo hacia abajo esta manera para ser el salto
sobre el diseño de la fila. La forma de hacerlo es mediante el
uso de esta función set. Entonces primero creamos
nuestro diseño de columna, agregamos dos botones, luego creamos un diseño de fila. El padre actual
está en el lanzamiento. Ahora antes de agregar el
siguiente diseño de columna, queremos cambiar el
padre actual para que ya esté ahí. El diseño de la primera columna, que es donde
queremos agregar una nueva. Entonces eso es lo que está haciendo esto. Si yo, si digo set
parent dot-dot, esta es la sintaxis muy
específica de Maya. Para volver a la parte anterior. Entonces puedes decir saltar sobre el padre actual y
hacer el salto sobre el último diseño y hacer que el padre actual
sea el anterior. Así que vamos a señalar el padre actual
para que sea el diseño de columnas. Entonces ahora este nuevo diseño de
columna debería agregarse a ese diseño original, original o de primera columna. Veamos cómo se ve eso. Ahí vas. Entonces déjame tomar
otra captura de pantalla. Perfecto. Entonces una vez más, sólo para dejar
esto lo más claro que pueda. Tenemos un diseño de columna. Ashley. Ahí estoy exagerando. Lo siento, no estoy exagerando.
No estoy del todo en lo cierto. Como todo esto
es un diseño de columna. Después dentro de eso
agregamos estos botones. Y luego dentro de
ese diseño de columna, agregamos este diseño de fila. Entonces nosotros, el
padre actual cuando
creamos este diseño de fila
es ese diseño, pero el diseño de fila porque
el padre actual. Pero recuerda al usar
set parent por aquí, cambiamos el padre actual para que vuelva
a ser el diseño principal. Y ahí es cuando creamos
otro diseño de columna. Y ahí es cuando
agregamos los nuevos botones. Entonces ojalá eso tenga sentido. Puede ser un
poco confuso. Pero, pero de nuevo, una vez que te metas
en la idea de los layouts, la forma en que creas las
UI será mucho más eficiente. Entonces ahora volvamos a ver qué están haciendo estos
argumentos. Entonces en la ventana, tenemos un título, ese es el nombre del título de la ventana. Llamemos a esto. Cambiemos esto a
título de ventana que simplemente una cadena. Entonces tenemos el nombre del icono. Ver lo que es eso en
la documentación. Oh, interesante. En realidad
no aparece. Eso es muy desafortunado,
para ser honesto, nunca antes había usado ese
argumento, así que no estoy muy
seguro de lo que hace. No parece
darnos ningún tipo de iconos en la ventana. Entonces simplemente
voy a quitarlo. Ahora con altura, esto es, mencioné antes,
esto es una tupla. Esta es simplemente una lista que no se puede modificar
que tiene dos elementos. Esta será la anchura,
esta será la altura. Es decir, se trata píxeles que está diciendo
que la ventana tendrá 200 píxeles de largo
y 55 píxeles de alto. Es por eso que cuando
creamos por primera vez, no muestra
todos los botones porque estamos limitando que si elimino este argumento, no
hay restricciones
de tamaño y
simplemente mostrará todos esos botones. Excelente. Así que solo tengo
toda la columna es igual a verdad. ¿Qué pasa si esto es falso? Simplemente pongámoslo en falso
y veamos qué está haciendo. Bien, bueno, nuestros botones
no se están expandiendo con la ventana. No son de tamaño fijo. Entonces eso es lo que acabo de
doblar columna está haciendo. Es hacer que los botones o los widgets dentro
de él sean ajustables. Excepto por el diseño de filas. Porque el diseño de fila
necesita administrar sus propios widgets expandibles. Así que vamos, sigamos adelante. ¿Dónde está mi ventana aquí? Cierre todas esas copias. Bien, ahora tenemos los botones. Etiqueta son simplemente los textos que van a
aparecer en el botón. Y comando es una
pieza de la pieza de código con la que se ejecutará
cuando presiones el botón. Ahora un comando puede
ser o bien una cadena, y en el ejemplo están
usando paréntesis, pero eso no es necesario. Puede ser una cadena,
en este caso es una cadena que está
borrando la ventana. Este es un comando
para eliminar una interfaz de usuario. Y estamos pasando en nombre
de la ventana que creamos. Entonces básicamente estamos
diluyendo esa ventana. Digamos, hagamos este
botón aquí arriba, hagamos algo. Vamos a llamarlo, hacer algo. Y voy a agregarle
un comando. El comando será
simplemente una sentencia print, pero ahora va a estar
en el formato de una cadena. Entonces es una especie de pieza de código envuelta dentro de una cuerda. Entonces vamos a decir
imprimir haciendo algo,
por ejemplo, vamos a hacer eso. Ahora. Observe que estoy usando los
dos tipos de citas, comillas
simples y comillas dobles. Eso es porque si tuviera que
usar comillas simples aquí, maya pensaría que este
es el final de mi cadena. Entonces lo que estoy haciendo, recuerda, recuerda que mencioné
para crear una cadena, hay
que hacer coincidir el principio y el final de la cadena, el tipo que tiene
que ser el mismo. Así que básicamente estoy diciendo, bien, dentro de esta cadena, está esta cadena externa. Hay una cadena dentro de ella, que es lo que
básicamente estoy pasando a esa declaración impresa de que
estoy usando un sacramento. Así que vamos a ejecutar esto. Déjame dar click en el botón
que dice hacer algo. Y ahora tienes es hacer
esprintar, hacer algo. Ahora a esa orden. También se puede pasar en una función. Entonces déjame mostrarte qué es
eso, cómo se ve eso. Si llamo a mi función,
haga algo, por ejemplo que no sea que
lo
llamemos prueba, prueba de función. Y voy a
hacer esta impresión,
solo imprimir , haciendo algo
desde dentro de la función. Bien, entonces en vez de
pasar una cadena, realidad
puedo pasar
en una función. Pero puedo pasar en la función sin llamar a la función. Observe cómo no estoy
usando el paréntesis. Si uso un paréntesis, estoy llamando a la
función y estoy dando el argumento command, el resultado, la salida, el retorno de esa función, que en este caso es un non, porque no estoy
devolviendo nada. Lo que quería hacer es darle argumentos a
ese comando por función
real
sin dos puntos. Eso quiere decir que cuando
presione el botón, Maya tomará mi función
y la llamará a sí misma. Entonces veamos qué
pasa en ese caso. Antes de hacer eso,
déjame limpiar esto. No creo que necesitemos estos
botones extra ya que ya hemos
pasado por el ejemplo. Mantengámoslo simple.
Haz algo. Bien, está haciendo algo pero no
es exactamente
lo que esperábamos. Veamos qué está pasando aquí. Es decir que la
función de prueba no toma argumentos, pero se dio uno de ellos. Déjame cerrar la ventana. Entonces eso es cierto. No voy a tomar ningún argumento. Pero de alguna manera cuando
presiono el botón, mis ojos pasan en un argumento a mi
función de prueba, solo uno. Entonces vamos a inspeccionarlo
y ver qué es. Simplemente puedo captar ese argumento pasando un
argumento a mi función. Vamos a llamarlo x. Simplemente imprima,
Imprima x. Veamos qué es,
qué está haciendo el mío. Es que está impreso falso. Entonces parece mi sí, pasando en un booleano
a la función. Por alguna razón.
No estoy muy segura de por qué. Ahora bien, lo que pasa es
que realmente no lo necesitamos. Realmente no nos importa. Entonces hay dos formas en las que puedes conseguir que puedas manejar
esta situación. Uno de ellos,
igual que lo hice aquí, es aceptar un argumento
porque ya
sabes, estarás esperando eso
de Maya e ignorarlo. Simplemente no hagas nada al respecto. Puedes aceptarlo, pero no usarlo dentro
de la función. Como veis. Ahí tienes, mi botón
va a estar funcionando. Otra forma de hacerlo es usar una sintaxis especial
que va así. Haces un asteriscos o una estrella, una estrella, una estrella, un nuevo tipo, args. Ahora bien, estas pueden ser
cualquier palabra que quieras, pero por convención
verás a la gente hacer args. Lo que está haciendo esto. Esto es como un “catch-all para cualquier argumento de que
descartes la función. Tienes acceso a
ellos si quieres. Muchas veces la gente
usa esto para ignorar cualquier argumento que pudiera
esperarse pero que no sea necesario. Entonces déjame, déjame mostrarte cómo esta estrella arga que las
sintaxis está funcionando. Entonces si digo si llamo a
mi prueba de función y paso 1234 argumentos, va a funcionar. Entonces esta sintaxis es básicamente atrapar
cualquier cosa que le arroje. Y en realidad no lo estoy usando. Pero ahora vamos, veamos qué,
qué está pasando en realidad. Imprimamos esos
argumentos. Bien, muy bien. Entonces esto es lo que está pasando. Entonces esta sintaxis de arco estelar, básicamente está captando cualquier
argumento que le dé. Los estoy poniendo
dentro de una tupla. Una vez más, recuerda
que una tupla es como una lista en ciclista, pero no puedes modificarla. Eso significa que
en realidad puedo obtener por ejemplo el primer argumento
que se aprobó, que se pasó, en este
caso será el número uno. Simplemente puedo
imprimirlo. Ahí vas. Entonces para casos como
este donde la UI, por alguna razón
Maya como que te da un argumento y
no la necesitas. Te recomiendo usar este índice. Puedes usar esa sintaxis
junto con otros argumentos, como si estás esperando
un argumento real, seguro,
esperando un bebé, y luego cualquier cosa que pueda ser
arrojada a tu función. Esto también es, también válido. ¿Bien? Entonces con eso
dicho, volvamos. Volvamos a simplemente usar ese tipo de red catch-all star args y pasarlo a
nuestro comando para el botón. Eso es hacer algo. Bien, perfecto, así que usemos esto como un comienzo
para nuestra interfaz de usuario real.
28. Crear la interfaz de usuario: Bien, ya no necesitamos esta función de
prueba. No necesitamos este comentario. Creo que este es un
buen punto de partida. Vamos, cambiemos el
título de nuestra ventana. Llamémoslo debe herramienta
de transferencia. Ese será el
nombre de nuestra ventana. Y hagamos las columnas solo
tengo todas sí, porque queremos que los
botones puedan
expandirse con las columnas. No necesitamos dos botones, solo
necesitamos uno. Y digamos que la etiqueta
debe ser transferida. Bien, y mando, vamos, dejemos afuera el
comando por ahora. Añadiremos una función
a través de ella en un segundo. En realidad. Llamemos a
esta transferencia seleccionada. Bien, ahí tienes,
un solo botón. No podemos ver el nombre, el título de la ventana. Así que eso sería agradable de ver. Podemos usar el argumento width, height que teníamos antes. O también sé que
la ventana tiene argumentos de
peso y altura individualmente. Entonces simplemente podemos agregar el ancho. Podemos decir,
hagámoslo 300 píxeles, por ejemplo, tal vez un poco
más grande para 100. Eso fue demasiado,
digamos 350. Bien, eso suena genial. Entonces ahora tenemos nuestro botón. El botón es un poco delgado. Así que también hagamos el
botón un poco más grande. Podemos tener un
argumento de altura en el botón. Hagamos que sea de 20 pixeles de alto. No es suficiente. Vamos a duplicarlo 40. Bien, eso parece un
poco mejor. Ahora, también dije que
queríamos agregar un poco de etiqueta en la
parte superior como un trozo de texto. Hay un texto componentes de la interfaz en esto aquí en esta biblioteca
se llama simplemente texto. Digamos esto.
Bajemos a los ejemplos. Ahí vas. Eso es todo lo que parece
que necesitamos al respecto. Entonces podemos agregar una etiqueta y
podemos alinear el texto. Vamos, consigamos este ejemplo. Copiemos de este ejemplo. Voy a añadir
ese trozo de texto. Y la etiqueta será, digamos post
transfer todas las gorras. Y vamos a alinearlo a la
izquierda y a dos, ¿qué pasa? Eso no es genial.
Mantengámoslo en el centro. Y también es muy pequeña. El texto es muy pequeño. A ver si podemos hacer
algo al respecto. Quizás podamos cambiar la
altura de la misma también. Digamos 60 píxeles. Digamos 50. Y hagamos el botón un
poco más pequeño. Hagamos el botón 30. El texto está un poco bien. Lo siento. Voy a
volver a ponerme la batuta en este punto. Sólo estoy metiendo
con los números. Esto no es tan importante, pero siéntete libre de jugar con
las tallas como desees. Um, creo que esto está
bastante contento con esto. Entonces tenemos nuestros textos,
tenemos nuestro botón. Y antes de trasladar
esto a PyCharm, quiero mostrarte algo que va
a ser muy útil. Y eso es información sobre herramientas. Ahora, una descripción emergente, también
conocida como clip de herramienta, pero el nombre oficial
está inclinado son los textos que ocurren cuando pasas el cursor
sobre algo en la interfaz de usuario. Como pueden ver cuando coloco el
cursor sobre estos botones, obtienes un poco de ayuda. Y también aquí abajo
en esta barra de estado, obtienes un poco de ayuda de eso es básicamente
decirte qué va a hacer el botón
. Así que podemos agregar eso en
todos nuestros elementos de interfaz de usuario. Y eso se llama
anotación. Entonces el argumento para eso
se llama anotación, pero el nombre real para ello es tooltip o clip de herramienta
también se llama en Maya. Entonces si no lo
ves como yo, como cuando pasas
el cursor sobre algo, si no lo ves,
tienes que ir a Windows, configuración,
preferencias, preferencias. Ahora en debajo de los elementos de la interfaz de usuario, perdón por su salud,
hay ayuda de interfaz. En su ayuda emergente. Verás esta
pantalla dos clips. Quieres marcar esa casilla. Si no tienes eso verificado,
no lo verás. Bien, entonces ahí tienes. Entonces podemos sumar esos. Una vez más con la anotación. Argumento. Entonces anotación es igual,
voy a presionar Enter aquí. Esto es, esto es
válido por cierto. Si presiono Enter, es válido y Python no
se quejará. Voy a decir anotación,
transferencia entre caracteres. Esta será la
anotación en el texto. En realidad voy a volver, volver a esta sola línea. Y luego la anotación
en el botón. Seremos anotación equivale a
seleccionar dos o más caracteres. Entonces esta es la ayuda. Entonces en ese caso, ya que este es el tipo de
instrucciones para el total, voy
a escribir algo un poco más detallado. Transferir postes del ladrillo seleccionado del
bosque al resto de la selección. Bien, esto puede que no sea un
poco largo, pero está bien. Entonces ahora cuando pasemos
el cursor sobre estos botones, verás que el peaje
excava un poco de ayuda. Y también lo ves
aquí abajo en la barra de estado. Bien, perfecto, entonces nuestro botón no
está haciendo nada. Movamos esto a una
función en PyCharm en nuestro módulo para que
viva en el archivo. Y luego podemos
conectar el botón. Bien, déjame copiar esto y
crear una función aquí arriba. En la parte superior del archivo. Voy a llamarlo Show UI. Que por cierto, suele ser una buena idea mantener
tu, tu backend, como mencioné antes,
que es tu funcionalidad
separada de tu front-end, que es tu interfaz de usuario. Normalmente tendría
esta función en un módulo separado junto a
este módulo post transferencia. En este caso,
porque es una interfaz de usuario muy sencilla, voy a dejar aquí y es solo para este
primer proyecto. Pero en la siguiente
vas a ver la separación entre la
funcionalidad y la interfaz de usuario, que suele ser una
buena práctica para hacer. Entonces, puedes llamar a tus
funciones directamente y puedes tener tu interfaz de usuario
completamente separada, completamente agnóstica de
tu funcionalidad real. Pero por ahora, vamos como
dije, mantengámoslo aquí. Simplemente voy a pegar
mi código UI aquí. Y vamos a
probarlo muy rápido. Digamos importar,
posar, transferir. Bien, y si no has
reiniciado tu Maya, una vez más,
quieres recargar el módulo. Déjame recargar eso. Bien, ahí tienes. Y puedo decir Posts
underscore transfer, dot show other score UI. Y llamemos a esa
función. Ahí vas. Bien. Ahora, el paso final es
conectar el botón. Y el botón de aquí
tomará ese comando. Voy a presionar Enter, como dije antes, si tienes algo en varias líneas,
no importa. Python no se quejará. Puedes tener cada argumento en una línea diferente si quieres. Entonces, hagamos eso por
el bien del ejemplo. Comando es igual a esta
será mi función de transferencia
seleccionada. Ahí vas. Ahora vamos a probar esto. Error de transferencia seleccionada. Ok, bien. Por supuesto que
acabamos de hablar de esto. Necesitamos, voy a
usar esos args estelares. Esa es una especie de sintaxis
catch-all catch-all para
atrapar el argumento. Y mientras estoy en ello, voy a añadir un docstring
que me olvidé de escribir. Transfiera la plataforma seleccionada por el
bosque de pose al resto de la selección. Ahora star args es un especial, realmente no
necesitamos agregar
una descripción para esto, pero Ashley, Bueno, lo hacemos
porque tiene un propósito. Vamos a llamar a esto atrapada. Los cuatro argumentos pasados por mi no vamos
a devolver nada. Entonces no dejamos
que eso se deslice. Sí. Bien. Y ahora más pobre te
muestro, puede que simplemente
agreguemos un simple docstring. Mostrar la interfaz de usuario para la
herramienta basada en una, mxnet, menos explicación, pero aún así
vamos a agregarla ahí. Bien, vamos a ejecutar esto. Déjame cerrar esta herramienta. Ahí vamos. Ahora está funcionando. Por favor, seleccione más de una plataforma. Si no tenemos nada seleccionado, nos dice
que toquemos
seleccionar algo. Y por último, permítanme seguir adelante y crear un post más agradable y esto
para probar correctamente nuestra herramienta. Bien, tenemos una pose un poco
mejor,
no una obra maestra neuro increíble. Seguro que sé que
puedes hacerlo mejor que yo, pero es mejor que lo
horrible que teníamos antes. Entonces pongamos la herramienta a una prueba
más útil que agradable. Así que vamos a seleccionar todos
estos controladores. No quiero
seleccionar el
rol de sótano porque eso
solo moverá a los personajes
a esta posición. Y ahí lo tienes, selecciónalo todos mis controles, objetivo, uno, blanco también. Vamos a transferir. El proceso está
pasando por muchos controladores en este momento
es un poco lento. Pero ahí tienes. Nuestras poses, déjame
encender las curvas. Se ven exactamente igual. Entonces ahí lo tienes para
robar tu primer año, comparto esto con tus amigos,
úsalo cuando trabajes. Esta es una herramienta de trabajo real de la
que puede beneficiarse.
29. Recap proyecto: Ahora, para cerrar el proyecto, me gustaría hacer un pequeño
recapitulación de lo que aprendemos. Déjame escribirlo aquí. Entonces aprenderemos muchas cosas. Aprenderá sobre
listas y tuplas. Aprenderemos sobre diccionarios, aprendimos sobre bucles for, cómo iterar a través de
elementos en una lista. Aprenderemos más sobre
cómo manejar cuerdas. Aprenderemos más
sobre las declaraciones if aprenderán más sobre las funciones. Aprendimos a medir
tus ojos sobre cómo manejar,
cómo administrar los
elementos de la interfaz de usuario usando diseños. Aprenderemos a interactuar con objetos y
notas en la escena. Cómo establecer y obtener atributos, cómo interactuar con plataformas, y realmente cómo
dividir las cosas para
que podamos obtener la información y los datos que necesitamos. Ahora bien, esa es una de las principales
derivaciones de este proyecto. Que ahora usando estos
dos tipos de datos y estos son los principales
tipos de datos para almacenar datos. Ahora ya sabe cómo consultar, almacenar y manipular datos para cualquier propósito
que necesite. Ahora recuerda que usamos list para consultar y
almacenar selecciones, para hacer listas de controles, hacer listas de espacios de nombres,
atributos, etc, etc. ¿Podemos usar
diccionarios para crear un mapeo entre atributos
y sus valores? Entonces estos son conceptos muy
simples, pero son extremadamente poderosos
y se
traducirán en casos de
uso más complejos para ti. Así que enhorabuena por
completar el proyecto, y ahora ya estás listo
para el siguiente.
30. Buceo profundo - cuerdas: Vamos a aprender
más sobre cuerdas. Las cadenas en términos simples son
una secuencia de caracteres. Se puede pensar en ellos como texto. Para que puedas crear
cadenas con comillas. Pueden ser comillas simples, comillas
dobles o comillas triples. Para en este caso hay
tres comillas triples, ya sea tres comillas simples
o tres comillas dobles. Entonces, por ejemplo esto es una cadena, y tres comillas simples también
son una cadena. Pero las comillas triples
suelen
reservarse para bloques de
texto o docstrings. Por lo general, están reservados
solo para docstrings. Pero podrías crear, crear bloques de textos. Entonces, cuando tienes comillas
simples y dobles,
cadena uno, por ejemplo ,
cadena dos, solo puedes crear esta cadena
como una sola línea. Pero cuando tienes cadenas de documentos, siempre y cuando estén abriendo
y cerrando esa cadena, puedes escribir dentro de ella. Y ahí se
conservarán las nuevas líneas para ti. Entonces esto es
como un bloque de texto. Y ese será el mismo caso con las cuerdas triples, sencillas. Entonces,
como que veo aquí, siempre y cuando la cita inicial y final sea
del mismo tipo de tiempo, la cadena será válida. Y con la misma, misma lógica. Si quieres tener comillas
dentro de tu cadena. Entonces déjame,
déjame imprimir esto. Primero. Vamos a imprimir esa cadena. Entonces, como ves, se imprime
sin las cotizaciones. Digamos que quiero
imprimirlo con botas. Puedo poner comillas dobles
dentro de ella. Ahí vas. Si quería con comillas simples, hay dos formas de hacerlo. Uno, puedo cambiar
las cotizaciones. O dos, puedo saltarme las cotizaciones. Déjame mostrarte lo
que eso, lo que eso significa. ¿Qué pasa si
pongo aquí una cotización? Bueno, Python pensará que estás en la
nueva cadena aquí. Esta voluntad, esto es básicamente una cadena vacía y te
dará un error. Entonces, ¿cómo puedo
hacerlo para que pueda tener comillas simples y aún así
tener comillas simples dentro Puedes escapar de esas
comillas simples usando una barra invertida. Y eso va
a funcionar igual. Entonces básicamente le estás
diciendo a Python, este no es el
final de mi cadena, y este tampoco es
el final de mi cadena. Estás escapando sin pasar por
esas, esas citas. Pero por mucho que puedas, es más fácil de simplificar
mezclar los tipos de cotizaciones. Esta barra diagonal inversa sirve para
otro propósito. Hay un tipo especial de caracteres llamados caracteres de
escape. Estos backslash y solo notan
que no es un slash hacia adelante, es una diagonal inversa que sirve como el personaje de lo que define
escape. Déjame mostrarte lo que
quiero decir con eso. El
carácter de omisión más común es la barra diagonal inversa n, y esto creará
una nueva línea para usted. Entonces déjame mostrarte a lo que me refiero. Vamos a escribir la línea uno, barra invertida n línea para
eliminar imprimir esto. Entonces ves que no
estamos imprimiendo la barra diagonal inversa donde estamos
obteniendo una nueva línea. Estamos si no tuviera
la barra invertida de respaldo, tendría una sola línea. Entonces ese es uno de los personajes de escape más
comunes. Otro es la barra diagonal inversa
d, que significa tabulador. Estás
sangrando como si
estuvieras presionando la tecla Tab. También puedes mezclarlos. Podemos tener una nueva línea, barra diagonal inversa n y una pestaña,
barra diagonal inversa, barra diagonal inversa t. Y entonces tendrás
algo como esto. Si ella quería tener
más sangría, claro que puedes hacer
más té y otros T. Entonces, ¿y si
realmente quieres imprimir backslash n? Digamos que quieres tener estas cuerdas exactas impresas. Entonces ahora mismo si lo
ejecuto, voy a conseguir una
nueva línea entre, entre estas dos subcadenas. Una subcadena es simplemente
una pieza de una cuerda. Entonces la línea dos en este
caso es subcadena. línea uno es una subcadena, y el carácter de escape
n también es una subcadena. Entonces digamos que queremos
imprimir exactamente esto. Bueno, en realidad puedes escapar, escapar del personaje y
lo haces usando esta misma barra diagonal inversa. Lo que va a pasar
es esta barra diagonal inversa. La primera diagonal inversa, le va
a decir a Python que no lea
esto ya que el carácter de escape es un carácter especial simplemente
como una, como una cadena sin procesar. Entonces si imprimí,
ahora, lo entiendes. Entonces así es como
puedes escapar de él. Ahora bien, hay otra manera de saltarse o escapar o de alguna manera ignorar
a un personaje especial. Entonces, si
vuelvo a imprimir esto, me sale una nueva línea. Si escribo una R
antes de esta cadena, eso me dará
el mismo resultado. Ahora bien, son suele reservarse para algo
llamado rechazos. Que es un tipo especial de expresión para
buscar cadenas. Pero son en este caso, significa que esta
es una cadena de fila. Significa que no
habrá interpretación de caracteres especiales. Él será rho, simplemente lo que sea que esté dentro de la cuerda se
imprimirá tal cual es. Entonces esa es otra
forma de escapar de ella. Así que esto es especialmente
útil cuando estás, cuando estás tratando con partes dentro del interior de Windows, ruta del
archivo
podría verse así. Por ejemplo, déjame hacer una nueva variable. Una ruta de archivo podría
parecer algo así como C dos puntos guión una ruta a un archivo, punto dx dy, por ejemplo, ahí tienes. Digamos que esta es una
carpeta o ruta de archivo. Entonces un par de carpetas o
directorios y luego nuestro archivo, si tuviera que imprimir esto, imprimió exactamente lo que escribí. Y la razón es porque
estoy usando el slash delantero. Entonces este fue mi error. Perdón por eso. Déjame cambiar rápidamente
que la barra inversa. Entonces, como puede ver,
la diagonal hacia adelante es completamente segura de usar, pero la diagonal inversa se
interpretará de una manera diferente. Entonces ves que mi, mi a fue cambiado. Vamos a convertirnos en estos personajes. Luego después de path, tenemos
la pestaña que es t. Entonces la barra diagonal inversa F se volvía
hacia este otro personaje. Claramente eso no es lo que queremos. Así que simplemente podrías
escapar de esos personajes, pero tienes que adivinar o tienes que
saber cuáles. Tenemos que saltarnos. A, no necesitamos escapar de P-I. Sí necesitamos escapar t
y necesitamos escapar f. Entonces este es el
resultado que queremos. O podríamos usar cuerdas crudas. Sólo hay que poner un RB muy por detrás la cuerda y
obtenemos el mismo resultado. Entonces las cadenas se usan
para muchas cosas,
para acceder a rutas de archivos, para crear variables, para declarar nombres o
etiquetar cosas. Pero la operación más común
que harás con cadenas, o una de las operaciones más
comunes se llama concatenación, que básicamente significa
armar cadenas. Entonces déjame mostrarte cómo podría ser
eso. Llamemos a esto tener
una variable llamada S. Vamos a
iniciarla como una cadena vacía. Y voy a decir
S plus equivale a hola. Y lo voy a decir aquí
abajo como más es igual al espacio y la S
más igual al mundo. Ahora déjame imprimir S. Ahora dice hola mundo. Entonces, ¿qué está pasando aquí? Esta notación más iguales, esto es básicamente equivalente
a decir S perdido, hola. Esto es lo que está pasando aquí, es que obtenemos el
valor anterior de S, que es una cadena vacía, y le agregamos hola. Y luego lo guardamos. Básicamente anulamos
la variable S. Entonces aquí abajo, esto será el equivalente a volver a decir
lo mismo, tomar el valor anterior de S, que es lo que acabamos de hacer. Y nuevamente, la
narración, que es, que básicamente está anulando
esa misma variable. Entonces, al usar el signo más, puedes juntar cadenas, pero hay otras formas de
juntar cuerdas. Una de las formas más comunes, y yo diría que las formas
más poderosas de concatenar cadenas es usar la función de formato punto. Vamos, veamos cómo funciona eso. Así que vamos a crear una cadena. Déjame hacer dos rizados, luego un guión bajo, luego rizados
tumorales. Entonces, lo que va a pasar es que estas llaves se convertirán en marcadores de posición o
reemplazarán algo. Ahora bien, si tuviera que
imprimir S ahora mismo, vamos a conseguir exactamente eso,
que es lo que acabamos de escribir. Pero si en cambio hago formato de punto, ese formato es una función
que está integrada en cadenas. Y paso en dos variables, digamos dos cadenas, hola y mundo otra vez. Ahora vamos a imprimirlo. Entonces como puedes ver ese
formato usaremos las llaves como marcadores de posición para reemplazar con
lo que sea que ponga aquí. Y esto puede ser
algo, otra cosa que no
sea una cuerda. Esto podría ser un número, por ejemplo, si escribo el número 100, entonces eso se reemplaza el formato. Es lo suficientemente inteligente como para
saber que puede, puede
hacerlo con cuerdas. Si tuviera que agregar
usando el signo más, una cadena y un número 100, obtendré un error
porque Python no puede concatenar una
cadena y un entero. Pero la función de formato de punto
es lo suficientemente inteligente como para saberlo. Hay otra forma de usar el formato de punto es
mediante el uso de variables. Podemos especificar variables
dentro de estas llaves. Puedo decir que la variable
uno será alta. La variable dos será,
digamos solo número. Digamos que está entumecido. Entonces, si ejecuto esto ahora mismo, vamos a obtener un error porque va a
quejarse de un error de clave porque básicamente no estamos
diciendo a la función cual, cual de estos dos
valores pertenece a qué clave. Así que arreglemos eso. Puedo decir que hola, hola va a ser alto, así que alto equivale a hola
y num será de 100. Ahí vas. Entonces esto significa que ya que estamos usando estos argumentos de palabra clave, significa que incluso si volteamos el orden, entrarás en el trabajo. Hola, cien. Ahora bien, lo genial de
esto es que puedes reutilizar las mismas variables que
eres, que tienes aquí. Entonces digamos que quieres
saludar algunas veces
en esta cadena. Simplemente se puede decir, no
hace falta que
sean guiones bajos. Sólo pongamos un espacio.
Y voy a usar la altura. Entonces ahora estamos reemplazando
cuatro lugares diferentes. Pero estamos usando
sólo dos variables. Así que la variable hi, bueno básicamente la colocamos
dentro de estos marcadores de posición. Si no tuviéramos estas
palabras clave, python se quejaría. Así que permítanme volver a cómo
teníamos esto originalmente. Di, hola. Cien. Python se quejará
porque no hemos proporcionado suficientes reemplazos para
estos marcadores de posición. Entonces en este caso
tendríamos que decir hola y hola, que es mucho mecanografiar. Para que puedas ver el poder
de usar las palabras clave. Ahora, hay una forma más de
usar la función format. Y eso es mediante el uso,
mediante el uso de índices. Así que déjame, déjame volver
rápidamente a
solo dos marcadores de posición. Entonces podría hacer esto una vez más y
solo se reemplazará en orden. Pero podría usar,
también usar índices. Y lo que
representarán estos números. Esto representará el orden en que pones tus
variables aquí. Y empezamos a contar a cero de la misma manera
que hacemos con las listas. Eso se puede ver como
el mismo resultado. Ahora bien, si
volteara estos índices, ahora estamos volteando el orden. Y ahora podemos hacer esto
mismo que con las palabras clave. Puedo decir que quiero
saludar aquí. Por lugar que puso un índice cero. Digamos hola otra vez. Pongamos el número 100. Ahí vas. Así que una vez más, simplemente usando dos variables, podemos mezclar y emparejar
usando los números de índice. Ahora déjame mostrarte una forma más de concatenar cadenas. Y esta es una especie de la forma
clásica de hacerlo. Voy a escribir signo
porcentual s, voy a dejar un
espacio y simplemente voy a escribir mundo. Ahora bien, este será
nuestro marcador de posición. Y para reemplazarlo,
voy a dejar un espacio, poner un signo de porcentaje, y luego voy a
escribir otra cosa. Digamos hola otra vez. Ahora puedes ver lo que
escriba aquí a la derecha
será reemplazado por este signo
porcentual s. Por tipo un número que
será reemplazado. Ahora, también podría hacer múltiples. Estamos viendo el seno S. Pero en este caso necesito
proporcionar una lista o una tupla. Entonces voy a usar una tupla. Puedo saludar. Planetas Palmer, este caso. Y cada uno de esos
será reemplazado por h, uno de estos ítems en la tupla. Entonces todos
te dan el mismo resultado. Mi preferencia es usar formato
punto porque te
permite hacer muchas, muchas combinaciones diferentes y te da un
poco más de flexibilidad. Pero puedes elegir
lo que funcione para ti dependiendo del código
que estés escribiendo. Ahora, bajo el capó, una cadena es un poco
más que una simple secuencia
de caracteres. Es un objeto iterable. Eso significa que
puedes iterar sobre él de la misma manera
que lo hacemos con las listas. Entonces déjame mostrarte a lo que me refiero. Déjame crear otra cadena. Vamos a llamarlo Barcelona, por ejemplo ahora, similar o de la
misma manera que lo hicimos con las listas, puedo. Proporcione un índice usando
estos corchetes. Y voy a obtener, si
proporciono índice cero porque empezamos a contar en
cero, me sale la letra b. Si hago índice número dos, obtendré la pequeña r
porque es el segundo índice. Si pedí mi
índice menos uno, que es el último índice la lista o en este
caso la cadena. Entonces voy a obtener la letra a. ahora, por la misma lógica, podemos iterar sobre la
cadena usando un bucle for. Entonces podemos decir para ins, print i, e imprimirá cada una de
las letras en esa cadena. Entonces, bajo el capó, una cadena es más como
una matriz o una lista. Simplemente da la casualidad de que cada elemento dentro de
él, es un personaje. Y también es especial en que
podemos hacer
tipos específicos de operaciones, tal como vimos con
concatenación y otras. Operaciones específicas que
están integradas para cadenas. Entonces déjame mostrarte algunas
de esas operaciones. Una cosa que puedes
hacer con cadenas es check o sub-strings. La subcadena es
básicamente una parte de una cadena o
algo que
esperarías que esté
dentro de una cadena. Déjame cambiar el nombre de esta cadena
variable. Permítanme crear una nueva
variable llamada sub string. Llamemos,
hagamos esta subcadena, tengamos la subcadena, es un préstamo o desplomado
en este caso. Entonces puedo usar la
palabra clave in para hacer una comparación. Puedo decir sub-cadena
en una cadena. Entonces esta operación me
dará un booleano. Diremos o true si la subcadena está en esta
cadena o false si no lo es. Así que permítanme almacenar ese resultado
en una variable llamada resultado e imprimir ese resultado. Ahí vas. Es cierto porque la subcadena
está dentro de Barcelona. Ahora el Barcelona no tiene
H. Así que déjame buscar eso. No hay h en Barcelona, así que me dan tornillos. Otra forma de verificar
subcadenas es con una función incorporada en
cadenas llamadas comienza con. Entonces déjame
nombrarme barra agitadora. Y permítanme reemplazar esta
operación con cadena que comienza con subcadena. Entonces esto comprobará si la cadena Barcelona
empieza con barra. Una vez más, obtenemos un
booleano de esto. Eso es cierto. Si lo sustituyo por alto por ej. dirá falso
porque no empieza con eso. Ahora note que esto
también es sensible a mayúsculas y minúsculas. Entonces si yo, si hago barra en minúscula, dirás falso porque
no se instala con eso. Y ahí está el extremo opuesto de esta ecuación que
es termina con. Ahora déjeme dirigir esto. Es falso porque Barcelona
no termina con barra, pero Barcelona sí termina con NA, por ejemplo así que eso será cierto. Entonces estas son dos
funciones incorporadas para cadenas. También se puede cambiar la
carcasa en una cuerda. Hay otros dos puntos
incorporados. Hay muchas
funciones incorporadas para cadenas, pero solo te estoy mostrando las
más comunes y útiles. Otro es Opera. Esto convertirá tu
cadena en mayúscula. Así que vamos a dibujar eso en
la misma variable. Opera será mayúscula y menor hará lo contrario,
que es minúscula. Entonces en este caso
sólo hay una letra mayúscula. Por lo que va a
convertir eso en minúscula, menor. Y por la misma convención, hay una función
llamada title. Esta voluntad, esto hará que tu cadena sea en
forma de título. Esto es muy útil para
cosas como FirstName es por ejemplo si quisiéramos decir John Smith, título que cada
letra mayúscula o cada primera
letra de la cadena. Es lo suficientemente inteligente como para
conocer los espacios. Por ejemplo, tendrá una letra mayúscula. Como mencioné, hay muchas funciones
incorporadas en cadenas, pero déjame
mostrarte un par más. Antes de que terminemos esto. Se pueden reemplazar
partes de una cuerda. Se puede decir cadena punto reemplazar. Esta función
tomará en dos argumentos. Lo que quieres reemplazar, digamos que queremos
reemplazar este apellido. Y la subcadena que
desea reemplazar este ancho. Digamos que
reemplazaremos esto con Williams, por ejemplo, reemplazaremos eso. Esto es muy útil para eliminar
cosas como espacios, por ejemplo, si quieres reemplazar un espacio, puedes escribir en un espacio. Simplemente elimina el espacio. Puedes reemplazarlo con
una cadena vacía, por ejemplo y simplemente
eliminaré el espacio. Lo último que
quiero mostrarte es cómo dividir las cuerdas. Así que
imaginemos que queremos dividir el nombre por cierto,
este espacio aquí. Vamos a usar esta función de división. Y como su primer argumento, tomará el personaje por el que
quieres dividir,
que es un espacio. Así que vamos a darle un espacio. Vamos a ejecutar el código. Entonces me sale una cadena,
lo siento, me sale una lista. Tengo que enumerar con
todo lo que había antes y después de ese espacio. Ahora bien, si tengo más espacios, digamos que aquí
escribo otra cosa. Ahora tenemos tres espacios, lo que significa que obtenemos
cuatro secciones. Ahora bien, si
no hubiera espacios en absoluto, no encontrará nada por
lo
que dividir. Así que simplemente
me dará la misma cadena, la cadena original,
pero como una lista. Y esto funcionará con cualquier personaje con el que
elijas dividirte. Digamos que tengo algunos periodos y quiero
dividirme usando esos. Ahora me llegan las mismas
cuatro secciones. Ahora bien, hay un argumento más
que toma esta función, y ese es el número de ocurrencias que
desea dividir. Entonces, por defecto, los
harán todos. Cada periodo
que encuentre en este caso será,
se dividirá. Pero te lo puedo pedir
simplemente haz el primero, por ejemplo
, dividirá el primero
y luego ignorará el resto. Puedo pedirle que sólo haga dos. Y ahí tienes. Los dos primeros se
dividirán y el último, nos quedaremos como está. Entonces esta fue solo una breve
introducción a las cuerdas. Hay mucho más
que puedes hacer con ellos. Realmente te animo a
experimentar y jugar con ellos. Y también te
recomiendo encarecidamente que leas la documentación
en línea para Python, hay un montón de cosas ahí dentro. Una vez más, esto fue solo
una simple introducción, pero te mostré lo que
creo que son algunas de las operaciones más comunes que puedes hacer con
cadenas que te
ayudarán con tu codificación del
día a día. Entonces ojalá estés
más familiarizado con las cuerdas y ojalá fuera
lo
suficientemente claro que
estarás mucho más cómodo
trabajando con ellas.
31. Buceo profundo - bucles: Bien, aprendamos más
sobre los bucles en Python. bucle básicamente significa hacer algo varias veces
una y otra vez. Hay dos tipos principales
de bucles en Python. Uno de ellos es un bucle for, otro es un bucle while. Así que vamos a pasar por
el bucle for. Primer grado for-loop. Es muy fácil. Utiliza
la palabra clave para ti. Diremos por algo
o por cada artículo. Entonces digamos para ítem en lista, vamos a crear una lista. Solo vamos a tener una
lista de números, 12.3, y luego tienes dos puntos. Y luego dentro de ese bucle
tienes esta sangría. Dentro de ese bucle, harás algún
tipo de operación. Así que ahora mismo, vamos a imprimir el artículo, por ejemplo, déjame ejecutar eso. Entonces como pueden ver,
estamos imprimiendo 123. Entonces, lo que está sucediendo es que
básicamente estamos diciendo que
cada elemento dentro de esa lista se
almacenará dentro de esta
variable llamada item. Ahora elegí esa variable, puedes llamarla de otra manera. Normalmente verás
algo como I. Así que para mí en la lista,
podemos imprimir I. Ahí tienes. Entonces lo que esto está haciendo es simplemente pasar por cada
uno de ellos y reemplazarlo con el valor de ese ítem dentro de la lista. Cambiemos esto un
poco y digamos 12.3. Ahora, mismo resultado. Entonces ahora digamos que queremos
imprimir los números 1-100. Entonces hay una función llamada range que básicamente
te da un rango de números. Digamos que queremos 100 números. Imprimamos I en rango 100. Vamos a imprimir algo
pasó, estamos recibiendo 99. Veamos por qué. De hecho, hagamos esta
llave un poco más pequeña. Digamos cinco, e.g Estamos obteniendo los números 0-4. Entonces eso se debe a que
la función range empieza a contar en cero. Podríamos arreglar esto. Podríamos decir, podríamos
pasar en una llave de verdad. Si usted, si acaba de
pasar un solo número, comenzará a contar en cero hasta el número anterior a ese, ese número que proporcionó. Pero si proporcionamos
1-5, en este caso, vamos a conseguir del uno al
cuatro porque este número, el segundo número,
no es, es exclusivo. Eso significa que tienes que
agregar uno para llegar
al número deseado
del rango que deseas. Entonces, si decimos que el rango uno seis en realidad
nos dará del uno al cinco, puede ser un
poco confuso, pero así es como funciona esta
función. Hay razones para
eso, claro, pero en realidad sólo que saber
que así es como funciona. Excelente. Entonces sucursal nos
dará de uno a cinco. Ahora bien, si quisieras ver
qué llaves realmente hacen, todo lo que está haciendo es crear
una lista de esos números, todavía
estaban simplemente
trabajando con una lista. Excelente. Entonces estamos almacenando este valor de cada uno de esos números
en esta variable I, pero no significa que
tengamos que usarlo. Digamos que queremos
imprimir hola amigo 100 veces. Simplemente podemos decir, dame un rango de 100 números. No me importa lo que sean
porque no los necesito. Solo necesito la lista para
poder recorrerla
100 veces e imprimir
esta cadena 100 veces. Hola, imprenta, ahí tienes. Pero también podríamos hacer
un poco de matemáticas. Podríamos decir Hola veces dos, por ejemplo, por lo que cada artículo en el rango
se multiplicará por dos. Nosotros imprimimos eso. Y ahí tienes. Entonces obtienes ese resultado.
Entonces el for-loop utilizará un objeto iterable, algo que
puede iterar a través de. Puede ser una lista de ledes generalmente, también
podría ser una tupla, por ejemplo, en lugar de una lista,
hagamos una tupla, que es como una lista, pero no
puedes modificarla. Por lo que lo imprimirá tres veces. O también podríamos
usar una cadena, por ejemplo podemos decir a, b, c, d. Podemos, podemos iterar
sobre una cadena. ¿Y qué va a pasar? Déjame imprimir r en este caso, es simplemente
pasará por cada uno de esos caracteres
en la cadena. Por la misma lógica, en realidad
podríamos imprimir cualquier cosa que queramos y
usar esa cadena
como la, como la cosa que nos
dará el número de bucles que vamos a
hacer con nuestro for-loop. Entonces así es como funciona el bucle
for. Ahora, el bucle while no
toma algo que puedas, un objeto sobre el que
pueda iterar, toma una condición. Entonces lo que esto está diciendo es, mientras que una condición es cierta, mientras que algo es verdad. Haz algo dentro
de ese bucle. Entonces en este caso podría imprimir
una vez más, hola amigo. Ahora bien, si hago eso, si ejecuto este código ahora mismo, entraremos en algo que
se llama bucle infinito. Eso es porque la verdad siempre
será verdad. Por lo que nunca detendrá algo que hay que tener en cuenta. Y hay que tener cuidado con
esto cuando estás
usando bucles while, es que tienes que
asegurarte de actualizar tu condición en algún momento. Entonces vamos, hagamos algo
que podamos actualizar. Digamos que queremos
empezar a contar números. Empezaremos el conteo en cero. Y vamos a decir, mientras que el conteo es menor, lo siento. Mientras cuenta, sí, mientras que el
conteo es menor a cinco, por ejemplo imprimir hola amigo. Ahora, como la serie ahora mismo este código
volverá a funcionar para siempre. Será otro bucle
infinito porque contar este caso
siempre será menos de cinco. A menos que actualice mi variable. Puedo decir contar es igual a
contar más uno. Básicamente estoy agregando
uno al conteo. Cada vez que terminemos, vamos a dar vueltas,
entramos en este bucle. Entonces lo que va a pasar aquí es que el bucle while
comprobará el conteo, es contar menos de cinco. Sí. Entonces haz estas operaciones aquí. Ahora después de imprimir hola amigo, vamos a agregar uno para contar. Eso hará que la cuenta
sea una, ¿verdad? Entonces vamos a volver a
entrar en el bucle, o el bucle while
volverá a comprobarlo, ¿es contar menos de cinco? Sí, imprimir hola amigo. Entonces agregaremos
uno más para contar, y así sucesivamente y así sucesivamente
hasta llegar a cinco. Y entonces el bucle while
comprobará su conteo menor a cinco. No. saldrá y continuará con
lo que sea que esté después del bucle. Así que déjame imprimir algo
después del bucle. Sólo para que este ejemplo sea
un poco más claro. Y simplemente ejecutemos este código. Permítanme despejar mi ventana
de salida aquí. Vamos a ejecutar este código. Como pueden ver,
no pasó nada. ¿Por qué es eso? Bueno, porque olvidé restablecer la cuenta porque el
conteo es de cinco. Entonces el rollup está pidiendo
es contar menos de cinco? No, en realidad
no hace nada. Y va directo a
imprimir el bucle while. Entonces, volvamos a poner el conteo a cero y ejecutemos el código nuevamente. Ahí vas. Entonces ahora estamos imprimiendo
hola amigo 12345 veces, y luego salimos. Así que vamos a comprobar esa variable de
conteo. Se puede ver que va desde 01234. La última vez que
se ejecute serán cinco, lo que significa que el
bucle no entra. Excelente. Y luego imprimimos el, lo que venga después del bucle. Por cierto, puedo,
puedo hacer esta línea de
código un poco más simple. Pero decir diciendo
más equivale a uno, esa es una forma taquigráfica
de decir simplemente agrega uno a esta variable y
funciona igual. Entonces esos son bucles while. Una vez más, trabajan
con esa condición. Así que hay que tener
cuidado de actualizar esa condición cada vez que estés dentro del bucle while. De lo contrario
, te encontrarás con el peligro de crear un bucle infinito, que básicamente
fallará tu aplicación. Porque después de un tiempo se
quedará sin memoria
o entrará en algo
llamado falla de segmentación, lo
que significa que está
tratando de acceder a la
memoria a la que no deberías
tener acceso, por lo que simplemente se estrellará. No es el fin del
mundo le pasa a todos te va
a pasar en algún momento. Sólo tienes que
reiniciar tu trabajo. Entonces, la forma de detener
el bucle while es nuevamente usando la condición. Pero hay otra manera de
detener el bucle while. Digamos que por alguna razón queremos
parar en la cuenta. Si la cuenta es igual a tres, queremos parar. Entonces podríamos simplemente decir si el conteo es
menor a cuatro, detente. Pero también podríamos decir si el
conteo equivale a tres break. Ahora vamos a ejecutar esto. Ahí vas. Entonces ahora
estamos parando a las tres. Entonces podrías estar pensando que eso significa que no
necesitamos la condición. Podríamos simplemente decir, Si bien es cierto. Ejecuta todo esto. Si cuenta es igual a 33, simplemente
rompemos. Ahora, mientras sigamos incrementando la
variable de conteo, esto funcionará. Ahora esto es raro. Este no es realmente
un bucle while agradable, pero solo lo estoy usando como
ejemplo para mostrarte. Técnicamente esto
debería correr para siempre. Pero el break, esta declaración break
básicamente saldrá del bucle. A ver eso en acción. Ahí vas. Imprimimos imprimimos
hola amigo tres veces. Eso es porque eliminé mi estado de cuenta de impresión para
la variable de conteo. Déjeme agregar eso en.
Entonces no queremos 0123 y simplemente rompemos. Entonces no lo hacemos, no
imprimimos tres después de eso. Ahora podemos usar la
misma sentencia break para detener el bucle ascendente. Así que déjame seguir adelante y bucle más de 100 números de nuevo
para I en el rango 100. Y vamos a imprimirlo. Yo dejo, déjeme hacerlo 20, para que no
tarde demasiado. Entonces vamos a imprimir a
partir de los números 0-19. Y luego
imprimiremos esta cadena. Se cambia eso para decir. Entonces, si quisiéramos detener el bucle
for en un número de resort, podemos decir si yo
es igual a diez,
por ejemplo, podemos romper. Ahí vas. Entonces una vez que lleguemos a
las nueve, al siguiente seré diez, y luego
salimos del bucle. Entonces esa es otra forma de poner
un tope completo al bucle. Otra
palabra clave muy útil es la clave, esta afirmación, y es
una declaración continua. Ahora bien esto va a funcionar
tanto para los bucles for como para los bucles while. Lo que hace la
sentencia continue
es que detendrá la
ejecución del código en ese punto y volverá
al bucle e irá a la
siguiente iteración del bucle. Entonces, qué
se supone que esta pendiente es hacer un sprint
cada número 0-19. Pero estamos poniendo esta comprobación si yo es la
iteración actual es diez, continúe, lo que significa que no
vamos a entrar en
esta declaración impresa. Entonces veamos cómo funciona eso. Ahí vamos. Vamos 01 234-567-8910,
y vamos a 11. Ahora, hagámoslo un
poco más obvio. Digamos que solo queremos
imprimir números que
sean divisibles por dos. Entonces digamos que si yo módulo
dos no es igual a cero, esto significa que el número no
es divisible por dos. Vamos a continuar
en la siguiente iteración, no imprimir ese número. Ahí vas. Entonces tenemos 0246810. Ves que básicamente
cada dos números se omita porque
no son divisibles por dos. Ahora bien, esto
equivale a decir si el número es
divisible por dos, si yo módulo dos, el resultado de eso es cero. Renta. De lo contrario no hago nada. Sí, se puede ver que
es el mismo resultado. Entonces es el mismo resultado. Solo estamos usando la sentencia
continue para revertir esa lógica. Y tal vez te estés preguntando
por qué, ¿por qué hacemos eso? Bueno, imagina que
solo quieres seguir escribiendo
algún código aquí. Entonces más código, y
luego más y más. Entonces esto te da
la posibilidad de no
tener que lidiar con
la sangría y simplemente poner una comprobación
rápida para detener la ejecución del código
en el momento que quieras. Y regresa y entra en
el siguiente punto de eso, cualquiera que sea la enfermedad en este
caso es una lista de números. Entonces ahí lo tienes. Para loops y while loops, son conceptos muy simples, solo haciendo algo una y
otra vez. Pero son extremadamente
útiles, extremadamente potentes, y los usarás
bastante en tu viaje de codificación.
32. Buceo profundo - Listas, tuples, conjuntos: Hablemos de listas. Las listas son una colección
de objetos. Y lo que quiero decir con objeto es
cualquier tipo de objeto Python. Puede ser una cadena, puede ser una función,
un entero, float. Incluso puede ser otra lista. Puedes tener listas anidadas una
dentro de la otra. Te voy a mostrar eso. Y también quería hablar otros
dos tipos que
son tuplas y sets. Entonces vamos a
hablar de estos tres. Todos estos tres
pueden verse como similares en que todos ellos almacenan una
colección de objetos. Y lo que puedes lograr
con tuplas y sets. También se puede
lograr con listas. En su mayor parte, simplemente
puedes usar listas. Y son realmente uno de los tipos de datos más utilizados en Python para tratar con
colecciones de objetos. Para que puedas ceñirte a
menos de lo que puedes lograr. Lo mismo que se puede lograr con un perno y juegos. Dicho esto, bajo el capó, se
comportan de
manera muy diferente y tienen casos de uso
muy singulares. Entonces déjame comenzar con listas y luego vamos a
meternos en tuplas y sets. Vamos a crear nuestra lista. Hay dos formas
de crear una lista. Voy a crear una
variable llamada mylist. Ahora bien, a propósito no estoy
llamando a mi lista de variables porque
list es el tipo de lista real en Python I, y no
quiero anular eso. Te voy a mostrar
eso en un segundo. Entonces voy a
llamar a esto mi lista. Y voy a
crear la lista. Entonces, para crear un alias, usas corchetes y luego separas tus
elementos por una coma. Por lo que de pronto
suministraron números. Medidor de Irlanda,
sprint que MyList. Ahí vas. Ahora, la otra forma de
crear una lista es
lanzando algo a una lista. la misma manera puedes hacerlo con cadenas o con un entero, por ejemplo hay un tipo de lista y
puedes poner algo
dentro de una lista. Entonces como ya sabrás, bajo el capó, las cadenas se
comportan como listas. Así que en realidad podemos lanzar
una cadena en una lista. Vamos a
almacenarlo en una variable llamada a. sólo
voy a traer eso. Lo que va a pasar es
que la cuerda se
romperá en sus partes, en su característica, y
el resultado será una lista. Entonces estas son dos formas
de crear una lista. Por eso estoy evitando
llamar a mi lista de variables. Porque si tuviera que hacer eso, simplemente estaría anulando esto y entonces
esencialmente estaría roto. Hay formas de arreglar
eso es por cierto, déjame mostrarte que
si tuviera que hacer esto, voy a recibir un
error porque ahora
básicamente anulé la funcionalidad de esta palabra clave de lista. Si eso alguna vez te sucede, puedes decir eliminar lista. Ellos van a enumerar. Y ahora deberían estar trabajando nuevo porque podemos
restablecer esa funcionalidad. Genial. Entonces, ¿qué
podemos hacer con las listas? Lo primero que podemos hacer
con las listas es un bucle sobre ellas o iterar
sobre sus miembros. Entonces podemos decir por mí en lista, imprima I, y ahí tienes. Podemos acceder a cada uno de
sus miembros simplemente,
usando un for-loop. Esto va a ser algo
muy común. Estarás haciendo, por
cierto, dando vueltas sobre listas. Pero también puedes comprobar si hay algo dentro de nuestra lista. Podemos decir, vamos a crear
una variable llamada result. Y digamos, vamos a comprobar
si el número dos está en la lista. Para alistarse. Podemos imprimir el resultado. Ahí vas. Entonces esta comprobación nos
dará un booleano, ya sea verdadero o falso. Podemos usar eso en una declaración
if también. Podemos decir si dos en mi lista. Simplemente imprima la lista. Ahora bien, si
comprobamos algo más, digamos el número diez, eso no está en la lista. No va a imprimir nada.
Entonces digamos, agreguemos una declaración else
y digamos print, no en lista. Genial. Ahora como mencioné, su lista puede tener cualquiera, cualquier tipo de objetos. Puedes tener números,
puedes tener una cuerda, puedes tener flotadores. Por ejemplo, incluso puedes tener una
lista dentro de esa lista. Así que permítanme crear otra lista
con simplemente dos números. De hecho, vamos
a recorrer esta lista. O en mi lista. Hola. Ahí vas. Entonces como puedes ver, tenemos
esta cadena e incluso
tenemos la lista dentro
de esa otra lista. Revisar si
hay algo dentro de tu lista te será muy útil. Pero también puedes obtener artículos
desde dentro de tu lista. Entonces déjame crear una lista más simple porque esta se puso
un poco desordenada. Déjame sumar tres cadenas, 1, s, y luego solo el número
tres, eso lo conforma. Entonces para que obtengamos un
ítem de una lista, lo
hacemos usando el índice, y eso es usar
los corchetes. Permítanme explicar
los índices de una manera más visual. Así que imagina que tienes
tu lista aquí. Digamos que tenemos una lista
con cuatro ítems en ella. Cada ítem tiene un índice, y todo está básicamente en
orden de izquierda a derecha, y comenzamos a contar a cero. Ahora bien, esto puede resultar
confuso a veces, pero el primer elemento
de la lista es el número de índice cero
es el elemento cero. El segundo será uno. El tercero será el de
permitirse uno serán tres. Ahora hay otra manera de obtener índices de
índice usando números
negativos. Entonces déjame deshacer esto. Déjenme poner estos índices
al fondo aquí. Podemos hacerlo en
el orden inverso. Podemos decir que el último de la lista será
índice menos uno. Entonces el segundo
último será menos dos. El tercero último menos
tres. Menos cuatro. No empezamos en cero
porque no podemos decir menos cero, claro. Entonces, si alguna vez quieres obtener el primer índice o el
primer ítem de la lista, simplemente
dices cero. Si quieres obtener el
último ítem de la lista, puedes saber
cuál es el último índice, cual sería el número
de ítems en la lista
en este caso es cuatro ítems menos uno porque
empezamos a contar a cero. Y ese será
su último índice, que será el último ítem. O también puedes
simplemente escribir menos uno sin saber
cuántos elementos hay en la lista. Así que volvamos a nuestro código para obtener los
ítems usando los índices. Utilizamos la notación de
corchetes. Y dentro de ese
corchete, ponemos el índice y queremos, así que si queremos nuestro elemento, déjame guardarlo en una variable. En realidad, déjame
imprimirlo directamente. Voy a imprimir el
primer elemento de la lista, que será la cadena 10. Si quiero el segundo elemento, será el primer
índice número uno por uno. El tercero
será el índice número dos. Ahora bien, si repaso los índices, digamos que quiero el cuarto, pero no hay
un cuarto en la lista, entonces voy a obtener
un error diciendo que el índice es rico en hierro. Ahora por la misma lógica
que acabo de
mostrarte, puedes obtener la última, que será menos
uno, es decir tres. Pasamos al segundo último será
menos dos, y así sucesivamente y así sucesivamente. Hay una, hay dos formas de conocer
los límites de tu, llegar al límite o
al final de tu lista. Este es uno, es por supuesto, obtener, obtener
solo el último ítem usando el índice menos uno. Pero también puedes comprobar
cuánto dura tu lista. Puedo decir que puedo usar la
función llamada Len L-E-N. Pasa mi lista a ella. Déjame imprimir esa longitud del resultado. Esto me va a dar tres, es
decir porque hay
tres ítems en la lista. Si agrego uno más, ahora habrá cuatro. Así que puedes usar esto para
obtener el último artículo también o simplemente para saber
cuántos artículos están esperando. Porque a veces
tienes una lista con cientos o miles de artículos y no siempre puedes hacer un
seguimiento de eso. Entonces esta es una forma de
consultar siempre eso, ese valor. Entonces lo que podemos hacer
ahora es decir mi lista. Para obtener el último artículo, puedo obtener la longitud menos uno porque estamos empezando
a contar en cero. Entonces esto nos dará cuatro. Ahí vas. También puedes obtener no solo
un elemento de la lista, Bora, un trozo de artículos de la lista que puedas,
se llama rebanar. Puedes cortar tu lista y obtener una parte de esa lista como copia para dejarme
mostrarte cómo funciona eso. Para estos, también usamos la notación de corchetes y también usamos índices
comenzando a contar en cero. Pero ahora porque
estamos usando un rango, usamos los dos puntos en dos puntos
dentro de corchetes. Entonces vamos a solicitar, vamos
a conseguir una copia o vamos a conseguir una lista de listas son los
tres primeros elementos de nuestra lista. Eso significa que queremos del índice
cero al índice número dos. Entonces, solicitemos
desde
el índice cero como primer índice y pasemos
al índice número dos. Ahora vamos a almacenar esto en
una variable llamada range. Ahora a propósito no estoy
llamando a esta llave variable porque hay
otra función llamada range y está
integrada en Python. Déjame mostrarte muy
rápido, pero eso sí. A esto se le llama llave inglesa. Y voy a solicitar
un rango de cinco números. Entonces me va a dar una lista
de cinco números desde cero hasta cuatro porque
empezamos a contar a cero. Entonces, si tuviera que llamar a
este rango variable, entonces lo estaría anulando. Y suele ser no, no
es un problema Si realmente no
necesito la función de rango en mi
código no es un problema, pero generalmente se recomienda
no anular. Las funciones
incorporadas son tipos incorporados en Python. Así que volvamos a nuestro rebanado. Déjame imprimir por naranja. Entonces, una vez más, estamos
solicitando desde el índice cero hasta el índice dos. Entonces deberíamos estar obteniendo estos tres elementos que lógicamente
eso tiene sentido, ¿verdad? Pero lo hicimos. Nos dieron los dos primeros. El motivo de eso
está en este rebanado, se incluirá
el primer índice que
proporcione. Pero el segundo índice que proporcione no será inclusivo, sino que será exclusivo, lo
que significa que obtendrá todo hasta el
ítem anterior a ese índice. Entonces, si queremos obtener el tercer
ítem que es el índice dos, tenemos que agregar uno a esto. Y ahora conseguimos lo que queremos. Esto puede ser un poco
confuso a veces. Y por supuesto, hay múltiples razones de por
qué esto funciona de esta manera. Pero con la práctica, esto
se convertirá en una segunda naturaleza para ti. Hay un elemento más
que podemos agregar al rebanado, y ese es el paso. Si agregamos otra columna
aquí entre corchetes, por defecto es paso será
uno y el paso es justo cómo devolver la copia de la lista que
estás solicitando. Por ejemplo, déjeme hacer esto. Entonces, por defecto, este paso es uno, lo que significa que
obtendremos cada elemento del rango donde se solicite. Si tuviera que hacer el paso dos, básicamente
obtendremos
cada segundo artículo. Entonces así también es como
puedes manejar ese rebanado. Algo que también quería
mostrarte es que no necesariamente tienes que proporcionar
índices por defecto. Si no lo sabes, si
no proporcionas un número de índice. El primer lugar aquí, este será el
primer índice. Y por defecto este
será el final de la lista. Entonces, si simplemente hiciera esto, obtendría una copia de la lista con
cada elemento en ella. Ahí vas. Ahora bien, si dijera que quiero todo excepto el primero, podría comenzar en el
índice uno y dejar este en el segundo vacío y simplemente obtener la luz
al final de la lista. Y lo contrario es lo mismo. Simplemente podemos escribir
tres y nos
levantaremos y subiremos hasta el
segundo índice de la lista. Bien, hablemos de una de
las propiedades clave de las listas. Algo que hace que una lista sea muy única es que
son inmutables. Ahora lo que significa mutable
es que
se pueden modificar en su lugar. Y hay algo
que hay que tener cuidado con esta
propiedad y tenerla en cuenta. Entonces déjame crear una lista vacía, esos corchetes,
esa es una lista vacía. Y déjame añadir
algo a esa lista. Para agregar algo a la lista, puedes hacer punto append. Agreguemos una cadena más simple. Yo puedo, digamos uno. Y vamos a imprimir este
resultado. Está impreso. Así que vamos a imprimir una lista. Antes agregamos un número, estamos antes agregamos un elemento, y luego después
agregamos el elemento. De lo que yo claro esto, volvemos a
ejecutar el código. Entonces, como pueden ver, primero
obtenemos una lista vacía. Y luego tenemos estas listas
con un solo elemento. Eso tiene sentido ¿verdad? Ahora. ¿Qué pasa si agrego otra variable y
le asigno a esa variable? Ahora, vamos a imprimir
a y B. A y B. Agreguemos algo a a, y volvamos a imprimir a y B. Entonces déjame, vamos a imprimir, vamos a darle una pequeña etiqueta. Entonces sabemos cuál
es cuál, digamos B, B. Y hagamos lo mismo aquí arriba. Una vez más, estoy
creando una lista vacía. Estoy asignando a ese entrelazado
una variable llamada a. y luego creo una
variable llamada B, y asigno a a B. Hasta ahora
tan bueno, correcto, entonces tanto a como B deberían ser
esencialmente listas vacías. Entonces imprimo esos centralistas. Déjame despejar mi ventana de salida. Entonces agrego algo
a una parada por un segundo y pienso en
lo que piensas que va a suceder cuando volvamos
a imprimir a y B. Ahora a tiene, tiene un
elemento en él. Pero, ¿qué está pasando a ser? Interesante. Entonces a y B al principio están vacíos, y luego tanto a como
B tienen un elemento. Ahora, dejemos esto
aún más claro. Ahora voy a anexar
algo para ser. Sólo voy a apuntar a eso, perdón, una cadena que dice dos. Vamos a imprimirlo otra vez. Entonces tanto a como B son iguales. Eso es raro porque
pensarías que a y B
serían independientes. Ahora bien, esto es algo que
debes considerar
con mucho cuidado cuando
estás usando listas porque estas pueden
atraparte desprevenido. Se llama puntero. Siempre hay un puntero en memoria a la lista
que creaste. Entonces a se convierte en un puntero de estanque. Y lo que sea que le hagas a a, aunque lo asignes a b, b es básicamente
no es una lista nueva. B está apuntando a. Entonces, lo que sea que le pase a a se
reflejará en B. Porque B simplemente está volviendo
al puntero original a. Eso es muy útil
porque le permite realizar un
seguimiento de muchos datos, modificar,
modificar sus datos en
cualquier lugar que desee, y aún tener la misma
lista de elementos en la memoria. Pero puede resultar confuso
si esperas que dos listas diferentes
funcionen con dos listas
diferentes. Ahora, para arreglarlo, si
querías dos listas diferentes, bueno, solo tienes que
crear dos listas vacías. Y entonces esto es lo
que esperarías. Ahora a y B se están
comportando por separado. Entonces es decir, eso es mutabilidad. Como viste, estamos
comenzando una con
una lista vacía y luego la estamos
modificando en su lugar. Entonces eso significa que podemos agregarle cosas
añadiéndole cosas. Y también significa que podemos
eliminar cosas de la lista. Volvamos a una sola lista
vacía llamada a. vamos, en realidad no, no lo
hagamos vacío. Vamos a darle algunas
cadenas dentro de él. Entonces ahora a tiene dos cuerdas. Podemos
quitarme cosas usando la función Remove. Vamos a quitar dos, y
luego vamos a imprimir. Bien. Ahí vas. Entonces ahora un solo tiene
11 cuerdas en ella. Ahora bien, si intentas eliminar algo que no está
en la lista, por ejemplo quitando esta cadena tres, te dará un error
porque dice que x, que es lo que
intentas eliminar, no
está en el símbolo de lista. Cheque. O una manera sencilla de evitar
este error es decir si tres en una lista,
luego eliminarlo, de
lo contrario, no hacer nada. Entonces digamos que queremos
eliminar uno en su lugar. Ahí vas. Ahora uno se ha ido. Quiero mostrarte
dos funciones más que son muy útiles en una lista. Así que volvamos a nuestra lista
a y vamos a escribir. Vamos a agregarle algunas cadenas
más. Eso es un cero. Agrega un nombre,
Digamos que John muestra. Puedes encontrar el
índice en el que eres un elemento que estás buscando es que hay una función
llamada index. Y pasas en el elemento
que intentas encontrar. ejemplo, si estamos
buscando la cadena cero, incluso si se llama cero, no
va a estar
en el índice cero, ¿verdad? Su índice número dos porque es el tercer
elemento de la lista. Pero si no
lo sabías, podrías consultarlo. Se podría decir, bien, índice cero. Dibujemos ese resultado en
una variable llamada result. E imprimir. Ahí vas. Número dos, si pregunto por John y obtenemos el
índice número tres. Ahora bien, si pido algo más, algo que no existe, obtenemos el mismo error porque algo no
está en la lista. En cuyo caso también
haríamos una declaración if para comprobar si algo está en un, luego hacer eso similar, como de la misma manera que lo
hemos hecho antes. Ahora bien, la última función que
quiero
mostrarles es similar a append. Una lista menor que este
caso, un punto anexar. Añadiremos un nuevo elemento a la
lista al final de la lista. Entonces si hago esto e imprimo una, ves que el nuevo artículo
estará al final. ¿Y si quiero
agregarlo al principio? Hay otra
función llamada Insertar. Y luego le das
el índice en el que
quieres insertar y luego los ítems. Por lo que estos insertarán el
nuevo ítem al inicio. Ahora bien, si quisieras
en el segundo lugar, digamos que lo queremos después de uno. Entonces podemos decir, bien, insertar en el índice número uno. Y ahora será uno y luego el nuevo ítem y luego
el resto de la lista. Así es como
puedes insertar cosas, lo que quieras en la lista. Y por el mismo método, otra
cosa que podría
mostrarte es que puedes eliminar cosas de la lista por índice. Entonces te mostré ahí,
quita la función remota, que eliminaría un
elemento usando su nombre. Así que en este caso vamos a eliminar
la cadena llamada uno. Pero si quieres
eliminar por índice, puedes usar la
función llamada pop. Por defecto, pop eliminará
el último elemento de la lista. Entonces en este caso, el último
elemento de la lista es john. Pub quitará a John. Hacemos pop dos veces, quitamos a John, y luego
eliminaremos cero. Entonces debemos quedarnos
con estos dos elementos. Ahí vas. Pero ahora también se puede pasar
en un argumento al pop, y ese será el índice. Digamos que quieres eliminar el primer elemento,
que es esta cadena. Eso dice una cosa,
el índice cero. Y ahora trabaja con eso. Entonces, si quieres eliminar
dos de los primeros elementos,
los dos primeros
elementos de la lista. Puedes hacer pop dos veces
con índice cero porque la primera vez que
eliminará el número uno, nos quedamos con esto, esta lista. Ahora el primer ítem
será escribir,
así que volvemos a hacer estallar cero y dos, es
decir ahora el primer
ítem se irá. Entonces ahora nos quedamos con
cero y John, encendido. Ahí vamos. Y claro, por la misma lógica, podrías simplemente eliminar, digamos que queríamos eliminar
esta cadena que es dos. Hacemos pop índice número uno, y nos quedamos con ese resultado. Bien, antes de concluir esto, quería
mostrarte algo que puede resultar confuso para algunas personas. Tener una lista dentro de una lista. Porque como mencioné,
cualquier cosa se puede poner dentro de una lista
incluyendo otra lista. Entonces déjame seguir adelante y hacer eso. Déjame decir que tenemos una lista con un elemento y luego tenemos otra lista con
otro elemento. Entonces, ¿qué está pasando aquí? Nuestra lista principal. Por lo que se puede ver a partir de
estos corchetes tiene dos elementos en él, y cada uno de esos
elementos es una lista. Entonces, ¿y si quiero
acceder a la primera lista? Muy sencillo. Simplemente digo, bien, dame el primer
ítem de la lista a. y ese ítem por supuesto, será la lista que contiene
esta cadena que dice uno. Ahora, ¿y si quiero obtener el primer artículo de
eso, de esa lista? Simplemente puedes seguir
la misma convención. Puedes obtener el primer
ítem de esa lista, y ahora ese será uno. Ahora bien, si tuviera que modificar, permítame modificar esta lista
que su lista inicial. Le he puesto tres elementos,
sólo tres números, 12.3. ¿Qué crees que
solo se va a imprimir? ¿Eso? Imprime uno. Ahora, ¿y si quisiera
obtener el número dos? Entonces me sale, estoy consiguiendo el, tengo que obtener la primera lista en la MainList, sin
pasar por el índice cero. Y luego una vez que consiga esa lista, quiero obtener el primer
ítem de esa lista, que, que será este número
dos. Y ahí tienes. Ahora, ¿y si quisiera llegar
a esta cadena de aquí? Bueno, necesito conseguir el
segundo ítem en la lista principal, que sería la lista a la
que estoy tratando de llegar. Entonces ese será el
índice número uno. Y de esa lista quiero
obtener el primer ítem, el único ítem, que sería
índice alto número cero. Ahora bien, esto funciona con
tantos niveles como quieras, y aquí es donde puede
llegar a ser un poco confuso. Ahora, imagina que esta lista
interna tiene otra lista dentro de ella con
otro elemento, solo un solo número. Ahora para llegar a eso, necesitamos obtener la primera lista y luego el tipo del
primer ítem en nuestra lista principal, y luego el primer ítem
en esa lista de pedidos. Esto es solo recursión, estado yendo nivel tras nivel. Entonces ahora sí obtenemos el primer
ítem de la lista principal, que será esta lista aquí. Después obtener el primer
ítem de esa lista, que estaremos ahí, el siguiente nivel de la lista. Y luego obtenemos el
primer ítem de eso, que es la cadena
que queremos, que es esta de aquí. Ahí vas. Yo
quería mostrarte esto porque
tiene sentido lógicamente. Pero ver este tipo de sintaxis puede resultar un
poco confuso. Y va a ser confuso hasta que tengas
más práctica con él. Así que no le tengas miedo. No, no se
desanime para probarlo. Sólo porque es un
poco críptico. Tiene perfecto sentido una vez
que lo hayas hecho algunas veces. Entonces esa es la lista. Ahora déjame mostrarte
muy rápido qué van a hacer las
tuplas y los sets. Similar a listas. Almacenan elementos
dentro de ellos. Entonces puedes hacer
cosas muy similares pero una tupla. La diferencia ahora es que
una tupla estará usando paréntesis en lugar
de corchetes. Entonces déjame imprimir, déjame sacar el primer
elemento de esta tupla. misma convención que con los
corchetes de la lista obtendrá el primer elemento. La principal diferencia es
que las tuplas no se pueden modificar y no pueden, no
tenemos el
mismo concepto que,
como punteros con top. Entonces, si tuviera que
asignar una variable b, el valor de a,
que es nuestra tupla. Básicamente serían
dos copias distintas de la misma tupla. Ahora como dije antes, las listas se pueden modificar en
su lugar, pero las tuplas no pueden. Entonces, si intentas agregar
algo a una tupla, básicamente te dará
un error si arreglaste mi error tipográfico, porque las tuplas
no tienen atributo, append. Así que usa una tupla siempre que sepas que no tienes
que modificar tu lista. De lo contrario, analista de
dualidad simplista. Ahora bien, el otro elemento que
quiero
mostrarles es algo que se llama conjunto. Ahora, puedes inicializar
un conjunto de esta manera. O con llaves. Esto puede resultar confuso porque los corchetes también son diccionarios
útiles. Por lo que te recomiendo
escribir en set. Ahora este es un conjunto vacío. Déjame imprimirlo. Ese es un conjunto vacío. Ahora haría
dice que puedes modificarlos, puedes agregar algo también. Dije que no hay
método llamado append. Si intento esto, te
va a dar una o. Hay otro
método llamado add. Puedes agregar algo a un conjunto. Ahí vas. Entonces agregué uno. Ahora la diferencia con los sets, lo que lo hace único es que cada valor dentro de
ellos tiene que ser único. Si tuviera una lista, hagamos una lista vacía. Permítanme agregar el mismo
valor dos veces en una lista. Vamos a imprimirlo. Entonces mi lista se llama B y
debería tener dos cadenas, digamos una en ellas. Ahí vas. Eso es válido en listas. Si traté de hacer lo mismo con
los sets, verás que solo
consigo 11 artículos en él. Y esto es muy útil para
mantener un conjunto único de elementos. Ahora puedes replicar este
ancho con listas, por ejemplo, digamos que estás
agregando algo a una lista. Digamos que tienes tu lista y
tienes algún valor que
estás tratando de agregar. Digamos que el valor es la cadena con estos
números dentro de ella. Puedes imitar lo que dije que
está haciendo diciendo si valor no está en la lista, que es la lista a,
entonces puedes agregarlo. Solo agregarás ese valor
si no está en la lista. Entonces ese es una especie de
comportamiento similar al que hacen los conjuntos. Pero otra cosa
que puedes hacer con un conjunto es que puedes darle una lista. Y estrechará
la lista hasta que
solo haya valores únicos en ella. Entonces déjame mostrarte eso. Digamos que le doy una lista. Y voy a decir, le
voy a dar una lista con
algunos valores duplicados, uno a dos. Ahí vas. Entonces, una vez que imprima, permítame deshacerme de
estas peticiones. Una vez que imprima eso dicho, acostarás mi árbol de
búsqueda, acostarás mi lista a solo
tener valores únicos. Entonces, una vez más, esto puede
ser muy útil
cuando tú, cuando no quieres
tener que repetir valores dentro de tu
colección de elementos. Y también puedes, en realidad, no, lo siento, no puedes. Algo más que
es único acerca conjuntos es que no se pueden obtener elementos de un conjunto de la misma manera que lo hace con listas y tuplas. Puede iterar a través de
un conjunto que sea válido. Puede verificar
cada elemento un conjunto usando un bucle for, pero no puede obtener elementos
en un conjunto usando índices. La razón de esto es que al
igual que los diccionarios, los
conjuntos no están ordenados. Hay una
razón técnica detrás esto que en realidad se
llama HashSets. Y usan punteros. Pero hay básicamente
muy eficientes. Puedes encontrar elementos en un conjunto mucho
más rápido que en una lista. Pero eso también significa
que no te quedas, no
haces un seguimiento
de los índices. Por lo que no se puede hacer
esto, este tipo de operaciones. Entonces, si necesitas acceder a
algo por un índice, entonces usa una lista. Si no lo haces. Pero quieres mantener una colección
realmente grande de elementos y quieres que todos
sean únicos, entonces puedes usar un
conjunto para ese propósito. Ahí lo tienes,
listas, tuplas y sets. Estos son tipos de datos muy
potentes que te ayudarán
mucho a la hora de codificar. Y ojalá pudiera ayudarte
a
familiarizarte más con ellos.
33. Buceo profundo - diccionarios: Hablemos de diccionarios
Python. Ahora se puede pensar
en un diccionario, algún tipo de como un
mapeo entre dos cosas, entre una clave y un valor. Tan similar a un
diccionario real donde tienes premio y tienes una
definición para esa palabra. La clave sería la sala, la definición sería
el valor de esa clave. O como una guía telefónica, por ejemplo, digamos que tenemos un nombre. Tenemos a Rachel y tenemos el número de teléfono de
Rachel. Tenemos filas, tenemos rosas. Número de teléfono, por ejemplo
Rachel sería la clave, y Ross sería las
filas serían otra clave y los números de teléfono o los valores para cada
una de esas claves. Así que vamos a traducir esto a
un diccionario Python real. La sintaxis para crear diccionarios
es usar llaves. Entonces déjame traducir esto. Rachel Rose es
números de teléfono en un diccionario. Entonces hay que usar las
llaves o llaves. Y luego dentro de eso
tendrás cada ítem en un diccionario, cual será un par
de clave y un valor. Y eso está separado
por dos puntos. Tienes un valor clave de dos puntos. Este será el primer
ítem del diccionario. Y luego separas cada artículo, artículo por una coma. Vamos. Y si quisiéramos agregar un número de teléfono más donde no tengamos que
hacerlo en tus líneas. Por cierto, todos estos pueden ser en una sola línea. Entonces
hagámoslo de esa manera. Agreguemos un nuevo
número de teléfono y un comentario triste, Mónica, y luego un número de teléfono
más. Entonces estos serían un diccionario. Y vamos, vamos a almacenarlo en
una variable llamada teléfonos. Yo, déjame imprimirlo, ver cómo se ve eso. Se ve exactamente
igual que lo que acabamos de escribir. Entonces, ¿qué tienen
de especial los diccionarios? Lo primero es
que como dijimos, podemos tener un mapeo de ellos, oferta de claves y valores. Y puedes acceder a
esas claves y valores. Para que puedas acceder a esos valores simplemente accediendo a la clave. Entonces digamos que queremos el número de teléfono de
Rachel. Digamos que Rich y
queremos su número de teléfono. Se puede acceder al valor de un número de teléfono usando la clave. Entonces para hacer eso, usamos la notación de
corchetes, similar a cómo accedemos a
los índices en la lista. Pero en lugar de un número, en lugar de un índice,
proporcionamos una clave. Así que vamos a proporcionar a Rachel, por ejemplo déjame llamar a este número de
Rachel, por ejemplo vamos a imprimir ese número. Y ahí tienes. Así es como
respondemos al número de teléfono. Podemos hacer
lo mismo con Ross. Y esto distingue entre mayúsculas y minúsculas.
Por cierto. Este es el número de teléfono falso de Ross. Si no sigo la carcasa, si esto es minúscula por ejemplo voy a recibir un error
diciendo que no hay clave, clave llamada Ross en
ese diccionario. Una vez más, debido a
la sensibilidad de las minúsculas, así es como lees
los valores de una clave. ¿Cómo escribimos una nueva clave? Digamos que queremos agregar un
nuevo número de teléfono a esto. Digamos que queremos,
vamos a imprimir el
diccionario ahora mismo. Primero, permítanme despejar
mi ventana de salida. Agreguemos un nuevo número de teléfono. Entonces tendremos teléfonos
usaremos la misma sintaxis,
la sintaxis de corchetes
que usamos para obtener valores. Pero ahora puedes
escribir tu nueva clave. Entonces agregaremos a Joey. Ahora, si hacemos esto ahora mismo, intentaremos obtener un
valor de la clave join. Pero si haces iguales y luego un nuevo
número de teléfono en este caso, entonces vamos a crear una
nueva entrada en el diccionario. Van a ser crear una
nueva clave y un nuevo valor. Entonces agreguemos alegría. Entonces volvamos a imprimir el
diccionario. Esto es antes de que agregáramos a Joey, y luego esto es
después de que añadimos a Joe. Ahora, Joe está aquí, Joe está ahora al final. Estás notando
que el diccionario no
está necesariamente en el
orden en que lo estamos creando. Por ejemplo, añadimos a
Rachel en el, al principio, pero apareciendo en segundo lugar. ¿Por qué es eso? La razón
es porque los diccionarios se crean de una manera que los
hace muy eficientes. No necesitan hacer un seguimiento
del orden porque hay un mapeo y
debajo del capó, esto se llama puntero. Las llaves. Están apuntando directamente
al valor que tienen. Y hay una, hay un poco de explicación técnica a la que
no necesitamos entrar ahora mismo. Pero lo que significa es
que no necesitas el orden de las claves, pero no necesitas
mantener las claves en orden porque
simplemente puedes acceder al
valor por la clave, sin importar en qué parte del
diccionario pueda estar esa clave. Entonces con eso dicho, hay tres
propiedades principales que
tienen los diccionarios y eso las hace
muy únicas en Python. Una de ellas es, como acabo de decir, están desordenadas, es decir,
las llaves no están en orden. El otro es que las
llaves dicen no en orden. La otra es que
las claves son únicas. Veamos un ejemplo de esto. Agreguemos de nuevo a Joey. En realidad, vamos, intentemos
agregar una nueva, una nueva Rachel. Yo sólo voy a teclear
0000 para que sea obvio. Ahora vamos a ejecutar esta
pieza de código. Como me pueden ver, no
tenemos que hacerlo. Rachel,
sólo hay una Rachel. Lo que hicimos fue anular eso. Y en este caso, esto
se convirtió en un entero. Entonces es solo un
solo cero porque ceros
múltiples no tienen sentido. Y entonces ese es un número real. Pero si convierto esto
en una cadena, entonces veremos todos
los ceros que agregamos. Entonces como puedes ver, lo que
hicimos fue sobrescribir a Rachel, no
creamos
una nueva clave de Rachel. Entonces esa es la segunda
propiedad importante del diccionario. Las claves son únicas y la tercera propiedad importante es que los diccionarios son mutables, decir que podemos, podemos modificarlos a medida que avanzamos. Como hemos visto ahora mismo, creamos un diccionario
y luego estamos modificando el diccionario
original. Eso es lo que
los hace mutables que puedes cambiar, puedes agregar, puedes eliminar claves y
valores en un diccionario. Ahora, algo más a lo que prestar atención cuando
algo es mutable. Si has visto cómo
las listas son mutables y siempre estás manteniendo un puntero a ese leads
que estás modificando. Vamos, déjame mostrarte
otro ejemplo de eso. Voy a crear un diccionario
vacío llamado a, lo
almacenaré en una variable a. y voy a crear
una nueva variable B. Voy a decir que B es igual a a. entonces a es un diccionario vacío. Y un diccionario vacío simplemente estos dos corchetes ondulados. O también puede escribir, dictar, escribir marcado y abrir
y cerrar paréntesis. Esto
te va a estar dando el mismo resultado. Entonces a es un
diccionario vacío, b es igual a a. Ahora agreguemos un valor, una clave y un valor a a. Digamos que a es igual a uno. Y vamos a imprimir una,
y vamos a imprimir B. Entonces, ¿qué opinas? Tómate un momento para tratar pensar en lo que
va a pasar. Pero agregando una clave y un
valor a un o OneNote, técnicamente no estamos
haciendo nada para estar bien. Entonces vamos, vamos a ejecutar este
código e imprimir el resultado. Ahora como puede ver, tanto a
como B son exactamente iguales. Ese es otro aspecto
importante de la mutabilidad de los
diccionarios es que se crean una vez y siempre
estás haciendo un seguimiento
del mismo diccionario. Así que incluso si asignamos esto
a múltiples variables, incluso si asigno, crear una variable llamada c
y asignar V2 que. Y luego
imprimo c. Todos siguen siendo
el mismo diccionario, aunque tengas
tres variables, tienen el mismo diccionario. e.g. Si ahora tomo C y
le agrego una nueva clave a eso, y digo C. Así que tres, desde la tercera letra
del alfabeto, permítanme imprimir esto de nuevo. Como puede ver, todos a, B y C obtuvieron la misma actualización porque todos están rastreando
el mismo diccionario. Si quieres evitar esto, si quieres que sean diccionarios
independientes, pues
pues simplemente
inicializas o creas diccionario para cada
una de esas variables. Ahí vas. Se puede ver ahora a tiene una clave única, B está vacía, y luego ver, porque
agregamos una clave a C tiene sus propios valores. Entonces esas son las
tres propiedades principales que debes recordar
sobre los diccionarios. Una vez más, las llaves no
están en orden. Eso es porque se obtienen valores de los nombres de las
claves se limpian, no del orden
del diccionario. Las claves son únicas
, así es como puedes
obtener un valor de una clave. Si tienes varias claves y realmente no
podrías saber qué valor obtener
de las claves, ¿verdad? Así que tenemos que mantenerlos únicos. Y mutable significa que
puedes cambiar el
diccionario sobre la marcha. Para eso, por cada diccionario
único, solo
hay una copia que
siempre se está modificando, aunque la asignes
a otras variables. Bien, entonces ahora déjame mostrarte algunas operaciones comunes
sobre diccionarios. Déjame crear un nuevo
diccionario con algunos. Claves y valores en él. Vamos a tener a, uno, b ,
dos y c. El valor
de c será tres. Excelente. Para que puedas comprobar si algo
está en un diccionario. la misma manera podemos comprobar si
algunos de los analistas de noticias, podemos preguntar si por ejemplo a. Diccionario a, en realidad, déjame cambiar el nombre
de este diccionario. Vamos a llamarlo, llamémoslo
simplemente dicción, diccionario. Diccionario. Si a está en diccionario, imprima. Sí. De lo contrario, de lo contrario imprimir. No. Vamos. Entonces a está en
diccionarios y obtenemos que sí. Digamos f. si no, no es un diccionario,
entonces diremos No. Excelente. Entonces, ¿qué
pasa si intentas obtener el valor de una clave
que no existe? Ya vimos eso, digamos f que sabemos que no
está en el diccionario. Intentemos imprimir
ese valor directamente. Nos va a dar un error. Y ese error es un error clave porque F no está
en el diccionario. Hay dos formas de
verificar si hay una clave en el diccionario
y si es así, obtener el valor de ella. Una manera es si nosotros, como ya lo hicimos aquí, podemos decir si f está
en el diccionario, luego imprimimos el valor de f Así que déjame deshacerme
de la declaración else. Por lo que sólo intentaremos acceder
al valor si f está
en el diccionario. Ahora podemos hacer eso con un que sabemos es que ya
en el diccionario. Y luego obtenemos el valor. Ahora hay otra
manera de obtener un valor. Y a prueba de balas
es un poco. Los diccionarios tienen una
función llamada get. Ahora get es lo mismo, hace esencialmente lo
mismo que la notación de corchetes. Puedo decir, vamos a almacenar esto
en una variable llamada value. Puedo obtener el valor de la clave. Y puedo imprimirlo, que es uno, como ya
sabemos. Pero si la clave no existe, get te dará
un valor predeterminado. Entonces en este caso
, como f no existe, obtendremos un
valor predeterminado de Ninguno. Pero también se puede proporcionar
un valor predeterminado para eso. Entonces esto es
como un interruptor y digamos, si la clave existe, dame el valor de la clave, lo contrario dame
otro, otro valor. En este caso podría decir que los valores
predeterminados van a ser una cadena con
un solo guión, por ejemplo y ahí vas. Entonces como f no está
en el diccionario, vamos a obtener
el valor predeterminado, que es el guión. Ahora estamos haciendo que
este se imprima aquí debido a la
declaración if aquí arriba. Y ahí tienes,
tenemos el guión. Entonces solo para aclarar esto al doble. Esto es similar a decir, digamos que tenemos una clave y
queremos que los niños sean f. puede decir, si key puede diccionario imprimir el valor de esa clave de nuestro diccionario. Ahora, la clave será esta
variable que creamos. De lo contrario, imprima
un valor predeterminado, que en este caso, vamos a crear realmente
eso como una variable, el valor predeterminado
será un guión. Entonces, si las claves en el diccionario imprimen el
valor de esa clave, lo contrario, imprime el
valor predeterminado. Vamos a ejecutar esto. Obtendremos un valor predeterminado. Esta función dot get hace exactamente lo mismo que
estas pocas líneas de lógica. Rejilla. Entonces así es como podemos
acceder a valores desde claves y cómo podemos escribir
nuevas claves en un diccionario. Ahora, ¿cómo eliminamos
las claves de un diccionario? Simplifiquemos este
diccionario aquí. Solo dejemos la llave a. Y déjame, solo, por el bien de ejemplo, voy a añadir una nueva
clave que será B. Ahora otra vez, misma,
misma, misma sintaxis. Pero ahora hacemos iguales a. Por lo que ahora la clave B será igual a. Ahora déjame quitar una
del diccionario. Para eliminar una tecla, hay una función llamada pop. Pop eliminará una, tomará el nombre de una clave, y la eliminaremos
del diccionario. Así que vamos a imprimir este diccionario. Ahora recuerda inicializamos el diccionario con una
sola clave, eso es a. agregamos b y luego hacemos pop, él, quitará a de eso. Entonces ahora nuestro nuevo
diccionario está siendo. Ahora hay un poco
de efecto secundario para bombear. Es decir que obtienes el valor de la clave que
eliminas, que eliminaste. Entonces si guardo el resultado
de pop en esta variable, voy a obtener el valor de a, que es lo que eliminamos
del diccionario. Eso es el valor uno. Ahora bien, hay algo
a tener en cuenta es que si le das al pop una clave
que no existe, por ejemplo f. De nuevo, pop te va a dar un error de clave
porque la clave no existe. Entonces cuando estés usando
Pub es bueno para verificar si tu clave está en
el diccionario, entonces puedes eliminarla. Pero el pop tiene otra
funcionalidad que permite no tener que
comprobar si una clave está
en el diccionario. Y eso es aportando
un argumento separado. Segundo argumento, perdón. Una vez más, si
ejecutamos esto por sí mismo, obtenemos un error porque F no
está en el diccionario. Pero si proporcionamos
un segundo argumento, la misma manera que GET
tiene un valor predeterminado, pub obtendrá un
valor predeterminado de cuatro. Entonces si no tecleo por ejemplo I. Imprimir eliminado,
imprimo el, la variable remota. No se va a quejar
y en realidad me
va a dar
ese valor por defecto. Estamos tratando de proporcionarlo. Así que no hay ninguna clave llamada f. Así que por defecto es
ese valor predeterminado. Si cambio esto
a otro guión, por ejemplo igual que antes. Bueno, habrá, como
f no existe, ese será el valor por defecto. Pero si estamos tratando de hacer pop a, vamos a obtener
el valor de a porque realmente existe. Eso no funcionó es porque no he
corrido todo el código. Lo siento, necesito
ejecutar todo el código. Ahí vas. Así que ahora eliminado el per
sprint es el valor de a. segunda impresión, el resultado en
diccionario después de hacer estallar a. Pero una vez más, ahora
podemos ejecutar todo el código. Si elimino F, el diccionario
resultante todavía tiene tanto a como
luego la Beta que agregamos. Y luego imprimimos el valor predeterminado de la
clave que no pudimos eliminar. Lo último que quiero
mostrarte sobre diccionarios es cómo
obtienes una lista de claves y valores. Entonces déjame borrar el resto de este código y agregar algunas claves
más a mi diccionario. El mismo ejemplo otra vez. Entonces digamos que quiero
saber qué claves hay en
el diccionario. Imagina que este diccionario tiene miles de artículos dentro de él. Los diccionarios tienen una
función llamada keys. Y lo que esto
hará es darte una lista de los valores
de esas claves. Ahora, perdón, te
dará una lista de las claves en el diccionario. Entonces, si almacenamos esto en una
variable y luego imprimimos, déjame borrar mi ventana de salida. Ahí vas. Entonces obtienes una lista de las claves
dentro de ese diccionario. Para que puedas usar esa lista para acceder a
valores de esa. O si quieres una lista simple de valores
sin las claves en ellos, hay una función
llamada valores. Y simplemente te voy a dar una lista de los valores
en el diccionario. Ahora, recuerda que los
diccionarios no tienen orden. Entonces el orden de estos valores, así
como el
orden de las claves, no
hará, no
seguirá nada de lo
que se pueda esperar. En este caso,
imprimimos los valores, pero se puede ver que no
están en el orden en
que los trajimos, lo cual está bien. Esto es solo una lista de valores, pero normalmente queremos
consultar valores desde una clave, no directamente desde aquí. Y hay una
función más que quiero mostrarles que
se llama items, pero que las islas harán
es darte una lista que tenga los pares de claves y valores en forma de tuplas. Así que permítanme guardar eso
en una variable llamada items e imprimirla. Entonces tienes una llave, lo siento, tienes una lista. Y dentro de esa lista tienes estos pares, que son tuplas. Y tienes la clave y
el valor para esa clave. Clave y valor, clave y valor. Así que de esta
manera podrías recorrer todas
las claves del diccionario. Claves de diccionario. Por lo que estas serán cuatro claves
en las claves de punto del diccionario. E imprimiría todas las
claves del diccionario. Ahora bien, si hacemos unos valores
y decimos por valor,
en valores, se ordenan el valor
no el estilo de volumen como el mío. ¿Cuál es mi error? ¿Para valores de volumen? Entonces recorremos esos valores. Ahora también puedes hacer lo
mismo con los artículos. Pero ahora recuerda que los artículos. Si yo, si simplemente imprimo elementos, recuerda esos elementos cada uno, cada elemento de la lista, la clave y el valor. Puedes desempacar eso. Se llama desempacar. Cuando tienes múltiples
valores en una tupla o una lista, puedes desempaquetarlos
directamente en el bucle for. Se puede decir para el valor clave de coma. Así que básicamente para cada
elemento de la lista. En realidad déjame, déjame
mostrarte esto primero. Imprimimos cada
elemento de la lista. Entonces como me viste quitar esto. Como puedes ver, cada artículo es,
es un par, un par
de una llave y un valor. Entonces podemos decir, podemos
desempaquetarlos para el valor clave de coma. En cada ítem del diccionario. De hecho, podemos
imprimirlo por separado. Valor de punto G. Entonces tenemos una y tenemos una. Veremos donde tres. O podemos juntarlos
en el comunicado impreso. Así. Y mientras obtenemos el mismo resultado porque
estamos imprimiendo una tupla. Pero déjame hacer esto en forma
de cadena, valor
d y c que podemos
usar una función de formato de punto. Y debería quedar un
poco más claro. Entonces claves a y el
valor de a es uno. Entonces, una vez más, es usar
la función del hierro y desempacar cada uno de esos
artículos como clave y valor. Eso son los diccionarios. Creo que te mostré algunas de las principales cosas que
puedes hacer con ellos. Pero claro que hay mucho
más en ellos que eso. Son una
herramienta increíble para el manejo de datos. Te animo mucho a que juegues un
poco más con ellos. Pero con eso dicho, deberías tener el conocimiento suficiente ahora que puedes usarlos manera
más eficiente en
tu codificación del día a día.
34. Proyecto final - Biblioteca de poste: introducción: En este proyecto, vamos a estar creando una biblioteca de correos. Para esta post biblioteca, que se ve así. Ya hemos escrito
la funcionalidad que vamos a necesitar que se hizo desde el proyecto
anterior. Vas a
aprender a crear una herramienta completamente nueva que
aproveche el código
escrito ya sea por ti o por otra persona
para otro proyecto. Lo principal que tenemos que
construir sobre ese otro código es la capacidad de
guardar poses en archivos. Entonces vas a estar
aprendiendo a lidiar con los archivos. La segunda parte del trabajo va a ser la creación de la interfaz de usuario. La interfaz de usuario es un
poco más compleja. Tiene una sección plegable. Estaremos tomando entrada
del usuario y hay
una lista de poses pobladas
a partir de archivos en disco. Ahora el beneficio
de guardar el proceso dos archivos es que ahora
podemos compartirlos a través de mis sesiones o incluso con otras personas en
diferentes computadoras. Entonces déjame mostrarte
cómo funciona esta herramienta. Ya he guardado
algunas publicaciones por adelantado. Podemos aplicarlos a un solo personaje como ya
hemos visto antes, o a múltiples personajes. Tengo puestos sentados. Y también podemos guardar
poses de la escena. Entonces digamos que nosotros, digamos que queremos
guardar una pose para este utilero. Pongamos el sombrero en el suelo. Vamos a
nombrarlo, tenía en tierra. Guarde la pose. Y cuando guardo esta pose, ves que
apareció aquí enseguida. Y esto se guarda en un archivo. Entonces, una vez más, se
puede compartir entre sesiones o entre computadoras
con otras personas. Entonces puedo seguir adelante
y puedo aplicar esa pose a estos personajes. Entonces esta es una herramienta que
vamos a estar creando.
35. Crear el paquete de Python: Lo primero que
vamos a hacer es crear la estructura de archivos para nuestro código. Así que volvamos a PyCharm y tenemos
aquí los otros módulos de nuestros otros proyectos. Ahora voy a
crear uno nuevo, pero voy a crear un
directorio porque esto va necesitar más partes que
los otros proyectos. Entonces voy a hacer clic derecho
en la raíz de nuestro proyecto, y voy a hacer clic en Nuevo. Voy a crear un
nuevo paquete Python. Entonces le damos un nombre. Voy a llamarlo
posar subrayado biblioteca. Ahora PyCharm creó
una nueva carpeta o un nuevo directorio con
un archivo dentro de ella. Voy a volver a
este expediente en un poquito. Pero si miras la
carpeta en sí, simplemente, este es un directorio de scripts para tu Maya en tus
documentos carpeta Maya. Y dentro de eso,
está este directorio con un solo archivo
llamado guión bajo,
guión bajo init, guión bajo,
guión bajo punto PY. Después voy a
crear otro archivo, sólo un único archivo Python. Ahí estábamos
vamos a estructurar este código o este proyecto
va a mantener
la funcionalidad
separada de la interfaz de usuario. Esta es generalmente
una buena práctica. Algo que hicimos antes
para la transferencia posterior
es crear la interfaz de usuario directamente en
el módulo post transfer, que contiene una funcionalidad. Elegí hacerlo
porque había
una primera herramienta que usamos
donde creamos una interfaz de usuario. Y también fue un
poco más sencillo de, pero por lo general se recomienda mantener tu interfaz de usuario separada
de tu funcionalidad. Eso te da la posibilidad de
reutilizar la funcionalidad, que es lo que vamos
a hacer con este proyecto, y mantener tu interfaz de usuario está
completamente separada. Eso también
te da la posibilidad de
crear múltiples UI que aprovechen
la misma funcionalidad
desde un solo lugar. Entonces voy a
crear un archivo Python. Voy a llamarlo core. Estoy llamando,
lo estoy llamando core porque este será el core
funcional de la biblioteca. Y voy a crear
otro archivo llamado UI va. Nuestro código UI vivirá aquí. Ahora, volvamos. Agreguemos algo
al módulo core. Simplemente agreguemos una
función de prueba para que
podamos, podamos probarla y
asegurarnos de que esté funcionando. Voy a escribir hola
core four, pose library. Genial. Ahora bien, ¿qué está haciendo un archivo? Si lo miramos, en
realidad está completamente vacío. Es simplemente un archivo de texto que se llama doble
subrayado init, doble guión bajo punto p-y. Si no tuviera este archivo, Maya nos daría
un error o Python
nos daría un error porque este es el archivo que le dice
a Python que trate el directorio como un módulo. Entonces déjame borrar ese archivo. Se va a reflejar
aquí en PyCharm. Intentemos importar
esta función. Déjame regresar a Maya. Vamos a abrir el editor de guiones. A esto le llamamos biblioteca de correos. Entonces vamos a decir desde la biblioteca
pose, import core. Y sabemos que core tiene una función llamada hola que simplemente
imprimirá nuestro mensaje de hola. Entonces déjame hacer esto
un poco más grande. Vamos a ejecutar el código. Se puede ver Python está diciendo que ningún módulo
llamado pose library. Ahora, ¿qué pasa si agregamos
ese archivo init por kin? Vamos, vamos a crear
un nuevo archivo Python. No voy a crear
un paquete Python. Que por cierto, cuando
dices paquete Python, pycharm parecerá simplemente crear un directorio con ese archivo init. Pero en este caso voy
a crear un archivo Python. Sólo voy a
llamarlo guión bajo,
subrayado init, subrayado,
guión bajo punto p-y. Intentemos correr
esto una vez más. Ahí vas. Ahora nuestro código está funcionando
y estamos recibiendo ese mensaje de nuestra función. Entonces eso es lo importante
de los archivos inuit. No tienes que poner
nada dentro de ellos. Puedes si quieres. Pero tienen que estar ahí para que el directorio sea
tratado como un módulo. Si tienes submódulos, va a ser el mismo caso. Vamos a llamarlo, llamemos a este nuevo módulo.
Este es un ejemplo. Ves que hay un
archivo de inicio dentro de eso. Y luego puedes agregar más archivos
Python en tu nuevo módulo. Entonces es una vez más, es solo decirle a Python
que trate ese directorio como un
módulo para que
puedan, para que pueda ser importado. Genial, déjame borrar esto. Y ahí tienes. Así que tenemos la estructura que
vamos a usar para crear nuestros dos núcleos tendrá
toda la funcionalidad,
y la interfaz de usuario tendrá todos los elementos
de la interfaz de usuario.
36. Trabajar con archivos: Como mencioné antes, vamos a estar
reutilizando la mayor parte
del código del proyecto
anterior. Pero una cosa clave que
tenemos que agregarle es la capacidad de guardar archivos. Entonces aprendamos
a trabajar con archivos. Antes de empezar a guardar poses. He creado un directorio aquí. Esto es justo debajo de mi unidad C. Hay una carpeta de demostración de Python
y luego una carpeta de biblioteca de publicaciones. Voy a estar
guardando mi archivo aquí. Empecemos con un simple archivo de
texto para que podamos aprender a crear
archivos desde cero. Voy a llamar, voy a decir mi camino a
mi directorio como su camino. Voy a añadir una r aquí. No creo que se vaya a escapar a ninguno de estos
personajes. Saber. Pero si tuvieras por ejemplo
una biblioteca de nariz similar a N, tu personaje se escapará. Como se puede ver, el
guión una diagonal hacia atrás, n es el carácter de retorno. Te dará una nueva línea. Así que en realidad está
dividiendo el camino en dos líneas. Entonces si por alguna razón
tu camino en tu, en tu directorio tiene un carácter especial llamado
el carácter de escape. Y otro de ellos
sería T e.g biblioteca. Eso te daría una ficha. O un a te dará
un carácter extra. Entonces una forma de evitar eso es escapar de esos personajes de
escape. Por ejemplo, volviendo a la biblioteca de nariz, que de nuevo a la
diagonal reversa n es una nueva línea. Si agrego una nueva diagonal revertida, se escapará de eso. O puedes hacer un slash hacia adelante. Y eso también
evitará el tema. Sin embargo, cuando su copia
pega partes desde Windows, generalmente
obtendrá esa diagonal reversa. Así que reemplazar todo
dos barras hacia adelante puede ser un poco
tedioso a veces. Entonces una manera fácil de hacerlo es simplemente poner una r
delante de esta cadena. Y esto lo convertirá en
lo que se llama una cadena cruda. Cadena de flecha básicamente
significa ignorar cualquier carácter de escape.
Estos fines. Ahora la R también se usa para
algo llamado rechazos, que es un lenguaje de expresión que puedes usar
para hacer análisis de cadenas. Pero aquí no íbamos
a tocar eso. Simplemente, es
bueno saber que R en realidad está destinado a rechazos. Pero podemos usarlo para
evitar problemas como,
como tener eso, esa nueva línea son esos personajes de escape. Bien, entonces déjame
volver a poner esto en mi camino real. Y ahora necesito un nombre de archivo. nombre de archivo, vamos a
llamarlo texto punto TXT. Y esto tiene que
ser una cuerda, ¿verdad? Así que en realidad podemos, unámoslo juntos. Te voy a mostrar algo. Voy a usar el módulo OS. Así que voy a escribir import OS. Y voy a decir que la
ruta completa es igual a la ruta de punto del sistema operativo. Así que siempre significa sistema
operativo. Entonces esta es una biblioteca que se
ocupa de las acciones del sistema operativo. Hay un módulo de ruta en él que le ayuda con las rutas de los archivos. Y hay una función de unión que te permite
unir múltiples rutas. Entonces, si usted, si tiene
varios directorios y quiere
unirlos, simplemente
podríamos hacer esto, por ejemplo, digamos que pruebe ese dx dy. O también podríamos
decir tu pérdida de camino. Por ejemplo, nos falta la
diagonal y más el nombre de archivo. Pero siempre consiguieron
Path Join nos dará esta diagonal hacia atrás automáticamente y nos aseguraremos de que
la ruta sea válida. Y si hay algún personaje de
escape, él se escapará de ellos por nosotros
también para que no tengamos que preocuparnos de que nada funky
suceda con el camino. Voy a decir su
camino coma, nombre de archivo. Únete a esos dos por mí. Vamos a imprimir
ruta completa. Y ahí lo tienes. Esta es una ruta completa
a nuestro archivo, archivo. Así que en realidad voy a
llamar a esta ruta de archivo. Genial. Entonces ahora este archivo obviamente aún
no existe. Vamos a crearlo. Para crear un archivo, utilizamos una función llamada open. Llamemos a esto. Llamemos a esto F. Llamemos al archivo f. No lo
estoy llamando archivo porque el archivo es otra función
incorporada en Python. Y no quiero
sobrescribirlo. Entonces podría llamarlo archivo de
subrayado, pero en este caso
sólo voy a llamarlo f. Ahora queremos
abrir por un camino. Y luego cuando estás
abriendo un archivo, tienes que elegir el modo, el modo en el que
quieres abrirlo, y esa es una sola cadena. Los principales modos que quieras. Decidí escribir al
expediente o leer el archivo. Entonces en este caso queremos
escribir un nuevo archivo. Entonces vamos a decir File
Open, abre la ruta del archivo
en modo escritura. Entonces vamos a
decir punto F, ¿verdad? Entonces, lo que
obtienes cuando abres un nuevo archivo es en realidad un objeto de archivo. Entonces veamos cómo se ve
eso. Si simplemente imprimo f me
va a decir
este es un archivo abierto. Escribiría modo en
alguna dirección en la memoria. Si digo, dame el tipo, hay, esta función te
dará el tipo de un objeto. Me dirá que
ese tipo es archivo, razón por la
cual no
quería nombrar mi archivo, mi archivo variable porque
estaría anulando ese tiempo. Genial. Entonces ahora sabemos que
f es un objeto de archivo. Un objeto es realmente de cualquier
tipo en Python, por ejemplo, las cadenas son objetos,
las listas son objetos. Así que al igual que esos, estos objeto archivo tiene una
función llamada write. La función write será kin, algún texto o alguna
cadena con algún texto y algunos textos para mi archivo. Excelente. Ahora algo muy
importante para recordar con archivos es que una vez que abres un archivo,
tienes que cerrarlo. Para cerrar un archivo. Puedes hacer f en este caso, cerrar
punto, luego
llamar a esa función. Si no lo hace, su archivo podría permanecer abierto y
podría corromperse, y se rompería. Por lo que suele decir, siempre es una muy buena idea, buena práctica
cerrar tus archivos. Entonces déjame ejecutar este código. Y sigamos adelante a
ver qué pasó. Excelente, Así que tenemos un nuevo, un nuevo archivo de texto con los textos que
escribimos dentro de él. Genial. El siguiente paso es leer archivos. Así que permítanme modificar este archivo con algunos textos nuevos para que
vayan a leer desde Python. Vamos, escribamos nuevo texto. Leer de Python. Guardemos ese archivo. Ahora para leer, es muy
similar a escribir. Todo esto sigue igual. Aún queremos abrir el archivo, pero queremos
abrirlo en modo lectura. Esa sería nuestra misma ruta de
archivo abierto o como el modo. Y ahora en lugar de escribir, queremos leer este archivo. Así que voy a borrar todo esto y usar la función
dot right. Pues lo siento, lee la función. Y voy a almacenar el rojo, lo que sea que leamos del archivo en una variable llamada contents. Y leer te dará una cadena con el contenido del archivo. Y luego una vez más, después de leer,
queremos cerrar ese archivo. Entonces voy a
imprimir continentes. Y ahí tienes. Entonces el contenido es
exactamente
esa cadena que obtuvimos del archivo. Eso es lo básico para
trabajar con archivos. Es muy fácil,
es muy sencillo. Lo principal que debes recordar
es cerrar tu archivo. Ahora bien, si no quieres
preocuparte por cerrar el archivo, porque es muy
fácil de olvidar. Hay otra
forma de hacer esto, y de hecho
te recomiendo que lo hagas de esta manera. Voy a usar algo
llamado gestor de contexto. Ahora, vamos a escribir width, ruta de archivo
abierta. Esto es lo mismo de
lo que hablamos anteriormente. Vamos a abrir el
archivo en modo radián. Se escribe como f y luego dos puntos. Y dentro de esta declaración
width, voy a decir que el contenido es igual a f punto leído,
igual que antes. Entonces lo que está pasando aquí es que seguimos abriendo
el archivo en modo radián, donde todavía está guardando
eso en la variable f. Pero lo estamos haciendo dentro
de este gestor de contexto. Un administrador de contexto
asegura que algo suceda antes de que se ejecute su
código. Entonces, antes de leer el archivo,
algo va a pasar. Y también asegura que
después de que se ejecute tu código, algo
sucederá antes
de pasar a las siguientes líneas de código. Entonces, en este caso,
ya no
necesitamos cerrar el archivo porque el gestor de
contexto lo
va a estar cerrando por nosotros. Y entonces tampoco
necesitamos esta diapositiva. Ahora, veamos si obtenemos los
mismos resultados que obtuvimos. Obtuvimos exactamente el mismo resultado. Entonces podemos hacer lo mismo
al escribir en un archivo. Podemos cambiar esto
al modo correcto. Y claro que no tenemos que
usar f como variable. Podemos usar FYI si queremos
o cualquier otra cosa que quieras, siempre y cuando esto sea,
esto depende de ti. Siempre y cuando, por supuesto, reutilices esa variable en tu código. Así que abre el archivo y
llámalo de alguna manera, haremos algo que estamos escribiendo ahora. Entonces escribamos nuevo texto. Vamos a ejecutar este código. Y si revisamos el archivo, nuestro nuevo texto fue
escrito en el archivo. Entonces puedes hacerlo de cualquier manera. Puede abrir el archivo manualmente y cerrarlo
manualmente si lo desea. Pero recomiendo encarecidamente
simplemente usar este,
este patrón, que es
el Gestor de Contexto.
37. Guardar postes en los archivos JSON: Sabemos cómo crear archivos. Entonces ahora estamos listos para
comenzar a guardar poses. Vamos a estar usando un formato especial para
los archivos que se llama Jason. Jason, el formato JSON es muy similar a cómo se ven
los diccionarios. Hay una biblioteca
en Python que está diseñada para trabajar específicamente con ese tipo de archivos. Entonces, vamos a levantarnos
pose que podamos salvar. Vamos a usar nuestro código de transferencia de
publicaciones. Y nos vamos a quedar con
todas estas series. Déjame hacer una pausa aquí
y decir transferencia de pose. Y nuestra función se
llamaba GET post deck. Y tenemos que
pasar en el espacio de nombres. Genial, Así que vamos, vamos a conseguir el post para
este sombrero de aquí abajo. Y el espacio de nombres de este
personaje es Luna, uno. Ese es un personaje nuevo
que acabo de agregar. Entonces llamemos a esta pose. Pose es igual a la transferencia posterior
que se publican. Veamos cómo se ve esto. Déjame traer esa pose. Bien, ahí tienes. Es este diccionario con algunos valores. Este
pequeño diccionario. Eso es genial, solo por el sombrero. Entonces ahora queremos
guardar este archivo. Ahora como estamos usando
el formato JSON, voy a
seguir adelante y darle eso, mantener eso como
nombre de extensión para este archivo. Y lo vamos a hacer, vamos a estar usando el Gestor de
Contexto también. Voy a llamar a esto F, nuevo, es por simplicidad. Pero ahora en vez de
usar epitafios, bien, vamos a
estar usando algo. Vamos a estar usando la
biblioteca JSON que importamos. Entonces, una vez más, importa JSON y ese es Jason
sin un JSON. Y vamos a usar esa
biblioteca para escribir el archivo. Ahora la biblioteca JSON lo
llama volcado. Van a volcar básicamente
un diccionario en un archivo. Ahora tenemos que hacerlo, tenemos que
pasar en el poste. Déjenme ser más explícito
y llamarlo post dict. Vamos a volcar el
post dict en eso mientras aún necesitamos abrir el archivo y
tenemos que cerrarlo. Ahora lo que vamos a
pasar ese objeto archivo a json dot dump. Ejecutemos esto y veamos
cómo se ve. Vamos a nuestra carpeta aquí. Tenemos este archivo de texto, nuevamente con nuestro diccionario. Y eso es exactamente lo que queremos. Entonces ahora tenemos nuestras
publicaciones guardadas en un archivo. Ahora, otra cosa que me
gustaría hacer es formatear el archivo un
poco más agradable ahora. Pero lo bueno de usar la biblioteca JSON es que
puedes hacer precisamente eso. Hay un argumento
llamado indent. Voy a decir que quiero o
participando suplementación. Entonces, si vuelvo a ejecutar este código, va a escribir ese
diccionario nuevamente en el archivo. Esta vez, muy bien formateado. Aquí hay cuatro espacios
de sangría, y es más fácil de
leer de esa manera. Entonces, sigamos adelante y creamos el código que
va a estar guardando. O quizás la forma en que
vamos a estar trabajando con esto es el
nombre del archivo, será el nombre de las publicaciones. Y claro, el
contexto del archivo
serán los
valores reales del post. Así que vamos a entrar en PyCharm y
vamos a nuestro módulo principal. Empecemos de cero. Vamos a necesitar, vamos a necesitar
el módulo OS. Vamos a necesitar
la biblioteca JSON o siempre son biblioteca
y biblioteca JSON. De hecho, vamos a llevar todo
esto al gráfico circular. Genial. Entonces sí necesitamos saber, ya que este va
a ser el código, el código para nuestra herramienta, vamos a querer saber dónde estamos guardando las poses. Entonces voy a hacer de
esto una variable global. Ahí lo llamas raíz. Ahora bien, lo que quiero decir con variable
global es que esta variable será accesible para todo lo que esté dentro
de este módulo. Incluso si creamos una función. Digamos que aquí tenemos
esta función. Podemos usar una
variable global dentro de esta función
porque está fuera
del alcance de esta función. Ahora bien, si tuviera que crear
otra variable aquí, esta variable sólo está disponible dentro de
esta función porque, de
nuevo, por el alcance. Entonces eso es una gran
cosa de las variables globales. Y porque hay globales, la convención es
hacerlos todos capitalizados. Ahora bien, esto no es necesario. Esto no va a
romper tu código si tienes minúsculas aquí. Pero como convención para hacer evidente que
se trata de
una variable global, es una variable importante definiendo un valor que se
quiere que sea constante. Nosotros lo hacemos. Mayúscula. Genial. Por lo que también queremos
conocer la extensión. Entonces vamos a
escribir extensión. Vamos a hacer EXT. La extensión será dot json. Excelente. Así que necesitamos crear una
función para escribir bytes. Vamos a escribir def,
derecho, posar para archivar. Ahora necesitamos saber cómo va a llamarse el
puesto. Vamos a tomar un
argumento llamado posnatalmente. Necesitamos conocer el contenido
del expediente, ¿no? Entonces necesitamos esos diccionarios. Excelente. Entonces dentro de esto, básicamente
vamos a
estar haciendo lo que hicimos en Maya con algunas modificaciones. Entonces la ruta del archivo
será el directorio raíz, que es una especie de directorio
global para nuestros fines
que se define aquí. Entonces quien use esta función no necesita saber
dónde guardar las publicaciones. Eso lo estamos definiendo en la herramienta. Pero sí necesitamos saber el nombre. Ahora bien, el nombre de la pose
no contiene la, la extensión porque no
queremos a quien esté usando de esta manera. Solo queremos que
nos den un nombre de las publicaciones. Nosotros nos encargaremos
de esa extensión. Entonces llamemos, hagamos una
nueva variable llamada filename. Y simplemente vamos a juntar ese nombre y la
extensión. Déjame deshacerme del
periodo aquí y extensión. Nosotros nos encargaremos de eso
dentro de esta función. Entonces este será el nombre de la publicación, extensión de
punto, nombre de
pose en
primer lugar y luego extensión EXE de
punto. Genial. Y ahora podemos unirnos al
directorio raíz y el nombre del archivo, y esa será nuestra ruta de archivo. Excelente. Entonces se nos está
proporcionando el diccionario post. No necesitamos conseguirlo. Entonces simplemente guardamos el archivo. Y eso es todo. Es genial. Vamos a probarlo muy rápido. Entonces volvamos a Maya. Y hagamos una nueva pestaña de Python. Vamos a importar
de fototeca. Núcleo de importación. De hecho voy al namespace
it core como library core, solo para hacerlo un
poco más explícito, library core dot
write posts to File. Y sí necesitamos conseguir diccionario
oponerse. Entonces déjame, déjame, déjame importar, importar
Mensajes subrayan transferencia. Y vamos a conseguir ambos diccionarios de
la misma manera que lo hacíamos antes. Haz un par de
pasta esto aquí. Entonces tenemos que nombrar la
pose que va a ser, vamos a llamarla primera pose. Y tenemos que proporcionar
el diccionario dict. Genial. Así que permítanme asegurarme que mi selección
siga ahí. Seleccione el sombrero. Vamos a conseguir
el diccionario de pose. Entonces puede escribir eso en un archivo. El objeto no tiene ningún atributo,
¿verdad? Archivo postal. Claro, porque no lo hemos hecho, no hemos vuelto a cargar esto. Vamos a recargar. Nosotros
porque agregamos código, necesitamos recargar ese módulo. Ahí vas. Ahora bien, si revisamos nuestro archivo, tenemos un nuevo me hizo
un erratazo, lo siento,
primero, supongamos que debería ser primero, pero lo que tenemos el
contenido del post dentro de eso. Genial. Así que ahora podemos escribir
post dos archivos.
38. Lectura plantea a partir de archivos JSON: Ahora necesitamos leer las poses de un archivo o una
publicación de un archivo. Así que vamos a crear una nueva función
llamada manguera roja a partir de archivo. Y todo lo que necesitamos
aquí, por cierto, estoy guardando dos espacios
entre mis funciones solo para que sea un poco
más ordenada u organizada. Todo lo que necesitamos para esta
función es una ruta de archivo. Ahora bien, esto se hace de manera
similar a escribir archivos, pero tenemos que hacer lo contrario. Por supuesto, tenemos que leerlo. Entonces vamos a usar
el Gestor de Contexto. Vamos a abrir el
archivo en modo radián. Y vamos a estar usando una vez más
la biblioteca JSON,
pero para leer el archivo. Ahora, dump volcará
un diccionario en un archivo y la carga cargará
un diccionario desde un archivo. Ahora, todo lo que necesitamos proporcionar a la función load es
ese archivo desde el que queremos cargar. Y vamos a guardar eso en una variable que
podemos
llamarla extrae datos porque
eso es lo que es. O post dict. Vamos a conseguir un
diccionario de esto. El Gestor de Contexto se
encargará de cerrar el expediente por nosotros, por
supuesto, y luego
podremos regresar pose. Ahora,
algo genial de los administradores de contextos es incluso si
regresas dentro de ella, lo que significa que estamos
terminando la función, aún cerrará el archivo
antes de salir de la función. Entonces esas son las
grandes cosas de, gran cosa de los gestores de
contexto, no importa lo que hagas, ellos se asegurarán de que
lo que sea que se deba
hacer cuando termines la ejecución del código
dentro de ellos, va a suceder. Genial. Así que estamos,
ya podemos leer un archivo. Vamos a probar eso rápidamente. Entonces queremos leer. Hagámoslo aquí. Pose a partir de archivo, será
igual al núcleo de la biblioteca. Leer prosa, publicaciones de archivo. Y la ruta del archivo por supuesto, son estos archivos aquí queremos
leer primero post por ejemplo así que déjame copiar esto. Vamos a proporcionar esta ruta de archivo. Yo sólo voy a escribirla. Para un cónyuge incluyendo mi errata. Se supone que tenemos que puntear json. Y luego podemos imprimir
pose de bilis. Y claro, ya que
hicimos algunos cambios, tenemos que recargar nuestro módulo. Y entonces puedo usar mi función. Ahora, dice nombre de archivo no válido. Bien, es mi personaje de escape. Bien, permítanme agregar
la r delante de esa cadena para evitar que
se escapen los caracteres. Y ahí tienes. Ahora post from file
is the director is a dictionary coming directly from the contents of that file. Excelente, así que ahora podemos
leer y escribir archivos. Antes de seguir adelante, no
quiero olvidarme de hacer mis cadenas de documentos. Perdón por eso. Así que vamos a
hacer paseo le debe datos a archivo. Entonces el nombre de la publicación será una
cadena del archivo resultante. Ejemplo. Una vez más, lo que pones en
las cadenas de documentos depende de ti. Siempre y cuando sea esto
descriptivo y lo suficientemente útil. Pausa el acto será
diccionario y diremos contenidos de la pose. Y no vamos a devolver
nada en este caso. Entonces hagamos lo mismo
para la función de lectura. Puente, datos de pose. Expediente. La ruta del archivo
será una cadena. Creo que este es
muy autoexplicativo. Vamos, vamos a
agregar archivo para leer. Y entonces el valor de retorno
será un diccionario. Un diccionario. Lo siguiente que tenemos que hacer es saber qué poses
tenemos en el, en el directorio para que podamos poblar la biblioteca con ellas. Eso significa que necesitamos
obtener todos los archivos dentro de este
directorio raíz que elegimos. Entonces como dije, el nombre
del archivo será el
nombre de la pose y el contenido
del archivo
serán los valores para el post. Así que sigamos adelante y consigamos los archivos dentro
de este directorio. Podemos usar la
biblioteca del sistema operativo una vez más. Déjame volver aquí. Déjame borrar todo
este código que ya no lo necesitamos. Simplemente dejemos la biblioteca
del sistema operativo. El directorio con el que estamos
trabajando. Vamos a ponerlo de nuevo aquí. Hay una función dentro de la biblioteca del sistema operativo
llamada list allí. Lo que se necesita es
una ruta de directorio, y le dará
una lista de todos
los contenidos dentro
de ese directorio. Entonces podemos decir, ya que es una lista,
podemos recorrer esa lista. Podemos decir por, para artículo en
siempre irreflexivo ahí. Simplemente imprima ese artículo. Ahí vas. Entonces lo que es son los tres
los tres archivos que
hemos creado hasta el momento son
dos poses y archivo TXT. Ahora no queremos que sea archivo C, solo
queremos los archivos JSON. Y también queremos conocer
las rutas de archivo de este, de este archivo, ¿verdad? Entonces ahora mismo tenemos el archivo, el nombre del archivo, pero queremos obtener la ruta
completa del archivo. Entonces lo que voy a hacer
es crear una función que va a tener un diccionario que
tenga el nombre de la pose, Digamos nombre del post. Y también tendrá la ruta al archivo que tiene
el contenido para ese post. Volvamos a PyCharm y
comencemos a escribir esta función. Pongámoslo aquí en la parte superior. Voy a, ya que
vamos a conseguir un diccionario de esta pose, voy a llamarlo diccionario
get poses. Ahora, una vez más,
en realidad voy a agregar el docstring porque
sé lo que estoy esperando. Buen diccionario
con un muy nivel. Moisés. Y voy a correr ejemplo. El diccionario se verá
algo así. Tendremos el
nombre de la publicación como clave y el camino a la pose
como valor, cinco. Pero ahora esto también significa, esto también significa que los
archivos tienen que ser únicos ya que estamos confiando en que
el nombre del archivo sea el
nombre de la pose. También estamos limitando la herramienta para no poder
duplicar poses. Pero creo que está bien. Lo siento, no duplicar pulsos. Puedes duplicar
la pose, no puedes duplicar el nombre de la pose. Vamos a
devolver un diccionario. Bien, así que una vez más, queremos, queremos listar todos los contenidos en
nuestro directorio raíz. Así que vamos a
decir para una vez más, ítem en nuestra lista ahí, vamos a usar
nuestro directorio raíz. En realidad, voy a
llamar a este nombre de archivo. Ya que eso es con lo que
estamos trabajando. Estamos trabajando con volúmenes. Ahora. Inicialicemos un diccionario
vacío. Vamos a llamarlo poses
para ser un diccionario vacío. Y tenemos que obtener primero
el nombre de las publicaciones. El nombre de host
será, como dije, el nombre del
archivo sin la extensión. Y también como dije, solo
queremos conseguir las poses que terminen con dot json porque ese
es el formato que elegimos. Entonces en este caso, si
tenemos este archivo TXT, queremos ignorarlo. Entonces vamos, pongamos primero
ese check in. Digamos que si el
nombre del guión bajo del archivo termina con extensión, que es x, en realidad
hagamos lo contrario. Si no nombre de archivo y extensión de
sudor que
elegimos, que es Jason. Simplemente vamos a
continuar y saltarnos ese archivo. Excelente. Entonces ahora llegamos a
publicar el nombre de ese archivo. Ese es nuevamente el nombre
del archivo sin la extensión. Así que podemos hacer eso
dividiendo filename dot split. Vamos a dividirnos por
el periodo por el punto. Eso nos dará el
nombre del expediente, atado con el nombre del
expediente y la extensión. Y solo queremos el
nombre del archivo, que es el primer
ítem de esa lista. Entonces tenemos el nombre de la publicación, y ahora queremos la ruta
completa al archivo. Queremos que la ruta del archivo
sea vamos a unir el directorio y
el nombre del archivo. Entonces va a
ser siempre ruta de puntos la articulación como lo
hemos hecho antes. Vamos a unirnos
al directorio raíz. Y el archivo, el archivo que obtuvimos al
inspeccionar el contenido
de ese directorio raíz. Ahí vas. Entonces esa será la ruta del archivo. Entonces digamos, espero que no
vayan demasiado rápido. Vamos, vamos a imprimir
lo que tenemos hasta ahora. Digamos que el nombre de host será, veamos qué
obtenemos por el nombre de la publicación. Déjame duplicar esta línea. Vamos a imprimir pose. La ruta del archivo será la ruta del archivo. Y aquí dentro, vamos a asegurarnos de
que estamos saltando correctamente. Entonces vamos a
decir que se está saltando. Y digamos el nombre del archivo. Lo que nos estamos saltando. Lo que estoy haciendo aquí es que estoy haciendo dentro de la declaración
impresa. Estoy poniendo una coma y puedes imprimir varias cosas
juntas de esa manera. Entonces volvamos a Maya. Usemos nuestra función
que se llama buenos posts que la tienen cargada aquí. Una vez más, ya que
hicimos algunos cambios, volvamos a cargar nuestro módulo. Y vamos a ejecutar simplemente biblioteca en el círculo
subrayado punto núcleo get posted. No necesito
postrasplante en este momento. Genial. Ahí vas. Así que estamos consiguiendo, estamos obteniendo por supuesto
que JSON o obteniendo el
nombre de la publicación de eso
dividiendo el nombre del archivo y solo
tomando la primera parte. Y también nos estamos saltando test.txt porque no
termina con Jason, ¿verdad? Entonces estos son los valores que
queremos para el diccionario. Queremos el nombre de la
pose que estaban recibiendo. Y queremos la ruta al
archivo que tiene el contenido. Entonces todo lo que queda por hacer que yo borre estas dos líneas y
también esta declaración impresa. Todo lo que queda por hacer es
poblar nuestro diccionario. Entonces nuestro
diccionario vacío aquí plantea. Ahora las claves para el diccionario
serán los nombres del nombre de la publicación y el valor para cada clave será ruta de subrayado de
archivo. Eso es todo lo que tenemos que hacer. Y entonces tenemos que
devolver ese diccionario. Así que vamos a probar esto. Ejecutemos este código, recarguemos el módulo
y ejecutemos la función. No pasó nada porque
no estamos imprimiendo, claro. Entonces podemos mostrar esto en una
variable llamada poses. E imprime esa variable. Déjame, déjame vaciar
mi ventana de salida. Ahí vas. Ahora tenemos un diccionario
con múltiples valores, que son sólo las políticas
que nos importan. Entonces pose de prueba, una
ruta al archivo. Primera pose y la
ruta al archivo. Ahora puedes ver que estamos
recibiendo barras dobles. Eso es porque estamos usando el,
el 0 es una ruta
para unir la función. Entonces va a
asegurarse de que obtienes una ruta de archivo que es válida y no va
a causar ningún problema. Entonces tener esas barras de
doble vuelta no
es un problema en absoluto. Podemos leer archivos de ellos. Ahí vas. Entonces
ahora podemos saber, podemos usar esto para
poblar nuestra biblioteca.
39. Crear la interfaz de usuario: Ahora que tenemos la
funcionalidad que necesitamos, podemos seguir adelante
y crear la interfaz de usuario. Ahora esta interfaz de usuario es
diferente a la anterior. No sólo eso, es un
poco más complejo, pero en realidad no tanto. Pero principalmente en eso estamos recibiendo
entrada del usuario ahora, tanto a través de la selección de esta lista como de una entrada de texto. Cuando son serbios, están consiguiendo el nombre
del puesto para salvar. Analicemos rápidamente
cómo se compone esta interfaz de usuario. Voy a tomar una captura de pantalla para que pueda dibujar encima de ella. Recuerda que
hablamos de layouts y de cómo layouts básicamente componen
lo que realmente son las UI. Entonces en este caso, tenemos la lista de poses y
tenemos aquí este botón. Eso significa que necesitamos un diseño que fluya
de arriba a abajo. Eso sería un diseño de columna. Esta primera sección
será un diseño de columna. Entonces tenemos esta sección
plegable. Y eso pasa a
ser otro layout que tiene un layout dentro de él. Ahora la razón por la que necesitamos
esas cosas en tu diseño es porque esta siguiente sección también
está fluyendo
de arriba a abajo. Como pueden ver tenemos
es esta línea aquí. Y luego tenemos la pose, el botón de pose segura. Entonces ese será
otro diseño de columna. Pero dentro de ese diseño de
columna, tenemos este texto al lado. Tenemos este campo de entrada que va a
necesitar un diseño de fila porque está fluyendo
de izquierda a derecha. Entonces no es realmente
tan complicado. Son solo unos pocos diseños
Creando el flujo de esta herramienta. Básicamente tenemos un
diseño de columna a diseños de columna, un diseño de fila y luego un diseño plegable
adicional. Entonces eso es realmente solo para los
diseños tengan esta
herramienta completada. Vamos a comprar plazo y
empezar a trabajar en nuestro código. Entonces, una vez más, la forma en
que organizamos nuestro código es que tenemos este módulo core
que tiene la función principal. Y tenemos un módulo completamente
separado que va a ser para la interfaz de usuario. Entonces todo lo que se necesite
solo para la interfaz de usuario estará aquí. Cualquier cosa que tenga que ver con funcionalidad y realmente
cualquier cosa que pueda
usarse independientemente de la interfaz de usuario debe permanecer fuera
de estos módulos de interfaz de usuario. Probablemente voy a
entrar en el core one. Entonces algo que tenemos que
hacer que también es diferente
para este tipo de UI, es que ya que estamos
consultando información o estamos recibiendo entrada del usuario a través de
la interfaz de usuario. Necesitamos nombrar a nuestros elementos de interfaz muy
específicamente no son específicos, sino únicos. Tenemos que darle a nuestra
ventana un nombre único para que podamos consultar las
cosas desde esa ventana. Y tenemos que dar a
todos sus elementos de interfaz un nombre específico para que podamos
obtener información de ellos. Empecemos por crear
la ventana que necesitamos. Los mayas le esta biblioteca,
ese es tu hombro. Entonces de entrada Maya, biblioteca
CMBS, estamos viendo la S.
y voy a crear una función
llamada mostrarte por qué. Ahora estoy usando este nombre para mantenerme consistente con la otra
función en nuestras otras dos. Dentro de ella, tenemos que
crear una ventana, igual que la última vez. Vamos a darle un título. Título es igual a la biblioteca de pose. Y entonces como recuerdas, tenemos que mostrar esa ventana. Así que Cmd S punto mostrar ventana. Déjame asegurarme de que
no estoy seguro de ventana. Y luego tenemos que pasar en nombre de la ventana
que estamos mostrando. Entonces, la última vez para la otra herramienta, dejamos que mi otra ventana lateral, el nombre interno de la ventana, y dejamos que Maya nos lo diera, comenzamos a almacenarlo
en esta variable. Entonces simplemente lo demostramos. Ahora bien, la forma funciona
esta herramienta es
que en realidad puedes abrir múltiples copias
de esa ventana. Y eso está bien. Pero para la postteca, queremos que sea única. Queremos que
solo tenga una copia de la ventana
abierta en un momento dado. Entonces por esa razón, voy a darle a nuestra
ventana un nombre único. Voy a crear
otra variable global, bien, variable de nivel. Voy a
llamarlo nombre de ventana. Este será el
nombre interno de la biblioteca de UI. Ui. Ahora, como mencioné antes, estoy eligiendo todas las mayúsculas para
las variables globales
porque indica que es un valor constante
en todo el código. Así que vamos a
crear nuestra ventana usando este nombre único
en lugar de dejar que mi, elijo un nombre para nosotros. Y luego voy a
mostrar el nombre de esa ventana. Correcto. Entonces vayamos a Maya y veamos cómo
es esto. Así que vamos a importar
desde la biblioteca de correos, importar la interfaz de usuario, y estamos
haciendo cambios en ella. Así que tengamos nuestro comando de
recarga listo. Digamos UI dot
show, subrayado UI. Ahí vas. La ventana está vacía por supuesto, pero tenemos el
título que elegimos. Ahora bien, si vuelvo a ejecutar esto. Sin cerrar la ventana, verás que
obtenemos un error. Decimos que la
interfaz de usuario de post biblioteca no es única. Lo que está pasando aquí
es que cuando cierro esta ventana, el nombre se ha ido. Pero cuando lo abro e
intenté lanzarlo de nuevo, mi no puedo crear la ventana. Se puede ver aquí es cuando estamos tratando de
crear la ventana, que se queja de que
el nombre ya existe. Entonces hay algo que
podemos hacer al respecto,
que es simplemente eliminar la interfaz de usuario. Entonces podemos, podemos agregar un cheque
antes de crear una ventana. Podemos verificar si existe la interfaz de usuario. Podemos decir si CMBS dot window, y luego el nombre de la ventana, lo siento, abre y cierra el nombre de
ventana de paréntesis existe. Porque cierto. Entonces estamos consultando, en realidad
tenemos que consultar este valor. O simplemente puedo decir
query es igual a true. También puedes escribir q
igual a true si quieres, pero voy a escribir el nombre
completo del argumento. Consulta es igual a true. Básicamente si la ventana existe, vamos a
eliminar esa ventana. Eso se hace a través del comando
CMBS Dot Delete UI. Y vamos a eliminar
el nombre de esa ventana. Nombre de ventana. Genial. Entonces lo que va a pasar es que
si esa ventana ya existe, vamos a eliminar
por completo y crear
una nueva desde cero. Entonces veamos cómo
funciona eso. Ahí vas. Así que ahora podemos ejecutar este
código varias veces. No obtenemos errores. Excelente. A continuación, necesitamos
crear la parte superior, que es la parte que se
utiliza para aplicar las poses. Entonces necesitamos una lista y un
botón que va a estar dentro de una cuadrícula de diseño de
columnas. Entonces llamemos a esta sección
aplica sección de publicaciones. Necesitamos un diseño de columna. Asume el diseño de la columna de punto S. Si recuerdas de la última vez, estábamos haciendo columna ajustable
igual a true para que el,
los widgets
se expandan automáticamente con la ventana. Así que vamos a usar eso
en este caso también. Yo solo doble
columna es igual a verdadero. Y recuerda que
cuando creamos una interfaz de usuario,
expongo que el diseño se convierte en el actual padre del parlamento para cualquier otra cosa que
creamos después de eso. Entonces sabemos que necesitamos
crear un botón. Esa es fácil.
Sabemos fondo. Sabemos que el texto en los labios inferiores bajo
el argumento de la etiqueta. Entonces vamos a decir
etiqueta es igual a pose aplicada. Y sí necesitamos agregar un
comando al botón, pero nuestro enfoque va a ser, primero
vamos a crear el esqueleto
de la interfaz de usuario. Y luego hacemos cualquier conexión para la
funcionalidad real que tenemos. Entonces tenemos un botón
y necesitamos una lista. Ahora para crear este tipo
de lista que queramos, hay un comando
llamado Lista de desplazamiento de texto. Ahora, ¿cómo sé esto? Yo, busqué en línea, encontré algunos ejemplos en línea. Y este fue el
mejor widget que encontré para lo que queremos hacer. Entonces, bajemos a
los ejemplos de esto. Scroll es tecnología scroll
es esa documentación. A ver lo que podemos hacer. Número de filas solas, selección
múltiple. Podríamos ser capaces de
simplemente crearlo vacío. Entonces vamos, simplemente
vamos a crear la lista
y ver cómo se ve eso. Entonces esto será CMBS, el arte Lista de desplazamiento de texto. Siguiente lista de desplazamiento,
llamemos a eso. Y veamos cómo
se ve esto hasta ahora. El código, ahí tienes. Tenemos una lista y tenemos
un botón superior bombillas. Excelente. Vamos, dejemos esa sección así por ahora. Pasemos a la
siguiente sección de sesión. Una vez más, estamos tratando terminar
el esqueleto lo antes
posible. Y luego volveríamos
y los puliríamos. La funcionalidad que cualquier otro detalle
que podamos necesitar. Para nuestra siguiente sección, necesitamos dejar claro esto donde nuestra siguiente sección necesitamos estos diseños
colapsables. Ahora, ese es un tipo de
diseño llamado diseño de marco. Marco tendido. Veamos documentación
para eso. Voy a ir una vez más
directo a los ejemplos. Esa suele ser la
forma más rápida de obtener un ejemplo de este diseño de marco. Con una etiqueta. Sí necesitamos
una etiqueta porque queremos, queremos que se quede para
darnos el nombre de esta sección. De modo que esa
etiqueta de diseño de marco es igual a una cadena. Por lo que se guardará esta sección. Sección de pose. Excelente. Así CMBS diseño de marco de
punto. Y vamos a llamar a
la etiqueta para estar seguros. Pose. Excelente. Y luego dentro de ese layout, hablamos de tener
un layout de columnas. Vamos a crear el diseño de
columna que vamos a usar
esa segunda sección. Y vamos en realidad,
vamos a reutilizar lo que tenemos aquí. Porque necesitamos el
mismo tipo de diseño. También queremos que sea ajustable para que se expanda
automáticamente. Ahora bajo eso, sabemos que
queremos este
diseño de fila con un nombre, etiqueta llamada nombre
y un campo de texto. Entonces el perdón actual es
este diseño de columna, ¿verdad? Así que queremos agregar un diseño de fila
debajo de ese diseño de columna. Y queremos que tenga dos
elementos dentro de ella. En realidad recuerda una vez más, de nuestro anterior, en
realidad no estaba en el taburete, estaba en otro ejemplo. Necesitamos, necesitamos especificar el número de
elementos que son, el número de columnas que
estarán en el diseño de fila. Veamos cómo se hace eso. Vamos al
programa de documentación rodando hacia fuera. Hicimos. Dice número de columnas. número de columnas
es igual al número de elementos que queremos en esa capa. Excelente. Entonces
será número de columnas igual a dos porque solo
necesitamos un texto, un trozo de texto, y
el campo de texto también. Genial. Entonces, ahora que nuestro diseño de fila
es el padre actual, podemos agregar nuestra etiqueta
o un trozo de texto. Y si recuerdas una
vez más de la herramienta anterior, podemos robarnos eso. Para que podamos robar el
comando de textos con la etiqueta. Podemos mantenerlo sencillo. Texto simple con una
etiqueta y la etiqueta dirá nombre. Genial. Y luego junto a ese
texto, etiqueta, esto arriba. Junto a esa etiqueta de texto, necesitamos un campo de texto. Para el campo de texto, hay un widget muy
convenientemente
llamado campo de texto, que es este de aquí. Todo lo que hace es
que te da un espacio para escribir. Y también podemos consultar información
de ese campo de texto. Entonces echemos un
vistazo rápido a los ejemplos. Parece que simplemente podemos
llamarlo y
nos va a dar ese campo de texto. Entonces, sigamos adelante y
hagamos ese campo de texto. Ahí vas. Entonces
veamos qué está pasando, cómo se ve hasta ahora. Volvamos a Maya
y volvamos a ejecutar nuestra interfaz de usuario. Bien, genial. Es como si estuviera viendo algún
progreso, no increíble. Nuestra sección plegable en realidad
no está colapsando. Simplemente parece
otra pieza de etiqueta. Y por alguna razón
nuestro campo de texto no lo
es, no está ocupando todo
el espacio. Bien, podemos arreglarlo. Pero vamos,
terminemos de agregar todos
los botones y luego
volveremos y haremos esto,
esta sección plegable. Entonces, lo último que necesitamos
agregar es el botón de publicación segura. Eso debería ser fácil. Podemos decir CMBS
botón de punto, etiqueta es igual a guardar. Ahora bien, si ejecutamos esto ahora mismo y veamos
cómo se ve. Demasiados niños en
diseño, diseño de filas. ¿Bien? Entonces, una vez más, como mencioné, el padre actual
es esta puesta en marcha. Así que podríamos arreglar esto dando
al Rowley add un hijo más
o una columna más para agregar. Y esto ya no lo hará nunca más. Pero ahora el botón de pausa segura está aquí y no lo
queremos ahí. Lo queremos bajo
esa sección, ¿verdad? Entonces, lo que tenemos que hacer es cambiar el padre de ser el diseño de fila actual
a la parte anterior, que es el diseño de columna. ¿Cómo lo hacemos? Lo hacemos usando este comando set current,
toupper y función. Y hay una notación muy
específica que mis piernas y son dos puntos. Voy a hacer
un comentario aquí. Maquetación como nuevos padres. Una vez más, el diseño actual
o el actual. El padre actual
es el diseño de fila. Entonces establecemos el nuevo padre para que sea el diseño de
columna anterior. Y ahora nuestro botón debería
estar en la columna y no en la fila. Otra vez. Ahí vas. Eso se parece más a
lo que estamos buscando. Entonces ahora volvamos y hagamos que esa sección realmente colapse. Una vez más, esa
sección plegable es el diseño del marco. Entonces, si vamos a la
documentación, buscaremos ese diseño de marco. Hay un argumento
llamado Colapso. En realidad, lo siento,
se llama plegable. Maneja la colapsabilidad
del diseño del marco. Eso tiene sentido. Entonces podemos simplemente, toma en un booleano. Entonces podemos
decir simplemente colapsable. Plegable es igual a verdadero. Y eso debería
encargarse de eso. Recargar nuestro código
y ejecutarlo de nuevo. Y ahí tienes. Ahora nosotros, estamos
colapsando. una sección que se puede colapsar. Excelente. Entonces esto está funcionando
porque una vez más, el diseño de la columna
se aparenta bajo este diseño de marco
y todo lo demás en esa sección vive
bajo ese diseño de columna. Entonces realmente estamos colapsando
esa capa de columna. Ahora bien, lo siguiente que
tenemos aquí es esa sección, esa sección clásica
tiene un color diferente. Aún no tenemos
eso en horas, así que cambiemos eso. Y entonces queremos arreglar que este
TextField sea demasiado corto. Queremos que tome, que se lleve todo el espacio
que está disponible. Veamos cómo cambiar el color de nuestro diseño de marco. Volver a la documentación. Hay un argumento
llamado Color de Fondo. Y dice, este es el color de
fondo del control. Controlar este caso
significa elemento UI. Los argumentos corresponden
a rojo, verde y azul, ya que los valores RGB, cada componente
varía en valor 0-1. Entonces, como sabes, o como sabrás, RGB va 0-255, hace, hace, hace un rango
de valores para RGB. Maya quiere que
traduzcas eso en un rango de cero a uno, lo cual es muy fácil de hacer. Y es pedir una lista. En este caso, puede ser una
lista o una tupla con los valores R, G y B, rojo G y B, rojo,
verde y azul. Entonces, sigamos adelante y usemos
ese argumento de fondo. Fondo, el color es igual,
voy a usar una tupla. Ahora bien esto serán valores
0-1 y son flotadores, como puedes ver aquí
en la documentación, es un float porque hay
un punto decimal en él. Entonces lo primero
que voy a hacer es conseguir un color con el que
estoy contento. Puede elegir cualquiera, cualquier conjunto de valores RGB. Lo que me gusta hacer es buscar
en línea un seleccionador de color RGB. Por ejemplo, Google tiene uno aquí mismo. Elegí un poco como
un color azul claro. Entonces déjame encontrar
algo así. Y estos son los valores RGB. Entonces podemos tomar estos valores
y podemos convertirlos de, una vez más, el
rango es de 255. Entonces este es el valor máximo y el
valor más bajo será cero. Entonces podemos convertir
estos números de ese valor para convertir esa llave inglesa
a un rango de cero a uno. Déjame copiar y
pegar esto en Maya. Voy a usar Python
para hacer esta conversión. Entonces necesitamos hacer un poco de matemáticas para esto es compresión, pero es matemática muy simple. Entonces digamos que si nuestro
valor para el valor RGB es cero, el equivalente de eso en el rango de
cero a uno
sería cero, ¿verdad? Si su valor RGB es, el valor máximo es 255, el equivalente en el rango de cero
a uno sería uno, o en este caso, 1.1. Entonces eso significa que
todo lo que tenemos que hacer es dividir nuestro valor por 255, y eso
nos dará este rango. Entonces en este caso, tengo esto. Estos tres números aquí. Todo lo que necesito hacer si quiero
saber el equivalente de esto
en el rango cero a uno, simplemente
puedo dividirme por 255.0 porque quiero que me
dé un flotador resultante. Y este es el resultado. Entonces vamos, hagamos esto de manera
más eficiente y hagamos un bucle for
simple
para estos valores. Entonces por valor en este lugar
a través de esta tupla de números, voy a decir valor de impresión dividido por, dividido por 255.0. Eso me va a dar los valores
que queremos esto o esto, este árbol. Vamos a copiarlos y
llevarlos a nuestro código. Ahora bien, estos tienen
muchos decimales, pero en realidad no
necesitamos todo eso. Nosotros solo hacemos esto. Los lugares de correo electrónico deberían ser suficientes. Entonces este será nuestro rojo. Este será nuestro azul. Lo sentimos, nuestro verde, G, rojo, verde y azul. Ahí vas. Volvamos a Maya y
veamos cómo es eso. Ese es el código equivocado. Este es el código
que quiero ejecutar. Ahí vas. Entonces ahora esa sección se ve
un poco más agradable. No me gusta cómo se
ve con el texto. Entonces voy a elegir
un color un poco más oscuro. Y como ya tenemos el código para hacer esa traducción, podemos simplemente eso
aquí dentro, ejecutarlo. Vamos muy rápido
con eso en nuestro código. Entonces sólo voy a tomar los dos
primeros decimales. Sólo voy a darle un
toque a mano. Entonces son diez. El
siguiente es 0.54, y el siguiente será 0.67. Ve, vuelve, inténtalo de nuevo. Y eso es más agradable. Ahora
podemos ver el título de esta sección y tenemos
un color diferente en ella. Por supuesto, puedes elegir
el color que quieras. Esta es tu herramienta,
tienes el control. Ahora lo siguiente que
queremos encargarnos es el dimensionamiento de este TextField. Ahora una manera fácil de hacerlo
sería darle un ancho fijo, digamos 400 píxeles. Y eso se encarga de ello. El problema es que ahora no
podemos, no podemos cambiar
el tamaño de la ventana por debajo 400 píxeles ahora,
lo cual es un problema. Entonces, en lugar de eso, podemos manejar el dimensionamiento
a través del layout. La mayoría de las veces cuando
tienes que lidiar con,
con los tamaños y cómo se ajustan los
widgets en la interfaz de usuario que es
controlada por layouts. Así que hay una buena posibilidad de
que el diseño de la fila, tengamos algo para nosotros. Está justo aquí. Es el primer argumento que
vemos, columna ajustable. Entonces veamos qué dice. Especificar, especifica
qué columna tiene un tamaño ajustable que cambia con el
tamaño del diseño. Eso es exactamente
lo que queremos y toma como argumento un entero. Entonces sigamos adelante y usemos eso. Acabo de doblar la columna es igual
al número de columnas. Entonces digamos, eliminemos
esto del campo de texto. No queremos fijar el
tamaño en el diseño de fila. Queremos decir que la
columna ajustable es igual. Ahora esto será que los diseños empiecen
a contar a la una, no a cero. Entonces esta será
la primera columna. El primer ítem estaría aquí. El segundo sería lo que
queremos que sea ajustable. Entonces vamos a
decir que solo doble columna es igual a verdadero es igual a dos. La segunda columna
debe ser redimensionable, saber, y ahí tienes. Eso es lo que
queremos lograr. Excelente. La interfaz de usuario está tomando forma. Podríamos dejarlo en
eso si quieres, pero creo que podemos hacer algunos ajustes para que
sea un poco más agradable. Aplicaron botón de pausa. Podría ser un poco más grande, ya que ese es el
botón principal que tenemos. Podría haber un poco de espacio entre nuestros elementos. Así que vamos a ajustar el espaciado, el diseño de la columna como un
argumento llamado espaciado entre filas. Vamos a establecerlo en diez píxeles, por ejemplo, eso es un poco mucho. Vamos a cortarlo por la mitad a cinco. Y para el botón, digamos una altura de 60 píxeles. Veamos cómo se ve eso. Eso es demasiado, pero
creo que el espaciado es
un poco más agradable. Entonces llamémoslo la
altura a la mitad 30. Bien, eso es un
poco mejor. Y creo que el botón de publicación segura también
podría ser un poco
más grande. Entonces voy a tomar este argumento y agregarlo
a este botón de pausa segura, pero voy a hacer que
sea de 25 pixeles de alto. Es un ligero cambio, pero creo que eso es,
eso es bastante bueno. Lo último que queremos hacer
antes de pasar a llevar la funcionalidad
a la interfaz de usuario es asegurarnos de
que la lista solo tiene, solo se puede seleccionar un
elemento a la vez. Ahora, vamos, veamos cómo funciona
eso ahora mismo. Así que podemos pre-poblar esa
lista con fines de prueba. Si nos fijamos en los ejemplos, podemos agregar, vamos,
vamos a robar este
argumento, por ejemplo, anexar. Seguramente solo tomemos
los tres primeros artículos. Entonces, si decimos append
es igual al menos de ítems, vamos a estar agregando, los
vamos a estar agregando a la lista en la UI. Entonces, si tuviera que refrescar esto, ahora tenemos todos estos artículos. Entonces como sucede, ya sólo se necesita uno. Entonces la selección 11
a la vez, lo cual es genial. Si quisieras que esto
fuera multi-select doble. Hay una opción para lo
que se permite la
selección múltiple es igual a true. Ahora bien, si
por alguna razón por esta o por otra herramienta, querías que fuera multi. Para tener selección múltiple. Puede hacer permitir que la
selección múltiple sea igual a verdadero. Y cuando consultemos la
consulta la selección, obtendrá una lista
de los objetos seleccionados. Pero para el caso de esta herramienta, solo
queremos aplicar
una publicación a la vez. Así que en realidad voy
a ser explícito y decir permitir selección múltiple
es igual a falso. Ahora el comportamiento por defecto
es por supuesto falso, pero creo que tener eso
explícitamente será, será una buena adición. Pongámoslo lado a lado. Creo que eso se ve muy parecido. Es muy
más o menos lo que queremos. Así que dejemos así la interfaz de usuario. Empecemos a conectar
la función. Todo lo que hacemos.
40. Conectar la funcionalidad y compartir tus herramientas: Bien, ya podemos empezar a trabajar en la funcionalidad de la interfaz de usuario. Déjame refrescar mi código. Entonces ahora mismo para fines de
prueba, estamos agregando artículos, hazlo, pero no
queremos hacer eso. Queremos poblarlo en
base a los
archivos existentes que tenemos. Íbamos a hacer una
función llamada Add Pose. Y por cierto, lo siento, no agregué un docstring
a mi función show UI. Mostrar pose, biblioteca, URL. Este es más celular
autoexplicativo, así que realmente no
necesita el docstring, pero quiero asegurarme de
quedarme con los buenos hábitos. Así que vamos a agregar una
pose a la lista de desplazamiento. Y la forma en que lo hagamos, vamos a obtener o publicar el nombre. Y vamos a
añadir eso a la lista. ¿Cómo lo hacemos? Bueno, podemos usar
el mismo comando. Muchos de estos comandos para nosotros, pero también para tratar con
nodos permiten crear, editar y consultar información
usando todo esto y comando. Entonces voy a usar
el mismo comando. Pero ahora necesitamos saber
qué lista dónde
modificamos, ¿verdad? Entonces la forma en que lo voy a hacer, y va a ser similar a como estamos negociando la ventana. Vamos a crear
un nombre único para esta lista de desplazamiento para
que podamos usarlo
en todo el código. Entonces voy a, voy a crear una
nueva variable global llamada text list name. Y le voy a dar
un nombre único. Esos nombres, texto, lista que
debería ser lo suficientemente única. Y lo siento, se me olvidó
asignar el valor. Entonces ahora cuando cree
la lista de desplazamiento de texto, voy a crear
con ese nombre único. Y eso se hace simplemente
pasando el nombre como primer argumento a
esa función list. Lo que significa que cuando
intento editar esa lista, puedo usar ese mismo nombre para
apuntar a la misma cuadrícula de lista. Ahora, cuando esté editando una lista, si hago esto ahora mismo, María intentará crear una
nueva lista con el mismo nombre. Lo que queremos editar esa lista, voy a decir
Editar es igual a true. Y como sabes, en realidad voy a dejar, así que terminemos esto
y luego
te voy a mostrar algo en
la documentación. Lo que quiero editar es el, el, los elementos en la lista. Entonces quiero agregar nuevos
elementos a la lista. Lo que quiero hacer es
agregar este nombre de pose. Ahora bien, esto es lo
que quiero mostrarles. Vamos a la
documentación y echemos
un vistazo a este argumento. Estamos en la documentación de
listas de desplazamiento tecnológico. Y si buscamos
el argumento append, podemos ver que tiene estos colores y
estas letras aquí. C es para crear. Puedes crear una lista mientras le
agregas algo. Puede editar, lo que
significa que puede agregar cosas a
una lista existente. Y m es multiusos. Veamos qué significa eso. Esto significa que el vuelo puede tener múltiples argumentos pasados, ya sea como una tupla o una lista. Bien, eso tiene sentido porque
estamos esperando una lista. Y si vemos, vemos el tipo
que se espera. Eso en realidad es
muy engañoso. Se espera una cuerda. Pero en el ejemplo
vemos que es una lista. Da la casualidad de que
puedes hacer ambas cosas. Puede proporcionar una lista de elementos o puede
proporcionar un solo elemento. Entonces, en este caso, vamos a proporcionar un
solo elemento como una cadena. Y vamos a probarlo. Pero antes de eso,
agreguemos el docstring. Publica el nombre en la lista. Sabemos que el
nombre de la publicación es una cadena. Y creo que el nombre es
muy autoexplicativo, así que voy a saltarme
la descripción para eso. Ahí vas. Así que vamos, vamos a probarlo. Entonces, vamos a agregarle algunas poses. Una vez que ellos, una vez creado todo
, en realidad ,
incluso después de mostrar la ventana podemos agregar algunas poses, vamos a agregar la siguiente. También vamos a agregar
prueba, por ejemplo, asegurémonos de que esto esté funcionando. Entonces cuando recargo, tengo esas dos poses. Excelente. Entonces ese es el primer paso. Ahora ya sabemos
cómo editar nuestra lista. Y quiero decir,
también podríamos hacer lo mismo aquí. Podemos hacer, podemos decir UI, el Add Pose y simplemente
llamar a esto otra prueba. Y eso actualiza la
lista por ti. Genial. Entonces ahora queremos
crear una función que automáticamente poblará todas las poses para nosotros
cuando iniciemos la biblioteca. Lo primero que queremos hacer es borrar esta lista para que
podamos poblarla fresca. Es como
una función de recarga. Entonces hay un argumento
llamado remove all. Eliminar todo. Eso simplemente
aclarará la lista. Entonces, vamos a hacer eso. Vamos, en realidad vamos a
llamar a esta función. Podemos llamarlo poblar poses. Poses, o podemos llamarlo recarga. Recargar es un nuevo, mejor nombre. Recargar. Recargar poses. Lo primero que
queremos hacer es
limpiar la lista para que quede vacía. Y déjame robarme
esta línea de código. Entonces, una vez más, vamos
a apuntar a la misma lista. Vamos a editarlo. Pero ahora queremos eliminar todos. Y como puedes ver,
podemos usar ese argumento cuando creamos la lista
o la forma en que editamos la lista. Así que vamos a eliminar
todos los iguales true. Y eso debería aclarar
la lista, hacer un comentario. Y ahora queremos reunir los nombres de los
posts es que
hemos guardado en este sistema. Entonces para eso ya
tenemos una función. Recuerda que creamos
esta función que te da un
diccionario con todas las políticas que
están disponibles para ti. Así que necesitamos importar
nuestro módulo principal. Entonces podemos decir desde una biblioteca, importar Core, que
será este de aquí. Ahora desde ese módulo core, queremos obtener el diccionario post
dicción. Este diccionario
será igual a core, dot, get poses,
detect, get poses. Y como puedes ver, PyCharm
es autocompletado para mí porque estoy dentro
del mismo proyecto. Excelente. Entonces, si recuerdas, este diccionario tendrá como
clave
el nombre de las publicaciones y luego la
ruta del archivo para esa publicación. Entonces lo que nos importa en este caso es el
nombre de esas poses. ¿Cómo lo hacemos? Al obtener todas las
claves del diccionario. Ambos nombres son iguales a
poses, dictar claves. Entonces esto nos dará una lista
de claves de ese diccionario, que serán todos los
nombres que nos importan. Excelente. Así que todo lo que tenemos que hacer ahora es agregarlos a nuestra lista para que
podamos hacer un bucle for for, vamos a llamarlo nombre
por nombre en nombres. Agregar publicaciones de subrayado. Y vamos a pasar en
ese nombre de cadena. Y ellos deberían, ellos
deben cuidar. Popular en depósitos
significa que ya
no necesitamos este código de
prueba. Y podemos simplemente, voy a agregar un comentario,
llamarlo puebla poses. Cuando simplemente puede llamar a nuestra función de recarga,
recargar, publicar esto. Después de que todo haya sido
creado. Ahí vas. Vamos a probarlo. Y ahí tienes. Estas
son las políticas que teníamos anteriormente de nuestras pruebas. Ahora bien, si quieres que
los tenga en orden alfabético. Hay otra
función llamada ordenada. O también podrías decir nombres de
pose, tipo de punto. Cuál es la diferencia
es que la espada punteada ordenará tu lista en su lugar. Y la función ordenada te
dará una lista
completamente nueva. Entonces usemos este. Ordenó esos nombres. Voy a llamar a
esta lista ordenada. En realidad ordenadas
plantea ciertos nombres, voy a
llamarlo ciertos nombres. Ahora queremos recorrer
los nombres ordenados. Ahora deberían estar en orden
alfabético. Se refiere al código. Oh, en realidad, estamos viendo esta otra prueba uno porque lo estoy
agregando aquí por accidente. Entonces eso no debería estar ahí. Pero ahora cuando refresque el código, no
deberíamos ver otra prueba porque
hubo un accidente. Pero deberíamos ver las
otras políticas que
provienen de los archivos en orden
alfabético. Ahora ves que la primera
pose con mi error tipográfico
viene primero y luego viene la
prueba después. Entonces ahora estamos poblando la interfaz de usuario. Antes de seguir adelante,
la cadena de documentos, recopilar poses de archivos y
poblar, lista con ellos. No devolvemos nada. Así que en realidad puedo simplemente
dejar esto como una sola luz. Ahí vas. Lo siguiente que
tenemos que hacer es obtener la selección
del usuario para que podamos aplicar esa pose
al personaje. Hay un argumento
llamado select item en la lista de desplazamiento que puedes usar
cuando estás consultando editando
o creando. Entonces eso significa que podemos consultar ese argumento de
esa lista directamente. Entonces voy a crear una
nueva función aquí abajo, voy a llamar
get selected pose. Entonces ahora en lugar de
editar la lista, queremos seguir
apuntando a la misma lista, pero ahora queremos
consultar algo. Y lo que queremos
consultar será removido ítem. Entonces cuando estás
consultando algo, simplemente
querías decirle
a mi papá que sí, quieres consultar
eliminar lo siento, no eliminar escritura seleccionar elemento. Podemos usar esto para seleccionar algo de forma dinámica
o programática. Pero en este caso vamos
a consultar la selección. Así que vamos a consultar
select item es igual a true, simplemente para decir que sí,
por favor seleccione ítem. Así que vamos a dibujar esto en una
variable llamada selección. Ahora simplemente
devolvamos esa variable. Entonces veamos qué
obtenemos de esto. Vamos a enrollar el código. Bien, entonces ahora mismo no
hay nada seleccionado. Si te imprimimos, me puntean me seleccionan, posan. Oh, lo siento, tengo que
llamar a esa función. Vamos a conseguir un ninguno.
Entonces eso es bueno saberlo. No se selecciona nada.
No llegamos a ninguno. Si se selecciona algo, obtenemos una lista con
la selección. Y debido a
que solo estamos permitiendo una selección única, solo vamos a obtener
una lista con un solo elemento. Entonces eso es bueno saberlo. Déjame agregar eso en docstring. Vamos a decir
devuelve ya sea una cadena o en realidad déjame mantenerla consistente
y convertirla en una cadena. Siempre devuelva una cadena, obtenga el elemento seleccionado de la lista. Y podríamos hacerlo para
que si conseguimos un none, devolvamos una cadena vacía. Que pensarlo de nuevo, eso podría significar,
podría ser engañoso. Así que en realidad vamos a hacerlo para
que podamos regresar. Otra vez. Lo siento, estoy
cambiando de opinión en el acto una cuerda o en ninguna. Vamos a, vamos a hacer, agregaremos una pequeña
descripción diciendo como no,
si no se
seleccionó nada, de lo contrario, oponerse nombre,
seleccionado, pose nombre. Genial. Así que la selección. Si la selección no es ninguna. Hemos visto el regreso Ninguno. Una vez más, si acabamos de regresar, python devolverá un non de todos modos. Pero lo estoy haciendo explícito en este caso porque sí
queremos devolverlo. De lo contrario, si no ingresamos esta sentencia if y
no salimos de la función. Queremos devolver el único
artículo de nuestra selección, ¿verdad? Entonces voy a decir que el
ítem seleccionado será selección, y será el único y único
ítem primero y único en esa selección. Voy a
devolverlo. Excelente. Ahora vamos, vamos a probarlo. Déjame recargar y volver a
ejecutar el código. Genial. Entonces si imprimo la
selección ahora mismo, es un non. Si selecciono algo
que he impreso, entonces me sale el nombre de esa
pose que fue seleccionada. Genial, eso es exactamente
lo que queremos. Ahora que sabemos cómo
conseguir una selección, podemos empezar a aplicar los posts. Porque podemos obtener el post
del ítem seleccionado en la lista. Así que voy a crear
una nueva función llamada aplicar manguera seleccionada aquí. En realidad, la voy a crear por encima de esta función
que estoy usando. Para obtener la selección. Genial. Entonces lo primero que
tenemos que conseguir es la pose seleccionada. Y eso lo obtenemos de la
función que acabamos de crear. Seleccione ambos. Ya que
esta es la función que estará aplicando las poses cuando le agregues
algunas comprobaciones. Entonces, si no se seleccionó nada, puede decir si la pose no seleccionada o si la pose seleccionada es ninguna, cualquiera de ellas
será válida si se conoce la pose
seleccionada
o si no se selecciona la pose. Vamos a advertir al usuario. Digamos que asuma la mañana. Por favor, seleccione un pulso y simplemente salga de la
función regresando. Lo siguiente que tenemos que hacer, ya que estamos aplicando poses
para seleccionar el personaje, es asegurarnos de que el usuario seleccionó algo,
seleccionó un personaje. Entonces podemos decir nombres
seleccionado o espacios de nombres porque puede ser
múltiples iguales. Y aquí es donde empezamos a usar el código de
nuestro proyecto anterior. Si recuerdas, nuestro módulo
post transfer tiene una buena
función select namespaces, que podemos usar. En este caso, voy a importar post underscore transfer. Ahora desde la transferencia posterior, puedo obtener la función get selected
namespaces. Una vez más, sabemos que
si no se seleccionó nada, vamos a obtener una
lista vacía de esta función. Entonces puedo decir, si no,
seleccionamos los espacios de nombres, lanzamos otro, lanzamos otra advertencia
al usuario, diciendo: Por favor seleccione al menos un rastrillo y salimos de la función. El siguiente paso es obtener
la pose que queremos, lo que significa que necesitamos
obtener el archivo que corresponda al
post que elegimos. Para ello, necesitamos obtener los carteles que
ya se han guardado. Poses guardadas. Sabemos que podemos obtener eso de una función que ya
usamos que para poblar nuestra interfaz de usuario está
en el módulo core. Obtener poses dict. Ahora, como usamos ese mismo diccionario
para poblar nuestra lista, sabemos que la
selección de esa lista debe corresponder a una de
las claves del diccionario. Pero existe la posibilidad de que mientras estamos trabajando con una herramienta, ese archivo fue eliminado, en cuyo caso no
vamos a poder obtenerlo. Por lo que debemos agregar un chequeo
rápido para eso. Podemos decir, si
pose seleccionada no en poses guardadas, básicamente
estamos diciendo que
si esta pose
no está en la clave en
el diccionario, podemos hacerlo
directamente así o
podemos decir teclas de punto o pollo
la lista de claves directamente. Lo que sólo voy a
dejarlo así. Entonces si esa
pose seleccionada no está en, guardaron el diccionario de poses, lo
que significa que no es una
clave en el diccionario, entonces no tenemos nada que
aplicar, ¿verdad? Entonces podemos lanzar
otra advertencia
al usuario diciendo esa pose. Ahora voy a añadir
el nombre de la pose. Entre comillas. Voy a añadir
comillas dobles, corchetes como marcador de posición. Digamos que no existe. Entonces voy a
decir formato de punto. Y luego mostrar al usuario la
pose que fue seleccionada. Y luego después de la advertencia, salga de la función regresando. Y finalmente, una vez
que pasamos, pasamos por todos
los cheques y todo
parece estar en orden. Tenemos una selección
en la lista de poses. Tenemos una selección en escena para uno o más personajes. Sabemos que las publicaciones existen. Ahora podemos obtener el
archivo de esa pose. Archivo de pose es igual una
vez más, poses guardadas. Voy a renombrar
esto para guardar, para publicar como dict, para que sea más
explícito para ti. Guardado ambos pegados,
podemos simplemente obtener, ahora que sabemos que esa
claves en el diccionario, podemos obtener el valor de eso,
que una vez más
será la ruta del archivo. Para que se seleccionara pose es la clave en ese diccionario. Ahí estará el archivo. Entonces necesitamos obtener la
información de ese archivo. Esa sería la pose que queremos aplicar
a nuestros personajes. Ahora, para hacer eso, ya
tenemos la
funcionalidad en core. Lo llamamos leer publicaciones
desde archivo, leer desde archivo. Y eso tomará una ruta de archivo, que es su pose
mientras variable. Excelente. Ahora todo lo que tenemos que hacer es
volver a reutilizar
la, la
funcionalidad post-trasplante y aplicarla a todos los
espacios de nombres que hemos seleccionado. Y eso se aplicará a los puestos. Tomamos en un
diccionario de post y un espacio de nombres. Como estamos permitiendo
múltiples espacios de nombres, simplemente
podemos recorrer
esa lista. Entonces, para el espacio de nombres en espacios de nombres seleccionados
, publicar guión bajo, transferir punto aplicar
pose tomará diccionario
opuesto
y el espacio de nombres para aplicarlo a su ego. Y antes de probarlo, déjame hacer mi docstring. Y digamos Aplicar
políticas seleccionadas para seleccionarlo. Y no vamos
a devolver nada. Entonces esto puede ser una cadena de documentos de una
sola línea. Entonces no lo hemos conectado
a un botón, pero podemos
probarlo sin tener la conexión.
Vamos a entrar en Maya. Vamos a recargar la interfaz de usuario. Ahí vas. Se llama aplicar pose seleccionada. Entonces podemos hacer, podemos decir UI
dot aplicar pose seleccionada. Hagamos algunas pruebas. Tenemos que seleccionar una pausa. Tiene sentido. Tenemos que seleccionar al menos un personaje que tenga sentido. Ahora si seleccionamos el carácter, corremos en, ese post
debería ser aplicado. Ahora. Ahora bien, esta es probablemente
la misma pose que salvamos. Cambiemos un poco a este
personaje. Y apliquemos
eso. Ahí vas. Entonces la primera, esta primera pose
que se salvó fue para el sombrero, lo
que significa que solo está
moviendo ese controlador. Pero ahí tienes. Entonces ahora que tenemos
esta función, podemos empezar a conectarla
al botón de post difícil que por el momento no
está haciendo nada. Volvamos a PyCharm y
podemos aplicar botón de arcos. Simplemente podemos decir comando
es igual a aplicar puestos seleccionados. Ahora recuerda que estamos pasando
en la función misma. No queremos
llamarlo porque entonces estaríamos dando
el argumento command, el resultado de esa función. Y eso no es lo que queremos. Queremos darle
la función para
que pueda llamar a la
función misma. Entonces ahora si recargamos nuestro código y hacemos clic en el
botón, tenemos un error. Toma argumentos con
un argumento dado. Ahora bien, si recuerdas
de nuestra herramienta anterior, el botón que conectamos, el botón de transferencia seleccionado, tuvimos que dar cuenta de un argumento
extra aleatorio. Entonces se nos da mi N. Y usamos este argumento de args
estelares, una especie de catch-all para los
argumentos pasados por mi. Así que simplemente podemos volver a hacer eso. No va a cambiar la
funcionalidad de la herramienta. Simplemente nos permitirá resolver
lo que Maya nos está dando. Suministros. Me gustaría posar, ni
siquiera lo estamos usando. Solo lo estamos usando como una, como una red para atrapar
ese argumento extra. Ahora bien, si muevo este controlador
y vuelvo a aplicar ese post. Ahora esto está funcionando. Y claro,
podemos aplicar esa pose múltiples personajes
siempre y cuando tengan sombrero. En este caso. Ahí vamos. La última parte restante de nuestra herramienta es la
capacidad de guardar poses. Y el primer paso para
hacerlo es obtener la entrada
del usuario para elegir el nombre de la pose que
vamos a guardar. Entonces para hacer eso, vamos
a estar usando el campo de texto. Y si estás
adivinando que necesitamos darle un nombre único
como lo hicimos con la ventana. Lo hicimos con las listas desplazadas. Tienes toda la razón. Entonces déjame seguir adelante y crear
una nueva variable global. Vamos a llamarlo campo de texto. Nombre es igual a pose. Llamémoslo guardar
esos campos de texto. Ahora bien, el nombre real no
importa siempre y cuando
sea lo suficientemente único. Genial. Entonces, cuando creamos
nuestro campo de texto, necesitamos proporcionar
ese nombre, nuevamente como el primer argumento
en esa función de campo de texto. Y poder
meter el texto que se escribe en eso,
en ese campo. Hay un argumento. Entramos en la documentación. Durante el TextField,
hay un argumento llamado texto. Debería estar por aquí. Ahí tienes, texto. Para que podamos usarlo cuando
creamos un campo de texto, modo que esté prepoblado. Podemos editarlo, editar el texto en el campo de texto, o podemos consultar. Entonces vamos a estar
demostrando ese texto. Sigamos adelante y creamos una nueva función llamada save pose. Podemos hacer todo dentro
de esta misma función. Y como sabemos
vamos a estar conectando esto al botón de pausa segura. Agreguemos que los args estelares son una especie de atrapa-todo por el argumento que sabemos que el mío nos
va a dar. Entonces para obtener el nombre de
la pose del, del usuario, Vamos a llamarlo. Llamemos a esta variable
llamada nombre de publicación. Perdón por esto. El nombre es igual. Vamos a tratar con la función
TextField. Una vez más,
vamos a estar apuntando exactamente
al mismo
campo de texto que creamos. Vamos a consultar
información de él. Vamos a decir query es igual a true. Ahora puedes escribir q es igual a true o
consulta pasa por, lo siento, consulta, ambas son válidas. Y ahora cada vez que
estés consultando, vas a usar un booleano para el argumento que
quieres consultar. Si miras la
documentación, te
está pidiendo una cadena. Pero cuando estés
consultando algo, una vez más, ignora
ese argumento, ignora esa parte de
la documentación, y simplemente escribe un booleano. Entonces solo como una prueba, devolvamos ese nombre de publicación
y veamos qué obtenemos de ella. Entonces voy a recargar nuestro código. Y podemos decir punto save pose. Eso lo sabemos ahora mismo. Mientras tanto,
simplemente nos da el nombre de las publicaciones
o lo que sea que escribamos. Ese campo de texto,
impresión segura, Bose. No hay nada en ella, lo que
significa que es una cadena vacía. Pero si escribo post
nombre mis publicaciones, por ejemplo voy a estar consiguiendo eso. Entonces eso es genial. Entonces sabemos que si no
se escribe nada ahí, obtenemos una cadena vacía. Podemos agregar un cheque para eso. Todavía hay formas de hacerlo. Podemos decir
si nombre es igual, es igual a cadena vacía,
daremos una advertencia o una cadena vacía se
puede comercializar como no o como una lista
vacía, una lista vacía. Entonces se podría decir, si no
Publica subrayado nombre, hacemos una advertencia. Y vamos a decir, por favor
hola, oponerse nombre. Una vez más, salimos de la
función regresando. Entonces me gusta ser un
poco más explícito. Así que voy a cambiar esto de
nuevo a si el nombre de la publicación es
igual, es igual a cadena vacía significa que nada fue
escrito por el usuario. Y luego tiramos la
advertencia y regresamos. Y voy a quitar esta devolución aquí porque eso fue sólo para pruebas
temporales. El siguiente paso es conseguir la
pose que vamos a decir que necesitamos para obtener el, comprobar la selección
en esta escena. Entonces, como sabemos, vamos a
guardar los controladores que
se seleccionen. Y lo estamos
limitando a un personaje. De hecho, podríamos permitir múltiples caracteres y simplemente guardar todos esos controladores. Y supongamos que si quieres,
esa es tu elección. Para estos casos, sin embargo, voy a limitarlo
a un solo personaje. Entonces para hacer eso, podemos robar parte
del código de aquí. Todavía podemos seleccionar
un espacio de nombres. En realidad, déjame
robarme todo esto. Esto es un cheque. Voy a copiarlo aquí. Estoy robando de aplica
seleccionado posado, por cierto. Porque en
pose seleccionada aplicada también estamos comprobando la selección de
espacios de nombres o plataformas. Así que seleccionando espacios.
Ahora en este caso, queremos asegurarnos de que solo
tenemos una plataforma seleccionada. Entonces podemos, podemos escribir si len de seleccionados en
espacios no es uno. Podemos lanzar una advertencia
diciendo Seleccionar, seleccionar la plataforma en la escena. Mostramos su advertencia
y luego regresamos. Después de eso, necesitamos
otro cheque. Recuerda que
dijimos que queremos que las poses para que los
nombres de las poses sean únicos. Entonces si oponerse ya existe, no
podemos sobrescribirlo. A lo mejor tú, a lo mejor
quieres anularlo. Eso está perfectamente bien.
Pero en este caso, vamos a decir,
vamos a lanzar una advertencia al usuario diciendo
que la publicación ya existe. Por favor, elija otro nombre. Para eso. Vamos a conseguir. La pose es diccionario. Una vez más. De la pose seleccionada aplicada, vamos a robar
este diccionario una
vez más, poses guardadas, dict. Y permítanme agregar algunos
comentarios aquí solo para, para hacer un seguimiento de lo que está
sucediendo. Aquí. Estamos comprobando,
verificando o
validando o invalidando esos nombres. Aquí vamos a
validar la selección vista. Selección. Y estoy dejando
espacio entre ellos, solo dales
algo de transpirabilidad para que sea un
poco más agradable de ver. Aquí, valide la manguera única. Entonces obtenemos las poses del archivo. También podríamos sacar las poses
de la lista. Pero obtenerlos de los
archivos es más confiable o confiable porque realmente lo estamos
obteniendo de la fuente. Entonces, si la herramienta pasa
a no estar actualizada, aún
podemos verificar la verdadera
fuente de los carteles, que es el sistema de archivos. Entonces podemos decir, si podemos escribir, perdón, si el nombre del puesto ya
es clave en el diccionario. Entonces, si el nombre de pose en
está en pausas guardadas, dict es igual a nombre es
impulso está marcado. Una vez más, advertimos al usuario. Vamos a decir pose. Vamos a poner el nombre
de las citas
posando entre llaves como colocadores es lo que
voy a decir ya existen. Por favor, elija otro nombre. Ahí vamos. Y luego voy a
decir formato de punto y decirle al usuario el nombre de
la pose que proporcionaron. Nombre del puesto. Una vez más,
salimos regresando. Ahora por fin, después de
tener todos los
cheques que necesitamos, podemos durar más que guardar nuestras publicaciones. Entonces lo primero que
tenemos que hacer es conseguir el post diccionario que era otra pose que fue
seleccionada en la escena. Entonces los controladores
que son seleccionados por el usuario en forma
de diccionario. Una vez más, tenemos esta
funcionalidad de nuestro proyecto anterior, anterior
en post transfer, post transfer, get, pose, dict. Ahora esta función
obtendrá un solo espacio de nombres. Ya que sabemos que nuestros espacios de nombres
seleccionados menos deberían
contener solo un espacio de nombres. Podemos decir con seguridad,
o podemos decir, proporcionar de
manera segura el primer elemento de esa lista de
espacios seleccionados a nuestra función. Entonces habrá un
solo espacio de nombres. Y ahora que tenemos
el diccionario, todo lo que tenemos que hacer es
guardarlo en nuestro archivo. Y ya tenemos
esa función también. Entonces eso será en core
punto escribir publicaciones para archivar. Y esa función recibirá el nombre de los posts o el nombre del archivo que
queremos guardar, que es el nombre
de la pose y los valores o el diccionario
que queremos almacenar. Supongamos nombre, pose, dict. Y vamos a imprimir simplemente no nos plantea
información guardada. Vamos a decir pose salvada
con éxito. Una vez más,
déjame arreglar este error tipográfico. Una vez más, los
corchetes son marcadores , formato de
punto y nombre de publicación para
mostrar el nombre de las publicaciones. Y por último, una vez
que hayamos guardado el post, queremos recargar o
refrescar la herramienta. Entonces podemos decir Recargar poses para mostrar los
posts más recientes que guardamos. Excelente. Así que sigamos adelante y
probemos esto en nuestra escena. Oh, bueno, antes de hacer eso, simplemente
podemos conectarnos
al botón. Hemos pasado por
esto múltiples veces. Entonces comando equivale a pose segura. Una vez más, solo
proporciona una función, no llame a la función
porque eso le dará el resultado a ese argumento de
comando. Queremos, queremos que el botón llame
a la función por nosotros. Entonces, vengamos aquí. Y eliminemos esta
línea que estaba protestando. Recarguemos nuestro código. Intentemos salvar oponerse. Déjame hacer un cambio en el brazo de
estos personajes. Ahí vas. Está un poco roto, pero será muy
obvio cuando apliquemos. De hecho,
llamémoslo un brazo roto. No necesitamos que el
subrayado bien despierto sea un espacio también. Brazo roto, guarda la pose. Que ambos aparecen aquí arriba. Y tenemos aquí la concentración que es una publicación guardada
con éxito. Y eso podemos aplicarlo
a este personaje. Y ahí tienes. Si
quieres ser más explícito con tu
confirmación, podríamos, en lugar de simplemente
imprimir un mensaje, podríamos mostrarle al
usuario una pequeña ventana. Hay una función
en C en esto, en esta biblioteca llamada diálogo
confirmado que
toma en un mensaje, puede escribir mensaje igual. Y podemos pasar aquí en este
mensaje. Ahí vas. Confirmar diálogo. Tenemos ese mensaje. Podemos recargar nuestro código. Podemos guardar un nuevo post, los
nuevos de Bose que él salvó. Obtenemos este
diálogo de confirmación o el usuario. Entonces depende de ti si quieres el diálogo o simplemente
imprimir declaración. Y ya terminamos, ahora tienes un puesto de trabajo Herramienta de
biblioteca que
se puede usar para guardar y aplicar
poses a través de mis
suposiciones son desiguales, se
puede compartir con otras
personas, tus amigos, compañeros de trabajo, cualquiera
que use Maya. Enhorabuena, Este fue el proyecto más grande
del curso. Ahora, antes de irnos, quería mencionar
algo sobre los módulos. Hasta el momento, hemos estado trabajando dentro de estos documentos, carpeta de scripts
mayas. Y eso es porque sabemos que Maya puede obtener código de ahí. Ahora, déjame ir a ese lugar. Está aquí. Nuestro código está todo aquí. ¿Hay otras ubicaciones de
donde puedo obtener código? El otro. La popular está dentro
de la versión Maya. Hay otra carpeta de scripts. Entonces esto es sólo para
mi promedio en 2020. Y el con el que estamos
trabajando es algo más global para
todas mis aberraciones. Pero ahora eso plantea la pregunta, ¿cómo sabemos exactamente de dónde
obtengo el código? ¿Eso? Hay otro módulo o biblioteca que se llama se sienta ASIS. Asis, Eso es sinónimo de sistema. Hay una lista
ahí llamada ruta. Entonces, si imprimo sys.path, obtengo una lista de las rutas de
las que Python y Maya
pueden obtener código. Entonces como es una lista, déjame recorrerla. Porque yo en es un camino. Hola, ahí tienes. Estas son todas las partes.
Hay muchos de ellos. Si tienes plugins instalados.
Déjame correr eso otra vez. Si tienes algún
plugin instalado, algunas de las rutas para esos
plug-ins estarán aquí. Y también están los que estamos usando
aquí en la parte inferior. Entonces, los scripts de 2020 para la migración
están usando scripts mayas, que es aquel en el
que tenemos nuestro código ahora mismo. Entonces esto es, puedes poner
tu código en cualquier parte de aquí. Pero si quisieras agregar
una ubicación diferente, ya que esta es una lista, simplemente
puedes agregar a
esta ruta que puedes anexar. Así que imaginemos que tenemos
una carpeta personalizada, personalizada en. Digamos que estás
trabajando en un estudio o estás trabajando en un proyecto
con tus amigos y
quieres tener tu código
y buzón o en una ubicación común compartida donde todos puedan
acceder al código. He creado una
carpeta como ejemplo. Ahora, comencemos. Imaginemos que
esta es una carpeta a la que muchas personas de tu red
pueden tener acceso. Puedes, ¿quieres
tener tu código aquí? Así que vamos a mover nuestro código o
vamos a copiar nuestro código de los documentos Maya scripts ubicación a esta otra carpeta. Para publicar biblioteca se transfirió. Vamos a usar la
biblioteca de correos ordenada y la transferencia posterior. Voy a copiar
eso aquí. Como es en estos momentos, Meier no tiene idea de
esta ubicación, ¿verdad? Lo que podemos hacer es simplemente
modificar esa lista. Permítanme dibujar esto en una
variable llamada path. Y voy a poner la R
al principio por si
acaso lo que podemos hacer es comprobar
si el camino ya existe. Entonces si o si no
existe realmente, si no hay ruta, no en serie, ruta de punto, simplemente
hemos agregado a esa ruta, dice ruta de punto, anexar punto. Ahí vas. Entonces como ejemplo, ya estamos cargados los módulos desde la ubicación de los
scripts, no
quiero
confundirte. Así que permítanme crear un módulo
completamente nuevo llamado Hello path, por ejemplo, y vamos a llamar a esto. Vamos a cambiar el nombre de la extensión
TXT de punto a punto p-y. Excelente. Y estoy simplemente, voy a abrir esto con
Bloc de notas para una edición rápida. Ahí vas. Voy a añadir una sencilla función llamada hola. Hola, o sobre
todo además, y simplemente vamos a
imprimir hola ruta personalizada. Genial. Entonces ahora mismo, si intento
importar hello path, voy a ir a una
nueva consola de Python. Si importo hola. Por supuesto que mis otros lo
saben. Dirá que no hay ningún
módulo llamado Hello path. Pero si agrego mi, mi ruta personalizada que
dice ruta de punto. Y una vez más, si
hago bucle sobre él, impreso para I en Bloc de Notas, voy a ver que nuestro
camino está al final del mismo. Tan corto código, genial. Entonces ahora que está en ruta Python, puedo importar Hello path. Si imprimo hola, hola subrayado
path, puedes ver que es un módulo que viene
de esa ubicación compartida. Y ahora podemos usar esa función que escribí que
simplemente se llama hola. Y está imprimiendo
nuestra cadena personalizada. Entonces ahí lo tienes. Quería
mencionarlo como extra porque si
vas a estar trabajando con otras personas y
quieres compartir tu código. Esta será la forma
más fácil de hacerlo. Podrías poner todo el código de
tu biblioteca de correos. De nuevo en una ubicación compartida. Simplemente tenga un script de estantería que agregue su
ruta personalizada a la sesión Maya. Tienes que hacer esto por cada
minuto de sesión, por cierto. Y entonces tienes código que se
está compartiendo con
varias personas.