<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Gabriel Felippe</title>
    <description>The latest articles on DEV Community by Gabriel Felippe (@theakira).</description>
    <link>https://dev.to/theakira</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F260751%2F88325905-2986-48b6-9328-a74439155899.jpg</url>
      <title>DEV Community: Gabriel Felippe</title>
      <link>https://dev.to/theakira</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/theakira"/>
    <language>en</language>
    <item>
      <title>Resources for Mastering Algorithms &amp; Data Structures</title>
      <dc:creator>Gabriel Felippe</dc:creator>
      <pubDate>Sat, 01 Feb 2020 22:39:02 +0000</pubDate>
      <link>https://dev.to/theakira/resources-for-mastering-algorithms-data-structures-1dmg</link>
      <guid>https://dev.to/theakira/resources-for-mastering-algorithms-data-structures-1dmg</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fek0zafg7bcjer44nu5eo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fek0zafg7bcjer44nu5eo.png" alt="EN" width="32" height="24"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Algorithm" rel="noopener noreferrer"&gt;Algorithm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://jeffe.cs.illinois.edu/teaching/algorithms/book/Algorithms-JeffE.pdf" rel="noopener noreferrer"&gt;Algorithms&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/List_of_algorithms" rel="noopener noreferrer"&gt;List of Algorithms&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://arxiv.org/list/cs.DS/recent" rel="noopener noreferrer"&gt;arXiv - Data Structures and Algorithms&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.programiz.com/dsa" rel="noopener noreferrer"&gt;Programiz - Data Structures and Algorithms&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://masterraghu.com/subjects/Datastructures/ebooks/rema%20thareja.pdf" rel="noopener noreferrer"&gt;Data Structures using C&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.studytonight.com/data-structures/introduction-to-data-structures" rel="noopener noreferrer"&gt;Introduction to Data Structures and Algorithms&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.geeksforgeeks.org/data-structures/" rel="noopener noreferrer"&gt;Geeks for Geeks - Data Structures&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://xlinux.nist.gov/dads/" rel="noopener noreferrer"&gt;Dictionary of Algorithms and Data Structures&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://runestone.academy/runestone/books/published/pythonds/index.html" rel="noopener noreferrer"&gt;Problem Solving with Algorithms and Data Structures using Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://introcs.cs.princeton.edu/java/40algorithms/" rel="noopener noreferrer"&gt;Algorithms and Data Structures Princeton&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/trekhleb/javascript-algorithms" rel="noopener noreferrer"&gt;JavaScript Algorithms and Data Structures&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.codechef.com/certification/data-structures-and-algorithms/prepare" rel="noopener noreferrer"&gt;Learn Data Structures and Algorithms&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://rob-bell.net/2009/06/a-beginners-guide-to-big-o-notation/" rel="noopener noreferrer"&gt;A beginner's guide to Big O notation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cs.princeton.edu/~rs/AlgsDS07/" rel="noopener noreferrer"&gt;Algorithms and Data Structures Fall 2007 Princeton&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cs.cmu.edu/~adamchik/15-121/lectures/Stacks%20and%20Queues/Stacks%20and%20Queues.html" rel="noopener noreferrer"&gt;Stacks and Queues&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cs.cmu.edu/~wlovas/15122-r11/lectures/10-stacks.pdf" rel="noopener noreferrer"&gt;Lecture Notes on Stacks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://web.mit.edu/6.005/www/fa15/classes/10-recursion/" rel="noopener noreferrer"&gt;MIT Reading 10: Recursion&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.csee.umbc.edu/~chang/cs202.f98/readings/recursion.html" rel="noopener noreferrer"&gt;CMSC 202 Lecture Notes: Recursion&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.manning.com/books/algorithms-and-data-structures-in-action" rel="noopener noreferrer"&gt;Algorithms and Data Structures in Action&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.javaguides.net/p/data-structures-and-algorithms-in-java.html" rel="noopener noreferrer"&gt;Data Structures and Algorithms in Java&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cs.bham.ac.uk/~jxb/DSA/dsa.pdf" rel="noopener noreferrer"&gt;Lecture Notes for Data Structures and Algorithms&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/sherxon/AlgoDS" rel="noopener noreferrer"&gt;Collection of Algorithms and Data Structures&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://users.monash.edu/~lloyd/tildeAlgDS/" rel="noopener noreferrer"&gt;Algorithms and Data Structures Research &amp;amp; Reference Material&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://doc.lagout.org/science/0_Computer%20Science/2_Algorithms/Algorithms%20and%20Data%20Structures_%20The%20Science%20of%20Computing%20%5bBaldwin%20%26%20Scragg%202004-05-15%5d.pdf" rel="noopener noreferrer"&gt;Algorithms and Data Strcutures The Science of Computing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.udacity.com/course/data-structures-and-algorithms-in-python--ud513" rel="noopener noreferrer"&gt;Data Structures and Algorithms in Python - Udacity&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.thecodingdelight.com/introduction-to-data-structures/" rel="noopener noreferrer"&gt;Introduction to Data Structures – A Beginner Friendly Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cprogramming.com/algorithms-and-data-structures.html" rel="noopener noreferrer"&gt;Algorithms and data structures in C/C++&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://digitallearning.ucsd.edu/catalog/courses/data-structures.html" rel="noopener noreferrer"&gt;Data Structures and Algorithms Courses&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-006-introduction-to-algorithms-fall-2011/" rel="noopener noreferrer"&gt;MIT 6.006 Introduction to Algorithms&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-854j-advanced-algorithms-fall-2005/" rel="noopener noreferrer"&gt;MIT 6.854J Advanced Algorithms&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-851-advanced-data-structures-spring-2012/" rel="noopener noreferrer"&gt;MIT 6.851 Advanced Data Structures&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.bigocheatsheet.com/" rel="noopener noreferrer"&gt;Big-O Cheat Sheet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/TSiege/Tech-Interview-Cheat-Sheet" rel="noopener noreferrer"&gt;Tech Interview Cheat Sheet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.ittc.ku.edu/~jsv/Papers/Vit.IO_book.pdf" rel="noopener noreferrer"&gt;Algorithms and Data Structures for External Memory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ece.uwaterloo.ca/~dwharder/aads/Projects/List/" rel="noopener noreferrer"&gt;List of all projects - University of Waterloo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://home.ustc.edu.cn/~huang83/ds/Data%20Structures%20and%20Algorithms%20Using%20Python.pdf" rel="noopener noreferrer"&gt;Data Structures and Algorithms using Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cs.usfca.edu/~galles/visualization/Algorithms.html" rel="noopener noreferrer"&gt;Data Structure Visualizations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.algolist.net/" rel="noopener noreferrer"&gt;Algorithms and Data Structures with implementations in Java and C++&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.usejournal.com/500-data-structures-and-algorithms-practice-problems-35afe8a1e222" rel="noopener noreferrer"&gt;500+ Data Structures and Algorithms Interview Questions &amp;amp; Practice Problems&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://algs4.cs.princeton.edu/cheatsheet/" rel="noopener noreferrer"&gt;Algorithms and Data Structures Cheatsheet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.softpanorama.org/Algorithms/index.shtml" rel="noopener noreferrer"&gt;Softpanorama - Algorithms and Data Structures&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://faculty.washington.edu/jstraub/dsa/Master_2_7a.pdf" rel="noopener noreferrer"&gt;C Programming: Data Structures and Algorithms&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://users.pja.edu.pl/~msyd/wyka-eng/complexity2.pdf" rel="noopener noreferrer"&gt;Algorithms and Data Structures - Complexity of Algorithms&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ece.uwaterloo.ca/~dwharder/aads/Lecture_materials/" rel="noopener noreferrer"&gt;Lecture Materials - University of Waterloo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.w3schools.in/data-structures-tutorial/intro/" rel="noopener noreferrer"&gt;Data Structure Introduction&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cpp.edu/~ftang/courses/CS240/notes.htm" rel="noopener noreferrer"&gt;CS240: Schedule/Notes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://people.mpi-inf.mpg.de/~mehlhorn/Toolbox.html" rel="noopener noreferrer"&gt;Data Structures and Algorithms - The Basic Toolbox&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.freecodecamp.org/learn/javascript-algorithms-and-data-structures/" rel="noopener noreferrer"&gt;Introduction to JavaScript Algorithms and Data Structures- Freecodecamp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://users.soe.ucsc.edu/~sbrandt/13H/slides/DSChapter3.pdf" rel="noopener noreferrer"&gt;Algorithms and Data Structures: Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ressources.unisciel.fr/algoprog/s00aaroot/aa00module1/res/%5BCormen-AL2011%5DIntroduction_To_Algorithms-A3.pdf" rel="noopener noreferrer"&gt;Introduction to Algorithms Third Edition&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://opendatastructures.org/ods-python.pdf" rel="noopener noreferrer"&gt;Open Data Structures&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.tutorialspoint.com/data_structures_algorithms/algorithms_basics.htm" rel="noopener noreferrer"&gt;Data Structures &amp;amp; Algorithms - Tutorialspoint&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://algs4.cs.princeton.edu/home/" rel="noopener noreferrer"&gt;Algorithms, 4th Edition &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bradfieldcs.com/algos/" rel="noopener noreferrer"&gt;Practical Algorithms and Data Structures&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.uni-weimar.de/fileadmin/user/fak/medien/professuren/Computer_Graphics/Algo19/2-ComplexitySorting.pdf" rel="noopener noreferrer"&gt;Algorithm Complexity&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.uni-weimar.de/fileadmin/user/fak/medien/professuren/Computer_Graphics/Algo19/1-DataStruct.pdf" rel="noopener noreferrer"&gt;Data Structures&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.uni-weimar.de/fileadmin/user/fak/medien/professuren/Computer_Graphics/Algo19/04-Searching.pdf" rel="noopener noreferrer"&gt;String Searching Algorithm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.uni-weimar.de/fileadmin/user/fak/medien/professuren/Computer_Graphics/Algo19/07-SortingBasedAlgorithms.pdf" rel="noopener noreferrer"&gt;Sorting Based Algorithms&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.uni-weimar.de/fileadmin/user/fak/medien/professuren/Computer_Graphics/Algo19/08-MathematicalAlgorithms.pdf" rel="noopener noreferrer"&gt;Mathematical Algorithms&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.uni-weimar.de/fileadmin/user/fak/medien/professuren/Computer_Graphics/Algo19/NP-complete_problems.pdf" rel="noopener noreferrer"&gt;NP-Complete Problems&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cs.auckland.ac.nz/software/AlgAnim/ds_ToC.html" rel="noopener noreferrer"&gt;Data Structures and Algorithms - Table of Contents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nptel.ac.in/courses/106/102/106102064/" rel="noopener noreferrer"&gt;NPTEL - Data Structures and Algorithms&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/coderbyte/improving-your-algorithms-data-structure-skills-2odo"&gt;Improving your Algorithms &amp;amp; Data Structure skills&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/hexangel616/notes-on-algorithms-36pi"&gt;Notes on Algorithms&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cs.lmu.edu/~ray/notes/algds/" rel="noopener noreferrer"&gt;Algorithms and Data Structures Importance&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/keon/algorithms" rel="noopener noreferrer"&gt;Minimal examples of data structures and algorithms in Python &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tayllan/awesome-algorithms" rel="noopener noreferrer"&gt;Awesome Algorithms&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/TheAlgorithms/Python" rel="noopener noreferrer"&gt;All Algorithms implemented in Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/xtaci/algorithms" rel="noopener noreferrer"&gt;Algorithms &amp;amp; Data structures in C++&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.algomation.com/" rel="noopener noreferrer"&gt;Algomation - A didactic, animated, exposition of algorithms&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://algorithm-visualizer.org/" rel="noopener noreferrer"&gt;Algorithm Visualizer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www14.in.tum.de/lehre/2016WS/ea/index.html.en" rel="noopener noreferrer"&gt;Efficient Algorithms and Data Structures I&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cs.brown.edu/courses/csci0160/lectures.html" rel="noopener noreferrer"&gt;CS16 Brown&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.golangprograms.com/data-structure-and-algorithms.html" rel="noopener noreferrer"&gt;GoLang Data Structures &amp;amp; Algorithms&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://scotch.io/courses/the-ultimate-guide-to-javascript-algorithms/a-gentle-introduction-to-algorithms-and-data-structures" rel="noopener noreferrer"&gt;A Gentle Introduction to Algorithms and Data Structures&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.gousios.gr/courses/algo-ds/" rel="noopener noreferrer"&gt;Algorithms and Data Structures Course&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.cs.ucc.ie/~kb11/teaching/CS2515/Home/" rel="noopener noreferrer"&gt;CS2515: Algorithms and Data Structures I&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cs.uni-paderborn.de/ti/lehre/veranstaltungen/vergangene-semester/ws-20162017/advanced-distributed-algorithms-and-data-structures/" rel="noopener noreferrer"&gt;Advanced Distributed Algorithms and Data Structures&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.win.tue.nl/~kbuchin/teaching/JBP030/" rel="noopener noreferrer"&gt;Data Structures and Algorithms (archived version)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://w3.cs.jmu.edu/spragunr/CS240_F12/ConciseNotes.pdf" rel="noopener noreferrer"&gt;Concise Notes on Data Structures and Algorithms&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.columbia.edu/~jxz2101/#1" rel="noopener noreferrer"&gt;Data Structures for Interviews&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://users.cms.caltech.edu/~umans/cs38/index.html" rel="noopener noreferrer"&gt;CS 38: Introduction to Algorithms&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://people.cs.vt.edu/shaffer/Book/C++3elatest.pdf" rel="noopener noreferrer"&gt;Data Structures and Algorithm Analysis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.cs.yale.edu/homes/aspnes/classes/223/notes.pdf" rel="noopener noreferrer"&gt;Notes on Data Structures and Programming&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/playlist?list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb" rel="noopener noreferrer"&gt;MIT 6.006 Introduction to Algorithms, Fall 2011&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/playlist?list=PLBZBJbE_rGRV8D7XZ08LK6z-4zPoWzu5H" rel="noopener noreferrer"&gt;Data Structures and Algorithms - CSDojo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/playlist?list=PLDN4rrl48XKpZkf03iYFl-O29szjTrs_O" rel="noopener noreferrer"&gt;Algorithms - Abdul Bari&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/playlist?list=PLkToMFwOtNHiJtcBu0piSLKnLVGOF9vaV" rel="noopener noreferrer"&gt;MIT Data Structures and Algorithms 2015&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/playlist?list=PLEbnTDJUr_IeHYw_sfBOJ6gk5pie0yP-0" rel="noopener noreferrer"&gt;Algorithms and Data Structures Lectures&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/playlist?list=PLWKjhJtqVAbkso-IbgiiP48n-O-JQA9PJ" rel="noopener noreferrer"&gt;Data Structures and Algorithms - Beau teaches Javascript&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=sVxBVvlnJsM" rel="noopener noreferrer"&gt;Data Structures you MUST know&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=RBSGKlAvoiM" rel="noopener noreferrer"&gt;Data Structures Easy to Advanced Course&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=YX40hbAHx3s" rel="noopener noreferrer"&gt;P vs. NP and the Computational Complexity Zoo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=2BdBfsXbST8" rel="noopener noreferrer"&gt;Donald Knuth: Algorithms, Complexity, Life, and The Art of Computer Programming&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=KyUTuwz_b7Q" rel="noopener noreferrer"&gt;Hash Tables and Hash Functions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/playlist?list=PL2SOU6wwxB0uP4rJgf5ayhHWgw7akUWSf" rel="noopener noreferrer"&gt;Advanced Algorithms (COMPSCI 224)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.coursera.org/learn/algorithms-part1" rel="noopener noreferrer"&gt;Algorithms Part I&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.coursera.org/learn/algorithms-part2" rel="noopener noreferrer"&gt;Algorithms, Part II&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/playlist?list=PL89B61F78B552C1AB" rel="noopener noreferrer"&gt;Algorithms Lessons&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=X3x7BlLgS-4" rel="noopener noreferrer"&gt;Pathfinding Algorithms&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=ySN5Wnu88nE" rel="noopener noreferrer"&gt;A* (A Star) Search Algorithm - Computerphile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=GazC3A4OQTE" rel="noopener noreferrer"&gt;Dijkstra's Algorithm&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft4t5tb8l4q6u41dgxfnv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft4t5tb8l4q6u41dgxfnv.png" alt="PT" width="32" height="24"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.caelum.com.br/download/caelum-algoritmos-estruturas-dados-java-cs14.pdf" rel="noopener noreferrer"&gt;Caelum - Algoritmos e Estruturas de Dados&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.inf.ufpr.br/cursos/ci055/apostila.pdf" rel="noopener noreferrer"&gt;Apostila Algoritmos e Estruturas de Dados&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://orion.lcg.ufrj.br/algoritmos/EstrDadosAlgoritmos.pdf" rel="noopener noreferrer"&gt;Estruturas de Dados e Algoritmos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.each.usp.br/digiampietri/ACH2023/ACH2023.pdf" rel="noopener noreferrer"&gt;Algoritmos e Estruturas de Dados I&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://web.tecnico.ulisboa.pt/~david.matos/w/pt/index.php/Algoritmos_e_Estruturas_de_Dados" rel="noopener noreferrer"&gt;Algoritmos e Estruturas de Dados&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kelvins/Algoritmos-e-Estruturas-de-Dados" rel="noopener noreferrer"&gt;Algoritmos e Estruturas de Dados Repositório&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://professor.ufabc.edu.br/~jesus.mena/courses/aed1-1q-2019/" rel="noopener noreferrer"&gt;MCTA001 - Algoritmos e Estruturas de Dados I&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://usuarios.upf.br/~mcpinto/ed-tsi/ed_parte01.pdf" rel="noopener noreferrer"&gt;Estruturas de Dados&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://calhau.dca.fee.unicamp.br/wiki/images/0/01/EstruturasDados.pdf" rel="noopener noreferrer"&gt;Estruturas de Dados UNICAMP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docente.ifsc.edu.br/vilson.junior/ip/IP_01_Logica.pdf" rel="noopener noreferrer"&gt;Lógica de Programação, Algoritmos e Estruturas de Dados&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.ime.usp.br/~pf/estruturas-de-dados/aulas/index.html" rel="noopener noreferrer"&gt;Aulas de Estruturas de Dados&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www2.dcc.ufmg.br/disciplinas/aeds2_turmaA1/aeds2.html" rel="noopener noreferrer"&gt;Algoritmos e Estruturas de Dados II UFMG&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://wiki.icmc.usp.br/images/e/e7/SCC0120_Rosane-04-algoritmos_controle_2014.pdf" rel="noopener noreferrer"&gt;Algoritmos: Estruturas de Controle&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.dainf.ct.utfpr.edu.br/~pbueno/Arquivos/Algoritmos.pdf" rel="noopener noreferrer"&gt;Apostila de Algoritmo Estruturado&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cin.ufpe.br/~garme/public/(ebook)Estruturas%20de%20Dados%20Usando%20C%20(Tenenbaum).pdf" rel="noopener noreferrer"&gt;Estrutura de Dados usando C&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.faccamp.br/osvaldo/EstruturasDados.pdf" rel="noopener noreferrer"&gt;Complexidade de Algoritmos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docente.ifrn.edu.br/demetrioscoutinho/disciplinas/algoritmos/03-complexidade" rel="noopener noreferrer"&gt;Complexidade de Algoritmos IFRN&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.lapix.ufsc.br/ensino/estrutura-de-dados/complexidade-de-algoritmos/" rel="noopener noreferrer"&gt;Complexidade de Algoritmos LAPIX UFSC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/nagoya-foundation/introdu%C3%A7%C3%A3o-%C3%A0-complexidade-de-algoritmos-4a9c237e4ecc" rel="noopener noreferrer"&gt;Introdução à Complexidade de Algoritmos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://homepages.dcc.ufmg.br/~cunha/teaching/20121/aeds2/complexity.pdf" rel="noopener noreferrer"&gt;Análise de Complexidade&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/playlist?list=PLxI8Can9yAHf8k8LrUePyj0y3lLpigGcl" rel="noopener noreferrer"&gt;Engenharia de Computação UNIVESP - Estrutura de Dados&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/playlist?list=PL3pqME-MCdyFZrmCnHoHkQAL9CMZUtiZf" rel="noopener noreferrer"&gt;Algoritmos e Estruturas de Dados - USP&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgd7x2pjxlfopc4pizfpx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgd7x2pjxlfopc4pizfpx.png" alt="ES" width="32" height="24"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://es.wikipedia.org/wiki/Estructura_de_datos" rel="noopener noreferrer"&gt;Estructura de datos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cimec.org.ar/~mstorti/aed/aednotes.pdf" rel="noopener noreferrer"&gt;Algoritmos y Estructuras de Datos - Universidad del Litoral&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://biblioteca.uns.edu.pe/saladocentes/archivoz/publicacionez/manual_algoritmos_y_estructura_de_datos.pdf" rel="noopener noreferrer"&gt;Manual de Algoritmos y Estructuras de Datos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://people.ac.upc.edu/mario/teaching/cap2.pdf" rel="noopener noreferrer"&gt;Programas = Datos + Algoritmos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://users.dcc.uchile.cl/~bebustos/apuntes/cc3001/" rel="noopener noreferrer"&gt;CC3001 Algoritmos y Estructuras de Datos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sites.google.com/site/rccuam/home/1151042---algoritmos-y-estructuras-de-datos" rel="noopener noreferrer"&gt;1151042 - Algoritmos y Estructuras de Datos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://runestone.academy/runestone/static/pythoned/BasicDS/toctree.html" rel="noopener noreferrer"&gt;Estructuras de datos básicas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www3.uji.es/~vjimenez/" rel="noopener noreferrer"&gt;Víctor Jiménez, Universitat Jaume I&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.fing.edu.uy/tecnoinf/maldonado/cursos/eda/middleeda.html" rel="noopener noreferrer"&gt;Estructuras de Datos y Algoritmos Material&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.glyc.dc.uba.ar/santiago/papers/teoricasAlgo1.pdf" rel="noopener noreferrer"&gt;Algoritmos y Estructuras de Datos I&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://users.dcc.uchile.cl/~bebustos/apuntes/cc30a/Estructuras/" rel="noopener noreferrer"&gt;Estructuras de datos básicas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.frro.utn.edu.ar/repositorio/catedras/sistemas/1_anio/algoritmo_estructura_datos/SORRIBAS.pdf" rel="noopener noreferrer"&gt;Algoritmos y Estructuras de Datos Apunte de Teoria&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cs.us.es/~jalonso/cursos/i1m/temas/tema-28.html" rel="noopener noreferrer"&gt;Análisis de la complejidad de los algoritmos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://es.wikipedia.org/wiki/Eficiencia_algor%C3%ADtmica" rel="noopener noreferrer"&gt;Eficiencia algorítmica&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://informatica.uv.es/iiguia/AED/teoria/apuntes/cuatr2/AED.Tema.09.pdf" rel="noopener noreferrer"&gt;INTRODUCCIÓN al Estudio de ALGORITMOS y su COMPLEJIDAD&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://verso.mat.uam.es/~pablo.angulo/doc/laboratorio/b2s2.html" rel="noopener noreferrer"&gt;Tiempo de ejecución y eficiencia de algoritmos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://campus.exactas.uba.ar/pluginfile.php/134737/mod_resource/content/1/Te%C3%B3rica%20Complejidad.pdf" rel="noopener noreferrer"&gt;Análisis de la Complejidad de Algoritmos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://marenas.sitios.ing.uc.cl/iic1253-14/clases/analisis-imp.pdf" rel="noopener noreferrer"&gt;An ́alisis de Algoritmos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://marenas.sitios.ing.uc.cl/iic2283-16/clases/analisis-I.pdf" rel="noopener noreferrer"&gt;An ́alisis de la eficiencia de un algoritmo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://guias.makeitreal.camp/algoritmos/complejidad" rel="noopener noreferrer"&gt;Complejidad (Big-O)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.dit.upm.es/~pepe/doc/adsw/tema1/Complejidad.pdf" rel="noopener noreferrer"&gt;Análisis de Algoritmos –Complejidad&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fetvtd8mk692g1wpldgsw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fetvtd8mk692g1wpldgsw.png" alt="FR" width="32" height="24"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://deptinfo.unice.fr/~regin/cours/cours/ASD/C1_AlgoSdd.pdf" rel="noopener noreferrer"&gt;Algorithmique et Structures de Données&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://openclassrooms.com/fr/courses/1467201-algorithmique-pour-lapprenti-programmeur/1467600-notions-de-structures-de-donnees-tableaux-et-listes-chainees" rel="noopener noreferrer"&gt;Notions de structures de données : tableaux et listes chaînées&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.info.univ-angers.fr/pub/stephan/L3INFO/ALGORITHMIQUE/COURS/complexite.pdf" rel="noopener noreferrer"&gt;Structures de donn ́ees et algorithmes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.montefiore.ulg.ac.be/~geurts/Cours/sda/2011/sda-complet-2011-2012.pdf" rel="noopener noreferrer"&gt;Structures de donn ́ees et algorithmes 2012&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.montefiore.ulg.ac.be/~geurts/Cours/sda/2018/sda2018_2019.html#" rel="noopener noreferrer"&gt;Structures de données et algorithmes Université de Liège&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://perso.liris.cnrs.fr/pierre-antoine.champin/enseignement/algo/cours/index.html" rel="noopener noreferrer"&gt;Algorithmique&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.lri.fr/~hivert/COURS/CFA-L3/03-Structures.pdf" rel="noopener noreferrer"&gt;Algorithmique Structures de données&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://univ.ency-education.com/uploads/1/3/1/0/13102001/mi06_lessons-algo_str_donnees.pdf" rel="noopener noreferrer"&gt;Algorithmique et Structures de Données&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tcuvelier.developpez.com/tutoriels/algo/introduction-algorithmes-structures-donnees/" rel="noopener noreferrer"&gt;Introduction aux algorithmes et aux structures de données&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.lirmm.fr/~poupet/enseignement/algo11.php" rel="noopener noreferrer"&gt;Enseignement : Algorithmique et structures de données (2009, 2010 et 2011)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fc.isima.fr/~kante/cours/cours-sdd.pdf" rel="noopener noreferrer"&gt;Cours de Structures de données&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www-igm.univ-mlv.fr/~mac/ENS/DOC/struct_1.pdf" rel="noopener noreferrer"&gt;STRUCTURES DE DONNÉES 1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lsinf1121.readthedocs.io/fr/latest/" rel="noopener noreferrer"&gt;LSINF1121: Algorithmique et Structures de données&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://oer.avu.org/bitstream/handle/123456789/527/ITI%202200-FR-DATA%20STRUCTURES(1).pdf" rel="noopener noreferrer"&gt;Structures de donn ́ees et algorithmes UVA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ericbeaudry.ca/~eric/INF3105/inf3105-notes.pdf" rel="noopener noreferrer"&gt;INF3105 – Structures de données et algorithmes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://igm.univ-mlv.fr/~alabarre/teaching/struct/poly-m1103.pdf" rel="noopener noreferrer"&gt;Structures de données et algorithmes fondamentaux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.lacl.fr/dima/complexite/" rel="noopener noreferrer"&gt;Algorithmique et Complexité&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.dptinfo.ens-cachan.fr/Agregation/Algo14-15/structures.pdf" rel="noopener noreferrer"&gt;Algorithmique&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://kiwi.emse.fr/POLE/SDA/sda-c.pdf" rel="noopener noreferrer"&gt;Langages et Concepts de Programmation Structures de données et algorithmes en C&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fr.wikipedia.org/wiki/Analyse_de_la_complexit%C3%A9_des_algorithmes" rel="noopener noreferrer"&gt;Analyse de la complexité des algorithmes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.dil.univ-mrs.fr/~gcolas/algo-licence/slides/complexite-cm.pdf" rel="noopener noreferrer"&gt;Complexité des algorithmes - Stéphane Grandcolas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://paristech.institutoptique.fr/site.php?id=580&amp;amp;fileid=5335" rel="noopener noreferrer"&gt;Algorithmique &amp;amp; Complexité&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.irem.unilim.fr/fileadmin/documents/2015_01_04-Introduction_complexite_algorithmique.pdf" rel="noopener noreferrer"&gt;Introduction à la complexité algorithmique&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://pauillac.inria.fr/~levy/x/tc/polycopie-1.6/main003.html" rel="noopener noreferrer"&gt;Complexité des algorithmes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.iro.umontreal.ca/~hamelsyl/Analyse28104-A09.pdf" rel="noopener noreferrer"&gt;Analyse et complexité des algorithmes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.math.univ-toulouse.fr/~msablik/Cours/Complexite/Slide-Complexite.pdf" rel="noopener noreferrer"&gt;Complexité algorithmique Université de Toulose&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.cril.univ-artois.fr/~benferhat/complexite_nombres_instructions.pdf" rel="noopener noreferrer"&gt;Complexite des algorithmes: nombres instructions ́elementaires&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F30mpfe69suoj3f0mm2wz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F30mpfe69suoj3f0mm2wz.png" alt="IT" width="32" height="24"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.cs.unibo.it/~donat/alg.html" rel="noopener noreferrer"&gt;Corso di Algoritmi e Strutture Dati&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.math.unipd.it/~baldan/Algoritmi/" rel="noopener noreferrer"&gt;Algoritmi e Strutture Dati - Università di Padova&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.mat.uniroma2.it/~guala/ASDL_2018.htm" rel="noopener noreferrer"&gt;Corso di Algoritmi e Strutture Dati&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.di.uniba.it/~ndm/courses/asd/" rel="noopener noreferrer"&gt;Algoritmi e Strutture Dati + Laboratorio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.dsi.unive.it/~acarraro/Tutorato-ASD-Carraro-2014.pdf" rel="noopener noreferrer"&gt;Appunti di Algoritmi e Strutture Dati&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mat.unical.it/terracina/asd/" rel="noopener noreferrer"&gt;Corso di Algoritmi e Strutture Dati - Università della Calabria&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/playlist?list=PLyuPAlvJWIqKLv9G5xV5pSzrzGPFbXJXA" rel="noopener noreferrer"&gt;Algoritmi e Strutture Dati 2018/2019&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.dis.uniroma1.it/~patrizi/sections/teaching/asd-latina-16-17/slides/slides.pdf" rel="noopener noreferrer"&gt;Algoritmi e Strutture Dati UniRoma&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://vvw.web.cs.unibo.it/wiki/images/d/dc/Appunti_di_Algoritmi_e_Strutture_Dati.incomplete.pdf" rel="noopener noreferrer"&gt;Corse di Algoritmi e Strutture Dati&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://unina.stidue.net/Algoritmi%20e%20Strutture%20Dati/Materiale/Cormen%20Leiserson%20Rivest%20Stein-Introduzione%20Agli%20Algoritmi%20E%20Strutture%20Dati-2a%20Edizione-capitoli%201-15.pdf" rel="noopener noreferrer"&gt;Introduzione Agli Algoritmi E Strutture Dati&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://wpage.unina.it/benerece/ASD/Benerecetti/ASD-1/1-Introduzione.pdf" rel="noopener noreferrer"&gt;Algoritmi e Strutture Dati - Introduzione&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docplayer.it/397945-Esercizi-di-algoritmi-e-strutture-dati.html" rel="noopener noreferrer"&gt;Esercizi di Algoritmi e Strutture Dati&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.mat.uniroma2.it/~guala/ASDL_2015.htm" rel="noopener noreferrer"&gt;Corso di Algoritmi e Strutture Dati: Modulo I + II&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.math.unipd.it/~laurap/didattica/Fondamenti-recupero/settimana5/settimana5_6pgbn.pdf" rel="noopener noreferrer"&gt;1Complessità degli algoritmi&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www-db.deis.unibo.it/courses/FIL-B/Lezioni/complessita.pdf" rel="noopener noreferrer"&gt;Complessità Computazionale&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.okpedia.it/complessita_algoritmo" rel="noopener noreferrer"&gt;Complessità algoritmo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxvkb4g9d2p01tiy1frax.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxvkb4g9d2p01tiy1frax.png" alt="RU" width="32" height="24"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://tproger.ru/translations/algorithms-and-data-structures/" rel="noopener noreferrer"&gt;Алгоритмы и структуры данных для начинающих: сложность алгоритмов&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://portal.tpu.ru/SHARED/o/OFOFANO/work/Tab2/up.pdf" rel="noopener noreferrer"&gt;АЛГОРИТМЫ СТРУКТУРЫ ДАННЫХ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://kspt.icc.spbstu.ru/media/files/course/algstr/algstr_2009.pdf" rel="noopener noreferrer"&gt;Data Structures and Algorithms: C / C ++ Implementation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nnov.hse.ru/data/2012/02/09/1262604831/%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%A2%D0%B0%D0%BB%D0%9F%D0%BE%D0%B2%D1%8B%D1%88%D0%9A%D0%B2%D0%B0%D0%BB%D0%B8%D1%84.pdf" rel="noopener noreferrer"&gt;Data Structure and Algorithms&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.babichev.org/books/AlgoBook.pdf" rel="noopener noreferrer"&gt;Algo Book&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fsc.bsu.by/wp-content/uploads/2015/12/E-UMK-Algoritmy-i-struktury-danny-h-chast-1.pdf" rel="noopener noreferrer"&gt;АЛГОРИТМЫ И СТРУКТУРЫ ДАННЫХ 2015&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://doc.lagout.org/science/0_Computer%20Science/2_Algorithms/Algorithms%20and%20Data%20Structures%20%28RU%29.pdf" rel="noopener noreferrer"&gt;АЛГОРИТМЫ + СТРУКТУРЫДАННЫХ = ПРОГРАММЫ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://kspt.icc.spbstu.ru/media/files/2017/asd/01_Intro.pdf" rel="noopener noreferrer"&gt;Алгоритмы Структуры Данных Slides&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pro-prof.com/archives/1660" rel="noopener noreferrer"&gt;Анализ сложности алгоритмов. Примеры&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkyjoqvvye4wkwu4u9s93.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkyjoqvvye4wkwu4u9s93.png" alt="JP" width="32" height="24"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.codereading.com/algo_and_ds/" rel="noopener noreferrer"&gt;アルゴリズムとデータ構造&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qiita.com/macky4/items/6dce671e90eaed23db32" rel="noopener noreferrer"&gt;アルゴリズムとデータ構造の基礎&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ufcpp.net/study/algorithm/" rel="noopener noreferrer"&gt;アルゴリズムとデータ構造&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.ci.seikei.ac.jp/yamamoto/lecture/algorithm/material.html" rel="noopener noreferrer"&gt;アルゴリズムとデータ構造　--- 理論編 ---&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://biorobot2.ise.ibaraki.ac.jp/inoue/ad/" rel="noopener noreferrer"&gt;Algorithms and Data Structures&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://programming-place.net/ppp/contents/algorithm/index.html" rel="noopener noreferrer"&gt;Programming Place Plus&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hkashima.github.io/course_algorithm_2019.html" rel="noopener noreferrer"&gt;2019年度 京都大学 工学部情報学科&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.ics.kagoshima-u.ac.jp/~fuchida/edu/algorithm/index.html" rel="noopener noreferrer"&gt;アルゴリズムとデータ構造 外伝&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://taurus.ics.nara-wu.ac.jp/algo/" rel="noopener noreferrer"&gt;2019年度「アルゴリズムとデータ構造」のページ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://web-ext.u-aizu.ac.jp/course/alg1/ex/jp/index.html" rel="noopener noreferrer"&gt;アルゴリズムとデータ構造&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.jaist.ac.jp/~uehara/course/2011/si216/pdf/03comp.pdf" rel="noopener noreferrer"&gt;計算の複雑さ入門&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tutorialmore.com/questions-1141026.htm" rel="noopener noreferrer"&gt;python - アルゴリズムの複雑さの計算（Big-O&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxquop1q3hjjan0c4akou.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxquop1q3hjjan0c4akou.png" alt="CN" width="32" height="24"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/playlist?list=PL2rWx9cCzU84eBz9Xfp9Rah5Fexq5yrh8" rel="noopener noreferrer"&gt;LeetCode in Python - Michelle小梦想家&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://data.biancheng.net/view/156.html" rel="noopener noreferrer"&gt;Data Biancheng&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.ranxiaolang.com/static/python_algorithm/python_algorithm.html" rel="noopener noreferrer"&gt;数据结构与算法（Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/soulmachine/leetcode" rel="noopener noreferrer"&gt;LeetCode 题解&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/haoel/leetcode" rel="noopener noreferrer"&gt;LeetCode Algorithm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/MisterBooo/LeetCodeAnimation" rel="noopener noreferrer"&gt;LeetCode Animation All in One&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cnblogs.com/wangzihong/p/12248442.html" rel="noopener noreferrer"&gt;数据结构和算法&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cnblogs.com/Alan-Song/p/11184214.html" rel="noopener noreferrer"&gt;数据结构和算法基础&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftt4l865iqc8xdi0q1h7y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftt4l865iqc8xdi0q1h7y.png" alt="DE" width="32" height="24"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.orchid.inf.tu-dresden.de/teaching/2019ws/aud/" rel="noopener noreferrer"&gt;Algorithmen und Datenstrukturen im Wintersemester 2019/20&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://west.uni-koblenz.de/studying/ws1920/algorithmen-und-datenstrukturen" rel="noopener noreferrer"&gt;Algorithmen und Datenstrukturen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.dbs.ifi.lmu.de/cms/studium_lehre/lehre_bachelor/algodat19/index.html" rel="noopener noreferrer"&gt;Algorithmen und Datenstrukturen (SS 2019)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.informatik.uni-kiel.de/~sb/data/Algorithmen.pdf" rel="noopener noreferrer"&gt;Algorithmen und Datenstrukturen - Steffen Börm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wuecampus2.uni-wuerzburg.de/moodle/course/view.php?id=34697" rel="noopener noreferrer"&gt;Vorlesung Algorithmen und Datenstrukturen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.inf.fu-berlin.de/lehre/SS12/ALP2/lectures.htm" rel="noopener noreferrer"&gt;Algorithmen und Programmierung II&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://osg.informatik.tu-chemnitz.de/lehre/aup/aup-script.pdf" rel="noopener noreferrer"&gt;Algorithmen und Programmierung&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://wwwmayr.informatik.tu-muenchen.de/lehre/2010SS/gad/index.html.de" rel="noopener noreferrer"&gt;Grundlagen: Algorithmen und Datenstrukturen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.wild-inter.net/teaching/algorithms-data-structures/" rel="noopener noreferrer"&gt;Algorithms and Data Structures - TU Kaiserslautern&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lecture2go.uni-hamburg.de/l2go/-/get/v/14161" rel="noopener noreferrer"&gt;Algorithmen und deren Komplexität&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://userpages.uni-koblenz.de/~laemmel/oopm/slides/complexity.pdf" rel="noopener noreferrer"&gt;Komplexität von Algorithmen&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




</description>
      <category>computerscience</category>
      <category>python</category>
      <category>java</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Deploy de uma Aplicação Flask com PythonAnywhere</title>
      <dc:creator>Gabriel Felippe</dc:creator>
      <pubDate>Fri, 29 Nov 2019 15:24:13 +0000</pubDate>
      <link>https://dev.to/theakira/deploy-de-uma-aplicacao-flask-com-pythonanywhere-5ddk</link>
      <guid>https://dev.to/theakira/deploy-de-uma-aplicacao-flask-com-pythonanywhere-5ddk</guid>
      <description>&lt;h1&gt;
  
  
  Introdução
&lt;/h1&gt;

&lt;p&gt;O &lt;strong&gt;PythonAnywhere&lt;/strong&gt; é um ambiente de desenvolvimento integrado online (&lt;a href="https://pt.wikipedia.org/wiki/Ambiente_de_desenvolvimento_integrado" rel="noopener noreferrer"&gt;IDE&lt;/a&gt;) e um serviço de hospedagem na web (&lt;a href="https://pt.wikipedia.org/wiki/Plataforma_como_servi%C3%A7o" rel="noopener noreferrer"&gt;plataforma como serviço&lt;/a&gt;) baseado na linguagem de programação Python. Fundada por &lt;strong&gt;Giles Thomas&lt;/strong&gt; e &lt;strong&gt;Robert Smithson&lt;/strong&gt; em 2012, fornece acesso no navegador a interfaces de linha de comando Python e Bash baseadas em servidor, além de um editor de código com destaque de sintaxe. Os arquivos do programa podem ser transferidos de e para o serviço usando o navegador do usuário. Os aplicativos da Web hospedados pelo serviço podem ser gravados usando qualquer estrutura de aplicativos baseada em &lt;a href="https://en.wikipedia.org/wiki/Web_Server_Gateway_Interface" rel="noopener noreferrer"&gt;WSGI&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;O &lt;strong&gt;WSGI&lt;/strong&gt; não é um servidor, um módulo python, uma estrutura, uma API ou qualquer tipo de software. É apenas uma especificação de interface pela qual o servidor e o aplicativo se comunicam. Os lados da interface do servidor e do aplicativo são especificados no &lt;a href="https://www.python.org/dev/peps/pep-3333/" rel="noopener noreferrer"&gt;PEP 3333&lt;/a&gt;. Se um aplicativo (ou estrutura ou kit de ferramentas) for escrito na especificação WSGI, ele será executado em qualquer servidor escrito nessa especificação.&lt;/p&gt;

&lt;p&gt;Neste guia vamos fazer o &lt;strong&gt;&lt;a href="https://www.fullstackpython.com/deployment.html" rel="noopener noreferrer"&gt;Deploy&lt;/a&gt;&lt;/strong&gt; de uma simples Aplicação Web escrita com o microframework Flask, para isso vamos utilizar a plataforma PythonAnywhere. O deployment envolve empacotar seu aplicativo Web e colocá-lo em um ambiente de produção que possa executar o aplicativo para que todos no mundo possam vê-lo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tutorial
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Nosso primeiro passo neste guia será fazer o registro na plataforma &lt;strong&gt;PythonAnywhere&lt;/strong&gt;, para esta tarefa vamos navegar até este &lt;strong&gt;&lt;a href="https://www.pythonanywhere.com/registration/register/beginner/" rel="noopener noreferrer"&gt;Link&lt;/a&gt;&lt;/strong&gt; e fazer nosso cadastro. Importante, lembre-se de confirmar seu endereço de email.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Uma vez que estamos cadastrados com sucesso, agora podemos nos autenticar na plataforma para obtermos acesso a todas as suas funcionalidades. &lt;/p&gt;

&lt;p&gt;Vamos visualizar uma interface similar a essa&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftf9oovw2n09dmjpq3c9o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftf9oovw2n09dmjpq3c9o.png" alt="img" width="800" height="330"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Nesse passo, vamos clicar no botão &lt;strong&gt;Open Web tab&lt;/strong&gt;, em seguida vamos clicar no botão &lt;strong&gt;Add a new web app&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Nos será apresentada a informação de que nossa aplicação viverá em determinado endereço, no meu caso vai ser &lt;code&gt;akiraflask.pythonanywhere.com&lt;/code&gt;, uma vez que eu me cadastrei como o usuário &lt;strong&gt;akiraflask&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Tudo certo até então, vamos clicar no botão &lt;strong&gt;Next&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;PythonAnywhere nos pedirá para escolher o framework que vamos trabalhar, em nosso caso será o &lt;strong&gt;Flask&lt;/strong&gt;, mas veja como existem diversas outras opções, por fim ele pedirá para escolhermos uma versão do Python, vamos escolher a última versão &lt;strong&gt;3.8&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Por fim ele nos pedirá para entrarmos com o caminho para o arquivo que irá guardar nossa aplicação, vamos fornecer a seguinte informação:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;/home/seu_usuario/mysite/app.py&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Importante&lt;/strong&gt;: Não esqueça de substituir o seu usuário no caminho do arquivo&lt;/p&gt;

&lt;p&gt;Nesse ponto, nossa aplicação já está &lt;strong&gt;online&lt;/strong&gt; como um simples Hello World, porém agora precisamos configurar a nossa aplicação que reside no &lt;strong&gt;GitHub&lt;/strong&gt;.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Vamos agora retornar para o painel de controle do PythonAnywhere (representado na primeira imagem) e vamos clicar no botão &lt;strong&gt;$Bash&lt;/strong&gt; para acessarmos o terminal de comandos.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Primeiramente vamos digitar o comando &lt;code&gt;ls&lt;/code&gt; para vermos o que há disponível&lt;/p&gt;

&lt;p&gt;Veja que temos um arquivo &lt;code&gt;README.txt&lt;/code&gt; e um diretório chamado &lt;code&gt;mysite&lt;/code&gt; que contém um arquivo &lt;code&gt;app.py&lt;/code&gt; que representa o simples Hello World, vamos remover esse diretório com o comando &lt;code&gt;rm -r mysite/&lt;/code&gt; e vamos clonar o repositório de nossa aplicação com o seguinte comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git clone https://github.com/the-akira/Flask-Pokedex.git mysite
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Uma vez que o clone foi feito, agora já temos nossa aplicação residindo no PythonAnywhere, agora só precisamos navegar até o diretório &lt;strong&gt;mysite&lt;/strong&gt; com o comando &lt;code&gt;cd mysite/&lt;/code&gt; e ativar o Ambiente Virtual, instalar as dependências e tudo deve funcionar corretamente. Vamos executar os seguintes comandos:&lt;/p&gt;

&lt;p&gt;Para iniciar e ativar o Ambiente Virtual digite:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mkvirtualenv --python=/usr/bin/python3.8 my-virtualenv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nesse ponto o ambiente já está ativado, caso eventualmente queira desativá-lo digite: &lt;code&gt;deactivate&lt;/code&gt; e caso você queira reativá-lo digite: &lt;code&gt;workon my-virtualenv&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Agora finalmente podemos instalar as dependências necessárias para nossa aplicação funcionar corretamente, vamos executar o seguinte comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pip install -r requirements.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Nosso último passo agora é muito simples, vamos retornar para o painel de controle e vamos clicar novamente no botão &lt;strong&gt;Open Web tab&lt;/strong&gt;, por fim vamos clicar no botão verde &lt;strong&gt;Reload&lt;/strong&gt; para recarregar nossa aplicação com as novas configurações.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Finalizado, nossa aplicação está online e reside no seguinte endereço &lt;code&gt;https://akiraflask.pythonanywhere.com&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Muito simples, não? PythonAnywhere facilita muito nosso workflow e nos permite trabalharmos com git, além de muitos outros frameworks Python.&lt;/p&gt;

</description>
      <category>python</category>
      <category>github</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Deploy de uma Aplicação Flask com Heroku</title>
      <dc:creator>Gabriel Felippe</dc:creator>
      <pubDate>Wed, 27 Nov 2019 01:27:37 +0000</pubDate>
      <link>https://dev.to/theakira/deploy-de-uma-aplicacao-flask-com-heroku-5c0e</link>
      <guid>https://dev.to/theakira/deploy-de-uma-aplicacao-flask-com-heroku-5c0e</guid>
      <description>&lt;h1&gt;
  
  
  Introdução
&lt;/h1&gt;

&lt;p&gt;Heroku é uma &lt;strong&gt;plataforma em nuvem como serviço&lt;/strong&gt; (&lt;a href="https://en.wikipedia.org/wiki/Platform_as_a_service" rel="noopener noreferrer"&gt;PaaS&lt;/a&gt;) que suporta várias linguagens de programação. Uma das primeiras plataformas em nuvem, o Heroku está em desenvolvimento desde junho de 2007, quando suportava apenas a linguagem de programação Ruby, mas agora suporta Java, Node.js, Scala, Clojure, Python, PHP e Go. Por esse motivo, o Heroku é considerado uma plataforma poliglota, pois possui recursos para um desenvolvedor criar, executar e dimensionar aplicativos de maneira semelhante na maioria dos idiomas.&lt;/p&gt;

&lt;p&gt;Neste guia vamos fazer o &lt;strong&gt;&lt;a href="https://www.fullstackpython.com/deployment.html" rel="noopener noreferrer"&gt;Deploy&lt;/a&gt;&lt;/strong&gt; de uma simples Aplicação Web escrita com o microframework Flask, para isso vamos utilizar a plataforma Heroku. O &lt;strong&gt;deployment&lt;/strong&gt; envolve empacotar seu aplicativo Web e colocá-lo em um ambiente de produção que possa executar o aplicativo para que todos no mundo possam vê-lo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tutorial
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Nosso primeiro passo no tutorial é &lt;strong&gt;fazer o download e instalar&lt;/strong&gt; a &lt;strong&gt;interface de linha de comandos&lt;/strong&gt; do Heroku para o seu Sistema Operacional, não vamos abordar essa etapa em detalhe, uma vez que ela é particular para cada sistema.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Visite este &lt;strong&gt;&lt;a href="https://devcenter.heroku.com/articles/getting-started-with-python#set-up" rel="noopener noreferrer"&gt;Link&lt;/a&gt;&lt;/strong&gt; para fazer o download, lembrando que é necessário ter o &lt;strong&gt;&lt;a href="https://git-scm.com/" rel="noopener noreferrer"&gt;git&lt;/a&gt;&lt;/strong&gt; instalado em sua máquina!&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Uma vez que o &lt;strong&gt;Heroku&lt;/strong&gt; esteja instalado em sua máquina com sucesso, agora é necessário fazermos o &lt;strong&gt;login&lt;/strong&gt;, para isso vamos abrir nossa Interface de Linha de Comandos e digitar o seguinte comando:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;heroku login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Uma página em seu navegador será aberta, faça o &lt;strong&gt;login&lt;/strong&gt; e sua autenticação estará completa.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Agora que estamos autenticados no Heroku, vamos fazer o clone do nosso projeto para podermos fazer o &lt;strong&gt;Deployment&lt;/strong&gt;. Para esta tarefa vamos executar o seguinte comando
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git clone https://github.com/the-akira/Flask-Blog.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Navegamos dentro do diretório principal de nosso projeto e agora vamos reinicializar o repositório com o comando&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vamos criar um Ambiente Virtual&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;python -m venv myvenv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ativamos o Ambiente Virtual&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;source myvenv/bin/activate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instalamos as dependências necessárias de nosso projeto&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pip install -r requirements.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vamos precisar instalar agora o famoso &lt;code&gt;gunicorn&lt;/code&gt;. Ele é um servidor Web Python para sistemas operacionais baseados em UNIX. É necessário tê-lo instalado em seu código com o ambiente virtual ativado para iniciar o aplicativo Flask no Heroku.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pip install gunicorn
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Uma vez instalado o &lt;strong&gt;gunicorn&lt;/strong&gt;, não podemos esquecer de adicioná-lo ao arquivo &lt;code&gt;requirements.txt&lt;/code&gt;, sendo assim, vamos executar&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pip freeze &amp;gt; requirements.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Agora, na verdade, criamos sua instância de aplicativo nos servidores Heroku. É aqui que você especifica o nome do aplicativo. Irei chamar o aplicativo de &lt;code&gt;akiraflask&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;heroku create akiraflask
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Uma vez que nosso aplicativo foi criado, agora precisamos criar um arquivo especial chamado &lt;code&gt;Procfile&lt;/code&gt;. O Procfile será o comando que o Heroku executa para iniciar seu código. Seria como você executando python &lt;code&gt;app.py&lt;/code&gt;. Crie um arquivo no diretório &lt;strong&gt;root&lt;/strong&gt; do seu aplicativo com o nome &lt;strong&gt;Procfile&lt;/strong&gt; e insira o seguinte conteúdo
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;web: gunicorn app:app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Substitua o primeiro "app" no código acima pelo nome do script que você deseja executar. O script Python que inicia meu aplicativo Flask é chamado app.py, portanto, o Procfile contém app:app. Se o script fosse intitulado run.py, o Procfile exibiria:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;web: gunicorn run:app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Agora podemos adicionar, fazer o commit e enviar o código para o Heroku
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git add .
git commit -m "Procfile Adicionada"
git push heroku master
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Observe que o envio não apenas envia as alterações, mas também resulta em uma reconstrução. O arquivo &lt;code&gt;requirements.txt&lt;/code&gt; é verificado mais uma vez e assim por diante.&lt;/p&gt;

&lt;p&gt;Nossa aplicação já está &lt;strong&gt;online&lt;/strong&gt;, podemos visitá-la em &lt;code&gt;https://akiraflask.herokuapp.com&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Podemos concluir então que Heroku é uma plataforma muito interessante e que facilita muito o processo de Deployment de aplicações Python e até mesmo de outras linguagens.&lt;/p&gt;

</description>
      <category>python</category>
      <category>webdev</category>
      <category>github</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Funções em Python</title>
      <dc:creator>Gabriel Felippe</dc:creator>
      <pubDate>Sat, 23 Nov 2019 18:26:51 +0000</pubDate>
      <link>https://dev.to/theakira/funcoes-em-python-309</link>
      <guid>https://dev.to/theakira/funcoes-em-python-309</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Uma &lt;strong&gt;função&lt;/strong&gt; é um bloco de código &lt;strong&gt;organizado&lt;/strong&gt; e &lt;strong&gt;reutilizável&lt;/strong&gt; que é capaz de realizar uma &lt;strong&gt;determinada ação&lt;/strong&gt;. Funções nos ajudam a deixar o nosso código mais &lt;strong&gt;modular&lt;/strong&gt;, trazendo a possibilidade de &lt;strong&gt;reusabilidade&lt;/strong&gt;, conforme nosso programa fica cada vez maior, as funções o tornam mais organizado e gerenciável.&lt;/p&gt;

&lt;p&gt;Como vimos ao longo do guia, Python já nos traz várias funções pré-construídas, como por exemplo &lt;strong&gt;print()&lt;/strong&gt; e &lt;strong&gt;range()&lt;/strong&gt;, mas também é possível criarmos nossas próprias funções!&lt;/p&gt;

&lt;h2&gt;
  
  
  Anatomia das Funções
&lt;/h2&gt;

&lt;p&gt;Podemos imaginar as &lt;strong&gt;funções&lt;/strong&gt; (de modo geral) como um &lt;strong&gt;mecanismo&lt;/strong&gt; capaz de receber valores como &lt;strong&gt;input&lt;/strong&gt; e então realizar operações nesses valores e retornar um &lt;strong&gt;output&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0xzrnsbn76rpnw0aadm2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0xzrnsbn76rpnw0aadm2.png" alt="img" width="499" height="227"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Características das Funções
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Possuem um &lt;strong&gt;nome&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Possuem &lt;strong&gt;parâmetros&lt;/strong&gt; (0 ou mais)&lt;/li&gt;
&lt;li&gt;Possuem &lt;strong&gt;docstrings&lt;/strong&gt; (opcional, porém recomendado)&lt;/li&gt;
&lt;li&gt;Possuem um &lt;strong&gt;corpo&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retornam&lt;/strong&gt; algo (opcional)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Definindo uma Função
&lt;/h2&gt;

&lt;p&gt;Em Python devemos seguir a seguinte sintaxe para construirmos uma Função:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def nome_da_função(parametros):
    """docstrings"""
    &amp;lt;comandos&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para definir uma &lt;strong&gt;função&lt;/strong&gt; é necessário que sigamos algumas regras:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bloco de funções começam com a palavra-chave &lt;strong&gt;def&lt;/strong&gt; seguido do nome da função e parenteses &lt;strong&gt;()&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;O nome da função identifica exclusivamente a função. A nomenclatura de funções segue as mesmas regras de escrita de identificadores em Python.&lt;/li&gt;
&lt;li&gt;Parâmetros de input ou argumentos (dados fornecidos por nós) devem ser colocados entre parenteses &lt;strong&gt;()&lt;/strong&gt;. Eles são opcionais.&lt;/li&gt;
&lt;li&gt;Dois pontos (&lt;code&gt;:&lt;/code&gt;) para marcar o final do cabeçalho da função.&lt;/li&gt;
&lt;li&gt;Opcionalmente podemos usar strings de documentação (&lt;a href="https://sphinxcontrib-napoleon.readthedocs.io/en/latest/example_google.html" rel="noopener noreferrer"&gt;docstrings&lt;/a&gt;) para descrever o que nossa função faz.&lt;/li&gt;
&lt;li&gt;Uma ou mais instruções Python válidas que constituem o corpo da função. As declarações devem ter o mesmo nível de indentação (geralmente 4 espaços).&lt;/li&gt;
&lt;li&gt;O comando opcional &lt;code&gt;return (expressão)&lt;/code&gt; sai da função, opcionalmente passando um parâmetro para o chamador. O comando de retorno sem argumentos é o mesmo que return &lt;code&gt;None&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Por exemplo, vamos definir uma função capaz de converter uma temperatura em &lt;strong&gt;Fahrenheit&lt;/strong&gt; para &lt;strong&gt;Celsius&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frbzwl49xqwnnz7jaod88.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frbzwl49xqwnnz7jaod88.png" alt="img" width="529" height="255"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fahr_to_celsius&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;temp&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
    Função que recebe como argumento uma temperatura
    em Fahrenheit e converte ela para Celsius 
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="nf"&gt;return &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;temp&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Uma vez que temos a função definida, agora podemos usá-la. Se quisermos obter ajuda, podemos contar com o comando &lt;strong&gt;help()&lt;/strong&gt; que nos trará o docstrings dessa função.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;help&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fahr_to_celsius&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para invocar a função, devemos passar um valor para ela como argumento:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;fahr_to_celsius&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;91.76&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;# 33.2
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;fahr_to_celsius&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;101.3&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;# 38.5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como essa função tem valor de retorno, podemos armazenar o seu resultado em uma variável:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;celsius&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;fahr_to_celsius&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;70.76&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;celsius&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# 21.53333333333334
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Também podemos definir uma função que não irá retornar um valor, por exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;cumprimentar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
    Essa função cumprimentará a pessoa passada por parâmetro
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Olá {0} Seja bem-vindo&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A &lt;strong&gt;função&lt;/strong&gt; foi criada e está definida, porém nada aconteceu. Para que ela possa funcionar precisamos &lt;strong&gt;invocá-la&lt;/strong&gt;, para isso chamaremos ela por seu nome e passaremos os &lt;strong&gt;parâmetros&lt;/strong&gt; requisitados por ela:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;cumprimentar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Gabriel&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# Olá Gabriel Seja bem-vindo
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Observe que esta função apenas nos imprime uma string, uma vez que ela não tem valor de retorno.&lt;/p&gt;

&lt;h2&gt;
  
  
  Parâmetros Padrão
&lt;/h2&gt;

&lt;p&gt;Podemos definir &lt;strong&gt;parâmetros padrão&lt;/strong&gt; para caso a função seja invocada sem nenhum argumento passado, estes preencherão as opções.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;padrao&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Função que apenas imprime um valor&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;O valor definido foi: &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="nf"&gt;padrao&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;# 100
&lt;/span&gt;&lt;span class="nf"&gt;padrao&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# 10
&lt;/span&gt;&lt;span class="nf"&gt;padrao&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;33&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# 33
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Docstring
&lt;/h2&gt;

&lt;p&gt;A primeira string depois do cabeçalho da função é chamada de docstring, é uma &lt;strong&gt;string&lt;/strong&gt; usada para especificar a funcionalidade da nossa função, e embora seja opcional, vos lembro que documentar é uma importante prática de programação, uma vez que possivelmente outras pessoas estarão lendo nosso código, inclusive é importante até mesmo para você lembrar o que você fez! &lt;/p&gt;

&lt;p&gt;Caso queiramos ver o docstring de uma função, podemos acessar o atributo &lt;code&gt;__doc__&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;padrao&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__doc__&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# Função que apenas imprime um valor
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  O Comando return
&lt;/h2&gt;

&lt;p&gt;Novamente, o comando &lt;strong&gt;return&lt;/strong&gt; nos permite fazer com que a função retorne um valor e possamos armazená-lo em uma variável, por exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; 

&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;z&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# 2
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# 3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Utilizando somente o &lt;strong&gt;return&lt;/strong&gt;, nossa função retornará &lt;code&gt;None&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;func&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; 

&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;func&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# None
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Names
&lt;/h2&gt;

&lt;p&gt;Antes de falarmos sobre o conceito de &lt;strong&gt;Namespace e Escopo&lt;/strong&gt; em Python, é importante entendermos os names(também conhecidos como &lt;strong&gt;identifiers&lt;/strong&gt;), que são simplesmente um nome dado aos objetos. Lembre que tudo em Python é um objeto. Names são uma maneira de acessar os objetos.&lt;/p&gt;

&lt;p&gt;Por exemplo, quando fazemos a atribuição &lt;code&gt;x = 13&lt;/code&gt;, nesse caso &lt;code&gt;13&lt;/code&gt; é um objeto armazenado em memória e &lt;code&gt;x&lt;/code&gt; é o &lt;strong&gt;name&lt;/strong&gt; que este objeto está associado. Nós podemos obter o endereço (em RAM) de um objeto através da função construída em Python chamada &lt;code&gt;id()&lt;/code&gt;, vejamos exemplos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;# 10914880
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;# 10914880
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Observe que ambos se referem ao mesmo objeto, vamos agora considerar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;id(x) = &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# id(x) = 10914880
&lt;/span&gt;
&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;id(x) = &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# id(x) = 10914912
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;id(14) = &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# id(x) = 10914912
&lt;/span&gt;
&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;id(13) = &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# id(13) = 10914880
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Veja que inicialmente um objeto &lt;code&gt;13&lt;/code&gt; é criado e o name &lt;code&gt;x&lt;/code&gt; é associado com ele, quando executamos a expressão &lt;code&gt;x = x + 1&lt;/code&gt;, um novo objeto &lt;code&gt;14&lt;/code&gt; é criado, e agora &lt;code&gt;x&lt;/code&gt; é associado com esse objeto, tendo ele um novo endereço de memória, podemos confirmar essa afirmação ao verificarmos que &lt;code&gt;id(x)&lt;/code&gt; e &lt;code&gt;id(14)&lt;/code&gt; possuem o mesmo endereço.&lt;/p&gt;

&lt;p&gt;Finalmente, quando executamos &lt;code&gt;y = 13&lt;/code&gt;, o novo name &lt;code&gt;y&lt;/code&gt; se associa com o objeto antigo &lt;code&gt;13&lt;/code&gt;, obtendo seu endereço.&lt;/p&gt;

&lt;p&gt;Essa dinâmica é capaz de tornar Python uma linguagem muito poderosa, uma vez que um name pode referir-se a qualquer tipo de objeto.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Programação com Python&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Todas essas expressões são válidas e &lt;code&gt;x&lt;/code&gt; irá referir-se à três diferentes tipos de objetos em diferentes instances. Funções também são objetos em Python, sendo assim, um name pode fazer referência a ela.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;zero&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

&lt;span class="n"&gt;z&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;zero&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;z&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="c1"&gt;# 0
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O name &lt;code&gt;z&lt;/code&gt; definido por nós pode fazer referência a uma função e através dele podemos chamar a função.&lt;/p&gt;

&lt;h2&gt;
  
  
  Namespace
&lt;/h2&gt;

&lt;p&gt;Um &lt;strong&gt;namespace&lt;/strong&gt; em Python é uma coleção de nomes. Portanto, um namespace é essencialmente um mapeamento de nomes para os objetos correspondentes. A qualquer momento, diferentes namespaces podem coexistir completamente isolados - o isolamento garante que não haja colisões de nomes. Simplesmente, dois namespaces em python podem ter o mesmo nome sem que haja nenhum problema. Um namespace é implementado como um dicionário Python.&lt;/p&gt;

&lt;p&gt;No &lt;strong&gt;namespace&lt;/strong&gt; há um mapeamento de nome para objeto, com os nomes como chaves e os objetos como valores. Diversos namespace podem usar o mesmo nome e mapeá-lo para um objeto diferente. Vejamos alguns exemplos de namespaces:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Namespace Local&lt;/strong&gt;: Este namespace inclui nomes locais dentro de uma função. Este namespace é criado quando uma função é chamada e dura apenas até que a função retorne.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Namespace Global&lt;/strong&gt;: Este namespace inclui nomes de vários módulos importados que você está usando em um projeto. É criado quando o módulo é incluído no projeto e dura até o final do script&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Namespace Built-In&lt;/strong&gt;: Este namespace inclui funções internas e nomes de exceção internos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Em Python, você pode então imaginar um namespace como um mapeamento de todos os nomes que você definiu para os objetos correspondentes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Escopo
&lt;/h2&gt;

&lt;p&gt;Embora existam vários namespaces exclusivos definidos, talvez não possamos acessar todos eles de todas as partes do programa. É nesse momento que o conceito de escopo entra em jogo.&lt;/p&gt;

&lt;p&gt;Podemos dizer que o Escopo é a parte do programa a partir do qual um namespace pode ser acessado diretamente sem nenhum prefixo.&lt;/p&gt;

&lt;p&gt;A qualquer momento, existem pelo menos três escopos aninhados.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Escopo da função atual que possui nomes locais&lt;/li&gt;
&lt;li&gt;Escopo do módulo que possui nomes globais&lt;/li&gt;
&lt;li&gt;Escopo externo que possui nomes construídos&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Quando uma referência é feita dentro de uma função, o name é procurado no namespace local, depois no namespace global e, finalmente, no namespace externo.&lt;/p&gt;

&lt;p&gt;Caso haja uma função dentro de outra função, um novo escopo será aninhado dentro do escopo local.&lt;/p&gt;

&lt;p&gt;Consideramos agora o seguinte exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;externa&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;z&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;valor de z = &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;interna&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;valor de y = &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;interna&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
&lt;span class="nf"&gt;externa&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;valor de x = &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O script nos trará o seguinte output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;valor de z = 13
valor de y = 14
valor de x = 10
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui, a variável &lt;code&gt;x&lt;/code&gt; está no namespace global. A variável &lt;code&gt;z&lt;/code&gt; está no namespace local da função &lt;code&gt;externa()&lt;/code&gt; e a variável &lt;code&gt;y&lt;/code&gt; está no namespace local aninhado da função &lt;code&gt;interna()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Quando estamos na função &lt;code&gt;interna()&lt;/code&gt;, &lt;code&gt;y&lt;/code&gt; é uma variável local para nós, &lt;code&gt;z&lt;/code&gt; é não-local e &lt;code&gt;x&lt;/code&gt; é global. Nós podemos ler e atribuir novos valores à &lt;code&gt;y&lt;/code&gt;, porém só podemos ler &lt;code&gt;z&lt;/code&gt; e &lt;code&gt;x&lt;/code&gt; através da função &lt;code&gt;interna()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Se tentarmos atribuir um novo valor para a variável &lt;code&gt;z&lt;/code&gt;, uma nova variável &lt;code&gt;z&lt;/code&gt; será criada no namespace local no qual é diferente do não-local &lt;code&gt;z&lt;/code&gt;. O mesmo acontece quando atribuimos um novo valor para &lt;code&gt;x&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Entretanto, se declararmos &lt;code&gt;x&lt;/code&gt; como global, todas as referências e atribuições irão para a global &lt;code&gt;x&lt;/code&gt;. Similarmente, se desejarmos reatribuir a variável &lt;code&gt;z&lt;/code&gt;, ela deve ser declarada como não-local, vamos ver mais um exemplo para ilustrar a ideia.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;externa&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;valor de x = &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;interna&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;valor de x = &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;interna&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
&lt;span class="nf"&gt;externa&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;valor de x = &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O script nos trará o seguinte output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;valor de x = 13
valor de x = 14
valor de x = 10
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste último script de exemplo, três diferentes variáveis &lt;code&gt;x&lt;/code&gt; são definidas em namespaces separados e acessadas de acordo, enquanto que no seguinte script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;externa&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;global&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;
    &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;interna&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="k"&gt;global&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;
        &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;x = &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;interna&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;x = &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
&lt;span class="nf"&gt;externa&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;x = &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O script nos trará o seguinte output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;x = 30
x = 30
x = 30
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste caso específico, todas as referências e atribuições são para a variável global &lt;code&gt;x&lt;/code&gt; por causa do uso da palavra-chave &lt;code&gt;global&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;O que ocorre então quando chamamos/invocamos uma função?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Parâmetro formal&lt;/strong&gt; se conecta com o valor do &lt;strong&gt;parâmetro real&lt;/strong&gt; quando a função é chamada&lt;/li&gt;
&lt;li&gt;Um novo &lt;strong&gt;escopo/quadro/ambiente&lt;/strong&gt; é criado quando entra uma função&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Escopo&lt;/strong&gt; é o mapeamento de nomes para objetos
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Definição da Função
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;f&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="c1"&gt;# parâmetro formal
&lt;/span&gt;    &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Em f(x): x = &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; 

&lt;span class="c1"&gt;# Código principal do Programa
# -&amp;gt; Inicializa a variável x
# -&amp;gt; faz uma chamada de função f(x)
# -&amp;gt; atribui o retorno da função para a variável z
&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
&lt;span class="n"&gt;z&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;f&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# parâmetro real
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# 11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Funções como Argumentos
&lt;/h2&gt;

&lt;p&gt;Argumentos podem assumir qualquer tipo, até mesmo funções:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;func_a&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;dentro da func_a&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;func_b&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;dentro da func_b&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;func_c&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;dentro da func_c&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;z&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;func_a&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="c1"&gt;# chama a função func_a, não recebe parâmetros
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nf"&gt;func_b&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;# chama a função func_b, recebe um parâmetro
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;func_c&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func_a&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;# chama a função func_c, recebe outra função como parâmetro
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Observe que:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A função &lt;code&gt;func_a&lt;/code&gt; retorna &lt;code&gt;None&lt;/code&gt;, pois ela apenas imprime uma string&lt;/li&gt;
&lt;li&gt;A função &lt;code&gt;func_b&lt;/code&gt; retorna &lt;code&gt;2&lt;/code&gt; (valor que passamos via argumento)&lt;/li&gt;
&lt;li&gt;A função &lt;code&gt;func_c&lt;/code&gt; recebe a &lt;code&gt;func_a&lt;/code&gt; como parâmetro, que por sua vez retorna &lt;code&gt;None&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Exemplo do Escopo
&lt;/h2&gt;

&lt;p&gt;Nem todas as variáveis são acessíveis a partir de todas as partes do nosso programa, e nem todas as variáveis existem durante o mesmo período de tempo. Onde uma variável é acessível e por quanto tempo ela existe depende de como é definida. Chamamos a parte de um programa onde uma variável está acessível de seu escopo, e a duração para a qual a variável existe seu tempo de vida.&lt;/p&gt;

&lt;p&gt;Uma variável que é definida dentro de uma função é local para essa função. Ela é acessível a partir do ponto em que foi definida até o final da função e existe enquanto a função estiver em execução. Os nomes dos parâmetros na definição da função se comportam como variáveis locais, mas contêm os valores que passamos para a função quando a chamamos. Quando usamos o operador de atribuição (&lt;code&gt;=&lt;/code&gt;) dentro de uma função, seu comportamento padrão é criar uma nova variável local - a menos que uma variável com o mesmo nome já esteja definida no escopo local.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dentro de uma função, &lt;strong&gt;podemos acessar&lt;/strong&gt; uma variável definida fora dela&lt;/li&gt;
&lt;li&gt;Dentro de uma função, &lt;strong&gt;não podemos modificar&lt;/strong&gt; uma variável definida fora dela, na verdade podemos utilizando a variável &lt;strong&gt;global&lt;/strong&gt;, mas normalmente não é o ideal
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;f&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# x é redefinido no escopo de f
&lt;/span&gt;    &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;span class="nf"&gt;f&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# 2
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# 5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste caso temos diferentes objetos &lt;code&gt;x&lt;/code&gt;, a função &lt;strong&gt;f()&lt;/strong&gt; irá utilizar o &lt;strong&gt;x&lt;/strong&gt; definido dentro dela e &lt;strong&gt;print()&lt;/strong&gt; irá imprimir o objeto &lt;strong&gt;x&lt;/strong&gt; global.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;g&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;span class="nf"&gt;g&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# 5
# 6
# 5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste caso a função &lt;strong&gt;g()&lt;/strong&gt; e &lt;strong&gt;print()&lt;/strong&gt; vão usar o mesmo objeto &lt;strong&gt;x&lt;/strong&gt; global.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;h&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; 
&lt;span class="nf"&gt;h&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# UnboundLocalError: local variable 'x' referenced before assignment
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo ocorrerá um erro, uma vez que a função &lt;strong&gt;h()&lt;/strong&gt; está tentando modificar o objeto &lt;strong&gt;x&lt;/strong&gt; antes mesmo dele ser definido.&lt;/p&gt;

&lt;h3&gt;
  
  
  A Função globals()
&lt;/h3&gt;

&lt;p&gt;Como o próprio nome indica, a função &lt;strong&gt;globals()&lt;/strong&gt; exibirá informações de escopo global.&lt;br&gt;
Por exemplo, se abrirmos um console Python e inserirmos &lt;strong&gt;globals()&lt;/strong&gt;, um dicionário incluindo todos os nomes e valores de variáveis no escopo global será retornado.&lt;/p&gt;

&lt;p&gt;Veja que estou usando &lt;code&gt;...&lt;/code&gt; para abreviar o resultado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;globals&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c1"&gt;# {'__name__': '__main__', ..., '__builtins__': &amp;lt;module 'builtins' (built-in)&amp;gt;}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se adicionarmos uma variável, ela agora será incluída no escopo global:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="nf"&gt;globals&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c1"&gt;# {'__name__': '__main__', ...,  '__builtins__': &amp;lt;module 'builtins' (built-in)&amp;gt;, 'x': 1}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  A Função locals()
&lt;/h3&gt;

&lt;p&gt;Como o próprio nome indica, a função &lt;strong&gt;locals()&lt;/strong&gt; retornará um dicionário incluindo todos os nomes e valores locais.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;anime&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Naruto&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;locals&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

&lt;span class="nf"&gt;anime&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;# {'nome': 'Naruto'}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se chamarmos a função &lt;strong&gt;locals()&lt;/strong&gt; no escopo global, o resultado será idêntico ao resultado da função &lt;strong&gt;globals()&lt;/strong&gt;, portanto esteja ciente disso quando usá-la:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;globals&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="nf"&gt;locals&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;# True
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  *args &amp;amp; **kwargs
&lt;/h2&gt;

&lt;p&gt;As variáveis mágicas &lt;code&gt;*args&lt;/code&gt; e &lt;code&gt;**kwargs&lt;/code&gt; são normalmente usadas em definições de funções, elas nos permitem passar um número variável de argumentos para uma função. Variável nesse caso significa que não sabemos de antemão quantos argumentos vamos receber, então nesse caso utilizamos &lt;code&gt;*args&lt;/code&gt; e &lt;code&gt;**kwargs&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  *args
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;*args&lt;/code&gt; é usado para enviar uma variável que &lt;strong&gt;não tenha&lt;/strong&gt; palavras-chave, veja um exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;soma&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt; 
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;soma&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;# 15
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;soma&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;# 32
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;soma&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;# 5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  **kwargs
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;**kwargs&lt;/code&gt; nos permite passarmos variáveis com &lt;strong&gt;palavras-chave&lt;/strong&gt; como argumento, veja exemplos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;pessoa&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; tem atualmente &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;idade&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; anos de idade&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;pessoa&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gabriel&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;33&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rafael&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;47&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;daniel&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;22&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# {'gabriel': '33', 'rafael': '47', 'daniel': '22'}
# gabriel tem atualmente 33 anos de idade
# rafael tem atualmente 47 anos de idade
# daniel tem atualmente 22 anos de idade
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Recursão
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;'Recursividade'&lt;/strong&gt; é um termo usado de maneira mais geral para descrever o processo de repetição de um objeto de um jeito similar ao que já fora mostrado. Um bom exemplo disso são as imagens repetidas que aparecem quando dois espelhos são apontados um para o outro. &lt;/p&gt;

&lt;p&gt;Outro grande exemplo seria O Triângulo de Sierpinski - também chamado de Junta de Sierpinski - é uma figura geométrica obtida através de um processo &lt;strong&gt;recursivo&lt;/strong&gt;. Ele é uma das formas elementares da geometria fractal por apresentar algumas propriedades, tais como: ter tantos pontos como o do conjunto dos números reais; ter área igual a zero; ser auto-semelhante (uma parte sua é idêntica ao todo); não perder a sua definição inicial à medida que é ampliado. Foi primeiramente descrito em 1915 por Waclaw Sierpinski (1882 - 1969), matemático polonês. &lt;/p&gt;

&lt;p&gt;Imagem do Triângulo de Sierpinski: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wNzDOxTq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://raw.githubusercontent.com/the-akira/Python-Iluminado/master/Imagens/Sierpinski.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wNzDOxTq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://raw.githubusercontent.com/the-akira/Python-Iluminado/master/Imagens/Sierpinski.png" title="Triângulo de Sierpinski" alt="img" width="600" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pensando de forma &lt;strong&gt;computacional&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Algoritmicamente falando, &lt;strong&gt;Recursão&lt;/strong&gt; é uma maneira de desenvolver soluções para problemas através de &lt;em&gt;divide-and-conquer&lt;/em&gt; ou &lt;em&gt;decrease-and-conquer&lt;/em&gt;, reduzindo o problema para versões simplificadas do mesmo problema&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Semanticamente: Uma técnica de programação onde a função &lt;strong&gt;chama a si mesmo&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Em Programação, o objetivo é não ter recursão infinita&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Deve-se ter &lt;strong&gt;1 ou mais casos bases&lt;/strong&gt; que são fáceis de resolver&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Deve-se resolver o mesmo problema em algum outro &lt;em&gt;input&lt;/em&gt; com o objetivo de simplificar o &lt;em&gt;input&lt;/em&gt; do problema maior&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Recursão em Python
&lt;/h2&gt;

&lt;p&gt;Nós sabemos que em &lt;strong&gt;Python&lt;/strong&gt; é possível uma &lt;strong&gt;função&lt;/strong&gt; chamar outras &lt;strong&gt;funções&lt;/strong&gt;, inclusive é possível que uma função chame ela mesma, esses tipos de constructos são chamados de &lt;strong&gt;funções recursivas&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A seguir temos o exemplo de uma função que descobre o fatorial de um inteiro. Fatorial de um número é produto de todos inteiros de 1 até esse número. Por exemplo, o fatorial de &lt;strong&gt;5&lt;/strong&gt; (denotado por &lt;code&gt;5!&lt;/code&gt;) é &lt;code&gt;1x2x3x4x5 = 120&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Exemplo de uma &lt;strong&gt;função recursiva&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fatorial&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
    Essa é uma função recursiva
    Ela calcula o fatorial de um número inteiro
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nf"&gt;fatorial&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;
&lt;span class="n"&gt;z&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;O fatorial de {0} é {1}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nf"&gt;fatorial&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt; &lt;span class="c1"&gt;# O fatorial de 4 é 24
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;O fatorial de {0} é {1}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nf"&gt;fatorial&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt; &lt;span class="c1"&gt;# O fatorial de 7 é 3628800
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No exemplo acima &lt;strong&gt;fatorial()&lt;/strong&gt; é considerada uma &lt;strong&gt;função recursiva&lt;/strong&gt;, pois chama a ela mesma. Quando nós chamamos essa função com um inteiro positivo, ela chamará recursivamente ela mesma diminuindo o número. Para entendermos melhor, veja o cálculo que ocorre:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;fatorial&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;              &lt;span class="c1"&gt;# Primeira chamada com 4
&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nf"&gt;fatorial&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;          &lt;span class="c1"&gt;# Segunda chamada com 3
&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nf"&gt;fatorial&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;      &lt;span class="c1"&gt;# Terceira chamada com 2
&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nf"&gt;fatorial&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Quarta chamada com 1
&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;            &lt;span class="c1"&gt;# Retorno da quarta chamada, uma vez que y = 1
&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;                &lt;span class="c1"&gt;# Retorno da terceira chamada
&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;                    &lt;span class="c1"&gt;# Retorno da segunda chamada
&lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;                       &lt;span class="c1"&gt;# Retorno da primeira chamada
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como podem ver, nossa recursão acaba quando o valor de &lt;strong&gt;y&lt;/strong&gt; reduz a &lt;strong&gt;1&lt;/strong&gt;, essa é considerada a &lt;strong&gt;condição base&lt;/strong&gt;. Toda recursão deve ter uma condição base que para a recursão ou a função ficará chamando-a eternamente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Recursão com Múltiplos Casos Base
&lt;/h2&gt;

&lt;p&gt;Como já vimos, um &lt;strong&gt;caso de base&lt;/strong&gt; é um cenário de encerramento que não usa recursão para produzir uma resposta, podemos ter um ou mais desses cenários em nossas funções.&lt;/p&gt;

&lt;p&gt;Na matemática, a Sucessão de Fibonacci (ou Sequência de Fibonacci), é uma sequência de números inteiros, começando normalmente por 0 e 1, na qual, cada termo subsequente corresponde à soma dos dois anteriores. A sequência recebeu o nome do matemático italiano Leonardo de Pisa.&lt;/p&gt;

&lt;p&gt;Fibonacci modelou o seguinte desafio:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pares de coelhos recém-nascidos (um macho e uma fêmea) são colocados em um curral&lt;/li&gt;
&lt;li&gt;Coelhos se acasalam na idade de um mês&lt;/li&gt;
&lt;li&gt;Coelhos tem um mês de período de gestação&lt;/li&gt;
&lt;li&gt;Assumindo que o coelho nunca morre, a fêmea sempre produz um novo par (um macho e uma fêmea) a cada mês a partir do segundo mês&lt;/li&gt;
&lt;li&gt;Quantos coelhos fêmeas estão lá no final do ano?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Fibonacci em Python
&lt;/h3&gt;

&lt;p&gt;Vamos então definir o problema, para que seja mais fácil solucioná-lo:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Depois de um mês (chamamos ele de &lt;strong&gt;0&lt;/strong&gt;) = 1 fêmea&lt;/li&gt;
&lt;li&gt;Depois do segundo mês, ainda 1 fêmea (agora grávida)&lt;/li&gt;
&lt;li&gt;Depois do terceiro, 2 fêmeas, 1 grávida, 1 não-grávida&lt;/li&gt;
&lt;li&gt;Em geral, temos então &lt;code&gt;fêmeas(n) = fêmeas(n-1) + fêmeas(n-2)&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;Cada fêmea viva no mês &lt;code&gt;n-2&lt;/code&gt; irá produzir uma fêmea no mês &lt;code&gt;n&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Estes podem ser adicionados aqueles vivos no mês &lt;code&gt;n-1&lt;/code&gt; para obter total vivos no mês &lt;code&gt;n&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Temos então os seguintes casos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Casos Base:

&lt;ul&gt;
&lt;li&gt;Femeas(0) = 1&lt;/li&gt;
&lt;li&gt;Femeas(1) = 1&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Caso Recursivo

&lt;ul&gt;
&lt;li&gt;Femeas(n) = Femeas(n-1) + Femeas(n-2)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Convertendo para a linguagem Python:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fib&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
    Assume x como inteiro &amp;gt;= 0
    Retorna o Fibonacci de x
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;fib&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nf"&gt;fib&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;fib&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;# 34
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;fib&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;# 89
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Vantagens e Desvantagens
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Vantagens&lt;/strong&gt; da Recursão:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Funções recursivas tornam o código limpo e elegante&lt;/li&gt;
&lt;li&gt;Uma tarefa complexa pode ser quebrada em sub-problemas usando a recursão&lt;/li&gt;
&lt;li&gt;Gerar sequências é mais fácil com recursão&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Desvantagens&lt;/strong&gt; da Recursão:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;As vezes a lógica por trás dela pode ser complexa de entender&lt;/li&gt;
&lt;li&gt;Chamadas recursivas são custosas e ineficientes e podem nos custar muita memória e tempo!&lt;/li&gt;
&lt;li&gt;Funções recursivas são mais difíceis de debugar (processo de encontrar e reduzir defeitos de um programa).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Por fim, entendemos que as funções são um tema essencial e fundamental para a programação, elas são capazes de facilitar muito a vida dos programadores através da &lt;strong&gt;abstração&lt;/strong&gt;, tornando os códigos muito mais elegantes, modulares e fáceis de entender. O código ainda pode ser utilizados muitas vezes e precisa ser &lt;strong&gt;debuggado/testado&lt;/strong&gt; apenas uma vez.&lt;/p&gt;

&lt;p&gt;Cheque a &lt;strong&gt;&lt;a href="https://docs.python.org/3/library/functions.html" rel="noopener noreferrer"&gt;documentação&lt;/a&gt;&lt;/strong&gt; oficial do Python para conhecer todas as funções construídas no &lt;strong&gt;interpretador&lt;/strong&gt; Python.&lt;/p&gt;

</description>
      <category>python</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Strings em Python: Introdução</title>
      <dc:creator>Gabriel Felippe</dc:creator>
      <pubDate>Sun, 17 Nov 2019 22:34:55 +0000</pubDate>
      <link>https://dev.to/theakira/strings-em-python-introducao-2l4o</link>
      <guid>https://dev.to/theakira/strings-em-python-introducao-2l4o</guid>
      <description>&lt;h3&gt;
  
  
  Introdução
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Definição&lt;/strong&gt;: Uma &lt;strong&gt;&lt;a href="https://en.wikipedia.org/wiki/String_(computer_science)" rel="noopener noreferrer"&gt;String&lt;/a&gt;&lt;/strong&gt; é tradicionalmente um tipo de dados que representa uma sequência de caracteres.&lt;/p&gt;

&lt;p&gt;Um caracter é simplesmente um símbolo. Por exemplo, o idioma inglês possui 26 caracteres.&lt;/p&gt;

&lt;p&gt;Caracteres podem ser &lt;strong&gt;letras&lt;/strong&gt;, &lt;strong&gt;dígitos&lt;/strong&gt;, &lt;strong&gt;símbolos&lt;/strong&gt; ($, !, #, @), etc.&lt;/p&gt;

&lt;p&gt;Os computadores originalmente não lidam com caracteres, eles lidam fundamentalmente com números (binários). Mesmo que vejamos caracteres em nossa tela, internamente eles são armazenados e manipulados como uma combinação de &lt;strong&gt;0&lt;/strong&gt;'s e &lt;strong&gt;1&lt;/strong&gt;'s.&lt;/p&gt;

&lt;p&gt;A conversão de caracteres em números é chamada de codificação e o processo reverso é a decodificação. &lt;a href="https://en.wikipedia.org/wiki/ASCII" rel="noopener noreferrer"&gt;ASCII&lt;/a&gt; e &lt;a href="https://en.wikipedia.org/wiki/Unicode" rel="noopener noreferrer"&gt;Unicode&lt;/a&gt; são algumas das codificações populares usadas. Em Python, uma string é uma sequência de caracteres Unicode. O Unicode foi introduzido para incluir todos os caracteres em todos os idiomas e trazer uniformidade na codificação.&lt;/p&gt;

&lt;p&gt;A figura a seguir nos mostra a Tabela ASCII:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F63ymnp0ssr8j34mteowx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F63ymnp0ssr8j34mteowx.png" alt="img" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Com a função &lt;strong&gt;ord()&lt;/strong&gt; podemos obter o valor ASCII para um determinado caracter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;ord&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;A&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# 65
&lt;/span&gt;&lt;span class="nf"&gt;ord&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;X&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# 88
&lt;/span&gt;&lt;span class="nf"&gt;ord&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# 60
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Contanto que permaneçamos no domínio dos caracteres comuns, haverá pouca diferença prática entre ASCII e Unicode. Mas a função &lt;strong&gt;ord()&lt;/strong&gt; retornará valores numéricos para caracteres Unicode também:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;ord&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;∑&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# 8721
&lt;/span&gt;&lt;span class="nf"&gt;ord&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;火&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# 28779
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Já o método &lt;strong&gt;chr()&lt;/strong&gt; faz o inverso de &lt;strong&gt;ord()&lt;/strong&gt;. Fornecido um valor numérico, ele retorna uma string representando este valor.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;chr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;65&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# 'A'
&lt;/span&gt;&lt;span class="nf"&gt;chr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;88&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# 'X'
&lt;/span&gt;&lt;span class="nf"&gt;chr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# '&amp;lt;'
&lt;/span&gt;&lt;span class="nf"&gt;chr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;28779&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# '火'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Existem diversos problemas no mundo real que envolvem as &lt;strong&gt;strings&lt;/strong&gt;, podemos citar por exemplo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Criptografia e Descriptografia&lt;/li&gt;
&lt;li&gt;Análises de DNA&lt;/li&gt;
&lt;li&gt;Tradução de linguagens&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Fundamentos
&lt;/h3&gt;

&lt;p&gt;Além dos números, &lt;strong&gt;Python&lt;/strong&gt; é capaz de manipular &lt;strong&gt;strings&lt;/strong&gt; com maestria, as strings podem ser expressas de diversas maneiras, podemos encapsular elas com aspas simples &lt;strong&gt;('...')&lt;/strong&gt; ou também aspas duplas &lt;strong&gt;("...")&lt;/strong&gt; ou até mesmo &lt;strong&gt;("""...""")&lt;/strong&gt; para múltiplas linhas. Por exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;String é um elemento importante da programação&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Também podemos representá-las com aspas duplas&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Podemos, até mesmo, representá-las com três aspas duplas, para textos grandes&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como podemos ver, &lt;strong&gt;strings&lt;/strong&gt; podem ser impressas utilizando a função &lt;strong&gt;print()&lt;/strong&gt;&lt;br&gt;
Caso você queira usar palavras entre aspas na sua &lt;strong&gt;string&lt;/strong&gt;, você deve usar \ &lt;strong&gt;(contrabarra)&lt;/strong&gt; para dar &lt;em&gt;escape&lt;/em&gt; nas aspas, caso contrário ocorrerá um erro:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Podemos usar aspas dentro das &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s"&gt;strings&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Podemos usar aspas dentro das &lt;/span&gt;&lt;span class="se"&gt;\'&lt;/span&gt;&lt;span class="s"&gt;strings&lt;/span&gt;&lt;span class="se"&gt;\'&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ou até mesmo você pode &lt;strong&gt;inverter&lt;/strong&gt; o uso das aspas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Dessa forma não há &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;problema&lt;/span&gt;&lt;span class="sh"&gt;'"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Dessa forma não há &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;problema&lt;/span&gt;&lt;span class="sh"&gt;"'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Índices de Strings
&lt;/h3&gt;

&lt;p&gt;Assim como em diversas linguagens de programação, &lt;strong&gt;strings&lt;/strong&gt; em &lt;strong&gt;Python&lt;/strong&gt; são consideradas &lt;strong&gt;arrays de bytes&lt;/strong&gt; que representam caractéres unicode, entretanto &lt;strong&gt;Python&lt;/strong&gt; não tem um tipo de dados caracter. Caracteres únicos são simplesmente &lt;strong&gt;strings&lt;/strong&gt; de tamanho 1. Para acessarmos elementos individuais das &lt;strong&gt;strings&lt;/strong&gt;, utilizamos colchetes &lt;strong&gt;[]&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa142rzez772vlznanh9m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa142rzez772vlznanh9m.png" alt="img" width="800" height="449"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Rafael&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="c1"&gt;# Imprime a primeira letra do nome
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="c1"&gt;# Imprime a primeira letra do nome
&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="c1"&gt;# Imprime a última letra do nome
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="c1"&gt;# Imprime a última letra do nome
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Observe que foi utilizado a notação &lt;code&gt;s[0]&lt;/code&gt;, isso porque o primeiro caracter começa na posição &lt;code&gt;0&lt;/code&gt;, lembre que isso é muito comum nas linguagens de programação e estruturas de dados. Cada caracter na &lt;strong&gt;string&lt;/strong&gt; é associado com um &lt;strong&gt;índice&lt;/strong&gt; numérico, que é um inteiro representando a localização do caracter em uma determinada &lt;strong&gt;string&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Além disso, podemos formar &lt;strong&gt;substrings&lt;/strong&gt; a partir de uma &lt;strong&gt;string&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;John Von Neumann&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, selecionamos o caracter da posição 5 até 11 (não incluindo 12):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="c1"&gt;# Von Neu
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Podemos também reverter a string usando a seguinte notação:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;[::&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="c1"&gt;# nnamueN noV nhoJ
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Métodos em Strings
&lt;/h3&gt;

&lt;p&gt;Um detalhe importante dentro do universo das &lt;strong&gt;strings&lt;/strong&gt; é que podemos utilizar &lt;strong&gt;&lt;a href="https://www.w3schools.com/python/python_ref_string.asp" rel="noopener noreferrer"&gt;métodos&lt;/a&gt;&lt;/strong&gt; (funções especiais) para manipulalá-las.&lt;/p&gt;

&lt;p&gt;Para compreendermos melhor estes métodos, vamos definir uma string para podermos testá-los:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt; Meu nome é Dennis Ritchie &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O método &lt;strong&gt;strip()&lt;/strong&gt; remove todos os espaços extras no começo e no fim da string:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="c1"&gt;# Meu nome é Dennis Ritchie
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O método &lt;strong&gt;len()&lt;/strong&gt; retorna o tamanho (comprimento) da string:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;# 27
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O método &lt;strong&gt;lower()&lt;/strong&gt; retorna a string em lower case (todos os caracteres se tornam minúsculos):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="c1"&gt;# meu nome é dennis ritchie
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O método &lt;strong&gt;upper()&lt;/strong&gt; retorna a string em upper case (todos os caracteres se tornam maiúsculos):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="c1"&gt;# MEU NOME É DENNIS RITCHIE
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O método &lt;strong&gt;swapcase()&lt;/strong&gt; retorna a string com caracteres uppercase convertidos para lowercase e vice-versa:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;swapcase&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="c1"&gt;# mEU NOME É dENNIS rITCHIE 
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O método &lt;strong&gt;title()&lt;/strong&gt; retorna a string ao qual a primeira letra de cada palavra é convertida para uppercase e as demais letras pernanecem lowercase:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;title&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="c1"&gt;# Meu Nome É Dennis Ritchie
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O método &lt;strong&gt;replace()&lt;/strong&gt; substitui a string que desejarmos por outra string especifica por nós via argumento:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Primeiro informamos a string a ser substituída&lt;/li&gt;
&lt;li&gt;Segundo informados a nova string
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Dennis&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Ken&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;# Meu nome é Ken Ritchie
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O método &lt;strong&gt;split()&lt;/strong&gt; separa a string em substrings caso haja um separador, nesse caso utilizamos o espaço (" ") e ele nos retorna uma lista de strings:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;# ['', 'Meu', 'nome', 'é', 'Dennis', 'Ritchie', '']
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O método &lt;strong&gt;join()&lt;/strong&gt; retorna a string que resulta da concatenação dos objetos em um iterável separados por delimitador.&lt;/p&gt;

&lt;p&gt;No exemplo a seguir, o delimitador é a string &lt;code&gt;','&lt;/code&gt; e o iterável é uma lista de filósofos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;filosofos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Kant&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Kierkegaard&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Nietzsche&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Leibniz&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;, &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filosofos&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;# Kant, Kierkegaard, Nietzsche, Leibniz
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; - &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filosofos&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;# Kant - Kierkegaard - Nietzsche - Leibniz
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O resultado é uma única string que consiste nos objetos da lista separados por um delimitador especificado por nós.&lt;/p&gt;

&lt;p&gt;No próximo exemplo, iterável é especificado como um único valor de string. Quando um valor de string é usado como um iterável, ele é interpretado como uma lista dos caracteres individuais da string:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;aeiou&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# ['a', 'e', 'i', 'o', 'u']
&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;|&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;aeiou&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# 'a|e|i|o|u'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O método &lt;strong&gt;count()&lt;/strong&gt; retorna o número de ocorrências não sobrepostas de substring informada por nós:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Ra Ra Ja Ra Ta&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Ra&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;# 3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O método &lt;strong&gt;startwith()&lt;/strong&gt; retorna &lt;code&gt;True&lt;/code&gt; se uma determinada string começa com um prefixo especificado, caso contrário, retorna &lt;code&gt;False&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;existencialismo&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;exist&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;# True
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;existencialismo&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ismo&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;# False
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O método &lt;strong&gt;endswith()&lt;/strong&gt; retorna &lt;code&gt;True&lt;/code&gt; se uma determinada string termina com um sufixo especificado, caso contrário, retorna &lt;code&gt;False&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;existencialismo&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;endswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ismo&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;# True
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;existencialismo&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;endswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;exist&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;# False
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O método &lt;strong&gt;find()&lt;/strong&gt; pode ser usado para vermos se uma string contém uma substring informada e retorna o menor índice na string onde esta substring é encontrada:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Amar, é encontrar a própria felicidade na felicidade alheia&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Amar&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;# 0
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Amar, é encontrar a própria felicidade na felicidade alheia&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;é&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;# 6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Os métodos de classificação de caracteres são capazes de classificar uma string baseado nos caracteres contidos nela. Vejamos alguns exemplos.&lt;/p&gt;

&lt;p&gt;O método &lt;strong&gt;isalnum()&lt;/strong&gt; retorna &lt;code&gt;True&lt;/code&gt; se a string for não-vazia e todos os seus caracteres forem alfanuméricos (ou uma letra ou um número), e caso contrário, retorna &lt;code&gt;False&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;xyz678&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isalnum&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="c1"&gt;# True
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;xyz#678&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isalnum&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="c1"&gt;# False
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isalnum&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="c1"&gt;# False
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O método &lt;strong&gt;isalpha()&lt;/strong&gt; retorna &lt;code&gt;True&lt;/code&gt; se a string for não-vazia e todos os seus caracteres forem alfabéticos, caso contrário, retorna &lt;code&gt;False&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;exemplo&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isalpha&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="c1"&gt;# True
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;exemplo 2&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isalpha&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="c1"&gt;# False
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para checarmos se uma string contém apenas dígitos, podemos utilizar o método &lt;strong&gt;isdigit()&lt;/strong&gt;, ele vai retornar &lt;code&gt;True&lt;/code&gt; se a string for não-vazia e todos os caracteres forem numéricos, e caso contrário, retornará &lt;code&gt;False&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;33&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isdigit&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="c1"&gt;# True
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;a33z&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isdigit&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="c1"&gt;# False
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;''&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isdigit&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="c1"&gt;# False
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O método &lt;strong&gt;isidentifier()&lt;/strong&gt; nos retorna &lt;code&gt;True&lt;/code&gt; se uma determina string é um identificador válido de acordo com a definição da linguagem Python, caso contrário, retorna &lt;code&gt;False&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;nome&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isidentifier&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="c1"&gt;# True
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;nome2&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isidentifier&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="c1"&gt;# True
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;2nome&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isidentifier&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="c1"&gt;# False
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;nome#&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isidentifier&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="c1"&gt;# False
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dessa forma podemos saber como definir uma variável corretamente.&lt;/p&gt;

&lt;p&gt;Já o método &lt;strong&gt;iskeyword()&lt;/strong&gt; é capaz de testar se uma determinada string corresponde à uma palavra-chave Python, este método é contido no módulo &lt;strong&gt;keyword&lt;/strong&gt;, sendo então necessário importá-lo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;keyword&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;iskeyword&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;iskeyword&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;or&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;# True
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;iskeyword&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;else&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;# True
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;iskeyword&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;while&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;# True
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;iskeyword&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;switch&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;# False
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O método &lt;strong&gt;isprintable()&lt;/strong&gt; determina se uma string consiste inteiramente de caracteres imprimíveis. Ele retorna &lt;code&gt;True&lt;/code&gt; se a string for vazia ou se todos os caracteres alfabéticos que ela conter forem imprimíveis, retorna &lt;code&gt;False&lt;/code&gt; se ela conter pelo menos um caracter não-imprimível. Caracteres não-alfabéticos são ignorados.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Gabriel&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="s"&gt;Felippe&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isprintable&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="c1"&gt;# False
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Gabriel Felippe&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isprintable&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="c1"&gt;# True
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;''&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isprintable&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="c1"&gt;# True
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;x&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;y&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isprintable&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="c1"&gt;# False
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O método &lt;strong&gt;isspace()&lt;/strong&gt; determina se uma string consiste de caracteres de &lt;strong&gt;espaço em branco&lt;/strong&gt;, retornará &lt;code&gt;True&lt;/code&gt; se a string for não-vazia e todos os caracteres forem de espaço em branco, caso contrário, retornará &lt;code&gt;False&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;''&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isspace&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="c1"&gt;# False
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;x&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isspace&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="c1"&gt;# False
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isspace&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="c1"&gt;# True
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\t\n&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isspace&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="c1"&gt;# True
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O método &lt;strong&gt;isupper()&lt;/strong&gt; é capaz de verificar se todos os caracteres de uma string são uppercase:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;STRING&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isupper&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="c1"&gt;# True
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;String&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isupper&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="c1"&gt;# False
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Já o método &lt;strong&gt;islower()&lt;/strong&gt; é capaz de identificar se todos os caracteres de uma string são lowercase:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;String&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;islower&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="c1"&gt;# False
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;string&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;islower&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="c1"&gt;# True
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Formatando Strings
&lt;/h3&gt;

&lt;p&gt;Vejamos agora como podemos usar métodos que modificam ou aprimoram o formato de uma string.&lt;/p&gt;

&lt;p&gt;O método &lt;strong&gt;center()&lt;/strong&gt; retorna uma string centralizada em um determinado comprimento especificado por nós via argumento, por padrão, o preenchimento consiste no caractere de &lt;strong&gt;espaço&lt;/strong&gt; ASCII, por exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;python&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;center&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# '       python       '
&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;python&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;center&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;.&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# '..........python.........'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O método &lt;strong&gt;expandtabs()&lt;/strong&gt; substitui cada caracter &lt;strong&gt;tab&lt;/strong&gt; (&lt;code&gt;\t&lt;/code&gt;) com espaços.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;x&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="s"&gt;y&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expandtabs&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;# 'x       y'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O método &lt;strong&gt;ljust()&lt;/strong&gt; retorna uma string justificada à esquerda em um campo de comprimento especifica por nós via argumento, por padrão, o preenchimento consiste no caractere de &lt;strong&gt;espaço&lt;/strong&gt; ASCII, por exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;C++&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ljust&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# 'C++       '
&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;C++&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ljust&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;-&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# 'C++-------'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O método &lt;strong&gt;rjust()&lt;/strong&gt; retorna uma string justificada à direita em um campo de comprimento especifica por nós via argumento, por padrão, o preenchimento consiste no caractere de &lt;strong&gt;espaço&lt;/strong&gt; ASCII, por exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Javascript&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rjust&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# '          Javascript'
&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Javascript&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rjust&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;-&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# '----------Javascript'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O método &lt;strong&gt;zfill()&lt;/strong&gt; retorna uma cópia da string com preenchimento à esquerda com caracteres &lt;code&gt;'0'&lt;/code&gt;, o comprimento é especificado por nós, por exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;66&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;zfill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# '0066'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Embora seja mais interessante para números, &lt;strong&gt;zfill()&lt;/strong&gt; também funciona com caracteres:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;letra&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;zfill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# '00letra'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O método &lt;strong&gt;format()&lt;/strong&gt; nos permite construir &lt;strong&gt;strings&lt;/strong&gt; de uma maneira flexível:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Rafael&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;profissao&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Programador&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;A profissão de {0} é {1}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;profissao&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="c1"&gt;# A profissao de Rafael é Programador
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Criando um elemento &lt;a href="https://www.w3schools.com/html/html_intro.asp" rel="noopener noreferrer"&gt;HTML&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;tag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;p&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
&lt;span class="n"&gt;texto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Este é um parágrafo&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;

&lt;span class="n"&gt;sentenca&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;{0}&amp;gt;{1}&amp;lt;/{0}&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;texto&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sentenca&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# &amp;lt;p&amp;gt;Este é um parágrafo&amp;lt;/p&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Calculando um valor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;valor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;1 GB é igual a {:,} bytes&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# 1 GB é igual a 1,000,000,000 bytes
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Existe também a possibilidade de usarmos Códigos de Formatação.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Inteiro&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{:d}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;# 4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Binário&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{:b}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;55&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;# 110111
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Hexadecimal&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{:x}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;# f
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Lista&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{:}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt; &lt;span class="c1"&gt;# [20, 30]
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Também podemos representar as &lt;strong&gt;strings&lt;/strong&gt; de maneira similar ao estilo da linguagem &lt;strong&gt;C&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;String&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Alan&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;amigo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Jones&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;%s é amigo de %s&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;amigo&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="c1"&gt;# Alan é amigo de Jones
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Inteiro&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;%d&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4545&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;# 4545
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Float&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;%3.5f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;3.123456789&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;# 3.12346
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;%2.4f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;3.123456789&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;# 3.1235
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  F-Strings
&lt;/h3&gt;

&lt;p&gt;F-strings são um novo tipo de &lt;em&gt;string literals&lt;/em&gt; introduzido na versão &lt;strong&gt;&lt;a href="https://docs.python.org/3/whatsnew/3.6.html" rel="noopener noreferrer"&gt;3.6&lt;/a&gt;&lt;/strong&gt; do Python. A &lt;strong&gt;string&lt;/strong&gt; formatada é prefixada com a letra &lt;code&gt;f&lt;/code&gt; e é similar à formatação de strings aceita por &lt;code&gt;format()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Vejamos exemplos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;first_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Alan&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;last_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Turing&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;sentenca&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Meu nome e &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;first_name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;last_name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sentenca&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# Meu nome e ALAN turing
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Observe que podemos também executar métodos com F-strings.&lt;/p&gt;

&lt;p&gt;Além disso, podemos também utilizar &lt;strong&gt;dicionários&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;pessoa&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;nome&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Muhammad&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;idade&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;sentenca&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Meu nome é &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;pessoa&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;nome&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; e eu tenho &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;pessoa&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;idade&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; anos de idade&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sentenca&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# Meu nome é Muhammad e eu tenho 22 anos de idade
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ou até mesmo realizar operações matemáticas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;calculo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;4 vezes 11 é igual a &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;calculo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# 4 vezes 11 é igual a 44
&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;sentenca&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;O Valor é &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;02&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sentenca&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para formatarmos datas precisaremos importar a biblioteca &lt;strong&gt;datetime&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;

&lt;span class="n"&gt;nascimento&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1991&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;sentenca&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;O Nascimento é no dia &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;nascimento&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;B&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;Y&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sentenca&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# O Nascimento é no dia June 06, 1991
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Convertendo para o Formato String
&lt;/h3&gt;

&lt;p&gt;Para fazermos a conversão para uma string podemos utilizar os métodos &lt;code&gt;repr()&lt;/code&gt; e &lt;code&gt;str()&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;3.14&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;repr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt; &lt;span class="c1"&gt;# &amp;lt;class 'str'&amp;gt;
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt; &lt;span class="c1"&gt;# &amp;lt;class 'str'&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Escape Caracteres
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Strings&lt;/strong&gt; também são capazes de aceitar &lt;strong&gt;Escape caracteres&lt;/strong&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Carácter&lt;/th&gt;
&lt;th&gt;Descrição&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;\n&lt;/td&gt;
&lt;td&gt;nova linha&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\r&lt;/td&gt;
&lt;td&gt;carriage return&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\s&lt;/td&gt;
&lt;td&gt;espaço&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\t&lt;/td&gt;
&lt;td&gt;tab&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\v&lt;/td&gt;
&lt;td&gt;tab vertical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\e&lt;/td&gt;
&lt;td&gt;escape&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\b&lt;/td&gt;
&lt;td&gt;backspace&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Vejamos um exemplos dos escape caracteres:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Meu nome é&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;Gabriel&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="s"&gt;Olá meu amigo&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Operadores
&lt;/h3&gt;

&lt;p&gt;Operadores Especiais:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Operador&lt;/th&gt;
&lt;th&gt;Descrição&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;td&gt;concatenação, adiciona os valores&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;*&lt;/td&gt;
&lt;td&gt;repetição, concatena múltiplas cópias da mesma string&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;in&lt;/td&gt;
&lt;td&gt;para verificarmos se determinado caracter existe na string&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;not in&lt;/td&gt;
&lt;td&gt;para verificarmos se determinado caracter não existe na string&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Veja um exemplo dos operadores especiais:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Carl&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;sobrenome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Sagan&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;sobrenome&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# Concatena o nome e sobrenome
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;              &lt;span class="c1"&gt;# Multiplica o nome por 10
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;C&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;          &lt;span class="c1"&gt;# Verifica se C está presente em nome e retorna True
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;C&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;      &lt;span class="c1"&gt;# Verifica se C não está presente em nome e retorna False
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;É importante lembrarmos que &lt;strong&gt;strings&lt;/strong&gt; são imutáveis, uma vez criada, não pode ser modificada. Para alterar uma &lt;strong&gt;string&lt;/strong&gt; você deve primeiro construir uma nova string através da concatenação ou chamada de uma função e então re-atribuir à variável &lt;strong&gt;string&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;O conteúdo de &lt;strong&gt;strings&lt;/strong&gt; é bastante extenso e continuaremos vendo elas ao longo do guia, considere dar bastante importância a elas!&lt;/p&gt;

</description>
      <category>python</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
