diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..930febe --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,353 @@ +{ + // ========== Visuals ========== + "editor.cursorSmoothCaretAnimation": "on", + "editor.fontFamily": "CaskaydiaCove Nerd Font", + "editor.guides.bracketPairs": "active", + "editor.lineNumbers": "on", + "editor.renderWhitespace": "none", + "window.autoDetectColorScheme": false, + "workbench.colorTheme": "GitHub Dark", + "workbench.editor.tabActionLocation": "left", + "workbench.fontAliasing": "antialiased", + "workbench.list.smoothScrolling": true, + "workbench.preferredDarkColorTheme": "GitHub Dark", + "workbench.preferredLightColorTheme": "GitHub Dark", + "workbench.productIconTheme": "fluent-icons", + "workbench.sideBar.location": "left", + "workbench.startupEditor": "newUntitledFile", + "workbench.tree.expandMode": "singleClick", + "workbench.tree.indent": 4, + // ========== Editor ========== + "debug.onTaskErrors": "debugAnyway", + "diffEditor.ignoreTrimWhitespace": false, + "editor.wordSeparators": "`~!@#%^&*()=+[{]}\\|;:'\",.<>/?", + "editor.find.addExtraSpaceOnTop": false, + "editor.inlineSuggest.enabled": true, + "editor.multiCursorModifier": "ctrlCmd", + "editor.suggestSelection": "first", + "editor.tabSize": 2, + "editor.unicodeHighlight.invisibleCharacters": false, + "editor.stickyScroll.enabled": false, + "terminal.integrated.stickyScroll.enabled": false, + "workbench.tree.enableStickyScroll": true, + "editor.hover.sticky": true, + "editor.codeActionsOnSave": { + "source.fixAll": "never", + "source.fixAll.eslint": "never", + "source.organizeImports": "never" + }, + "explorer.confirmDelete": false, + "explorer.confirmDragAndDrop": false, + "files.eol": "\n", + "files.insertFinalNewline": true, + "files.trimFinalNewlines": true, + "files.simpleDialog.enable": true, + "git.autofetch": true, + "git.confirmSync": false, + "git.enableSmartCommit": true, + "git.untrackedChanges": "separate", + "scm.diffDecorationsGutterWidth": 2, + "terminal.integrated.cursorBlinking": true, + "terminal.integrated.cursorStyle": "block", + "terminal.integrated.persistentSessionReviveProcess": "never", + "terminal.integrated.tabs.enabled": false, + "terminal.integrated.fontSize": 14, + "workbench.editor.closeOnFileDelete": true, + "workbench.editor.highlightModifiedTabs": true, + "workbench.editor.limit.enabled": true, + "workbench.editor.limit.perEditorGroup": true, + "workbench.editor.limit.value": 5, + "search.exclude": { + "**/*.snap": true, + "**/*.svg": true, + "**/.git": true, + "**/.github": false, + "**/.nuxt": true, + "**/.output": true, + "**/.pnpm": true, + "**/.vscode": true, + "**/.yarn": true, + "**/assets": true, + "**/bower_components": true, + "**/dist/**": true, + "**/logs": true, + "**/node_modules": true, + "**/out/**": true, + "**/package-lock.json": true, + "**/pnpm-lock.yaml": true, + "**/public": true, + "**/temp": true, + "**/yarn.lock": true, + "**/CHANGELOG*": true, + "**/LICENSE*": true + }, + "window.nativeTabs": true, // this is great, macOS only + "window.title": "${rootName}", // this make tabs more readable + "extensions.autoUpdate": "false", + // ========== Extension configs ========== + "emmet.showSuggestionsAsSnippets": true, + "emmet.triggerExpansionOnTab": false, + "errorLens.enabledDiagnosticLevels": [ + "warning", + "error" + ], + "errorLens.excludeBySource": [ + "cSpell", + "Grammarly", + "eslint" + ], + // ESLint config: https://github.com/antfu/eslint-config + "eslint.codeAction.showDocumentation": { + "enable": true + }, + "eslint.quiet": true, + // Silent the stylistic rules in you IDE, but still auto fix them + "eslint.rules.customizations": [ + { + "rule": "style/*", + "severity": "off" + }, + { + "rule": "format/*", + "severity": "off" + }, + { + "rule": "*-indent", + "severity": "off" + }, + { + "rule": "*-spacing", + "severity": "off" + }, + { + "rule": "*-spaces", + "severity": "off" + }, + { + "rule": "*-order", + "severity": "off" + }, + { + "rule": "*-dangle", + "severity": "off" + }, + { + "rule": "*-newline", + "severity": "off" + }, + { + "rule": "*quotes", + "severity": "off" + }, + { + "rule": "*semi", + "severity": "off" + } + ], + "eslint.validate": [ + "javascript", + "javascriptreact", + "typescript", + "typescriptreact", + "vue", + "html", + "markdown", + "json", + "jsonc", + "yaml", + "toml" + ], + "css.lint.hexColorLength": "ignore", + // I only use Prettier for manually formatting + "prettier.enable": true, + "prettier.printWidth": 80, + "prettier.semi": true, + "prettier.singleQuote": true, + "prettier.arrowParens": "avoid", + "prettier.tabWidth": 2, + "prettier.bracketSpacing": true, + "prettier.embeddedLanguageFormatting": "auto", + "prettier.htmlWhitespaceSensitivity": "ignore", + "prettier.vueIndentScriptAndStyle": true, + // ========== File Nesting ========== + "explorer.fileNesting.enabled": true, + "files.autoSave": "afterDelay", + "editor.minimap.enabled": false, + "window.zoomLevel": 1.4, + "editor.fontSize": 14, + "terminal.integrated.fontFamily": "CaskaydiaCove Nerd Font Mono", + "editor.wordWrap": "bounded", + "editor.fontLigatures": false, + "editor.formatOnPaste": true, + "editor.formatOnSave": true, + "prettier.useTabs": false, + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.hover.enabled": true, + "[python]": { + "diffEditor.ignoreTrimWhitespace": false, + "editor.formatOnType": true, + "editor.wordBasedSuggestions": "off", + "editor.defaultFormatter": "ms-python.autopep8" + }, + "autopep8.args": [ + "--max-line-length", + "100" + ], + "[jsonc]": { + "editor.defaultFormatter": "vscode.json-language-features" + }, + "[java]": { + "editor.suggest.snippetsPreventQuickSuggestions": false, + "editor.defaultFormatter": "redhat.java" + }, + "editor.cursorBlinking": "blink", + "editor.smoothScrolling": true, + "editor.cursorStyle": "line", + "editor.find.cursorMoveOnType": false, + "emmet.syntaxProfiles": { + "html": { + "inline_break": true + } + }, + "liveServer.settings.donotShowInfoMsg": true, + "editor.snippetSuggestions": "top", + "editor.guides.indentation": true, + "workbench.preferredHighContrastLightColorTheme": "GitHub Dark", + "workbench.preferredHighContrastColorTheme": "GitHub Dark", + "workbench.activityBar.location": "top", + "workbench.tree.renderIndentGuides": "none", + "breadcrumbs.enabled": false, + "breadcrumbs.icons": true, + "breadcrumbs.showArrays": false, + "breadcrumbs.showBooleans": false, + "breadcrumbs.showClasses": false, + "breadcrumbs.showConstants": false, + "breadcrumbs.showConstructors": false, + "workbench.editor.empty.hint": "hidden", + "workbench.editor.enablePreview": false, + "workbench.editor.labelFormat": "short", + "window.density.editorTabHeight": "default", + "editor.formatOnType": true, + "editor.inlayHints.enabled": "off", + "typescript.tsserver.maxTsServerMemory": 4096, + "typescript.tsserver.log": "off", + "typescript.suggestionActions.enabled": false, + "javascript.suggestionActions.enabled": false, + "workbench.tips.enabled": false, + "window.commandCenter": true, + //APC CUSTOMIZE UI + "editor.codeLens": false, + "zenMode.centerLayout": false, + "zenMode.hideActivityBar": false, + "zenMode.hideLineNumbers": false, + "zenMode.hideStatusBar": false, + "zenMode.fullScreen": true, + "zenMode.showTabs": "multiple", + "explorer.compactFolders": false, + "explorer.openEditors.visible": 1, + "explorer.sortOrder": "type", + "workbench.statusBar.visible": false, + "terminal.integrated.gpuAcceleration": "on", + "editor.autoIndent": "full", + "editor.folding": true, + "editor.suggestOnTriggerCharacters": false, + "editor.quickSuggestions": { + "comments": false, + "strings": false, + "other": true + }, + "editor.parameterHints.enabled": false, + "editor.glyphMargin": false, + "editor.showFoldingControls": "mouseover", + "editor.matchBrackets": "never", + "template-string-converter.enabled": true, + "vscode_custom_css.imports": [ + "file:///c:/Users/jefer/.vscode/extensions/brandonkirbyson.vscode-animations-2.0.4/dist/updateHandler.js" + ], + "workbench.editor.wrapTabs": false, + "terminal.integrated.defaultProfile.windows": "Git Bash", + "git.blame.editorDecoration.enabled": false, + "[php]": { + "editor.defaultFormatter": "bmewburn.vscode-intelephense-client" + }, + "chat.commandCenter.enabled": false, + "editor.scrollbar.vertical": "visible", + "editor.scrollbar.horizontal": "hidden", + "editor.linkedEditing": false, + "editor.suggest.insertMode": "replace", + "editor.detectIndentation": false, + "workbench.editor.showTabs": "multiple", + "editor.colorDecorators": true, + "editor.renderLineHighlight": "none", + "chat.editor.wordWrap": "on", + "editor.accessibilitySupport": "off", + "terminal.integrated.smoothScrolling": true, + "errorLens.enabled": true, + "github.copilot.selectedCompletionModel": "gpt-4o-copilot", + "security.workspace.trust.untrustedFiles": "open", + "supermaven.enable": { + "*": true + }, + "telemetry.enabledTelemetry": false, + "telemetry.telemetryLevel": "off", + "editor.trimAutoWhitespace": false, + "explorer.autoReveal": false, + "editor.suggest.preview": true, + "files.watcherExclude": { + "**/.git/objects/**": true, + "**/.git/subtree-cache/**": true, + "**/node_modules/**": true, + "**/.vscode/**": true, + "**/dist/**": true, + "**/build/**": true + }, + "files.enableTrash": false, + "editor.largeFileOptimizations": false, + "editor.unicodeHighlight.ambiguousCharacters": false, + "window.customTitleBarVisibility": "windowed", + "editor.wordBasedSuggestions": "off", + "editor.semanticHighlighting.enabled": true, + "editor.acceptSuggestionOnEnter": "on", + "editor.autoSurround": "never", + "workbench.enableExperiments": false, + "workbench.autoCheckUpdates": false, + "keyboard.dispatch": "keyCode", + "editor.autoClosingBrackets": "always", + "editor.autoClosingQuotes": "always", + "html.autoClosingTags": true, + "update.showReleaseNotes": false, + "update.enableWindowsBackgroundUpdates": false, + "extensions.autoCheckUpdates": false, + "extensions.ignoreRecommendations": true, + "editor.bracketPairColorization.enabled": true, + "editor.lightbulb.enabled": "off", + "editor.suggest.snippetsPreventQuickSuggestions": false, + "editor.suggest.showStatusBar": false, + "editor.suggest.filterGraceful": true, + "editor.suggest.shareSuggestSelections": false, + "editor.acceptSuggestionOnCommitCharacter": false, + "editor.suggest.showIcons": true, + "editor.suggest.showSnippets": true, + "debug.showInStatusBar": "never", + "github.copilot.nextEditSuggestions.enabled": false, + "oneDarkPro.italic": true, + "oneDarkPro.bold": true, + "terminal.integrated.sendKeybindingsToShell": true, + "glassit.alpha": 220, + "oneDarkPro.vivid": true, + "database-client.autoSync": true, + "supermaven.enableFixWithSupermaven": true, + "diffEditor.codeLens": true, + "workbench.iconTheme": "vscode-icons", + "geminicodeassist.updateChannel": "Insiders", + "github.copilot.enable": { + "*": false, + "plaintext": false, + "markdown": false, + "scminput": false, + "typescriptreact": false, + "javascript": true, + "javascriptreact": false + }, + "editor.quickSuggestionsDelay": 300, +} diff --git a/001_Abre_esta_carpeta/iformacion_del_curso.md b/001_Abre_esta_carpeta/iformacion_del_curso.md index b367bf7..c703792 100644 --- a/001_Abre_esta_carpeta/iformacion_del_curso.md +++ b/001_Abre_esta_carpeta/iformacion_del_curso.md @@ -1,37 +1,37 @@ -# **¡Bienvenido@ al Curso de Python! 🐍🚀** - -En esta sección, te guiaremos en todo lo que necesitas saber para comenzar tu **emocionante** viaje en el mundo de la programación con Python. No importa si nunca has programado antes, este curso comienza desde cero, respondiendo **TODAS** las preguntas que puedas tener. Te ayudaremos a resolver tus dudas de forma independiente, y esto lo podrás ver en el siguiente archivo llamado: **preguntas_resueltas_aquí.md**. 📄✨ - -## **Plataformas y Acceso al Curso 🌐🔓** - -### **Dónde Ver las Clases 📺** - -Las clases se transmitirán en vivo en [Twitch](https://www.twitch.tv/midudev) y permanecerán almacenadas allí. Por ahora, no se subirán a YouTube, pero en el futuro, una vez completadas todas las sesiones, estarán disponibles en dicha plataforma. - -Las clases se impartirán todos los **miércoles**, con una duración de **1 hora y media a 2 horas** como máximo. Este calendario se mantendrá al menos un mes y medio, es decir, hasta aproximadamente **marzo de 2025**. Posteriormente, podríamos ampliar el contenido hacia temas como Django, Inteligencia Artificial, entre otros, si vemos que el curso es bien recibido. Así que dale una estrella ⭐ a este repositorio y ¡compártelo con tus amigos! - -### **Recursos que Tendrás a tu Disposición 📚🔧** - -- **Academia de Midu:** ¡Sí, como lo lees! 🎉 Tenemos abierta la academia donde encontrarás una **gran cantidad** de cursos, incluyendo este mismo curso de Python. Aquí encontrarás mejoras en las explicaciones con código, por minuto, por tema, realizaremos proyectos, y quizás en un futuro certificados y muchas cosas más. Solo entra a [midu.dev](https://midu.dev/). 🚀 - -- **Nota:** Solo los suscriptores de Twitch tienen acceso gratuito a la academia. Si tu suscripción en [Twitch](https://www.twitch.tv/midudev) expira y no la renuevas, también se cerrará tu acceso a la academia. Y buenas noticias: no importa si eres suscriptor con sub regalada o con Prime, solo basta que tengas una suscripción en Twitch, te logueas con esa cuenta y tienes acceso a la academia. 👍✨ - -- **Temario - Página Oficial del Curso 📋⏳:** Si quieres ver todos los temas que abordaremos por el momento, visita el siguiente enlace. Además de mostrarte el temario, tiene cuentas regresivas y anuncios de la próxima clase, además de poder guardar el evento en Discord: [cursopython.dev](https://www.cursopython.dev/). 🗓️🔔 - -- **Repositorio de Código 💻📂:** - - Todo el código, ejercicios y materiales estarán disponibles en este [repositorio de GitHub](https://github.com/midudev/curso-python). 📂✨ Te recomendamos leer el archivo `README.md` 📖🔍 donde encontrarás enlaces a las clases y más información útil. Además, revisa la última modificación del repositorio 🕒🔄 para estar al tanto de las actualizaciones, como soluciones a ejercicios y mejoras en los comentarios. Por ejemplo, el archivo [01_basic](https://github.com/midudev/curso-python/tree/main/01_basic) fue actualizado una semana y media después de su primera versión. Próximamente, en cada archivo encontrarás enlaces directos al minuto exacto de la clase donde se aborda ese tema, facilitando así tu repaso rápido. ¡Mantente atento! 🚀🔗 - -## **Comunidad y Soporte 🤝💬** - -¿Quieres una comunidad que te ayude con tus dudas de forma **amigable**? ¿Que te ayude a resolver tus preguntas y a encontrar gente con la que colaborar en proyectos? Pues únete a nuestra **comunidad en Discord** [aquí](https://discord.com/invite/midudev) para resolver dudas, compartir conocimientos y colaborar con otros estudiantes. Dentro de Discord, encontrarás una sección dedicada exclusivamente a Python 🐍💬, donde podrás recibir y brindar apoyo, así como otras secciones que te pueden interesar. No pierdas esta oportunidad para sacar el **máximo provecho** de este curso. 🌟🤗 - -## **¿Tienes Más Dudas? 🤔❓** - -Si te preguntas qué requisitos necesitas, como hemos comentado, mira el [README](https://github.com/midudev/curso-python/blob/main/README.md) 📄🔗. Allí encontrarás enlaces a las clases, así sabrás cuántas clases hemos tenido. Además, en esas clases desde la primera explicamos los requisitos, configuración, instalación de Python, historia de Python y mucho más. También en el README te enseñamos cómo clonar o descargar todo el código de este repositorio 🖥️⬇️, y mucho más. - -¡Ayúdanos a mejorar! 🌟💬 Coméntanos tus dudas en las transmisiones de las próximas clases y tus sugerencias. Como podrás ver en el archivo llamado **preguntas_resueltas_aquí.md** 📄✨, leemos todas tus preguntas, por muy básicas que sean, y se te responderán. Así que si tienes alguna duda, ¡no dudes en comentarla! Y si tienes alguna sugerencia, curiosidad o si ya sabes algo de programación y quieres saber más, como la configuración de VSCode de Midudev 🖥️⚙️, atajos de teclado ⌨️, herramientas para depurar código en Python 🐍🔍, documentación oficial de Python 📚🖋️, o más recursos de aprendizaje 📖🚀, no dudes en mencionarlas durante las transmisiones de las futuras clases. Aunque no se te responda inmediatamente, seguramente se abordará en esta carpeta que has ingresado. 📁✅ - ---- - -✨ **¡Estamos emocionados de comenzar este viaje contigo!** Si tienes alguna pregunta o necesitas asistencia, no dudes en unirte a nuestra comunidad en [Discord](https://discord.com/invite/midudev) o visitar nuestra [página del curso](https://www.cursopython.dev/). 🎉🐍 +# **¡Bienvenido@ al Curso de Python! 🐍🚀** + +En esta sección, te guiaremos en todo lo que necesitas saber para comenzar tu **emocionante** viaje en el mundo de la programación con Python. No importa si nunca has programado antes, este curso comienza desde cero, respondiendo **TODAS** las preguntas que puedas tener. Te ayudaremos a resolver tus dudas de forma independiente, y esto lo podrás ver en el siguiente archivo llamado: **preguntas_resueltas_aquí.md**. 📄✨ + +## **Plataformas y Acceso al Curso 🌐🔓** + +### **Dónde Ver las Clases 📺** + +Las clases se transmitirán en vivo en [Twitch](https://www.twitch.tv/midudev) y permanecerán almacenadas allí. Por ahora, no se subirán a YouTube, pero en el futuro, una vez completadas todas las sesiones, estarán disponibles en dicha plataforma. + +Las clases se impartirán todos los **miércoles**, con una duración de **1 hora y media a 2 horas** como máximo. Este calendario se mantendrá al menos un mes y medio, es decir, hasta aproximadamente **marzo de 2025**. Posteriormente, podríamos ampliar el contenido hacia temas como Django, Inteligencia Artificial, entre otros, si vemos que el curso es bien recibido. Así que dale una estrella ⭐ a este repositorio y ¡compártelo con tus amigos! + +### **Recursos que Tendrás a tu Disposición 📚🔧** + +- **Academia de Midu:** ¡Sí, como lo lees! 🎉 Tenemos abierta la academia donde encontrarás una **gran cantidad** de cursos, incluyendo este mismo curso de Python. Aquí encontrarás mejoras en las explicaciones con código, por minuto, por tema, realizaremos proyectos, y quizás en un futuro certificados y muchas cosas más. Solo entra a [midu.dev](https://midu.dev/). 🚀 + +- **Nota:** Solo los suscriptores de Twitch tienen acceso gratuito a la academia. Si tu suscripción en [Twitch](https://www.twitch.tv/midudev) expira y no la renuevas, también se cerrará tu acceso a la academia. Y buenas noticias: no importa si eres suscriptor con sub regalada o con Prime, solo basta que tengas una suscripción en Twitch, te logueas con esa cuenta y tienes acceso a la academia. 👍✨ + +- **Temario - Página Oficial del Curso 📋⏳:** Si quieres ver todos los temas que abordaremos por el momento, visita el siguiente enlace. Además de mostrarte el temario, tiene cuentas regresivas y anuncios de la próxima clase, además de poder guardar el evento en Discord: [cursopython.dev](https://www.cursopython.dev/). 🗓️🔔 + +- **Repositorio de Código 💻📂:** + + Todo el código, ejercicios y materiales estarán disponibles en este [repositorio de GitHub](https://github.com/midudev/curso-python). 📂✨ Te recomendamos leer el archivo `README.md` 📖🔍 donde encontrarás enlaces a las clases y más información útil. Además, revisa la última modificación del repositorio 🕒🔄 para estar al tanto de las actualizaciones, como soluciones a ejercicios y mejoras en los comentarios. Por ejemplo, el archivo [01_basic](https://github.com/midudev/curso-python/tree/main/01_basic) fue actualizado una semana y media después de su primera versión. Próximamente, en cada archivo encontrarás enlaces directos al minuto exacto de la clase donde se aborda ese tema, facilitando así tu repaso rápido. ¡Mantente atento! 🚀🔗 + +## **Comunidad y Soporte 🤝💬** + +¿Quieres una comunidad que te ayude con tus dudas de forma **amigable**? ¿Que te ayude a resolver tus preguntas y a encontrar gente con la que colaborar en proyectos? Pues únete a nuestra **comunidad en Discord** [aquí](https://discord.com/invite/midudev) para resolver dudas, compartir conocimientos y colaborar con otros estudiantes. Dentro de Discord, encontrarás una sección dedicada exclusivamente a Python 🐍💬, donde podrás recibir y brindar apoyo, así como otras secciones que te pueden interesar. No pierdas esta oportunidad para sacar el **máximo provecho** de este curso. 🌟🤗 + +## **¿Tienes Más Dudas? 🤔❓** + +Si te preguntas qué requisitos necesitas, como hemos comentado, mira el [README](https://github.com/midudev/curso-python/blob/main/README.md) 📄🔗. Allí encontrarás enlaces a las clases, así sabrás cuántas clases hemos tenido. Además, en esas clases desde la primera explicamos los requisitos, configuración, instalación de Python, historia de Python y mucho más. También en el README te enseñamos cómo clonar o descargar todo el código de este repositorio 🖥️⬇️, y mucho más. + +¡Ayúdanos a mejorar! 🌟💬 Coméntanos tus dudas en las transmisiones de las próximas clases y tus sugerencias. Como podrás ver en el archivo llamado **preguntas_resueltas_aquí.md** 📄✨, leemos todas tus preguntas, por muy básicas que sean, y se te responderán. Así que si tienes alguna duda, ¡no dudes en comentarla! Y si tienes alguna sugerencia, curiosidad o si ya sabes algo de programación y quieres saber más, como la configuración de VSCode de Midudev 🖥️⚙️, atajos de teclado ⌨️, herramientas para depurar código en Python 🐍🔍, documentación oficial de Python 📚🖋️, o más recursos de aprendizaje 📖🚀, no dudes en mencionarlas durante las transmisiones de las futuras clases. Aunque no se te responda inmediatamente, seguramente se abordará en esta carpeta que has ingresado. 📁✅ + +--- + +✨ **¡Estamos emocionados de comenzar este viaje contigo!** Si tienes alguna pregunta o necesitas asistencia, no dudes en unirte a nuestra comunidad en [Discord](https://discord.com/invite/midudev) o visitar nuestra [página del curso](https://www.cursopython.dev/). 🎉🐍 diff --git "a/001_Abre_esta_carpeta/preguntas_resueltas_aqu\303\255.md" "b/001_Abre_esta_carpeta/preguntas_resueltas_aqu\303\255.md" index 5c455a3..da7fb2d 100644 --- "a/001_Abre_esta_carpeta/preguntas_resueltas_aqu\303\255.md" +++ "b/001_Abre_esta_carpeta/preguntas_resueltas_aqu\303\255.md" @@ -1,630 +1,630 @@ -# Dudas de Python ---- - -## Resuelve tus dudas de Python de forma rápida y sencilla - -Durante las transmisiones en vivo surgen numerosas preguntas que, por limitaciones de tiempo, no siempre podemos responder en el momento. Por esta razón, hemos creado este **repositorio de dudas**, donde recopilamos todas las preguntas realizadas en el chat durante las clases de Python. - -Reconocemos que hay personas que están iniciándose en la programación o que desconocen las mejores herramientas para buscar información de manera autónoma. ¡No te preocupes! Aquí te ayudamos a resolver tus dudas de manera eficiente. - ---- - -### Cómo buscar una pregunta rápidamente -Para encontrar una respuesta en esta sección, utiliza el buscador de tu navegador: - -- **Windows**: `Ctrl + F` -- **Mac**: `Command (⌘) + F` -- **Linux**: `Ctrl + F` - -Simplemente escribe una palabra clave relacionada con tu duda y accede a la información en segundos. - ---- - -### Antes de continuar, recuerda -Como programadores, es fundamental desarrollar la **habilidad de buscar soluciones por nosotros mismos**. Esto implica leer, investigar y formular preguntas de manera efectiva. A continuación, algunas herramientas clave para mejorar tu aprendizaje: - -- **Inteligencia Artificial**: Utiliza herramientas como [ChatGPT](https://chat.openai.com/) de manera responsable para obtener respuestas rápidas y explicaciones detalladas. -- **YouTube**: Busca tutoriales con frases como _"Cómo configurar mi terminal en VS Code en Windows"_. -- **Google (u otro buscador de tu preferencia)**: Escribe consultas específicas como _"Instalar Python en Windows paso a paso"_. - -**Otros recursos útiles**: -- [Documentación oficial de Python](https://docs.python.org/es/) -- [Stack Overflow: Preguntas y respuestas de programadores](https://stackoverflow.com/) - ---- - -En esta sección, encontrarás **preguntas y respuestas de las primeras clases**. Dado que son muchas, es imposible cubrirlas todas en las transmisiones en vivo. **Si no encuentras lo que buscas, utiliza las herramientas mencionadas anteriormente y continúa practicando.** Si observas algún error, infórmanos; estamos trabajando para mejorar la experiencia de este curso. - -¡Explora, aprende y sigue creciendo como programador! - -## Índice - -1. [Básica](#basica) -2. [Intermedia](#intermedia) - ---- - -## Básica - -### Dudas de las clases de Python [Curso Python de midudev](https://github.com/midudev/curso-python/tree/main/01_basic) - -1. **Pregunta:** ¿Cómo le hiciste para tener la terminal a la izquierda? - **Respuesta:** Lo explico en el siguiente enlace: [Video](https://www.twitch.tv/videos/2366925887?t=0h58m8s) - -2. **Pregunta:** ¿Qué versión de Python usaremos? ¿Podemos usar una versión anterior? - **Respuesta:** Sí, puedes usar una versión anterior, siempre y cuando no sea demasiado antigua, como las versiones anteriores a Python 3. Se recomienda utilizar la **última versión estable de Python**. Sin embargo, puedes continuar trabajando con la versión que tienes; si en algún momento encuentras algún error, puedes [actualizar Python](https://www.python.org/) desde su página oficial. - -3. **Pregunta:** ¿Cómo configuramos `Cmd + Enter` para ejecutar el código de Python en VS Code sin tener que hacer clic en ejecutar? - **Respuesta:** - 1. **Instala la extensión [Code Runner](https://marketplace.visualstudio.com/items?itemName=formulahendry.code-runner)**. - 2. Siempre hay un ícono para compilar código que dice "Ejecutar". Al pasar el cursor sobre él, puedes ver si tiene un atajo de teclado. - 3. Te recomendamos ver el siguiente video: [Tutorial](https://youtu.be/rQ6JQxMio2Q?si=dT3ZS6bndqATu7-8). - 4. Según tu sistema operativo, puedes buscar más información en videos de YouTube o consultar una herramienta de inteligencia artificial. - -4. **Pregunta:** ¿Qué terminal usa midudev? - **Respuesta:** Midudev utiliza la **terminal de Warp**, que puedes encontrar [aquí](https://www.warp.dev/). En VS Code, puedes usar la terminal integrada, que puede ser `PowerShell`, `cmd`, `Git Bash` o `WSL` según la configuración. Para abrir tu terminal, consulta [este video](https://www.youtube.com/watch?v=gXVI3PxFajU). - -5. **Pregunta:** ¿Por qué se autocompletan los comentarios? - **Respuesta:** VS Code cuenta con funcionalidades de **autocompletado** y extensiones como **Python IntelliSense** que ayudan a completar automáticamente código y comentarios. Además, midudev utiliza un asistente llamado **Supermaven**, que puedes encontrar [aquí](https://supermaven.com/). - -6. **Pregunta:** No entendí cómo se abre la consola y se muestra el mensaje. - **Respuesta:** Consulta el siguiente [video](https://www.youtube.com/watch?v=xuuVY52sjdo). Si no funciona, puedes buscar más información en videos de YouTube o utilizar ChatGPT. - -7. **Pregunta:** Si tenemos Visual Studio, ¿podemos usar Python igual o es necesario usar VS Code? - **Respuesta:** Si te refieres a Visual Studio (el IDE de Microsoft), puedes usarlo para programar en Python. Sin embargo, **Visual Studio Code (VS Code)** es más ligero y está **recomendado para Python**. De todas formas, te dejamos un [enlace](https://youtu.be/oUwz2mc4BFA?si=ArsENSojSvSzf5ty) para que puedas usar Python en ese IDE. - -8. **Pregunta:** ¿Dónde se ve la configuración de Python? ¿De type checking en VS Code? - **Respuesta:** En VS Code, puedes configurar el type checking siguiendo las instrucciones que explico en el siguiente enlace: [video](https://www.twitch.tv/videos/2354087841?t=1h32m53s). Para acceder a las configuraciones: - 1. Abre VS Code y haz clic en el menú superior que dice Archivo. - 2. Selecciona Preferencias y luego Configuración. - -9. **Pregunta:** ¿Se puede tener muchas versiones de Python instaladas? - **Respuesta:** Sí, puedes tener varias versiones de Python instaladas y gestionarlas con herramientas como `pyenv`, `conda` o configurando correctamente las rutas de Python en tu sistema. Puedes buscar más información en videos de YouTube como [este](https://www.youtube.com/watch?v=aF0Ml39oRrE) o utilizar una herramienta de inteligencia artificial. - -10. **Pregunta:** ¿PIP o Conda? - **Respuesta:** Depende de tus necesidades: - - **`pip`**: Gestor de paquetes oficial de Python que funciona con el repositorio de PyPI. - - **`conda`**: Gestor de paquetes y entornos más avanzado, usado en ciencia de datos y desarrollo en Python. - -11. **Pregunta:** ¿Se pueden concatenar `end` y `sep` en `print()`? - **Respuesta:** Sí, ambos parámetros pueden combinarse en `print()`. - - **`sep`** define cómo se separan los valores. - - **`end`** define qué se imprime al final. - - **Ejemplo:** - ```python - print("Hola", "Mundo", sep=" ", end="!") - ``` - Esto imprimirá: `Hola Mundo!` - -12. **Pregunta:** Si utilizamos `"""`, ¿podemos imprimir muchas líneas con una sola cadena? - **Respuesta:** Sí, las triples comillas (`"""` o `'''`) permiten definir **cadenas multilínea**. - -13. **Pregunta:** ¿Se puede cambiar la terminal de VS Code para Python? - **Respuesta:** Sí, en `Archivo > Preferencias > Configuración`, busca `"terminal.integrated.defaultProfile"` y cambia la terminal predeterminada. Si tienes problemas, puedes consultar [ChatGPT](https://chatgpt.com/). - -14. **Pregunta:** ¿Se puede usar backticks en Python? - **Respuesta:** No, Python no utiliza backticks para definir cadenas como en JavaScript. En Python, se usan comillas simples (`'`), dobles (`"`), o triples (`'''` o `"""`). Para interpolación, se utilizan **f-strings** (`f""` o `f''`). - -15. **Pregunta:** ¿Qué otros parámetros tiene `print()`? - **Respuesta:** Algunos parámetros útiles son: - - **`sep`**: Define el separador entre valores. - - **`end`**: Define lo que se imprime al final de la línea. - - **`file`**: Permite escribir en un archivo en lugar de la consola. - - **`flush`**: Si es `True`, fuerza la impresión inmediata en la salida. - -16. **Pregunta:** ¿`end` permite continuar en la misma línea si el `print` es demasiado largo? - **Respuesta:** Sí, `end` permite que el siguiente `print()` continúe en la misma línea sin salto de línea. - - **Pregunta adicional:** ¿Por qué no escribir directamente en la misma línea? - **Respuesta adicional:** Usar los parámetros `end` y `sep` en `print()` permite **controlar cómo se muestran los valores** sin necesidad de escribir todo manualmente en una sola línea. - - **Ejemplos:** - - **Barra de progreso:** - ```python - import time - - for i in range(1, 6): - print(f"\rCargando: {i * 20}%", end="", flush=True) - time.sleep(0.5) - ``` - - - **Formato con separadores:** - ```python - print("Python", "JavaScript", "C++", sep=" | ") - # Output: Python | JavaScript | C++ - ``` - -17. **Pregunta:** Si no quiero que haya espacio entre valores, ¿qué hago? - **Respuesta:** Usa `sep=""` en `print()`, por ejemplo: - ```python - print("Hola", "Mundo", sep="") - ``` - Imprimirá: `HolaMundo`. - -18. **Pregunta:** ¿Podemos pasar variables a nuestro `print()`? ¿Cuál es la diferencia entre método y función? - **Respuesta:** - - **Sí**, puedes pasar variables en `print()`. - ```python - nombre = "Juan" - print("Hola,", nombre) - ``` - - **Método vs Función:** - - Un **método** es una función asociada a un objeto. - - Una **función** es un bloque de código independiente. - - **Ejemplo:** - ```python - # Función independiente - print("Hola", "Mundo", sep=", ") # Output: Hola, Mundo - - # Método de un objeto - lista = [1, 2, 3] - lista.append(4) # append() es un método de listas - print(lista) # Output: [1, 2, 3, 4] - ``` - Aquí, `print()` es una **función**, mientras que `.append()` es un **método** de la lista `lista`. - -19. **Pregunta:** ¿Existe la función `printF` como en Groovy? - **Respuesta:** No existe `printF` en Python, pero puedes usar **f-strings** para formatear texto: - ```python - nombre = "Juan" - print(f"Hola, {nombre}") - ``` - -20. **Pregunta:** ¿En algunos casos se pueden usar backticks? - **Respuesta:** No, en Python los backticks no se usan como en JavaScript. En su lugar, se utilizan **f-strings** (`f""`) para interpolación y **comillas triples** (`"""` o `'''`) para cadenas multilínea. - -21. **Pregunta:** ¿Cuál es la diferencia entre comillas dobles y simples? - **Respuesta:** No hay diferencia funcional, pero: - - Usa `"` cuando la cadena contiene `'`. - - Usa `'` cuando la cadena contiene `"`. - - Para cadenas multilínea, usa `"""` o `'''`. - -22. **Pregunta:** ¿Se puede colorear la salida? ¿Tiene alguna propiedad de error/warning similar a `console.log()`? - **Respuesta:** `print()` por sí solo no colorea, pero puedes usar **`colorama`**: - ```python - from colorama import Fore - print(Fore.RED + "Esto es rojo") - ``` - -23. **Pregunta:** ¿Cómo se manejan los caracteres especiales (tildes en las cadenas, por ejemplo)? - **Respuesta:** Python maneja **UTF-8** por defecto, así que puedes usar tildes sin problemas: - ```python - print("¡Hola, cómo estás!") - ``` - -24. **Pregunta:** ¿Realmente tiene uso? - **Respuesta:** Sí, los parámetros `sep` y `end` en `print()` son muy útiles para controlar el formato de la salida sin concatenar manualmente. - - **Ejemplo útil: Registro en tiempo real** - ```python - import time - - print("Progreso:", end=" ") - for i in range(1, 6): - print(f"{i * 20}%", end=" ", flush=True) - time.sleep(0.5) - - # Output en la misma línea: Progreso: 20% 40% 60% 80% 100% - ``` - -25. **Pregunta:** ¿Para imprimir una variable, simplemente se coloca después de las comillas? - **Respuesta:** No, debes usar una coma o **f-strings**: - ```python - edad = 25 - print("Mi edad es", edad) # O usando f-string: - print(f"Mi edad es {edad}") - ``` - -26. **Pregunta:** ¿También se pueden usar números en `print()`? - **Respuesta:** Sí, puedes imprimir números directamente: - ```python - print(42) - ``` - -27. **Pregunta:** ¿Existen templates en Python? - **Respuesta:** Sí, puedes usar **f-strings** o **`str.format()`**. - -28. **Pregunta:** ¿Se pueden usar valores `chr` como parámetros? - **Respuesta:** Sí, `chr()` convierte números en caracteres Unicode: - ```python - print(chr(65)) # Imprime 'A' - ``` - -29. **Pregunta:** ¿Hay tipos y constructores para los tipos aquí también? - **Respuesta:** Sí, Python tiene tipos y constructores como `int()`, `float()`, `str()`, etc. - -30. **Pregunta:** ¿Cómo ver la información de un método? - **Respuesta:** Usa `help()` o `dir()`: - ```python - help(print) - ``` - O simplemente pasa el cursor sobre la función `print()` o la que te interese en tu editor de código. - -31. **Pregunta:** ¿Cómo hago para que el resultado aparezca en la terminal? - **Respuesta:** Consulta [este video](https://www.youtube.com/watch?v=xuuVY52sjdo) o, en caso de no funcionar, utiliza [ChatGPT](https://chatgpt.com/). - -32. **Pregunta:** ¿Por qué se usa "def" para definir funciones? ¿De qué significa? - **Respuesta:** `def` proviene de **"define"** en inglés y se utiliza para definir funciones en Python. - -### Más Dudas - -1. **Pregunta:** No necesitas inicializarlas, solo nombras y asignas, ¿no? - **Respuesta:** Correcto, en Python no necesitas declarar o inicializar variables antes de usarlas. Simplemente asignas un valor a un nombre de variable. - ```python - x = 10 - y = "Hola" - ``` - -2. **Pregunta:** ¿No crea confusión que se reemplace la variable? - **Respuesta:** Puede causar confusión si reutilizas nombres de variables de manera inconsistente. Es una buena práctica usar nombres descriptivos y evitar reutilizar nombres para diferentes propósitos en el mismo ámbito. - -3. **Pregunta:** ¿Tipado fuerte y tipado dinámico? - **Respuesta:** Python es un lenguaje **tipado dinámico** y **tipado fuerte**. - - **Tipado dinámico:** No necesitas declarar el tipo de una variable, el tipo se determina en tiempo de ejecución. - - **Tipado fuerte:** Las operaciones entre tipos incompatibles (como sumar un `str` y un `int`) no se realizan automáticamente y generan errores. - -4. **Pregunta:** ¿Y qué ventaja da eso? - **Respuesta:** - - **Tipado dinámico:** Facilita la escritura de código más rápido y flexible, sin necesidad de declarar tipos explícitamente. - - **Tipado fuerte:** Previene errores sutiles al evitar conversiones implícitas de tipos que podrían llevar a comportamientos inesperados. - -5. **Pregunta:** ¿Afecta la indentación al tipado? - **Respuesta:** La indentación en Python no afecta el tipado, pero es crucial para definir bloques de código y estructuras de control como bucles y condicionales. Una indentación incorrecta puede causar errores de sintaxis. - -6. **Pregunta:** Si cambio el valor de una variable a un tipo diferente y hago `print`, ¿debería causar un error? - **Respuesta:** No debería causar error. En Python, puedes reasignar variables a diferentes tipos sin problemas. - ```python - x = "Hola" - x = 10 - print(x) # Output: 10 - ``` - -7. **Pregunta:** ¿Se puede forzar un tipado estático en Python? - **Respuesta:** Python es dinámico por naturaleza, pero puedes usar **anotaciones de tipo** para indicar tipos de variables y funciones. Herramientas como **mypy** pueden verificar tipos estáticamente, pero esto es opcional y no cambia el comportamiento en tiempo de ejecución. - - **Ejemplo:** - ```python - def suma(a: int, b: int) -> int: - return a + b - ``` - -8. **Pregunta:** ¿Por qué no se recomienda usar camelCase u otros estilos de nomenclatura en Python y solo se usa snake_case como convención de nombres? - **Respuesta:** - En Python, se prefiere usar **snake_case** para variables, funciones y métodos siguiendo las guías de estilo [PEP 8](https://pep8.org/). Esto mejora la **legibilidad** y **consistencia** del código dentro de la comunidad de Python. - -9. **Pregunta:** ¿Y el camelCase? ¿No sirve? ¿Se usa camelCase? - **Respuesta:** En Python, la convención es usar **snake_case** para variables y funciones, y **CamelCase** para nombres de clases. Aunque puedes usar camelCase, no es la convención estándar y puede disminuir la legibilidad para otros desarrolladores. - - **Ejemplo:** - ```python - # Convención de Python - nombre_variable = "valor" - - class MiClase: - pass - ``` - -10. **Pregunta:** ¿Cómo obtuviste la lista de palabras reservadas? - **Respuesta:** Si te refieres a las palabras reservadas, puedes obtener una lista usando el módulo `keyword`. - ```python - import keyword - print(keyword.kwlist) - ``` - -11. **Pregunta:** ¿Cómo se llama el proceso de convertir un tipo de dato a otro, parsear? - **Respuesta:** Cuando conviertes un tipo de dato a otro, se le llama **casting** o **conversión de tipos**. El término "parsear" generalmente se refiere a analizar una cadena de texto para extraer información o convertirla en otra estructura de datos. - -12. **Pregunta:** ¿Por qué concatenar con `+` y no con comas? - **Respuesta:** Al usar el operador `+` para concatenar cadenas (`str`), estás uniendo los contenidos de las cadenas directamente. Usar comas en `print` separa los argumentos con espacios por defecto y no requiere que conviertas tipos de datos a cadenas. - - **Ejemplo:** - ```python - a = "Hola" - b = "Mundo" - print(a + b) # Output: HolaMundo - print(a, b) # Output: Hola Mundo - ``` - -13. **Pregunta:** ¿Qué sucede si convierto `None` a booleano con `bool(None)`? - **Respuesta:** Convertir `None` a booleano usando `bool(None)` devuelve `False`. - ```python - print(bool(None)) # Output: False - ``` - -14. **Pregunta:** ¿Cómo se manejan los números hexadecimales? - **Respuesta:** En Python, puedes trabajar con números hexadecimales utilizando el prefijo `0x` o `0X`. Puedes convertir hexadecimales a enteros y viceversa. - - **Ejemplo:** - ```python - hex_num = 0x1A # 26 en decimal - print(hex_num) # Output: 26 - print(hex(hex_num)) # Output: '0x1a' - ``` - ---- - -## Intermedia - -### Más dudas - -1. **Pregunta:** ¿Existe algún límite para números enteros? Si usan 32, 64 bits, ¿habrá algún límite? - **Respuesta:** - En Python, los enteros (`int`) tienen **precisión ilimitada**, ya que Python ajusta automáticamente el tamaño según sea necesario. A diferencia de otros lenguajes que limitan los enteros a 32 o 64 bits, en Python no hay un límite práctico más allá de la memoria disponible en el sistema. - - **Ejemplos relacionados:** - - - **Precisión de números flotantes:** - ```python - print(0.1 + 0.2 == 0.3) # Output: False - ``` - Los números de punto flotante (`float`) en Python pueden tener pequeñas imprecisiones debido a su representación binaria. - -2. **Pregunta:** ¿Existe un linter para Python? - **Respuesta:** Sí, existen varios linters para Python que ayudan a mantener un código limpio y libre de errores. Uno de ellos es: - - **[Pylint](https://marketplace.visualstudio.com/items?itemName=ms-python.pylint):** Analiza el código en busca de errores y mejora la calidad del código. - -3. **Pregunta:** ¿El número complejo es equivalente a los doubles? - **Respuesta:** No, los números complejos y los números de punto flotante (`float` o `double`) son tipos de datos diferentes en Python. - - **Números de punto flotante (`float`):** Representan números reales con decimales. - - **Números complejos (`complex`):** Tienen una parte real y una parte imaginaria, representados como `a + bj`. - - **Ejemplo:** - ```python - real = 3.14 # float - complejo = 2 + 3j # complex - ``` - -4. **Pregunta:** ¿Qué pasa si sumo un string y un entero `"1" + 1`? - **Respuesta:** Intentar sumar un string y un entero directamente (`"1" + 1`) resultará en un error de tipo (`TypeError`) en Python, ya que no se pueden concatenar directamente diferentes tipos de datos. - - **Ejemplo:** - ```python - "1" + 1 # TypeError: can only concatenate str (not "int") to str - ``` - - **Solución:** Convertir el entero a string o viceversa según la necesidad. - ```python - "1" + str(1) # Resultado: "11" - str(1) + "1" # Resultado: "11" - 1 + int("1") # Resultado: 2 - ``` - -5. **Pregunta:** ¿No existen valores "truthy" o "falsy"? - **Respuesta:** En Python, sí existen valores "truthy" y "falsy". Estos determinan cómo se evalúan las expresiones en contextos booleanos, como en sentencias `if`. - - - **Valores "falsy":** Se consideran como `False` en contextos booleanos. - - `None` - - `False` - - Cero de cualquier tipo (`0`, `0.0`, `0j`, etc.) - - Secuencias y colecciones vacías (`""`, `[]`, `{}`, `()`, etc.) - - - **Valores "truthy":** Todos los demás valores que no son "falsy". - - **Ejemplo:** - ```python - if []: - print("Truthy") - else: - print("Falsy") # Se imprimirá "Falsy" - - if [1, 2, 3]: - print("Truthy") # Se imprimirá "Truthy" - ``` - -6. **Pregunta:** ¿Qué pasa si hago `print(True * False)`? - **Respuesta:** En Python, `True` se interpreta como `1` y `False` como `0`. Al multiplicarlos: - ```python - print(True * False) # Resultado: 0 - ``` - -7. **Pregunta:** ¿El tipo complejo solo funciona con la letra "j"? - **Respuesta:** Sí, en Python, la unidad imaginaria se representa con la letra minúscula `j` o `J`. No se usan otras letras para denotar la parte imaginaria. - - **Ejemplo:** - ```python - z1 = 3 + 4j - z2 = 5 - 2J - ``` - -8. **Pregunta:** ¿Los booleanos siempre están capitalizados? - **Respuesta:** Sí, en Python los valores booleanos se escriben con la primera letra en mayúscula: - - `True` - - `False` - - Es importante respetar la capitalización, ya que `true` y `false` en minúsculas no son reconocidos como booleanos y resultarán en un error. - ```python - print(True) # Correcto - print(true) # Error - ``` - -9. **Pregunta:** ¿Qué sucede si uso `1 > 2j`? - **Respuesta:** Intentar comparar un número entero con un número complejo (`1 > 2j`) resultará en un error de tipo (`TypeError`) en Python, ya que no hay una definición clara para comparar estos tipos. - - **Ejemplo:** - ```python - 1 > 2j # TypeError: '>' not supported between instances of 'int' and 'complex' - ``` - -10. **Pregunta:** ¿Para qué sirve el `None`? - **Respuesta:** `None` es un objeto especial en Python que representa la ausencia de un valor o un valor nulo. Se utiliza comúnmente para: - - Indicar que una variable no tiene un valor asignado. - - Funciones que no retornan explícitamente un valor retornan `None` por defecto. - - Parámetros por defecto en funciones. - - **Ejemplo:** - ```python - def sin_retorno(): - pass - - resultado = sin_retorno() - print(resultado) # Output: None - ``` - -11. **Pregunta:** ¿Para qué se usa el `NoneType`? - **Respuesta:** `NoneType` es el tipo de dato de `None`. Se utiliza principalmente para: - - Verificar si una variable es `None`. - - Tipar funciones que pueden retornar `None`. - - **Ejemplo:** - ```python - x = None - if isinstance(x, type(None)): - print("x es None") - ``` - -12. **Pregunta:** ¿Cómo comento un párrafo completo? - **Respuesta:** En Python, no hay una sintaxis específica para comentarios multilínea como en otros lenguajes. Sin embargo, puedes utilizar comillas triples (`'''` o `"""`) para crear cadenas de texto que no se asignan a ninguna variable, lo que efectivamente actúa como comentarios. - - **Ejemplo:** - ```python - """ - Este es un comentario - de múltiples líneas - """ - ``` - - También puedes usar el carácter `#` al inicio de cada línea: - ```python - # Este es un comentario - # de múltiples líneas - ``` - -13. **Pregunta:** ¿`None` es igual a `null`? ¿Qué da `"" == None`? - **Respuesta:** En Python, `None` es similar a `null` en otros lenguajes, representando la ausencia de valor. Sin embargo, no es lo mismo que una cadena vacía `""`. - - - **Comparación:** - ```python - None == None # True - "" == None # False - ``` - - **Explicación:** `None` representa la ausencia de un valor, mientras que `""` es una cadena vacía, que es un valor válido. - -14. **Pregunta:** ¿Existe `null` en Python? - **Respuesta:** En Python, no existe `null`. En su lugar, se utiliza `None` para representar la ausencia de valor. - -15. **Pregunta:** ¿Un caso práctico para usar `NoneType` en un proyecto? - **Respuesta:** Un caso común es cuando una función puede no retornar un valor significativo y quieres indicar explícitamente que no hay resultado. - - **Ejemplo:** - ```python - def buscar_usuario(usuario_id): - usuario = base_de_datos.obtener(usuario_id) - if not usuario: - return None - return usuario - - resultado = buscar_usuario(10) - if resultado is None: - print("Usuario no encontrado") - else: - print("Usuario encontrado:", resultado) - ``` - -16. **Pregunta:** ¿"none" indica ausencia de parámetro o ausencia de valor? - **Respuesta:** En Python, `None` (con mayúscula) se utiliza para indicar la ausencia de un valor. Usar la cadena `"none"` (en minúsculas) es simplemente una cadena de texto y no tiene el mismo significado que `None`. - - **Ejemplo:** - ```python - def funcion(param=None): - if param is None: - print("No se proporcionó un parámetro") - else: - print(f"Parametro: {param}") - - funcion() # Output: No se proporcionó un parámetro - funcion("none") # Output: Parametro: none - ``` - -17. **Pregunta:** ¿`NoneType` es como `null`? - **Respuesta:** Sí, en Python, `NoneType` es el tipo de dato de `None`, que es equivalente a `null` en otros lenguajes. Representa la ausencia de un valor. - -18. **Pregunta:** ¿Se usa `None` frecuentemente en sentencias `if`? - **Respuesta:** Sí, es común utilizar `None` en sentencias `if` para verificar si una variable tiene un valor asignado o no. - - **Ejemplo:** - ```python - usuario = obtener_usuario(id_usuario) - if usuario is None: - print("Usuario no encontrado") - else: - print("Usuario:", usuario) - ``` - -19. **Pregunta:** ¿Se usan backticks al usar `print` en Python? - **Respuesta:** No, en Python los backticks no se utilizan para formatear salidas en `print`. Para la interpolación de cadenas, se usan **f-strings** (`f""`), comillas simples (`'`), dobles (`"`), o comillas triples (`'''` o `"""`). - - **Ejemplo con f-strings:** - ```python - nombre = "Juan" - print(f"Hola, {nombre}!") # Output: Hola, Juan! - ``` - -20. **Pregunta:** ¿Para qué sirve `None` en el contexto de usuarios sin datos en su cuenta? - **Respuesta:** Usar `None` es útil para representar la ausencia de datos, como en el caso de un usuario que no tiene información registrada aún. - - **Ejemplo:** - ```python - class Usuario: - def __init__(self, nombre, edad=None): - self.nombre = nombre - self.edad = edad - - nuevo_usuario = Usuario("Ana") - if nuevo_usuario.edad is None: - print("Edad no especificada") - ``` - -21. **Pregunta:** ¿Cuál es la diferencia entre `double` y `float` en Python? - **Respuesta:** En Python, no existen los tipos `double` y `float` como en otros lenguajes. Python utiliza el tipo `float` para representar números de punto flotante, que generalmente corresponden a los `double` de precisión doble en otros lenguajes. - - **Ejemplo:** - ```python - numero = 3.141592653589793 # float en Python, equivalente a double en otros lenguajes - ``` - -22. **Pregunta:** ¿Qué tipo de dato usar para trabajar con dinero debido a la precisión? - **Respuesta:** Para manejar dinero y evitar problemas de precisión con números de punto flotante, es recomendable usar el módulo `decimal` de Python, que ofrece aritmética de punto decimal con precisión exacta. - - **Ejemplo:** - ```python - from decimal import Decimal - - precio = Decimal('19.99') - impuesto = Decimal('0.07') - total = precio + (precio * impuesto) - print(total) # Output: 21.39 - ``` - -23. **Pregunta:** ¿Qué sucede si hago `print(print("Hola"))`? - **Respuesta:** En Python, la función `print()` retorna `None`. Si haces un `print` de un `print`, se ejecutará el primer `print` mostrando el contenido, y luego el segundo `print` mostrará `None`. - - **Ejemplo:** - ```python - resultado = print("Hola Mundo") # Output: Hola Mundo - print(resultado) # Output: None - ``` - -24. **Pregunta:** ¿Se pueden agregar comas en el `float`? - **Respuesta:** Si te refieres a formatear números de punto flotante con comas como separadores de miles, sí, se puede hacer utilizando formateo de cadenas. - - **Ejemplo usando f-strings:** - ```python - numero = 1234567.89 - print(f"{numero:,}") # Output: 1,234,567.89 - ``` - - **Ejemplo usando `format`:** - ```python - numero = 1234567.89 - print("{:,}".format(numero)) # Output: 1,234,567.89 - ``` - - **Nota:** El separador de miles por defecto es la coma `,`. Si necesitas otro separador, puedes especificarlo: - ```python - numero = 1234567.89 - print(f"{numero:_}") # Output: 1_234_567.89 - ``` - ---- +# Dudas de Python +--- + +## Resuelve tus dudas de Python de forma rápida y sencilla + +Durante las transmisiones en vivo surgen numerosas preguntas que, por limitaciones de tiempo, no siempre podemos responder en el momento. Por esta razón, hemos creado este **repositorio de dudas**, donde recopilamos todas las preguntas realizadas en el chat durante las clases de Python. + +Reconocemos que hay personas que están iniciándose en la programación o que desconocen las mejores herramientas para buscar información de manera autónoma. ¡No te preocupes! Aquí te ayudamos a resolver tus dudas de manera eficiente. + +--- + +### Cómo buscar una pregunta rápidamente +Para encontrar una respuesta en esta sección, utiliza el buscador de tu navegador: + +- **Windows**: `Ctrl + F` +- **Mac**: `Command (⌘) + F` +- **Linux**: `Ctrl + F` + +Simplemente escribe una palabra clave relacionada con tu duda y accede a la información en segundos. + +--- + +### Antes de continuar, recuerda +Como programadores, es fundamental desarrollar la **habilidad de buscar soluciones por nosotros mismos**. Esto implica leer, investigar y formular preguntas de manera efectiva. A continuación, algunas herramientas clave para mejorar tu aprendizaje: + +- **Inteligencia Artificial**: Utiliza herramientas como [ChatGPT](https://chat.openai.com/) de manera responsable para obtener respuestas rápidas y explicaciones detalladas. +- **YouTube**: Busca tutoriales con frases como _"Cómo configurar mi terminal en VS Code en Windows"_. +- **Google (u otro buscador de tu preferencia)**: Escribe consultas específicas como _"Instalar Python en Windows paso a paso"_. + +**Otros recursos útiles**: +- [Documentación oficial de Python](https://docs.python.org/es/) +- [Stack Overflow: Preguntas y respuestas de programadores](https://stackoverflow.com/) + +--- + +En esta sección, encontrarás **preguntas y respuestas de las primeras clases**. Dado que son muchas, es imposible cubrirlas todas en las transmisiones en vivo. **Si no encuentras lo que buscas, utiliza las herramientas mencionadas anteriormente y continúa practicando.** Si observas algún error, infórmanos; estamos trabajando para mejorar la experiencia de este curso. + +¡Explora, aprende y sigue creciendo como programador! + +## Índice + +1. [Básica](#basica) +2. [Intermedia](#intermedia) + +--- + +## Básica + +### Dudas de las clases de Python [Curso Python de midudev](https://github.com/midudev/curso-python/tree/main/01_basic) + +1. **Pregunta:** ¿Cómo le hiciste para tener la terminal a la izquierda? + **Respuesta:** Lo explico en el siguiente enlace: [Video](https://www.twitch.tv/videos/2366925887?t=0h58m8s) + +2. **Pregunta:** ¿Qué versión de Python usaremos? ¿Podemos usar una versión anterior? + **Respuesta:** Sí, puedes usar una versión anterior, siempre y cuando no sea demasiado antigua, como las versiones anteriores a Python 3. Se recomienda utilizar la **última versión estable de Python**. Sin embargo, puedes continuar trabajando con la versión que tienes; si en algún momento encuentras algún error, puedes [actualizar Python](https://www.python.org/) desde su página oficial. + +3. **Pregunta:** ¿Cómo configuramos `Cmd + Enter` para ejecutar el código de Python en VS Code sin tener que hacer clic en ejecutar? + **Respuesta:** + 1. **Instala la extensión [Code Runner](https://marketplace.visualstudio.com/items?itemName=formulahendry.code-runner)**. + 2. Siempre hay un ícono para compilar código que dice "Ejecutar". Al pasar el cursor sobre él, puedes ver si tiene un atajo de teclado. + 3. Te recomendamos ver el siguiente video: [Tutorial](https://youtu.be/rQ6JQxMio2Q?si=dT3ZS6bndqATu7-8). + 4. Según tu sistema operativo, puedes buscar más información en videos de YouTube o consultar una herramienta de inteligencia artificial. + +4. **Pregunta:** ¿Qué terminal usa midudev? + **Respuesta:** Midudev utiliza la **terminal de Warp**, que puedes encontrar [aquí](https://www.warp.dev/). En VS Code, puedes usar la terminal integrada, que puede ser `PowerShell`, `cmd`, `Git Bash` o `WSL` según la configuración. Para abrir tu terminal, consulta [este video](https://www.youtube.com/watch?v=gXVI3PxFajU). + +5. **Pregunta:** ¿Por qué se autocompletan los comentarios? + **Respuesta:** VS Code cuenta con funcionalidades de **autocompletado** y extensiones como **Python IntelliSense** que ayudan a completar automáticamente código y comentarios. Además, midudev utiliza un asistente llamado **Supermaven**, que puedes encontrar [aquí](https://supermaven.com/). + +6. **Pregunta:** No entendí cómo se abre la consola y se muestra el mensaje. + **Respuesta:** Consulta el siguiente [video](https://www.youtube.com/watch?v=xuuVY52sjdo). Si no funciona, puedes buscar más información en videos de YouTube o utilizar ChatGPT. + +7. **Pregunta:** Si tenemos Visual Studio, ¿podemos usar Python igual o es necesario usar VS Code? + **Respuesta:** Si te refieres a Visual Studio (el IDE de Microsoft), puedes usarlo para programar en Python. Sin embargo, **Visual Studio Code (VS Code)** es más ligero y está **recomendado para Python**. De todas formas, te dejamos un [enlace](https://youtu.be/oUwz2mc4BFA?si=ArsENSojSvSzf5ty) para que puedas usar Python en ese IDE. + +8. **Pregunta:** ¿Dónde se ve la configuración de Python? ¿De type checking en VS Code? + **Respuesta:** En VS Code, puedes configurar el type checking siguiendo las instrucciones que explico en el siguiente enlace: [video](https://www.twitch.tv/videos/2354087841?t=1h32m53s). Para acceder a las configuraciones: + 1. Abre VS Code y haz clic en el menú superior que dice Archivo. + 2. Selecciona Preferencias y luego Configuración. + +9. **Pregunta:** ¿Se puede tener muchas versiones de Python instaladas? + **Respuesta:** Sí, puedes tener varias versiones de Python instaladas y gestionarlas con herramientas como `pyenv`, `conda` o configurando correctamente las rutas de Python en tu sistema. Puedes buscar más información en videos de YouTube como [este](https://www.youtube.com/watch?v=aF0Ml39oRrE) o utilizar una herramienta de inteligencia artificial. + +10. **Pregunta:** ¿PIP o Conda? + **Respuesta:** Depende de tus necesidades: + - **`pip`**: Gestor de paquetes oficial de Python que funciona con el repositorio de PyPI. + - **`conda`**: Gestor de paquetes y entornos más avanzado, usado en ciencia de datos y desarrollo en Python. + +11. **Pregunta:** ¿Se pueden concatenar `end` y `sep` en `print()`? + **Respuesta:** Sí, ambos parámetros pueden combinarse en `print()`. + - **`sep`** define cómo se separan los valores. + - **`end`** define qué se imprime al final. + + **Ejemplo:** + ```python + print("Hola", "Mundo", sep=" ", end="!") + ``` + Esto imprimirá: `Hola Mundo!` + +12. **Pregunta:** Si utilizamos `"""`, ¿podemos imprimir muchas líneas con una sola cadena? + **Respuesta:** Sí, las triples comillas (`"""` o `'''`) permiten definir **cadenas multilínea**. + +13. **Pregunta:** ¿Se puede cambiar la terminal de VS Code para Python? + **Respuesta:** Sí, en `Archivo > Preferencias > Configuración`, busca `"terminal.integrated.defaultProfile"` y cambia la terminal predeterminada. Si tienes problemas, puedes consultar [ChatGPT](https://chatgpt.com/). + +14. **Pregunta:** ¿Se puede usar backticks en Python? + **Respuesta:** No, Python no utiliza backticks para definir cadenas como en JavaScript. En Python, se usan comillas simples (`'`), dobles (`"`), o triples (`'''` o `"""`). Para interpolación, se utilizan **f-strings** (`f""` o `f''`). + +15. **Pregunta:** ¿Qué otros parámetros tiene `print()`? + **Respuesta:** Algunos parámetros útiles son: + - **`sep`**: Define el separador entre valores. + - **`end`**: Define lo que se imprime al final de la línea. + - **`file`**: Permite escribir en un archivo en lugar de la consola. + - **`flush`**: Si es `True`, fuerza la impresión inmediata en la salida. + +16. **Pregunta:** ¿`end` permite continuar en la misma línea si el `print` es demasiado largo? + **Respuesta:** Sí, `end` permite que el siguiente `print()` continúe en la misma línea sin salto de línea. + + **Pregunta adicional:** ¿Por qué no escribir directamente en la misma línea? + **Respuesta adicional:** Usar los parámetros `end` y `sep` en `print()` permite **controlar cómo se muestran los valores** sin necesidad de escribir todo manualmente en una sola línea. + + **Ejemplos:** + - **Barra de progreso:** + ```python + import time + + for i in range(1, 6): + print(f"\rCargando: {i * 20}%", end="", flush=True) + time.sleep(0.5) + ``` + + - **Formato con separadores:** + ```python + print("Python", "JavaScript", "C++", sep=" | ") + # Output: Python | JavaScript | C++ + ``` + +17. **Pregunta:** Si no quiero que haya espacio entre valores, ¿qué hago? + **Respuesta:** Usa `sep=""` en `print()`, por ejemplo: + ```python + print("Hola", "Mundo", sep="") + ``` + Imprimirá: `HolaMundo`. + +18. **Pregunta:** ¿Podemos pasar variables a nuestro `print()`? ¿Cuál es la diferencia entre método y función? + **Respuesta:** + - **Sí**, puedes pasar variables en `print()`. + ```python + nombre = "Juan" + print("Hola,", nombre) + ``` + - **Método vs Función:** + - Un **método** es una función asociada a un objeto. + - Una **función** es un bloque de código independiente. + + **Ejemplo:** + ```python + # Función independiente + print("Hola", "Mundo", sep=", ") # Output: Hola, Mundo + + # Método de un objeto + lista = [1, 2, 3] + lista.append(4) # append() es un método de listas + print(lista) # Output: [1, 2, 3, 4] + ``` + Aquí, `print()` es una **función**, mientras que `.append()` es un **método** de la lista `lista`. + +19. **Pregunta:** ¿Existe la función `printF` como en Groovy? + **Respuesta:** No existe `printF` en Python, pero puedes usar **f-strings** para formatear texto: + ```python + nombre = "Juan" + print(f"Hola, {nombre}") + ``` + +20. **Pregunta:** ¿En algunos casos se pueden usar backticks? + **Respuesta:** No, en Python los backticks no se usan como en JavaScript. En su lugar, se utilizan **f-strings** (`f""`) para interpolación y **comillas triples** (`"""` o `'''`) para cadenas multilínea. + +21. **Pregunta:** ¿Cuál es la diferencia entre comillas dobles y simples? + **Respuesta:** No hay diferencia funcional, pero: + - Usa `"` cuando la cadena contiene `'`. + - Usa `'` cuando la cadena contiene `"`. + - Para cadenas multilínea, usa `"""` o `'''`. + +22. **Pregunta:** ¿Se puede colorear la salida? ¿Tiene alguna propiedad de error/warning similar a `console.log()`? + **Respuesta:** `print()` por sí solo no colorea, pero puedes usar **`colorama`**: + ```python + from colorama import Fore + print(Fore.RED + "Esto es rojo") + ``` + +23. **Pregunta:** ¿Cómo se manejan los caracteres especiales (tildes en las cadenas, por ejemplo)? + **Respuesta:** Python maneja **UTF-8** por defecto, así que puedes usar tildes sin problemas: + ```python + print("¡Hola, cómo estás!") + ``` + +24. **Pregunta:** ¿Realmente tiene uso? + **Respuesta:** Sí, los parámetros `sep` y `end` en `print()` son muy útiles para controlar el formato de la salida sin concatenar manualmente. + + **Ejemplo útil: Registro en tiempo real** + ```python + import time + + print("Progreso:", end=" ") + for i in range(1, 6): + print(f"{i * 20}%", end=" ", flush=True) + time.sleep(0.5) + + # Output en la misma línea: Progreso: 20% 40% 60% 80% 100% + ``` + +25. **Pregunta:** ¿Para imprimir una variable, simplemente se coloca después de las comillas? + **Respuesta:** No, debes usar una coma o **f-strings**: + ```python + edad = 25 + print("Mi edad es", edad) # O usando f-string: + print(f"Mi edad es {edad}") + ``` + +26. **Pregunta:** ¿También se pueden usar números en `print()`? + **Respuesta:** Sí, puedes imprimir números directamente: + ```python + print(42) + ``` + +27. **Pregunta:** ¿Existen templates en Python? + **Respuesta:** Sí, puedes usar **f-strings** o **`str.format()`**. + +28. **Pregunta:** ¿Se pueden usar valores `chr` como parámetros? + **Respuesta:** Sí, `chr()` convierte números en caracteres Unicode: + ```python + print(chr(65)) # Imprime 'A' + ``` + +29. **Pregunta:** ¿Hay tipos y constructores para los tipos aquí también? + **Respuesta:** Sí, Python tiene tipos y constructores como `int()`, `float()`, `str()`, etc. + +30. **Pregunta:** ¿Cómo ver la información de un método? + **Respuesta:** Usa `help()` o `dir()`: + ```python + help(print) + ``` + O simplemente pasa el cursor sobre la función `print()` o la que te interese en tu editor de código. + +31. **Pregunta:** ¿Cómo hago para que el resultado aparezca en la terminal? + **Respuesta:** Consulta [este video](https://www.youtube.com/watch?v=xuuVY52sjdo) o, en caso de no funcionar, utiliza [ChatGPT](https://chatgpt.com/). + +32. **Pregunta:** ¿Por qué se usa "def" para definir funciones? ¿De qué significa? + **Respuesta:** `def` proviene de **"define"** en inglés y se utiliza para definir funciones en Python. + +### Más Dudas + +1. **Pregunta:** No necesitas inicializarlas, solo nombras y asignas, ¿no? + **Respuesta:** Correcto, en Python no necesitas declarar o inicializar variables antes de usarlas. Simplemente asignas un valor a un nombre de variable. + ```python + x = 10 + y = "Hola" + ``` + +2. **Pregunta:** ¿No crea confusión que se reemplace la variable? + **Respuesta:** Puede causar confusión si reutilizas nombres de variables de manera inconsistente. Es una buena práctica usar nombres descriptivos y evitar reutilizar nombres para diferentes propósitos en el mismo ámbito. + +3. **Pregunta:** ¿Tipado fuerte y tipado dinámico? + **Respuesta:** Python es un lenguaje **tipado dinámico** y **tipado fuerte**. + - **Tipado dinámico:** No necesitas declarar el tipo de una variable, el tipo se determina en tiempo de ejecución. + - **Tipado fuerte:** Las operaciones entre tipos incompatibles (como sumar un `str` y un `int`) no se realizan automáticamente y generan errores. + +4. **Pregunta:** ¿Y qué ventaja da eso? + **Respuesta:** + - **Tipado dinámico:** Facilita la escritura de código más rápido y flexible, sin necesidad de declarar tipos explícitamente. + - **Tipado fuerte:** Previene errores sutiles al evitar conversiones implícitas de tipos que podrían llevar a comportamientos inesperados. + +5. **Pregunta:** ¿Afecta la indentación al tipado? + **Respuesta:** La indentación en Python no afecta el tipado, pero es crucial para definir bloques de código y estructuras de control como bucles y condicionales. Una indentación incorrecta puede causar errores de sintaxis. + +6. **Pregunta:** Si cambio el valor de una variable a un tipo diferente y hago `print`, ¿debería causar un error? + **Respuesta:** No debería causar error. En Python, puedes reasignar variables a diferentes tipos sin problemas. + ```python + x = "Hola" + x = 10 + print(x) # Output: 10 + ``` + +7. **Pregunta:** ¿Se puede forzar un tipado estático en Python? + **Respuesta:** Python es dinámico por naturaleza, pero puedes usar **anotaciones de tipo** para indicar tipos de variables y funciones. Herramientas como **mypy** pueden verificar tipos estáticamente, pero esto es opcional y no cambia el comportamiento en tiempo de ejecución. + + **Ejemplo:** + ```python + def suma(a: int, b: int) -> int: + return a + b + ``` + +8. **Pregunta:** ¿Por qué no se recomienda usar camelCase u otros estilos de nomenclatura en Python y solo se usa snake_case como convención de nombres? + **Respuesta:** + En Python, se prefiere usar **snake_case** para variables, funciones y métodos siguiendo las guías de estilo [PEP 8](https://pep8.org/). Esto mejora la **legibilidad** y **consistencia** del código dentro de la comunidad de Python. + +9. **Pregunta:** ¿Y el camelCase? ¿No sirve? ¿Se usa camelCase? + **Respuesta:** En Python, la convención es usar **snake_case** para variables y funciones, y **CamelCase** para nombres de clases. Aunque puedes usar camelCase, no es la convención estándar y puede disminuir la legibilidad para otros desarrolladores. + + **Ejemplo:** + ```python + # Convención de Python + nombre_variable = "valor" + + class MiClase: + pass + ``` + +10. **Pregunta:** ¿Cómo obtuviste la lista de palabras reservadas? + **Respuesta:** Si te refieres a las palabras reservadas, puedes obtener una lista usando el módulo `keyword`. + ```python + import keyword + print(keyword.kwlist) + ``` + +11. **Pregunta:** ¿Cómo se llama el proceso de convertir un tipo de dato a otro, parsear? + **Respuesta:** Cuando conviertes un tipo de dato a otro, se le llama **casting** o **conversión de tipos**. El término "parsear" generalmente se refiere a analizar una cadena de texto para extraer información o convertirla en otra estructura de datos. + +12. **Pregunta:** ¿Por qué concatenar con `+` y no con comas? + **Respuesta:** Al usar el operador `+` para concatenar cadenas (`str`), estás uniendo los contenidos de las cadenas directamente. Usar comas en `print` separa los argumentos con espacios por defecto y no requiere que conviertas tipos de datos a cadenas. + + **Ejemplo:** + ```python + a = "Hola" + b = "Mundo" + print(a + b) # Output: HolaMundo + print(a, b) # Output: Hola Mundo + ``` + +13. **Pregunta:** ¿Qué sucede si convierto `None` a booleano con `bool(None)`? + **Respuesta:** Convertir `None` a booleano usando `bool(None)` devuelve `False`. + ```python + print(bool(None)) # Output: False + ``` + +14. **Pregunta:** ¿Cómo se manejan los números hexadecimales? + **Respuesta:** En Python, puedes trabajar con números hexadecimales utilizando el prefijo `0x` o `0X`. Puedes convertir hexadecimales a enteros y viceversa. + + **Ejemplo:** + ```python + hex_num = 0x1A # 26 en decimal + print(hex_num) # Output: 26 + print(hex(hex_num)) # Output: '0x1a' + ``` + +--- + +## Intermedia + +### Más dudas + +1. **Pregunta:** ¿Existe algún límite para números enteros? Si usan 32, 64 bits, ¿habrá algún límite? + **Respuesta:** + En Python, los enteros (`int`) tienen **precisión ilimitada**, ya que Python ajusta automáticamente el tamaño según sea necesario. A diferencia de otros lenguajes que limitan los enteros a 32 o 64 bits, en Python no hay un límite práctico más allá de la memoria disponible en el sistema. + + **Ejemplos relacionados:** + + - **Precisión de números flotantes:** + ```python + print(0.1 + 0.2 == 0.3) # Output: False + ``` + Los números de punto flotante (`float`) en Python pueden tener pequeñas imprecisiones debido a su representación binaria. + +2. **Pregunta:** ¿Existe un linter para Python? + **Respuesta:** Sí, existen varios linters para Python que ayudan a mantener un código limpio y libre de errores. Uno de ellos es: + - **[Pylint](https://marketplace.visualstudio.com/items?itemName=ms-python.pylint):** Analiza el código en busca de errores y mejora la calidad del código. + +3. **Pregunta:** ¿El número complejo es equivalente a los doubles? + **Respuesta:** No, los números complejos y los números de punto flotante (`float` o `double`) son tipos de datos diferentes en Python. + - **Números de punto flotante (`float`):** Representan números reales con decimales. + - **Números complejos (`complex`):** Tienen una parte real y una parte imaginaria, representados como `a + bj`. + + **Ejemplo:** + ```python + real = 3.14 # float + complejo = 2 + 3j # complex + ``` + +4. **Pregunta:** ¿Qué pasa si sumo un string y un entero `"1" + 1`? + **Respuesta:** Intentar sumar un string y un entero directamente (`"1" + 1`) resultará en un error de tipo (`TypeError`) en Python, ya que no se pueden concatenar directamente diferentes tipos de datos. + + **Ejemplo:** + ```python + "1" + 1 # TypeError: can only concatenate str (not "int") to str + ``` + + **Solución:** Convertir el entero a string o viceversa según la necesidad. + ```python + "1" + str(1) # Resultado: "11" + str(1) + "1" # Resultado: "11" + 1 + int("1") # Resultado: 2 + ``` + +5. **Pregunta:** ¿No existen valores "truthy" o "falsy"? + **Respuesta:** En Python, sí existen valores "truthy" y "falsy". Estos determinan cómo se evalúan las expresiones en contextos booleanos, como en sentencias `if`. + + - **Valores "falsy":** Se consideran como `False` en contextos booleanos. + - `None` + - `False` + - Cero de cualquier tipo (`0`, `0.0`, `0j`, etc.) + - Secuencias y colecciones vacías (`""`, `[]`, `{}`, `()`, etc.) + + - **Valores "truthy":** Todos los demás valores que no son "falsy". + + **Ejemplo:** + ```python + if []: + print("Truthy") + else: + print("Falsy") # Se imprimirá "Falsy" + + if [1, 2, 3]: + print("Truthy") # Se imprimirá "Truthy" + ``` + +6. **Pregunta:** ¿Qué pasa si hago `print(True * False)`? + **Respuesta:** En Python, `True` se interpreta como `1` y `False` como `0`. Al multiplicarlos: + ```python + print(True * False) # Resultado: 0 + ``` + +7. **Pregunta:** ¿El tipo complejo solo funciona con la letra "j"? + **Respuesta:** Sí, en Python, la unidad imaginaria se representa con la letra minúscula `j` o `J`. No se usan otras letras para denotar la parte imaginaria. + + **Ejemplo:** + ```python + z1 = 3 + 4j + z2 = 5 - 2J + ``` + +8. **Pregunta:** ¿Los booleanos siempre están capitalizados? + **Respuesta:** Sí, en Python los valores booleanos se escriben con la primera letra en mayúscula: + - `True` + - `False` + + Es importante respetar la capitalización, ya que `true` y `false` en minúsculas no son reconocidos como booleanos y resultarán en un error. + ```python + print(True) # Correcto + print(true) # Error + ``` + +9. **Pregunta:** ¿Qué sucede si uso `1 > 2j`? + **Respuesta:** Intentar comparar un número entero con un número complejo (`1 > 2j`) resultará en un error de tipo (`TypeError`) en Python, ya que no hay una definición clara para comparar estos tipos. + + **Ejemplo:** + ```python + 1 > 2j # TypeError: '>' not supported between instances of 'int' and 'complex' + ``` + +10. **Pregunta:** ¿Para qué sirve el `None`? + **Respuesta:** `None` es un objeto especial en Python que representa la ausencia de un valor o un valor nulo. Se utiliza comúnmente para: + - Indicar que una variable no tiene un valor asignado. + - Funciones que no retornan explícitamente un valor retornan `None` por defecto. + - Parámetros por defecto en funciones. + + **Ejemplo:** + ```python + def sin_retorno(): + pass + + resultado = sin_retorno() + print(resultado) # Output: None + ``` + +11. **Pregunta:** ¿Para qué se usa el `NoneType`? + **Respuesta:** `NoneType` es el tipo de dato de `None`. Se utiliza principalmente para: + - Verificar si una variable es `None`. + - Tipar funciones que pueden retornar `None`. + + **Ejemplo:** + ```python + x = None + if isinstance(x, type(None)): + print("x es None") + ``` + +12. **Pregunta:** ¿Cómo comento un párrafo completo? + **Respuesta:** En Python, no hay una sintaxis específica para comentarios multilínea como en otros lenguajes. Sin embargo, puedes utilizar comillas triples (`'''` o `"""`) para crear cadenas de texto que no se asignan a ninguna variable, lo que efectivamente actúa como comentarios. + + **Ejemplo:** + ```python + """ + Este es un comentario + de múltiples líneas + """ + ``` + + También puedes usar el carácter `#` al inicio de cada línea: + ```python + # Este es un comentario + # de múltiples líneas + ``` + +13. **Pregunta:** ¿`None` es igual a `null`? ¿Qué da `"" == None`? + **Respuesta:** En Python, `None` es similar a `null` en otros lenguajes, representando la ausencia de valor. Sin embargo, no es lo mismo que una cadena vacía `""`. + + - **Comparación:** + ```python + None == None # True + "" == None # False + ``` + - **Explicación:** `None` representa la ausencia de un valor, mientras que `""` es una cadena vacía, que es un valor válido. + +14. **Pregunta:** ¿Existe `null` en Python? + **Respuesta:** En Python, no existe `null`. En su lugar, se utiliza `None` para representar la ausencia de valor. + +15. **Pregunta:** ¿Un caso práctico para usar `NoneType` en un proyecto? + **Respuesta:** Un caso común es cuando una función puede no retornar un valor significativo y quieres indicar explícitamente que no hay resultado. + + **Ejemplo:** + ```python + def buscar_usuario(usuario_id): + usuario = base_de_datos.obtener(usuario_id) + if not usuario: + return None + return usuario + + resultado = buscar_usuario(10) + if resultado is None: + print("Usuario no encontrado") + else: + print("Usuario encontrado:", resultado) + ``` + +16. **Pregunta:** ¿"none" indica ausencia de parámetro o ausencia de valor? + **Respuesta:** En Python, `None` (con mayúscula) se utiliza para indicar la ausencia de un valor. Usar la cadena `"none"` (en minúsculas) es simplemente una cadena de texto y no tiene el mismo significado que `None`. + + **Ejemplo:** + ```python + def funcion(param=None): + if param is None: + print("No se proporcionó un parámetro") + else: + print(f"Parametro: {param}") + + funcion() # Output: No se proporcionó un parámetro + funcion("none") # Output: Parametro: none + ``` + +17. **Pregunta:** ¿`NoneType` es como `null`? + **Respuesta:** Sí, en Python, `NoneType` es el tipo de dato de `None`, que es equivalente a `null` en otros lenguajes. Representa la ausencia de un valor. + +18. **Pregunta:** ¿Se usa `None` frecuentemente en sentencias `if`? + **Respuesta:** Sí, es común utilizar `None` en sentencias `if` para verificar si una variable tiene un valor asignado o no. + + **Ejemplo:** + ```python + usuario = obtener_usuario(id_usuario) + if usuario is None: + print("Usuario no encontrado") + else: + print("Usuario:", usuario) + ``` + +19. **Pregunta:** ¿Se usan backticks al usar `print` en Python? + **Respuesta:** No, en Python los backticks no se utilizan para formatear salidas en `print`. Para la interpolación de cadenas, se usan **f-strings** (`f""`), comillas simples (`'`), dobles (`"`), o comillas triples (`'''` o `"""`). + + **Ejemplo con f-strings:** + ```python + nombre = "Juan" + print(f"Hola, {nombre}!") # Output: Hola, Juan! + ``` + +20. **Pregunta:** ¿Para qué sirve `None` en el contexto de usuarios sin datos en su cuenta? + **Respuesta:** Usar `None` es útil para representar la ausencia de datos, como en el caso de un usuario que no tiene información registrada aún. + + **Ejemplo:** + ```python + class Usuario: + def __init__(self, nombre, edad=None): + self.nombre = nombre + self.edad = edad + + nuevo_usuario = Usuario("Ana") + if nuevo_usuario.edad is None: + print("Edad no especificada") + ``` + +21. **Pregunta:** ¿Cuál es la diferencia entre `double` y `float` en Python? + **Respuesta:** En Python, no existen los tipos `double` y `float` como en otros lenguajes. Python utiliza el tipo `float` para representar números de punto flotante, que generalmente corresponden a los `double` de precisión doble en otros lenguajes. + + **Ejemplo:** + ```python + numero = 3.141592653589793 # float en Python, equivalente a double en otros lenguajes + ``` + +22. **Pregunta:** ¿Qué tipo de dato usar para trabajar con dinero debido a la precisión? + **Respuesta:** Para manejar dinero y evitar problemas de precisión con números de punto flotante, es recomendable usar el módulo `decimal` de Python, que ofrece aritmética de punto decimal con precisión exacta. + + **Ejemplo:** + ```python + from decimal import Decimal + + precio = Decimal('19.99') + impuesto = Decimal('0.07') + total = precio + (precio * impuesto) + print(total) # Output: 21.39 + ``` + +23. **Pregunta:** ¿Qué sucede si hago `print(print("Hola"))`? + **Respuesta:** En Python, la función `print()` retorna `None`. Si haces un `print` de un `print`, se ejecutará el primer `print` mostrando el contenido, y luego el segundo `print` mostrará `None`. + + **Ejemplo:** + ```python + resultado = print("Hola Mundo") # Output: Hola Mundo + print(resultado) # Output: None + ``` + +24. **Pregunta:** ¿Se pueden agregar comas en el `float`? + **Respuesta:** Si te refieres a formatear números de punto flotante con comas como separadores de miles, sí, se puede hacer utilizando formateo de cadenas. + + **Ejemplo usando f-strings:** + ```python + numero = 1234567.89 + print(f"{numero:,}") # Output: 1,234,567.89 + ``` + + **Ejemplo usando `format`:** + ```python + numero = 1234567.89 + print("{:,}".format(numero)) # Output: 1,234,567.89 + ``` + + **Nota:** El separador de miles por defecto es la coma `,`. Si necesitas otro separador, puedes especificarlo: + ```python + numero = 1234567.89 + print(f"{numero:_}") # Output: 1_234_567.89 + ``` + +--- diff --git a/01_basic/01_print.py b/01_basic/01_print.py index 78a8e83..90c5bc6 100644 --- a/01_basic/01_print.py +++ b/01_basic/01_print.py @@ -1,38 +1,39 @@ -### -# 01 - print() -# El módulo print() es el módulo que nos permite imprimir en consola -# Sirve para mostrar información en consola y te va a acompañar -# TODA TU VIDA. Desde hoy hasta el fin de los tiempos -### - -# Este es un ejemplo básico de cómo imprimir un texto en consola -print("¡Hola, Twitch!") - -# También puedes usar comillas simples para imprimir texto -print('Esto también funciona con una comilla') - -# Puedes imprimir múltiples elementos separados por un espacio -print("Python", "es", "genial") - -# El parámetro 'sep' permite definir cómo se separan los elementos impresos -print("Python", "es", "brutal", sep = "-") - -# El parámetro 'end' define lo que se imprime al final de la línea -print("Esto se imprime", end = "\n") # Aquí, el 'end' tiene un salto de línea explícito -print("en una línea") # Esto se imprime en la línea siguiente - -# También se pueden imprimir números directamente -print(42) - -# Ejemplo de cómo imprimir el símbolo de pulgadas (") -# Si usamos comillas dobles dentro de un string con comillas dobles, se produce un error: -# print("Esto es una "pulgada"") # ❌ Esto generaría un error de sintaxis - -# ✅ Solución 1: Usar comillas simples para encerrar la cadena -print('Esto es una "pulgada" dentro de un string con comillas simples') - -# ✅ Solución 2: Usar el carácter de escape \ para incluir comillas dobles dentro de un string con comillas dobles -print("Esto es una \"pulgada\" dentro de un string con comillas dobles") - -# ✅ Solución 3: Usar triple comillas para definir el string -print("""Esto es una "pulgada" dentro de un string con triple comillas""") \ No newline at end of file +### +# 01 - print() +# El módulo print() es el módulo que nos permite imprimir en consola +# Sirve para mostrar información en consola y te va a acompañar +# TODA TU VIDA. Desde hoy hasta el fin de los tiempos +### + +# Este es un ejemplo básico de cómo imprimir un texto en consola +print("¡Hola, Twitch!") + +# También puedes usar comillas simples para imprimir texto +print("Esto también funciona con una comilla") + +# Puedes imprimir múltiples elementos separados por un espacio +print("Python", "es", "genial") + +# El parámetro 'sep' permite definir cómo se separan los elementos impresos +print("Python", "es", "brutal", sep="-") + +# El parámetro 'end' define lo que se imprime al final de la línea +# Aquí, el 'end' tiene un salto de línea explícito +print("Esto se imprime", end="\n") +print("en una línea") # Esto se imprime en la línea siguiente + +# También se pueden imprimir números directamente +print(42) + +# Ejemplo de cómo imprimir el símbolo de pulgadas (") +# Si usamos comillas dobles dentro de un string con comillas dobles, se produce un error: +# print("Esto es una "pulgada"") # ❌ Esto generaría un error de sintaxis + +# ✅ Solución 1: Usar comillas simples para encerrar la cadena +print('Esto es una "pulgada" dentro de un string con comillas simples') + +# ✅ Solución 2: Usar el carácter de escape \ para incluir comillas dobles dentro de un string con comillas dobles +print('Esto es una "pulgada" dentro de un string con comillas dobles') + +# ✅ Solución 3: Usar triple comillas para definir el string +print("""Esto es una "pulgada" dentro de un string con triple comillas""") diff --git a/01_basic/02_types.py b/01_basic/02_types.py index 1396245..420742d 100644 --- a/01_basic/02_types.py +++ b/01_basic/02_types.py @@ -1,38 +1,52 @@ -### -# 02 - types() -# Python tiene varios tipos de datos -# int, float, complex, str, bool, NoneType, list, tuple, dict, range, set... -### - -""" -El comando `type()` devuelve el tipo de un objeto en Python -""" -print("int:") # Enteros (números sin parte decimal) -print(type(10)) # Número entero positivo -print(type(0)) # El número cero también es un entero -print(type(-5)) # Número entero negativo -print(type(7238424723784278934789239874)) # Python permite enteros de gran tamaño - -print("float:") # Números decimales (de punto flotante) -print(type(3.14)) # Número con punto decimal -print(type(1.0)) # También es considerado un float, aunque sea un número entero con punto decimal -print(type(1e3)) # Notación científica (equivalente a 1000.0) - -print("complex:") # Números complejos (con parte real e imaginaria) -print(type(1 + 2j)) # Un número complejo en Python (1 es la parte real, 2j es la parte imaginaria) - -print("str:") # Cadenas de texto (strings) -print(type("Hola")) # Un string con texto -print(type("")) # Un string vacío -print(type("123")) # Aunque parezca un número, está entre comillas, por lo que es un string -print(type(""" - Multilinea -""")) # Un string que abarca varias líneas usando triple comillas - -print("bool:") # Valores booleanos (True o False) -print(type(True)) # Valor booleano verdadero -print(type(False)) # Valor booleano falso -print(type(1 < 2)) # Comparación que devuelve un booleano (True) - -print("NoneType:") # Representa la ausencia de valor -print(type(None)) # `None` es un tipo especial en Python que representa "sin valor" o "nulo" \ No newline at end of file +### +# 02 - types() +# Python tiene varios tipos de datos +# int, float, complex, str, bool, NoneType, list, tuple, dict, range, set... +### + +""" +El comando `type()` devuelve el tipo de un objeto en Python +""" +print("int:") # Enteros (números sin parte decimal) +print(type(10)) # Número entero positivo +print(type(0)) # El número cero también es un entero +print(type(-5)) # Número entero negativo +# Python permite enteros de gran tamaño +print(type(7238424723784278934789239874)) + +print("float:") # Números decimales (de punto flotante) +print(type(3.14)) # Número con punto decimal +print( + type(1.0) +) # También es considerado un float, aunque sea un número entero con punto decimal +print(type(1e3)) # Notación científica (equivalente a 1000.0) + +print("complex:") # Números complejos (con parte real e imaginaria) +print( + type(1 + 2j) + # Un número complejo en Python (1 es la parte real, 2j es la parte imaginaria) +) + +print("str:") # Cadenas de texto (strings) +print(type("Hola")) # Un string con texto +print(type("")) # Un string vacío +print( + type("123") +) # Aunque parezca un número, está entre comillas, por lo que es un string +print( + type( + """ + Multilinea +""" + ) +) # Un string que abarca varias líneas usando triple comillas + +print("bool:") # Valores booleanos (True o False) +print(type(True)) # Valor booleano verdadero +print(type(False)) # Valor booleano falso +print(type(1 < 2)) # Comparación que devuelve un booleano (True) + +print("NoneType:") # Representa la ausencia de valor +print( + type(None) +) # `None` es un tipo especial en Python que representa "sin valor" o "nulo" diff --git a/01_basic/03_cast.py b/01_basic/03_cast.py index a2cf176..34f3df9 100644 --- a/01_basic/03_cast.py +++ b/01_basic/03_cast.py @@ -1,34 +1,40 @@ -### -# 03 - casting de types -# Transformar un tipo de un valor a otro -### - -print("Conversión de tipos") - -# Convertir una cadena que contiene un número a un entero y sumarlo con otro entero -print(2 + int("100")) # Convierte "100" a entero y suma 2. Resultado: 102 - -# Convertir un entero a cadena para concatenarlo con otra cadena -print("100" + str(2)) # Convierte el número 2 a cadena y lo concatena. Resultado: "1002" - -# Convertir una cadena con un número decimal a tipo float -print(type(float("3.1416"))) # Convierte "3.1416" a float y muestra su tipo. Resultado: - -# Convertir un número decimal a entero (se trunca la parte decimal) -print(int(3.1416)) # Convierte 3.1416 a 3 eliminando la parte decimal. Resultado: 3 - -# Evaluar valores numéricos como booleanos -print(bool(3)) # Cualquier número distinto de 0 es True. Resultado: True -print(bool(0)) # 0 es False. Resultado: False -print(bool(-1)) # Números negativos también son True. Resultado: True - -# Evaluar cadenas como booleanos -print(bool("")) # Una cadena vacía es False. Resultado: False -print(bool(" ")) # Una cadena con espacios es True. Resultado: True -print(bool("False")) # Una cadena con texto, aunque sea "False", es True. Resultado: True - -# Redondear un número decimal -print(round(2.51)) # Redondea 2.51 al entero más cercano. Resultado: 3 - -# Este genera un error y se comenta para evitar conflicto en la ejecución -# print(int("Hola mundo")) # ❌ Esto generaría un ValueError porque "Hola mundo" no es un número \ No newline at end of file +### +# 03 - casting de types +# Transformar un tipo de un valor a otro +### + +print("Conversión de tipos") + +# Convertir una cadena que contiene un número a un entero y sumarlo con otro entero +print(2 + int("100")) # Convierte "100" a entero y suma 2. Resultado: 102 + +# Convertir un entero a cadena para concatenarlo con otra cadena +print( + "100" + str(2) +) # Convierte el número 2 a cadena y lo concatena. Resultado: "1002" + +# Convertir una cadena con un número decimal a tipo float +print( + type(float("3.1416")) +) # Convierte "3.1416" a float y muestra su tipo. Resultado: + +# Convertir un número decimal a entero (se trunca la parte decimal) +print(int(3.1416)) # Convierte 3.1416 a 3 eliminando la parte decimal. Resultado: 3 + +# Evaluar valores numéricos como booleanos +print(bool(3)) # Cualquier número distinto de 0 es True. Resultado: True +print(bool(0)) # 0 es False. Resultado: False +print(bool(-1)) # Números negativos también son True. Resultado: True + +# Evaluar cadenas como booleanos +print(bool("")) # Una cadena vacía es False. Resultado: False +print(bool(" ")) # Una cadena con espacios es True. Resultado: True +print( + bool("False") +) # Una cadena con texto, aunque sea "False", es True. Resultado: True + +# Redondear un número decimal +print(round(2.51)) # Redondea 2.51 al entero más cercano. Resultado: 3 + +# Este genera un error y se comenta para evitar conflicto en la ejecución +# print(int("Hola mundo")) # ❌ Esto generaría un ValueError porque "Hola mundo" no es un número diff --git a/01_basic/04_variables.py b/01_basic/04_variables.py index 497451e..442c5cc 100644 --- a/01_basic/04_variables.py +++ b/01_basic/04_variables.py @@ -1,70 +1,69 @@ -## -# 04 - Variables -# Las variables sirven para guardar datos en memoria. -# Python es un lenguaje de tipado dinámico y de tipado fuerte. -### - -# Para asignar una variable solo hace falta poner el nombre de la variable y asignarle un valor -my_name = "midudev" -print(my_name) # Imprime el valor de la variable my_name - -age = 32 -print(age) # Imprime el valor de la variable age) - -# Reasignar un nuevo valor a una variable existente -age = 39 -print(age) # Ahora la variable age tiene el valor 39 - -# Tipado dinámico: el tipo de dato se determine en tiempo de ejecución -# No es necesario declarar explícitamente el tipo de variable -name = "midudev" -print(type(name)) # Muestra el tipo de dato de la variable name (str) - -name = 32 -print(type(name)) # Ahora la variable tiene un número entero (int) - -# Tipado fuerte: Python no realiza conversione de tipo automáticas -# Esto generará un error porque no se puede sumar un número con una cadena -# print(10 + "2") # ❌ TypeError: unsupported operand type(s) for +: 'int' and 'str' - -# f-string (literal de cadena de formato) -# desde la versión Python 3.6 -print(f"Hola {my_name}, tengo {age + 5} años") - -# No recomendada forma de asignar variables -name, age, city = "midudev", 32, "Bogotá" - -# Convenciones de nombres de variables -mi_nombre_de_variable = "ok" # snake_case -nombre = "ok" - -miNombreDeVariable = "no-recomendado" # camelCase -MiNombreDeVariable = "no-recomendado" # PascalCase -minombredevariable = "no-recomendado" # todojunto - -mi_nombre_de_variable_123 = "ok" - -MI_CONSTANTE = 3.14 # UPPER_CASE -> constantes - -# Nombres NO válidos de variables (esto generaría errores) -# 123123_variable = "ko" # ❌ No puede comenzar con un número -# mi-variable = "ko" # ❌ No puede contener guiones (-), usa guion bajo (_) -# mi variable = "ko" # ❌ No puede contener espacios -# True = False # ❌ No puedes sobrescribir palabras reservadas - -# Palabras reservadas en Python (no se pueden usar como nombres de variables) - -# ['False', 'None', 'True', 'and', 'as', 'assert', -# 'async', 'await', 'break', 'class', 'continue', -# 'def', 'del', 'elif', 'else', 'except', 'finally', -# 'for', 'from', 'global', 'if', 'import', 'in', 'is', -# 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', -# 'return', 'try', 'while', 'with', 'yield'] - -# Anotaciones de tipo (opcional, para mayor claridad en el código) -is_user_logged_in: bool = True # Indica que la variable es un booleano -print(is_user_logged_in) - -name: str = "midudev" # Indica que la variable es una cadena de texto -print(name) - +## +# 04 - Variables +# Las variables sirven para guardar datos en memoria. +# Python es un lenguaje de tipado dinámico y de tipado fuerte. +### + +# Para asignar una variable solo hace falta poner el nombre de la variable y asignarle un valor +my_name = "midudev" +print(my_name) # Imprime el valor de la variable my_name + +age = 32 +print(age) # Imprime el valor de la variable age) + +# Reasignar un nuevo valor a una variable existente +age = 39 +print(age) # Ahora la variable age tiene el valor 39 + +# Tipado dinámico: el tipo de dato se determine en tiempo de ejecución +# No es necesario declarar explícitamente el tipo de variable +name = "midudev" +print(type(name)) # Muestra el tipo de dato de la variable name (str) + +name = 32 +print(type(name)) # Ahora la variable tiene un número entero (int) + +# Tipado fuerte: Python no realiza conversione de tipo automáticas +# Esto generará un error porque no se puede sumar un número con una cadena +# print(10 + "2") # ❌ TypeError: unsupported operand type(s) for +: 'int' and 'str' + +# f-string (literal de cadena de formato) +# desde la versión Python 3.6 +print(f"Hola {my_name}, tengo {age + 5} años") + +# No recomendada forma de asignar variables +name, age, city = "midudev", 32, "Bogotá" + +# Convenciones de nombres de variables +mi_nombre_de_variable = "ok" # snake_case +nombre = "ok" + +miNombreDeVariable = "no-recomendado" # camelCase +MiNombreDeVariable = "no-recomendado" # PascalCase +minombredevariable = "no-recomendado" # todojunto + +mi_nombre_de_variable_123 = "ok" + +MI_CONSTANTE: int = 3.14 # UPPER_CASE -> constantes + +# Nombres NO válidos de variables (esto generaría errores) +# 123123_variable = "ko" # ❌ No puede comenzar con un número +# mi-variable = "ko" # ❌ No puede contener guiones (-), usa guion bajo (_) +# mi variable = "ko" # ❌ No puede contener espacios +# True = False # ❌ No puedes sobrescribir palabras reservadas + +# Palabras reservadas en Python (no se pueden usar como nombres de variables) + +# ['False', 'None', 'True', 'and', 'as', 'assert', +# 'async', 'await', 'break', 'class', 'continue', +# 'def', 'del', 'elif', 'else', 'except', 'finally', +# 'for', 'from', 'global', 'if', 'import', 'in', 'is', +# 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', +# 'return', 'try', 'while', 'with', 'yield'] + +# Anotaciones de tipo (opcional, para mayor claridad en el código) +is_user_logged_in: bool = True # Indica que la variable es un booleano +print(is_user_logged_in) + +name: str = "midudev" # Indica que la variable es una cadena de texto +print(name) diff --git a/01_basic/05_input.py b/01_basic/05_input.py index 8db2067..3704b85 100644 --- a/01_basic/05_input.py +++ b/01_basic/05_input.py @@ -1,23 +1,23 @@ -### -# 05 - Entrada de usuario (input()) - Versión simplificada -# La función input() permite obtener datos del usuario a través de la consola. -### - -# Para obtener datos del usuario se usa la función input() -# La función input() recibe un mensaje que se muestra al usuario -# y devuelve el valor introducido por el usuario -nombre = input("Hola, ¿cómo te llamas?\n") -print(f"Hola {nombre}, encantado de conocerte") - -# Ten en cuenta que la función input() devuelve un string -# Así que si queremos obtener un número se debe convertir el string a un número -age = input("¿Cuántos años tienes?\n") -age = int(age) -print(f"Tienes {age} años") - -# La función input() también puede devolver múltiples valores -# Para hacerlo, el usuario debe separar los valores con una coma -print("Obtener múltiples valores a la vez") -country, city = input("¿En qué país y ciudad vives?\n").split() - -print(f"Vives en {country}, {city}") \ No newline at end of file +### +# 05 - Entrada de usuario (input()) - Versión simplificada +# La función input() permite obtener datos del usuario a través de la consola. +### + +# Para obtener datos del usuario se usa la función input() +# La función input() recibe un mensaje que se muestra al usuario +# y devuelve el valor introducido por el usuario +nombre: str = input("Hola, ¿cómo te llamas?\n") +print(f"Hola {nombre}, encantado de conocerte") + +# Ten en cuenta que la función input() devuelve un string +# Así que si queremos obtener un número se debe convertir el string a un número +age: int = int(input("¿Cuántos años tienes?\n")) +age: int = int(age) +print(f"Tienes {age} años") + +# La función input() también puede devolver múltiples valores +# Para hacerlo, el usuario debe separar los valores con una coma +print("Obtener múltiples valores a la vez") +country, city = input("¿En qué país y ciudad vives?\n").split() + +print(f"Vives en {country}, {city}") diff --git a/01_basic/exercises.py b/01_basic/exercises.py index fd50d88..ec0e121 100644 --- a/01_basic/exercises.py +++ b/01_basic/exercises.py @@ -1,47 +1,67 @@ -### -# exercises.py -# Ejercicios para practicar los conceptos aprendidos en las lecciones. -### - -print("\nEjercicio 1: Imprimir mensajes") -print("Escribe un programa que imprima tu nombre y tu ciudad en líneas separadas.") - -### Completa aquí - -print("--------------") - -print("\nEjercicio 2: Muestra los tipos de datos de las siguientes variables:") -print("Usa el comando 'type()' para determinar el tipo de datos de cada variable.") -a = 15 -b = 3.14159 -c = "Hola mundo" -d = True -e = None - -### Completa aquí - -print("--------------") - -print("\nEjercicio 3: Casting de tipos") -print("Convierte la cadena \"12345\" a un entero y luego a un float.") -print("Convierte el float 3.99 a un entero. ¿Qué ocurre?") - -### Completa aquí - -print("--------------") - -print("\nEjercicio 4: Variables") -print("Crea variables para tu nombre, edad y altura.") -print("Usa f-strings para imprimir una presentación.") - -# "Hola! Me llamo midudev y tengo 39 años, mido 1.70 metros" - -### Completa aquí - -print("--------------") - -print("\nEjercicio 5: Números") -print("1. Crea una variable con el número PI (sin asignar una variable)") -print("2. Redondea el número con round()") -print("3. Haz la división entera entre el número que te salió y el número 2") -print("4. El resultado debería ser 1") \ No newline at end of file +### +# exercises.py +# Ejercicios para practicar los conceptos aprendidos en las lecciones. +### + +print("\nEjercicio 1: Imprimir mensajes") +print("Escribe un programa que imprima tu nombre y tu ciudad en líneas separadas.") + +### Completa aquí +nombre = "midudev" +ciudad = "madrid" +print("Nombre:", nombre) +print("Ciudad:", ciudad) + +print("--------------") + +print("\nEjercicio 2: Muestra los tipos de datos de las siguientes variables:") +print("Usa el comando 'type()' para determinar el tipo de datos de cada variable.") +a = 15 +b = 3.14159 +c = "Hola mundo" +d = True +e = None + +### Completa aquí +print(type(a)) +print(type(b)) +print(type(c)) +print(type(d)) +print(type(e)) + +print("--------------") + +print("\nEjercicio 3: Casting de tipos") +print('Convierte la cadena "12345" a un entero y luego a un float.') +print("Convierte el float 3.99 a un entero. ¿Qué ocurre?") + +### Completa aquí +print(int("12345")) +print(float("12345")) +print(int(3.99)) # Se tronca el número decimal. + +print("--------------") + +print("\nEjercicio 4: Variables") +print("Crea variables para tu nombre, edad y altura.") +print("Usa f-strings para imprimir una presentación.") + +# "Hola! Me llamo midudev y tengo 39 años, mido 1.70 metros" + +### Completa aquí +nombre = "midudev" +edad = 39 +altura = 1.86 +print(f"Hola! Me llamo {nombre} y tengo {edad} años, mido {altura} metros") +print("--------------") + +print("\nEjercicio 5: Números") +print("1. Crea una variable con el número PI (sin asignar una variable)") +print("2. Redondea el número con round()") +print("3. Haz la división entera entre el número que te salió y el número 2") +print("4. El resultado debería ser 1") + +### Completa aquí +# Anotaciones de tipo (Indica que la variable es un entero) +resultado: int = int(round(3.14159) / 2) +print("División entera de PI entre 2:", resultado) diff --git a/01_basic/soluciones.py b/01_basic/soluciones.py index d2ace79..184a1c9 100644 --- a/01_basic/soluciones.py +++ b/01_basic/soluciones.py @@ -1,82 +1,82 @@ -### -# soluciones.py -# Soluciones a los ejercicios del archivo exercises.py -### - -print("\nEjercicio 1: Imprimir mensajes") -print("Escribe un programa que imprima tu nombre y tu ciudad en líneas separadas.") - -# Solución: -nombre = "Carlos" # Reemplázalo con tu nombre -ciudad = "Buenos Aires" # Reemplázalo con tu ciudad - -print(nombre) -print(ciudad) - -print("--------------") - -print("\nEjercicio 2: Muestra los tipos de datos de las siguientes variables:") -print("Usa el comando 'type()' para determinar el tipo de datos de cada variable.") - -# Variables dadas en el enunciado -a = 15 -b = 3.14159 -c = "Hola mundo" -d = True -e = None - -# Solución: -print("Tipo de a:", type(a)) -print("Tipo de b:", type(b)) -print("Tipo de c:", type(c)) -print("Tipo de d:", type(d)) -print("Tipo de e:", type(e)) - -print("--------------") - -print("\nEjercicio 3: Casting de tipos") -print("Convierte la cadena '12345' a un entero y luego a un float.") -print("Convierte el float 3.99 a un entero. ¿Qué ocurre?") - -# Solución: -cadena = "12345" -numero_entero = int(cadena) # Convertir cadena a entero -numero_float = float(numero_entero) # Convertir entero a float - -print("Número entero:", numero_entero) -print("Número como float:", numero_float) - -float_num = 3.99 -entero_convertido = int(float_num) # Se trunca el decimal - -print("Float original:", float_num) -print("Float convertido a entero (se trunca la parte decimal):", entero_convertido) - -print("--------------") - -print("\nEjercicio 4: Variables") -print("Crea variables para tu nombre, edad y altura.") -print("Usa f-strings para imprimir una presentación.") - -# Solución: -nombre = "midudev" -edad = 18 -altura = 1.90 - -# Imprimir presentación con f-string -print(f"Hola! Me llamo {nombre} y tengo {edad} años, mido {altura} metros") - -print("--------------") - -print("\nEjercicio 5: Números") -print("1. Crea una variable con el número PI (sin asignar una variable)") -print("2. Redondea el número con round()") -print("3. Haz la división entera entre el número que te salió y el número 2") -print("4. El resultado debería ser 1") - -# Solución: -# Redondeamos directamente el valor de pi sin almacenarlo en una variable -resultado = int(round(3.1416) / 2) -print("Valor de PI (aproximado):", 3.1416) -print("PI redondeado:", round(3.1416)) -print("División entera de PI redondeado entre 2:", resultado) +### +# soluciones.py +# Soluciones a los ejercicios del archivo exercises.py +### + +print("\nEjercicio 1: Imprimir mensajes") +print("Escribe un programa que imprima tu nombre y tu ciudad en líneas separadas.") + +# Solución: +nombre = "Carlos" # Reemplázalo con tu nombre +ciudad = "Buenos Aires" # Reemplázalo con tu ciudad + +print(nombre) +print(ciudad) + +print("--------------") + +print("\nEjercicio 2: Muestra los tipos de datos de las siguientes variables:") +print("Usa el comando 'type()' para determinar el tipo de datos de cada variable.") + +# Variables dadas en el enunciado +a = 15 +b = 3.14159 +c = "Hola mundo" +d = True +e = None + +# Solución: +print("Tipo de a:", type(a)) +print("Tipo de b:", type(b)) +print("Tipo de c:", type(c)) +print("Tipo de d:", type(d)) +print("Tipo de e:", type(e)) + +print("--------------") + +print("\nEjercicio 3: Casting de tipos") +print("Convierte la cadena '12345' a un entero y luego a un float.") +print("Convierte el float 3.99 a un entero. ¿Qué ocurre?") + +# Solución: +cadena = "12345" +numero_entero = int(cadena) # Convertir cadena a entero +numero_float = float(numero_entero) # Convertir entero a float + +print("Número entero:", numero_entero) +print("Número como float:", numero_float) + +float_num = 3.99 +entero_convertido = int(float_num) # Se trunca el decimal + +print("Float original:", float_num) +print("Float convertido a entero (se trunca la parte decimal):", entero_convertido) + +print("--------------") + +print("\nEjercicio 4: Variables") +print("Crea variables para tu nombre, edad y altura.") +print("Usa f-strings para imprimir una presentación.") + +# Solución: +nombre = "midudev" +edad = 18 +altura = 1.90 + +# Imprimir presentación con f-string +print(f"Hola! Me llamo {nombre} y tengo {edad} años, mido {altura} metros") + +print("--------------") + +print("\nEjercicio 5: Números") +print("1. Crea una variable con el número PI (sin asignar una variable)") +print("2. Redondea el número con round()") +print("3. Haz la división entera entre el número que te salió y el número 2") +print("4. El resultado debería ser 1") + +# Solución: +# Redondeamos directamente el valor de pi sin almacenarlo en una variable +resultado = int(round(3.1416) / 2) +print("Valor de PI (aproximado):", 3.1416) +print("PI redondeado:", round(3.1416)) +print("División entera de PI redondeado entre 2:", resultado) diff --git a/02_flow_control/01_if.py b/02_flow_control/01_if.py index 5d37840..fb2fdab 100644 --- a/02_flow_control/01_if.py +++ b/02_flow_control/01_if.py @@ -1,165 +1,224 @@ -### -# 01 - Sentencias condicionales (if, elif, else) -# Permiten ejecutar bloques de código solo si se cumplen ciertas condiciones. -### - -# Podemos importar módulos de Python para usarlos en nuestros programas. -# En este caso, importamos el módulo "os" que nos da acceso a funciones -# relacionadas con el sistema operativo -import os -# system() nos permite ejecutar un comando en la terminal -# en este caso lo hacemos para limpiar la pantalla -os.system("clear") -# En el caso que tu sistema no tenga la función "clear", -# puedes usar el comando que sea correcto. - -print("\n Sentencia simple condicional") - -# Podemos usar la palabra clave "if" para ejecutar un bloque de código -# solo si se cumple una condición. -edad = 18 -if edad >= 18: - print("Eres mayor de edad") - print("¡Felicidades!") - -# Si no se cumple la condición, no se ejecuta el bloque de código -edad = 15 -if edad >= 18: - print("Eres mayor de edad") - print("¡Felicidades!") - -# Podemos usar el comando "else" para ejecutar un bloque de código -# si no se cumple la condición anterior del if -print("\n Sentencia condicional con else") -edad = 15 -if edad >= 18: - print("Eres mayor de edad") -else: - print("Eres menor de edad") - -print("\n Sentencia condicional con elif") -nota = 5 - -# Además de usar "if" y "else", podemos usar "elif" para determinar -# múltiples condiciones, ten en cuenta que sólo se ejecutará el primer bloque -# de código que cumpla la condición (o la del else, si está presente) -if nota >= 9: - print("¡Sobresaliente!") -elif nota >= 7: - print("Notable!") -elif nota >= 5: - print("¡Aprobado!") -else: - print("¡No está calificado!") - -print("\n Condiciones múltiples") -edad = 16 -tiene_carnet = True - -# Los operadores lógicos en Python son: -# and: True si ambos operandos son verdaderos -# or: True si al menos uno de los operandos es verdadero -# En JavaScript: -# && sería and -# || sería or - -# En el caso que seas mayor de edad y tengas carnet... -# entonces podrás conducir -if edad >= 18 and tiene_carnet: - print("Puedes conducir 🚗") -else: - print("POLICIA 🚔!!!1!!!") - -# En un pueblo de Isla Margarita son más laxos y -# te dejan conducir si eres mayor de edad O tienes carnet -if edad >= 18 or tiene_carnet: - print("Puedes conducir en la Isla Margarita 🚗") -else: - print("Paga al policía y te deja conducir!!!") - -# También tenemos el operador lógico "not" -# que nos permite negar una condición -es_fin_de_semana = False -# JavaScript -> ! -if not es_fin_de_semana: - print("¡midu, venga que hay que streamear!") - -# Podemos anidar condicionales, uno dentro del otro -# para determinar múltiples condiciones aunque -# siempre intentaremos evitar esto para simplificar -print("\n Anidar condicionales") -edad = 20 -tiene_dinero = True - -if edad >= 18: - if tiene_dinero: - print("Puedes ir a la discoteca") - else: - print("Quédate en casa") -else: - print("No puedes entrar a la disco") - -# Más fácil sería: -# if edad < 18: -# print("No puedes entrar a la disco") -# elif tiene_dinero: -# print("Puedes ir a la discoteca") -# else: -# print("Quédate en casa") - -# Ten en cuenta que hay valores que al usarlos como condiciones -# en Python son evaluados como verdaderos o falsos -# por ejemplo, el número 5, es True -numero = 5 -if numero: # True - print("El número no es cero") - -# Pero el número 0 se evalúa como False -numero = 0 -if numero: # False - print("Aquí no entrará nunca") - -# También el valor vacío "" se evalúa como False -nombre = "" -if nombre: - print("El nombre no es vacío") - -# ¡Ten cuidado con no confundir la asignación = con la comparación ==! -numero = 3 # asignación -es_el_tres = numero == 3 # comparación - -if es_el_tres: - print("El número es 3") - -# A veces podemos crear condicionales en una sola línea usando -# las ternarias, es una forma concisa de un if-else en una línea de código -print("\nLa condición ternaria:") -# [código si cumple la condición] if [condicion] else [codigo si no cumple] - -edad = 17 -mensaje = "Es mayor de edad" if edad >= 18 else "Es menor de edad" -print(mensaje) - -### -# EJERCICIOS -### - -# Ejercicio 1: Determinar el mayor de dos números -# Pide al usuario que introduzca dos números y muestra un mensaje -# indicando cuál es mayor o si son iguales - -# Ejercicio 2: Calculadora simple -# Pide al usuario dos números y una operación (+, -, *, /) -# Realiza la operación y muestra el resultado (maneja la división entre zero) - -# Ejercicio 3: Año bisiesto -# Pide al usuario que introduzca un año y determina si es bisiesto. -# Un año es bisiesto si es divisible por 4, excepto si es divisible por 100 pero no por 400. - -# Ejercicio 4: Categorizar edades -# Pide al usuario que introduzca una edad y la clasifique en: -# - Bebé (0-2 años) -# - Niño (3-12 años) -# - Adolescente (13-17 años) -# - Adulto (18-64 años) -# - Adulto mayor (65 años o más) \ No newline at end of file +### +# 01 - Sentencias condicionales (if, elif, else) +# Permiten ejecutar bloques de código solo si se cumplen ciertas condiciones. +### + +# Podemos importar módulos de Python para usarlos en nuestros programas. +# En este caso, importamos el módulo "os" que nos da acceso a funciones +# relacionadas con el sistema operativo +import os + +# system() nos permite ejecutar un comando en la terminal +# en este caso lo hacemos para limpiar la pantalla +os.system("clear") +# En el caso que tu sistema no tenga la función "clear", +# puedes usar el comando que sea correcto. + +print("\n Sentencia simple condicional") + +# Podemos usar la palabra clave "if" para ejecutar un bloque de código +# solo si se cumple una condición. +edad = 18 +if edad >= 18: + print("Eres mayor de edad") + print("¡Felicidades!") + +# Si no se cumple la condición, no se ejecuta el bloque de código +edad = 15 +if edad >= 18: + print("Eres mayor de edad") + print("¡Felicidades!") + +# Podemos usar el comando "else" para ejecutar un bloque de código +# si no se cumple la condición anterior del if +print("\n Sentencia condicional con else") +edad = 15 +if edad >= 18: + print("Eres mayor de edad") +else: + print("Eres menor de edad") + +print("\n Sentencia condicional con elif") +nota = 5 + +# Además de usar "if" y "else", podemos usar "elif" para determinar +# múltiples condiciones, ten en cuenta que sólo se ejecutará el primer bloque +# de código que cumpla la condición (o la del else, si está presente) +if nota >= 9: + print("¡Sobresaliente!") +elif nota >= 7: + print("Notable!") +elif nota >= 5: + print("¡Aprobado!") +else: + print("¡No está calificado!") + +print("\n Condiciones múltiples") +edad = 16 +tiene_carnet = True + +# Los operadores lógicos en Python son: +# and: True si ambos operandos son verdaderos +# or: True si al menos uno de los operandos es verdadero +# En JavaScript: +# && sería and +# || sería or + +# En el caso que seas mayor de edad y tengas carnet... +# entonces podrás conducir +if edad >= 18 and tiene_carnet: + print("Puedes conducir 🚗") +else: + print("POLICIA 🚔!!!1!!!") + +# En un pueblo de Isla Margarita son más laxos y +# te dejan conducir si eres mayor de edad O tienes carnet +if edad >= 18 or tiene_carnet: + print("Puedes conducir en la Isla Margarita 🚗") +else: + print("Paga al policía y te deja conducir!!!") + +# También tenemos el operador lógico "not" +# que nos permite negar una condición +es_fin_de_semana = False +# JavaScript -> ! +if not es_fin_de_semana: + print("¡midu, venga que hay que streamear!") + +# Podemos anidar condicionales, uno dentro del otro +# para determinar múltiples condiciones aunque +# siempre intentaremos evitar esto para simplificar +print("\n Anidar condicionales") +edad = 20 +tiene_dinero = True + +if edad >= 18: + if tiene_dinero: + print("Puedes ir a la discoteca") + else: + print("Quédate en casa") +else: + print("No puedes entrar a la disco") + +# Más fácil sería: +# if edad < 18: +# print("No puedes entrar a la disco") +# elif tiene_dinero: +# print("Puedes ir a la discoteca") +# else: +# print("Quédate en casa") + +# Ten en cuenta que hay valores que al usarlos como condiciones +# en Python son evaluados como verdaderos o falsos +# por ejemplo, el número 5, es True +numero = 5 +if numero: # True + print("El número no es cero") + +# Pero el número 0 se evalúa como False +numero = 0 +if numero: # False + print("Aquí no entrará nunca") + +# También el valor vacío "" se evalúa como False +nombre = "" +if nombre: + print("El nombre no es vacío") + +# ¡Ten cuidado con no confundir la asignación = con la comparación ==! +numero = 3 # asignación +es_el_tres = numero == 3 # comparación + +if es_el_tres: + print("El número es 3") + +# A veces podemos crear condicionales en una sola línea usando +# las ternarias, es una forma concisa de un if-else en una línea de código +print("\nLa condición ternaria:") +# [código si cumple la condición] if [condicion] else [codigo si no cumple] + +edad = 17 +mensaje = "Es mayor de edad" if edad >= 18 else "Es menor de edad" +print(mensaje) + +### +# EJERCICIOS +### + +# Ejercicio 1: Determinar el mayor de dos números +# Pide al usuario que introduzca dos números y muestra un mensaje +# indicando cuál es mayor o si son iguales + + +print("\nEjercicio 1: Determinar el mayor de dos números") + +numero1 = int(input("Introduce un número: ")) +numero2 = int(input("Introduce otro número: ")) + +if numero1 > numero2: + print(f"El número {numero1} es mayor que {numero2}") +elif numero1 < numero2: + print(f"El número {numero2} es mayor que {numero1}") +else: + print(f"Los números {numero1} y {numero2} son iguales") + +# Ejercicio 2: Calculadora simple +# Pide al usuario dos números y una operación (+, -, *, /) +# Realiza la operación y muestra el resultado (maneja la división entre zero) + +print("\nEjercicio 2: Calculadora simple") + +num1 = int(input("Introduce un número: ")) +num2 = int(input("Introduce otro número: ")) + +operation = input("Introduce la operación (+, -, *, /): ") +match operation: + case "+": + print(f"La suma es: {num1 + num2}") + case "-": + print(f"La resta es: {num1 - num2}") + case "*": + print(f"La multiplicación es: {num1 * num2}") + case "/": + if num2 == 0: + print("No se puede dividir entre cero") + else: + print(f"La división es: {num1 / num2}") + case _: # En caso de que haya un error + print("Operación no válida") + +# Ejercicio 3: Año bisiesto +# Pide al usuario que introduzca un año y determina si es bisiesto. +# Un año es bisiesto si es divisible por 4, excepto si es divisible por 100 pero no por 400. + +print("\nEjercicio 3: Año bisiesto") + +year = int(input("Introduce un año:")) +if year % 4 == 0 and (year % 100 != 0 or year % 400 == 0): + print(f"{year} es un año bisiesto") +else: + print(f"{year} no es un año bisiesto") + +# Ejercicio 4: Categorizar edades +# Pide al usuario que introduzca una edad y la clasifique en: +# - Bebé (0-2 años) +# - Niño (3-12 años) +# - Adolescente (13-17 años) +# - Adulto (18-64 años) +# - Adulto mayor (65 años o más) + +print("\nEjercicio 4: Categorizar edades") + +edad = int(input("Introduce tu edad: ")) +if edad < 0: + print("No existes") +elif edad <= 2: + print("Eres un bebé") +elif edad <= 12: + print("Eres un niño") +elif edad <= 17: + print("Eres un adolescente") +elif edad <= 64: + print("Eres un adulto") +else: + print("Eres un adulto mayor") diff --git a/02_flow_control/01_if_solutions.py b/02_flow_control/01_if_solutions.py index d3fa21e..9610bb4 100644 --- a/02_flow_control/01_if_solutions.py +++ b/02_flow_control/01_if_solutions.py @@ -1,76 +1,76 @@ -### -# EJERCICIOS -### - -# Ejercicio 1: Determinar el mayor de dos números -# Pide al usuario que introduzca dos números y muestra un mensaje -# indicando cuál es mayor o si son iguales -print("\nEjercicio 1:") -num1 = int(input("Introduce el primer número: ")) -num2 = int(input("Introduce el segundo número: ")) - -if num1 > num2: - print(f"{num1} es mayor que {num2}") -elif num2 > num1: - print(f"{num2} es mayor que {num1}") -else: - print("Los números son iguales") - -# Ejercicio 2: Calculadora simple -# Pide al usuario dos números y una operación (+, -, *, /) -# Realiza la operación y muestra el resultado (maneja la división entre zero) -print("\nEjercicio 2:") -num1 = float(input("Introduce el primer número: ")) -num2 = float(input("Introduce el segundo número: ")) -operacion = input("Introduce la operación (+, -, *, /): ") - -if operacion == "+": - resultado = num1 + num2 -elif operacion == "-": - resultado = num1 - num2 -elif operacion == "*": - resultado = num1 * num2 -elif operacion == "/": - if num2 == 0: - print("Error: No se puede dividir por cero.") - else: - resultado = num1 / num2 -else: - print("Operación no válida.") - -if 'resultado' in locals(): #Comprueba si la variable resultado existe. - print(f"El resultado es: {resultado}") - -# Ejercicio 3: Año bisiesto -# Pide al usuario que introduzca un año y determina si es bisiesto. -# Un año es bisiesto si es divisible por 4, excepto si es divisible por 100 pero no por 400. -print("\nEjercicio 3:") -anio = int(input("Introduce un año: ")) - -if (anio % 4 == 0 and anio % 100 != 0) or anio % 400 == 0: - print(f"{anio} es un año bisiesto.") -else: - print(f"{anio} no es un año bisiesto.") - -# Ejercicio 4: Categorizar edades -# Pide al usuario que introduzca una edad y la clasifique en: -# - Bebé (0-2 años) -# - Niño (3-12 años) -# - Adolescente (13-17 años) -# - Adulto (18-64 años) -# - Adulto mayor (65 años o más) -print("\nEjercicio 4:") -edad = int(input("Introduce una edad: ")) - -if 0 <= edad <= 2: - print("Bebé") -elif 3 <= edad <= 12: - print("Niño") -elif 13 <= edad <= 17: - print("Adolescente") -elif 18 <= edad <= 64: - print("Adulto") -elif edad >= 65: - print("Adulto mayor") -else: +### +# EJERCICIOS +### + +# Ejercicio 1: Determinar el mayor de dos números +# Pide al usuario que introduzca dos números y muestra un mensaje +# indicando cuál es mayor o si son iguales +print("\nEjercicio 1:") +num1 = int(input("Introduce el primer número: ")) +num2 = int(input("Introduce el segundo número: ")) + +if num1 > num2: + print(f"{num1} es mayor que {num2}") +elif num2 > num1: + print(f"{num2} es mayor que {num1}") +else: + print("Los números son iguales") + +# Ejercicio 2: Calculadora simple +# Pide al usuario dos números y una operación (+, -, *, /) +# Realiza la operación y muestra el resultado (maneja la división entre zero) +print("\nEjercicio 2:") +num1 = float(input("Introduce el primer número: ")) +num2 = float(input("Introduce el segundo número: ")) +operacion = input("Introduce la operación (+, -, *, /): ") + +if operacion == "+": + resultado = num1 + num2 +elif operacion == "-": + resultado = num1 - num2 +elif operacion == "*": + resultado = num1 * num2 +elif operacion == "/": + if num2 == 0: + print("Error: No se puede dividir por cero.") + else: + resultado = num1 / num2 +else: + print("Operación no válida.") + +if 'resultado' in locals(): #Comprueba si la variable resultado existe. + print(f"El resultado es: {resultado}") + +# Ejercicio 3: Año bisiesto +# Pide al usuario que introduzca un año y determina si es bisiesto. +# Un año es bisiesto si es divisible por 4, excepto si es divisible por 100 pero no por 400. +print("\nEjercicio 3:") +anio = int(input("Introduce un año: ")) + +if (anio % 4 == 0 and anio % 100 != 0) or anio % 400 == 0: + print(f"{anio} es un año bisiesto.") +else: + print(f"{anio} no es un año bisiesto.") + +# Ejercicio 4: Categorizar edades +# Pide al usuario que introduzca una edad y la clasifique en: +# - Bebé (0-2 años) +# - Niño (3-12 años) +# - Adolescente (13-17 años) +# - Adulto (18-64 años) +# - Adulto mayor (65 años o más) +print("\nEjercicio 4:") +edad = int(input("Introduce una edad: ")) + +if 0 <= edad <= 2: + print("Bebé") +elif 3 <= edad <= 12: + print("Niño") +elif 13 <= edad <= 17: + print("Adolescente") +elif 18 <= edad <= 64: + print("Adulto") +elif edad >= 65: + print("Adulto mayor") +else: print("Edad no válida.") \ No newline at end of file diff --git a/02_flow_control/02_booleans.py b/02_flow_control/02_booleans.py index 2c5997f..b523ed3 100644 --- a/02_flow_control/02_booleans.py +++ b/02_flow_control/02_booleans.py @@ -1,53 +1,53 @@ -### -# 02 - Booleanos -# Valores lógicos: True (verdadero) y False (falso). -# Fundamentales para el control de flujo y la lógica en programación. -### - -# Los booleanos representan valores de verdad: True o False. -print("\nValores booleanos básicos:") -print(True) -print(False) - -# Operadores de comparación: devuelven un valor booleano. -print("\nOperadores de comparación:") -print("5 > 3:", 5 > 3) # True -print("5 < 3:", 5 < 3) # False -print("5 == 5:", 5 == 5) # True (igualdad) -print("5 != 3:", 5 != 3) # True (desigualdad) -print("5 >= 5:", 5 >= 5) # True (mayor o igual que) -print("5 <= 3:", 5 <= 3) # False (menor o igual que) - -print("\nComparación de cadenas:") -print("'manzana' < 'pera':", "manzana" < "pera") # True -print("'Hola' == 'hola'", "Hola" == "hola") # False - -# Operadores lógicos: and, or, not -print("\nOperadores lógicos:") -print("True and True:", True and True) # True -print("True and False:", True and False) # False -print("True or False:", True or False) # True -print("False or False:", False or False) # False -print("not True:", not True) # False -print("not False:", not False) # True - -# Tablas de verdad (para referencia): -print("\nTablas de verdad:") -print("\nand:") -print("A B A and B") -print("True True ", True and True) -print("True False", True and False) -print("False True ", False and True) -print("False False", False and False) - -print("\n or:") -print("A B A or B") -print("True True ", True or True) -print("True False", True or False) -print("False True ", False or True) -print("False False", False or False) - -print("\n not:") -print("A not A") -print("True ", not True) -print("False", not False) \ No newline at end of file +### +# 02 - Booleanos +# Valores lógicos: True (verdadero) y False (falso). +# Fundamentales para el control de flujo y la lógica en programación. +### + +# Los booleanos representan valores de verdad: True o False. +print("\nValores booleanos básicos:") +print(True) +print(False) + +# Operadores de comparación: devuelven un valor booleano. +print("\nOperadores de comparación:") +print("5 > 3:", 5 > 3) # True +print("5 < 3:", 5 < 3) # False +print("5 == 5:", 5 == 5) # True (igualdad) +print("5 != 3:", 5 != 3) # True (desigualdad) +print("5 >= 5:", 5 >= 5) # True (mayor o igual que) +print("5 <= 3:", 5 <= 3) # False (menor o igual que) + +print("\nComparación de cadenas:") +print("'manzana' < 'pera':", "manzana" < "pera") # True +print("'Hola' == 'hola'", "Hola" == "hola") # False + +# Operadores lógicos: and, or, not +print("\nOperadores lógicos:") +print("True and True:", True and True) # True +print("True and False:", True and False) # False +print("True or False:", True or False) # True +print("False or False:", False or False) # False +print("not True:", not True) # False +print("not False:", not False) # True + +# Tablas de verdad (para referencia): +print("\nTablas de verdad:") +print("\nand:") +print("A B A and B") +print("True True ", True and True) +print("True False", True and False) +print("False True ", False and True) +print("False False", False and False) + +print("\n or:") +print("A B A or B") +print("True True ", True or True) +print("True False", True or False) +print("False True ", False or True) +print("False False", False or False) + +print("\n not:") +print("A not A") +print("True ", not True) +print("False", not False) diff --git a/02_flow_control/03_list.py b/02_flow_control/03_list.py index 947731d..bad128d 100644 --- a/02_flow_control/03_list.py +++ b/02_flow_control/03_list.py @@ -1,96 +1,96 @@ -### -# 03 - Listas -# Secuencias mutables de elementos. -# Pueden contener elementos de diferentes tipos. -### - -# Creación de listas -print("\nCrear listas") -lista1 = [1, 2, 3, 4, 5] # lista de enteros -lista2 = ["manzanas", "peras", "plátanos"] # lista de cadenas -lista3 = [1, "hola", 3.14, True] # lista de tipos mixtos - -lista_vacia = [] -lista_de_listas = [[1, 2], ['calcetin', 4]] -matrix = [[1, 2], [2, 3], [4, 5]] - -print(lista1) -print(lista2) -print(lista3) -print(lista_vacia) -print(lista_de_listas) -print(matrix) - -# Acceso a elementos por índice -print("\nAcceso a elementos por índice") -print(lista2[0]) # manzanas -print(lista2[1]) # peras -print(lista2[-1]) # plátanos -print(lista2[-2]) # peras - -print(lista_de_listas[1][0]) - -# Slicing (rebanado) de listas -lista1 = [1, 2, 3, 4, 5] -print(lista1[1:4]) # [2, 3, 4] -print(lista1[:3]) # [1, 2, 3] -print(lista1[3:]) # [4, 5] -print(lista1[:]) # [1, 2, 3, 4, 5] - -# El tercer parámetro es el paso (step) -lista1 = [1, 2, 3, 4, 5, 6, 7, 8] -print(lista1[::2]) # para devolver índices pares -print(lista1[::-1]) # para devolver índices inversos - -# Modificar una lista -lista1[0] = 20 -print(lista1) - -# Añadir elementos a una lista -lista1 = [1, 2, 3] - -# forma larga y menos eficiente -lista1 = lista1 + [4, 5, 6] -print(lista1) - -# forma corta y más eficiente -lista1 += [7, 8, 9] -print(lista1) - -# Recuperar longitud de una lista -print("Longitud de la lista", len(lista1)) - -### -# EJERCICIOS -### - -# Ejercicio 1: El mensaje secreto -# Dada la siguiente lista: -# mensaje = ["C", "o", "d", "i", "g", "o", " ", "s", "e", "c", "r", "e", "t", "o"] -# Utilizando slicing y concatenación, crea una nueva lista que contenga solo el mensaje "secreto". - -# Ejercicio 2: Intercambio de posiciones -# Dada la siguiente lista: -# numeros = [10, 20, 30, 40, 50] -# Intercambia la primera y la última posición utilizando solo asignación por índice. - -# Ejercicio 3: El sándwich de listas -# Dadas las siguientes listas: -# pan = ["pan arriba"] -# ingredientes = ["jamón", "queso", "tomate"] -# pan_abajo = ["pan abajo"] -# Crea una lista llamada sandwich que contenga el pan de arriba, los ingredientes y el pan de abajo, en ese orden. - -# Ejercicio 4: Duplicando la lista -# Dada una lista: -# lista = [1, 2, 3] -# Crea una nueva lista que contenga los elementos de la lista original duplicados. -# Ejemplo: [1, 2, 3] -> [1, 2, 3, 1, 2, 3] - -# Ejercicio 5: Extrayendo el centro -# Dada una lista con un número impar de elementos, extrae el elemento que se encuentra en el centro de la lista utilizando slicing. -# Ejemplo: lista = [10, 20, 30, 40, 50] -> El centro es 30 - -# Ejercicio 6: Reversa parcial -# Dada una lista, invierte solo la primera mitad de la lista (utilizando slicing y concatenación). -# Ejemplo: lista = [1, 2, 3, 4, 5, 6] -> Resultado: [3, 2, 1, 4, 5, 6] +### +# 03 - Listas +# Secuencias mutables de elementos. +# Pueden contener elementos de diferentes tipos. +### + +# Creación de listas +print("\nCrear listas") +lista1 = [1, 2, 3, 4, 5] # lista de enteros +lista2 = ["manzanas", "peras", "plátanos"] # lista de cadenas +lista3 = [1, "hola", 3.14, True] # lista de tipos mixtos + +lista_vacia = [] +lista_de_listas = [[1, 2], ["calcetin", 4]] +matrix = [[1, 2], [2, 3], [4, 5]] + +print(lista1) +print(lista2) +print(lista3) +print(lista_vacia) +print(lista_de_listas) +print(matrix) + +# Acceso a elementos por índice +print("\nAcceso a elementos por índice") +print(lista2[0]) # manzanas +print(lista2[1]) # peras +print(lista2[-1]) # plátanos +print(lista2[-2]) # peras + +print(lista_de_listas[1][0]) + +# Slicing (rebanado) de listas +lista1 = [1, 2, 3, 4, 5] +print(lista1[1:4]) # [2, 3, 4] +print(lista1[:3]) # [1, 2, 3] +print(lista1[3:]) # [4, 5] +print(lista1[:]) # [1, 2, 3, 4, 5] + +# El tercer parámetro es el paso (step) +lista1 = [1, 2, 3, 4, 5, 6, 7, 8] +print(lista1[::2]) # para devolver índices pares +print(lista1[::-1]) # para devolver índices inversos + +# Modificar una lista +lista1[0] = 20 +print(lista1) + +# Añadir elementos a una lista +lista1 = [1, 2, 3] + +# forma larga y menos eficiente +lista1 = lista1 + [4, 5, 6] +print(lista1) + +# forma corta y más eficiente +lista1 += [7, 8, 9] +print(lista1) + +# Recuperar longitud de una lista +print("Longitud de la lista", len(lista1)) + +### +# EJERCICIOS +### + +# Ejercicio 1: El mensaje secreto +# Dada la siguiente lista: +# mensaje = ["C", "o", "d", "i", "g", "o", " ", "s", "e", "c", "r", "e", "t", "o"] +# Utilizando slicing y concatenación, crea una nueva lista que contenga solo el mensaje "secreto". + +# Ejercicio 2: Intercambio de posiciones +# Dada la siguiente lista: +# numeros = [10, 20, 30, 40, 50] +# Intercambia la primera y la última posición utilizando solo asignación por índice. + +# Ejercicio 3: El sándwich de listas +# Dadas las siguientes listas: +# pan = ["pan arriba"] +# ingredientes = ["jamón", "queso", "tomate"] +# pan_abajo = ["pan abajo"] +# Crea una lista llamada sandwich que contenga el pan de arriba, los ingredientes y el pan de abajo, en ese orden. + +# Ejercicio 4: Duplicando la lista +# Dada una lista: +# lista = [1, 2, 3] +# Crea una nueva lista que contenga los elementos de la lista original duplicados. +# Ejemplo: [1, 2, 3] -> [1, 2, 3, 1, 2, 3] + +# Ejercicio 5: Extrayendo el centro +# Dada una lista con un número impar de elementos, extrae el elemento que se encuentra en el centro de la lista utilizando slicing. +# Ejemplo: lista = [10, 20, 30, 40, 50] -> El centro es 30 + +# Ejercicio 6: Reversa parcial +# Dada una lista, invierte solo la primera mitad de la lista (utilizando slicing y concatenación). +# Ejemplo: lista = [1, 2, 3, 4, 5, 6] -> Resultado: [3, 2, 1, 4, 5, 6] diff --git a/02_flow_control/03_list_solutions.py b/02_flow_control/03_list_solutions.py index dab7f63..108089a 100644 --- a/02_flow_control/03_list_solutions.py +++ b/02_flow_control/03_list_solutions.py @@ -1,61 +1,61 @@ -### -# SOLUCIONES -### - -# Ejercicio 1: El mensaje secreto -# Dada la siguiente lista: -# mensaje = ["C", "o", "d", "i", "g", "o", " ", "s", "e", "c", "r", "e", "t", "o"] -# Utilizando slicing y concatenación, crea una nueva lista que contenga solo el mensaje "secreto". -print("\nEjercicio 1:") -mensaje = ["C", "o", "d", "i", "g", "o", " ", "s", "e", "c", "r", "e", "t", "o"] -secreto = mensaje[7:] -print(secreto) - -# Ejercicio 2: Intercambio de posiciones -# Dada la siguiente lista: -# numeros = [10, 20, 30, 40, 50] -# Intercambia la primera y la última posición utilizando solo asignación por índice. -print("\nEjercicio 2:") -numeros = [10, 20, 30, 40, 50] -numeros[0], numeros[-1] = numeros[-1], numeros[0] # Intercambio en una sola línea. -print(numeros) - -# Ejercicio 3: El sándwich de listas -# Dadas las siguientes listas: -# pan = ["pan arriba"] -# ingredientes = ["jamón", "queso", "tomate"] -# pan_abajo = ["pan abajo"] -# Crea una lista llamada sandwich que contenga el pan de arriba, los ingredientes y el pan de abajo, en ese orden. -print("\nEjercicio 3:") -pan = ["pan arriba"] -ingredientes = ["jamón", "queso", "tomate"] -pan_abajo = ["pan abajo"] -sandwich = pan + ingredientes + pan_abajo -print(sandwich) - -# Ejercicio 4: Duplicando la lista -# Dada una lista: -# lista = [1, 2, 3] -# Crea una nueva lista que contenga los elementos de la lista original duplicados. -# Ejemplo: [1, 2, 3] -> [1, 2, 3, 1, 2, 3] -print("\nEjercicio 4:") -lista = [1, 2, 3] -lista_duplicada = lista + lista -print(lista_duplicada) - -# Ejercicio 5: Extrayendo el centro -# Dada una lista con un número impar de elementos, extrae el elemento que se encuentra en el centro de la lista utilizando slicing. -# Ejemplo: lista = [10, 20, 30, 40, 50] -> El centro es 30 -print("\nEjercicio 5:") -lista = [10, 20, 30, 40, 50] -centro = len(lista) // 2 -print(lista[centro]) - -# Ejercicio 6: Reversa parcial -# Dada una lista, invierte solo la primera mitad de la lista (utilizando slicing y concatenación). -# Ejemplo: lista = [1, 2, 3, 4, 5, 6] -> Resultado: [3, 2, 1, 4, 5, 6] -print("\nEjercicio 6:") -lista = [1, 2, 3, 4, 5, 6] -mitad = len(lista) // 2 -lista_invertida = lista[:mitad][::-1] + lista[mitad:] +### +# SOLUCIONES +### + +# Ejercicio 1: El mensaje secreto +# Dada la siguiente lista: +# mensaje = ["C", "o", "d", "i", "g", "o", " ", "s", "e", "c", "r", "e", "t", "o"] +# Utilizando slicing y concatenación, crea una nueva lista que contenga solo el mensaje "secreto". +print("\nEjercicio 1:") +mensaje = ["C", "o", "d", "i", "g", "o", " ", "s", "e", "c", "r", "e", "t", "o"] +secreto = mensaje[7:] +print(secreto) + +# Ejercicio 2: Intercambio de posiciones +# Dada la siguiente lista: +# numeros = [10, 20, 30, 40, 50] +# Intercambia la primera y la última posición utilizando solo asignación por índice. +print("\nEjercicio 2:") +numeros = [10, 20, 30, 40, 50] +numeros[0], numeros[-1] = numeros[-1], numeros[0] # Intercambio en una sola línea. +print(numeros) + +# Ejercicio 3: El sándwich de listas +# Dadas las siguientes listas: +# pan = ["pan arriba"] +# ingredientes = ["jamón", "queso", "tomate"] +# pan_abajo = ["pan abajo"] +# Crea una lista llamada sandwich que contenga el pan de arriba, los ingredientes y el pan de abajo, en ese orden. +print("\nEjercicio 3:") +pan = ["pan arriba"] +ingredientes = ["jamón", "queso", "tomate"] +pan_abajo = ["pan abajo"] +sandwich = pan + ingredientes + pan_abajo +print(sandwich) + +# Ejercicio 4: Duplicando la lista +# Dada una lista: +# lista = [1, 2, 3] +# Crea una nueva lista que contenga los elementos de la lista original duplicados. +# Ejemplo: [1, 2, 3] -> [1, 2, 3, 1, 2, 3] +print("\nEjercicio 4:") +lista = [1, 2, 3] +lista_duplicada = lista + lista +print(lista_duplicada) + +# Ejercicio 5: Extrayendo el centro +# Dada una lista con un número impar de elementos, extrae el elemento que se encuentra en el centro de la lista utilizando slicing. +# Ejemplo: lista = [10, 20, 30, 40, 50] -> El centro es 30 +print("\nEjercicio 5:") +lista = [10, 20, 30, 40, 50] +centro = len(lista) // 2 +print(lista[centro]) + +# Ejercicio 6: Reversa parcial +# Dada una lista, invierte solo la primera mitad de la lista (utilizando slicing y concatenación). +# Ejemplo: lista = [1, 2, 3, 4, 5, 6] -> Resultado: [3, 2, 1, 4, 5, 6] +print("\nEjercicio 6:") +lista = [1, 2, 3, 4, 5, 6] +mitad = len(lista) // 2 +lista_invertida = lista[:mitad][::-1] + lista[mitad:] print(lista_invertida) \ No newline at end of file diff --git a/02_flow_control/04_list_methods.py b/02_flow_control/04_list_methods.py index fdcc676..b320638 100644 --- a/02_flow_control/04_list_methods.py +++ b/02_flow_control/04_list_methods.py @@ -1,111 +1,113 @@ -### -# 04 - Listas Métodos -# Los métodos más importantes para trabajar con listas -### - -# Creamos una lista con valores -lista1 = ['a', 'b', 'c', 'd'] - -# Añadir o insertar elementos a la lista -lista1.append('e') # Añade un elemento al final -print(lista1) - -lista1.insert(1, '@') # Inserta un elemento en la posición que le indiquemos como primer argumento -print(lista1) - -lista1.extend(['😃', '😍']) # Agrega elementos al final de la lista -print(lista1) - -# Eliminar elementos de la lista -lista1.remove('@') # Eliminar la primera aparición de la cadena de texto @ -print(lista1) - -ultimo = lista1.pop() # Eliminar el último elemento de la lista y además te lo devuelve -print(ultimo) -print(lista1) - -lista1.pop(1) # Eliminar el segundo elemento de la lista (es el índice 1) -print(lista1) - -# Eliminar por lo bestia un índice -del lista1[-1] -print(lista1) - -lista1.clear() # Eliminar todos los elementos de la lista -print(lista1) - -# Eliminar un rango de elementos -lista1 = ['🐼', '🐨', '🐶', '😿', '🐹'] -del lista1[1:3] # eliminamos los elementos del índice 1 al 3 (no incluye el índice 3) -print(lista1) - -# Más métodos útiles -print('Ordenar listas modificando la original') -numbers = [3, 10, 2, 8, 99, 101] -numbers.sort() -print(numbers) - -print('Ordenar listas creando una nueva lista') -numbers = [3, 10, 2, 8, 99, 101] -sorted_numbers = sorted(numbers) -print(sorted_numbers) - -print("Ordenar una lista de cadenas de texto (todo minúscula)") -frutas = ['manzana', 'pera', 'limón', 'manzana', 'pera', 'limón'] -sorted_frutas = sorted(frutas) -print(sorted_frutas) - -print("Ordenar una lista de cadenas de texto (mezclas mayúscula y minúscula)") -frutas = ['manzana', 'Pera', 'Limón', 'manzana', 'pera', 'limón'] -frutas.sort(key=str.lower) -print(frutas) - -# Más cositas útiles -animals = ['🐶', '🐼', '🐨', '🐶'] -print(len(animals)) # Tamaño de la listas -> 4 -print(animals.count('🐶')) # Cuantas veces aparece el elemento '🐶' -> 2 -print('🐼' in animals) # Comprueba si hay un '🐼' en la lista -> True -print('🐹' in animals) # -> False - -### -# EJERCICIOS -# Usa siempre que puedas los métodos que has aprendido -### - -# Ejercicio 1: Añadir y modificar elementos -# Crea una lista con los números del 1 al 5. -# Añade el número 6 al final usando append(). -# Inserta el número 10 en la posición 2 usando insert(). -# Modifica el primer elemento de la lista para que sea 0. - -# Ejercicio 2: Combinar y limpiar listas -# Crea dos listas: -# lista_a = [1, 2, 3] -# lista_b = [4, 5, 6, 1, 2] -# Extiende lista_a con lista_b usando extend(). -# Elimina la primera aparición del número 1 en lista_a usando remove(). -# Elimina el elemento en el índice 3 de lista_a usando pop(). Imprime el elemento eliminado. -# Limpia completamente lista_b usando clear(). - -# Ejercicio 3: Slicing y eliminación con del -# Crea una lista con los números del 1 al 10. -# Utiliza slicing y del para eliminar los elementos desde el índice 2 hasta el 5 (sin incluir el 5). -# Imprime la lista resultante. - -# Ejercicio 4: Ordenar y contar -# Crea una lista con los siguientes números: [5, 2, 8, 1, 9, 4, 2]. -# Ordena la lista de forma ascendente usando sort(). -# Cuenta cuántas veces aparece el número 2 en la lista usando count(). -# Comprueba si el número 7 está en la lista usando in. - -# Ejercicio 5: Copia vs. Referencia -# Crea una lista llamada original con los números [1, 2, 3]. -# Crea una copia de la lista original llamada copia_1 usando slicing. -# Crea otra copia llamada copia_2 usando copy(). -# Crea una referencia a la lista original llamada referencia. -# Modifica el primer elemento de la lista referencia a 10. -# Imprime las cuatro listas (original, copia_1, copia_2, referencia) y observa los cambios. - -# Ejercicio 6: Ordenar strings sin diferenciar mayúsculas y minúsculas. -# Crea una lista con las siguientes cadenas: ["Manzana", "pera", "BANANA", "naranja"]. -# Ordena la lista sin diferenciar entre mayúsculas y minúsculas. \ No newline at end of file +### +# 04 - Listas Métodos +# Los métodos más importantes para trabajar con listas +### + +# Creamos una lista con valores +lista1 = ['a', 'b', 'c', 'd'] + +# Añadir o insertar elementos a la lista +lista1.append('e') # Añade un elemento al final +print(lista1) + +# Inserta un elemento en la posición que le indiquemos como primer argumento +lista1.insert(1, '@') +print(lista1) + +lista1.extend(['😃', '😍']) # Agrega elementos al final de la lista +print(lista1) + +# Eliminar elementos de la lista +lista1.remove('@') # Eliminar la primera aparición de la cadena de texto @ +print(lista1) + +ultimo = lista1.pop() # Eliminar el último elemento de la lista y además te lo devuelve +print(ultimo) +print(lista1) + +lista1.pop(1) # Eliminar el segundo elemento de la lista (es el índice 1) +print(lista1) + +# Eliminar por lo bestia un índice +del lista1[-1] +print(lista1) + +lista1.clear() # Eliminar todos los elementos de la lista +print(lista1) + +# Eliminar un rango de elementos +lista1 = ['🐼', '🐨', '🐶', '😿', '🐹'] +# eliminamos los elementos del índice 1 al 3 (no incluye el índice 3) +del lista1[1:3] +print(lista1) + +# Más métodos útiles +print('Ordenar listas modificando la original') +numbers = [3, 10, 2, 8, 99, 101] +numbers.sort() +print(numbers) + +print('Ordenar listas creando una nueva lista') +numbers = [3, 10, 2, 8, 99, 101] +sorted_numbers = sorted(numbers) +print(sorted_numbers) + +print("Ordenar una lista de cadenas de texto (todo minúscula)") +frutas = ['manzana', 'pera', 'limón', 'manzana', 'pera', 'limón'] +sorted_frutas = sorted(frutas) +print(sorted_frutas) + +print("Ordenar una lista de cadenas de texto (mezclas mayúscula y minúscula)") +frutas = ['manzana', 'Pera', 'Limón', 'manzana', 'pera', 'limón'] +frutas.sort(key=str.lower) +print(frutas) + +#  Más cositas útiles +animals = ['🐶', '🐼', '🐨', '🐶'] +print(len(animals)) # Tamaño de la listas -> 4 +print(animals.count('🐶')) # Cuantas veces aparece el elemento '🐶' -> 2 +print('🐼' in animals) # Comprueba si hay un '🐼' en la lista -> True +print('🐹' in animals) # -> False + +### +# EJERCICIOS +# Usa siempre que puedas los métodos que has aprendido +### + +# Ejercicio 1: Añadir y modificar elementos +# Crea una lista con los números del 1 al 5. +# Añade el número 6 al final usando append(). +# Inserta el número 10 en la posición 2 usando insert(). +# Modifica el primer elemento de la lista para que sea 0. + +# Ejercicio 2: Combinar y limpiar listas +# Crea dos listas: +# lista_a = [1, 2, 3] +# lista_b = [4, 5, 6, 1, 2] +# Extiende lista_a con lista_b usando extend(). +# Elimina la primera aparición del número 1 en lista_a usando remove(). +# Elimina el elemento en el índice 3 de lista_a usando pop(). Imprime el elemento eliminado. +# Limpia completamente lista_b usando clear(). + +# Ejercicio 3: Slicing y eliminación con del +# Crea una lista con los números del 1 al 10. +# Utiliza slicing y del para eliminar los elementos desde el índice 2 hasta el 5 (sin incluir el 5). +# Imprime la lista resultante. + +# Ejercicio 4: Ordenar y contar +# Crea una lista con los siguientes números: [5, 2, 8, 1, 9, 4, 2]. +# Ordena la lista de forma ascendente usando sort(). +# Cuenta cuántas veces aparece el número 2 en la lista usando count(). +# Comprueba si el número 7 está en la lista usando in. + +# Ejercicio 5: Copia vs. Referencia +# Crea una lista llamada original con los números [1, 2, 3]. +# Crea una copia de la lista original llamada copia_1 usando slicing. +# Crea otra copia llamada copia_2 usando copy(). +# Crea una referencia a la lista original llamada referencia. +# Modifica el primer elemento de la lista referencia a 10. +# Imprime las cuatro listas (original, copia_1, copia_2, referencia) y observa los cambios. + +# Ejercicio 6: Ordenar strings sin diferenciar mayúsculas y minúsculas. +# Crea una lista con las siguientes cadenas: ["Manzana", "pera", "BANANA", "naranja"]. +# Ordena la lista sin diferenciar entre mayúsculas y minúsculas. diff --git a/02_flow_control/04_list_methods_solutions.py b/02_flow_control/04_list_methods_solutions.py index ea93fcb..7cd3b8f 100644 --- a/02_flow_control/04_list_methods_solutions.py +++ b/02_flow_control/04_list_methods_solutions.py @@ -1,83 +1,83 @@ -### -# EJERCICIOS -### - -# Ejercicio 1: Añadir y modificar elementos -# Crea una lista con los números del 1 al 5. -# Añade el número 6 al final usando append(). -# Inserta el número 10 en la posición 2 usando insert(). -# Modifica el primer elemento de la lista para que sea 0. -print("\nEjercicio 1:") -lista = [1, 2, 3, 4, 5] -lista.append(6) -lista.insert(2, 10) -lista[0] = 0 -print(lista) # Output: [0, 2, 10, 3, 4, 5, 6] - -# Ejercicio 2: Combinar y limpiar listas -# Crea dos listas: -# lista_a = [1, 2, 3] -# lista_b = [4, 5, 6, 1, 2] -# Extiende lista_a con lista_b usando extend(). -# Elimina la primera aparición del número 1 en lista_a usando remove(). -# Elimina el elemento en el índice 3 de lista_a usando pop(). Imprime el elemento eliminado. -# Limpia completamente lista_b usando clear(). -print("\nEjercicio 2:") -lista_a = [1, 2, 3] -lista_b = [4, 5, 6, 1, 2] -lista_a.extend(lista_b) -lista_a.remove(1) -elemento_eliminado = lista_a.pop(3) -print(f"Elemento eliminado: {elemento_eliminado}") #Output: Elemento eliminado: 5 -lista_b.clear() -print("Lista a:", lista_a) #Output: Lista a: [2, 3, 4, 6, 1, 2] -print("Lista b:", lista_b) #Output: Lista b: [] - -# Ejercicio 3: Slicing y eliminación con del -# Crea una lista con los números del 1 al 10. -# Utiliza slicing y del para eliminar los elementos desde el índice 2 hasta el 5 (sin incluir el 5). -# Imprime la lista resultante. -print("\nEjercicio 3:") -lista = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] -del lista[2:5] -print(lista) # Output: [1, 2, 6, 7, 8, 9, 10] - -# Ejercicio 4: Ordenar y contar -# Crea una lista con los siguientes números: [5, 2, 8, 1, 9, 4, 2]. -# Ordena la lista de forma ascendente usando sort(). -# Cuenta cuántas veces aparece el número 2 en la lista usando count(). -# Comprueba si el número 7 está en la lista usando in. -print("\nEjercicio 4:") -lista = [5, 2, 8, 1, 9, 4, 2] -lista.sort() -cantidad_dos = lista.count(2) -esta_el_siete = 7 in lista -print(f"Lista ordenada: {lista}") #Output: Lista ordenada: [1, 2, 2, 4, 5, 8, 9] -print(f"Cantidad de 2: {cantidad_dos}") #Output: Cantidad de 2: 2 -print(f"¿Está el 7?: {esta_el_siete}") #Output: ¿Está el 7?: False - -# Ejercicio 5: Copia vs. Referencia -# Crea una lista llamada original con los números [1, 2, 3]. -# Crea una copia de la lista original llamada copia_1 usando slicing. -# Crea otra copia llamada copia_2 usando copy(). -# Crea una referencia a la lista original llamada referencia. -# Modifica el primer elemento de la lista referencia a 10. -# Imprime las cuatro listas (original, copia_1, copia_2, referencia) y observa los cambios. -print("\nEjercicio 5:") -original = [1, 2, 3] -copia_1 = original[:] -copia_2 = original.copy() -referencia = original -referencia[0] = 10 -print(f"Original: {original}") # Output: Original: [10, 2, 3] -print(f"Copia 1 (slicing): {copia_1}") # Output: Copia 1 (slicing): [1, 2, 3] -print(f"Copia 2 (copy()): {copia_2}") # Output: Copia 2 (copy()): [1, 2, 3] -print(f"Referencia: {referencia}") # Output: Referencia: [10, 2, 3] - -# Ejercicio 6: Ordenar strings sin diferenciar mayúsculas y minúsculas. -# Crea una lista con las siguientes cadenas: ["Manzana", "pera", "BANANA", "naranja"]. -# Ordena la lista sin diferenciar entre mayúsculas y minúsculas. -print("\nEjercicio 6:") -strings = ["Manzana", "pera", "BANANA", "naranja"] -strings.sort(key=str.lower) +### +# EJERCICIOS +### + +# Ejercicio 1: Añadir y modificar elementos +# Crea una lista con los números del 1 al 5. +# Añade el número 6 al final usando append(). +# Inserta el número 10 en la posición 2 usando insert(). +# Modifica el primer elemento de la lista para que sea 0. +print("\nEjercicio 1:") +lista = [1, 2, 3, 4, 5] +lista.append(6) +lista.insert(2, 10) +lista[0] = 0 +print(lista) # Output: [0, 2, 10, 3, 4, 5, 6] + +# Ejercicio 2: Combinar y limpiar listas +# Crea dos listas: +# lista_a = [1, 2, 3] +# lista_b = [4, 5, 6, 1, 2] +# Extiende lista_a con lista_b usando extend(). +# Elimina la primera aparición del número 1 en lista_a usando remove(). +# Elimina el elemento en el índice 3 de lista_a usando pop(). Imprime el elemento eliminado. +# Limpia completamente lista_b usando clear(). +print("\nEjercicio 2:") +lista_a = [1, 2, 3] +lista_b = [4, 5, 6, 1, 2] +lista_a.extend(lista_b) +lista_a.remove(1) +elemento_eliminado = lista_a.pop(3) +print(f"Elemento eliminado: {elemento_eliminado}") #Output: Elemento eliminado: 5 +lista_b.clear() +print("Lista a:", lista_a) #Output: Lista a: [2, 3, 4, 6, 1, 2] +print("Lista b:", lista_b) #Output: Lista b: [] + +# Ejercicio 3: Slicing y eliminación con del +# Crea una lista con los números del 1 al 10. +# Utiliza slicing y del para eliminar los elementos desde el índice 2 hasta el 5 (sin incluir el 5). +# Imprime la lista resultante. +print("\nEjercicio 3:") +lista = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] +del lista[2:5] +print(lista) # Output: [1, 2, 6, 7, 8, 9, 10] + +# Ejercicio 4: Ordenar y contar +# Crea una lista con los siguientes números: [5, 2, 8, 1, 9, 4, 2]. +# Ordena la lista de forma ascendente usando sort(). +# Cuenta cuántas veces aparece el número 2 en la lista usando count(). +# Comprueba si el número 7 está en la lista usando in. +print("\nEjercicio 4:") +lista = [5, 2, 8, 1, 9, 4, 2] +lista.sort() +cantidad_dos = lista.count(2) +esta_el_siete = 7 in lista +print(f"Lista ordenada: {lista}") #Output: Lista ordenada: [1, 2, 2, 4, 5, 8, 9] +print(f"Cantidad de 2: {cantidad_dos}") #Output: Cantidad de 2: 2 +print(f"¿Está el 7?: {esta_el_siete}") #Output: ¿Está el 7?: False + +# Ejercicio 5: Copia vs. Referencia +# Crea una lista llamada original con los números [1, 2, 3]. +# Crea una copia de la lista original llamada copia_1 usando slicing. +# Crea otra copia llamada copia_2 usando copy(). +# Crea una referencia a la lista original llamada referencia. +# Modifica el primer elemento de la lista referencia a 10. +# Imprime las cuatro listas (original, copia_1, copia_2, referencia) y observa los cambios. +print("\nEjercicio 5:") +original = [1, 2, 3] +copia_1 = original[:] +copia_2 = original.copy() +referencia = original +referencia[0] = 10 +print(f"Original: {original}") # Output: Original: [10, 2, 3] +print(f"Copia 1 (slicing): {copia_1}") # Output: Copia 1 (slicing): [1, 2, 3] +print(f"Copia 2 (copy()): {copia_2}") # Output: Copia 2 (copy()): [1, 2, 3] +print(f"Referencia: {referencia}") # Output: Referencia: [10, 2, 3] + +# Ejercicio 6: Ordenar strings sin diferenciar mayúsculas y minúsculas. +# Crea una lista con las siguientes cadenas: ["Manzana", "pera", "BANANA", "naranja"]. +# Ordena la lista sin diferenciar entre mayúsculas y minúsculas. +print("\nEjercicio 6:") +strings = ["Manzana", "pera", "BANANA", "naranja"] +strings.sort(key=str.lower) print(strings) # Output: ['BANANA', 'Manzana', 'naranja', 'pera'] \ No newline at end of file diff --git a/03_loops/01_loop_while.py b/03_loops/01_loop_while.py index ceb88f4..f735e69 100644 --- a/03_loops/01_loop_while.py +++ b/03_loops/01_loop_while.py @@ -1,110 +1,174 @@ -### -# 01 - Bucles (while) -# Permiten ejecutar un bloque de código repetidamente mientras se cumpla una condición -### - -print("\n Bucle while:") - -# Bucle con una simple condición -contador = 0 - -while contador <= 5: - print(contador) - contador += 1 # es super importante para evitar un bucle infinito - -# utilizando la palabra break, para romper el bucle -print("\n Bucle while con break:") -contador = 0 - -while True: - print(contador) - contador += 1 - if contador == 5: - break # sale del bucle - -# continue, que lo hace es saltar esa iteración en concreto -# y continuar con el bucle -print("\n Bucle con continue") -contador = 0 -while contador < 10: - contador += 1 - - if contador % 2 == 0: - continue - - print(contador) - -# else, esta condición cuando se ejecuta? -print("\n Bucle while con else:") -contador = 0 -while contador < 5: - print(contador) - contador += 1 -else: - print("El bucle ha terminado") - -# else, esta condición cuando se ejecuta? -print("\n Bucle while con else:") -contador = 0 -while contador < 5: - print(contador) - contador += 1 -else: - print("El bucle ha terminado") - -# pedirle al usuario un número que tiene -# que ser positivo si no, no le dejamos en paz -numero = -1 -while numero < 0: - numero = int(input("Escribe un número positivo: ")) - if numero < 0: - print("El número debe ser positivo. Intenta otra vez, majo o maja.") - -print(f"El número que has introducido es {numero}") - -numero = -1 -while numero < 0: - try: - numero = int(input("Escribe un número positivo: ")) - if numero < 0: - print("El número debe ser positivo. Intenta otra vez, majo o maja.") - except: - print("Lo que introduces debe ser un número, que si no peta!") - -print(f"El número que has introducido es {numero}") - -### -# EJERCICIOS (while) -### - -# Ejercicio 1: Cuenta atrás -# Imprime los números del 10 al 1 usando un bucle while. -print("\nEjercicio 1:") - -# Ejercicio 2: Suma de números pares (while) -# Calcula la suma de los números pares entre 1 y 20 (inclusive) usando un bucle while. -print("\nEjercicio 2:") - -# Ejercicio 3: Factorial de un número -# Pide al usuario que introduzca un número entero positivo. -# Calcula su factorial usando un bucle while. -# El factorial de un número entero positivo es el producto de todos los números del 1 al ese número. Por ejemplo, el factorial de 5 -# 5! = 5 x 4 x 3 x 2 x 1 = 120. -print("\nEjercicio 3:") - -# Ejercicio 4: Validación de contraseña -# Pide al usuario que introduzca una contraseña. -# La contraseña debe tener al menos 8 caracteres. -# Usa un bucle while para seguir pidiendo la contraseña hasta que cumpla con los requisitos. -# Si la contraseña es válida, imprime "Contraseña válida". -print("\nEjercicio 4:") - -# Ejercicio 5: Tabla de multiplicar -# Pide al usuario que introduzca un número. -# Imprime la tabla de multiplicar de ese número (del 1 al 10) usando un bucle while. -print("\nEjercicio 5:") - -# Ejercicio 6: Números primos hasta N -# Pide al usuario que introduzca un número entero positivo N. -# Imprime todos los números primos menores o iguales que N usando un bucle while. -print("\nEjercicio 6:") \ No newline at end of file +### +# 01 - Bucles (while) +# Permiten ejecutar un bloque de código repetidamente mientras se cumpla una condición +### + +print("\n Bucle while:") + +# Bucle con una simple condición +contador = 0 + +while contador <= 5: + print(contador) + contador += 1 # es super importante para evitar un bucle infinito + +# utilizando la palabra break, para romper el bucle +print("\n Bucle while con break:") +contador = 0 + +while True: + print(contador) + contador += 1 + if contador == 5: + break # sale del bucle + +# continue, que lo hace es saltar esa iteración en concreto +# y continuar con el bucle +print("\n Bucle con continue") +contador = 0 +while contador < 10: + contador += 1 + + if contador % 2 == 0: + continue + + print(contador) + +# else, esta condición cuando se ejecuta? +print("\n Bucle while con else:") +contador = 0 +while contador < 5: + print(contador) + contador += 1 +else: + print("El bucle ha terminado") + +# else, esta condición cuando se ejecuta? +print("\n Bucle while con else:") +contador = 0 +while contador < 5: + print(contador) + contador += 1 +else: + print("El bucle ha terminado") + +# pedirle al usuario un número que tiene +# que ser positivo si no, no le dejamos en paz +numero = -1 +while numero < 0: + numero = int(input("Escribe un número positivo: ")) + if numero < 0: + print("El número debe ser positivo. Intenta otra vez, majo o maja.") + +print(f"El número que has introducido es {numero}") + +numero = -1 +while numero < 0: + try: + numero = int(input("Escribe un número positivo: ")) + if numero < 0: + print("El número debe ser positivo. Intenta otra vez, majo o maja.") + except: + print("Lo que introduces debe ser un número, que si no peta!") + +print(f"El número que has introducido es {numero}") + +### +# EJERCICIOS (while) +### + +# Ejercicio 1: Cuenta atrás +# Imprime los números del 10 al 1 usando un bucle while. +print("\nEjercicio 1: Cuenta atrás") + +numero = 10 + +while numero >= 1: + print(numero) + numero -= 1 # los números se imprimen de manera descendente. + + +# Ejercicio 2: Suma de números pares (while) +# Calcula la suma de los números pares entre 1 y 20 (inclusive) usando un bucle while. +print("\nEjercicio 2: Suma de números pares") + +numero = 1 +suma = 0 + +while numero <= 20: + if numero % 2 == 0: + suma += numero + numero += 1 + +print(f"La suma de los números pares hasta 20 es: {suma}") + + +# Ejercicio 3: Factorial de un número +# Pide al usuario que introduzca un número entero positivo. +# Calcula su factorial usando un bucle while. +# El factorial de un número entero positivo es el producto de todos los números del 1 al ese número. Por ejemplo, el factorial de 5 +# 5! = 5 x 4 x 3 x 2 x 1 = 120. +print("\nEjercicio 3: Factorial de un número") + +numero = int(input("Introduce un número entero positivo: ")) +factorial = 1 + +while numero > 0: + factorial *= numero + numero -= 1 + +print(f"El factorial del número introducido es: {factorial}") + + +# Ejercicio 4: Validación de contraseña +# Pide al usuario que introduzca una contraseña. +# La contraseña debe tener al menos 8 caracteres. +# Usa un bucle while para seguir pidiendo la contraseña hasta que cumpla con los requisitos. +# Si la contraseña es válida, imprime "Contraseña válida". +print("\nEjercicio 4: Validación de contraseña") + +password = input("Introduce una contraseña (al menos 8 caracteres): ") + +while len(password) < 8: + print("La contraseña debe tener al menos 8 caracteres.") + # El usuario vuelve a digitar la contraseña, hasta que sea correcta + password = input("Introduce una contraseña (al menos 8 caracteres): ") + +print("Contraseña válida ✔") + +# Ejercicio 5: Tabla de multiplicar +# Pide al usuario que introduzca un número. +# Imprime la tabla de multiplicar de ese número (del 1 al 10) usando un bucle while. +print("\nEjercicio 5: Tabla de multiplicar") + +numero = int(input("Introduce un número: ")) + +contador = 1 + +while contador <= 10: + print(f"{numero} x {contador} = {numero * contador}") + contador += 1 # incrementa el contador + +# Ejercicio 6: Números primos hasta N +# Pide al usuario que introduzca un número entero positivo N. +# Imprime todos los números primos menores o iguales que N usando un bucle while. +print("\nEjercicio 6: Números primos hasta N") + +numero = int(input("Introduce un número entero positivo: ")) + +contador = 2 # el primer número primo, salta de 2 en 2 + +while contador <= numero: + es_primo = True # asumimos que el número es primo + divisor = 2 # el primer número primo + + while divisor < contador: + if contador % divisor == 0: + es_primo = False + break + divisor += 1 + + if es_primo: + print(contador) + + contador += 1 diff --git a/03_loops/01_loop_while_solutions.py b/03_loops/01_loop_while_solutions.py index bb5b5cd..db125bb 100644 --- a/03_loops/01_loop_while_solutions.py +++ b/03_loops/01_loop_while_solutions.py @@ -1,90 +1,94 @@ -### -# EJERCICIOS (while) -### - -# Ejercicio 1: Cuenta atrás -# Imprime los números del 10 al 1 usando un bucle while. -print("\nEjercicio 1:") -numero = 10 -while numero >= 1: - print(numero) - numero -= 1 - -# Ejercicio 2: Suma de números pares (while) -# Calcula la suma de los números pares entre 1 y 20 (inclusive) usando un bucle while. -print("\nEjercicio 2:") -numero = 1 -suma_pares = 0 -while numero <= 20: - if numero % 2 == 0: - suma_pares += numero - numero += 1 - -print(f"La suma de los números pares hasta 20 es: {suma_pares}") - -# Ejercicio 3: Factorial de un número -# Pide al usuario que introduzca un número entero positivo. -# Calcula su factorial usando un bucle while. -# El factorial de un número entero positivo es el producto de todos los números del 1 al ese número. Por ejemplo, el factorial de 5 -# 5! = 5 x 4 x 3 x 2 x 1 = 120. -print("\nEjercicio 3:") - -numero = int(input("Introduce un número entero positivo: ")) -factorial = 1 -contador = 1 - -while contador <= numero: - factorial *= contador - contador += 1 - -print(f"El factorial de {numero} es: {factorial}") - -# Ejercicio 4: Validación de contraseña -# Pide al usuario que introduzca una contraseña. -# La contraseña debe tener al menos 8 caracteres. -# Usa un bucle while para seguir pidiendo la contraseña hasta que cumpla con los requisitos. -# Si la contraseña es válida, imprime "Contraseña válida". -print("\nEjercicio 4:") - -contrasena = "" -while len(contrasena) < 8: - contrasena = input("Introduce una contraseña (al menos 8 caracteres): ") - if len(contrasena) < 8: - print("La contraseña debe tener al menos 8 caracteres. Inténtalo de nuevo.") - -print("Contraseña válida") - -# Ejercicio 5: Tabla de multiplicar -# Pide al usuario que introduzca un número. -# Imprime la tabla de multiplicar de ese número (del 1 al 10) usando un bucle while. -print("\nEjercicio 5:") - -numero = int(input("Introduce un número: ")) -multiplicador = 1 - -while multiplicador <= 10: - resultado = numero * multiplicador - print(f"{numero} x {multiplicador} = {resultado}") - multiplicador += 1 - -# Ejercicio 6: Números primos hasta N -# Pide al usuario que introduzca un número entero positivo N. -# Imprime todos los números primos menores o iguales que N usando un bucle while. -# Un número es primo si es divisible por sólo uno de los números enteros entre 1 y él mismo, incluido. - -print("\nEjercicio 6:") -n = int(input("Introduce un número entero positivo N: ")) - -numero = 2 -while numero <= n: - es_primo = True # Asumimos que el número es primo hasta que se demuestre lo contrario - divisor = 2 - while divisor * divisor <= numero: # Optimizamos: no es necesario probar divisores hasta numero - if numero % divisor == 0: - es_primo = False # Si encontramos un divisor, no es primo - break # Salimos del bucle interior - divisor += 1 - if es_primo: - print(numero) - - numero += 1 \ No newline at end of file +### +# EJERCICIOS (while) +### + +# Ejercicio 1: Cuenta atrás +# Imprime los números del 10 al 1 usando un bucle while. +print("\nEjercicio 1:") +numero = 10 +while numero >= 1: + print(numero) + numero -= 1 + +# Ejercicio 2: Suma de números pares (while) +# Calcula la suma de los números pares entre 1 y 20 (inclusive) usando un bucle while. +print("\nEjercicio 2:") +numero = 1 +suma_pares = 0 +while numero <= 20: + if numero % 2 == 0: + suma_pares += numero + numero += 1 + +print(f"La suma de los números pares hasta 20 es: {suma_pares}") + +# Ejercicio 3: Factorial de un número +# Pide al usuario que introduzca un número entero positivo. +# Calcula su factorial usando un bucle while. +# El factorial de un número entero positivo es el producto de todos los números del 1 al ese número. Por ejemplo, el factorial de 5 +# 5! = 5 x 4 x 3 x 2 x 1 = 120. +print("\nEjercicio 3:") + +numero = int(input("Introduce un número entero positivo: ")) +factorial = 1 +contador = 1 + +while contador <= numero: + factorial *= contador + contador += 1 + +print(f"El factorial de {numero} es: {factorial}") + +# Ejercicio 4: Validación de contraseña +# Pide al usuario que introduzca una contraseña. +# La contraseña debe tener al menos 8 caracteres. +# Usa un bucle while para seguir pidiendo la contraseña hasta que cumpla con los requisitos. +# Si la contraseña es válida, imprime "Contraseña válida". +print("\nEjercicio 4:") + +contrasena = "" +while len(contrasena) < 8: + contrasena = input("Introduce una contraseña (al menos 8 caracteres): ") + if len(contrasena) < 8: + print("La contraseña debe tener al menos 8 caracteres. Inténtalo de nuevo.") + +print("Contraseña válida") + +# Ejercicio 5: Tabla de multiplicar +# Pide al usuario que introduzca un número. +# Imprime la tabla de multiplicar de ese número (del 1 al 10) usando un bucle while. +print("\nEjercicio 5:") + +numero = int(input("Introduce un número: ")) +multiplicador = 1 + +while multiplicador <= 10: + resultado = numero * multiplicador + print(f"{numero} x {multiplicador} = {resultado}") + multiplicador += 1 + +# Ejercicio 6: Números primos hasta N +# Pide al usuario que introduzca un número entero positivo N. +# Imprime todos los números primos menores o iguales que N usando un bucle while. +# Un número es primo si es divisible por sólo uno de los números enteros entre 1 y él mismo, incluido. + +print("\nEjercicio 6:") +n = int(input("Introduce un número entero positivo N: ")) + +numero = 2 +while numero <= n: + es_primo = ( + True # Asumimos que el número es primo hasta que se demuestre lo contrario + ) + divisor = 2 + while ( + divisor * divisor <= numero + ): # Optimizamos: no es necesario probar divisores hasta numero + if numero % divisor == 0: + es_primo = False # Si encontramos un divisor, no es primo + break # Salimos del bucle interior + divisor += 1 + if es_primo: + print(numero) + + numero += 1 diff --git a/03_loops/02_loop_for.py b/03_loops/02_loop_for.py index f974a5c..e7e24b1 100644 --- a/03_loops/02_loop_for.py +++ b/03_loops/02_loop_for.py @@ -1,90 +1,135 @@ -### -# 02 - Bucles (for) -# Permiten ejecutar un bloque de código repetidamente mientras ITERA un iterable o una lista -### - -print("\nBucle for:") - -# Iterar una lista -frutas = ["manzana", "pera", "mandarina"] -for fruta in frutas: - print(fruta) - -# Iterar sobre cualquier cosa que sea iterable -cadena = "midudev" -for caracter in cadena: - print(caracter) - -# enumerate() -frutas = ["manzana", "pera", "mandarina"] -for idx, value in enumerate(frutas): - print(f"El índice es {idx} y la fruta es {value}") - -# bucles anidados -letras = ["A", "B", "C"] -numeros = [1, 2, 3] - -for letra in letras: - for numero in numeros: - print(f"{letra}{numero}") - - -# break -print("\nbreak:") -animales = ["perro", "gato", "raton", "loro", "pez", "canario"] -for idx, animal in enumerate(animales): - print(animal) - if animal == "loro": - print(f"El loro está escondido en el índice {idx}") - break - -# continue -print("\ncontinue:") -animales = ["perro", "gato", "raton", "loro", "pez", "canario"] -for idx, animal in enumerate(animales): - if animal == "loro": continue - - print(animal) - -# Comprensión de listas (list comprehension) -animales = ["perro", "gato", "raton", "loro", "pez", "canario"] -animales_mayus = [animal.upper() for animal in animales] -print(animales_mayus) - -# Muestra los números pares de una lista -pares = [num for num in [1, 2, 3, 4, 5, 6] if num % 2 == 0] -print(pares) - -### -# EJERCICIOS (for) -### - -# Ejercicio 1: Imprimir números pares -# Imprime todos los números pares del 2 al 20 (inclusive) usando un bucle for. -print("\nEjercicio 1:") - -# Ejercicio 2: Calcular la media de una lista -# Dada la siguiente lista de números: -# numeros = [10, 20, 30, 40, 50] -# Calcula la media de los números usando un bucle for. -print("\nEjercicio 2:") - -# Ejercicio 3: Buscar el máximo de una lista -# Dada la siguiente lista de números: -# numeros = [15, 5, 25, 10, 20] -# Encuentra el número máximo en la lista usando un bucle for. -print("\nEjercicio 3:") - -# Ejercicio 4: Filtrar cadenas por longitud -# Dada la siguiente lista de palabras: -# palabras = ["casa", "arbol", "sol", "elefante", "luna"] -# Crea una nueva lista que contenga solo las palabras con más de 5 letras -# usando un bucle for y list comprehension. -print("\nEjercicio 4:") - -# Ejercicio 5: Contar palabras que empiezan con una letra -# Dada la siguiente lista de palabras: -# palabras = ["casa", "arbol", "sol", "elefante", "luna", "coche"] -# Pide al usuario que introduzca una letra. -# Cuenta cuántas palabras en la lista empiezan con esa letra (sin diferenciar mayúsculas/minúsculas). -print("\nEjercicio 5:") \ No newline at end of file +### +# 02 - Bucles (for) +# Permiten ejecutar un bloque de código repetidamente mientras ITERA un iterable o una lista +### + +print("\nBucle for:") + +# Iterar una lista +frutas = ["manzana", "pera", "mandarina"] +for fruta in frutas: + print(fruta) + +# Iterar sobre cualquier cosa que sea iterable +cadena = "midudev" +for caracter in cadena: + print(caracter) + +# enumerate() +frutas = ["manzana", "pera", "mandarina"] +for idx, value in enumerate(frutas): + print(f"El índice es {idx} y la fruta es {value}") + +# bucles anidados +letras = ["A", "B", "C"] +numeros = [1, 2, 3] + +for letra in letras: + for numero in numeros: + print(f"{letra}{numero}") + + +# break +print("\nbreak:") +animales = ["perro", "gato", "raton", "loro", "pez", "canario"] +for idx, animal in enumerate(animales): + print(animal) + if animal == "loro": + print(f"El loro está escondido en el índice {idx}") + break + +# continue +print("\ncontinue:") +animales = ["perro", "gato", "raton", "loro", "pez", "canario"] +for idx, animal in enumerate(animales): + if animal == "loro": + continue + + print(animal) + +# Comprensión de listas (list comprehension) +animales = ["perro", "gato", "raton", "loro", "pez", "canario"] +animales_mayus = [animal.upper() for animal in animales] +print(animales_mayus) + +# Muestra los números pares de una lista +pares = [num for num in [1, 2, 3, 4, 5, 6] if num % 2 == 0] +print(pares) + +### +# EJERCICIOS (for) +### + +# Ejercicio 1: Imprimir números pares +# Imprime todos los números pares del 2 al 20 (inclusive) usando un bucle for. +print("\nEjercicio 1: Imprimir números pares:") + +for num in range(2, 21, 2): + print(num) + + +# Ejercicio 2: Calcular la media de una lista +# Dada la siguiente lista de números: +# numeros = [10, 20, 30, 40, 50] +# Calcula la media de los números usando un bucle for. +print("\nEjercicio 2: Calcular la media de na lista") + +numeros: int = [10, 20, 30, 40, 50] +suma: int = 0 + +for num in numeros: + suma += num + +# / da el número con decimales +# // da el número entero. +media: int = suma // numeros.__len__() +print(f"La media de la lista es: {media}") + + +# Ejercicio 3: Buscar el máximo de una lista +# Dada la siguiente lista de números: +# numeros = [15, 5, 25, 10, 20] +# Encuentra el número máximo en la lista usando un bucle for. +print("\nEjercicio 3: Buscar el máximo de una lista") + +numeros = [15, 5, 25, 10, 20] + +numero_maximo = numeros[0] # Iniciando con el primer número de la lista + +for num in numeros: + if num > numero_maximo: + numero_maximo = num # Actualizando el número máximo + +print(f"El número máximo de la lista es: {numero_maximo}") + +# Ejercicio 4: Filtrar cadenas por longitud +# Dada la siguiente lista de palabras: +# palabras = ["casa", "arbol", "sol", "elefante", "luna"] +# Crea una nueva lista que contenga solo las palabras con más de 5 letras +# usando un bucle for y list comprehension. + +print("\nEjercicio 4: Filtrar cadenas por longitud") + +palabras = ["casa", "arbol", "sol", "elefante", "luna"] +palabras_largas = [palabra for palabra in palabras if len(palabra) > 5] +print(palabras_largas) + +# Ejercicio 5: Contar palabras que empiezan con una letra +# Dada la siguiente lista de palabras: +# palabras = ["casa", "arbol", "sol", "elefante", "luna", "coche"] +# Pide al usuario que introduzca una letra. +# Cuenta cuántas palabras en la lista empiezan con esa letra (sin diferenciar mayúsculas/minúsculas). +print("\nEjercicio 5: Contar palabras que empiezan con una letra") + +palabras = ["casa", "arbol", "sol", "elefante", "luna", "coche"] + +# Convirtiendo la letra a minúscula +letra = input("Introduce una letra: ").lower() + +contador = 0 + +for palabra in palabras: + if palabra.lower().startswith(letra): + contador += 1 + +print(f"Hay {contador} palabras que empiezan con la letra {letra}") diff --git a/03_loops/02_loop_for_solutions.py b/03_loops/02_loop_for_solutions.py index 54903f0..d28eebb 100644 --- a/03_loops/02_loop_for_solutions.py +++ b/03_loops/02_loop_for_solutions.py @@ -1,57 +1,62 @@ -### -# EJERCICIOS (for) -### - -# Ejercicio 1: Imprimir números pares -# Imprime todos los números pares del 2 al 20 (inclusive) usando un bucle for. -print("\nEjercicio 1:") -for numero in range(2, 21, 2): # range(inicio, fin, paso) - print(numero) - -# Ejercicio 2: Calcular la media de una lista -# Dada la siguiente lista de números: -# numeros = [10, 20, 30, 40, 50] -# Calcula la media de los números usando un bucle for. -print("\nEjercicio 2:") -numeros = [10, 20, 30, 40, 50] -suma = 0 -for numero in numeros: - suma += numero -media = suma / len(numeros) -print(f"La media es: {media}") - -# Ejercicio 3: Buscar el máximo de una lista -# Dada la siguiente lista de números: -# numeros = [15, 5, 25, 10, 20] -# Encuentra el número máximo en la lista usando un bucle for. -print("\nEjercicio 3:") -numeros = [15, 5, 25, 10, 20] -maximo = numeros[0] # Inicializamos con el primer elemento -for numero in numeros: - if numero > maximo: - maximo = numero -print(f"El número máximo es: {maximo}") - -# Ejercicio 4: Filtrar cadenas por longitud -# Dada la siguiente lista de palabras: -# palabras = ["casa", "arbol", "sol", "elefante", "luna"] -# Crea una nueva lista que contenga solo las palabras con más de 5 letras -# usando un bucle for y list comprehension. -print("\nEjercicio 4:") -palabras = ["casa", "arbol", "sol", "elefante", "luna"] -palabras_largas = [palabra for palabra in palabras if len(palabra) > 5] -print(palabras_largas) - -# Ejercicio 5: Contar palabras que empiezan con una letra -# Dada la siguiente lista de palabras: -# palabras = ["casa", "arbol", "sol", "elefante", "luna", "coche"] -# Pide al usuario que introduzca una letra. -# Cuenta cuántas palabras en la lista empiezan con esa letra (sin diferenciar mayúsculas/minúsculas). -print("\nEjercicio 5:") -palabras = ["casa", "arbol", "sol", "elefante", "luna", "coche"] -letra = input("Introduce una letra: ").lower() # Convertimos la letra a minúscula -contador = 0 -for palabra in palabras: - if palabra.lower().startswith(letra): # Comparamos en minúsculas - contador += 1 -print(f"Hay {contador} palabras que empiezan con la letra {letra}") \ No newline at end of file +### +# EJERCICIOS (for) +### + +# Ejercicio 1: Imprimir números pares +# Imprime todos los números pares del 2 al 20 (inclusive) usando un bucle for. +print("\nEjercicio 1:") +for numero in range(2, 21, 2): # range(inicio, fin, paso) + print(numero) + +# Ejercicio 2: Calcular la media de una lista +# Dada la siguiente lista de números: +# numeros = [10, 20, 30, 40, 50] +# Calcula la media de los números usando un bucle for. +print("\nEjercicio 2:") +numeros = [10, 20, 30, 40, 50] +suma = 0 +for numero in numeros: + suma += numero +media = suma / len(numeros) +print(f"La media es: {media}") + +# Ejercicio 3: Buscar el máximo de una lista +# Dada la siguiente lista de números: +# numeros = [15, 5, 25, 10, 20] +# Encuentra el número máximo en la lista usando un bucle for. +print("\nEjercicio 3:") +numeros = [15, 5, 25, 10, 20] +maximo = numeros[0] # Inicializamos con el primer elemento +for numero in numeros: + if numero > maximo: + maximo = numero +print(f"El número máximo es: {maximo}") + +# Ejercicio 4: Filtrar cadenas por longitud +# Dada la siguiente lista de palabras: +# palabras = ["casa", "arbol", "sol", "elefante", "luna"] +# Crea una nueva lista que contenga solo las palabras con más de 5 letras +# usando un bucle for y list comprehension. +print("\nEjercicio 4:") +palabras = ["casa", "arbol", "sol", "elefante", "luna"] +palabras_largas = [palabra for palabra in palabras if len(palabra) > 5] +print(palabras_largas) + +# Ejercicio 5: Contar palabras que empiezan con una letra +# Dada la siguiente lista de palabras: +# palabras = ["casa", "arbol", "sol", "elefante", "luna", "coche"] +# Pide al usuario que introduzca una letra. +# Cuenta cuántas palabras en la lista empiezan con esa letra (sin diferenciar mayúsculas/minúsculas). + +print("\nEjercicio 5: Contar palabras que empiezan con una letra") + +palabras = ["casa", "arbol", "sol", "elefante", "luna", "coche"] + +letra = input("Introduce una letra: ").lower() # Convertimos la letra a minúscula + +contador = 0 + +for palabra in palabras: + if palabra.lower().startswith(letra): # Comparamos en minúsculas + contador += 1 +print(f"Hay {contador} palabras que empiezan con la letra {letra}") diff --git a/03_loops/03_range.py b/03_loops/03_range.py index fcc6490..5d0ee7c 100644 --- a/03_loops/03_range.py +++ b/03_loops/03_range.py @@ -1,64 +1,88 @@ -### -# 03 - range() -# Permite crear una secuencia de números. Puede ser útil para for, pero no solo para eso -### - -print("\nrange():") - -# Generado una secuencia de números del 0 al 9 -for num in range(10): - print(num) - -# range(inicio, fin) -for num in range(5, 10): - print(num) - -# range(inicio, fin, paso) -for num in range(0, 1000, 5): - print(num) - -for num in range(-5, 0): - print(num) - -for num in range(10, 0, -1): - print(num) - -for num in range(0, 444): - print(num) - -nums = range(10) -list_of_nums = list(nums) -print(list_of_nums) - -# seria para hacerlo cinco veces -for _ in range(5): - print("hacer cinco veces algo") - -### -# EJERCICIOS (range) -### - -# Ejercicio 1: Imprimir números del 1 al 10 -# Imprime los números del 1 al 10 (inclusive) usando un bucle for y range(). -print("\nEjercicio 1:") - -# Ejercicio 2: Imprimir números impares del 1 al 20 -# Imprime todos los números impares entre 1 y 20 (inclusive) usando un bucle for y range(). -print("\nEjercicio 2:") - -# Ejercicio 3: Imprimir múltiplos de 5 -# Imprime los múltiplos de 5 desde 5 hasta 50 (inclusive) usando un bucle for y range(). -print("\nEjercicio 3:") - -# Ejercicio 4: Imprimir números en orden inverso -# Imprime los números del 10 al 1 (inclusive) en orden inverso usando un bucle for y range(). -print("\nEjercicio 4:") - -# Ejercicio 5: Suma de números en un rango -# Calcula la suma de los números del 1 al 100 (inclusive) usando un bucle for y range(). -print("\nEjercicio 5:") - -# Ejercicio 6: Tabla de multiplicar -# Pide al usuario que introduzca un número. -# Imprime la tabla de multiplicar de ese número (del 1 al 10) usando un bucle for y range(). -print("\nEjercicio 6:") \ No newline at end of file +### +# 03 - range() +# Permite crear una secuencia de números. Puede ser útil para for, pero no solo para eso +### + +print("\nrange():") + +# Generado una secuencia de números del 0 al 9 +for num in range(10): + print(num) + +# range(inicio, fin) +for num in range(5, 10): + print(num) + +# range(inicio, fin, paso) +for num in range(0, 1000, 5): + print(num) + +for num in range(-5, 0): + print(num) + +for num in range(10, 0, -1): + print(num) + +for num in range(0, 444): + print(num) + +nums = range(10) +list_of_nums = list(nums) +print(list_of_nums) + +# seria para hacerlo cinco veces +for _ in range(5): + print("hacer cinco veces algo") + +### +# EJERCICIOS (range) +### + +# Ejercicio 1: Imprimir números del 1 al 10 +# Imprime los números del 1 al 10 (inclusive) usando un bucle for y range(). +print("\nEjercicio 1: Imprimir números del 1 al 10") + +for num in range(1, 11): + print(num) + +# Ejercicio 2: Imprimir números impares del 1 al 20 +# Imprime todos los números impares entre 1 y 20 (inclusive) usando un bucle for y range(). +print("\nEjercicio 2: Imprimir números impares del 1 al 20") + +for num in range(1, 21, 2): + print(num) + +# Ejercicio 3: Imprimir múltiplos de 5 +# Imprime los múltiplos de 5 desde 5 hasta 50 (inclusive) usando un bucle for y range(). +print("\nEjercicio 3: Imprimir múltiplos de 5") + +for num in range(5, 51, 5): + print(num) + +# Ejercicio 4: Imprimir números en orden inverso +# Imprime los números del 10 al 1 (inclusive) en orden inverso usando un bucle for y range(). +print("\nEjercicio 4: Imprimir números en orden inverso") + +for num in range(10, 0, -1): + print(num) + +# Ejercicio 5: Suma de números en un rango +# Calcula la suma de los números del 1 al 100 (inclusive) usando un bucle for y range(). +print("\nEjercicio 5: Suma de números en un rango") + +suma = 5 + +for num in range(1, 101): + suma += num + +print(f"La suma es: {suma}") + +# Ejercicio 6: Tabla de multiplicar +# Pide al usuario que introduzca un número. +# Imprime la tabla de multiplicar de ese número (del 1 al 10) usando un bucle for y range(). +print("\nEjercicio 6: Tabla de multiplicar") + +numero = int(input("Introduce un número para la tabla de multiplicar: ")) + +for i in range(1, 11): + print(f"{numero} x {i} = {numero * i}") diff --git a/03_loops/03_range_solutions.py b/03_loops/03_range_solutions.py index e88d560..3c4ecc1 100644 --- a/03_loops/03_range_solutions.py +++ b/03_loops/03_range_solutions.py @@ -1,43 +1,43 @@ -### -# EJERCICIOS (range) -### - -# Ejercicio 1: Imprimir números del 1 al 10 -# Imprime los números del 1 al 10 (inclusive) usando un bucle for y range(). -print("\nEjercicio 1:") -for i in range(1, 11): # Recuerda que range no incluye el límite superior - print(i) - -# Ejercicio 2: Imprimir números impares del 1 al 20 -# Imprime todos los números impares entre 1 y 20 (inclusive) usando un bucle for y range(). -print("\nEjercicio 2:") -for i in range(1, 21, 2): # El paso 2 asegura que solo se generen impares - print(i) - -# Ejercicio 3: Imprimir múltiplos de 5 -# Imprime los múltiplos de 5 desde 5 hasta 50 (inclusive) usando un bucle for y range(). -print("\nEjercicio 3:") -for i in range(5, 51, 5): # El paso 5 genera los múltiplos de 5 - print(i) - -# Ejercicio 4: Imprimir números en orden inverso -# Imprime los números del 10 al 1 (inclusive) en orden inverso usando un bucle for y range(). -print("\nEjercicio 4:") -for i in range(10, 0, -1): # Paso negativo para orden inverso - print(i) - -# Ejercicio 5: Suma de números en un rango -# Calcula la suma de los números del 1 al 100 (inclusive) usando un bucle for y range(). -print("\nEjercicio 5:") -suma = 0 -for i in range(1, 101): - suma += i -print(f"La suma de los números del 1 al 100 es: {suma}") - -# Ejercicio 6: Tabla de multiplicar -# Pide al usuario que introduzca un número. -# Imprime la tabla de multiplicar de ese número (del 1 al 10) usando un bucle for y range(). -print("\nEjercicio 6:") -numero = int(input("Introduce un número para la tabla de multiplicar: ")) -for i in range(1, 11): - print(f"{numero} x {i} = {numero * i}") \ No newline at end of file +### +# EJERCICIOS (range) +### + +# Ejercicio 1: Imprimir números del 1 al 10 +# Imprime los números del 1 al 10 (inclusive) usando un bucle for y range(). +print("\nEjercicio 1:") +for i in range(1, 11): # Recuerda que range no incluye el límite superior + print(i) + +# Ejercicio 2: Imprimir números impares del 1 al 20 +# Imprime todos los números impares entre 1 y 20 (inclusive) usando un bucle for y range(). +print("\nEjercicio 2:") +for i in range(1, 21, 2): # El paso 2 asegura que solo se generen impares + print(i) + +# Ejercicio 3: Imprimir múltiplos de 5 +# Imprime los múltiplos de 5 desde 5 hasta 50 (inclusive) usando un bucle for y range(). +print("\nEjercicio 3:") +for i in range(5, 51, 5): # El paso 5 genera los múltiplos de 5 + print(i) + +# Ejercicio 4: Imprimir números en orden inverso +# Imprime los números del 10 al 1 (inclusive) en orden inverso usando un bucle for y range(). +print("\nEjercicio 4:") +for i in range(10, 0, -1): # Paso negativo para orden inverso + print(i) + +# Ejercicio 5: Suma de números en un rango +# Calcula la suma de los números del 1 al 100 (inclusive) usando un bucle for y range(). +print("\nEjercicio 5:") +suma = 0 +for i in range(1, 101): + suma += i +print(f"La suma de los números del 1 al 100 es: {suma}") + +# Ejercicio 6: Tabla de multiplicar +# Pide al usuario que introduzca un número. +# Imprime la tabla de multiplicar de ese número (del 1 al 10) usando un bucle for y range(). +print("\nEjercicio 6:") +numero = int(input("Introduce un número para la tabla de multiplicar: ")) +for i in range(1, 11): + print(f"{numero} x {i} = {numero * i}") diff --git a/03_loops/04_functions.py b/03_loops/04_functions.py index dcd21cd..c7446df 100644 --- a/03_loops/04_functions.py +++ b/03_loops/04_functions.py @@ -1,91 +1,97 @@ -### -# 04 - Funciones -# Bloques de código reutilizables y parametrizables para hacer tareas especificas -### - -# """ Definición de una función - -# def nombre_de_la_funcion(parametro1, parametro2, ...): -# # docstring -# # cuerpo de la función -# return valor_de_retorno # opcional - -# """ - -# # Ejemplo de una función para imprimir algo en consola -# def saludar(): -# print("¡Hola!") - -# # Ejemplo de una función con parámetro -# def saludar_a(nombre): -# print(f"¡Hola {nombre}!") - -# saludar_a("midudev") -# saludar_a("madeval") -# saludar_a("pheralb") -# saludar_a("felixicaza") -# saludar_a("Carmen Ansio") - -# # Funciones con más parámetros -# def sumar(a, b): -# suma = a + b -# return suma - -# result = sumar(2, 3) -# print(result) - -# # Documentar las funciones con docstring -# def restar(a, b): -# """Resta dos números y devuelve el resultado""" -# return a - b - -# parámetros por defecto -# def multiplicar(a, b = 2): -# return a * b - -# print(multiplicar(2)) -# print(multiplicar(2, 3)) - -# Argumentos por posición -def describir_persona(nombre: str, edad: int, sexo: str): - print(f"Soy {nombre}, tengo {edad} años y me identifico como {sexo}") - -# parámetros son posicionales -describir_persona(1, 25, "gato") -describir_persona("midudev", 25, "gato") -describir_persona("hombre", "madeval", 39) - -# Argumentos por clave -# parámetros nombrados -describir_persona(sexo="gato", nombre="midudev", edad=25) -describir_persona(sexo="hombre", nombre="madeval", edad=21) - -# Argumentos de longitud de variable (*args): -def sumar_numeros(*args): - suma = 0 - for numero in args: - suma += numero - return suma - -print(sumar_numeros(1, 2, 3, 4, 5)) -print(sumar_numeros(1, 2)) -print(sumar_numeros(1, 2,3 ,4, 5, 6, 7, 8, 9, 10)) - -# Argumentos de clave-valor variable (**kwargs): -def mostrar_informacion_de(**kwargs): - for clave, valor in kwargs.items(): - print(f"{clave}: {valor}") - -mostrar_informacion_de(nombre="midudev", edad=25, sexo="gato") -print("\n") -mostrar_informacion_de(name="madeval", edad=21, country="Uruguay") -print("\n") -mostrar_informacion_de(nick="pheralb", es_sub=True, is_rich=True) -print("\n") -mostrar_informacion_de(super_name="felixicaza", es_modo=True, gatos=40) - -# Ejercicios -# Volver a los ejercicios anteriores -# y convertirlos en funciones -# e intentar utilizar todos los casos y conceptos -# que hemos visto hasta ahora \ No newline at end of file +### +# 04 - Funciones +# Bloques de código reutilizables y parametrizables para hacer tareas especificas +### + +# """ Definición de una función + +# def nombre_de_la_funcion(parametro1, parametro2, ...): +# # docstring +# # cuerpo de la función +# return valor_de_retorno # opcional + +# """ + +# # Ejemplo de una función para imprimir algo en consola +# def saludar(): +# print("¡Hola!") + +# # Ejemplo de una función con parámetro +# def saludar_a(nombre): +# print(f"¡Hola {nombre}!") + +# saludar_a("midudev") +# saludar_a("madeval") +# saludar_a("pheralb") +# saludar_a("felixicaza") +# saludar_a("Carmen Ansio") + +# # Funciones con más parámetros +# def sumar(a, b): +# suma = a + b +# return suma + +# result = sumar(2, 3) +# print(result) + +# # Documentar las funciones con docstring +# def restar(a, b): +# """Resta dos números y devuelve el resultado""" +# return a - b + +# parámetros por defecto +# def multiplicar(a, b = 2): +# return a * b + +# print(multiplicar(2)) +# print(multiplicar(2, 3)) + + +# Argumentos por posición +def describir_persona(nombre: str, edad: int, sexo: str): + print(f"Soy {nombre}, tengo {edad} años y me identifico como {sexo}") + + +# parámetros son posicionales +describir_persona(1, 25, "gato") +describir_persona("midudev", 25, "gato") +describir_persona("hombre", "madeval", 39) + +# Argumentos por clave +# parámetros nombrados +describir_persona(sexo="gato", nombre="midudev", edad=25) +describir_persona(sexo="hombre", nombre="madeval", edad=21) + + +# Argumentos de longitud de variable (*args): +def sumar_numeros(*args): + suma = 0 + for numero in args: + suma += numero + return suma + + +print(sumar_numeros(1, 2, 3, 4, 5)) +print(sumar_numeros(1, 2)) +print(sumar_numeros(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)) + + +# Argumentos de clave-valor variable (**kwargs): +def mostrar_informacion_de(**kwargs): + for clave, valor in kwargs.items(): + print(f"{clave}: {valor}") + + +mostrar_informacion_de(nombre="midudev", edad=25, sexo="gato") +print("\n") +mostrar_informacion_de(name="madeval", edad=21, country="Uruguay") +print("\n") +mostrar_informacion_de(nick="pheralb", es_sub=True, is_rich=True) +print("\n") +mostrar_informacion_de(super_name="felixicaza", es_modo=True, gatos=40) + +# Ejercicios +# Volver a los ejercicios anteriores +# y convertirlos en funciones +# e intentar utilizar todos los casos y conceptos +# que hemos visto hasta ahora diff --git a/04_logic/01_challenge_fantastic_four.py b/04_logic/01_challenge_fantastic_four.py index 77adbfc..3ece253 100644 --- a/04_logic/01_challenge_fantastic_four.py +++ b/04_logic/01_challenge_fantastic_four.py @@ -1,39 +1,41 @@ -""" -¿Está en Equilibrio la Alianza entre Reed Richards y Johnny Storm? - -En el universo de los 4 Fantásticos, la unión y el equilibrio entre los poderes es fundamental para enfrentar cualquier desafío. En este problema, nos centraremos en dos de sus miembros: - -Reed Richards (Mr. Fantastic), representado por la letra R. -Johnny Storm (La Antorcha Humana), representado por la letra J. - -Objetivo: - -Crea una función en Python que reciba una cadena de texto. Esta función debe contar cuántas veces aparece la letra R (para Reed Richards) y cuántas veces aparece la letra J (para Johnny Storm) en la cadena. - -- Si la cantidad de R y la cantidad de J son iguales, se considera que la alianza entre la mente y el fuego está en equilibrio y la función debe retornar True. -- Si las cantidades no son iguales, la función debe retornar False. -- En el caso de que no aparezca ninguna de las dos letras en la cadena, se entiende que el equilibrio se mantiene (0 = 0), por lo que la función debe retornar True. -""" - -text = "RRRRJJJjjjrrr" - -def check_is_balanced(text): - text = text.upper() - - # contar facilmente el número de veces que aparece una letra - count_r = text.count("R") # Reed Richards - count_j = text.count("J") # Johnny Storm - - print(f"count_r: {count_r} count_j: {count_j}") - - # if count_r == count_j: - # return True - # else: - # return False - - return count_r == count_j - -print(check_is_balanced("RRJJ")) -print(check_is_balanced("RRRRJJ")) -print(check_is_balanced("RRJJJJJJ")) -print(check_is_balanced("awwwaqAQAQA")) \ No newline at end of file +""" +¿Está en Equilibrio la Alianza entre Reed Richards y Johnny Storm? + +En el universo de los 4 Fantásticos, la unión y el equilibrio entre los poderes es fundamental para enfrentar cualquier desafío. En este problema, nos centraremos en dos de sus miembros: + +Reed Richards (Mr. Fantastic), representado por la letra R. +Johnny Storm (La Antorcha Humana), representado por la letra J. + +Objetivo: + +Crea una función en Python que reciba una cadena de texto. Esta función debe contar cuántas veces aparece la letra R (para Reed Richards) y cuántas veces aparece la letra J (para Johnny Storm) en la cadena. + +- Si la cantidad de R y la cantidad de J son iguales, se considera que la alianza entre la mente y el fuego está en equilibrio y la función debe retornar True. +- Si las cantidades no son iguales, la función debe retornar False. +- En el caso de que no aparezca ninguna de las dos letras en la cadena, se entiende que el equilibrio se mantiene (0 = 0), por lo que la función debe retornar True. +""" + +text = "RRRRJJJjjjrrr" + + +def check_is_balanced(text): + text = text.upper() + + # contar facilmente el número de veces que aparece una letra + count_r = text.count("R") # Reed Richards + count_j = text.count("J") # Johnny Storm + + print(f"count_r: {count_r} count_j: {count_j}") + + # if count_r == count_j: + # return True + # else: + # return False + + return count_r == count_j + + +print(check_is_balanced("RRJJ")) +print(check_is_balanced("RRRRJJ")) +print(check_is_balanced("RRJJJJJJ")) +print(check_is_balanced("awwwaqAQAQA")) diff --git a/04_logic/02_challenge_jurassic_park.py b/04_logic/02_challenge_jurassic_park.py index 92eae75..8ce86b5 100644 --- a/04_logic/02_challenge_jurassic_park.py +++ b/04_logic/02_challenge_jurassic_park.py @@ -1,30 +1,30 @@ -""" -En Jurassic Park, se ha observado que los dinosaurios carnívoros, como el temible T-Rex, depositan un número par de huevos. Imagina que tienes una lista de números enteros en la que cada número representa la cantidad de huevos puestos por un dinosaurio en el parque. - -Importante: Solo se consideran los huevos de los dinosaurios carnívoros (T-Rex) aquellos números que son pares. - -Objetivo: -Escribe una función en Python que reciba una lista de números enteros y devuelva la suma total de los huevos que pertenecen a los dinosaurios carnívoros (es decir, la suma de todos los números pares en la lista). -""" - -# Para ver si un número es par -# siempre usamos el módulo % -# nos da el resto de la división: eggs % 2 == 2 - -def count_carnivore_dinosaur_eggs(egg_list) -> int: - """ - Esta función recibe una lista de numeros enteros que representan la cantidad de huevos que han puesto diferentes dinosaurios en el parque jurásico y los de número par son de carnívoros. Devuelve un número con la suma de todos los huevos de carnívoros. - """ - total_carnivore_eggs = 0 - - for eggs in egg_list: - if eggs % 2 == 0: - total_carnivore_eggs += eggs - - # esta forma más corta: - # total_carnivore_eggs = sum(filter(lambda x: x % 2 == 0, egg_list)) - - return total_carnivore_eggs - -egg_list = [3, 4, 7, 5, 8] +""" +En Jurassic Park, se ha observado que los dinosaurios carnívoros, como el temible T-Rex, depositan un número par de huevos. Imagina que tienes una lista de números enteros en la que cada número representa la cantidad de huevos puestos por un dinosaurio en el parque. + +Importante: Solo se consideran los huevos de los dinosaurios carnívoros (T-Rex) aquellos números que son pares. + +Objetivo: +Escribe una función en Python que reciba una lista de números enteros y devuelva la suma total de los huevos que pertenecen a los dinosaurios carnívoros (es decir, la suma de todos los números pares en la lista). +""" + +# Para ver si un número es par +# siempre usamos el módulo % +# nos da el resto de la división: eggs % 2 == 2 + +def count_carnivore_dinosaur_eggs(egg_list) -> int: + """ + Esta función recibe una lista de numeros enteros que representan la cantidad de huevos que han puesto diferentes dinosaurios en el parque jurásico y los de número par son de carnívoros. Devuelve un número con la suma de todos los huevos de carnívoros. + """ + total_carnivore_eggs = 0 + + for eggs in egg_list: + if eggs % 2 == 0: + total_carnivore_eggs += eggs + + # esta forma más corta: + # total_carnivore_eggs = sum(filter(lambda x: x % 2 == 0, egg_list)) + + return total_carnivore_eggs + +egg_list = [3, 4, 7, 5, 8] print(count_carnivore_dinosaur_eggs(egg_list)) # 12 \ No newline at end of file diff --git a/04_logic/03_challenge_find_first_sum.py b/04_logic/03_challenge_find_first_sum.py index 2345fda..bd24fc2 100644 --- a/04_logic/03_challenge_find_first_sum.py +++ b/04_logic/03_challenge_find_first_sum.py @@ -1,34 +1,34 @@ -""" -Dado un array de números y un número goal, encuentra los dos primeros números del array que sumen el número goal y devuelve sus índices. Si no existe tal combinación, devuelve None. - -nums = [4, 5, 6, 2] -goal = 8 - -find_first_sum(nums, goal) # [2, 3] -""" - -# def find_first_sum(nums, goal): -# # early return, una validación rápida -# if len(nums) == 0: return None - -# for i in range(len(nums)): -# for j in range(i + 1, len(nums)): -# if nums[i] + nums[j] == goal: -# return [i, j] - -# return None # no se encontró ninguna combinación - -def find_first_sum(nums, goal): - seen = {} # diccionario para guardar el numero y su índice - - for index, value in enumerate(nums): - missing = goal - value - if missing in seen: return [seen[missing], index] - seen[value] = index # guardar el número actual a los vistos, porque no hemos encontrado la combinación - - return None - -nums = [4, 5, 6, 2] -goal = 8 -result = find_first_sum(nums, goal) # [2, 3] +""" +Dado un array de números y un número goal, encuentra los dos primeros números del array que sumen el número goal y devuelve sus índices. Si no existe tal combinación, devuelve None. + +nums = [4, 5, 6, 2] +goal = 8 + +find_first_sum(nums, goal) # [2, 3] +""" + +# def find_first_sum(nums, goal): +# # early return, una validación rápida +# if len(nums) == 0: return None + +# for i in range(len(nums)): +# for j in range(i + 1, len(nums)): +# if nums[i] + nums[j] == goal: +# return [i, j] + +# return None # no se encontró ninguna combinación + +def find_first_sum(nums, goal): + seen = {} # diccionario para guardar el numero y su índice + + for index, value in enumerate(nums): + missing = goal - value + if missing in seen: return [seen[missing], index] + seen[value] = index # guardar el número actual a los vistos, porque no hemos encontrado la combinación + + return None + +nums = [4, 5, 6, 2] +goal = 8 +result = find_first_sum(nums, goal) # [2, 3] print(result) \ No newline at end of file diff --git a/04_logic/04_dictionaries.py b/04_logic/04_dictionaries.py index b643149..8dae20f 100644 --- a/04_logic/04_dictionaries.py +++ b/04_logic/04_dictionaries.py @@ -1,61 +1,57 @@ -### -# 04 - Dictionaries -# Los diccionarios son colecciones de pares clave-valor. -# Sirven para almacenar datos relacionados. -### - -# ejemplo tipico de diccionario -persona = { - "nombre": "midudev", - "edad": 25, - "es_estudiante": True, - "calificaciones": [7, 8, 9], - "socials": { - "twitter": "@midudev", - "instagram": "@midudev", - "facebook": "midudev" - } -} - -# para acceder a los valores -print(persona["nombre"]) -print(persona["calificaciones"][2]) -print(persona["socials"]["twitter"]) - -# cambiar valores al acceder -persona["nombre"] = "madeval" -persona["calificaciones"][2] = 10 - -# eliminar completamente una propiedad -del persona["edad"] -# print(persona) - -es_estudiante = persona.pop("es_estudiante") -print(f"es_estudiante: {es_estudiante}") -print(persona) - -# sobreescribir un diccionario con otro diccionario -a = { "name": "miduev", "age": 25 } -b = { "name": "madeval", "es_estudiante": True } - -a.update(b) -print(a) - -# comprobar si existe una propiedad -print("name" in persona) # False -print("nombre" in persona) # True - -# obtener todas las claves -print("\nkeys:") -print(persona.keys()) - -# obtener todas los valores -print("\nvalues:") -print(persona.values()) - -# obtener tanto clave como valor -print("\nitems:") -print(persona.items()) - -for key, value in persona.items(): - print(f"{key}: {value}") \ No newline at end of file +### +# 04 - Dictionaries +# Los diccionarios son colecciones de pares clave-valor. +# Sirven para almacenar datos relacionados. +### + +# ejemplo tipico de diccionario +persona = { + "nombre": "midudev", + "edad": 25, + "es_estudiante": True, + "calificaciones": [7, 8, 9], + "socials": {"twitter": "@midudev", "instagram": "@midudev", "facebook": "midudev"}, +} + +# para acceder a los valores +print(persona["nombre"]) +print(persona["calificaciones"][2]) +print(persona["socials"]["twitter"]) + +# cambiar valores al acceder +persona["nombre"] = "madeval" +persona["calificaciones"][2] = 10 + +# eliminar completamente una propiedad +del persona["edad"] +# print(persona) + +es_estudiante = persona.pop("es_estudiante") +print(f"es_estudiante: {es_estudiante}") +print(persona) + +# sobreescribir un diccionario con otro diccionario +a = {"name": "miduev", "age": 25} +b = {"name": "madeval", "es_estudiante": True} + +a.update(b) +print(a) + +# comprobar si existe una propiedad +print("name" in persona) # False +print("nombre" in persona) # True + +# obtener todas las claves +print("\nkeys:") +print(persona.keys()) + +# obtener todas los valores +print("\nvalues:") +print(persona.values()) + +# obtener tanto clave como valor +print("\nitems:") +print(persona.items()) + +for key, value in persona.items(): + print(f"{key}: {value}") diff --git a/04_logic/05_challenge_battle.py b/04_logic/05_challenge_battle.py index 4dfea91..48ecde8 100644 --- a/04_logic/05_challenge_battle.py +++ b/04_logic/05_challenge_battle.py @@ -1,52 +1,52 @@ -""" -Tienes dos listas de números, lista_a y lista_b, ambas de la misma longitud. - -Cada número en lista_a se "enfrenta" al número en la misma posición en lista_b. - -- Si el número en lista_a es mayor, su valor se suma al siguiente número en lista_a. -- Si el número en lista_b es mayor, su valor se suma al siguiente número en lista_b. -- Si los dos números son iguales, ambos se eliminan y no afectan al siguiente par. - -Debes simular estos enfrentamientos y devolver el resultado final: -- Si al final queda un número en lista_a, devuelve ese número seguido de la letra "a" (por ejemplo, "3a"). -- Si al final queda un número en lista_b, devuelve ese número seguido de la letra "b" (por ejemplo, "2b"). -- En caso de empate, devuelve la letra "x". - -lista_a = [2, 4, 2] -lista_b = [3, 3, 4] - -resultado = battle(lista_a, lista_b) # -> "2b" - -# Explicación: -# - 2 vs 3: gana 3 (+1) -# - 4 vs 3+1: empate -# - 2 vs 4: gana 4 (+2) -# Resultado: "2b" - -lista_a = [4, 4, 4] -lista_b = [2, 8, 2] - -resultado = battle(lista_a, lista_b) # -> "x" - -# Explicación: -# - 4 vs 2: gana 4 (+2) -# - 4+2 vs 8: gana 8 (+2) -# - 4 vs 2+2: empate -# Resultado: "x" -""" - -# Fuerza bruta: buscar la solución A SACO. -# Algoritmos ocultos o cálculos o fórmulas -# Programación dinámica: buscar una solución mas eficiente - - -def battle(lista_a, lista_b): - puntos_a = sum(lista_a) - puntos_b = sum(lista_b) - return f"{puntos_a - puntos_b}a" if puntos_a > puntos_b else f"{puntos_b - puntos_a}b" if puntos_b > puntos_a else "x" - - -lista_a = [4, 4, 4] -lista_b = [2, 8, 2] -winner = battle(lista_a, lista_b) -print(winner) +""" +Tienes dos listas de números, lista_a y lista_b, ambas de la misma longitud. + +Cada número en lista_a se "enfrenta" al número en la misma posición en lista_b. + +- Si el número en lista_a es mayor, su valor se suma al siguiente número en lista_a. +- Si el número en lista_b es mayor, su valor se suma al siguiente número en lista_b. +- Si los dos números son iguales, ambos se eliminan y no afectan al siguiente par. + +Debes simular estos enfrentamientos y devolver el resultado final: +- Si al final queda un número en lista_a, devuelve ese número seguido de la letra "a" (por ejemplo, "3a"). +- Si al final queda un número en lista_b, devuelve ese número seguido de la letra "b" (por ejemplo, "2b"). +- En caso de empate, devuelve la letra "x". + +lista_a = [2, 4, 2] +lista_b = [3, 3, 4] + +resultado = battle(lista_a, lista_b) # -> "2b" + +# Explicación: +# - 2 vs 3: gana 3 (+1) +# - 4 vs 3+1: empate +# - 2 vs 4: gana 4 (+2) +# Resultado: "2b" + +lista_a = [4, 4, 4] +lista_b = [2, 8, 2] + +resultado = battle(lista_a, lista_b) # -> "x" + +# Explicación: +# - 4 vs 2: gana 4 (+2) +# - 4+2 vs 8: gana 8 (+2) +# - 4 vs 2+2: empate +# Resultado: "x" +""" + +# Fuerza bruta: buscar la solución A SACO. +# Algoritmos ocultos o cálculos o fórmulas +# Programación dinámica: buscar una solución mas eficiente + + +def battle(lista_a, lista_b): + puntos_a = sum(lista_a) + puntos_b = sum(lista_b) + return f"{puntos_a - puntos_b}a" if puntos_a > puntos_b else f"{puntos_b - puntos_a}b" if puntos_b > puntos_a else "x" + + +lista_a = [4, 4, 4] +lista_b = [2, 8, 2] +winner = battle(lista_a, lista_b) +print(winner) diff --git a/05_regex/01_re.py b/05_regex/01_re.py index 48d6305..7d4faf4 100644 --- a/05_regex/01_re.py +++ b/05_regex/01_re.py @@ -1,106 +1,110 @@ -## -# 01 - Expresiones regulares -# - -""" Las expresiones regulares son una secuencia de caracteres que forman un patrón de búsqueda. - Se utilizan para la búsqueda de cadenas de texto, validación de datos, etc. """ - - -""" ¿Por qué aprender Regex? - -- Búsqueda avanzada: Encontrar patrones específicos en textos grandes de forma rápida y precisa. (un editor de Markdown sólo usando Regex) - -- Validación de datos: Asegurarte que los datos que ingresa un usuario como el email, teléfono, etc. son correctos. - -- Manipulación del texto: Extraer, reemplazar y modificar partes de la cadena de texto fácilmente -""" - -# 1. Importar el módulo de expresiones regulares "re" -import re -# 2. Crear un patrón, que es una cadena de texto que describe lo que queremos encontrar -pattern = "Hola" -# 3. El texto donde queremos buscar -text = "Hola mundo" -# 4. Usar la función de búsqueda de "re" -result = re.search(pattern, text) - -if result: - print("He encontrado el patrón en el texto") -else: - print("No he encontrado el patrón en el texto") - -# .group() devuelve la cadena que coincide con el pattern -print(result.group()) - -# .start() devolver la posición inicial de la coincidencia -print(result.start()) - -# .end() devolver la posición final de la coincidencia -print(result.end()) - -# EJERCICIO 01 -# Encuentra la primera ocurrencia de la palabra "IA" en el siguiente texto -# e indica en que posición empieza y termina la coincidencia. -text = "Todo el mundo dice que la IA nos va a quitar el trabajo. Pero solo hace falta ver cómo la puede cagar con las Regex para ir con cuidado" -pattern = "IA" -found_ia = re.search(pattern, text) - -if found_ia: - print(f"He encontrado el patrón en el texto en la posición {found_ia.start()} y termina en la posición {found_ia.end()}") -else: - print("No he encontrado el patrón en el texto") - -# ----------------------- - -### Encontrar todas las coincidencias de un patrón -# .findall() devuelve una lista con todas las coincidencias - -text = "Me gusta Python. Python es lo máximo. Aunque Python no es tan difícil, ojo con Python" -pattern = "Python" - -matches = re.findall(pattern, text) - -print(len(matches)) - -# ------------------------- - -# iter() devuelve un iterador que contiene todos los resultados de la búsqueda - -text = "Me gusta Python. Python es lo máximo. Aunque Python no es tan difícil, ojo con Python" -pattern = "Python" - -matches = re.finditer(pattern, text) - -for match in matches: - print(match.group(), match.start(), match.end()) - -# EJERCICIO 02 -# Encuentra todas las ocurrencias de la palabra "midu" en el siguiente texto e indica en que posición empieza y termina cada coincidencia y cuantas veces se encontró. -text = "Este es el curso de Python de midudev. ¡Suscríbete a midudev si te gusta este contenido! midu" - -### Modificadores - -# Los modificadores son opciones que se pueden agregar a un patrón para cambiar su comportamiento - -# re.IGNORECASE: Ignora las mayúsculas y minúsculas - -text = "Todo el mundo dice que la IA nos va a quitar el trabajo. Pero la ia no es tan mala. ¡Viva la Ia!" -pattern = "IA" -found = re.findall(pattern, text, re.IGNORECASE) - -if found: print(found) - -# EJERCICIO 03 -# Encuentra todas las ocurrencias de la palabra "python" en el siguiente texto, sin distinguir entre mayúsculas y minúsculas. -text = "Este es el curso de Python de midudev. ¡Suscríbete a python si te gusta este contenido! PYTHON" - -### Reemplazar el texto - -# .sub() reemplaza todas las coincidencias de un patrón en un texto - -text = "Hola, mundo! Hola de nuevo. Hola otra vez." -pattern = "hola" -replacement = "Adiós" - -new_text = re.sub(pattern, replacement, text, flags=re.IGNORECASE) -print(new_text) \ No newline at end of file +## +# 01 - Expresiones regulares +# + +""" Las expresiones regulares son una secuencia de caracteres que forman un patrón de búsqueda. + Se utilizan para la búsqueda de cadenas de texto, validación de datos, etc. """ + + +""" ¿Por qué aprender Regex? + +- Búsqueda avanzada: Encontrar patrones específicos en textos grandes de forma rápida y precisa. (un editor de Markdown sólo usando Regex) + +- Validación de datos: Asegurarte que los datos que ingresa un usuario como el email, teléfono, etc. son correctos. + +- Manipulación del texto: Extraer, reemplazar y modificar partes de la cadena de texto fácilmente +""" + +# 1. Importar el módulo de expresiones regulares "re" + +# 2. Crear un patrón, que es una cadena de texto que describe lo que queremos encontrar +import re +pattern = "Hola" +# 3. El texto donde queremos buscar +text = "Hola mundo" +# 4. Usar la función de búsqueda de "re" +result = re.search(pattern, text) + +if result: + print("He encontrado el patrón en el texto") +else: + print("No he encontrado el patrón en el texto") + +# .group() devuelve la cadena que coincide con el pattern +print(result.group()) + +# .start() devolver la posición inicial de la coincidencia +print(result.start()) + +# .end() devolver la posición final de la coincidencia +print(result.end()) + +# EJERCICIO 01 +# Encuentra la primera ocurrencia de la palabra "IA" en el siguiente texto +# e indica en que posición empieza y termina la coincidencia. +text = "Todo el mundo dice que la IA nos va a quitar el trabajo. Pero solo hace falta ver cómo la puede cagar con las Regex para ir con cuidado" +pattern = "IA" +found_ia = re.search(pattern, text) + +if found_ia: + print( + f"He encontrado el patrón en el texto en la posición {found_ia.start()} y termina en la posición {found_ia.end()}" + ) +else: + print("No he encontrado el patrón en el texto") + +# ----------------------- + +#  Encontrar todas las coincidencias de un patrón +# .findall() devuelve una lista con todas las coincidencias + +text = "Me gusta Python. Python es lo máximo. Aunque Python no es tan difícil, ojo con Python" +pattern = "Python" + +matches = re.findall(pattern, text) + +print(len(matches)) + +# ------------------------- + +# iter() devuelve un iterador que contiene todos los resultados de la búsqueda + +text = "Me gusta Python. Python es lo máximo. Aunque Python no es tan difícil, ojo con Python" +pattern = "Python" + +matches = re.finditer(pattern, text) + +for match in matches: + print(match.group(), match.start(), match.end()) + +# EJERCICIO 02 +# Encuentra todas las ocurrencias de la palabra "midu" en el siguiente texto e indica en que posición empieza y termina cada coincidencia y cuantas veces se encontró. +text = "Este es el curso de Python de midudev. ¡Suscríbete a midudev si te gusta este contenido! midu" + +# Modificadores + +# Los modificadores son opciones que se pueden agregar a un patrón para cambiar su comportamiento + +# re.IGNORECASE: Ignora las mayúsculas y minúsculas + +text = "Todo el mundo dice que la IA nos va a quitar el trabajo. Pero la ia no es tan mala. ¡Viva la Ia!" +pattern = "IA" +found = re.findall(pattern, text, re.IGNORECASE) + +if found: + print(found) + +# EJERCICIO 03 +# Encuentra todas las ocurrencias de la palabra "python" en el siguiente texto, sin distinguir entre mayúsculas y minúsculas. +text = "Este es el curso de Python de midudev. ¡Suscríbete a python si te gusta este contenido! PYTHON" + +# Reemplazar el texto + +# .sub() reemplaza todas las coincidencias de un patrón en un texto + +text = "Hola, mundo! Hola de nuevo. Hola otra vez." +pattern = "hola" +replacement = "Adiós" + +new_text = re.sub(pattern, replacement, text, flags=re.IGNORECASE) +print(new_text) diff --git a/05_regex/02_metachars.py b/05_regex/02_metachars.py index 3304172..b1afb78 100644 --- a/05_regex/02_metachars.py +++ b/05_regex/02_metachars.py @@ -1,127 +1,136 @@ -### -# 02 - Meta caracteres -# Los metacaracteres son simbolos especiales con significados especificos en las expresiones regulares -### - -import re - -# 1. El punto (.) -# Coincidir con cualquier caracter excepto una nueva linea - -text = "Hola mundo, H0la de nuevo, H$la otra vez" -pattern = "H.la" # Hola, H0la, H$la - -found = re.findall(pattern, text) - -if (found): - print(found) -else: - print("No se ha encontrado el patrón") - - -text = "casa caasa cosa cisa cesa causa" -pattern = "c.sa" - -matches = re.findall(pattern, text) -print(matches) - -# -------------------- - -text = "Hola mundo, H0la de nuevo, H$la otra vez" -pattern = r"H.la" # Hola, H0la, H$la - -found = re.findall(pattern, text) - -if (found): - print(found) -else: - print("No se ha encontrado el patrón") - - -# Cómo usar la barra invertida para anular el significado especial de un símbolo -text = "Mi casa es blanca. Y el coche es negro." -pattern = r"\." - -matches = re.findall(pattern, text) - -print(matches) - -# \d: coincide con cualquier dígito (0-9) - -text = "El número de teléfono es 123456789" -found = re.findall(r'\d{9}', text) - -print(found) - -# Ejercicio: Detectar si hay un número de España en el texto gracias al prefijo +34 - -text = "Mi número de teléfono es +34 688999999 apúntalo vale?" -pattern = r"\+34 \d{9}" -found = re.search(pattern, text) -if found: print(f"Encontré el número de teléfono {found.group()}") - -# \w: Coincide con cualquier caracter alfanumerico (a-z, A-Z, 0-9, _) - -text = "el_rubius_69" -pattern = r"\w" -found = re.findall(pattern, text) -print(found) - -# \s: Coincide con cualqueir espacio en blanco (espacio, tabulación, salto de línea) -text = "Hola mundo\n¿Cómo estás?\t" -pattern = r"\s" -matches = re.findall(pattern, text) -print(matches) - -# ^: Coincide con el principio de una cadena -username = "423_name%22" -pattern = r"^\w" # validar nombre de usuario - -valid = re.search(pattern, username) - -if valid: print("El nombre de usuario es válido") -else: print("El nombre de usuario no es válido") - -phone = "+34 688999999" -pattern = r"^\+\d{1,3} " - -valid = re.search(pattern, phone) - -if valid: print("El número de teléfono es válido") -else: print("El número de teléfono no es válido") - -# $: Coincide con el final de una cadena -text = "Hola mundo." -pattern = r"mundo$" - -valid = re.search(pattern, text) - -if valid: print("La cadena es válida") -else: print("La cadena no es válida") - -# EJERCICIO -# Valida que un correo sea de gmail -text = "miduga@hotmail.com" -pattern = r"@gmail.com$" -valid = re.search(pattern, text) - -if valid: print("El correo es gmail válido") -else: print("El correo no es válido") - -# EJERCICIO: -# Tenemos una lista de archivos, necesitamos saber los nombres de los ficheros con extension .txt -files = "file1.txt file2.pdf midu-of.webp secret.txt" - -# \b: Coincide con el principio o final de una palabra -text = "casa casada cosa cosas casado casa" -pattern = r"\bc.sa\b" - -found = re.findall(pattern, text) -print(found) - -# |: Coincidr con una opción u otra -fruits = "platano, piña, manzana, aguacate, palta, pera, aguacate, aguacate" -pattern = r"palta|aguacate|p..a|\b\w{7}\b" - -matches = re.findall(pattern, fruits) -print(matches) \ No newline at end of file +### +# 02 - Meta caracteres +# Los metacaracteres son simbolos especiales con significados especificos en las expresiones regulares +### + +import re + +# 1. El punto (.) +# Coincidir con cualquier caracter excepto una nueva linea + +text = "Hola mundo, H0la de nuevo, H$la otra vez" +pattern = "H.la" # Hola, H0la, H$la + +found = re.findall(pattern, text) + +if found: + print(found) +else: + print("No se ha encontrado el patrón") + + +text = "casa caasa cosa cisa cesa causa" +pattern = "c.sa" + +matches = re.findall(pattern, text) +print(matches) + +# -------------------- + +text = "Hola mundo, H0la de nuevo, H$la otra vez" +pattern = r"H.la" # Hola, H0la, H$la + +found = re.findall(pattern, text) + +if found: + print(found) +else: + print("No se ha encontrado el patrón") + + +# Cómo usar la barra invertida para anular el significado especial de un símbolo +text = "Mi casa es blanca. Y el coche es negro." +pattern = r"\." + +matches = re.findall(pattern, text) + +print(matches) + +# \d: coincide con cualquier dígito (0-9) + +text = "El número de teléfono es 123456789" +found = re.findall(r"\d{9}", text) + +print(found) + +# Ejercicio: Detectar si hay un número de España en el texto gracias al prefijo +34 + +text = "Mi número de teléfono es +34 688999999 apúntalo vale?" +pattern = r"\+34 \d{9}" +found = re.search(pattern, text) +if found: + print(f"Encontré el número de teléfono {found.group()}") + +# \w: Coincide con cualquier caracter alfanumerico (a-z, A-Z, 0-9, _) + +text = "el_rubius_69" +pattern = r"\w" +found = re.findall(pattern, text) +print(found) + +# \s: Coincide con cualqueir espacio en blanco (espacio, tabulación, salto de línea) +text = "Hola mundo\n¿Cómo estás?\t" +pattern = r"\s" +matches = re.findall(pattern, text) +print(matches) + +# ^: Coincide con el principio de una cadena +username = "423_name%22" +pattern = r"^\w" # validar nombre de usuario + +valid = re.search(pattern, username) + +if valid: + print("El nombre de usuario es válido") +else: + print("El nombre de usuario no es válido") + +phone = "+34 688999999" +pattern = r"^\+\d{1,3} " + +valid = re.search(pattern, phone) + +if valid: + print("El número de teléfono es válido") +else: + print("El número de teléfono no es válido") + +# $: Coincide con el final de una cadena +text = "Hola mundo." +pattern = r"mundo$" + +valid = re.search(pattern, text) + +if valid: + print("La cadena es válida") +else: + print("La cadena no es válida") + +# EJERCICIO +# Valida que un correo sea de gmail +text = "miduga@hotmail.com" +pattern = r"@gmail.com$" +valid = re.search(pattern, text) + +if valid: + print("El correo es gmail válido") +else: + print("El correo no es válido") + +# EJERCICIO: +# Tenemos una lista de archivos, necesitamos saber los nombres de los ficheros con extension .txt +files = "file1.txt file2.pdf midu-of.webp secret.txt" + +# \b: Coincide con el principio o final de una palabra +text = "casa casada cosa cosas casado casa" +pattern = r"\bc.sa\b" + +found = re.findall(pattern, text) +print(found) + +# |: Coincidr con una opción u otra +fruits = "platano, piña, manzana, aguacate, palta, pera, aguacate, aguacate" +pattern = r"palta|aguacate|p..a|\b\w{7}\b" + +matches = re.findall(pattern, fruits) +print(matches) diff --git a/05_regex/03_quantifiers.py b/05_regex/03_quantifiers.py index ccfdc3d..03e80ba 100644 --- a/05_regex/03_quantifiers.py +++ b/05_regex/03_quantifiers.py @@ -1,57 +1,57 @@ -### -# 03 - Quantifiers -# Los cuantificadores se utilizan para especificar cuántas ocurrencias de un carácter o grupo de caracteres se deben encontrar en una cadena. -### - -import re - -# *: Puede aparecer 0 o más veces -text = "aaaba" -pattern = "a*" -matches = re.findall(pattern, text) -print(matches) - -# Ejercicio 1: -# ¿Cuantas palabras tienen de 0 a más "a" y después una b? - -# +: Una a más veces -text = "dddd aaa ccc a bb aa casa" -pattern = "a+" -matches = re.findall(pattern, text) -print(matches) - -# ?: Cero o una vez -text = "aaabacb" -pattern = "a?b" -matches = re.findall(pattern, text) -print(matches) - -# Ejercicio: Haz opcional que aparezca un +34 en el siguiente texto -phone = "+34 688999999" - -# {n}: Exactamente n veces -text = "aaaaaa aa aaaa" -pattern = "a{3}" -matches = re.findall(pattern, text) - -print(matches) - -# {n, m}: De n a m veces -text = "u uu uuu u" -pattern = r"\w{2,3}" -matches = re.findall(pattern, text) -print(matches) - -# Ejercicio: -# Encuentra las palabras de 4 a 6 letras en el siguiente texto -words = "ala casa árbol león cinco murcielago" -pattern = r"\b\w{4,6}\b" -matches = re.findall(pattern, words) -print(matches) - -# Ejercicio -# Encuentra las palabras de más de 6 letras -words = "ala fantastico casa árbol león cinco murcielago" -pattern = r"\b\w{6,}\b" -matches = re.findall(pattern, words) -print(matches) \ No newline at end of file +### +# 03 - Quantifiers +# Los cuantificadores se utilizan para especificar cuántas ocurrencias de un carácter o grupo de caracteres se deben encontrar en una cadena. +### + +import re + +# *: Puede aparecer 0 o más veces +text = "aaaba" +pattern = "a*" +matches = re.findall(pattern, text) +print(matches) + +# Ejercicio 1: +# ¿Cuantas palabras tienen de 0 a más "a" y después una b? + +# +: Una a más veces +text = "dddd aaa ccc a bb aa casa" +pattern = "a+" +matches = re.findall(pattern, text) +print(matches) + +# ?: Cero o una vez +text = "aaabacb" +pattern = "a?b" +matches = re.findall(pattern, text) +print(matches) + +# Ejercicio: Haz opcional que aparezca un +34 en el siguiente texto +phone = "+34 688999999" + +# {n}: Exactamente n veces +text = "aaaaaa aa aaaa" +pattern = "a{3}" +matches = re.findall(pattern, text) + +print(matches) + +# {n, m}: De n a m veces +text = "u uu uuu u" +pattern = r"\w{2,3}" +matches = re.findall(pattern, text) +print(matches) + +# Ejercicio: +# Encuentra las palabras de 4 a 6 letras en el siguiente texto +words = "ala casa árbol león cinco murcielago" +pattern = r"\b\w{4,6}\b" +matches = re.findall(pattern, words) +print(matches) + +# Ejercicio +# Encuentra las palabras de más de 6 letras +words = "ala fantastico casa árbol león cinco murcielago" +pattern = r"\b\w{6,}\b" +matches = re.findall(pattern, words) +print(matches) diff --git a/05_regex/04_sets.py b/05_regex/04_sets.py index 25c2159..6aa2f8c 100644 --- a/05_regex/04_sets.py +++ b/05_regex/04_sets.py @@ -1,53 +1,53 @@ -import re - -# [:] Coincide con cualquier caracter dentro de los corchetes - -username = "rub.$ius_69+" -pattern = r"^[\w._%+-]+$" - -match = re.search(pattern, username) -if match: - print("El nombre de usuario es válido: ", match.group()) -else: - print("El nombre de usuario no es válido") - - -# Buscar todas las vocales de una palabra -text = "Hola mundo" -pattern = r"[aeiou]" -matches = re.findall(pattern, text) -print(matches) - -# Una Regex para encontrar las palabras man, fan y ban -# pero ignora el resto -text = "man ran fan ñan ban" -pattern = r"[mfb]an" - -matches = re.findall(pattern, text) -print(matches) - -# Ejercicio: -# Nos han complicado el asunto, porque ahora hay palabras que encajan pero no empiezan por esas letras. -# Solo queremos las palabras man, fan y ban -text = "omniman fanatico man bandana" -# \b - -text = "22" -pattern = r"[4-9]" - -matches = re.findall(pattern, text) -print(matches) - - -# Ejercicio final con todo lo aprendido -# Mejorar esto: https://www.computerhope.com/jargon/r/regular-expression.png - -## Buscar corner cases que no pasa y arreglarlo: -"lo.que+sea@shopping.online" -"michael@gov.co.uk" - -# [^]: Coincide con cualquier caracter que no esté dentro de los corchetes -text = "Hola mundo" -pattern = r"[^aeiou]" -matches = re.findall(pattern, text) -print(matches) \ No newline at end of file +import re + +# [:] Coincide con cualquier caracter dentro de los corchetes + +username = "rub.$ius_69+" +pattern = r"^[\w._%+-]+$" + +match = re.search(pattern, username) +if match: + print("El nombre de usuario es válido: ", match.group()) +else: + print("El nombre de usuario no es válido") + + +# Buscar todas las vocales de una palabra +text = "Hola mundo" +pattern = r"[aeiou]" +matches = re.findall(pattern, text) +print(matches) + +# Una Regex para encontrar las palabras man, fan y ban +# pero ignora el resto +text = "man ran fan ñan ban" +pattern = r"[mfb]an" + +matches = re.findall(pattern, text) +print(matches) + +# Ejercicio: +# Nos han complicado el asunto, porque ahora hay palabras que encajan pero no empiezan por esas letras. +# Solo queremos las palabras man, fan y ban +text = "omniman fanatico man bandana" +# \b + +text = "22" +pattern = r"[4-9]" + +matches = re.findall(pattern, text) +print(matches) + + +# Ejercicio final con todo lo aprendido +# Mejorar esto: https://www.computerhope.com/jargon/r/regular-expression.png + +## Buscar corner cases que no pasa y arreglarlo: +"lo.que+sea@shopping.online" +"michael@gov.co.uk" + +# [^]: Coincide con cualquier caracter que no esté dentro de los corchetes +text = "Hola mundo" +pattern = r"[^aeiou]" +matches = re.findall(pattern, text) +print(matches) diff --git a/06_request_at_dates/01_dates.py b/06_request_at_dates/01_dates.py new file mode 100644 index 0000000..02416f7 --- /dev/null +++ b/06_request_at_dates/01_dates.py @@ -0,0 +1,44 @@ +# Trabajando con fechas y horas en Python +import locale +from datetime import datetime, timedelta + +# 1. Obtener la fecha y hora actual +now = datetime.now() +print(f"Fecha y hora actual: {now}") + +# 2. Crear una fecha y hora específica +specific_date = datetime(2025, 2, 12, 15, 30, 0) +print(f"Fecha y hora específica: {specific_date}") + +# 3. Formatear fechas +# Método strftime() para formatear fechas +# pasarle el objeto datetime y el formato de especificado + +locale.setlocale(locale.LC_TIME, "es_ES.UTF-8") + +format_date = now.strftime("%A/%B/%Y %H:%M:%S") +print(f"Fecha formateada: {format_date}") + +# 4. Operciones con fechas: (sumar/restar dias, minutos, horas, meses) +yesterday = datetime.now() - timedelta(days=1) +print(f"Ayer: {yesterday}") + +tomorrow = datetime.now() + timedelta(days=1) +print(f"Mañana: {tomorrow}") + +one_hour_after = datetime.now() + timedelta(hours=1) +print(f"Una hora después: {one_hour_after}") + +# 5. Obtener componentes individuales de una fecha +year = now.year +print(f"Año: {year}") + +month = now.month +print(f"Mes: {month}") + +# 6. Calcular la diferencia entre 2 fechas +date1 = datetime.now() +date2 = datetime(2025, 2, 12, 15, 30, 0) + +difference = date2 - date1 +print(f"Diferencia entre las fechas: {difference}") diff --git a/06_request_at_dates/02_requests.py b/06_request_at_dates/02_requests.py new file mode 100644 index 0000000..c5790b0 --- /dev/null +++ b/06_request_at_dates/02_requests.py @@ -0,0 +1,103 @@ +# Como hacer peticiones APIS con Python +# con y sin dependencias + +# 1. Sin dependencias (dificil y sin dependencias) +import urllib.request +import json + +DEEPSEEK_API_KEY = "xxx" + +api_post = "https://jsonplaceholder.typicode.com/posts" + +try: + response = urllib.request.urlopen(api_post) + data = response.read() + json_data = json.loads(data.decode("utf-8")) + print(json_data) + response.close() +except urllib.error.URLError as err: + print(f"Error en la solicitud: {err}") + +# 2. Con dependencias (request) + +import requests + +print("\nGET:") +api_post = "https://jsonplaceholder.typicode.com/posts" +response = requests.get(api_post) +reponse_json = response.json() # Convert to JSON + +# 3. Un POST +print("\nPOST:") +try: + response = requests.post( + "https://jsonplaceholder.typicode.com/posts", + json={"title": "foo", "body": "hola", "userId": 1}, + ) + print(response.status_code) +except requests.exceptions.RequestException as e: + print(f"Error en la solicitud: {e}") + +# 4. Un PUT +print("\nPUT:") +try: + response = requests.put( + "https://jsonplaceholder.typicode.com/posts/1", + json={ + "title": "foo", + "body": "bar", + "userId": 1, + }, + ) + + print(response.status_code) +except requests.exceptions.RequestException as e: + print(f"Error en la solicitud: {e}") + +# Usar la API de GPT-4o de OpenAI +# Ref: https://platform.openai.com/docs/api-reference/making-requests + +OPENAI_KEY = "sk-XXXXXXXX" + +import json + + +def call_openai_gpt(api_key, prompt): + url = "https://api.openai.com/v1/chat/completions" + headers = {"Content-Type": "application/json", "Authorization": f"Bearer {api_key}"} + data = {"model": "gpt-4o-mini", "messages": [{"role": "user", "content": prompt}]} + + response = requests.post(url, json=data, headers=headers) + return response.json() + + +api_response = call_openai_gpt( + OPENAI_KEY, "Escribe un breve poema sobre la programación" +) + +# print(json.dumps(api_response, indent=2)) + +print(api_response["choices"][0]["message"]["content"]) + +# Llamar a la API de DEEPSEEK + +import json + + +def call_deepseek(api_key, prompt): + url = "https://api.deepseek.com/chat/completions" + headers = {"Content-Type": "application/json", "Authorization": f"Bearer {api_key}"} + data = {"model": "deepseek-chat", "messages": [{"role": "user", "content": prompt}]} + + response = requests.post(url, json=data, headers=headers) + print(response.json()) + return response.json() + + +api_response = call_deepseek( + DEEPSEEK_API_KEY, "Escribe un breve poema sobre la programación" +) + +# print(json.dumps(api_response, indent=2)) + +print(api_response["choices"][0]["message"]["content"]) diff --git a/06_request_at_dates/03_clases.py b/06_request_at_dates/03_clases.py new file mode 100644 index 0000000..1fd7f63 --- /dev/null +++ b/06_request_at_dates/03_clases.py @@ -0,0 +1,80 @@ +# 1. Introducción a las Clases en Python +# Las clases son plantillas para crear objetos. Un objeto es una instancia de una clase. +# Nos permite agrupar datos (atributos o propiedades) y funciones (métodos) en un solo lugar. + +import requests +OPENAI_KEY = "" +DEEPSEEK_API_KEY = "" + + +# Ejemplo básico de una clase +class Coche: + # atributo de clase (comparte todas las instancias) + tipo = "vehículo de cuatro ruedas" + ruedas = 4 + + # método especial que es el que construye el objeto + # se llama automáticamente este método cuando creas la instancia + def __init__(self, marca, modelo, color): + # atributos de la instancia + self.marca = marca + self.modelo = modelo + self.color = color + + # método (actions) + def arrancar(self): + print(f"El coche {self.marca} {self.modelo} arrancó! 🚗") + + +# instance of the class +mi_coche = Coche("Toyota", "Corolla", "rojo") +mi_coche.arrancar() + +print(mi_coche.marca) + +coche_de_pheralb = Coche("Ford", "Fiesta", "azul") +coche_de_pheralb.arrancar() + +print(coche_de_pheralb.marca) + +# Encapsulación: es ocultar los detalles internos de una clase y exponer solo la interfaz pública + +# Crear una clase para llamar a la AI de OpenAI, DeepSeek O LO QUE SEA + + +class AI_API: + def __init__(self, api_key, url, model): + self.api_key = api_key + self.url = url + self.model = model + + def call(self, prompt): + headers = { + "Content-Type": "application/json", + "Authorization": f"Bearer {self.api_key}", + } + data = {"model": self.model, "messages": [ + {"role": "user", "content": prompt}]} + + try: + response = requests.post(self.url, json=data, headers=headers) + res_json = response.json() + print(res_json["choices"][0]["message"]["content"]) + except requests.exceptions.RequestException as e: + print(f"Error en la solicitud: {e}") + return None + + +print("\nOPEN_AI:") +openai_api = AI_API( + OPENAI_KEY, "https://api.openai.com/v1/chat/completions", "gpt-4o-mini" +) + +openai_api.call("Escribe un breve poema sobre la programación") + +print("\nDEEPSEEK:") +deepseek_api = AI_API( + DEEPSEEK_API_KEY, "https://api.deepseek.com/chat/completions", "deepseek-chat" +) + +deepseek_api.call("Escribe un breve poema sobre la programación") diff --git a/LICENSE b/LICENSE index 5d092c6..d04df12 100644 --- a/LICENSE +++ b/LICENSE @@ -1,157 +1,157 @@ -# Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International - -Creative Commons Corporation (“Creative Commons”) is not a law firm and does not provide legal services or legal advice. Distribution of Creative Commons public licenses does not create a lawyer-client or other relationship. Creative Commons makes its licenses and related information available on an “as-is” basis. Creative Commons gives no warranties regarding its licenses, any material licensed under their terms and conditions, or any related information. Creative Commons disclaims all liability for damages resulting from their use to the fullest extent possible. - -**Using Creative Commons Public Licenses** - -Creative Commons public licenses provide a standard set of terms and conditions that creators and other rights holders may use to share original works of authorship and other material subject to copyright and certain other rights specified in the public license below. The following considerations are for informational purposes only, are not exhaustive, and do not form part of our licenses. - -* __Considerations for licensors:__ Our public licenses are intended for use by those authorized to give the public permission to use material in ways otherwise restricted by copyright and certain other rights. Our licenses are irrevocable. Licensors should read and understand the terms and conditions of the license they choose before applying it. Licensors should also secure all rights necessary before applying our licenses so that the public can reuse the material as expected. Licensors should clearly mark any material not subject to the license. This includes other CC-licensed material, or material used under an exception or limitation to copyright. [More considerations for licensors](http://wiki.creativecommons.org/Considerations_for_licensors_and_licensees#Considerations_for_licensors). - -* __Considerations for the public:__ By using one of our public licenses, a licensor grants the public permission to use the licensed material under specified terms and conditions. If the licensor’s permission is not necessary for any reason–for example, because of any applicable exception or limitation to copyright–then that use is not regulated by the license. Our licenses grant only permissions under copyright and certain other rights that a licensor has authority to grant. Use of the licensed material may still be restricted for other reasons, including because others have copyright or other rights in the material. A licensor may make special requests, such as asking that all changes be marked or described. Although not required by our licenses, you are encouraged to respect those requests where reasonable. [More considerations for the public](http://wiki.creativecommons.org/Considerations_for_licensors_and_licensees#Considerations_for_licensees). - -## Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License - -By exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License ("Public License"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions. - -### Section 1 – Definitions. - -a. __Adapted Material__ means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image. - -b. __Copyright and Similar Rights__ means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights. - -e. __Effective Technological Measures__ means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements. - -f. __Exceptions and Limitations__ means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material. - -h. __Licensed Material__ means the artistic or literary work, database, or other material to which the Licensor applied this Public License. - -i. __Licensed Rights__ means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license. - -h. __Licensor__ means the individual(s) or entity(ies) granting rights under this Public License. - -i. __NonCommercial__ means not primarily intended for or directed towards commercial advantage or monetary compensation. For purposes of this Public License, the exchange of the Licensed Material for other material subject to Copyright and Similar Rights by digital file-sharing or similar means is NonCommercial provided there is no payment of monetary compensation in connection with the exchange. - -j. __Share__ means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them. - -k. __Sui Generis Database Rights__ means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world. - -l. __You__ means the individual or entity exercising the Licensed Rights under this Public License. __Your__ has a corresponding meaning. - -### Section 2 – Scope. - -a. ___License grant.___ - - 1. Subject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to: - - A. reproduce and Share the Licensed Material, in whole or in part, for NonCommercial purposes only; and - - B. produce and reproduce, but not Share, Adapted Material for NonCommercial purposes only. - - 2. __Exceptions and Limitations.__ For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions. - - 3. __Term.__ The term of this Public License is specified in Section 6(a). - - 4. __Media and formats; technical modifications allowed.__ The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a)(4) never produces Adapted Material. - - 5. __Downstream recipients.__ - - A. __Offer from the Licensor – Licensed Material.__ Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License. - - B. __No downstream restrictions.__ You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material. - - 6. __No endorsement.__ Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(A)(i). - -b. ___Other rights.___ - - 1. Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise. - - 2. Patent and trademark rights are not licensed under this Public License. - - 3. To the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties, including when the Licensed Material is used other than for NonCommercial purposes. - -### Section 3 – License Conditions. - -Your exercise of the Licensed Rights is expressly made subject to the following conditions. - -a. ___Attribution.___ - - 1. If You Share the Licensed Material, You must: - - A. retain the following if it is supplied by the Licensor with the Licensed Material: - - i. identification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated); - - ii. a copyright notice; - - iii. a notice that refers to this Public License; - - iv. a notice that refers to the disclaimer of warranties; - - v. a URI or hyperlink to the Licensed Material to the extent reasonably practicable; - - B. indicate if You modified the Licensed Material and retain an indication of any previous modifications; and - - C. indicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License. - - For the avoidance of doubt, You do not have permission under this Public License to Share Adapted Material. - - 2. You may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information. - - 3. If requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(A) to the extent reasonably practicable. - -### Section 4 – Sui Generis Database Rights. - -Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material: - -a. for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database for NonCommercial purposes only and provided You do not Share Adapted Material; - -b. if You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material; and - -c. You must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database. - -For the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights. - -### Section 5 – Disclaimer of Warranties and Limitation of Liability. - -a. __Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You.__ - -b. __To the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You.__ - -c. The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability. - -### Section 6 – Term and Termination. - -a. This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically. - -b. Where Your right to use the Licensed Material has terminated under Section 6(a), it reinstates: - - 1. automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or - - 2. upon express reinstatement by the Licensor. - - For the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License. - -c. For the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License. - -d. Sections 1, 5, 6, 7, and 8 survive termination of this Public License. - -### Section 7 – Other Terms and Conditions. - -a. The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed. - -b. Any arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License. - -### Section 8 – Interpretation. - -a. For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License. - -b. To the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions. - -c. No term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor. - -d. Nothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority. - -> Creative Commons is not a party to its public licenses. Notwithstanding, Creative Commons may elect to apply one of its public licenses to material it publishes and in those instances will be considered the “Licensor.” The text of the Creative Commons public licenses is dedicated to the public domain under the CC0 Public Domain Dedication. The text of the Creative Commons public licenses is dedicated to the public domain under the [CC0 Public Domain Dedication](https://creativecommons.org/publicdomain/zero/1.0/legalcode). Except for the limited purpose of indicating that material is shared under a Creative Commons public license or as otherwise permitted by the Creative Commons policies published at [creativecommons.org/policies](http://creativecommons.org/policies), Creative Commons does not authorize the use of the trademark “Creative Commons” or any other trademark or logo of Creative Commons without its prior written consent including, without limitation, in connection with any unauthorized modifications to any of its public licenses or any other arrangements, understandings, or agreements concerning use of licensed material. For the avoidance of doubt, this paragraph does not form part of the public licenses. -> +# Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International + +Creative Commons Corporation (“Creative Commons”) is not a law firm and does not provide legal services or legal advice. Distribution of Creative Commons public licenses does not create a lawyer-client or other relationship. Creative Commons makes its licenses and related information available on an “as-is” basis. Creative Commons gives no warranties regarding its licenses, any material licensed under their terms and conditions, or any related information. Creative Commons disclaims all liability for damages resulting from their use to the fullest extent possible. + +**Using Creative Commons Public Licenses** + +Creative Commons public licenses provide a standard set of terms and conditions that creators and other rights holders may use to share original works of authorship and other material subject to copyright and certain other rights specified in the public license below. The following considerations are for informational purposes only, are not exhaustive, and do not form part of our licenses. + +* __Considerations for licensors:__ Our public licenses are intended for use by those authorized to give the public permission to use material in ways otherwise restricted by copyright and certain other rights. Our licenses are irrevocable. Licensors should read and understand the terms and conditions of the license they choose before applying it. Licensors should also secure all rights necessary before applying our licenses so that the public can reuse the material as expected. Licensors should clearly mark any material not subject to the license. This includes other CC-licensed material, or material used under an exception or limitation to copyright. [More considerations for licensors](http://wiki.creativecommons.org/Considerations_for_licensors_and_licensees#Considerations_for_licensors). + +* __Considerations for the public:__ By using one of our public licenses, a licensor grants the public permission to use the licensed material under specified terms and conditions. If the licensor’s permission is not necessary for any reason–for example, because of any applicable exception or limitation to copyright–then that use is not regulated by the license. Our licenses grant only permissions under copyright and certain other rights that a licensor has authority to grant. Use of the licensed material may still be restricted for other reasons, including because others have copyright or other rights in the material. A licensor may make special requests, such as asking that all changes be marked or described. Although not required by our licenses, you are encouraged to respect those requests where reasonable. [More considerations for the public](http://wiki.creativecommons.org/Considerations_for_licensors_and_licensees#Considerations_for_licensees). + +## Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License + +By exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License ("Public License"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions. + +### Section 1 – Definitions. + +a. __Adapted Material__ means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image. + +b. __Copyright and Similar Rights__ means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights. + +e. __Effective Technological Measures__ means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements. + +f. __Exceptions and Limitations__ means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material. + +h. __Licensed Material__ means the artistic or literary work, database, or other material to which the Licensor applied this Public License. + +i. __Licensed Rights__ means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license. + +h. __Licensor__ means the individual(s) or entity(ies) granting rights under this Public License. + +i. __NonCommercial__ means not primarily intended for or directed towards commercial advantage or monetary compensation. For purposes of this Public License, the exchange of the Licensed Material for other material subject to Copyright and Similar Rights by digital file-sharing or similar means is NonCommercial provided there is no payment of monetary compensation in connection with the exchange. + +j. __Share__ means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them. + +k. __Sui Generis Database Rights__ means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world. + +l. __You__ means the individual or entity exercising the Licensed Rights under this Public License. __Your__ has a corresponding meaning. + +### Section 2 – Scope. + +a. ___License grant.___ + + 1. Subject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to: + + A. reproduce and Share the Licensed Material, in whole or in part, for NonCommercial purposes only; and + + B. produce and reproduce, but not Share, Adapted Material for NonCommercial purposes only. + + 2. __Exceptions and Limitations.__ For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions. + + 3. __Term.__ The term of this Public License is specified in Section 6(a). + + 4. __Media and formats; technical modifications allowed.__ The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a)(4) never produces Adapted Material. + + 5. __Downstream recipients.__ + + A. __Offer from the Licensor – Licensed Material.__ Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License. + + B. __No downstream restrictions.__ You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material. + + 6. __No endorsement.__ Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(A)(i). + +b. ___Other rights.___ + + 1. Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this Public License. + + 3. To the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties, including when the Licensed Material is used other than for NonCommercial purposes. + +### Section 3 – License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the following conditions. + +a. ___Attribution.___ + + 1. If You Share the Licensed Material, You must: + + A. retain the following if it is supplied by the Licensor with the Licensed Material: + + i. identification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of warranties; + + v. a URI or hyperlink to the Licensed Material to the extent reasonably practicable; + + B. indicate if You modified the Licensed Material and retain an indication of any previous modifications; and + + C. indicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License. + + For the avoidance of doubt, You do not have permission under this Public License to Share Adapted Material. + + 2. You may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information. + + 3. If requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(A) to the extent reasonably practicable. + +### Section 4 – Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material: + +a. for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database for NonCommercial purposes only and provided You do not Share Adapted Material; + +b. if You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material; and + +c. You must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights. + +### Section 5 – Disclaimer of Warranties and Limitation of Liability. + +a. __Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You.__ + +b. __To the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You.__ + +c. The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability. + +### Section 6 – Term and Termination. + +a. This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically. + +b. Where Your right to use the Licensed Material has terminated under Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or + + 2. upon express reinstatement by the Licensor. + + For the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License. + +c. For the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License. + +d. Sections 1, 5, 6, 7, and 8 survive termination of this Public License. + +### Section 7 – Other Terms and Conditions. + +a. The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed. + +b. Any arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License. + +### Section 8 – Interpretation. + +a. For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License. + +b. To the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions. + +c. No term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor. + +d. Nothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority. + +> Creative Commons is not a party to its public licenses. Notwithstanding, Creative Commons may elect to apply one of its public licenses to material it publishes and in those instances will be considered the “Licensor.” The text of the Creative Commons public licenses is dedicated to the public domain under the CC0 Public Domain Dedication. The text of the Creative Commons public licenses is dedicated to the public domain under the [CC0 Public Domain Dedication](https://creativecommons.org/publicdomain/zero/1.0/legalcode). Except for the limited purpose of indicating that material is shared under a Creative Commons public license or as otherwise permitted by the Creative Commons policies published at [creativecommons.org/policies](http://creativecommons.org/policies), Creative Commons does not authorize the use of the trademark “Creative Commons” or any other trademark or logo of Creative Commons without its prior written consent including, without limitation, in connection with any unauthorized modifications to any of its public licenses or any other arrangements, understandings, or agreements concerning use of licensed material. For the avoidance of doubt, this paragraph does not form part of the public licenses. +> > Creative Commons may be contacted at [creativecommons.org](http://creativecommons.org). \ No newline at end of file diff --git a/README.md b/README.md index 1dfdc2f..924c0ce 100644 --- a/README.md +++ b/README.md @@ -1,196 +1,196 @@ -
- -# Curso Python desde Cero 🐍 - -[![Python Version](https://img.shields.io/badge/Python-3.x-blue.svg)](https://www.python.org/) -[![Estado](https://img.shields.io/badge/Estado-En%20emisión-yellow)](https://twitch.tv/midudev) -[![CC License](https://img.shields.io/badge/license-CC--BY--NC--ND-green.svg)](https://github.com/midudev/curso-python/blob/main/LICENSE) - -Curso práctico y gratuito de Python desde cero. Emitido en directo en [twitch.tv/midudev](https://twitch.tv/midudev). - -
- - GitHub - - - Twitter - - - Twitch - - - YouTube - -
- -
- -
- portada python -
- -## 🤔 ¿Por qué deberías ver este curso? - -- 🎯 **Aprenderás el lenguaje de programación del momento.** -- 📅 **Nuevas clases todos los miércoles.** -- 🚀 Ideal para principiantes: comienza **desde cero** y avanza paso a paso. -- 🛠️ **Curso práctico** con ejercicios para que puedas practicar lo aprendido. -- 📝 **Código abierto**: lo que te permitirá clonar el proyecto y tener acceso completo a todo lo que se muestra. -> [!TIP] -> **¿Sabías que puedes acceder a todas las clases desde la [Academia de midudev](https://midu.dev/)?** Si eres suscriptor en [Twitch](https://www.twitch.tv/midudev), ¡ya tienes acceso! - -## 🕐 Horario por países - -| Hora | Países | -|------|------------------------------------------| -| 18H | 🇪🇸 España | -| 17H | 🇮🇨 Islas Canarias | -| 14H | 🇺🇾 Uruguay 🇦🇷 Argentina 🇨🇱 Chile 🇵🇾 Paraguay | -| 13H | 🇧🇴 Bolivia 🇻🇪 Venezuela 🇩🇴 República Dominicana 🇵🇷 Puerto Rico | -| 12H | 🇨🇴 Colombia 🇵🇪 Perú 🇪🇨 Ecuador 🇨🇺 Cuba 🇵🇦 Panamá | -| 11H | 🇲🇽 México 🇨🇷 Costa Rica 🇳🇮 Nicaragua 🇸🇻 El Salvador 🇭🇳 Honduras | - -## 📺¿Dónde puedo ver el curso? -Mira los cursos y participa en vivo en -[twitch.tv/midudev](https://twitch.tv/midudev) - - - - - - - - -## 📄 Contenido Actual -| Clase | Código | Video | -|-----------------|-----------------|----------------------------------| -|**1. Hola Mundo, Tipos de Datos, Conversión de tipos y Variables** | [![github](https://img.shields.io/badge/github-black?style=for-the-badge&logo=github&logoColor=white)](https://github.com/midudev/curso-python/tree/main/01_basic) | [![twitch](https://img.shields.io/badge/twitch-572364?style=for-the-badge&logo=twitch&logoColor=white)](https://www.twitch.tv/videos/2354087841) | -|**2. Condicionales y listas + ejercicios** | [![github](https://img.shields.io/badge/github-black?style=for-the-badge&logo=github&logoColor=white)](https://github.com/midudev/curso-python/tree/main/02_flow_control) | [![twitch](https://img.shields.io/badge/twitch-572364?style=for-the-badge&logo=twitch&logoColor=white)](https://www.twitch.tv/videos/2360535344) | -|**3. bucles while, for y funciones** | [![github](https://img.shields.io/badge/github-black?style=for-the-badge&logo=github&logoColor=white)](https://github.com/midudev/curso-python/tree/main/03_loops) | [![twitch](https://img.shields.io/badge/twitch-572364?style=for-the-badge&logo=twitch&logoColor=white)](https://www.twitch.tv/videos/2366925887) | -|**4. Lógica de Programación + Diccionarios** | [![github](https://img.shields.io/badge/github-black?style=for-the-badge&logo=github&logoColor=white)](https://github.com/midudev/curso-python/tree/main/04_logic) | [![twitch](https://img.shields.io/badge/twitch-572364?style=for-the-badge&logo=twitch&logoColor=white)](https://www.twitch.tv/videos/2373204722) | -|**5. Próximamente** (Miércoles 19 de febrero) | | | - -> [!NOTE] -> El curso está actualmente en emisión. Nuevas clases todos los miércoles a las 18:00h (hora española). - -
-📚 Temario Completo Planificado - -1. Introducción -2. Variables y Funciones Incorporadas -3. Operadores -4. Strings -5. Listas -6. Tuplas -7. Sets -8. Diccionarios -9. Condicionales -10. Bucles -11. Funciones -12. Módulos -13. List Comprehension -14. Funciones de Orden Superior -15. Errores de Tipos en Python -16. Python Date time -17. Manejo de Excepciones -18. Expresiones Regulares -19. Manejo de Archivos -20. Python Package Manager -21. Clases y Objetos -22. Web Scraping -23. Entorno Virtual -24. Estadísticas -25. Pandas -26. Python web -27. Python con MongoDB -28. API -29. Construyendo APIs -30. Conclusiones - -
- -## ⚙️ Requisitos - -> [!IMPORTANT] -> Necesitarás: -> - Python 3.x -> - Editor de código (recomendado VS Code) -> - Conexión a internet para las clases en vivo - -## 💻 Instalación - -```bash -# Verifica tu versión de Python -python --version - -# Clona el repositorio -git clone https://github.com/midudev/curso-python - -# Accede al directorio -cd curso-python -``` - -> [!TIP] -> Si no quieres instalar nada, puedes usar editores online como: -> - [OnlineGDB](https://www.onlinegdb.com/online_python_compiler) -> - [Python Sandbox](https://pythonsandbox.io/) -> - [Google Colab](https://colab.research.google.com/) - ---- - -## 💻 Configuración del Entorno - -> Usa **Visual Studio Code (VS Code)** para escribir y ejecutar código Python localmente. - -1. Descarga [VS Code](https://code.visualstudio.com/) -2. Instala las extensiones recomendadas: - - [Python](https://marketplace.visualstudio.com/items?itemName=ms-python.python) - - [Pylance](https://marketplace.visualstudio.com/items?itemName=ms-python.vscode-pylance) - - [Python Debugger](https://marketplace.visualstudio.com/items?itemName=ms-python.debugpy) - -## 🛠️ Requisitos Técnicos - -- Python 3.x instalado -- VS Code + extensiones -- Conexión a internet -- No requiere experiencia previa - -## 📚 Recursos Adicionales - -- [cursopython.dev](https://cursopython.dev) - Portal oficial del curso -- [Documentación de Python](https://docs.python.org/es/) - Documentación oficial en español -- [Ejercicios resueltos](link-ejercicios) - Soluciones a los ejercicios del curso - -## 🔗 Enlaces - -- 🌐 [cursopython.dev](https://cursopython.dev) - Portal del curso -- 📚 [Documentación Python](https://docs.python.org/es/) - Docs oficial -- ⭐ [GitHub](https://github.com/midudev/curso-python) - Código fuente - -## ➕ Más información - -Descubre más en [cursopython.dev](https://cursopython.dev) - -## 👥 Comunidad - -[![Discord](https://img.shields.io/discord/741237973663612969?style=for-the-badge&logo=discord&logoColor=white&label=Discord)](https://discord.gg/midudev) - -Únete a nuestra comunidad para: -- 💬 Compartir dudas y soluciones -- 🤝 Conectar con otros estudiantes -- 📢 Recibir anuncios de nuevas clases -- 🎉 Participar en eventos especiales - -## ⚖️ Licencia - -Este curso usa la licencia [CC-BY-NC-ND](https://github.com/midudev/curso-python/blob/main/LICENSE) que permite: -- ✅ Compartir el material -- ✅ Usar el contenido para uso personal -- ❌ Uso comercial -- ❌ Modificación del material -- ⚠️ Requiere atribución al autor - -## 👨‍💻 Autor - -[@midudev](https://www.github.com/midudev) - +
+ +# Curso Python desde Cero 🐍 + +[![Python Version](https://img.shields.io/badge/Python-3.x-blue.svg)](https://www.python.org/) +[![Estado](https://img.shields.io/badge/Estado-En%20emisión-yellow)](https://twitch.tv/midudev) +[![CC License](https://img.shields.io/badge/license-CC--BY--NC--ND-green.svg)](https://github.com/midudev/curso-python/blob/main/LICENSE) + +Curso práctico y gratuito de Python desde cero. Emitido en directo en [twitch.tv/midudev](https://twitch.tv/midudev). + +
+ + GitHub + + + Twitter + + + Twitch + + + YouTube + +
+ +
+ +
+ portada python +
+ +## 🤔 ¿Por qué deberías ver este curso? + +- 🎯 **Aprenderás el lenguaje de programación del momento.** +- 📅 **Nuevas clases todos los miércoles.** +- 🚀 Ideal para principiantes: comienza **desde cero** y avanza paso a paso. +- 🛠️ **Curso práctico** con ejercicios para que puedas practicar lo aprendido. +- 📝 **Código abierto**: lo que te permitirá clonar el proyecto y tener acceso completo a todo lo que se muestra. +> [!TIP] +> **¿Sabías que puedes acceder a todas las clases desde la [Academia de midudev](https://midu.dev/)?** Si eres suscriptor en [Twitch](https://www.twitch.tv/midudev), ¡ya tienes acceso! + +## 🕐 Horario por países + +| Hora | Países | +|------|------------------------------------------| +| 18H | 🇪🇸 España | +| 17H | 🇮🇨 Islas Canarias | +| 14H | 🇺🇾 Uruguay 🇦🇷 Argentina 🇨🇱 Chile 🇵🇾 Paraguay | +| 13H | 🇧🇴 Bolivia 🇻🇪 Venezuela 🇩🇴 República Dominicana 🇵🇷 Puerto Rico | +| 12H | 🇨🇴 Colombia 🇵🇪 Perú 🇪🇨 Ecuador 🇨🇺 Cuba 🇵🇦 Panamá | +| 11H | 🇲🇽 México 🇨🇷 Costa Rica 🇳🇮 Nicaragua 🇸🇻 El Salvador 🇭🇳 Honduras | + +## 📺¿Dónde puedo ver el curso? +Mira los cursos y participa en vivo en +[twitch.tv/midudev](https://twitch.tv/midudev) + + + + + + + + +## 📄 Contenido Actual +| Clase | Código | Video | +|-----------------|-----------------|----------------------------------| +|**1. Hola Mundo, Tipos de Datos, Conversión de tipos y Variables** | [![github](https://img.shields.io/badge/github-black?style=for-the-badge&logo=github&logoColor=white)](https://github.com/midudev/curso-python/tree/main/01_basic) | [![twitch](https://img.shields.io/badge/twitch-572364?style=for-the-badge&logo=twitch&logoColor=white)](https://www.twitch.tv/videos/2354087841) | +|**2. Condicionales y listas + ejercicios** | [![github](https://img.shields.io/badge/github-black?style=for-the-badge&logo=github&logoColor=white)](https://github.com/midudev/curso-python/tree/main/02_flow_control) | [![twitch](https://img.shields.io/badge/twitch-572364?style=for-the-badge&logo=twitch&logoColor=white)](https://www.twitch.tv/videos/2360535344) | +|**3. bucles while, for y funciones** | [![github](https://img.shields.io/badge/github-black?style=for-the-badge&logo=github&logoColor=white)](https://github.com/midudev/curso-python/tree/main/03_loops) | [![twitch](https://img.shields.io/badge/twitch-572364?style=for-the-badge&logo=twitch&logoColor=white)](https://www.twitch.tv/videos/2366925887) | +|**4. Lógica de Programación + Diccionarios** | [![github](https://img.shields.io/badge/github-black?style=for-the-badge&logo=github&logoColor=white)](https://github.com/midudev/curso-python/tree/main/04_logic) | [![twitch](https://img.shields.io/badge/twitch-572364?style=for-the-badge&logo=twitch&logoColor=white)](https://www.twitch.tv/videos/2373204722) | +|**5. Próximamente** (Miércoles 19 de febrero) | | | + +> [!NOTE] +> El curso está actualmente en emisión. Nuevas clases todos los miércoles a las 18:00h (hora española). + +
+📚 Temario Completo Planificado + +1. Introducción +2. Variables y Funciones Incorporadas +3. Operadores +4. Strings +5. Listas +6. Tuplas +7. Sets +8. Diccionarios +9. Condicionales +10. Bucles +11. Funciones +12. Módulos +13. List Comprehension +14. Funciones de Orden Superior +15. Errores de Tipos en Python +16. Python Date time +17. Manejo de Excepciones +18. Expresiones Regulares +19. Manejo de Archivos +20. Python Package Manager +21. Clases y Objetos +22. Web Scraping +23. Entorno Virtual +24. Estadísticas +25. Pandas +26. Python web +27. Python con MongoDB +28. API +29. Construyendo APIs +30. Conclusiones + +
+ +## ⚙️ Requisitos + +> [!IMPORTANT] +> Necesitarás: +> - Python 3.x +> - Editor de código (recomendado VS Code) +> - Conexión a internet para las clases en vivo + +## 💻 Instalación + +```bash +# Verifica tu versión de Python +python --version + +# Clona el repositorio +git clone https://github.com/midudev/curso-python + +# Accede al directorio +cd curso-python +``` + +> [!TIP] +> Si no quieres instalar nada, puedes usar editores online como: +> - [OnlineGDB](https://www.onlinegdb.com/online_python_compiler) +> - [Python Sandbox](https://pythonsandbox.io/) +> - [Google Colab](https://colab.research.google.com/) + +--- + +## 💻 Configuración del Entorno + +> Usa **Visual Studio Code (VS Code)** para escribir y ejecutar código Python localmente. + +1. Descarga [VS Code](https://code.visualstudio.com/) +2. Instala las extensiones recomendadas: + - [Python](https://marketplace.visualstudio.com/items?itemName=ms-python.python) + - [Pylance](https://marketplace.visualstudio.com/items?itemName=ms-python.vscode-pylance) + - [Python Debugger](https://marketplace.visualstudio.com/items?itemName=ms-python.debugpy) + +## 🛠️ Requisitos Técnicos + +- Python 3.x instalado +- VS Code + extensiones +- Conexión a internet +- No requiere experiencia previa + +## 📚 Recursos Adicionales + +- [cursopython.dev](https://cursopython.dev) - Portal oficial del curso +- [Documentación de Python](https://docs.python.org/es/) - Documentación oficial en español +- [Ejercicios resueltos](link-ejercicios) - Soluciones a los ejercicios del curso + +## 🔗 Enlaces + +- 🌐 [cursopython.dev](https://cursopython.dev) - Portal del curso +- 📚 [Documentación Python](https://docs.python.org/es/) - Docs oficial +- ⭐ [GitHub](https://github.com/midudev/curso-python) - Código fuente + +## ➕ Más información + +Descubre más en [cursopython.dev](https://cursopython.dev) + +## 👥 Comunidad + +[![Discord](https://img.shields.io/discord/741237973663612969?style=for-the-badge&logo=discord&logoColor=white&label=Discord)](https://discord.gg/midudev) + +Únete a nuestra comunidad para: +- 💬 Compartir dudas y soluciones +- 🤝 Conectar con otros estudiantes +- 📢 Recibir anuncios de nuevas clases +- 🎉 Participar en eventos especiales + +## ⚖️ Licencia + +Este curso usa la licencia [CC-BY-NC-ND](https://github.com/midudev/curso-python/blob/main/LICENSE) que permite: +- ✅ Compartir el material +- ✅ Usar el contenido para uso personal +- ❌ Uso comercial +- ❌ Modificación del material +- ⚠️ Requiere atribución al autor + +## 👨‍💻 Autor + +[@midudev](https://www.github.com/midudev) + diff --git a/test.py b/test.py index b85aae6..bab0b6f 100644 --- a/test.py +++ b/test.py @@ -1,46 +1,58 @@ -inventario_dinosaurios = [ - ("Rexy", "Tyrannosaurus Rex", 1, "Saludable"), - ("Blue", "Velociraptor", 2, "Saludable"), - ("Charlie", "Velociraptor", 2, "Necesita Atención"), - ("Delta", "Velociraptor", 2, "Saludable"), - ("Echo", "Velociraptor", 2, "Saludable"), - ("Braquiosaurio_1", "Braquiosaurio", 3, "Saludable"), - ("Triceratops_1", "Triceratops", 4, "Saludable"), - ("Spino", "Spinosaurus", 5, "Necesita Atención"), - ("Pterodáctilo_1", "Pterodáctilo", 6, "Saludable"), - ("Rexy_Junior", "Tyrannosaurus Rex", 1, "Necesita Atención"), -] - -print("--- Informe del Inventario de Dinosaurios de Jurassic Park ---") - -# 1. Contar el número total de dinosaurios -total_dinosaurios = 0 -for dinosaurio in inventario_dinosaurios: - total_dinosaurios += 1 # Incrementa el contador por cada dinosaurio en la lista -print(f"\nNúmero total de dinosaurios en el parque: {total_dinosaurios}") - -# 2. Identificar y listar los nombres de todos los Velociraptors -velociraptors_list = [] -for dinosaurio in inventario_dinosaurios: - if dinosaurio[1] == "Velociraptor": # Comprueba si la especie (índice 1) es "Velociraptor" - velociraptors_list.append(dinosaurio[0]) # Añade el nombre (índice 0) a la lista -print(f"\n--- Listado de Velociraptors ---") -print(f"Velociraptors encontrados: {velociraptors_list}") - -# 3. Determinar cuántos dinosaurios necesitan atención médica -dinosaurios_necesitan_atencion = 0 -for dinosaurio in inventario_dinosaurios: - if dinosaurio[3] == "Necesita Atención": # Comprueba si el estado de salud (índice 3) es "Necesita Atención" - dinosaurios_necesitan_atencion += 1 # Incrementa el contador -print(f"\n--- Dinosaurios que necesitan atención médica ---") -print(f"Número de dinosaurios que necesitan atención médica: {dinosaurios_necesitan_atencion}") - -# 4. Simular una "inspección de recinto" para el Recinto 2 -def inspeccionar_recinto(recinto_numero): - print(f"\n--- Inspección del Recinto {recinto_numero} ---") - print(f"Dinosaurios en el Recinto {recinto_numero}:") - for dinosaurio in inventario_dinosaurios: - if dinosaurio[2] == recinto_numero: # Comprueba si el recinto (índice 2) coincide con el recinto_numero dado - print(f"- Nombre: {dinosaurio[0]}, Estado: {dinosaurio[3]}") - -inspeccionar_recinto(2) # Llama a la función para inspeccionar el Recinto 2 \ No newline at end of file +inventario_dinosaurios = [ + ("Rexy", "Tyrannosaurus Rex", 1, "Saludable"), + ("Blue", "Velociraptor", 2, "Saludable"), + ("Charlie", "Velociraptor", 2, "Necesita Atención"), + ("Delta", "Velociraptor", 2, "Saludable"), + ("Echo", "Velociraptor", 2, "Saludable"), + ("Braquiosaurio_1", "Braquiosaurio", 3, "Saludable"), + ("Triceratops_1", "Triceratops", 4, "Saludable"), + ("Spino", "Spinosaurus", 5, "Necesita Atención"), + ("Pterodáctilo_1", "Pterodáctilo", 6, "Saludable"), + ("Rexy_Junior", "Tyrannosaurus Rex", 1, "Necesita Atención"), +] + +print("--- Informe del Inventario de Dinosaurios de Jurassic Park ---") + +# 1. Contar el número total de dinosaurios +total_dinosaurios = 0 +for dinosaurio in inventario_dinosaurios: + total_dinosaurios += 1 # Incrementa el contador por cada dinosaurio en la lista +print(f"\nNúmero total de dinosaurios en el parque: {total_dinosaurios}") + +# 2. Identificar y listar los nombres de todos los Velociraptors +velociraptors_list = [] +for dinosaurio in inventario_dinosaurios: + if ( + dinosaurio[1] == "Velociraptor" + ): # Comprueba si la especie (índice 1) es "Velociraptor" + velociraptors_list.append( + dinosaurio[0] + ) # Añade el nombre (índice 0) a la lista +print(f"\n--- Listado de Velociraptors ---") +print(f"Velociraptors encontrados: {velociraptors_list}") + +# 3. Determinar cuántos dinosaurios necesitan atención médica +dinosaurios_necesitan_atencion = 0 +for dinosaurio in inventario_dinosaurios: + if ( + dinosaurio[3] == "Necesita Atención" + ): # Comprueba si el estado de salud (índice 3) es "Necesita Atención" + dinosaurios_necesitan_atencion += 1 # Incrementa el contador +print(f"\n--- Dinosaurios que necesitan atención médica ---") +print( + f"Número de dinosaurios que necesitan atención médica: {dinosaurios_necesitan_atencion}" +) + + +# 4. Simular una "inspección de recinto" para el Recinto 2 +def inspeccionar_recinto(recinto_numero): + print(f"\n--- Inspección del Recinto {recinto_numero} ---") + print(f"Dinosaurios en el Recinto {recinto_numero}:") + for dinosaurio in inventario_dinosaurios: + if ( + dinosaurio[2] == recinto_numero + ): # Comprueba si el recinto (índice 2) coincide con el recinto_numero dado + print(f"- Nombre: {dinosaurio[0]}, Estado: {dinosaurio[3]}") + + +inspeccionar_recinto(2) # Llama a la función para inspeccionar el Recinto 2