<?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: Gustavo Soares</title>
    <description>The latest articles on DEV Community by Gustavo Soares (@iugstav).</description>
    <link>https://dev.to/iugstav</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%2F932752%2Ff627f467-9593-4927-ac73-46d88c50b56d.jpeg</url>
      <title>DEV Community: Gustavo Soares</title>
      <link>https://dev.to/iugstav</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/iugstav"/>
    <language>en</language>
    <item>
      <title>Python: Manipulação de Listas e Matrizes</title>
      <dc:creator>Gustavo Soares</dc:creator>
      <pubDate>Fri, 12 May 2023 21:19:11 +0000</pubDate>
      <link>https://dev.to/iugstav/python-manipulacao-de-listas-e-matrizes-4bpj</link>
      <guid>https://dev.to/iugstav/python-manipulacao-de-listas-e-matrizes-4bpj</guid>
      <description>&lt;h2&gt;
  
  
  Listas
&lt;/h2&gt;

&lt;p&gt;Python possui uma estrutura de dados correspondente ao array em linguagens C-like: a lista.&lt;/p&gt;

&lt;p&gt;As listas e matrizes são estruturas de dados que permitem armazenar um conjunto de valores em uma única variável. Essas estruturas são essenciais em Python e em outras linguagens de programação, pois permitem o armazenamento e manipulação de dados de forma eficiente e organizada.&lt;/p&gt;

&lt;p&gt;As listas são usadas para armazenar uma sequência de elementos, permitindo que sejam acessados, adicionados ou removidos conforme necessário. Já as matrizes são uma extensão das listas, permitindo que sejam armazenados valores em uma tabela de duas ou mais dimensões. Uma matriz numa linguagem de programação se assemelha consideravelmente ao conceito de matriz na matemática, mas não com sob a mesma ótica.&lt;/p&gt;

&lt;p&gt;Uma lista em Python é definida entre colchetes &lt;code&gt;[ ]&lt;/code&gt;, e pode conter qualquer tipo de dado, incluindo strings, números, outros objetos e até outras listas. 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="n"&gt;minha_lista&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="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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;quatro&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;cinco&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;No entanto, utilizar listas de mais de um tipo não é considerado uma boa prática, principalmente quando se fala de linearidade de memória. Sabendo que uma lista é uma sequência contínua em memória, temos uma lista de 5 inteiros onde cada inteiro ocupa 4 bytes, logo, 

&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;5∗4=205*4=20 &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;5&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;∗&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;4&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;20&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
. Se uma mesma lista possuir elementos de diferentes tipos, isso dificulta o armazenamento e diminui a eficiência da mesma. Se isso não for o suficiente para que você aceite essa boa prática, ao usar listas de diferentes tipos, você pode enfrentar diferentes erros de tipagem, visto que não há como mapear todos os erros de tipo presentes em listas heterogêneas.&lt;/p&gt;

&lt;p&gt;Para acessar elementos específicos da lista, utilizamos a indexação, que começa em 0. Por exemplo, para acessar o primeiro elemento da lista acima, usamos:&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;minha_lista&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;## Output:
&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Métodos de listas
&lt;/h3&gt;

&lt;p&gt;Métodos são funções ligadas a tipos, objetos ou pacotes. No caso das listas, são funções que fazem uso das informações internas das mesmas para executar suas sub-rotinas. Os métodos das listas são majoritariamente usados para a sua manipulação, ou seja, alteração de elementos, mapeamento e afins. Dentre os métodos, temos:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;list.append(value)&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;O método &lt;code&gt;append&lt;/code&gt; adiciona o valor do parâmetro &lt;code&gt;value&lt;/code&gt; no final da lista que invocou o método.&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;intro&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;mansão&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;thug&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;intro&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;stronda&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="n"&gt;intro&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$&amp;gt; python3 &amp;lt;nome_do_arquivo&amp;gt;.py
['mansão', 'thug', 'stronda']
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;list.remove(value)&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;O método &lt;code&gt;remove&lt;/code&gt; remove (não me diga) a primeira ocorrência do elemento &lt;code&gt;value&lt;/code&gt; na lista que o invocou. Por “primeira ocorrência”, digo a primeira vez em que o elemento aparece, já que os valores dos elementos podem aparecer repetidamente numa mesma lista.&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;dezenas&lt;/span&gt; &lt;span class="o"&gt;=&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="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="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;40&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="n"&gt;dezenas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;remove&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="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dezenas&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$&amp;gt; python3 &amp;lt;nome_do_arquivo&amp;gt;.py
[20, 30, 50, 40, 10]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;list.count(elem)&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;O métoro &lt;code&gt;count&lt;/code&gt; conta (não me diga???) quantas vezes o elemento &lt;code&gt;elem&lt;/code&gt; apareceu na lista que o invocou. Veja o 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="n"&gt;repetidos&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="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;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="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="mi"&gt;3&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;1&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;repetidos&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="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$&amp;gt; python3 &amp;lt;nome_do_arquivo&amp;gt;.py
4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;list.sort(reverse=False, key=None)&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Onde:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;reverse: bool&lt;/code&gt; diz se a ordenação da lista deve ser crescente ou decrescente. Esse parâmetro recebe por padrão o valor &lt;code&gt;False&lt;/code&gt;, portanto, é opcional;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;key: callable&lt;/code&gt; é a função que especifica o critério de ordenação.  Esse parâmetro recebe por padrão o valor &lt;code&gt;None&lt;/code&gt;, portanto, é opcional;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O método &lt;code&gt;sort&lt;/code&gt; ordena a lista que o invocou de acordo com os parâmetros especificados acima. Se nenhum valor for passado aos parâmetros, então a lista sofre uma ordenação crescente sem nenhum critério extra, apenas se baseando no tipo dos elementos da lista.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Observação&lt;/strong&gt;: os parâmetros da função &lt;strong&gt;DEVEM&lt;/strong&gt; ser passados de forma nomeada.&lt;/p&gt;

&lt;p&gt;Veja o exemplo abaixo.&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;sequencia_numerica&lt;/span&gt; &lt;span class="o"&gt;=&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;6&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;3&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="mi"&gt;7&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="n"&gt;sequencia_numerica&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&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;sequencia_numerica&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;sequencia_numerica&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reverse&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&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;sequencia_numerica&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;nomes&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;gustavo&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;joão&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;gabriela&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;maria&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;ana&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;nomes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;len&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;nomes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$&amp;gt; python3 &amp;lt;nome_do_arquivo&amp;gt;.py
[1, 2, 3, 4, 6, 7, 8]
[8, 7, 6, 4, 3, 2, 1]
['ana', 'joão', 'maria', 'gustavo', 'gabriela']
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No trecho de código acima, temos duas listas: &lt;code&gt;sequencia_numerica&lt;/code&gt;, de inteiros, e &lt;code&gt;nomes&lt;/code&gt;, de strings. De imediato, percebemos 3 chamadas diferentes ao método &lt;code&gt;sort&lt;/code&gt;, onde a primeira é uma ordenação simples e crescente, a segunda é uma ordenação decrescente e a terceira, uma crescente com critérios. O parâmetro key pode receber qualquer função que seja válida para o contexto da sua lista. Por exemplo, não podemos passar a função &lt;code&gt;len&lt;/code&gt;, que mede o tamanho de uma sequẽncia, como valor de &lt;code&gt;key&lt;/code&gt; para uma lista de inteiros, pois não há elementos nessa lista que se adequem ao requisito de &lt;code&gt;len&lt;/code&gt;. Logo, o que essa função faz nesse contexto é ordenar as strings de forma crescente pelo seu tamanho.  &lt;/p&gt;

&lt;h3&gt;
  
  
  Slices
&lt;/h3&gt;

&lt;p&gt;Slices em Python são uma forma de selecionar partes específicas de uma lista, matriz ou sequência. Essa funcionalidade é extremamente útil para a manipulação de dados, permitindo que sejam selecionados elementos específicos da estrutura de dados de forma rápida e eficiente. No entanto, apesar de sua utilidade, o uso de slices pode ser um pouco confuso para programadores de primeira viagem.&lt;/p&gt;

&lt;p&gt;Slices são denotados pelo uso de colchetes &lt;code&gt;[]&lt;/code&gt; e dois pontos &lt;code&gt;:&lt;/code&gt; para especificar a faixa de elementos que você deseja selecionar. Como se fossemos selecionar um elemento da lista pelo seu índice, mas são usados dois pontos.&lt;/p&gt;

&lt;p&gt;A sintaxe geral é a seguinte: &lt;code&gt;objeto[inicio:fim:passo]&lt;/code&gt;, onde &lt;code&gt;inicio&lt;/code&gt; é o índice inicial da seleção, &lt;code&gt;fim&lt;/code&gt; é o índice final (exclusivo) da seleção e &lt;code&gt;passo&lt;/code&gt; é a quantidade de elementos a serem pulados. Veja o exemplo abaixo:&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;sequencia_numerica&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;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="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;5&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;7&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="mi"&gt;9&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="n"&gt;primeiros_cinco&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sequencia_numerica&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="n"&gt;pares&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sequencia_numerica&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;sequencia_numerica&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;sequencia_numerica&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;primeiros_cinco&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;pares&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No código acima, vemos a variável &lt;code&gt;sequencia_numerica&lt;/code&gt;, que recebe uma lista de inteiros de 0 a 10, e abaixo mais duas variáveis, também listas, derivadas da primeira que utilizam o &lt;strong&gt;slicing&lt;/strong&gt; para gerar novas listas a partir de uma original. Seguindo a sintaxe descrita, temos a lista &lt;code&gt;primeiros_cinco&lt;/code&gt;, que recebe uma slice de &lt;code&gt;sequencia_numerica&lt;/code&gt; que vai da posição inicial 0 (omitida) até a posição final 5 (explícita) com o passo de 1 (também omitido e não pula nenhum índice). Já variável &lt;code&gt;pares&lt;/code&gt; recebe uma slice na qual tanto o inicio quanto o fim estão omitidos, ou seja, do começo da lista até o fim dela, e possui um passo de 2 (seleciona os índices de 2 em 2). Quanto algum dos valores é omitido, um valor padrão é considerado no lugar; para cada posição temos 0 para o início, o tamanho da lista para o final e 1 para o passo. O resultado do código acima é:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$&amp;gt; python3 &amp;lt;nome_do_arquivo&amp;gt;.py
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[0, 1, 2, 3, 4]
[0, 2, 4, 6, 8, 10]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  List Comprehension
&lt;/h3&gt;

&lt;p&gt;Em Python existem várias maneiras de criar listas. A maneira q será vista nesse tópico é a compreensão de lista (ou list comprehension para os amantes de inglês). List comprehensions permitem criar listas de uma forma mais concisa e legível, tornando o código mais fácil de ser entendido e mantido. Nomezinho chique, hein?&lt;/p&gt;

&lt;p&gt;Essa funcionalidade permite criar uma nova lista a partir de uma lista existente, um loop ou outra estrutura de dados, aplicando uma expressão a cada elemento.&lt;/p&gt;

&lt;p&gt;A sintaxe de uma List Comprehension pode ser entendida como:&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="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;expressao&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;# ou
&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;expressao&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&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="n"&gt;inicio&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fim&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Traduzindo para o português bom e claro: "Aplique &lt;code&gt;expressão&lt;/code&gt; para todo &lt;code&gt;item&lt;/code&gt; da lista &lt;code&gt;list&lt;/code&gt;" e "Aplique &lt;code&gt;expressão&lt;/code&gt; para cada índice &lt;code&gt;i&lt;/code&gt; do intervalo estabelecido".&lt;/p&gt;

&lt;p&gt;Onde:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;expressao&lt;/code&gt; é qualquer sentença da linguagem que retorne um valor. Por exemplo, elevar ao quadrado retorna o resultado da potência;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;item&lt;/code&gt; representa cada elemento da lista a ser formada/manipulada. A expressão precisa ser compatível com o elemento.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;list&lt;/code&gt; é a lista a ser criada/manipulada. Por mais que a lista já exista, essa manipulação criará uma nova lista, pois estamos copiando a lista original e modificando cada elemento de acordo com a expressão;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;i&lt;/code&gt; é o índice do for loop. O índice aumenta o valor em 1 a cada vez que a iteração acontece até chegar no valor final;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Por exemplo, dado o seguinte código:&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;lista&lt;/span&gt; &lt;span class="o"&gt;=&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;el&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;10&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;lista&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;el&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;É possível reescrevê-lo utilizando list comprehensions na forma:&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;lista&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;el&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;el&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;10&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ambos os trechos de código têm o mesmo resultado, que é criar num intervalo de 1 a 9 (10 é exclusivo), onde cada elemento deve ser multiplicado por 10.&lt;/p&gt;

&lt;p&gt;Você pode, ainda, inserir condicionais na forma de instruções &lt;code&gt;if&lt;/code&gt; em list comprehensions para limitar seu set de resultados. 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="n"&gt;pares&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;el&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;el&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;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;el&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;0&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;pares&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$&amp;gt; python3 &amp;lt;nome_do_arquivo&amp;gt;.py
[0, 2, 4, 6, 8]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A list comprehension do código acima gera uma lista de todos os números pares no intervalo de 0 a 9 (10 exclusivo) graças à instrução &lt;code&gt;if el % 2 == 0&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;No começo, pode parecer que você faz uma troca de legibilidade por eficiência e praticidade, mas com o passar do tempo, a sintaxe de list comprehensions começará a se impregnar na sua leitura e a memória muscular ajudará bastante nisso. Apenas pratique e aumente a dificuldade das comprehensions gradativamente. &lt;/p&gt;

&lt;h2&gt;
  
  
  Matrizes
&lt;/h2&gt;

&lt;p&gt;Uma matriz pode ser entendida como uma lista que contém listas. Na interpretação matemática, uma lista é um vetor e uma matriz é um conjunto de 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;nn &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;n&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
 vetores representando uma matriz n-dimensional. A representação de uma matriz em python é dada da seguinte forma:&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;matriz&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="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="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;5&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="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="mi"&gt;8&lt;/span&gt;&lt;span class="p"&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;Em vez de usar inteiros ou strings, você usa listas separadas por vírgula dentro de outra lista para representar uma matriz. Toda matriz possui as mesmas propriedades das listas, incluindo métodos, slices e list comprehensions. &lt;/p&gt;

&lt;p&gt;Ao criar matrizes, você insere listas dentro de listas. As list comprehensions seguem o mesmo princípio: é só você inserir comprehensions dentro de comprehensions. Por exemplo, olhe o código abaixo:&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;matriz&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;j&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;3&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;i&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;10&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="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;matriz&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso criará uma matriz quadrada de ordem 3 idêntica à matriz do primeiro exemplo. Vamos dividí-la em partes para entendermos melhor. Olhando de fora para dentro:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;for i in range(1, 10, 3)&lt;/code&gt;  é responsável por iterar sobre as linhas da matriz. Ele começa em 1, termina em 9 (10 exclusivo) e avança de 3 em 3. Ou seja, ele itera sobre os valores 1, 4 e 7, que correspondem às posições das três linhas na matriz;&lt;/li&gt;
&lt;li&gt;A variável &lt;code&gt;i&lt;/code&gt; representa a linha da matriz no loop;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;for j in range(3)&lt;/code&gt; é responsável por iterar sobre as colunas da matriz. Ele itera sobre os valores 0, 1 e 2, que correspondem às posições das três colunas na matriz.&lt;/li&gt;
&lt;li&gt;A expressão &lt;code&gt;i+j&lt;/code&gt; dentro da list comprehension mais aninhada calcula o valor a ser adicionado na matriz. Essa expressão faz a soma de i, que representa a linha da matriz, com j, a coluna.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Iteração e Manipulação de Matrizes
&lt;/h3&gt;

&lt;p&gt;Para percorrer matrizes, seguimos a mesma lógica de quando precisamos percorrer uma lista: fazer um loop. Mas se eu quero acessar cada linha e coluna da matriz, vou precisar de mais do que só um loop. No caso das matrizes, no algoritmo mais básico de iteração, serão necessários 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;nn &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;n&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
 loops para uma matriz n-dimensional para acessar todos os seus elementos.&lt;/p&gt;

&lt;p&gt;Bom, loops são simples, mas e se precisarmos manipular a matriz em operações como produto escalar, multiplicação entre matrizes e inversão? Vamos implementar na mão?&lt;/p&gt;

&lt;p&gt;Para tal, usaremos a biblioteca &lt;code&gt;numpy&lt;/code&gt; instalada no último material. Esta seção será fortemente baseada na documentação de NumPy, então é extremamente recomendado usar ambos como base.&lt;/p&gt;

&lt;p&gt;A biblioteca &lt;code&gt;numpy&lt;/code&gt; usa como base o elemento &lt;code&gt;array&lt;/code&gt;, popularmente chamado &lt;strong&gt;ndarray&lt;/strong&gt; (&lt;strong&gt;n&lt;/strong&gt;-&lt;strong&gt;d&lt;/strong&gt;imensional &lt;strong&gt;array&lt;/strong&gt;), uma implementação própria da biblioteca similar às listas de Python, com a diferença de que são obrigatoriamente homogêneos. Arrays e listas compartilham diversos comportamentos, como slicing e indexação.&lt;/p&gt;

&lt;p&gt;Veja o exemplo abaixo:&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;import&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;

&lt;span class="n"&gt;arr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;array&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="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;],&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;5&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="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="mi"&gt;8&lt;/span&gt;&lt;span class="p"&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;Aqui, criamos um array de Numpy através da função &lt;code&gt;np.array&lt;/code&gt;. O parâmetro dessa função pode ser uma lista de Python ou uma matriz. No caso acima, criamos uma matriz quadrada de ordem 3, onde, na linguagem Numpy, suas linhas e colunas são chamadas &lt;strong&gt;axes&lt;/strong&gt; ou, no português claro, &lt;strong&gt;eixos&lt;/strong&gt;. Logo, o primeiro axis dessa matriz possui tamanho 3 e o segundo, 3. Podemos, ainda, criar um array de tamanho &lt;code&gt;n&lt;/code&gt; preenchido por zeros, uns ou qualquer outro valor através das funções &lt;code&gt;np.zeros(n)&lt;/code&gt;, &lt;code&gt;np.ones(n)&lt;/code&gt; e &lt;code&gt;np.full(n, v)&lt;/code&gt;, respectivamente. Para criar um array que replique a função range, podemos utilizar a função &lt;code&gt;np.arange()&lt;/code&gt;, que tem a mesma funcionalidade de &lt;code&gt;range()&lt;/code&gt;. Para gerar arrays com valores igualmente distanciados entre si, podemos utilizar o método &lt;code&gt;array.linspace(start, stop, num=50&lt;/code&gt;, que gera &lt;code&gt;num&lt;/code&gt; números de um intervalo de &lt;code&gt;start&lt;/code&gt; até &lt;code&gt;stop&lt;/code&gt; exclusivo.  &lt;/p&gt;

&lt;p&gt;Quanto as propriedades do array, temos três principais: número de dimensões, tamanho e formato. O número de dimensões é expresso pela propriedade &lt;code&gt;array.ndim&lt;/code&gt; e retorna a quantidade de dimensões/eixos que o seu array possui (lembrando que um array pode ser um vetor ou uma matriz, é só uma nomenclatura utilizada pela biblioteca), o tamanho, pela propriedade &lt;code&gt;array.size&lt;/code&gt;, que retorna o produto do número de linhas pelo número de colunas e o formado, pela &lt;code&gt;array.shape&lt;/code&gt;, que retorna uma tupla de 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;nn &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;n&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
 inteiros indicando o número de elementos armazenados nas 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;nn &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;n&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
 dimensões do array.&lt;/p&gt;

&lt;p&gt;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="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;

&lt;span class="n"&gt;odeio_matriz&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;array&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;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;],&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="mi"&gt;10&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="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="mi"&gt;16&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="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;odeio_matriz&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&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;odeio_matriz&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ndim&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;odeio_matriz&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shape&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$&amp;gt; python3 &amp;lt;nome_do_arquivo&amp;gt;.py
9
2
(3, 3)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No que tange a manipulação de arrays, temos métodos como &lt;code&gt;array.transpose()&lt;/code&gt;, que faz a transposta do array que o invocou. Dentre estes métodos, temos:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;np.inner(a, b)&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Dados dois vetores a e b de mesmo tamanho, &lt;code&gt;inner&lt;/code&gt; executa o produto interno entre a e b.&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;import&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;

&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;array&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="mi"&gt;3&lt;/span&gt;&lt;span class="p"&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;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;array&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;5&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="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 produto interno é:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;inner&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$&amp;gt; python3 &amp;lt;nome_do_arquivo&amp;gt;.py
O produto interno é: 32
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;np.dot(a, b)&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Dadas duas matrizes a e b, &lt;code&gt;dot&lt;/code&gt; executa a multiplicação entre a e b. Para que essa operação ocorra com sucesso, temos que garantir que o número de colunas de a deve ser igual ao número de linhas de b.&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;import&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;

&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;array&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;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="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;5&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="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;9&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="mi"&gt;1&lt;/span&gt;&lt;span class="p"&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;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;array&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="mi"&gt;11&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="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="mi"&gt;16&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="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;9&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="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 multiplicação resulta em:&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$&amp;gt; python3 &amp;lt;nome_do_arquivo&amp;gt;.py
A multiplicação resulta em:
 [[ 82 140  52]
 [ 60 109  22]
 [151 220  41]]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;array.trace()&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;O &lt;strong&gt;trace&lt;/strong&gt; ou, no português, traço retorna a soma da diagonal principal da matriz que o invocou.&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;import&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;

&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([&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;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="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;5&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="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;9&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="mi"&gt;1&lt;/span&gt;&lt;span class="p"&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;O traço da matriz &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="s"&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;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trace&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$&amp;gt; python3 &amp;lt;nome_do_arquivo&amp;gt;.py
O traço da matriz 'a' é: 8
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;np.linalg.det(a)&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Dada uma matriz quadrada a, seu determinante pode ser calculado através da função &lt;code&gt;det&lt;/code&gt;, localizada dentro do pacote &lt;code&gt;linalg&lt;/code&gt; de NumPy. Se o determinante resultar em 0, significa que a matriz não admite inversa. Comumente, &lt;code&gt;det&lt;/code&gt; retornará um número de ponto flutuante que atinge o limite de precisão de Python. Nesses casos, é válido utilizar a função &lt;code&gt;np.round()&lt;/code&gt; para arredondar o resultado ao seu inteiro mais próximo.&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;import&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;

&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([&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;2&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="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;3&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="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="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="n"&gt;determinante&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linalg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;det&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;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;O determinante de &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="s"&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;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;determinante&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$&amp;gt; python3 &amp;lt;nome_do_arquivo&amp;gt;.py
O determinante de 'a' é: 5.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se não tivessemos arredondado o determinante, seu resultado seria  
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;4.9999999999999994.999999999999999 &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;4.999999999999999&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
.&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;code&gt;np.linalg.inv(a)&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Dada uma matriz quadrada a, o inverso de a pode ser calculado através da função &lt;code&gt;inv&lt;/code&gt;, também dentro de &lt;code&gt;linalg&lt;/code&gt;. Como a inversão de uma matriz depende do determinante da mesma ser diferente de 0, usaremos a matriz do exemplo anterior.&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;import&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;

&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([&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;2&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="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;3&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="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="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="n"&gt;inversa&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linalg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;inv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;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;A inversa de &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="s"&gt; é:&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;inversa&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$&amp;gt; python3 &amp;lt;nome_do_arquivo&amp;gt;.py
A inversa de 'a' é:
 [[ 0.8 -0.4 -0.2]
 [-0.2  0.6 -0.2]
 [-0.2 -0.4  0.8]]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A biblioteca NumPy dispõe de inúmeros métodos e funções para manipular matrizes. Dito isso, leia a documentação e, se possível, não se restrinja a somente uma fonte de conteúdo. Existem diversas bibliotecas, cada uma com sua aplicação e vantagem.&lt;/p&gt;

&lt;p&gt;Aqui e agora, espero que você tenha compreendido os conceitos de listas e matrizes em Python, bem como suas principais funcionalidades e operações. As listas são estruturas de dados extremamente versáteis, permitindo armazenar elementos de diversos tipos e tamanhos, e possuem diversas operações que facilitam sua manipulação e análise. Já as matrizes, apesar de serem estruturas mais específicas, são muito úteis para representar dados de duas ou mais dimensões, como imagens, tabelas, entre outros. Os horizontes se expandirão à medida em que novos desafios surgem.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Python: Imports e Bibliotecas</title>
      <dc:creator>Gustavo Soares</dc:creator>
      <pubDate>Fri, 12 May 2023 21:11:18 +0000</pubDate>
      <link>https://dev.to/iugstav/python-imports-e-bibliotecas-42c0</link>
      <guid>https://dev.to/iugstav/python-imports-e-bibliotecas-42c0</guid>
      <description>&lt;p&gt;Se você já conhece um pouco sobre o mundo da programação, deve saber que, na maioria dos casos, um só arquivo não será o suficiente para escrever seu programa, exceto se você escrever 700 linhas em um único arquivo (não faça isso, por favor). A modularidade e reutilização de código são fundamentais em qualquer linguagem de programação. Em Python, podemos atingir esse objetivo importando pacotes, módulos e bibliotecas. A importação de módulos permite que os desenvolvedores acessem funções, variáveis e classes criadas em outros arquivos e os utilizem em seus próprios programas. Já a importação de bibliotecas oferece uma ampla variedade de recursos prontos para uso, como algoritmos de aprendizado de máquina, visualização de dados, manipulação de arquivos, entre outros.&lt;/p&gt;

&lt;h2&gt;
  
  
  Imports e mais imports
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Importando conteúdos
&lt;/h3&gt;

&lt;p&gt;Para fazer uso de bibliotecas e fatores externos ao arquivo atual de código, devemos importar esses conteúdos através da sintaxe&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;import&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;nome_do_conteudo&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;no começo do arquivo, onde &lt;code&gt;nome_do_conteudo&lt;/code&gt; refere-se a qualquer unidade de código que pode ser exportada de um lugar para outro no programa. Dentre essas unidades, temos principalmente os módulos, os pacotes e as bibliotecas.&lt;/p&gt;

&lt;p&gt;Na teoria, qualquer arquivo python já é um módulo, portanto, se você criar outro arquivo e precisar chamar uma função ou variável localizada nele, basta importá-lo utilizando a chamada &lt;code&gt;import &amp;lt;nome_do_arquivo&amp;gt;&lt;/code&gt; sem a extensão “.py”. Tome o exemplo:&lt;/p&gt;

&lt;p&gt;Estamos criando um módulo que realiza cálculos para o nosso programa. Para tal, crie o arquivo &lt;code&gt;calculo.py&lt;/code&gt; e insira o seguinte conteúdo nele:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;

&lt;span class="c1"&gt;# calculo.py
&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;somar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&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;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;subtrair&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&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;a&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;São apenas duas funções, uma soma e a outra subtrai. Agora, no arquivo que você irá executar, chame o módulo através do nome do arquivo e use suas funções. As funções se ligam ao nome do módulo importado por uma notação de ponto &lt;code&gt;.&lt;/code&gt; onde se escreve &lt;code&gt;&amp;lt;nome_do_modulo&amp;gt;.funcao()&lt;/code&gt;. Veja o código abaixo:&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;import&lt;/span&gt; &lt;span class="n"&gt;calculo&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="nf"&gt;somar&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Agora execute o programa e veja se o output equivale a esse:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;

&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;python3&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;nome_do_arquivo&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;span class="mi"&gt;3&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Assim, você criou um módulo, importou em outro arquivo e chamou uma de suas funções. Com esse conceito, aprendemos uma nova formula de encapsulamento e modularização de código.&lt;/p&gt;

&lt;p&gt;Você pode, ainda, importar uma função específica do módulo/pacote desejado utilizando uma sintaxe similar a anterior:&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;from&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;modulo&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Diferente de Javascript e outras linguagens, Python segue uma ordem de busca para achar módulos importados:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Procura nó diretório em que o script que importa está localizado;&lt;/li&gt;
&lt;li&gt;Em caminhos localizados na variável de ambiente &lt;code&gt;PYTHONPATH&lt;/code&gt;. Ela pode ser acessada através do módulo &lt;code&gt;sys&lt;/code&gt; chamando &lt;code&gt;sys.path&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;Em um diretório de instalações da linguagem;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Caso sua biblioteca tenha um nome muito grande ou desconfortável de escrever o tempo todo, é possível dar um “apelido” para a importação através da sintaxe &lt;code&gt;as&lt;/code&gt;. Do exemplo do módulo &lt;code&gt;calculo.py&lt;/code&gt;, podemos apelidar o módulo a fim de escrever menos:&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;import&lt;/span&gt; &lt;span class="n"&gt;calculo&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;c&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;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;somar&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Tome muito cuidado com os nomes escolhidos para apelidos, eles podem se tornar pouco intuitivos e difíceis de ler. Um exemplo disso seria você apelidar a biblioteca &lt;code&gt;string&lt;/code&gt; de &lt;code&gt;macarrao&lt;/code&gt;. Faz sentido? Óbvio que não.&lt;/p&gt;

&lt;h3&gt;
  
  
  A função &lt;code&gt;dir(obj=None)&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Cada módulo criado tem sua própria assinatura, denotada por uma tabela privada de símbolos que dita cada objeto daquele módulo. Quando importamos um módulo &lt;code&gt;x&lt;/code&gt; através de &lt;code&gt;import x&lt;/code&gt;, estamos inserindo a tabela de símbolos de um módulo em outro.&lt;/p&gt;

&lt;p&gt;Para saber o que está na tabela de símbolos do módulo atual, podemos fazer uso da função &lt;code&gt;dir&lt;/code&gt;, que retorna uma lista de todos os símbolos especificados em &lt;code&gt;obj&lt;/code&gt;. Se não for passado nenhum valor como parâmetro, a função retornará uma lista contendo a tabela de símbolos de um módulo.&lt;/p&gt;

&lt;p&gt;Toda instrução que possa ser passada como parâmetro tem uma tabela privada de símbolos, incluindo variáveis, funções, classes e afins. Logo, qualquer valor dentro dessa categoria pode ser passado como parâmetro para &lt;code&gt;dir&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Por exemplo:&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="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;dir&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;O código acima declara uma variável &lt;code&gt;x&lt;/code&gt;, que recebe 10 e escreve no terminal sua tabela de símbolos. Como seria a tabela de símbolos de um inteiro?&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;

&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;python3&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;nome_do_arquivo&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;__abs__&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;__add__&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;__and__&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;__bool__&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;__ceil__&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;__class__&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;__delattr__&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;__dir__&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;__divmod__&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;__doc__&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;__eq__&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;__float__&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;__floor__&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;__floordiv__&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;__format__&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;__ge__&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;__getattribute__&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;__getnewargs__&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;__gt__&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;__hash__&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;__index__&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;__init__&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;__init_subclass__&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;__int__&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;__invert__&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;__le__&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;__lshift__&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;__lt__&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;__mod__&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;__mul__&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;__ne__&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;__neg__&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;__new__&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;__or__&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;__pos__&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;__pow__&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;__radd__&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;__rand__&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;__rdivmod__&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;__reduce__&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;__reduce_ex__&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;__repr__&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;__rfloordiv__&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;__rlshift__&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;__rmod__&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;__rmul__&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;__ror__&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;__round__&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;__rpow__&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;__rrshift__&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;__rshift__&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;__rsub__&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;__rtruediv__&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;__rxor__&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;__setattr__&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;__sizeof__&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;__str__&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;__sub__&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;__subclasshook__&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;__truediv__&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;__trunc__&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;__xor__&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;as_integer_ratio&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;bit_count&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;bit_length&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;conjugate&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;denominator&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;from_bytes&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;imag&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;numerator&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;real&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;to_bytes&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;Maluquice? Um pouco. Na verdade, a tabela de símbolos de uma variável inteira é o conjunto de todas as funções e propriedades que fazem parte do módulo do tipo &lt;code&gt;int&lt;/code&gt; específicado em tempo de projeto da linguagem, ou seja, essa é a lista que todo inteiro possui como base. Todos esses símbolos podem ser acessados através da notação de ponto &lt;code&gt;.&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Módulos como scripts
&lt;/h3&gt;

&lt;p&gt;Bom, como sabemos, Python não requer uma função &lt;code&gt;main&lt;/code&gt; para executar um programa. Isso porque &lt;code&gt;main&lt;/code&gt; está impllícita no código e é gerada em tempo de execução dentro do arquivo invocado por &lt;code&gt;python3&lt;/code&gt;. Logo, todo e qualquer arquivo python pode ser considerado um script executável. &lt;/p&gt;

&lt;p&gt;Por exemplo, eu tenho dois arquivos: &lt;code&gt;main.py&lt;/code&gt;, o arquivo que criei para ser o executável, e &lt;code&gt;biblioteca.py&lt;/code&gt;, um módulo a ser importado. Suponhamos que o conteúdo de &lt;code&gt;biblioteca.py&lt;/code&gt; seja o seguinte:&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;frase&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cheio de papinho gostoso&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;printa_lista&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lista&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;el&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;lista&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;el&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Podemos simplesmente fazer &lt;code&gt;python3 biblioteca.py&lt;/code&gt; e executar o arquivo como se nada houvesse, mas isso não produziria nenhum retorno. O código cria objetos, mas não os executa. No caso, se quisermos um retormo, basta usar &lt;code&gt;print&lt;/code&gt;  e invocar a função &lt;code&gt;printa(lista)&lt;/code&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;frase&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cheio de papinho gostoso&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;printa_lista&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lista&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;el&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;lista&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;el&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;frase&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;printa_lista&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="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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;E assim teremos o output:&lt;/p&gt;

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

$&amp;gt; python3 biblioteca.py
cheio de papinho gostoso
1
2
3
4


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Porém, entretanto, todavia, isso também gera output quando esse arquivo é importado por &lt;code&gt;main&lt;/code&gt;, já que todo e qualquer símbolo é passado de um arquivo para outro. Talvez esse não seja o comportamento ideal, a menos que você queira outputs rolando soltos em toda a sua estrutura de arquivos. A partir dessa necessidade, podemos definir uma condição especial para o arquivo caso ele seja o executável. Se é uma condição, obviamente devemos usar &lt;code&gt;if&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Quando um arquivo &lt;code&gt;.py&lt;/code&gt; é importado como módulo, o interpretador Python gera uma variável especial &lt;code&gt;__name__&lt;/code&gt; que recebe o nome do módulo. No entanto, se o tal arquivo &lt;code&gt;.py&lt;/code&gt; é executado como um script por si só (ou seja, ele é o escolhido da vez pela CLI), essa variável especial &lt;code&gt;__name__&lt;/code&gt; recebe a string &lt;code&gt;"__main__"&lt;/code&gt;. Dito isso, agora podemos diferenciar um módulo qualquer do arquivo que receberá a função main. Adaptando &lt;code&gt;biblioteca.py&lt;/code&gt; às nossas necessidades:&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;frase&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cheio de papinho gostoso&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;printa_lista&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lista&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;el&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;lista&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;el&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;__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;__main__&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="n"&gt;frase&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;printa_lista&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="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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Logo, se esse arquivo for o script executavel a receber &lt;code&gt;main&lt;/code&gt;, ele escreverá &lt;code&gt;frase&lt;/code&gt; e executará a função. Se não, será tratado como módulo.&lt;/p&gt;

&lt;p&gt;Ter o comportamento de módulos como script é extremamente útil especialmente para testes, pois cada módulo pode ser visto como uma unidade funcional por si só, o que facilita a implementação de testes unitários.&lt;/p&gt;

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

&lt;p&gt;Além dos módulos e das bibliotecas nativas como opções de modularizar funcionalidades, também temos os pacotes. Um pacote é uma coleção de módulos que compartilham um mesmo diretório e, geralmente, um mesmo objetivo. Isso permite a organização e modularização de código de forma mais clara e estruturada.&lt;/p&gt;

&lt;p&gt;Suponha que você esteja desenvolvendo uma aplicação grande que possui inúmeros módulos. A medida que o número de módulos cresce, a dificuldade de manutenção também cresce junto. Imagina ter os módulos de autenticação, pagamento e interação com banco de dados juntos em uma só estrutura linear? Complicado, hein!&lt;/p&gt;

&lt;p&gt;Para tal, temos os pacotes. Para criar um pacote em Python, é necessário criar uma pasta que conterá todos os módulos relacionados dentro dessa pasta. Os arquivos dentro de uma pasta são comumente associados entre si por contexto ou funcionalidade. Por exemplo, uma pasta com o nome “usuário” terá funcionalidades que remetem aos casos de uso do usuario no sistema.&lt;/p&gt;

&lt;p&gt;Pacotes podem ser vistos como uma versão de estrutura hierárquica dos módulos, já que também usam notação de ponto, mas se organizam por pastas. Da mesma forma que módulos evitam colisões entre variáveis com a modularização, pacotes evitam as colisões entre nomes de módulos, pois estão um nível acima na hierarquia de organização. Tome como exemplo a estrutura abaixo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmw2rjnffriq0i0xle6s0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmw2rjnffriq0i0xle6s0.png" alt="Uma imagem representando a estrutura de arquivos em Python, onde temos um arquivo main.py e um diretório de nome pacote, contendo dois arquivos arquivo1.py e arquivo2.py, respectivamente"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Temos um diretório &lt;code&gt;pacote&lt;/code&gt; com dois módulos &lt;code&gt;arquivo1.py&lt;/code&gt; e &lt;code&gt;arquivo2.py&lt;/code&gt; com os seguintes conteudos, respectivamente:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;

&lt;span class="c1"&gt;# arquivo1.py
&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fala_oi&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;oi do primeiro módulo&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;frase_do_dia&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;água mole em pedra dura, tanto bate até que fura&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;

&lt;span class="c1"&gt;# arquivo2.py
&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fala_tchau&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;tchau do segundo módulo&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;Dadas essas informações, se o diretório &lt;code&gt;pacote&lt;/code&gt; estiver em uma localização (caminho no sistema de arquivos) que não entre em conflito com outros ou com a variável de ambiente &lt;code&gt;PYTHONPATH&lt;/code&gt;, então você pode referenciar os dois módulos através da notação de ponto. Observe a importação abaixo em &lt;code&gt;main.py&lt;/code&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;import&lt;/span&gt; &lt;span class="n"&gt;pacote.arquivo1&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;a1&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pacote.arquivo2&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;a2&lt;/span&gt;

&lt;span class="n"&gt;a1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fala_oi&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;a2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fala_tchau&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
  
  
  Bibliotecas
&lt;/h2&gt;

&lt;p&gt;A importação de bibliotecas é uma das características mais poderosas do Python. Ao importar bibliotecas, podemos expandir a funcionalidade do Python para além das bibliotecas nativas e pacotes do projeto e assim tornar o código mais modular e reutilizável.&lt;/p&gt;
&lt;h3&gt;
  
  
  Bibliotecas nativas
&lt;/h3&gt;

&lt;p&gt;As bibliotecas nativas são aquelas que já vêm pré-instaladas com a instalação padrão da linguagem e do interpretador. Essas bibliotecas incluem módulos e pacotes que fornecem funcionalidades básicas para a linguagem, como operações matemáticas, manipulação de strings, entrada e saída de arquivos, entre outras.&lt;/p&gt;

&lt;p&gt;Além disso, as bibliotecas nativas do Python são de código aberto e são mantidas pela comunidade de desenvolvedores, o que permite que qualquer pessoa possa contribuir com melhorias e correções de bugs. Tá aí a dica caso queira entender como as coisas funcionam.&lt;/p&gt;

&lt;p&gt;Algumas das bibliotecas nativas mais comuns do Python incluem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;math: oferece funções matemáticas básicas, como cálculo de raiz quadrada, exponenciação e trigonometria.&lt;/li&gt;
&lt;li&gt;string: fornece funcionalidades para manipulação de strings, como a formatação de strings e busca de caracteres específicos.&lt;/li&gt;
&lt;li&gt;os: permite a interação com o sistema operacional, como a criação de arquivos e diretórios e a manipulação de variáveis de ambiente.&lt;/li&gt;
&lt;li&gt;datetime: oferece funcionalidades para trabalhar com datas e horários.&lt;/li&gt;
&lt;li&gt;random: gera valores aleatórios, como números inteiros e floats.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Essas bibliotecas são essenciais para o desenvolvimento de programas em Python e, por isso, é importante ter um conhecimento básico sobre elas.&lt;/p&gt;

&lt;p&gt;Veja o exemplo abaixo utilizando a biblioteca &lt;code&gt;os&lt;/code&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;import&lt;/span&gt; &lt;span class="n"&gt;os&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;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getcwd&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;No código, importamos a biblioteca &lt;code&gt;os&lt;/code&gt; e utilizamos a função &lt;code&gt;getcwd()&lt;/code&gt;, uma abreviação para “&lt;strong&gt;get&lt;/strong&gt; &lt;strong&gt;c&lt;/strong&gt;urrent &lt;strong&gt;w&lt;/strong&gt;orking &lt;strong&gt;d&lt;/strong&gt;irectory”, que retorna o diretório onde o script está rodando. No meu caso, o output é:&lt;/p&gt;

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

$&amp;gt; python3 &amp;lt;nome_do_arquivo&amp;gt;.py
/home/iugstav/dev/py/


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;A importação de bibliotecas é idêntica à importação de módulos, com os mesmos comportamentos de apelidos e afins.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bibliotecas externas
&lt;/h3&gt;

&lt;p&gt;A instalação de bibliotecas externas é uma etapa importante para qualquer projeto em Python que necessite de recursos adicionais para executar tarefas específicas. Embora a linguagem tenha um conjunto abrangente de bibliotecas nativas, muitas vezes é necessário utilizar recursos de terceiros para atender às necessidades de um projeto.&lt;/p&gt;

&lt;p&gt;Existem diversas bibliotecas em Python, tanto as que são nativas da linguagem quanto as que foram criadas por desenvolvedores da comunidade. Algumas das bibliotecas mais populares em Python incluem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;NumPy: usada para manipulação de matrizes e operações matemáticas;&lt;/li&gt;
&lt;li&gt;Pandas: utilizada para análise e manipulação de dados;&lt;/li&gt;
&lt;li&gt;Matplotlib: usada para criação de gráficos e visualizações;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Como já foi dito algumas vezes nessa série de materiais, Python tem bastante foco em machine learning, computação científica e ciência de dados. De fato, seu ecossistema tem forte influência nisso, pois existem inúmeras bibliotecas focadas nessas áreas, inclusive as três citadas acima. Isso se dá pela portabilidade que outras linguagens têm no ecossistema da linguagem. Existem inúmeras APIs que portam código em C, FORTRAN, Rust e outras para um código compreensível para bibliotecas em Python.&lt;/p&gt;

&lt;p&gt;Para utilizar bibliotecas externas em Python, é necessário instalá-las em seu sistema. Existem diversas maneiras de realizar a instalação de bibliotecas, sendo as mais comuns:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Utilizando o gerenciador de pacotes &lt;strong&gt;pip&lt;/strong&gt;: o pip é um gerenciador de pacotes do Python que permite buscar, instalar, atualizar e desinstalar bibliotecas de forma simples e rápida. Para instalar uma biblioteca usando o pip, basta executar o seguinte comando no terminal: &lt;code&gt;pip install &amp;lt;nome_da_biblioteca&amp;gt;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Utilizando o &lt;strong&gt;Anaconda&lt;/strong&gt;: o Anaconda é uma plataforma que inclui o Python e um conjunto de bibliotecas científicas populares. Ele também possui um gerenciador de pacotes próprio chamado conda, que permite instalar bibliotecas de forma semelhante ao pip.&lt;/li&gt;
&lt;li&gt;Instalando manualmente: em alguns casos, a biblioteca pode não estar disponível no repositório do pip ou conda, ou pode ser necessário instalá-la de forma manual. Nesses casos, é necessário baixar os arquivos da biblioteca diretamente do site do desenvolvedor e seguir as instruções de instalação disponibilizadas.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Independentemente do método escolhido, é importante lembrar que algumas bibliotecas podem ter dependências em outras bibliotecas. Portanto, é recomendável verificar as dependências antes da instalação, para garantir que todas as bibliotecas necessárias estejam instaladas corretamente.&lt;/p&gt;

&lt;p&gt;Aqui, usaremos pip e a bibliotema NumPy para manipular matrizes. Para instalar a NumPy, digite o comando no seu terminal:&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;pip&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;De acordo com a própria documentação da biblioteca, NumPy (&lt;strong&gt;Num&lt;/strong&gt;erical &lt;strong&gt;Py&lt;/strong&gt;thon) é uma biblioteca open source usada em quase todas as partes da ciência e engenharia que conta com matrizes multidimensionais e listas próprias. Usaremos ela no próximo tópico sobre matrizes.&lt;/p&gt;

&lt;p&gt;Vimos que a modularização de código é fundamental para tornar nossos programas mais organizados e reutilizáveis, e que a utilização de pacotes pode facilitar muito esse processo. Além disso, exploramos como é possível integrar outras linguagens à Python, o que pode ser útil em áreas onde a performance é crítica.&lt;/p&gt;

&lt;p&gt;Ao compreender e dominar o uso de bibliotecas em Python, podemos aproveitar ao máximo todo o poder e flexibilidade que a linguagem oferece, além de economizar tempo e esforço em nossos projetos.&lt;/p&gt;

</description>
      <category>python</category>
      <category>programming</category>
    </item>
    <item>
      <title>Python: Funções</title>
      <dc:creator>Gustavo Soares</dc:creator>
      <pubDate>Fri, 12 May 2023 20:59:59 +0000</pubDate>
      <link>https://dev.to/iugstav/python-funcoes-4dni</link>
      <guid>https://dev.to/iugstav/python-funcoes-4dni</guid>
      <description>&lt;p&gt;Não é de hoje que códigos são escritos e reescritos constantemente. Quando programamos, nos vemos numa situação onde o mesmo trecho de código se aplica a diversas situações e, de fato, gostaríamos que assim fosse, sem ter que escrever tudo de novo o tempo todo. Aí entram as funções.&lt;/p&gt;

&lt;p&gt;Funções são blocos nomeados de instruções que podem ser chamados e utilizados quantas vezes forem necessários, permitindo à pessoa programadora repetir o mesmo código sem a necessidade de escrevê-lo do zero.&lt;/p&gt;

&lt;p&gt;Uma outra explicação para funções em linguagens de programação seria compará-las ao conceito matemático. Para uma função 

&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;f(x)f(x) &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;f&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
, existe um conjunto 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;LL &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;L&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
 finito de valores tal que&lt;/p&gt;


&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;f:L→Imf,x∈L
f:L\xrightarrow{}Im_f, x\in L
&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;f&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;:&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;L&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel x-arrow"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight x-arrow-pad"&gt;&lt;span class="mord mtight"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="svg-align"&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="hide-tail"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;I&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;m&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;f&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;x&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;∈&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;L&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;


&lt;p&gt;Sendo 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;ImfIm_f &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;I&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;m&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;f&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
 o conjunto de possíveis valores que 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;ff &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;f&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
 retornará.&lt;/p&gt;

&lt;p&gt;As funções em Python se comportam da mesma forma e você pode criá-las através da palavra reservada &lt;code&gt;def&lt;/code&gt;, seguida do nome da função e seus parênteses &lt;code&gt;()&lt;/code&gt;. Além disso, funções podem retornar valores através da palavra reservada &lt;code&gt;return&lt;/code&gt;. Nenhuma instrução da função abaixo do após o retorno será lida, então tome cuidado com seu uso.&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="c1"&gt;# def &amp;lt;nome_da_funcao&amp;gt;(&amp;lt;parametro_1&amp;gt;, &amp;lt;parametro_2&amp;gt;, ...)
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;faz_algo&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="c1"&gt;#conteúdo
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;No trecho acima, declaramos a função &lt;code&gt;faz_algo&lt;/code&gt;, seguida de dois pontos (&lt;code&gt;:&lt;/code&gt;). Como Python usa indentação como marcador para distinguir escopos, utilizar dois pontos diz ao interpretador que aqui estamos criando um novo escopo para a função. Portanto, além de indentar corretamente, não se esqueça dos dois pontos.&lt;/p&gt;

&lt;p&gt;Funções são popularmente conhecidas como abstrações de código. De fato, elas nos poupam de muita computação desnecessária, como por exemplo a função &lt;code&gt;print()&lt;/code&gt;, que escreve uma mensagem no console. E se ela não existisse na linguagem? Eu não gosto nem de pensar nessas coisas.&lt;/p&gt;

&lt;p&gt;Dito isso, vamos criar uma função que retorna a soma de 2 mais 2:&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="c1"&gt;# def &amp;lt;nome_da_funcao&amp;gt;()
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;soma_dois&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;2&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;

&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;soma_dois&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Ao rodar o script, receberemos o inteiro 4 como resposta e assim encapsulamos uma operação de soma do número 2 com ele mesmo. Mas e se quiséssemos criar uma função que somasse qualquer número com outro qualquer? &lt;/p&gt;
&lt;h2&gt;
  
  
  Passagem de Parâmetros
&lt;/h2&gt;

&lt;p&gt;Comumente nos deparamos com a necessidade de usar valores externos ao escopo da função dentro dele, mas não seria prático criar uma abstração de código que depende de valores externos. Para tal, temos a passagem de parâmetros a funções.&lt;/p&gt;

&lt;p&gt;Parâmetros são variáveis locais especificadas entre os parênteses &lt;code&gt;()&lt;/code&gt;, no cabeçalho da função, que recebem cópias de valores externos ao escopo da função. Funções podem receber inúmeros parâmetros de diferentes tipos, contanto que sejam separados por vírgula. Como Python é uma linguagem dinamicamente tipada, não há a necessidade de explicitar os tipos na declaração de parâmetros, ou seja, eles serão descobertos em tempo de execução.&lt;/p&gt;

&lt;p&gt;Considerando o exemplo de soma acima, façamos com que ele aceite todo tipo de inteiros para somar e não só o número 2;&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="c1"&gt;# parâmetros a e b declarados dentro dos parênteses e
# separados por vírgula
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;soma_dois&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&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;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;

&lt;span class="c1"&gt;# invocação da função, passando seus dois parâmetros
&lt;/span&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;soma_dois&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;6&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;soma_dois&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="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;soma_dois&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;20&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;E o output:&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="err"&gt;$&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;python3&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;nome_do_arquivo&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;span class="mi"&gt;7&lt;/span&gt;
&lt;span class="mi"&gt;12&lt;/span&gt;
&lt;span class="mi"&gt;25&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Como foi dito anteriormente, quando declaramos uma função, também declaramos um escopo. O escopo pode ser definido como um espaço léxico delimitante aos quais instruções estão associadas. Um exemplo disso são os parâmetros há pouco expliccados. Se os parâmetros são variáveis locais de uma função, então estão vinculados ao escopo e deixarão de existir na memória no fim da mesma. O mesmo serve para variáveis definidas dentro da função.&lt;/p&gt;
&lt;h3&gt;
  
  
  Valores Padronizados para argumentos
&lt;/h3&gt;

&lt;p&gt;Podemos passar um valor base para um parâmetro contando que ele substitua o valor passado na invocação da função, assim, omitindo ele. Veja o exemplo a seguir:&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;falar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mensagem&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;t&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;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mensagem&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;falar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Olá, Mundo!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;falar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Olá, Mundo!"&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;A função &lt;code&gt;falar&lt;/code&gt; recebe dois parâmetros na sua declaração: uma mensagem a ser escrita e a quantidade de vezes que a mensagem será escrita. No segundo parâmetro há uma atribuição de valores, o que nos indica que, logo na declaração, um valor já é atribuído a esse parâmetro, excluindo a necessidade de passar um valor na invocação da função. Graças a esse fato, as duas invocações da função são válidas e rodam. Veja o output:&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="err"&gt;$&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;python3&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;nome_do_arquivo&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;span class="n"&gt;Olá&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Mundo&lt;/span&gt;&lt;span class="err"&gt;!&lt;/span&gt;
&lt;span class="n"&gt;Olá&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Mundo&lt;/span&gt;&lt;span class="err"&gt;!&lt;/span&gt;&lt;span class="n"&gt;Olá&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Mundo&lt;/span&gt;&lt;span class="err"&gt;!&lt;/span&gt;&lt;span class="n"&gt;Olá&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Mundo&lt;/span&gt;&lt;span class="err"&gt;!&lt;/span&gt;&lt;span class="n"&gt;Olá&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Mundo&lt;/span&gt;&lt;span class="err"&gt;!&lt;/span&gt;&lt;span class="n"&gt;Olá&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Mundo&lt;/span&gt;&lt;span class="err"&gt;!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Passagem por Nomenclatura
&lt;/h3&gt;

&lt;p&gt;Se você tiver uma função com diversos parâmetros e quiser especificar um ou mais deles, então você invocar a função e especificar esses parâmetros pelo nome deles em vez da ordem de passagem.&lt;/p&gt;

&lt;p&gt;Normalmente, quando invocamos uma função, usamos a passagem posicional de parâmetros, que leva em consideração a ordem em que foram declarados no cabeçalho da função. Na passagem por nomenclatura, o que é considerado é o nome do parâmetro. Observe o exemplo abaixo:&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;mostra_valor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c&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="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'a é'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'e b é'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'e c é'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;mostra_valor&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;7&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;mostra_valor&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="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;mostra_valor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;E o seu output:&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="err"&gt;$&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;python3&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;nome_do_arquivo&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;é&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="n"&gt;é&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="n"&gt;é&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;é&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="n"&gt;é&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="n"&gt;é&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt;
&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;é&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="n"&gt;é&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="n"&gt;é&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;A função &lt;code&gt;mostra_valor&lt;/code&gt; tem somente um parâmetro sem valor padrão, seguido de outros dois com valores padrão. Na primeira invocação &lt;code&gt;mostra_valor(3, 7)&lt;/code&gt;, o parâmetro &lt;code&gt;a&lt;/code&gt; recebe 3, &lt;code&gt;b&lt;/code&gt; recebe 7 e &lt;code&gt;c&lt;/code&gt; mantém seu valor padrão, pois não foi passado nenhum outro parâmetro. Na segunda invocação &lt;code&gt;mostra_valor(25, c=24)&lt;/code&gt;, o parâmetro &lt;code&gt;a&lt;/code&gt; recebe o valor 25 devido ao fator posicional da passagem de valores, &lt;code&gt;b&lt;/code&gt; mantém seu valor padrão e &lt;code&gt;c&lt;/code&gt; recebe 24 graças à passagem por nomenclatura. Na terceira invocação &lt;code&gt;mostra_valor(c=50, a=100)&lt;/code&gt;, o parâmetro &lt;code&gt;c&lt;/code&gt; recebe 50 por nomenclatura, &lt;code&gt;a&lt;/code&gt; recebe 100 também por nomenclatura e &lt;code&gt;b&lt;/code&gt; mantém seu valor padrão.&lt;/p&gt;
&lt;h1&gt;
  
  
  Recursão
&lt;/h1&gt;

&lt;p&gt;De forma rasa e informal, a recursão na programação pode ser considerada como a repetição de um processo e, portanto, pode ser definida como um processo que chama a si mesmo direta ou indiretamente até que alcance uma condição de término. Mas como que esse processo se repete? É um laço de iteração?&lt;/p&gt;

&lt;p&gt;A recursão se aplica diretamente a funções, pois é o único bloco de processamento que pode chamar a si mesmo durante sua execução. Uma função recursiva em sua integridade aplica um algoritmo de Divisão e Conquista (&lt;a href="https://pt.wikipedia.org/wiki/Divis%C3%A3o_e_conquista"&gt;O que é Divisão e Conquista?&lt;/a&gt;), que consiste em dividir de forma recursiva um problema grande em problemas menores até que o problema seja resolvido. Ou seja, a função sempre vai retornar ela mesma com uma versão mais simples do problema até chegar na solução.&lt;/p&gt;

&lt;p&gt;Consideremos que você, pessoa programadora, tem que determinar a soma dos 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;nn &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;n&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
 primeiros números naturais (
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;N\N &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathbb"&gt;N&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
). Existem diversas maneiras de fazer isso, mas a mais simples seria sair somando os números de 1 até 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;nn &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;n&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
, parecendo com isso:&lt;/p&gt;


&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;f(n)=1+2+3+4+...+n
f(n)=1+2+3+4+...+n
&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;f&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathnormal"&gt;n&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;2&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;3&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;4&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;...&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;n&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;



&lt;p&gt;Imagina se 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;nn &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;n&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
 for um número na casa dos milhares. Bastante trabalhoso, né? Nesse caso temos a opção recursiva para resolver esse problema. Veja a seguir:&lt;/p&gt;


&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;f={f(n)=1se n=1n+f(n−1)se n&amp;gt;1
f = \begin{cases}
f(n) = 1 &amp;amp; \text{se } n=1 \\
n + f(n-1) &amp;amp; \text{se } n \gt 1 
\end{cases}
&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;f&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen delimcenter"&gt;&lt;span class="delimsizing size4"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mtable"&gt;&lt;span class="col-align-l"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;f&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathnormal"&gt;n&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;n&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;f&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathnormal"&gt;n&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="arraycolsep"&gt;&lt;/span&gt;&lt;span class="col-align-l"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;se &lt;/span&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;n&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;se &lt;/span&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;n&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;&amp;gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;


&lt;p&gt;A única diferença entre os dois métodos é que a função 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;ff &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;f&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
 está sendo chamada dentro de sua própria função, estabelecendo uma condição de recursão.&lt;/p&gt;

&lt;p&gt;Ainda ficou confuso? Observe os dois exemplos abaixo, onde um implementa um &lt;code&gt;for..in&lt;/code&gt; loop e o outro, a recursã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="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;sequencia_decolar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;contagem&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;numero&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;contagem&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="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;if&lt;/span&gt; &lt;span class="n"&gt;numero&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Decolar!!!"&lt;/span&gt;&lt;span class="p"&gt;)&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;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numero&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;sequencia_decolar&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No trecho acima, criamos uma contagem regressiva para a decolagem de um foguete com o &lt;code&gt;for&lt;/code&gt; e um laço condicional para caso a contagem chegue a 0. Agora veja esse mesmo caso com outros olhos.&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;sequencia_decolar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;contagem&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;contagem&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Decolar!!!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&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;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;contagem&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;sequencia_decolar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;contagem&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;sequencia_decolar&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Onde a variável local &lt;code&gt;contagem&lt;/code&gt; representa de onde a contagem deve começar.&lt;/p&gt;

&lt;p&gt;No exemplo recursivo vimos que o retorno &lt;code&gt;sequencia_decolar(contagem - 1)&lt;/code&gt;&lt;br&gt;
 é o mesmo problema, porém simplificado, o que caminha para uma pilha de&lt;br&gt;
 funções onde a anterior, mais complexa, não será resolvida até que a &lt;br&gt;
próxima, mais simples, seja. Por exemplo, se a variável &lt;code&gt;contagem&lt;/code&gt; for 5, teremos esse comportamento:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Invocação da função sequencia_decolar(5);&lt;/span&gt;

5 é igual a 0? Não.
Então imprima "5" no terminal e retorne sequencia_decolar(5 - 1);

4 é igual a 0? Não.
Então imprima "4" no terminal e retorne sequencia_decolar(4 - 1);

3 é igual a 0? Não.
Então imprima "3" no terminal e retorne sequencia_decolar(3 - 1);

2 é igual a 0? Não.
Então imprima "2" no terminal e retorne sequencia_decolar(2 - 1);

1 é igual a 0? Não.
Então imprima "1" no terminal e retorne sequencia_decolar(1 - 1);

0 é igual a 0? Sim.
Então imprima "Decolar!!!" e retorne vazio;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;Entendemos como a recursão funciona, agora entenderemos onde cada tipo de recursão se encaixa.&lt;/p&gt;

&lt;p&gt;Como mencionado anteriormente, a recursividade pode aparecer direta ou indiretamente:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Forma direta&lt;/strong&gt;: É formada pela mesma estrutura de comandos e uma chamada a si mesma durante seu bloco de execução.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Forma indireta&lt;/strong&gt;: Nesse caso podem existir &lt;strong&gt;n&lt;/strong&gt; funções e todas dependem de todas, gerando uma cadeia de dependências&lt;br&gt;
até que a condição de término seja atingida. Veja o exemplo abaixo:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;impar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;False&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="n"&gt;par&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&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;def&lt;/span&gt; &lt;span class="nf"&gt;par&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;True&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="n"&gt;impar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&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;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;odd&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;# Output: True
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;No exemplo acima, &lt;code&gt;odd()&lt;/code&gt; chama &lt;code&gt;even()&lt;/code&gt; e &lt;code&gt;even()&lt;/code&gt; chama &lt;code&gt;odd()&lt;/code&gt;. Isso cria uma recursão indireta, pois a função &lt;code&gt;odd()&lt;/code&gt; não chama a si mesma diretamente, mas chama a função &lt;code&gt;even()&lt;/code&gt;, que por sua vez chama &lt;code&gt;odd()&lt;/code&gt; novamente. A recursão continua até que a condição de parada seja alcançada. Neste caso, a recursão termina quando o valor de &lt;code&gt;n&lt;/code&gt; é zero. Tudo que o exemplo faz é dizer se um número é par ou ímpar através de recursão.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Memória na Recursividade
&lt;/h2&gt;

&lt;p&gt;Sabemos que a recursividade aumenta bastante a legibilidade do nosso código, mas nem tudo é um mar de rosas, principalmente quando se trata de memória na recursão. Como será que funciona a recursividade por debaixo dos panos?&lt;/p&gt;

&lt;p&gt;Numa função recursiva, enquanto a chamada não atinge a condição de término, empilhamos uma invocação na pilha. Quando a condição de término é atingida, as funções empilhadas são executadas uma por uma, da última empilhada até a primeira, até que não haja mais função a ser executada.&lt;/p&gt;

&lt;p&gt;Quando comparadas com laços de iteração, funções recursivas consomem mais memória que laços, visto que cada chamada à função consome mais memória na &lt;a href="https://blog.pantuza.com/artigos/heap-vs-stack"&gt;stack&lt;/a&gt; e um loop não requer espaço extra. Dito isso, pense bem antes de aplicar recursividade no seu projeto, principalmente se desempenho for um fator crucial.&lt;/p&gt;

&lt;p&gt;Alguns pontos a serem ressaltados ao comparar as duas situações são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Iterações terminam quando uma condição se torna falha. As recursões, quando se chega no caso mais básico;&lt;/li&gt;
&lt;li&gt;Iterações não alocam espaços extras na stack;&lt;/li&gt;
&lt;li&gt;Recursões fornecem maior legibilidade ao código. Uma vez que se compreende o processo, fica fácil proceder;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>python</category>
      <category>programming</category>
    </item>
    <item>
      <title>Python: Conceitos e Palavras Reservadas</title>
      <dc:creator>Gustavo Soares</dc:creator>
      <pubDate>Fri, 12 May 2023 20:50:23 +0000</pubDate>
      <link>https://dev.to/iugstav/python-conceitos-e-palavras-reservadas-4740</link>
      <guid>https://dev.to/iugstav/python-conceitos-e-palavras-reservadas-4740</guid>
      <description>&lt;p&gt;&lt;a href="https://dev.to/iugstav/python-tipos-29a2"&gt;Post anterior&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As linguagens de programação precisam de instruções sintaticamente corretas para serem executadas e assim criar um programa funcional. Em Python não seria diferente, até porque ainda não existe programação com a mente, né, então precisamos escrever o código. Mas que tipos de instruções são essas?&lt;/p&gt;

&lt;p&gt;Python é uma linguagem extremamente simples, com poucas palavras reservadas e mesmo assim tem um impacto absurdo em todas as áreas que ela atinge. O alto nível de abstração propõe um modelo de fácil escrita e compreensão até para leigos (cof, cof) e é por isso que é tão bem-quista pelos programadores. Passeando pelas instruções da linguagem, temos:&lt;/p&gt;

&lt;h2&gt;
  
  
  Fluxos de Controle
&lt;/h2&gt;

&lt;p&gt;Nós vimos um exemplo de fluxo de controle no último material, na parte de tipos de dados predefinidos, mas aqui veremos como essa instrução se comporta.&lt;/p&gt;

&lt;p&gt;Quando estamos planejando uma ação, pensamos num caminho linear a ser seguido. No entanto, um só caminho não é o suficiente, pois talvez se torne necessário mudar a forma como as coisas funcionam. Por exemplo, você deve mandar “Bom dia”, “Boa tarde” ou “Boa noite” no grupo da família? Não sei, depende do horário. Aí que entram as estruturas de controle.&lt;/p&gt;

&lt;h3&gt;
  
  
  A Instrução &lt;code&gt;if&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Esse pedaço de comando serve para avaliar se uma condição é verdadeira. Se for, ele executará um fluxo alternativo de código. Se não, ele processará outro bloco de controle &lt;code&gt;else&lt;/code&gt; ou seguirá com a linearidade do código. A instrução &lt;code&gt;else&lt;/code&gt; é opcional.&lt;/p&gt;

&lt;p&gt;Por exemplo, observe o código abaixo:&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="c1"&gt;# número a ser adivinhado
&lt;/span&gt;&lt;span class="n"&gt;numero_secreto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;

&lt;span class="c1"&gt;# número digitado pelo usuáriopython
&lt;/span&gt;&lt;span class="n"&gt;input_usuario&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Digite o seu número: "&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="c1"&gt;# instrução if
&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;input_usuario&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;numero_secreto&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# começo do fluxo alternativo
&lt;/span&gt;    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Que isso, hein! Acertou!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# bloco else de condição não atendida
&lt;/span&gt;    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Eita! Tá errado."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E o output é:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$&amp;gt;&lt;/span&gt; python3 &amp;lt;nome_do_arquivo&amp;gt;.py
Digite o seu número: 20
Eita! Tá errado.

&lt;span class="nv"&gt;$&amp;gt;&lt;/span&gt; python3 &amp;lt;nome_do_arquivo&amp;gt;.py
Digite o seu número: 13
Que isso, hein! Acertou!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O programa acima consiste num código de adivinhação. Nele, criamos a variável &lt;code&gt;numero_secreto&lt;/code&gt; para armazenar o nosso número a ser achado 13 e, logo em seguida, perguntamos o usuário qual número ele deseja tentar a sorte. Então, criamos uma estrutura de controle cuja condição verifica se o número digitado pelo usuário corresponde com o número armazenado em &lt;code&gt;numero_secreto&lt;/code&gt;. Se sim, então ele escreve uma mensagem e se não, escreve outra. Mas ainda está muito simples… Que tal encadearmos mais condições para verificar se o número é maior ou menor?&lt;/p&gt;

&lt;p&gt;Tal requerimento pode ser feito com a instrução &lt;code&gt;elif&lt;/code&gt;, que encadeia blocos condicionais de código após um &lt;code&gt;if&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="c1"&gt;# número a ser adivinhado
&lt;/span&gt;&lt;span class="n"&gt;numero_secreto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;29&lt;/span&gt;

&lt;span class="c1"&gt;# número digitado pelo usuário
&lt;/span&gt;&lt;span class="n"&gt;input_usuario&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Digite o seu número: "&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="c1"&gt;# instrução if
&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;input_usuario&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;numero_secreto&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# começo do fluxo alternativo
&lt;/span&gt;    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Que isso, hein! Acertou!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;input_usuario&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;numero_secreto&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Chutou baixo! Aumenta esse valor aí."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;input_usuario&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;numero_secreto&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Muito alto, colega. De novo!!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E agora no output temos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$&amp;gt;&lt;/span&gt; python3 &amp;lt;nome_do_arquivo&amp;gt;.py
Digite o seu número: 20
Chutou baixo! Aumenta esse valor aí.

&lt;span class="nv"&gt;$&amp;gt;&lt;/span&gt; python3 &amp;lt;nome_do_arquivo&amp;gt;.py
Digite o seu número: 54
Muito alto, colega. De novo!!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Assim, criamos uma estrutura de controle completamente funcional. Ainda podemos combinar Álgebra Booleana com os blocos &lt;code&gt;if&lt;/code&gt; para criar instruções encadeadas com as palavras reservadas &lt;code&gt;or&lt;/code&gt; e &lt;code&gt;and&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Estruturas de repetição
&lt;/h2&gt;

&lt;h3&gt;
  
  
  A Instrução &lt;code&gt;while&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Essa instrução nos permite executar repeticamente um bloco de código enquanto a condição inicial dele for verdadeira. Podemos chamar a instrução while &lt;em&gt;loop&lt;/em&gt;. A sintaxe deste loop pode ser resumida como:&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;while&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;condicao&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;#bloco de código a ser repetido
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Olhando o exemplo da instrução &lt;code&gt;if&lt;/code&gt;, eu gostaria que esse programa rodasse até que o usuário adivinhasse o número. Para isso, podemos implementar a estrutura de repetição &lt;code&gt;while&lt;/code&gt; e, quando o usuário acertar o número secreto, negar a condição inicial, como no código abaixo:&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="c1"&gt;# número a ser adivinhado
&lt;/span&gt;&lt;span class="n"&gt;numero_secreto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;
&lt;span class="n"&gt;esta_rodando&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;

&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;esta_rodando&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# número digitado pelo usuário
&lt;/span&gt;    &lt;span class="n"&gt;input_usuario&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Digite o seu número: "&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

    &lt;span class="c1"&gt;# instrução if
&lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;input_usuario&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;numero_secreto&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# começo do fluxo alternativo
&lt;/span&gt;        &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Que isso, hein! Acertou!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;esta_rodando&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;

    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;input_usuario&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;numero_secreto&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Chutou baixo! Aumenta esse valor aí."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;input_usuario&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;numero_secreto&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Muito alto, colega. De novo!!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Acabou o jogo"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E o novo output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Digite o seu número: 10
Chutou baixo! Aumenta esse valor aí.
Digite o seu número: 15
Muito alto, colega. De novo!!
Digite o seu número: 13
Que isso, hein! Acertou!
Acabou o jogo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Até acertarmos o número, o código estava rodando &lt;em&gt;loop&lt;/em&gt;, executando o mesmo bloco de processamento. Quando acertamos, o bloco de código referente ao &lt;code&gt;if&lt;/code&gt; de acerto executado, o resto do código foi lido e, logo no próximo loop, a condição foi negada.&lt;/p&gt;

&lt;h3&gt;
  
  
  A Instrução &lt;code&gt;for..in&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;A estrutura de repetição &lt;code&gt;for..in&lt;/code&gt; é outra instrução de &lt;em&gt;loop&lt;/em&gt;, mas em vez de rodar até uma condição ser negada, ela roda dentro de um intervalo de números inteiros. Com o intervalo estabelecido, o bloco de processamento declarado dentro do &lt;code&gt;for&lt;/code&gt; se repete até que o fim do intervalo seja alcançado.&lt;/p&gt;

&lt;p&gt;Para criar um intervalo sem valores predefinidos, temos a função &lt;code&gt;range()&lt;/code&gt; que recebe dois parâmetros: o começo do intervalo e o seu fim, ambos inteiros. A função pode, ainda, receber somente um parâmetro, que é o fim do intervalo. Nesse caso, a função começaria a contar do primeiro valor possível até o fim passado. O intervalo gerado pela função range é &lt;em&gt;exclusivo&lt;/em&gt;, ou seja, ele conta o fim do intervalo - 1. &lt;/p&gt;

&lt;p&gt;Chamamos essa ato de percorrer um intervalo finito de &lt;em&gt;iteração&lt;/em&gt;. Portanto, &lt;em&gt;loop&lt;/em&gt; &lt;code&gt;for..in&lt;/code&gt; itera sobre um intervalo. Segue um exemplo dessa repetição abaixo:&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;resultado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

&lt;span class="c1"&gt;# declaração do loop
&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;numero&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&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;10&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;resultado&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;numero&lt;/span&gt;

&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resultado&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E o output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$&amp;gt;&lt;/span&gt; python3 &amp;lt;nome_do_arquivo&amp;gt;.py
45
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Além de intervalos gerados, podemos utilizar listas de inteiros ou até strings. Mas como vamos iterar sobre strings se uma string não é um intervalo de números? É aí que tá a brincadeira.&lt;/p&gt;

&lt;p&gt;As strings em python são listas de caracteres, logo ela tem uma posição inicial e uma final, isto é, um intervalo. A partir daí o que Python implicitamente faz é acessar a posição da string referente ao número do intervalo. Vejamos um exemplo disso abaixo:&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;mensagem&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Olá Mundo!"&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;letra&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;mensagem&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;letra&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No caso acima, &lt;code&gt;mengasem&lt;/code&gt; é interpretada como um range da posição 0 até o tamanho da string e &lt;code&gt;letra&lt;/code&gt; se torna o elemento da lista na posição correspondente ao número do range. Por exemplo, se &lt;code&gt;mensagem&lt;/code&gt; criasse o intervalo [0, 5]  e eu estivesse no momento 3 do intervalo, &lt;code&gt;letra&lt;/code&gt; seria &lt;code&gt;mensagem[3]&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  A Instrução &lt;code&gt;break&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;A instrução &lt;code&gt;break&lt;/code&gt; é usada para sair de uma estrutura de repetição no meio de sua execução, mesmo se o intervalo não foi finalizado ou a condição não foi negada.&lt;/p&gt;

&lt;h3&gt;
  
  
  A Instrução &lt;code&gt;continue&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;A instrução &lt;code&gt;continue&lt;/code&gt; é usada para pular o resto das instruções restantes de um &lt;em&gt;loop&lt;/em&gt; e pular para a próxima iteração do mesmo.&lt;/p&gt;

&lt;p&gt;Aqui, terminamos o básico sobre instruções em Python e começamos a utilizar os conceitos apresentados para formar scripts de grande impacto. Condições e iterações são só o dedo mindinho do que a linguagem oferece. Um passo de cada vez até a elegância.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/iugstav/python-funcoes-4dni"&gt;Próximo post&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>tutorial</category>
      <category>programming</category>
    </item>
    <item>
      <title>Python: Tipos</title>
      <dc:creator>Gustavo Soares</dc:creator>
      <pubDate>Wed, 03 May 2023 18:41:14 +0000</pubDate>
      <link>https://dev.to/iugstav/python-tipos-29a2</link>
      <guid>https://dev.to/iugstav/python-tipos-29a2</guid>
      <description>&lt;p&gt;&lt;a href="https://dev.to/iugstav/python-o-comeco-de-tudo-2bjh"&gt;Post anterior&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As linguagens de programação são um meio para expressar instruções para um computador realizar uma determinada tarefa. Um elemento fundamental dessas linguagens são os tipos de dados, que permitem representar informações de diferentes formas, tal como números, textos, o cachorro da vizinha, entre outros. A escolha dos tipos de dados pode ter um grande impacto na clareza e eficiência do código. Por exemplo, uma linguagem que permite a manipulação precisa de números reais ( 

&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;R\Reals &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathbb"&gt;R&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
) pode ser ideal para cálculos científicos. &lt;/p&gt;

&lt;p&gt;Python, por sua vez, possui tipagem dinâmica e forte, mas o que isso nos diz? Para entender esses conceitos, primeiro vamos entender o que vem a ser um sistema de tipos.&lt;/p&gt;
&lt;h2&gt;
  
  
  Tipagem
&lt;/h2&gt;

&lt;p&gt;Bom, um sistema de tipos é feito de tipos. Só por essa frase eu já merecia um Nobel.&lt;/p&gt;

&lt;p&gt;Brincadeiras à parte, na verdade, para entender os sistemas de tipos, temos que dar mais um passo para trás e entender o que seria a sintaxe e a semântica de uma linguagem.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;sintaxe&lt;/strong&gt; dita as regras que instruções devem ser seguir para que um programa de uma determinada linguagem as execute corretamente. Um exemplo disso é a criação de variáveis em Python, onde você declara seu nome, seguido de um sinal de igual &lt;code&gt;=&lt;/code&gt; e o valor que será atribuido à variavel.&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="c1"&gt;# &amp;lt;nome_da_variavel&amp;gt; = &amp;lt;valor&amp;gt;
&lt;/span&gt;&lt;span class="n"&gt;usuario&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Fulaninho&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;nota&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Podemos ver claramente uma estrutura a ser seguida para que o interpretador entenda que estamos criando uma variável e atribuindo um valor a ela. Qualquer coisa fora dessa regra é tratado como &lt;em&gt;erro sintático&lt;/em&gt; quando o programa for executado.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;semântica&lt;/strong&gt;, por sua vez, atribui um significado e dita o comportamento por trás desses termos da linguagem. A semântica do exemplo citado acima seria:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Uma variável de nome `usuario` é criada;
2. a string `Fulaninho` é atribuída a essa variável;
3. Outra variável de nome `nota` é criada;
4. O número 8 é atribuído a ela;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Partindo dos conceitos de sintaxe e semântica, podemos tomar as seguintes afirmações:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Matematicamente falando, o número 8 faz parte do conjunto dos inteiros (
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;Z\Z &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathbb"&gt;Z&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
);&lt;/li&gt;
&lt;li&gt;No trecho de código acima, a variável &lt;code&gt;nota&lt;/code&gt; recebe o valor 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;8∈Z8 \in \Z &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;8&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;∈&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathbb"&gt;Z&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
;&lt;/li&gt;
&lt;li&gt;Logo, se 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;nota=8nota=8 &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;n&lt;/span&gt;&lt;span class="mord mathnormal"&gt;o&lt;/span&gt;&lt;span class="mord mathnormal"&gt;t&lt;/span&gt;&lt;span class="mord mathnormal"&gt;a&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;8&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
 e 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;8∈Z8 \in \Z &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;8&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;∈&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathbb"&gt;Z&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
, logo 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;nota∈Znota \in \Z &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;n&lt;/span&gt;&lt;span class="mord mathnormal"&gt;o&lt;/span&gt;&lt;span class="mord mathnormal"&gt;t&lt;/span&gt;&lt;span class="mord mathnormal"&gt;a&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;∈&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathbb"&gt;Z&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Decorrente das afirmações, foi visto que a variável é inteira e, com isso, podemos afirmar que sua faixa de valores está restrita ao conjunto dos inteiros. Dito isso, podemos inferir que um tipo trabalha como uma regra, adicionando semântica a algum dado. Se um tipo é uma regra, então um sistema de tipos pode ser compreendido como um conjunto dessas regras. &lt;/p&gt;

&lt;p&gt;Quando dizemos que o sistema de tipos de Python é dinâmico e forte, isso implica diretamente na forma como escrevemos e entendemos código.&lt;/p&gt;

&lt;p&gt;O dinamismo de um sistema de tipos em uma linguagem de programação nos diz que os tipos atribuídos aos termos da linguagem podem mudar ao longo da execução do programa, ou seja, não há um mecanismo de verificação estática de tipos. O oposto de um sistema de tipos dinâmico é chamado de &lt;em&gt;sistema de tipos estático&lt;/em&gt;, onde a vinculação de tipos aos elementos do código ocorre numa etapa antes da execução.&lt;/p&gt;

&lt;p&gt;Já a força de um sistema de tipos está atrelada a intensidade da ligação de um tipo com algum elemento da linguagem. Viajei legal? Então pensa comigo: se um tipo adiciona semântica a um termo, esse vínculo pode ter uma força, tal como forte ou fraco, e essa força vai medir o comportamento desse vínculo ao longo da execução do programa.&lt;/p&gt;

&lt;p&gt;Podemos categorizar um vínculo de tipo-termo como forte quando durante a execução, o termo sofre poucas ou nenhuma alteração de significado, ou seja, seu tipo se mantém sem conversões implícitas. Já um vínculo fraco seria o oposto, podendo produzir código com diversas conversões implícitas de tipo e resultados imprevisíveis.&lt;/p&gt;

&lt;p&gt;Na verdade, esse debate sobre tipagem forte ou fraca se refere à segurança de um sistema de tipos, já que tudo que é falado é se seus tipos serão convertidos sem sua permissão ou não. Uma definição de “segurança” que se encaixa nesse contexto é:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Segurança: Se qualquer tentativa de interpretar mal os dados é pega em tempo de compilação ou gera um erro específico para isso em tempo de execução&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Às vezes, linguagens ou ferramentas pouco seguras são necessárias e o contrário também é válido. Uma possibilidade não exclui a outra e se excluísse eu não estaria aqui falando sobre esse conceito.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tipos Predefinidos em Python
&lt;/h2&gt;

&lt;p&gt;Existem vários tipos de dados que podem ser usados para representar diversos tipos de informações. Dentre eles, temos os tipos de dados predefinidos da linguagem e os definidos pelo usuário. Dentre os predefinidos, temos:&lt;/p&gt;

&lt;h3&gt;
  
  
  Números
&lt;/h3&gt;

&lt;p&gt;Os números em Python podem ser inteiros, de ponto flutuante ou complexos. Os números inteiros são representados pelo tipo &lt;code&gt;int&lt;/code&gt;, enquanto os números de ponto flutuante são representados pelo tipo &lt;code&gt;float&lt;/code&gt;. Os números complexos são representados pelo tipo &lt;code&gt;complex&lt;/code&gt;, que consiste em uma parte real e uma parte imaginária.&lt;/p&gt;

&lt;p&gt;O tipo &lt;code&gt;int&lt;/code&gt; é usado para representar números inteiros positivos ou negativos (
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;Z\Z &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathbb"&gt;Z&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
). Python é capaz de lidar com inteiros de tamanho arbitrário, o que significa que não há limite para o tamanho do número que pode ser armazenado. Isso é útil para cálculos que envolvem números muito grandes.&lt;/p&gt;

&lt;p&gt;O tipo &lt;code&gt;float&lt;/code&gt; é usado para representar números reais (
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;R\R &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathbb"&gt;R&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
), com casas decimais. Embora os números de ponto flutuante tenham uma precisão limitada, eles são úteis para cálculos que envolvem frações decimais, como cálculos financeiros ou científicos.&lt;/p&gt;

&lt;p&gt;O tipo &lt;code&gt;complex&lt;/code&gt; é usado para representar números complexos (
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;C\Complex &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathbb"&gt;C&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
), que consistem em uma parte real e uma parte imaginária. Esses números são úteis para cálculos que envolvem fases ou oscilações, como em processamento de sinais ou imagens.&lt;/p&gt;

&lt;p&gt;Abaixo temos exemplos de cada um dos tipos:&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="c1"&gt;# int
&lt;/span&gt;&lt;span class="n"&gt;idade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;23&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;# float
&lt;/span&gt;&lt;span class="n"&gt;nota_p1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;4.6&lt;/span&gt;

&lt;span class="c1"&gt;# complexos podem ser definidos dos dois jeitos abaixo
&lt;/span&gt;&lt;span class="n"&gt;complexo&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="mf"&gt;3j&lt;/span&gt;
&lt;span class="n"&gt;complexo_funcao&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;complex&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;# 1 + 2j
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Booleanos
&lt;/h3&gt;

&lt;p&gt;Os valores booleanos em Python são &lt;code&gt;True&lt;/code&gt; (verdadeiro) e &lt;code&gt;False&lt;/code&gt; (falso). Esses valores são usados para avaliar condições em programas Python. Por exemplo, se uma condição for verdadeira, um determinado bloco de código será executado. Se a condição for falsa, o bloco de código será ignorado. Quem nunca fez gambiarra em condicionais, que atire a primeira pedra!&lt;/p&gt;

&lt;p&gt;Os valores booleanos também são usados para fazer comparações entre valores. Por exemplo, se o valor de uma variável é maior que outro, a expressão retornará &lt;code&gt;True&lt;/code&gt;. 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="n"&gt;passou_em_calculo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;passou_em_calculo&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="bp"&gt;True&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;Parabéns! Você passou!!!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&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;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;Eita, colega... E vamos de chorar.&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;No trecho de código acima, temos uma variável &lt;code&gt;passou_em_calculo&lt;/code&gt; que recebe o booleano &lt;code&gt;True&lt;/code&gt;. Logo em seguida, temos uma condicional que escreve uma mensagem no terminal se a variável for True e outra mensagem se for False. Se você rodar o código abaixo, terá o resultado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$&amp;gt; Parabéns! Você passou!!!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Sequências
&lt;/h3&gt;

&lt;p&gt;As sequências em Python são usadas para representar uma coleção ordenada de valores. Existem três tipos principais de sequências em Python: listas, tuplas e strings.&lt;/p&gt;

&lt;p&gt;As listas são os arrays de Python. São coleções mutáveis de valores ordenados, que podem ser alteradas adicionando, removendo ou modificando os elementos da lista. As listas são definidas entre colchetes (&lt;code&gt;[]&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;As tuplas são semelhantes às listas, mas são imutáveis. Isso significa que uma vez que uma tupla é criada, seus elementos não podem ser alterados. As tuplas são definidas entre parênteses (&lt;code&gt;()&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;As strings são sequências de caracteres que representam texto. As strings são imutáveis em Python, o que significa que uma vez criada, uma string não pode ser alterada. Isso significa que quando você altera uma string, na verdade está criando uma nova string com as modificações desejadas. As strings são definidas entre aspas simples (&lt;code&gt;''&lt;/code&gt;) ou duplas (&lt;code&gt;""&lt;/code&gt;). Strings podem, ainda, ser escritas em diversas linhas utilizando aspas triplas (&lt;code&gt;””” ”””&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Abaixo temos exemplos de sequências:&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="c1"&gt;# lista de strings
&lt;/span&gt;&lt;span class="n"&gt;compras_mercado&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;banana&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;aveia&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;pão&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# tupla de floats
&lt;/span&gt;&lt;span class="n"&gt;coordenadas&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;23.588254&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;46.632477&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# string
&lt;/span&gt;&lt;span class="n"&gt;mensagem&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;viu como é fácil criar sequências?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Você pode, ainda, escrever cada uma dessas variáveis no terminal com a função &lt;code&gt;print()&lt;/code&gt;, basta escrever o nome da variável desejada entre os parênteses.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sets ou Conjuntos
&lt;/h3&gt;

&lt;p&gt;Os conjuntos em Python são usados para representar uma coleção não ordenada e mutável de valores únicos. Os conjuntos são definidos entre chaves (&lt;code&gt;{}&lt;/code&gt;). O set em si é mutável, mas seus elementos devem ser imutáveis&lt;/p&gt;

&lt;p&gt;O trecho abaixo ilustra a criação de um Set pela função &lt;code&gt;set()&lt;/code&gt; com o valor que será convertido num set entre os parênteses.&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="c1"&gt;# lista de inteiros
&lt;/span&gt;&lt;span class="n"&gt;lista_repetida&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="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="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;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# set a partir de uma lista
&lt;/span&gt;&lt;span class="n"&gt;set_unico&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lista_repetida&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;set_unico&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se você rodar o código, terá o resultado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$&amp;gt; {1, 2, 3, 4}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Dicts ou Dicionários
&lt;/h3&gt;

&lt;p&gt;Os dicionários em Python são usados para representar uma coleção de pares chave-valor. Cada chave deve ser única e é associada a um valor. Os dicionários são definidos entre chaves (&lt;code&gt;{}&lt;/code&gt;), com a chave se separando do valor por por dois pontos (&lt;code&gt;:&lt;/code&gt;) e cada par chave-valor se separando por vírgula.&lt;/p&gt;

&lt;p&gt;O exemplo abaixo ilustra a criação de um Dict:&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;dados_jogador&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;Pedro&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;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;apelido&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;queixada&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;time&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;flamengo&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="n"&gt;dados_jogador&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O resultado deste 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="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;Pedro&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;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;apelido&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;queixada&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;time&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;flamengo&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;&lt;a href="https://dev.to/iugstav/python-conceitos-e-palavras-reservadas-4740"&gt;Próximo post&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>programming</category>
    </item>
    <item>
      <title>Python: O Começo de Tudo</title>
      <dc:creator>Gustavo Soares</dc:creator>
      <pubDate>Wed, 03 May 2023 18:22:36 +0000</pubDate>
      <link>https://dev.to/iugstav/python-o-comeco-de-tudo-2bjh</link>
      <guid>https://dev.to/iugstav/python-o-comeco-de-tudo-2bjh</guid>
      <description>&lt;p&gt;&lt;a href="https://dev.to/iugstav/python-tipos-29a2"&gt;Próximo post&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Disclaimer
&lt;/h2&gt;

&lt;p&gt;Este material não retrata a instalação da linguagem, logo, é destinado a quem já instalou Python e deseja explorar suas características e fundamentos. Assumo que a instalação da linguagem e a configuração do ambiente já foram realizadas.&lt;/p&gt;

&lt;p&gt;Caso não tenha a feito, pode acompanhar um dos links abaixo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://python.org.br/instalacao-windows/" rel="noopener noreferrer"&gt;https://python.org.br/instalacao-windows/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://python.org.br/instalacao-linux/" rel="noopener noreferrer"&gt;https://python.org.br/instalacao-linux/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://python.org.br/instalacao-mac/" rel="noopener noreferrer"&gt;https://python.org.br/instalacao-mac/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Todos os tópicos apresentados nesta introdução serão revisitados com maior aprofundamento a medida que os conteúdos forem apresentados. Caso não entenda algum tópico, não se desespere! Você não é obrigado a saber tudo sobre qualquer coisa. Procure saber o termo ou o tópico específico e, após entender, volte a ler esse material, pois um conteúdo se liga a outro e assim por diante.&lt;/p&gt;

&lt;p&gt;Dito isso, seguimos com o material.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Houve inúmeras mudanças na computação das últimas décadas até hoje. As máquinas ficaram mais poderosas, a complexidade dos softwares aumentou e novos desafios foram surgindo. Com isso, foram se criando ambientes onde a produtividade de quem estivesse desenvolvendo o software era mais valorizada em prol da performance bruta da execução.&lt;/p&gt;

&lt;p&gt;Seguindo esse raciocínio, seria inviável pensar em produtividade e ainda assim escrever Assembly ou C. A galera só queria um javascript da vida que suprisse as necessidades do software sem sacrificar o desenvolvedor! Foi nesse contexto que nasceu Python.&lt;/p&gt;

&lt;p&gt;Python é uma linguagem de script (&lt;a href="https://pt.stackoverflow.com/a/17112" rel="noopener noreferrer"&gt;O que é uma linguagem de script?&lt;/a&gt;) de alto nível, multiparadigma, interpretada e dinamicamente tipada cuja filosofia preza pela simplicidade e legibilidade. Python é aquela linguagem que torna tudo mais fácil – inclusive te humilhar lembrando daquele seu programa em C++ que você gastou 3 noites em claro e usou 510 linhas (talvez eu tenha levado pro pessoal) para fazer. Brincadeiras à parte, Python é extremamente poderosa nas áreas que ela tange, que são principalmente computação científica, Ciência de Dados e desenvolvimento de websites.&lt;/p&gt;

&lt;p&gt;Embora Python sacrifique performance pensando na experiência do desenvolvedor, isso não significa que a linguagem seja uma lesma. As comparações são comumente feitas com linguagens de médio nível com propósitos diferentes aos de Python, como C++ e Java, que atuam nas mesma áreas, mas com outras prioridades.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sintaxe
&lt;/h2&gt;

&lt;p&gt;O propósito da linguagem é ter uma sintaxe mais próxima do ser humano a fim de simplificar o processo de entendimento do código, a tão falada &lt;strong&gt;expressividade&lt;/strong&gt;. Para isso, Python utiliza paravras reservadas simples e próximas do inglês, o que facilita o raciocínio criado por desenvolvedores.&lt;/p&gt;

&lt;p&gt;Uma linguagem expressiva garante ao usuário da linguagem formas mais claras e concisas de escrever executáveis corretamente, mas fica ao cargo de quem programa escrever códigos expressivos.&lt;/p&gt;

&lt;p&gt;Um dos aspectos mais marcantes de Python é o uso de indentação para marcar blocos de código. Diferente das linguagens que usam chaves &lt;code&gt;{}&lt;/code&gt; ou palavras reservadas como &lt;code&gt;do ... end&lt;/code&gt; para delimitar um escopo ou bloco de código, Python define os escopos do programa por meio &lt;em&gt;tabs&lt;/em&gt; ou espaços no seu código. Isso torna o código mais legível e organizado, mas também cria maiores chances de quebrar o programa ao esquecer a indentação de alguma parte do mesmo. É essencial manter a consistência na hora de indentar seu programa.&lt;/p&gt;

&lt;p&gt;Para garantir as boas práticas de desenvolvimento, existe um conjunto de princípios em Python chamado &lt;strong&gt;Zen of Python&lt;/strong&gt; que nos garante que certas regras sejam seguidas para que mantenhamos nosso sistema coeso. afinal, a vida não é um morango para você ignorar as regras.&lt;/p&gt;

&lt;p&gt;Algumas verdades do Zen of Python são:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Beautiful is better than ugly. &lt;em&gt;(Bonito é melhor que feio)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Explicit is better than implicit. &lt;em&gt;(Explícito é melhor que implícito)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Simple is better than complex. &lt;em&gt;(Simples é melhor que complexo)&lt;/em&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Esses princípios são guias úteis para escrever códigos mais claros e legíveis. Não se preocupe em memorizá-los de imediato; com o tempo, eles se tornarão naturais.&lt;/p&gt;

&lt;h2&gt;
  
  
  Execução da Linguagem
&lt;/h2&gt;

&lt;p&gt;Python é uma linguagem interpretada, o que significa que não é necessário compilar o código antes de executá-lo. Em vez disso, o interpretador de Python executa o código linha por linha, o que oferece vantagens como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Facilidade de Depuração&lt;/strong&gt;: Você pode parar o programa a qualquer momento para examinar o estado atual e identificar erros.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Portabilidade&lt;/strong&gt;: O código Python é executado em diferentes plataformas sem necessidade de recompilação.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No entanto, a interpretação também pode ter algumas desvantagens em relação à performance do programa. Como o interpretador precisa ler o código em tempo real, linha por linha, e executar as instruções correspondentes, a execução do código pode ser mais lenta se for comparada à execução de linguagens compiladas. Apesar da perda de performance, para muitas aplicações, como scripts de automação e prototipagem rápida, essa diferença é insignificante dado o contexto em que essas aplicações estão inseridas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Primeiros passos
&lt;/h2&gt;

&lt;p&gt;Dadas as boas-vindas, vamos escrever um programa que mostra &lt;code&gt;hello world!&lt;/code&gt; no terminal. Se você instalou Python com sucesso, já deve ter acesso ao interpretador via terminal. Ele pode ser ativado digitando &lt;code&gt;python3&lt;/code&gt;, &lt;code&gt;python&lt;/code&gt; ou &lt;code&gt;py&lt;/code&gt;, dependendo da configuração e do seu sistema operacional.&lt;/p&gt;

&lt;p&gt;Ao digitar &lt;code&gt;python3&lt;/code&gt;, &lt;code&gt;python&lt;/code&gt; ou até &lt;code&gt;py&lt;/code&gt; e pressionar a tecla &lt;strong&gt;enter&lt;/strong&gt; você pode acessar o interpretador da linguagem no terminal, que interpretará seus scripts e mostrar seus resultados em seguida. Lá, você pode testar funções, listas de comandos e afins.&lt;/p&gt;

&lt;p&gt;Com o prompt aberto, você verá a escrita &lt;code&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/code&gt; no início da linha com algo similar a isso:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu5la7345ekv3efswwul7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu5la7345ekv3efswwul7.png" alt="O ambiente REPL da linguagem Python" width="800" height="191"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora, digite o comando abaixo e, em seguida, aperte &lt;strong&gt;enter&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;hello world!&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;Pronto! Você acabou de escrever um script em Python que exibe uma mensagem no terminal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fato curioso&lt;/strong&gt;: Caso queira muito ver os princípios do &lt;em&gt;Zen of Python&lt;/em&gt;, você pode digitar &lt;code&gt;import this&lt;/code&gt; nesse mesmo prompt e esse comando escreverá na tela os princípios em inglês.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exemplo prático adicional&lt;/strong&gt;: O código abaixo cria uma lista e exibe seus elementos no terminal.&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;frutas&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;maçã&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;banana&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;laranja&lt;/span&gt;&lt;span class="sh"&gt;"&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;fruta&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;frutas&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;fruta&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O resultado será:&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;maçã&lt;/span&gt;
&lt;span class="n"&gt;banana&lt;/span&gt;
&lt;span class="n"&gt;laranja&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;Pronto! Você escreveu um script em Python que mostra a mensagem &lt;code&gt;hello world!&lt;/code&gt; no terminal. Existe uma infinidade de possibilidades no universo de Python e esse foi só o pontapé inicial para algo grandioso. Caso sinta dificuldade para assimilar os construtos ou as características da linguagem, não se desanime! O começo não é fácil, mas não se deixe levar pelo medo, afinal, só vive o propósito quem suporta o processo.&lt;/p&gt;

&lt;p&gt;Explore bibliotecas populares como NumPy para matemática, Flask para desenvolvimento web ou Pandas para análise de dados. E lembre-se: o mais importante é continuar praticando e explorando.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/iugstav/python-tipos-29a2"&gt;Próximo post&lt;/a&gt;&lt;/p&gt;

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