·

Ciência e Tecnologia ·

Linguagens de Programação

Envie sua pergunta para a IA e receba a resposta na hora

Fazer Pergunta

Texto de pré-visualização

AULA 1 1 FUNÇÕES Introdução a Funções Algoritmo tem como definição ser conjunto das regras e procedimentos lógicos perfeitamente definidos que levam à solução de um problema em um número finito de etapas Porém quanto maior for o problema mais importante se torna o processo de subdividilo em problemas menores que sejam mais fáceis de serem compreendidos e solucionados Este processo é conhecido como subalgoritmos ou como modularização É uma prática que deve ser utilizada sempre que um projeto de construção de um sistema complexo esteja envolvido Assim podemos modularizar o código usando funções que resolvam comandos específicos para aquela situação do problema A importância do uso de funções se dá pois divide o programa em partes gerenciáveis de forma independente evita um código fluido muito grande permite o reuso do código evita repetições de um mesmo código dentro do programa facilitando a manutenção e o entendimento 1 FUNÇÕES 11 Funções Uma função é uma sequência de comandos que executa uma tarefa a qual tem como objetivo organizar o código segmentandoo em partes para a solução de um problema A sintaxe da função é dividida em três partes nome parâmetros e área de comandos a qual agrupa a sequência de linhas de código que representará algum comportamento Observação parâmetros são variáveis inicializadas com valores indicados durante a chamada invocação da função A palavra reservada def é usada para a definição da função é uma palavrachave que indica uma definição de função As regras para nomes de função são as mesmas que as das variáveis letras números e sublinhado são utilizados mas o primeiro caractere não pode ser um número Não podemos usar uma palavrachave como nome de uma função e devemos evitar ter uma variável e uma função com o mesmo nome Os parênteses vazios depois do nome indicam que a função não usa argumentos Se tiverem argumentos são chamados também de parâmetros A primeira linha da definição de função chamase cabeçalho o resto é chamado de corpo O cabeçalho precisa terminar em dois pontos e o corpo precisa ser indentado Por convenção a indentação sempre é de quatro espaços O corpo pode conter qualquer número de instruções As strings nas instruções de exibição são limitadas por aspas duplas As aspas simples e as aspas duplas fazem a mesma coisa a maior parte das pessoas usa aspas simples apenas nos casos em que aspas simples que também são apóstrofes aparecem na string A instrução de definição de função em Python tem este formato geral Quando há retorno de valor na função usase a instrução return que devolve para o invocador da função o resultado de sua execução Exemplo de declaração de função em Python Nome da função hello Tem como objetivo imprimir o nome que é passado por parâmetro argumento Entre parênteses estão os parâmetros seguidos por dois pontos No exemplo anterior nome é passado por parâmetro Ainda nesta linha é fundamental o uso de dois pontos os quais indicam que o código indentado nas próximas linhas faz parte desta função Para indentar o código devese seguir a sintaxe da linguagem da linha dois em diante há um avanço relação à linha um Podese ainda criar funções com vários ou nenhum argumento Por exemplo São funções próprias do Python print input int 1 FUNÇÕES 12 Fluxo de execução Em programação é importante definir as ordens em que as instruções serão executadas principalmente para a garantia do bom funcionamento do código no uso de funções Esse processo se chama fluxo de execução A execução começa com a descrição da primeira linha de instrução do programa e assim por diante em sua sequência sempre do topo para o fim Quando se trata das funções sabese que elas não alteram o fluxo da execução do programa porém os comandos do corpo da função só serão executados quando a função for chamada A chamada da função é um desvio no fluxo de execução O código para sua execução quando a função é chamada e vai diretamente para os comandos do corpo da função em que executa os comandos e só então volta para a execução do código a fim de continuar seu fluxo Não se pode esquecer porém que uma função pode chamar outra Assim o código executará o corpo da outra função e só retornará ao fluxo quando todas as funções terminarem seus comandos Python não perde a linha de fluxo ou seja continua normalmente de onde parou quando acabam as funções Ao final do programa ele encerra o fluxo de execução 1 FUNÇÕES 13 Rotina Questões de rotina que são utilizadas várias vezes em um código podem ser simplificadas com funções Por exemplo um cálculo habitual que é necessário ser executado várias vezes no código a soma de duas variáveis a e b Solução em uma função para calcular A saída será E se quisermos imprimir na tela um formato padrão de saída em que um conjunto de e outra linha com traços apareçam entre a nossa mensagem Podemos criar uma função de formatação de saída A saída será 1 FUNÇÕES 14 Funções com resultado e funções nulas Algumas funções devolvem resultados funções matemáticas ou com parâmetro definido porém existem funções que executam uma ação mas não devolvem nenhum resultado Essas são chamadas de funções nulas Por exemplo quando uma função gera um resultado um retorno e não é armazenada em nenhum lugar seu resultado será perdido O comando mathsqrt calcula a raiz quadrada de 16 mas como não é guardado nem mostra seu retorno não há utilidade para esse resultado As funções nulas não têm valor de retorno porém se você tentar mostrar um resultado dela será atribuído o valor None Saída A saída da função hello foi o print do nome em sua chamada neste exemplo João da Silva porém quando atribuímos à variável oi o retorno desta função foi atribuído o valor None 1 FUNÇÕES 15 Variáveis locais e Variáveis globais Uma variável é chamada global se ela for criada fora de qualquer função Essa variável pode ser visível por todas as funções assim como qualquer função pode alterála A organização do programa se subdivide em funções que têm seus comandos e variáveis locais e o programa principal no qual as variáveis são globais Saída Uma observação importante é que não se pode incrementar essa variável global em uma função antes da variável ter sido criada Por exemplo Saída Esta função dará este erro pois o x está sendo manipulado antes de ser declarado Porém se ele for declarado mais a frente há como estabelecer essa perspectiva de variável global usando a denominação global A solução seria Saída Da mesma forma se uma variável local de uma função for chamada no programa principal dará um erro Por exemplo Saída A variável c foi criada dentro da função f e aquela só existe dentro desta c é uma variável local da função f Da mesma forma anterior uma solução viável é declarar c como uma variável global e mitigar esse erro Saída Importante O uso de variáveis globais deve ser evitado pois é uma causa comum de erros Afinal partes do código assim como outras funções podem usar e alterar as variáveis globais o que gera dependência das partes e também interferências muitas vezes indesejadas 2 REFERÊNCIAS BORGES L E Python para desenvolvedores Rio de Janeiro Edição do Autor 2009 Disponível em httpwwwdominiopublicogovbrdownloadtextoea000474pdf Acesso em 10 ago 2021 PERKOVIC L Introdução à computação usando Python um foco no desenvolvimento de aplicações Rio de Janeiro LTC 2016 RIBEIRO J A Introdução à Programação e aos Algoritmos Rio de Janeiro LTC 2019 WAZLAWICK R S Introdução a Algoritmos e Programação com Python uma abordagem dirigida por testes Rio de Janeiro Elsevier 2018 AULA 2 1 VETORES MATRIZES E LISTAS VETORES Os vetores são estruturas compostas Eles têm seu primeiro elemento na posição 0 zero Assim se tomarmos n como sendo o tamanho do vetor a última posição é a de índice n1 Um vetor de tamanho 10 n10 tem seu último elemento na posição 9 Por exemplo um vetor de cinco elementos terá suas posições 0 1 2 3 4 Valores dentro de cada posição do vetor 5 8 6 4 2 Neste exemplo os valores que estão nas posições são 5 8 6 4 2 ou seja na posição 0 do vetor está armazenado o valor numérico 5 na posição 1 terá o valor 8 armazenado e assim por diante O vetor por ser unidimensional precisa de apenas um índice para acesso aos elementos enquanto as matrizes ndimensionais necessitam de um índice para cada dimensão a fim de acessar os itens da matriz 2 MATRIZES As matrizes são a implementação dos vetores porém em duas dimensões ou seja bidimensionais Por exemplo uma matriz de dez elementos sendo duas linhas e cinco colunas Ela terá suas posições 00 0102 03 04 11 12 13 14 sendo que a linha 0 terá as colunas de 0 a 4 assim como a linha 1 terá igualmente as cinco colunas de 0 a 4 Vetores e matrizes em Python são representados como listas ou por meio do pacote de extensão Python conhecido como NumPy que será apresentado a seguir 2 MATRIZES 21 Numerical Python NumPy É um pacote de extensão do Python para matrizes multidimensionais e possui as seguintes características é eficiente é um objeto de matriz de itens homogêneos arbitrários realiza operações matemáticas eficientes com matrizes é possível utilizar para cálculos como álgebra linear transformadas de Fourier ou a geração de números aleatórios Sintaxe do numpy import numpy as np 2 MATRIZES 22 Matrizes e Submatrizes Inserindo uma sequência numérica usando o método do numpy nparange 10 A saída será os números inteiros de 0 a 9 É possível ainda na saída limitar os elementos a serem apresentados na tela O valor da matriz não mudará apenas a saída será dos primeiros cinco elementos Para mostrar elementos específicos como uma submatriz A saída será especificamente os elementos de 4 a 7 Ou ainda a submatriz dos elementos pares começando de zero A saída será Ou a submatriz dos elementos somados de 3 em 3 começando de 1 A saída será Por fim os números apresentados de forma invertida Com a saída Os vetores ou matrizes unidimensionais podem ser tratados da mesma forma que as matrizes com comandos semelhantes porém com a devida dimensão definida 2 MATRIZES 23 Criação de Matriz bidimensional com números aleatórios A saída será um conjunto com três linhas e quatro colunas cada populado com números aleatórios gerados pelo compilador Pode ainda ser apresentado com especificidades assim como os vetores comentados anteriormente Neste exemplo será trabalhada uma matriz de duas linhas e três colunas E a saída será Outro exemplo é a apresentação da matriz inversa a que foi definida anteriormente de forma aleatória O código que contempla essa inversão é a apresentação da matriz x2 com 1 A saída será 2 MATRIZES 24 Divisão da matriz em outras matrizes A divisão de vetores ou matrizes pode ser implementada pelas funções npsplit nphsplit e npvsplit Para cada uma delas podemos passar uma lista de índices dando os pontos de divisão Nesse caso dividimos o vetor x criando três vetores que são quebrados do primeiro para o segundo na terceira posição e do segundo para o terceiro na quinta posição A saída será 3 LISTAS As listas são vetores e matrizes com tamanho dinâmico Em linguagens como CC são conhecidas como vetores em Java são conhecidas como ArrayList As listas não necessitam ser sempre homogêneas podem ter tipos de dados diferentes dentro de uma só lista tornando o Python uma ferramenta poderosa nesse sentido Podem conter tipo de dados diferentes Inteiros Strings e até Objetos e podem ainda ser modificadas ao longo da execução do programa Uma lista é um valor que contém diversos valores em uma sequência ordenada O termo valor da lista referese à própria lista que é um valor que pode ser armazenado em uma variável ou passado para uma função como qualquer outro valor não aos valores dentro do valor da lista Os valores dentro da lista são chamados de itens que são separados por vírgulas Por exemplo L abacate morango maçã banana Algumas definições listas em Python são ordenadas e têm uma contagem definida seus elementos são indexados de acordo com uma sequência definida assim como outras linguagens a indexação de uma lista é feita com 0 sendo o primeiro índice cada elemento da lista tem lugar definido o que permite a duplicação de elementos na lista com cada elemento tendo seu lugar e credibilidade distintos 3 LISTAS 31 Funções para manipulação de listas A lista é uma estrutura que pode ser modificada As principais funções de manipulação de listas são Função Descrição Exemplo append Adiciona um novo valor no final da lista L 1 2 3 Lappend 100 Saída 1 2 3 100 del Remove um elemento da lista dado seu índice L 1234 del L 1 Saída 1 3 4 extend Insere uma lista no final de outra lista L 0 1 2 Lextend 3 4 5 Saída 0 1 2 3 4 5 in Verifica se um valor pertence à lista L 1 2 3 4 3 in L Saída True len Retorna o tamanho da lista L 1 2 3 4 len L Saída 4 max Retorna o maior valor da lista L 10 40 30 20 max L Saída 40 min Retorna o menor valor da lista L 10 40 30 20 minL Saída 10 reverse Inverte os elementos de uma lista L 0 1 2 3 4 5 Lreverse Saída 5 4 3 2 1 0 sort Ordena em ordem crescente L 3 5 2 4 1 0 Lsort Saída 0 1 2 3 4 5 sum Retorna a soma dos elementos da lista L 10 20 30 sumL Saída 60 Por exemplo Saída A implementação das funções é bem simples e aplicada 3 LISTAS 32 Operações com listas Concatenação a 012 b 345 c a b printc 0 1 2 3 4 5 Repetição L 12 R L 4 printR 1 2 1 2 1 2 1 2 3 LISTAS 33 Criação de listas com range A função range define um intervalo de valores inteiros Associada à list cria uma lista com os valores do intervalo A função range pode ter de 1 a 3 parâmetros rangen cria um intervalo de 0 a n1 Por exemplo A saída será range i n cria um intervalo de i a n1 Por exemplo A saída será range i n p cria um intervalo de i a n1 com intervalo p entre os números Por exemplo A saída será 3 LISTAS 34 Remover um elemento de uma lista em Python Algumas funções para remoção de elementos em lista serão apresentados como listpop del e listremove ou ainda npdelete se for um elemento da matriz Numpy listpop índice para remover um elemento de uma lista por índice A lista seguida do método pop índice removerá o elemento que está na posição da lista indicada no índice A saída será A palavra del é utilizada para remover um elemento de uma lista por índice O uso do comando del seguido da posição da lista remove o valor que estiver na posição definida A saída será listremove valor é utilizado para remover um elemento de uma lista por valor É possível usar o método remove em uma lista para remover a primeira ocorrência de valor na lista Por exemplo para remover o valor b A saída será Remoção do elemento em uma matriz numpy deve ter instalado o pacote A saída será Observação Sempre lembrando que a lista assim como vetores e matrizes iniciase do índice 0 e vai até número total de elementos 1 Exemplo de classificação rápida com NumPy npsorte e npargsort O Python tem as funções sort e sorted integradas para trabalhar com listas A função npsort do NumPy é muito eficiente e útil por padrão npsort usa um algoritmo quicksort Para retornar uma versão classificada da matriz sem modificar a entrada você pode usar npsort Neste exemplo a matriz x está fora de ordem e a matriz a recebe a ordenação com npsort de x A saída será a matriz ordenada 4 REFERÊNCIAS THE BASICS of NumPy Arrays Disponível em httpsjakevdpgithubioPythonDataScienceHandbook0202thebasicsofnumpyarrayshtml Acesso em 26 ago 2021 Aula 3 1 STRINGS E RANDOM Strings em Python As strings no Python são variáveis que armazenam conjuntos de caracteres alfanuméricos Não há a necessidade de declarar a variável somente inicializar com o sinal A inicialização de strings deve ser com aspas simples ou duplas As strings são imutáveis ou seja não é possível adicionar remover ou até mesmo modificar parte de uma string Caso queira alterála de alguma forma devese criar uma nova string Exemplo A saída será 1 STRINGS E RANDOM 11 Manipulação de strings Operadores de string somando e multiplicando Uma string é um tipo de objeto que consiste em uma série de caracteres O Python já sabe como lidar com várias representações de uso geral e poderosas incluindo as strings Uma maneira de manipular strings é usando operadores de string Os operadores são representados por símbolos geralmente associados à matemática como e Concatenar O termo concatenar significa associar strings O processo é conhecido como concatenação de strings e é feito usando o operador de adição Deve ser definido o lugar exato dos espaços em branco colocandoos também entre aspas simples Por exemplo A saída será Multiplicar Para se apresentar cópias de uma string é possível usar o operador de multiplicação Neste exemplo a string A recebe o conteúdo olá vezes quatro Já a mensagem da B recebe o conteúdo strings Nesse caso serão apresentadas ambas as strings a seguir A saída será Acrescentar E se você quiser adicionar material ao final de uma string sucessivamente Existe um operador especial para isso Saída Para apresentar a string na vertical devese percorrêla com um for A saída será Já para apresentar um nome em cadeia crescente de caracteres podese usar estruturas de repetição compostas como no exemplo com while e for A saída será 1 STRINGS E RANDOM 12 Métodos de String Além dos operadores o Python tem vários métodos de strings que permitem fazer coisas com strings Alguns métodos importantes são Comprimento É possível determinar o número de caracteres em uma string usando o método len Ela retornará um inteiro que representa o número de caracteres da string A saída será o número 11 Achar a substring Podese pesquisar uma substring em uma string e o programa retornará a posição de índice inicial dessa substring Observação os índices são numerados da esquerda para a direita e a contagem começa na posição 0 A saída será a posição 7 oitava posição Se a substring não existir o programa retornará o valor 1 A saída será 1 Minúsculas e maiúsculas Para converter uma string em minúsculas usase o método lower A saída será Para fazer o contrário ou seja converter em maiúsculas trocase o lower por upper Replace Para substituir uma substring em toda a string pode ser usado o método replace A saída será Slice Para eliminar partes indesejadas de uma string do início ou do fim podese criar uma substring Essa técnica também permite quebrar uma string longa em componentes menores A saída será Random Números aleatórios em Python Existem situações nas quais é necessária uma grande amostra de dados para a realização de testes Economia TI etc mas nem sempre esses dados estão disponíveis Nessas situações podese usar um conjunto de números aleatórios A linguagem Python possui a biblioteca random que gera números aleatórios Para usála é necessário importar o seguinte A saída será um número real aleatório As funções randrange e randint geram aleatoriamente um número inteiro dentro de um intervalo dado pelo usuário Semelhantes à função random nas quais o limite inferior do intervalo é incluído porém o superior não Por exemplo O número gerado não inclui o segundo parâmetro mas um número a menos que ele A saída serão números aleatórios entre 1 e 10 no randint e de 1 a 20 no randrange O módulo random provê uma função shuffle que permite reordenar embaralhar os elementos de uma lista string ou tupla O formato geral é random sequência função onde sequência é a lista string ou tupla função é opcional e pode ser usada uma função qualquer Por exemplo um jogo de 12 cartas ordenadas e posteriormente embaralhadas A saída será 2 REFERÊNCIAS The Basics of NumPy Arrays In VANDERPLAS J Python Data Science Handbook California OReilly Media Inc 2016 Disponível em httpsjakevdpgithubioPythonDataScienceHandbook0202thebasicsofnumpyarrayshtml Acesso em 25 out 2021 Aula 4 1 IMPLEMENTAÇÃO DOS ALGORITMOS DE ORDENAÇÃO Algoritmos de ordenação Os algoritmos de ordenação são conjuntos de instruções que usam uma matriz ou lista como entrada e organizam os itens em uma ordem específica As formas de classificação em geral são ordem numérica e classificação alfabética e podem ser crescentes ou decrescentes A aplicação de algoritmos de ordenação pode diminuir a complexidade de um problema se usados de forma adequada como aplicações em buscas na Internet ou em um banco de dados em estruturas de dados ou até na otimização de dados 1 IMPLEMENTAÇÃO DOS ALGORITMOS DE ORDENAÇÃO 11 Como saber quando usar Cada algoritmo tem sua aplicação mais apropriada Devese questionar o tamanho do conjunto de dados a forma que será classificado a capacidade de processamento e memória a serem usados e até se o conjunto de dados poderá aumentar de alguma maneira A escolha do algoritmo mais adequado depende da situação verificada Existem algoritmos como o Merge Sort que necessitam de maior capacidade de armazenamento e memória para serem executados Já o algoritmo Insertion Sort não é tão rápido mas não necessita de muitos recursos para ser executado 1 IMPLEMENTAÇÃO DOS ALGORITMOS DE ORDENAÇÃO 12 O que é classificação A classificação referese a colocar elementos de forma organizada como em ordem alfabética ou notação decimal Por exemplo a letra a está posicionada a um espaço antes de b e dois espaços antes de c ou seja o alfabeto é uma referência de ordenação de letras Por exemplo uma lista de contatos organizada em ordem alfabética serve para encontrar os contatos específicos de maneira rápida Uma pessoa chamada Ana será encontrada no início da lista pois a primeira letra do alfabeto é a e assim por diante 1 IMPLEMENTAÇÃO DOS ALGORITMOS DE ORDENAÇÃO 13 Símbolos de complexidade de tempo Existem símbolos usados para representar a complexidade do tempo Um algoritmo levará uma quantidade de tempo diferente dependendo da entrada que é fornecida São três maneiras diferentes de representar cenários diferentes usando a complexidade de tempo Ω O Big Ômega é usado para representar o melhor cenário de um algoritmo Quando um algoritmo recebe a estrutura de dados mais simples possível como entrada O O Big O é usado para representar o pior cenário de um algoritmo Quando um algoritmo recebe um conjunto de dados muito grande e complexo como entrada Θ O Big Theta é usado apenas quando a complexidade de tempo de um algoritmo é a mesma nos cenários de pior e melhor caso Selection Sort Complexidade de tempo Θ n² O Selection Sort funciona de uma maneira muito simples Ele passa por todos os elementos em um conjunto de dados um por um comparando o valor de um elemento com o próximo verificando se o elemento é menor Depois ele salva o menor elemento encontrado em uma variável e quando a iteração é concluída inserirá aquele elemento salvo em sua respectiva posição nas posições de troca do conjunto de dados com o valor nessa posição Este algoritmo tem um Θ n² porque no pior e no melhor cenário terá que iterar por todos os n elementos na matriz e repetir este processo n número de vezes Mesmo se o conjunto de dados já estiver classificado não há como dizer se é até que todas as iterações no algoritmo sejam concluídas Por exemplo A implementação do algoritmo A saída será Insertion Sort Complexidade de tempo O n² Embora seja um dos algoritmos de classificação elementares com tempo de pior caso O n² o Insertion Sort é o algoritmo ideal quando os dados estão quase classificados porque são adaptativos ou quando o tamanho do problema é pequeno porque tem baixa sobrecarga Por essas razões e porque também é estável a ordenação por Insertion Sort é frequentemente usada como em caso de recursividade quando o tamanho do problema é pequeno para algoritmos de ordenação de divisão e conquista de sobrecarga mais alta como Merge ou Quick Sort Por exemplo A implementação em Python do algoritmo de ordenação Insertion Sort A saída será Bubble Sort Complexidade de tempo O n² Ω n O Bubble Sort pode ser o algoritmo de classificação mais simples A forma como este algoritmo processa a entrada é como uma bolha tentando chegar à superfície Dentro de cada iteração o algoritmo encontrará o valor mais alto e o colocará no final do conjunto de dados ou onde esse valor pertence comparando cada par de elementos no conjunto de dados Assim o Selection Sort classifica do menor elemento para o mais alto e o Bubble Sort do mais alto para o mais baixo O Bubble Sort também classifica os elementos mais baixos para ficarem mais próximos à esquerda porque dentro de cada iteração o valor mais alto trocará de lugar com o valor mais baixo Então ele move os elementos inferiores para a esquerda e os elementos superiores para a direita O pior cenário para este algoritmo seria se todos os elementos no conjunto de dados estivessem em ordem reversa fazendo com que o algoritmo fizesse mais trocas mas o melhor cenário não é tão ruim quanto o Selection Sort porque ao contrário do Selection Sort este algoritmo é inteligente o suficiente para perceber em sua primeira iteração que o conjunto de dados já está classificado Por exemplo O exemplo mostra como o Bubble Sort compara cada par no conjunto de dados e troca a posição do valor se o valor for maior empurrando os maiores valores para a direita e os menores para a esquerda construindo a saída da direita para a esquerda Implementação em Python do algoritmo Bubble Sort A saída será Merge Sort Complexidade de tempo Θ n log n O Merge Sort é considerado um dos algoritmos de classificação mais rápidos assim como é um pouco mais complexo do que o Selection e o Bubble Sort também é mais eficiente A ideia do Merge Sort é dividir o conjunto de dados em conjuntos de dados menores classificar esses conjuntos de dados menores e em seguida juntálos mesclálos A maneira como esse algoritmo se comporta é classificando o lado esquerdo do conjunto de dados primeiro depois a parte direita e por fim mesclandoos Em seguida dividirá em dois o conjunto de dados até que todos os elementos sejam separados Então começará a se juntar da esquerda para a direita em pares e esses pares se fundirão da esquerda para a direita até que haja apenas dois pares maiores para juntar Este algoritmo tem a mesma complexidade de tempo para os cenários de pior e melhor caso porque mesmo se a matriz for classificada melhor caso o algoritmo ainda terá que fazer o procedimento completo para determinar se o conjunto de dados está classificado ou não Por exemplo podese entender a aplicação do Merge Sort com a seguinte animação E a implementação com o seguinte exemplo A saída será Quick Sort Complexidade de tempo Ω n log n O n² O Quick Sort também é um dos algoritmos mais rápidos de ordenação Para realizar um Quick Sort é necessário escolher um elemento no conjunto de dados e usálo como algo chamado pivô Um pivô é um elemento que é usado para comparar outros elementos no conjunto de dados e determinar em que posição eles devem estar O primeiro pivô pode ser um elemento aleatório no conjunto de dados mas por convenção o primeiro ou o último elemento é usado O primeiro objetivo será colocar o primeiro pivô em sua posição correta no conjunto de dados Para isso é necessário classificar os elementos de forma que todos os elementos maiores do que o pivô sejam enviados para a direita do pivô e todos os elementos menores do que o pivô sejam enviados para a esquerda do pivô Por exemplo para classificar um certo número de xícaras de chá por tamanho a forma como o Quick Sort faria é pegar a última xícara como um pivô e começar a fazer duas comparações a primeira é comparação A e a segunda comparação B A comparação A começaria verificando se a primeira xícara é maior do que a xícara pivô Se for a comparação B verificará se a última xícara é menor que a xícara pivô Se for o primeiro elemento trocará de lugar e a comparação A se moverá mais um espaço para a direita enquanto a comparação B se moverá um espaço para a esquerda Este procedimento continuará até que a comparação A e B se cruzem Quando isso acontecer é possível saber que a última posição da comparação A será agora trocada com a xícara pivô de modo que a xícara pivô esteja em sua posição correta e final porque todos os elementos à sua esquerda são menores e todos os elementos à sua direita são maiores Para classificar o resto das xícaras o algoritmo faria o mesmo procedimento para o lado esquerdo e direito Primeiro ele obteria um novo pivô para o lado esquerdo comparandoo com os outros elementos do lado esquerdo e os classificando de acordo e assim o mesmo procedimento seria repetido com o lado direito até que todas as xícaras fossem classificadas O pior cenário desse algoritmo seria se o pivô inicial escolhido fosse extremamente pequeno ou extremamente grande O melhor cenário seria que o pivô inicial se encaixasse bem ou em algum lugar no meio do conjunto de dados Por exemplo A implementação em Python do algoritmo Quick Sort A saída será 2 REFERÊNCIAS BORGES L E Python para desenvolvedores Rio de Janeiro Edição do Autor 2009 Disponível em httpwwwdominiopublicogovbrdownloadtextoea000474pdf Acesso em 13 out 2021 PERKOVIC L Introdução à computação usando Python um foco no desenvolvimento de aplicações Rio de Janeiro LTC 2016 RIBEIRO J A Introdução à programação e aos algoritmos Rio de Janeiro LTC 2019 WAZLAWICK R S Introdução a algoritmos e programação com Python uma abordagem dirigida por testes Rio de Janeiro Elsevier 2018 Aula 5 1 RECURSÃO Recursividade em Python Recursividade em programação é um método de codificação de um problema no qual uma função chama a si mesma uma ou mais vezes fazendo uma autorreferência ou seja um loop até atingir a condição final desejada Com a recursão é possível implementar soluções mais simples para problemas muito complexos 1 RECURSÃO 11 As leis da Recursividade Os algoritmos recursivos devem seguir as seguintes definições Devem ter um caso base Devem alterar seu estado e se aproximar do caso básico chamado caso recursivo Devem chamar a si mesmos Cada implementação recursiva tem um caso base que ocorre quando o estado desejado é alcançado e um caso recursivo quando o estado desejado não é alcançado e a função entra em outra etapa recursiva O comportamento no caso recursivo antes da chamada de função recursiva a autorreferência interna é repetido em cada etapa Estruturas recursivas são úteis quando é possível resolver um problema maior o caso base implementando subproblemas repetidos o caso recursivo que movem incrementalmente o programa para o caso base Recursão Direta é uma função que contém comandos e uma chamada a ela mesma Recursão Indireta por sua vez é uma função que chama outra função que por sua vez chama outra função e se repete n vezes chamadas de outras funções 1 RECURSÃO 12 Recursão ou Iteração Existem algumas soluções de problemas que são espontaneamente recursivas e outras que podem ser construídas de forma recursiva Uma rotina pode ser definida como recursiva sem iteração porém é importante compreender as características de recursividade e iteração para escolher a mais adequada à solução Tanto a iteração como a recursão utilizam estruturas de repetição A primeira usa os comandos de repetição for ou while a segunda também repete mas com chamadas da própria função Outra semelhança entre ambas as estruturas é a necessidade de um teste para finalização A iteração encerra quando atende à condição de parada e a recursão encerra quando chega ao caso base Elas também podem não ter fim entrando em loop infinito caso não tenham suas condições de parada atendidas Uma característica das soluções recursivas é terem um melhor desempenho quando um problema tem subproblemas claros os quais devem ser repetidos e se não há certeza de quantas vezes precisará ser feito um loop com uma solução iterativa Por exemplo se você quiser criar um programa de função fatorial que encontre o fatorial de um número 4 4 3 3 3 2 2 2 1 Substituir os valores calculados nos dá a seguinte expressão 4 4 3 2 1 Em outras palavras a recursão na ciência da computação é um método em que a solução de um problema é baseada na resolução de instâncias menores do mesmo problema Se o fatorial no entanto for de um número indefinido faz muito mais sentido usar a recursividade Por exemplo A saída para um número qualquer por exemplo 5 será A pilha de recursão é aquela que guarda as chamadas recursivas No exemplo podese compreender cada passo do processo no cálculo recursivo do fatorial do número 4 Figura 1 Simulação do cálculo do fatorial de 4 Fonte wwwlinhadecodigocombr 1 RECURSÃO 13 Números primos Um número primo é um número natural maior que um e que não tem divisores além de um e ele mesmo Por exemplo 3 7 e 11 são números primos Uma função iterativa para cálculo de números primos é A saída para uma entrada do número 7 por exemplo Ou nesta implementação mais adequada ao Python O resultado será o mesmo mostrando se a entrada é ou não um número primo É possível criar uma função recursiva para calcular os números primos O resultado não é modificado em relação às outras funções iterativas de cálculo de número primo porém a implementação recursiva divide o problema em duas funções verificar se há divisor entra com o número e verifica se há divisor entre um valor inicial i e um valor final j em uma representação genérica e validar se é primo verifica se n é maior que 1 e se não há divisor chama a função divisor com as entradas do próprio número a ser verificado e o intervalo de 2 a n1 e se ela for falsa retornar verdadeiro para a função primo 1 RECURSÃO 14 Função potência É possível criar uma função potência com uma implementação Por exemplo calcular um número positivo x elevado a y Solução 1 Solução não recursiva A saída será Solução 2 Solução recursiva A saída será idêntica à solução iterativa porém a execução do código será recursiva 2 REFERÊNCIAS LINHA de Código Disponível em wwwlinhadecodigocombr Acesso em 10 out 2021 Aula 6 1 IMPLEMENTAÇÃO DE ALGORITMOS E PROBLEMAS CLÁSSICOS Anagramas O primeiro problema clássico a ser tratado nesta disciplina será o de detecção de anagramas com strings Uma string será um anagrama quando for uma transposição de outra string Por exemplo os mais famosos anagramas amor e roma No primeiro código desenvolveremos o problema dos anagramas verificando se os caracteres de uma string ocorrem em outra Se os caracteres ocorrerem nas duas strings significa que são anagramas É possível identificar cada caractere substituindo por None Porém em Python as strings são imutáveis será necessário tratar a segunda string portanto ela deverá ser convertida em uma lista Cada caractere da primeira string será buscado entre os caracteres da segunda lista e se forem encontrados serão identificados com None Por exemplo A saída será Para a verificação ordenada das sequências é possível ordenálas e comparálas transformando ambas as strings em listas e usando sort em cada uma Um palíndromo por sua vez é toda palavra ou frase que pode ser lida de trás para frente e que independentemente da direção mantém seu sentido Por exemplo arara reviver ou radar Para verificar se as strings são palíndromos podese usar o fatiamento da lista comparando os elementos da string original com a outra string invertida Por exemplo A saída será 1 IMPLEMENTAÇÃO DE ALGORITMOS E PROBLEMAS CLÁSSICOS 11 Jogo Adivinhe um número O jogo de adivinhação de um número é um clássico em computação A ideia é gerar um número aleatório e pedir para o usuário tentar adivinhar identificando se o número chutado é maior ou menor até acertar O código pode ser criado com funções a primeira para gerar o número aleatório e a segunda para verificar o chute e validar se o número gerado é maior ou menor até ser acertado A função gerarNum retornará um número aleatório inteiro de 1 até 100 A função jogo por sua vez gerará o palpite e contará as tentativas até o jogador acertar A saída será 1 IMPLEMENTAÇÃO DE ALGORITMOS E PROBLEMAS CLÁSSICOS 12 Torre de Hanoi A Torre de Hanói também é conhecida como Torre de Brahma É um jogo matemático ou quebracabeça que consiste em três hastes com n números de discos de diâmetros diferentes O objetivo do jogo é mudar toda a pilha de discos de uma haste para outra seguindo estas três regras Apenas um disco pode ser movido por vez Apenas o disco superior de uma pilha pode ser movido para o topo de outra pilha ou uma haste vazia Discos maiores não podem ser colocados sobre discos menores Resumindo são dados um conjunto de n discos com diferentes tamanhos e três bases A B e C O problema incide em mostrar os passos necessários para mover os discos da base A para a base B usando a base C como apoio com a regra de nunca colocar discos maiores sobre menores Exemplo Figura 1 Movimentos da Torre de Hanoi 1º passo Mover de A para B 2º passo Mover de A para C 3º passo Mover de B para C 4º passo Mover de A para B 5º passo Mover de C para A 6º passo Mover de C para B 7º passo Mover de A para B Fonte httpwwwvisionimeuspbrpmirandamac21661s17aulasP3aulasP3html O número de movimentos ótimo para o deslocamento de n discos é 2n 1 O código para este exemplo é Para um total de três discos a saída será ou seja sete movimentos 1 IMPLEMENTAÇÃO DE ALGORITMOS E PROBLEMAS CLÁSSICOS 13 Fibonacci A sequência de Fibonacci e a matemática da proporção estão intimamente interligadas A sequência de Fibonacci é uma sequência recursiva gerada pela adição dos dois números anteriores em uma sequência iniciada por 0 e 1 0 1 1 2 3 5 8 13 21 34 55 89 144 Na natureza ela aparece em plantas pétalas e fileiras de sementes que quase sempre contam até um número de Fibonacci Muitos cactos exibem a espiral de Fibonacci Você pode ver como cada conjunto de folhas espirala para fora por exemplo em um Aloe Vera Figura 2 Fibonacci na natureza Aloe Vera Fonte httpsinsteadingcomblogfibonaccisequenceinnature Na Matemática usase essa sequência para achar o MDC máximo divisor comum de dois números inteiros Pode ainda ser usada na conversão de milhas para KM A sequência de Fibonacci tem n números em sua série em que n é a variável que representa o nésimo termo da série termo este fornecido pelo usuário Para implementar o algoritmo da sequência de forma recursiva devese compreender como deverá ser representado Figura 3 Sequência de Fibonacci Fonte httpswwwseekpngcomipngu2t4t4i1q8u2u2o0fibonaccispiral34dicklyonfibonaccisequenceinnature A implementação do algoritmo iterativo será A saída será 2 REFERÊNCIAS AULA 01 Funções Recursivas Disponível em httpwwwvisionimeuspbrpmirandamac21661s17aulasP3aulasP3html Acesso em 29 out 2021 FIBONACCI Spiral 34 Dicklyon Fibonacci Sequence in Nature Disponível em httpswwwseekpngcomipngu2t4t4i1q8u2u2o0fibonaccispiral34dicklyonfibonaccisequenceinnature Acesso em 29 out 2021 KEIREN The Fibonacci Sequence in Nature Insteading 28 dez 2020 Disponível em httpsinsteadingcomblog fibonacci sequenceinnature Acesso em 29 out 2021 Aula 7 MANIPULAÇÃO DE ARQUIVOS Sistema de Arquivos A estrutura do sistema de arquivos é o nível mais básico de organização em um sistema operacional Quase todas as maneiras como um sistema operacional interage com seus usuários aplicativos e modelo de segurança dependem de como ele organiza os arquivos nos dispositivos de armazenamento Fornecer uma estrutura de sistema de arquivos comum garante que os usuários e programas possam acessar e gravar arquivos 1 MANIPULAÇÃO DE ARQUIVOS 11 Interação do sistema de arquivos Um aplicativo envia uma solicitação ao sistema operacional para armazenar ou recuperar dados do armazenamento aí entra o sistema de arquivos que é o software que realmente localiza e lê ou grava os dados O sistema de arquivos se subdivide em algumas características Entre elas em arquivos variáveis como documentos os quais podem ser alterados a qualquer momento e arquivos estáticos como binários os quais não mudam sem uma ação do administrador do sistema O motivo para examinar os arquivos é ajudar a correlacionar a função do arquivo com as permissões atribuídas aos diretórios que os contêm A maneira como o sistema operacional e seus usuários interagem com um determinado arquivo determina o diretório no qual ele é colocado se esse diretório é montado com permissões somente leitura ou leitura gravação e o nível de acesso que cada usuário tem a esse arquivo O nível superior desta organização é crucial O acesso aos diretórios subjacentes pode ser restrito ou problemas de segurança podem se manifestar se do nível superior para baixo não aderir a uma estrutura rígida O Python contém funções interligadas para criação escrita e leitura de arquivos Os tipos de arquivos que o Ptython manipula são arquivos de texto e binários zeros e uns Arquivos de texto neste formato cada linha é finalizada com um caractere especial conhecido como EOL End of Line Fim da Linha representado pelos caracteres Arquivos binários nos arquivos binários não há nenhum finalizador de linha e os dados são contínuos convertidos em binário interpretado diretamente na máquina 1 MANIPULAÇÃO DE ARQUIVOS 12 Uso básico do sistema de Arquivos Importando a classe principal do caminho do diretório from pathlib import Path Listando subdiretórios A saída será Navegando dentro de uma árvore de diretório neste caso dentro de arquivos que é o caminho indicado q recebe o caminho mais initd rboot A saída será o caminho completo de q e false Método ospath É um método que pode ser usado para testar se um caminho existe Ele retorna True se o caminho existir Este método trabalha com as funcionalidades dependentes do sistema operacional Funções como leitura e escrita do arquivo manipulação de estruturas de diretórios são próprias dele Por exemplo se a intenção é verificar se determinado caminho é um diretório ou arquivo podemos usar ospath exists para verificar a existência ou não deste diretório ou ainda o ospathisfile para verificar se é um arquivo que está sendo analisado A implementação pode ser 1 MANIPULAÇÃO DE ARQUIVOS 13 Abrindo um arquivo em Python Abrir um arquivo significa preparálo para leitura ou gravação Isso pode ser feito usando a função open Ela retorna um objeto de arquivo e contém dois argumentos o nome do arquivo e o modo Modo de Acesso Modos de Acesso Os modos de acesso são as operações que podem ser executadas no arquivo a ser aberto É fundamental saber a forma como o arquivo será tratado após a abertura Os modos de acesso t êm a função de definir a localização do identificador do arquivo o qual é uma espécie de ponteiro que mostra o local para onde os dados devem ser lidos ou gravados Os modos de acesso em Python são seis Somente leitura r Abre o arquivo para leitura O ponteiro identificador será apontado para o início do arquivo Se o arquivo não existir será gerado um erro de EntradaSaída É o modo padrão Leitura e escrita r Abre o arquivo para leitura e escrita O ponteiro identificador será apontado no início do arquivo Se o arquivo não existir será gerado um erro de EntradaSaída Somente escrita w Abre o arquivo para gravação Quando o arquivo existe será truncado ou sobrescrito O ponteiro identificador é apontado no início do arquivo Cria o arquivo se ele não existir Escrita e Leitura w Abre o arquivo para leitura e escrita Para o arquivo existente os dados são truncados e sobrescritos O ponteiro identificador será apontado no início do arquivo Somente Append Continuação da gravação a Abre o arquivo para gravação O arquivo é criado se não existir O ponteiro identificador será apontado no final do arquivo Os dados serão inseridos no final após os dados existentes Anexar e ler a Abre o arquivo para leitura e gravação Se não existir o arquivo será gerado O ponteiro identificador será apontado no final do arquivo Os dados que estão sendo gravados serão inseridos ao final após os dados existentes A sintaxe da função open é Fileobject open r FileName AccessMode Observação O arquivo deve estar no mesmo diretório que o arquivo Python ou deve ser definido o caminho completo no qual o arquivo se localiza Por exemplo A função close é responsável pelo fechamento do arquivo Este sempre deve ser fechado para evitar falhas e erros Para o funcionamento da manipulação de arquivos é necessário criar o arquivo txt Podemos criálo diretamente do PyCharm no mesmo diretório do mainpy para essa primeira construção de código Clicando na nova aba que apareceu é somente necessário digitar o texto para teste Por exemplo A saída será 1 MANIPULAÇÃO DE ARQUIVOS 14 Outras funções importantes para a manipulação de arquivos Funções de manipulação de arquivos ou diretórios são importantes de se compreender Seguem algumas fundamentais para o tratamento e manipulação de arquivos fwrite string método usado para gravação do conteúdo de uma string no arquivo retornando o número de caracteres gravados osgetcwd método que retorna o diretório de trabalho atual como uma string oslistdir método que retorna o conteúdo do diretório de trabalho atual como uma lista de strings oswalk método que cria um gerador o qual pode retornar informações sobre o diretório e subdiretórios atuais Ele funciona por meio dos diretórios no diretório inicial especificado Retorna os seguintes itens para cada diretório que atravessa caminho do diretório atual com uma string nomes de subdiretórios no diretório atual como listas de strings nomes de arquivos no diretório atual como uma lista de strings Geralmente é útil usar oswalk com um loop for para iterar sobre o conteúdo de um diretório e seus subdiretórios oschdir método que altera o diretório atual para um caminho absoluto ou relativo definido É importante tratar exceções ao usar este método as exceções serão apresentadas na próxima aula Caso não sejam tratadas pode acontecer a exclusão indevida de diretórios ou arquivos ospath join este módulo compõe métodos de manipulação de caminhos Pode ser usado para encontrar informações sobre diretórios ou ainda para verificar sua existência Este método foi criado para funcionar em vários sistemas operacionais possibilitando a jun ção de strings para a formação de um caminho de arquivo osmakedirs este método cria diretórios O método mkdir também os cria mas não diretórios intermediários shutilcopy 2 este método pode ser usado para copiar um arquivo ou diretório Sintaxe do método shutilcopy 2 sourcefilepath destinationdirectorypath shutilmove este método serve para mover um arquivo ou diretório pode ser utilizado também para alterar a posição de um arquivo Sintaxe do método shutilmove sourcefilepath destinationdirectorypath osremove método usado para a remoção de um diretório e dos arquivos nele contidos Sintaxe do método osremove myfilepath Aula 8 1 IMPLEMENTAÇÃO DE ARQUIVOS E EXCEÇÕES Exceções Exceção é o tratamento de situações excepcionais que podem acontecer ao longo da execução do código Ela pode ser tratada em comandos dentro dos métodos e é uma instância da classe Exception Em resumo a exceção é o que pode ser feito em uma situação de erro Por exemplo quando a intenção for detectar e tratar a ocorrência de erros em uma função qualquer funcaosemExc a seguinte sequência geralmente é feita Uma das principais características e vantagens das funções estarem inseridas em módulo é podermos reutilizálas em situações e aplicações diversas Elas podem atuar de maneira diferente para situações de exceção porém da forma apresentada no exemplo forçase a reação aos erros ser sempre a mesma o que não é ideal para situações diversas 1 IMPLEMENTAÇÃO DE ARQUIVOS E EXCEÇÕES 11 O que deve ser feito Tratamento de exceções O tratamento de exceções é um mecanismo que permite a criação de funções transparentes as quais se preocupam com seu objetivo principal Por exemplo uma função nomeada fun1 poderia ser qualquer outro nome chama uma função fun2 E que a fun2 chame nela a fun3 Com o tratamento de exceções a função fun3 seria representada da seguinte forma Agora a função fun3 não precisa mais se preocupar com cada caso de erro que pode ocorrer Precisa somente identificar se o erro ocorreu e se ocorrer chamará um objeto da classe de exceção Com o comando raise jogará a exceção para a função que a chamou Em nosso exemplo esse objeto poderá ser captado pela função fun2 que chamou fun3 e ser devidamente tratado nesta função de maneira específica ou ser jogado novamente de fun2 para a fun1 para ser tratado novamente de maneira própria a esta função 1 IMPLEMENTAÇÃO DE ARQUIVOS E EXCEÇÕES 12 Exceções e tipos de erros Runtime Este erro ocorre quando acontece algo indesejado na execução do programa As mensagens desse tipo de erro incluem informações do que estava sendo executado e o local em que o erro ocorreu Os erros mais comuns de tempo de execução são NameError Quando há a tentativa de acesso a uma variável que não existe Saída No exemplo tentouse imprimir x sem nenhuma definição anterior Esse erro é comum também ao tentar acessar variável local em um contexto global TypeError Ao tentar acessar um valor de maneira inadequada por exemplo tentar tratar uma sequência indevidamente A saída será KeyError Ao tentar acessar um elemento de uma lista usando uma chave que não existe A saída AttributeError Ao acessar um atributo ou método que não existe em um objeto A saída IndexError Ao acessar um elemento de uma sequência com um índice maior que o tamanho da sequência A saída 1 IMPLEMENTAÇÃO DE ARQUIVOS E EXCEÇÕES 12 Exceções e tipos de erros Runtime Este erro ocorre quando acontece algo indesejado na execução do programa As mensagens desse tipo de erro incluem informações do que estava sendo executado e o local em que o erro ocorreu Os erros mais comuns de tempo de execução são NameError Quando há a tentativa de acesso a uma variável que não existe Saída No exemplo tentouse imprimir x sem nenhuma definição anterior Esse erro é comum também ao tentar acessar variável local em um contexto global TypeError Ao tentar acessar um valor de maneira inadequada por exemplo tentar tratar uma sequência indevidamente A saída será KeyError Ao tentar acessar um elemento de uma lista usando uma chave que não existe A saída AttributeError Ao acessar um atributo ou método que não existe em um objeto A saída IndexError Ao acessar um elemento de uma sequência com um índice maior que o tamanho da sequência A saída 1 IMPLEMENTAÇÃO DE ARQUIVOS E EXCEÇÕES 13 Construindo Exceções A linguagem Python contém várias classes de exceção que derivam da classe Exception As exceções são objetos instanciados da Classe Exception O comando raise nome da classe é usado quando a exceção é chamada de dentro da função ou do método Try e except No caso de ocorrer uma exceção dentro de alguma função ou comando do bloco try ela será lançada e os demais comandos do bloco serão suspensos O controle da execução passará para o primeiro bloco except que tenha uma classe de exceção de tipo compatível com a exceção lançada Podem existir zero um ou mais blocos except após um bloco try Por exemplo Programa que mantém o loop no laço while até o usuário digitar dois números sendo necessariamente o segundo valor numérico e diferente de zero Se b for zero o comando ab chamará a exceção ZeroDivisionError Se essa ação for executada try será interrompido e o controle passará para o primeiro comando do bloco except Ou seja o comando fim não chegará a receber o valor True e o while não será finalizado solicitando novamente os valores a e b ao usuário Se a ou b não forem do tipo número o comando ab chamará a exceção TypeError A saída será O bloco try except também possui o comando else usado excepcionalmente logo depois de todos os comandos except Sua utilidade é fundamental para códigos que necessitam ser executados se não houver exceção chamada Por exemplo Quando não existe o arquivo a saída será Porém se há o arquivo é possível contar as linhas se não houver erro de IO E a saída será 1 IMPLEMENTAÇÃO DE ARQUIVOS E EXCEÇÕES 14 Levantando exceções O comando raise permite forçar a ocorrência de uma exceção O argumento de raise indica a exceção a ser lançada Esse argumento deve ser uma instância de Exception ou uma classe de alguma exceção uma classe que deriva de Exception Caso você precise determinar se uma exceção foi lançada ou não mas não quer manipular o erro uma forma é lançála novamente por meio da instrução raise Saída 1 IMPLEMENTAÇÃO DE ARQUIVOS E EXCEÇÕES 15 Traceback No exemplo anterior há uma saída traceback Essa saída é um rastro de pilha conhecido como traceback Esta saída é importante para o processo de lançar uma exceção Python implementa seu sistema de exceções da seguinte forma quando uma exceção é chamada raise há um alerta no interpretador que verifica se o método executa alguma ação ao executar o código Quando não há nenhuma medida o interpretador para a execução de maneira inesperada e mesmo sem encerrar o método ele verifica se há tratamento do erro Se não há nenhum tratamento do erro ele mata o processo Sendo assim o interpretador mostra a traceback a qual por sua vez apresenta a sequência de chamadas de função incluindo o número da linha onde cada chamada ocorreu 1 IMPLEMENTAÇÃO DE ARQUIVOS E EXCEÇÕES 16 Inspect O módulo inspect fornece funções úteis para a compreensão de informações sobre objetos ativos módulos classes métodos funções tracebacks objetos de quadro e objetos de código Por exemplo pode ajudálo a examinar o conteúdo de uma classe recuperar o códigofonte de um método extrair e formatar a lista de argumentos para uma função ou obter todas as informações que você precisa para exibir um traceback detalhado Existem quatro tipos principais de serviços fornecidos por este módulo verificação de tipo obtenção de códigofonte inspeção de classes e funções e exame da pilha do interpretador É possível com o inspect criar formas de inspecionar o código inclusive alterar as exceções de traceback Se quiser eliminar o traceback para exceções e ter o número da linha esse código é interessante A saída será