Introducción a la programación de Python para animadores mayas | Anim TD | Skillshare

Velocidad de reproducción


1.0x


  • 0.5x
  • 0.75x
  • 1x (Normal)
  • 1.25x
  • 1.5x
  • 1.75x
  • 2x

Introducción a la programación de Python para animadores mayas

teacher avatar Anim TD, Technical Education for VFX & Animation

Ve esta clase y miles más

Obtenga acceso ilimitado a todas las clases
Clases enseñadas por líderes de la industria y profesionales activos
Los temas incluyen ilustración, diseño, fotografía y más

Ve esta clase y miles más

Obtenga acceso ilimitado a todas las clases
Clases enseñadas por líderes de la industria y profesionales activos
Los temas incluyen ilustración, diseño, fotografía y más

Lecciones en esta clase

    • 1.

      Introducción

      0:44

    • 2.

      Resumen de Editor de Script

      7:47

    • 3.

      Tu primer programa de Python: Hello Maya

      11:28

    • 4.

      Biblioteca e importación de ingredientes de cmds

      6:56

    • 5.

      Proyecto 1 - Herramienta de aparejo de prop: introducción

      1:02

    • 6.

      Desglose de herramientas

      3:47

    • 7.

      Crear la herramienta

      7:25

    • 8.

      Modificar el control

      11:38

    • 9.

      Deep Dive - Ayuda y documentación

      9:03

    • 10.

      Trabajar con nombres de nodos y listas

      9:54

    • 11.

      Extender la herramienta con declaraciones "si"

      18:49

    • 12.

      Buca profunda - "si" Declaraciones y booleanos

      8:46

    • 13.

      Introducción a las funciones

      29:00

    • 14.

      Convierte el código en una función

      14:23

    • 15.

      PyCharm - instalar y configurar

      10:15

    • 16.

      Crear un módulo

      10:11

    • 17.

      Buceo profundo - funciones

      31:51

    • 18.

      Proyecto 2 - Herramienta de transferencia de poste: introducción y aversión

      11:17

    • 19.

      Espacios de nombres y listas

      6:12

    • 20.

      Selección y bucles "para "

      10:12

    • 21.

      Resumen de los Loops

      3:09

    • 22.

      Obtener atributos

      20:03

    • 23.

      Almacenar la postura - introducción a los diccionarios

      10:19

    • 24.

      Almacenar la dosis - Construir el diccionario de poste

      23:07

    • 25.

      Aplicar la dosis

      33:14

    • 26.

      Construir la función principal de "transferencia"

      22:50

    • 27.

      Intro a las UIs

      21:06

    • 28.

      Crear la interfaz de usuario

      11:59

    • 29.

      Recap proyecto

      1:40

    • 30.

      Buceo profundo - cuerdas

      23:43

    • 31.

      Buceo profundo - bucles

      15:05

    • 32.

      Buceo profundo - Listas, tuples, conjuntos

      32:23

    • 33.

      Buceo profundo - diccionarios

      23:33

    • 34.

      Proyecto final - Biblioteca de poste: introducción

      1:54

    • 35.

      Crear el paquete de Python

      5:16

    • 36.

      Trabajar con archivos

      10:51

    • 37.

      Guardar postes en los archivos JSON

      9:38

    • 38.

      Lectura plantea a partir de archivos JSON

      13:57

    • 39.

      Crear la interfaz de usuario

      30:07

    • 40.

      Conectar la funcionalidad y compartir tus herramientas

      45:00

  • --
  • Nivel principiante
  • Nivel intermedio
  • Nivel avanzado
  • Todos los niveles

Generado por la comunidad

El nivel se determina según la opinión de la mayoría de los estudiantes que han dejado reseñas en esta clase. La recomendación del profesor o de la profesora se muestra hasta que se recopilen al menos 5 reseñas de estudiantes.

157

Estudiantes

3

Proyectos

Acerca de esta clase

¡Bienvenido a esta introducción a la programación de Python para animadores mayas!

Aprende a crear tus propias herramientas, automatizar partes tediosas y aburridas de tu flujo de trabajo y ayudar a ti y tu equipo a trabajar mucho más eficientemente.

Como sugiere el título, el curso será más accesible a los animadores, así como a los artistas de diseño y rigidez, principalmente debido a la naturaleza de los proyectos, sin embargo cualquier persona que trabaje en Maya podría beneficiarse de las conferencias si están buscando aprender programación de Python.

Ya sea que solo estés buscando mejorar tu trabajo diario o considerar cambiar a un rol técnico, ¡estoy seguro de que este curso te acercará un paso más a tu meta!

¿Qué es cubierto?

  • Conceptos de programación básicos en Python: bucles, si declaraciones, funciones, listas, diccionarios etc.
  • Técnicas fundamentales y mejores prácticas: incluso si se trata de un curso para principiantes aprenderás algunas mejores prácticas que usan los TD y desarrolladores profesionales.
  • Biblioteca de cmds de maya: las habilidades que adquirirás son amplias habilidades de programación, pero los proyectos utilizan mucho la biblioteca de cmds ya que las herramientas que se crean son para Maya.
  • Herramientas de producción: terminarás el curso con herramientas reales que puedes usar en tu trabajo.
  • UIs: aprenderás cómo crear UIs usando las bibliotecas integradas en Maya.

¿Qué NO está cubierto?

  • Clases de Python: las clases son una parte esencial de Python, y podrían estar incluidas en el futuro, sin embargo, puedes crear algunas herramientas y scripts muy poderosos sin ellos, por lo que no se enseñan en este curso. Dicho esto, una vez que aprendas los conceptos cubiertos en este curso podrás entender fácilmente las clases.
  • PyQt: Qt requiere una buena comprensión de las clases, y es un marco de interfaz de usuario más avanzado que incluso podría valer la pena estar en un curso separado. Para este curso introductorio el enfoque está en las características de la interfaz de usuario de la biblioteca de cmds que siguen siendo muy útiles y más fácil de dominar para alguien que acaba de comenzar a aprender.

¿A quiénes está dirigido este curso?

  • Artistas mayas: este curso NO te enseñará cómo usar la maya, puedes aprender algunos nuevos trucos mayas, pero se supone que tienes algunos conocimientos básicos de la maya (aunque no necesitas ser avanzado en absoluto).
  • Completa a los principiantes o personas con algún conocimiento básico de Python.
  • Programadores que buscan familiarizarse con Python para Maya. El contenido está dirigido a principiantes, pero los proyectos podrían ayudar a alguien a familiarizarse con Maya y sus bibliotecas.

¿Para quién no es este curso?

  • Programadores intermedios a avanzados: si ya tienes una buena comprensión de conceptos como funciones, estructuras de datos básicas, mutabilidad, para bucles, etc., podría beneficiarse de un curso más avanzado.

La mejor manera de acercarse al curso:

  • Sigue los proyectos en orden: los proyectos están diseñados para introducir nuevos conceptos de forma natural cuando se necesitan, desde los más básicos hasta los más complejos, y cada proyecto reutilizará los conocimientos anteriores.
  • Dives profundos: las inmersiones profundas te dan un descanso del proyecto para profundizar más en un tema específico. Se colocan después de que un concepto se ha introducido, es posible que quieras verlos inmediatamente después de aprender el concepto, pero también puedes tratarlos como una biblioteca de referencia para volver en el futuro.
  • Código fuente: observa los recursos de cada conferencia, tendrás que descargar los archivos con el código fuente para una parte del proyecto.
  • Video Timestamps de tiempo: desafortunadamente esta plataforma no ofrece marcas de tiempo en los videos, pero podrás descargar archivos de texto (en recursos) con códigos de tiempo para puntos importantes de la conferencia.
  • Cuestionarios y ejercicios: encontrarás cuestionarios y ejercicios de codificación después de algunas conferencias, estos son opcionales, pero una excelente manera de practicar.

Preguntas frecuentes

  • ¿Puedo convertirme en TD con este curso?
    • Este es un curso principiante que podría no ser suficiente para conseguir un trabajo como TD profesional, pero definitivamente te dará una sólida base para continuar aprendiendo lo que necesitas.
  • ¿Esto ayudará a mi carrera?
    • Podría hacerlo, pero depende de tus objetivos, definitivamente te convertirá en un activo como alguien que tenga habilidades tanto artísticas como técnicas. Si te estás inclinando hacia una carrera técnica, esto te dará una buena base para continuar en ese camino, lo que puede conducir a una carrera muy gratificante, estable y bien pagada.
  • ¿Puedo incluir este curso en mi LinkedIn?
    • Esta no es una certificación (todavía), sin embargo, definitivamente podría beneficiarte de mencionar que completas este curso de Python.
  • ¿Qué pasa si soy un estudiante y no conozco muy bien la animación o Maya
    • Eso está bien, no necesitas ser un profesional no un usuario avanzado. Conocer los conceptos básicos como navegar la ventana y crear un cubo te permitirá empezar, puede que haya cosas que no estés familiarizado con ellas, como las referencias de aparcacoches, pero puedes aprender fácilmente de un tutorial gratuito en línea.
  • ¿Puedo usar una versión Maya más antigua?
    • Puedes hacerlo, la mayoría de los comandos mayas cubiertos funcionarán, sin embargo, no hay garantía de que todos los quieran. Si ese es el caso, puedes usar la sección de preguntas y respuestas (o una búsqueda rápida de google) para obtener ayuda.
  • ¿Esto solo para animadores?
    • No necesariamente. Los proyectos están relacionados con la animación, que estará mucho más familiarizado con alguien que trabaja con la animación, diseño o rigging que con alguien que se centra en la iluminación, por ejemplo, pero los conceptos de programación reales cubiertos son aplicables a todos los departamentos.

Conoce a tu profesor(a)

Teacher Profile Image

Anim TD

Technical Education for VFX & Animation

Profesor(a)

Hi! I'm Fernando, a technical director with a passion for helping artists work better and more efficiently.

 

As a TD I've worked on films and tv shows such as Once Upon a Time, Arrow, The Lego Movie 2, Peter Rabbit 2, DC League of Super-Pets and more.

 

Before becoming a TD I was a 3D animator, I loved animation but I also fell in love with the power of programming which launched me into the long and tedious process of figuring out how to create things with Python as an artist. That, along with the many times I was asked by other animators "how do I learn coding?", is why I decided to create this course.

 

I've been through that challenging learning journey, now I'm here to help you with it!

<... Ver perfil completo

Level: Beginner

Valoración de la clase

¿Se cumplieron las expectativas?
    ¡Superadas!
  • 0%
  • Sí
  • 0%
  • Un poco
  • 0%
  • No realmente
  • 0%

¿Por qué unirse a Skillshare?

Mira las galardonadas Skillshare Originals

Cada clase tiene lecciones cortas y proyectos prácticos

Tu membresía apoya a los profesores de Skillshare

Aprende desde cualquier lugar

Ve clases sobre la marcha con la aplicación de Skillshare. Progresa en línea o descarga las clases para verlas en el avión, el metro o donde sea que aprendas mejor.

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.