Prévia do material em texto
Introduc¸a˜o a` Programac¸a˜o Python Para Na˜o Programadores Iannic Dos Santos Matos 26 de abril de 2018 1 Suma´rio 1 Por queˆ economistas precisam aprender programac¸a˜o? 2 2 Primeiros passos em programac¸a˜o Python 3 2.1 Entrada e sa´ıda de dados do teclado, varia´veis e operac¸o˜es matema´ticas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 2.1.1 Entrada e Sa´ıda de Dados . . . . . . . . . . . . . . . . 9 2.1.2 Operac¸o˜es matema´ticas . . . . . . . . . . . . . . . . . . 12 2.2 Operadores Lo´gicos e Estruturas de Decisa˜o . . . . . . . . . . 13 2.3 Strings e listas . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 2.3.1 Como python mapeia uma string? . . . . . . . . . . . . 20 2.3.2 Outros me´todos para manipulac¸a˜o de strings . . . . . . 20 2.3.3 Listas . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 2.4 Estruturas de repetic¸a˜o . . . . . . . . . . . . . . . . . . . . . . 25 2.4.1 Estrutura de repetic¸a˜o for . . . . . . . . . . . . . . . . 25 2.4.2 Estrutura de repetic¸a˜o while . . . . . . . . . . . . . . . 27 2.5 Estrutura de Dados . . . . . . . . . . . . . . . . . . . . . . . . 29 2.5.1 Tuplas (Tuples) . . . . . . . . . . . . . . . . . . . . . . 29 2.5.2 Conjuntos (Sets) . . . . . . . . . . . . . . . . . . . . . 30 2.5.3 Diciona´rios (Dicts) . . . . . . . . . . . . . . . . . . . . 35 2.6 Me´todos e Func¸o˜es . . . . . . . . . . . . . . . . . . . . . . . . 36 2.7 Python Orientado a Objetos . . . . . . . . . . . . . . . . . . . 38 2.7.1 Sintaxe Ba´sica, Construtor e Me´todos . . . . . . . . . . 38 2.7.2 Heranc¸a, Super e Polimorfismo . . . . . . . . . . . . . 41 2.7.3 Atributo/Me´todos Esta´ticos e Encapsulamento . . . . . 44 3 Refereˆncias 48 1 1 Por queˆ economistas precisam aprender pro- gramac¸a˜o? O trabalho de natureza emp´ırica de um economista necessita de acesso e controle de uma grande quantidade de dados. Dados esses que precisam ser manipulados com ferramentas apropriadas, muitas vezes pagas e cara. A programac¸a˜o permite ter esse controle sobre a criac¸a˜o de modelos adequados a` pesquisa, as ferramentas que sera˜o utilizadas e os dados. Ale´m disso, os computadores tem poder de calculo superior e quase ilimitado, permitindo a um cientista de dados ter flexibilidade e confianc¸a nos resultados obtidos, mas pra isso, e´ necessa´rio que o economista saiba utilizar a programac¸a˜o. Conhecer e dominar a programac¸a˜o ja´ da uma enorme habilidade ao ci- entista. Sozinho ele pode criar um laborato´rio de testes com seus pro´prios modelos personalizados. Modelos feitos sob medida para os seus propo´sitos, que se encaixam perfeitamente na sua pesquisa. Tais modelos que neces- sitam de soluc¸o˜es lo´gico-nume´ricas sa˜o facilmente manipula´veis atrave´s de uma linguagem de programac¸a˜o adequada. Com o aumento do poder da computac¸a˜o de maneira exponencial surgem novas ferramentas de explorac¸a˜o de dados que so´ esta˜o ao alcance de quem dete´m algum conhecimento em programac¸a˜o. Aprendizado de ma´quina, Deep learning, redes complexas, etc, so´ podem ser usadas por economistas que com capacidade de entender e implementar esse conhecimento. Os dados, apesar de volumosos, esta˜o dispersos e precisam ser organizados de alguma forma, com o uso de alguma ferramenta e algum expertise, e a grande maioria desses dados que esta˜o soltos nas redes esta˜o desorganizados. A capacidade de resposta de um algoritmo e´ outro ponto importante nessa questa˜o. A checagem dos resultados sa˜o agilizadas pelo poder compu- tacional dispon´ıvel, assim como a compreensa˜o tambe´m e´ mais ra´pido e dar respostas a sociedade com eficieˆncia e´ proposito de todos os profissionais e principalmente de um economista. 2 2 Primeiros passos em programac¸a˜o Python O primeiro passo para se comec¸ar a programar em python e´ instalar o IDLE, que e´ a janela de edic¸a˜o oficial python mais o interpretador python. Para fazer isso, basta entrar no site https://www.python.org/ e fazer o down- load. (Isso so´ e´ necessa´rio em ma´quinas com sistema operacional Windows, ja´ que no MACOs e no Linux o interpretador python e´ nativo). O segundo passo para se comec¸ar a programa e´ baixar e instalar o IDE (Integrated Development Environment) adequado. Um IDE e´ um ambiente de desenvolvimento preparado para otimizar a programac¸a˜o, que por con- seguinte facilita o aprendizado de iniciantes, deixando a programac¸a˜o mais intuitiva. No momento existem va´rias, seja pra desenvolvimento profissional ou cient´ıfico. Nesse tutorial sera´ recomendada usar a distribuic¸a˜o PyCharm, dispon´ıvel em https://www.jetbrains.com/pycharm/download. Ao baixar e instalar o PyCharm, o usua´rio estara´ diante da sua janela inicial. Figura 1: Janela de inicializac¸a˜o do PyCharm Nela, ira´ selecionar “Create New Project”. Feito isso, outra janela sera´ aberta: 3 Figura 2: Janela de Criac¸a˜o de projeto Aqui, o usua´rio selecionara´ o nome do seu projeto, e depois clicar em “Create”. O PyCharm carregara´ os paraˆmetros e abrira´ a janela de desen- volvimento para o novo projeto. Figura 3: Janela de script do PyCharm 4 Nessa janela, na aba de opc¸o˜es, o usua´rio clicara´ em “file”, depois em “New Scratch File”. Ao fazer isso, uma nova janela com va´rias opc¸o˜es de tipos de arquivo sera´ aberta, escolha Python. (a) (b) Figura 4: Tudo isso feito se abrira´ a janela de script Python onde pode - se comec¸ar a codificar. 5 Figura 5: Janela de codificac¸a˜o python Observe que o script Python tem extensa˜o .py pois essa e´ a extensa˜o dos arquivos escritos em linguagem Python. Figura 6: Arquivo inicial python com extensa˜o .py Passado toda essa etapa de preparac¸a˜o e´ hora de comec¸ar a entender as estruturas ba´sicas de Python, que esta˜o presentes em todas as linguagens de programac¸a˜o. Pra comec¸ar, a mais importante para um programador iniciante: A func¸a˜o Print. Toda linguagem tem uma func¸a˜o print, que serve pra imprimir na tela alguma informac¸a˜o requerida pelo programador. Figura 7: Primeiro co´digo em python 6 Aqui, foi pedido pra Python: “Python, imprima ‘Ola´’”. Pra testar esse primeiro co´digo, vamos em “Run”, na aba de opc¸o˜es, e depois em “Run”: Figura 8: Barra de ferramentas do PyCharm O que acontecera´ no rodape´ do PyCharm ... Figura 9: Execuc¸a˜o no PyCharm ... O primeiro comando em Python foi executado. Um adendo: quando for passar Strings literais para a func¸a˜o print, use aspas simples ‘ ’. Isso quer dizer que se quisermos pedir pra Python imprimir na tela um nome, passamos para a func¸a˜o print esse nome entre aspas simples. Do contra´rio, se tivermos uma varia´vel que contenha um nome, apenas precisamos passar pra func¸a˜o print essa varia´vel, sem as aspas simples. Exemplo: Figura 10: Script no PyCharm 7 Se voceˆ clicar em “Run” vai perceber que o resultado foi o mesmo. Nesse caso, o que se fez foi pedir a` Python pra imprimir o que essa varia´vel continha, que aqui e´ uma mensagem de ‘Ola´’. Aqui da´ pra perceber outra propriedade da linguagem: a atribuic¸a˜o de valores a` varia´veis. E Isso se faz com o sinal de igual ( = ) da aritme´tica. Quando colocamos ¡mensagem = ‘Ola´’¿ falamos pra Python: “Python, atri- bua a varia´vel mensagem o valor ‘Ola´’”. Automaticamente Python entendeu que a varia´vel mensagem era uma String, que em linguagem de programac¸a˜o quer dizer basicamente um vetor de caracteres, e atribuiu o vetor de ca- racteres ‘Ola´’ a varia´vel mensagem. 2.1 Entrada e sa´ıda de dados do teclado, varia´veis e operac¸o˜es matema´ticas Python conte´m dois tipos de dados nume´ricos: Int e Float. Os dados de tipo int sa˜o aqueles formados por nu´meros inteiros. Ex.: 1, 2, -1, -200, 70, etc. Pra declara´-lo, basta atribuir no script python a` alguma varia´vel um numero inteiro. Os de tipo Float sa˜o os nu´meros reais epara declara´-los basta chamar a func¸a˜o float() e atribuir ela a uma varia´vel qualquer. Ex.: numInt = int() # aqui, a func¸~ao int() retorna zero e torna # a varia´vel numInt um numero inteiro numFloat = float() # aqui, a func¸~ao float() retorna 0.0 e torna # a varia´vel numFloat um numero real Python e´ uma linguagem de tipagem fraca, o que significa dizer que se atribuirmos um nu´mero real a uma varia´vel que anteriormente t´ınhamos declarado como inteiro essa varia´vel se tornara´ real. Ex.: >>>a = 2 # atribuı´mos o nu´mero inteiro 2 a varia´vel ’a’ >>>print(a) # pedimos para python imprimir na tela o que a 2 # conte´m, python imprimiu 2 >>> a = 2.5 # em seguida atribuı´mos pra mesma a o valor 2.5 >>> print(a) # pedimos pra python pra mostrar o que a conte´m 2.5 # python exibe 2.5 >>> a = ’Ola´, mundo!’ # atribuı´mos a varia´vel ’a’ a String ‘Ola´,mundo!’ >>> print(a) # pedimos pra python imprimir o que ’a’ conte´m >>>Ola´, mundo! # python imprime ‘Ola´, Mundo!’ 8 No PyCharm escrever´ıamos: Figura 11: Script no IDE PyCharm Depois de Executarmos o script : Figura 12: Execuc¸a˜o no PyCharm Em todos os casos, a varia´vel aceitou o tipo de dado diferente sem proble- mas. 2.1.1 Entrada e Sa´ıda de Dados A sa´ıda de dados em python e´ feito com a func¸a˜o print. A func¸a˜o print() pega tudo que e´ colocado dentro dos pareˆnteses e transforma em uma String para ser exibida, como ja´ vimos. Quando formos passar textos literais, basta coloca-los entre aspas simples (’ ’) ou aspas duplas (), mas sempre coinci- dindo. print(‘Ola´, Mundo!’) # String literal mensagem = ‘Ola´, Mundo’ print(mensagem) # conteu´do de uma varia´vel 9 Uma u´nica func¸a˜o print() pode conter va´rios argumentos dentro dos pareˆnteses, contanto que estejam separados por v´ırgula. 1 NumInt = 2 2 NumFloat = 2.5 3 Mensagem = ‘Ola´, mundo!’ 4 print(NumInt, NumFloat, Mensagem) #linha 1: Criamos um inteiro e atribuı´mos 2 como valor #linha 2: Criamos um real e atribuı´mos 2.5 como valor #linha 3: Criamos uma String e atribuı´mos ‘Ola, Mundo!’ como valor #linha 4: pedimos a` python para imprimir seus valores na tela Observac¸a˜o: Colocar cerquilha, sustenido ou jogo-da-velha (#) na frente de instruc¸o˜es em python o transforma em um mero comenta´rio dentro do co´digo, sem nenhum peso na execuc¸a˜o. O interpretador python ignora as linhas de co´digo. No Pycharm: Figura 13: Script no Pycharm Executando: Figura 14: Resultado da execuc¸a˜o do Script print() imprimiu cada paraˆmetro na mesma linha separado apenas por um espac¸o. Outra possibilidade em python e´ ao inve´s de colocarmos o valor 10 no co´digo, pedimos para ele ser entrado via teclado com a func¸a˜o input(). A func¸a˜o input deixa o prompt em espera de um dado vindo do teclado. Ex.: Nome = input(’digite seu nome: ’) A instruc¸a˜o acima e´ uma linha de co´digo simples onde Nome e´ uma varia´vel que vai receber/guardar o valor que sera´ inserido do teclado. Dentro dos pareˆnteses do input() sera´ passado a mensagem a ser exibida para o usua´rio no momento da espera pela entrada do dado. Figura 15: Script no PyCharm Figura 16: Execuc¸a˜o no Pycharm Assim que o usua´rio digitar qualquer palavra, python guardara´ na varia´vel referenciada no co´digo, que nesse co´digo e´ Nome. Python tratara´ qualquer tipo de dado como String, a na˜o ser que se especifique no co´digo que o que se espera e´ um inteiro, ou um numero real. E e´ o que deve ser feito sempre, mesmo quando se esperar uma String, por motivos de boa pra´tica de programac¸a˜o. Assim, a linha de co´digo ficaria: Nome = str(input(’digite seu nome: ’)) NumeroInteiro = int(input(’Digite um numero Inteiro’)) NumeroReal = float(input(’Digite um numero Real’)) 11 No primeiro exemplo, colocamos a func¸a˜o input() com seus paraˆmetros dentro duma func¸a˜o str() que em python serve para especificar que o dado a ser alocado na varia´vel sera´ uma cadeia de caracteres, ou seja, uma String; No segundo exemplo, passamos a func¸a˜o input() com seus paraˆmetros para uma func¸a˜o int(), isso serve para evitar erros de tipagem, se por exemplo, nosso co´digo servir para fazer ca´culos; O ultimo exemplo e´ bem parecido com o a func¸a˜o int(), pore´m e´ uma func¸a˜o float(), que converte a entrada do teclado e passa para a varia´vel um numero real. Figura 17: Script no PyCharm Figura 18: Execuc¸a˜o no Pycharm 2.1.2 Operac¸o˜es matema´ticas O interpretador python ja´ e´ pre-configurado como uma calculadora de operac¸o˜es ba´sicas. Soma (+), subtrair ( - ), multiplicar ( * ), dividir ( / ), e potenciac¸a˜o ( ** ) podem ser escritos normalmente que python realiza os ca´lculos e retorna o valor. 12 Figura 19: Script python Figura 20: Execuc¸a˜o do Script 2.2 Operadores Lo´gicos e Estruturas de Decisa˜o Em python existe outro tipo de dado interessante: o booleano. O dado booleano tem a caracter´ıstica de possuir apenas dois atributos: verdadeiro e falso. Ou, em linguagem pyhton: True e False. 13 (a) (b) Figura 21: Varia´veis booleanas Os operadores lo´gicos booleanos servem em principio para entendermos a estrutura de decisa˜o if, uma das estruturas mais importantes de uma lingua- gem de programac¸a˜o. A estrutura if checa as possibilidades de um bloco de co´digo. Ex.: 1 var_VERDADE = True 2 var_FALSO = False 3 4 if var_VERDADE == True: 5 print(’A varia´vel carrega o valor True’) 6 else: 7 print(’A varia´vel carrega o valor False’) Linha 1 e 2 : Criamos duas varia´veis e definimos o seu valor booleano: True para a varia´vel var_VERDADE e False para a varia´vel var_falso. Linha 4 : Criou-se um bloco if. Esse bloco pergunta se o valor da varia´vel var_VERDADE e´ True. If vai retornar True se essa comparac¸a˜o se concretizar e executara´ o primeiro comando identado. Mas se essa comparac¸a˜o for falsa, o comando a ser executado por python sera´ o subordinado ao else. Nota 1: O uso do duplo sinal de igualdade ( == ) em python significa com- parac¸a˜o. Retorna True ou False para o co´digo que o chamar. Nota 2: Um if na˜o precisa necessariamente de um else, mas todo else precisa de um if, ou um elif. 14 Figura 22: Execuc¸a˜o no PyCharm A varia´vel var_VERDADE carrega o valor True enta˜o nosso co´digo entrou no primeiro print subordinado ao if. O bloco if pode ser resumido simplificadamente assim: ou o co´digo exe- cuta essa instruc¸a˜o, ou executa a outra. Exemplo pra´tico: Pede-se um programa que pec¸a ao usua´rio para entrar com sua idade e checar se ele e´ maior de idade. 1 idade = int(input(’Digite sua idade: ’)) 2 3 if idade >= 18: 4 maiorDeIdade = True 5 else: 6 maiorDeIdade = False 7 8 if maiorDeIdade: 9 print(’Usua´rio maior de idade’) 10 else: 11 print(’Usua´rio menor de idade’) Linha 1: Pedimos ao usua´rio para entrar com um numero inteiro que sera´ armazenado na varia´vel idade. Linha 3 a` 6: O primeiro bloco if e´ criado e armazena True (verdadeiro) na varia´vel maiorDeIdade caso o numero digitado seja maior ou igual a 18; ou False, caso o nu´mero digitado seja menor que 18. Linha 8 a` 11: O segundo bloco if e´ criado para checar o valor da varia´vel maiorDeIdade. Caso o valor de maiorDeIdade seja verdadeiro (True) ele 15 entra na instruc¸a˜o do if e exibe a mensagem Usua´rio maior de idade. Se na˜o, ele entra no else e exibe a mensagem Usua´rio menor de idade. Figura 23: Execuc¸a˜o com usua´rio maior de idade Figura 24: Execuc¸a˜o com usua´rio menor de idade Na estrutura de decisa˜o if ainda existe um terceiro comando: o elif. O elif e´ usado quando o programa tem treˆs ou mais opc¸o˜es de sa´ıda. Por exemplo: Se no co´digo acima, ao inve´s de informar se o usua´rio e´ maior de idade o programa informasse que o usua´rio e´ jovem, adulto ou idoso. Nota1: vamos considerar que jovem e´ menor que 18, adulto maior igual a 18 e menor que 60, e idoso maior ou igual a 60. Nota 2: Nesse caso na˜o se usa a classe booleana pois esta so´ comporta dois valores: True e False. 1 idade = int(input(’Digite sua idade: ’)) 2 3 if idade < 18: 4 print(’O usua´rio e´ jovem.’) 5 elif idade >= 18 and idade < 60: 6 print(’O usua´rio e´ adulto.’) 7 else: 16 8 print(’O usua´rio e´ idoso.’) Linha 1: Pedimos ao usua´rio para entrar com um numero inteiro que sera´ ar- mazenado na varia´vel idade. Linha 3: Checamos se a varia´vel idade guarda um valor menor que 18. Caso for verdade (True) python executa o print da linha 4; Se na˜o, se a varia´vel idade for maior-igual a 18 e (and) menor que 60, python executa o print da linha 6; Se nenhuma das condic¸o˜es anteriores forem atendidas, python executa o co´digo da subjugado ao else. Nota 3: No elif foi usado o operador lo´gico and, que significa e. Esse operador, retorna verdadeiro se todas as expresso˜es usadas na comparac¸a˜o forem verdadeiras; Existe tambe´m o operador lo´gico or (ou), que retorna verdadeiro se pelo menos uma das expresso˜es usadas na comparac¸a˜o forem verdadeiras. Figura 25: Execuc¸a˜o com idade < 18 anos Figura 26: Execuc¸a˜o com idade >= 18 e < 60 anos 17 Figura 27: Execuc¸a˜o com idade > 60 anos 2.3 Strings e listas Uma String e´ uma lista de caracteres com muitas propriedades de mani- pulac¸a˜o, caso necessa´rio. Ja´ sabemos que as Strings podem ser delimitadas por aspas simples ou aspas duplas, contato que elas coincidam. string_aspas_simples = ’Tutorial python’ string_aspas_duplas = ”Tutorial python” Uma caracter´ıstica presente em strings e´ a capacidade de poder percorrer os seus elementos. Python mapeia todos eles como uma lista e cada um tem uma posic¸a˜o definida, comec¸ando de por (zero). Para acessa´-lo, basta usar entre colchetes a posic¸a˜o do caractere requerido. 1 string_aspas_simples = ’Tutorial python’ 2 string_aspas_duplas = "Tutorial python" 3 4 caractere_requerido_aspas_simples = string_aspas_simples[10] 5 caractere_requerido_aspas_duplas = string_aspas_duplas[10] 6 7 print(’ caractere requerido ASPAS SIMPLES: ’ + 8 caractere_requerido_aspas_simples, "\n", 9 "caractere requerido ASPAS DUPLAS: " + 10 caractere_requerido_aspas_duplas) NOTA 1: Nas linhas 1 e 2 foi-se declarado duas strings, umas com aspas simples e outra com aspas duplas. NOTA 2: Nas linhas 4 e 5 foi-se declarado duas varia´veis que recebera˜o os caracteres requeridos, um de cada string. No caso escolhemos o caractere que esta´ na posic¸a˜o 10 de ambas as strings. O nu´mero entre colchetes e´ exatamente isso: a posic¸a˜o do caractere na string, onde ele se encontra na lista de caracteres. 18 Figura 28: Execuc¸a˜o do script no IDE PyCharm Outra propriedade interessante das Strings em python e´ que elas sa˜o mape- adas de tra´s pra frente tambe´m, chamado de me´todo pythonic. Para acessar, por exemplo, o u´ltimo elemento sem saber qual o tamanho da string basta usar [-1] como nu´mero ı´ndice. caractere_requerido_aspas_simples = string_aspas_simples[-1] caractere_requerido_aspas_duplas = string_aspas_duplas[-1] E isso e´ uma regra. [-2] acessa o penu´ltimo, [-3] o antepenu´ltimo, e as- sim por diante. Strings em Python tambe´m podem ser fatiadas em substrings diretamente a partir de seus nu´meros ı´ndices. Isso se faz usando dois pontos ( : ) para de- limitar que parte da string queremos repartir. 1 sublista_aspas_simples = string_aspas_simples[0:6] 2 sublista_aspas_duplas = string_aspas_duplas[6: len(string_aspas_duplas)] NOTA 1: Em ..._aspas_simples[0:6] pediu-se pra python pegar a parte da string que comec¸a em 0 (zero) e termina em 5. O caractere final da subs- tring sera´ o nu´mero escolhido menos 1 [inı´cio_da_substring:fim_da_sub- string - 1]. NOTA 2: em ..._aspas_duplas[6:len(string_aspas_duplas)] foi pe- dido a python para pegar a parte da string que comec¸a em 6 e termina no fim da pro´pria string. Aqui foi-se usado um me´todo da classe string, o me´todo len. Strings sa˜o uma estrutura de dado com atributos e me´todos. Esses me´todos servem para acessar o estado desses atributos. O me´todo len recebe uma string como argumento e retorna o tamanho desta string. 19 tamanho_da_string = len(string_aspas_simples) Aqui foi criado uma varia´vel que vai guardar o tamanho da string a ser passada por argumento. Nesse caso foi-se enviado a string string_aspas_si- mples como argumento. Figura 29: Pedindo para python exibir a varia´vel tamanho da string 2.3.1 Como python mapeia uma string? Ao criarmos uma varia´vel do tipo String, python cria uma lista e coloca cada elemento dessa string nela e atribui um enderec¸o a eles, chamados de subscritos. Ex.: String = ‘Ola´, mundo’ O que python faz ... Figura 30: Lista de caracteres Quando pedimos pra python string[5] estamos pedindo para ele nos dar o elemento que esta na lista de nome string e ocupa a posic¸a˜o 5. 2.3.2 Outros me´todos para manipulac¸a˜o de strings A classe string string conte´m va´rios outros me´todos ale´m do len() ja´ de- monstrado que retorna o tamanho – ou a quantidade de elementos – de uma string. Alguns me´todos importantes sa˜o o o count(), upper(), lower(). O me´todo count() serve para contar um elemento que esteja numa string. Para usa´-lo, escrevemos nome da string.nome do metodo(valor a ser verificado). string = ’Tutorial python’ print(string.count(’o’)) 20 Aqui, pedimos a` python para contar quantos elementos ‘o’ existem na string de nome string. E ele nos retorna que existem dois: Figura 31: Resultado no PyCharm O me´todo upper() faz a string que o chamou ficar toda em caracteres maiu´sculos. string = ’Tutorial python’ print(string.upper()) Figura 32: Execuc¸a˜o da func¸a˜o print O contra´rio do me´todo upper() e´ o me´todo lower(). Ele coloca toda a string que o chamou em caracteres minu´sculos. string = ’TUTORIAL PYTHON’ print(string.lower()) Figura 33: Execuc¸a˜o da func¸a˜o string.lower() Strings tambe´m podem ser somadas com outras strings ou caracteres. Para isso, basta usar o operador de soma +. 21 1 string = ’Tutorial de paython’ 2 print(string) 3 string = string + ’ para n~ao programadores’ 4 print(string) Figura 34: Resultado da concatenac¸a˜o de Strings Na primeira linha foi-se definido uma string de nome string que recebeu a cadeia de caracteres ’Tutorial de python’. Na linha 3 foi pedido pra python ”some string com ’ para na˜o programadores’ e guarde o novo valor em string”. 2.3.3 Listas A classe string e´ uma lista, so´ que restrita a caracteres. Mas o tipo lista se abrange muito mais e comporta todos o tipos de dados poss´ıveis em python. Para declara´-lo basta chamar a func¸a˜o list() ou atribuir a ela valores entre colchetes : nome da lista[tipo int, tipo float, tipo string, tipo lista]. minha lista = list() outra literal = [2, 3.9, ’ola, mundo’, minha lista] As listas tambe´m sa˜o mapeadas por python com subscritos, ou seja, para acessar o elemento dentro dela basta chama-lo pelo nome da lista mais a posic¸a˜o do elemento entre colchetes : nome da lista[posic¸a˜o do elemento]. elemento da minha lista = minha lista[2] Para adicionarmos um elemento na lista usamos o me´todo append(). Escrevemos: nome da lista.append(elemento a ser dicionado). minha\_lista.append(2) minha_lista.append(9.7) minha_lista.append(’Tutorial python’) 22 Figura 35: Execuc¸a˜o dos me´todos da lista O me´todo append() adiciona o elemento sempre no final da lista. Se quisermos discriminar a posic¸a˜o, e´ so´ chamar nome da lista[posic¸a˜o] = ele- mento novo. minha lista[0] = ’ola´’ Para removermos um elemento da lista usamos o me´todo remove(). Es- crevemos: nome da lista.remove(elemento que queremos remover). 1 minha_lista= list() 2 minha_lista.append(2) 3 minha_lista.append(9.7) 4 minha_lista.append(’Tutorial python’) 5 print(minha_lista) 6 minha_lista.remove(2) 7 print(minha_lista) Nota 1: Na primeira linha foi-se criado uma lista de nome minha lista. Nota 2: Da linha 2 a 4 usou-se o me´todo append() para preencher a lista minha lista. Nota 3: Na linha 5 pediu-se a` python para exibir na tela os elementos da lista. Nota 4: Na linha 6 usou – se o me´todo remove() para remover o elemento 2 lista minha lista. Nota 5: Por u´ltimo, na linha 7, pediu-se a python para exibir minha lista para ver o resultado. Outro me´todo de remoc¸a˜o presente na classe list e´ o me´todo pop(). A distinc¸a˜o e´ que esse me´todo remove sempre o u´ltimo elemento da lista. Para usa´-lo, basta chamar nome da lista.pop(), assim, automaticamente a lista que o chamou perdera´ o seu u´ltimo elemento. 23 minha lista.pop() print(minha lista) Figura 36: Execuc¸a˜o do me´todo pop() Se a lista contiver apenas elementos nume´ricos, pode-se usar o me´todo sort() para ordena´-la, basta escrever nome da lista.sort() e a lista que o chamou estara´ ordenada. minha_lista_numerica = [1, 9, 0, 3.4, 8,34, 0.23, 12, -8, -3, -5] print(minha_lista_numerica) minha_lista_numerica.sort() print(minha_lista_numerica) Figura 37: Execuc¸a˜o dos prints: o primeiro desordenado e o segundo orde- nado E, ao passar como argumento do me´todo sort() o comando reverse = True, python organiza a lista nume´rica em ordem decrescente. minha lista numerica.sort(reverse = True) print(minha lista numerica) 24 Figura 38: Lista ordenada em ordem decrescente 2.4 Estruturas de repetic¸a˜o Estruturas de repetic¸a˜o sa˜o func¸o˜es de muitas linguagens de programac¸a˜o. Elas servem basicamente para repetir determinada tarefa. Em python vamos conhecer a estrutura for e a estrutura while. 2.4.1 Estrutura de repetic¸a˜o for For, basicamente, executa uma func¸a˜o com quantidade delimitada e co- nhecida. Para isso, ele faz uso de outra func¸a˜o de python: a func¸a˜o range(). Range() gera um alcance para o for, ale´m de delimitar o passo que sera´ se- guido para executar esses comando. Ex.: a = range(10) A varia´vel a recebeu uma lista de 0 a` 9. Ela sera´ usada como delimitador do lac¸o for. for i in a: print(i, end = ’ ’) # o para^metro end = ‘ ’ impede # que o print pule uma linha Quando chama-se a construc¸a˜o for para fazer um lac¸o, tem-se que seguir exatamente esses passo: for varia´vel de controle in tamanho da repetic¸a˜o: Figura 39: Iterac¸a˜o do lac¸o for O operador in em python serve para “verificar a associac¸a˜o em listas” (Grus, p. 20), o que significa dizer que, ao criarmos a varia´vel i, python a inicializa automaticamente com 0 (zero) e checa se ela esta na lista criada 25 pelo range(). A cada repetic¸a˜o do lac¸o for, i vai sendo acrescentada com + 1, quando i conter um valor que na˜o pertence a lista criada pelo range(), ele para a rotina e sai do lac¸o. Existe tambe´m a possibilidade de definirmos de onde a sequencia gerada por range() deve comec¸ar. Se passarmos por argumentos dois nu´meros, sera´ encarado por range() como o in´ıcio e o fim da sequeˆncia. a = range(5, 10) for i in a: print(i, end = ’ ’) Figura 40: Execuc¸a˜o do lac¸o for do elemento 5 ate´ o 9 Outra possibilidade e´ passarmos ao range() treˆs paraˆmetros. Nesse caso, python interpreta que o terceiro paraˆmetro sera´ o nosso incrementador, ou seja, ao inve´s de somar 1 na varia´vel de controle, python somara´ o numero que foi passado para o range() como terceiro paraˆmetro. a = range(0, 10, 2) for i in a: print(i, end = ’ ’) Figura 41: Execuc¸a˜o do lac¸o for com um incrementador de valor = 2 26 Para que o range() crie uma sequencia decrescente e´ necessa´rio passar como varia´vel controladora um nu´mero negativo, ale´m dessa lista conter ini- cio > fim. a = range(10, 0, -1) for i in a: print(i, end = ’ ’) Figura 42: Lista decrescente com incrementador = -1 2.4.2 Estrutura de repetic¸a˜o while While() tambe´m serve para repetir comandos, mas e´ usado quando na˜o se sabe o fim dessas iterac¸o˜es. Exemplo: Um programa que pec¸a ao usua´rio para digitar um nu´mero que esteja dentro de um conjunto predeterminado. Caso o usua´rio digite um numero que esteja dentro do conjunto, o programa exibira´ uma mensagem ’Nu´mero digitado pertence ao conjunto’, caso contra´rio, o programa conti- nuara´ pedindo para o usua´rio entrar com um nu´mero. conjunto = [10, 9, 8, 28, 15, 17] num = int(input(’Digite um numero: ’)) while(num not in conjunto): num = int(input(’Digite um numero: ’)) print(’Nu´mero digitado pertence ao conjunto’, conjunto) 27 Figura 43: Execuc¸a˜o do lac¸o while() com cinco tentativas O operador not in age de maneira inversa ao in, e checa se algo na˜o esta´ na lista. In retorna True (verdadeiro) se estiver e False (falso) se na˜o estiver. Not in retorna True se na˜o estiver e False se estiver. O que tem que ser entendido e´: enquanto a condic¸a˜o do while estiver sendo satisfeita, ele executara´ o co´digo dentro de seu escopo, ou seja, enquanto not in estiver retornando verdadeiro (True) ele vai pedir para o usua´rio digitar um numero. Exemplo 2: Um programa que pec¸a uma palavra-chave/senha para o usua´rio. Caso a palavra-chave digitada esteja incorreta, exibir a mensagem ‘Senha incorreta. Acesso negado’; caso o usua´rio digite a senha correta, exiba ‘Senha correta! Acesso permitido’. PalavraChave = ’TutorialPython’ # definic¸~ao da chave # de permiss~ao senha = str(input(’Digite a senha: ’)) while(senha != PalavraChave): print(’Senha Incorreta. Acesso NEGADO.’) senha = str(input(’Digite a senha: ’)) print(’Senha Correta! Acesso PERMITIDO.’) 28 Figura 44: Tentativa de acesso com uma senha incorreta e depois com a senha correta Foi-se passado como argumento da func¸a˜o while() uma comparac¸a˜o entre duas strings. O operador != (exclamac¸a˜o + igual) significa diferente. Esse operador retorna True (verdadeiro) quando as varia´veis comparadas sa˜o diferentes e False (falso) em caso de varia´veis iguais. Ou seja, a condic¸a˜o para que a func¸a˜o while() se repita e´ a diferenc¸a entre a palavra-chave guardada pelo sistema e a palavra chave digitada pelo usua´rio ser verdadeira (True) 2.5 Estrutura de Dados 2.5.1 Tuplas (Tuples) Tuplas, ou em python, tuples, sa˜o estruturas de dados semelhantes as listas, mas com uma propriedade singular: elas sa˜o imuta´veis. Basicamente, uma tuple e´ uma lista de elementos imuta´veis. Para criar uma tuple basta atribuir valores em pareˆnteses a` alguma varia´vel. Ex. 1: Minha Tuple = (1, 2, 3, 4, 5, 6, 7, 8). 1 Minha Tuple = (1, 2, 3, 4, 5, 6, 7, 8) 2 3 print(Minha Tuple) Os elementos de uma Tuple tambe´m sa˜o mapeados como em uma string e podem ser encontrados usando o seu subscrito. Ex.: Elemento da tuple = Minha Tuple[subscrito]. Ex. 2: elemento da tuple = Minha Tuple[2] 29 Figura 45: Execuc¸a˜o do Ex. 1 e Ex. 2 Tuples tambe´m podem simular um fatiamento, como as strings, e tambe´m podem ser somadas (concatenadas), pore´m, o resultado tem que ser guardado em outra tupla. Ex. 3: 5 outra tuple = Minha Tuple + (10, 11, 12, 13) 6 tuple fatiada = Minha Tuple[0:2] Figura 46: Execuc¸a˜o das Linhas 1, 5 e 6 No fatiamente (slice) das tuplas usa-se colchetes [ ] assim como nas strings. 2.5.2 Conjuntos (Sets) A estrutura de dado Set e´ feito em python para conjunto de dados na˜o dupli- cados. Essa caracter´ıstica tambe´m serve para converter conjuntos com dados duplicados para conjuntos com dados na˜o duplicados. 1 cesto de frutas = [’mac¸a˜’, ’laranja’, ’mac¸a˜’, ’pera’, ’laranja’, ’banana’] 2 3 frutas = set(cesto de frutas) 30 Figura 47: Execuc¸a˜o da linha 3 A criac¸a˜o de um set e´ simples, basta passar como argumentoum vetor e o set se organizara´ em uma lista de dados unita´rios. Apesar de ser organizado em forma de lista, o tipo do dado formado e´ um set, com os atributos e me´todos dessa classe. Isso implica em dizer que: os elementos na˜o tem uma ordem. Pore´m, pode usar o operador in para verificar se algum elemento esta´ no set. if(’mac¸~a’ in frutas): print(’Mac¸~a esta´ no Set’) Figura 48: Resultado da execuc¸a˜o do if Dois me´todos importantes para os sets sa˜o o add e o remove. A func¸a˜o do me´todo add e´ adicionar um novo elemento ao set enquanto a func¸a˜o remove e´ remover um elemento do set. frutas = {’mac¸~a’, ’laranja’,’pera’,’banana’} # Criac¸~ao do set ‘frutas’ print(frutas) # Imprime na tela o # set criado frutas.add(’goiaba’) # Adiciona novo elemento # ao set print(frutas) # Imprime na tela o # set com o novo elemento 31 Figura 49: Execuc¸a˜o dos Sets: original e alterado frutas.remove(’mac¸~a’) # Remove o elemento ’mac¸~a’ print(frutas) # Imprime o set com o elemento ‘mac¸~a’ removido Figura 50: Execuc¸a˜o do novo set sem o elemento ’mac¸a˜’ Set comporta as operac¸o˜es matema´ticas tradicionais de conjuntos: unia˜o, intersecc¸a˜o, diferenc¸a, e diferenc¸a sime´trica. cesto_de_frutas = [’laranja’, ’mac¸~a’, ’pera’, ’banana’] cesto_de_verduras = [’cenoura’, ’xuxu´’, ’repolho’] frutas = set(cesto_de_frutas) verdura = set(cesto_de_verduras) cesto_de_compras = frutas.union(verdura) print(cesto_de_compras) No co´digo acima, a varia´vel cesto de compras recebeu a unia˜o entre os dois sets (conjuntos), o de frutas e o de verduras. Para isso, bastou chamar a func¸a˜o/me´todo union contida no set frutas e passar por argumento o set verduras. O inverso tambe´m poderia ser feito, ou seja, chamar o me´todo union do set verduras e passar como argumento o set frutas, ja´ que tanto frutas como verduras sa˜o sets e possuem os mesmos me´todos. 32 Figura 52: Exibic¸a˜o no novo set Figura 51: Exibic¸a˜o da varia´vel cesto de compras * O resultado da execuc¸a˜o e´ diferente a cada execuc¸a˜o, pois o tipo de dado set e´ um conjunto na˜o ordenado. Para usar a operac¸a˜o intersecc¸a˜o nos sets basta chamar a func¸a˜o/me´todo intersection. cesto_de_frutas = [’laranja’, ’mac¸~a’, ’pera’, ’banana’] cesto_de_frutas2 = [’uva’, ’pera’, ’tangerina’, ’laranja’] frutas = set(cesto_de_frutas) frutas2 = set(cesto_de_frutas2) inter_frutas = frutas.intersection(frutas2) print(inter_frutas) A varia´vel inter frutas recebeu um novo set com a intersecc¸a˜o do set frutas com o set frutas2 e gerou um terceiro set com o elemento de intersec¸a˜o entre os dois conjuntos, nesse caso, o elemento ‘laranja’. Para usar a operac¸a˜o de diferenc¸a entre conjuntos basta usar o me´todo/func¸a˜o differerence. cesto_de_frutas = [’laranja’, ’mac¸~a’, ’pera’, ’banana’] cesto_de_frutas2 = [’uva’, ’pera’, ’tangerina’, ’laranja’] frutas = set(cesto_de_frutas) 33 frutas2 = set(cesto_de_frutas2) difer_frutas = frutas.difference(frutas2) print(difer_frutas) No co´digo acima, a varia´vel difer frutas recebe o set resultante da dife- renc¸a dos conjuntos frutas – frutas2. Figura 53: Diferenc¸a entre os sets frutas e frutas2 Observar que a ordem numa relac¸a˜o de diferenc¸a em conjuntos importa. Se colocar-se frutas2 – frutas o resultado seria diferente. difer frutas = frutas2.difference(frutas) # Em Python Figura 54: Ordem invertida do me´todo difference sendo usado a partir do set frutas2 O me´todo symmetric difference dos sets() retorna um set com a dife- renc¸a sime´trica dos conjuntos. difer symm frutas = frutas.symmetric difference(frutas2) Na linha de co´digo acima foi-se criado a varia´vel difer symm frutas que ira´ cortar a diferenc¸a sime´trica entre entre os sets frutas e frutas2. 34 Figura 55: Diferenc¸a sime´trica entre os sets frutas e frutas2 2.5.3 Diciona´rios (Dicts) Existe uma estrutura de dado em Python chamada dicts. Essa estrutura de dado ordena os valores em pares, associando um ao outro. Esses pares associados recebem nomes especiais: Chave e Valor, ou, key e value em Python. Qualquer tipo de dado na˜o muta´vel pode ser uma key (chave). A maneira de se criar um dict e´ dando-lhe um nome, seguido de cha- ves , e dentro das chaves estara˜o os pares associados por dois pontos ( : ): nome do diciona´rio = {chave1 : valor1, chave2 : valor2, chave3 : valor3}. Ex.: Um dict para comportar nu´meros de telefone: lista\_telefonica = {’jo~ao’ : ’9999-8888’, ’claudio’ : ’8888-9090’, ’ana’ : ’6666-3333’} Para acessar os elementos de um dict basta usar os me´todos Keys() e values(), eles retornam todos os valores presentes no dict. print(lista telefonica.values()) print(lista telefonica.keys()) Figura 56: Exibic¸a˜o dos valores e chaves do diciona´rio lista telefonica As chaves de um dict funcionam como subscrito e para alterar os valores associados a` elas basta passa´-las entre colchetes: 35 Figura 58: Exibic¸a˜o do dict com os novos elementos lista telefonica[’joa˜o’] = ’7777-3333’ Figura 57: Adic¸a˜o da nova chame e valor no diciona´rio Na execuc¸a˜o do co´digo acima tem-se dois prints, um antes e outro depois da alterac¸a˜o na chave ‘joa˜o’ com o valor ‘7777-3333’. Para adicionar algum elemento no dict basta passar por subscrito a nova chave e atribuir a ela um valor. lista telefonica[’carmen’] = ’2222-5555’ 2.6 Me´todos e Func¸o˜es Me´todos ou Func¸o˜es e´ a capacidade que a linguagem tem de modularizar um co´digo. Um me´todo e´ uma parte do script que realiza uma func¸a˜o es- pec´ıfica. Ao longo de todo esse tutorial usamos va´rias func¸o˜es que ja´ vem embutidas na linguagem python por padra˜o. Print e´ uma delas. Passamos como argumento para print() as informac¸o˜es que queremos que ele retorne como string na tela. Python permite que o programador escreva suas pro´prias func¸o˜es. For- malmente, para se criar uma func¸a˜o basta usar o a palavra reservada em python def seguida do nome da func¸a˜o acompanha de pareˆnteses () que in- dicam a quantidade de argumentos que essa func¸a˜o ira´ receber. Faz parte do escopo da func¸a˜o o que ela faz depois de processado seus dados, e para isso usa-se a palavra reservada return. Ex.: def nome da func¸a˜o(argumento1, argumento2, argumento3, ...): 36 def funca_soma(num1, num2): soma = num1 + num2 return soma Acima temos uma func¸a˜o/me´todo chamada funca soma. Ela recebe dois nu´meros como argumento, num1 e num2, soma os dois e guardam o valor dessa soma na varia´vel soma, e retorna essa soma para o co´digo que a cha- mar. Pra chamar essa func¸a˜o basta usar o nome dela e passar dois nu´meros por paraˆmetro, ale´m de guardar o valor de retorno em alguma varia´vel nova. valor de retorno = funca soma(4, 7) print(valor de retorno) Figura 59: Resultado da func¸a˜o soma com os paraˆmetros 4 e 7 Func¸o˜es na˜o precisam ter argumento e nem mesmo retornar algo. Nesse caso, basta deixa vazio o espac¸o entre pareˆnteses. def func_imprime_mensagem(): print(’Ola´, mundo’) func_imprime_mensagem() Figura 60: Resultado de uma chamada sem paraˆmetro de chamada e sem valor de retorno 37 2.7 Python Orientado a Objetos Programac¸a˜o Orientada a Objetos (POO) e´ um paradigma de programac¸a˜o que permite modularizar ainda mais o co´digo, permitindo ao programador estruturar a programac¸a˜o em volta de problemas pro´ximos do mundo real, ou, como pensamos um problema no mundo real. Python tambe´m permite esse n´ıvel de programac¸a˜o. Em POO pensa-se no co´digo divido por classes, e essas classes contem atributos e me´todos. Uma classe e´ uma “receita” de um objeto que sera´ criado quando requisitado pelo co´digo. Ao longo desse tutorial foi-se tra- balhado com va´rias classes: int, float, set ... todas elas sa˜o classes para python. Python permite ao usua´rio criar suaspro´prias classes, com seus pro´prios atributos e me´todos. 2.7.1 Sintaxe Ba´sica, Construtor e Me´todos Suponha-se que o programador deseje construir um objeto pessoa. Esse programador precisaria passar para python as instruc¸o˜es de como construir esse objeto, ou seja, ele teria que escrever uma classe pessoa. Para isso, ele escreveria no script : class pessoa: def __init__(self, nome, idade, altura, peso): self.nome = nome self.idade = idade self.altura = altura self.peso = peso Uma pessoa, a depender do objetivo do programa, tem pelo menos quatro atributos: nome, idade, altura e peso. Atributos sa˜o o que se pode chamar de caracter´ısticas dos objetos. O me´todo __init__ constro´i o objeto pessoa com as caracter´ısticas passadas por paraˆmetro no momento que a classe for chamada no co´digo. E nesse momento, ele constro´i e inicializa todos os atributos com os valores passados por paraˆmetro. Um adendo: No PyCharm sera˜o criados duas abas de script python. Em uma, se escrevera´ o co´digo das classes, e em outro o script principal, chamado de main.py, que usara´ essas classes. 38 (a) (b) Figura 61: (a) Arquivo pessoa.py que contera´ a classe Pessoa Figura 62: (a) Arquivo main.py que contera´ a classe principal do programa Para usarmos co´digos de outro script temos que importa-lo para dentro do co´digo que o requisitar. Para isso, usa-se o comando from + nome do script + import + nome da classe. Isso faz com que o script principal reconhec¸a o co´digo e os novos tipos de dados criados por outro script dentro do mesmo projeto. from pessoa import Pessoa # aqui, estamos pedindo pra python: do script pessoa, # importe a classe Pessoa Dentro do arquivo pessoa.py temos uma classe Pessoa. Para criarmos um objeto pessoa basta escrever o nome da classe + os paraˆmetros que o seu construtor pedir. No caso da classe Pessoa, os paraˆmetros estabelecidos em __init__ para a construc¸a˜o desse objeto sa˜o: nome, idade, altura e peso. Ou seja: no momento que criarmos esse objeto, automaticamente temos que passar esses valores. p = Pessoa(’Joa˜o’, 12, 13, 14) # Passou-se como paramentros de nome, idade, altura e peso # os valores: Jo~ao, 12, 13 e 14. Valores que ser~ao usados # pelo construtor da classe pessoa para criar o objeto Pessoa Do mesmo jeito que p poderia ser um int(), um float(), um dict(), p e´ uma Pessoa(). Para acessar os valores dos seus atributos basta escrevermos nome da varia´vel.nome do atributo. 39 print(p.peso) # pedimos para a func¸~ao print exibir o atributo peso do objeto Figura 63: Exibic¸a˜o do valor guardado no atributo peso do objeto Pessoa Para alterarmos o valor de um atributo no objeto basta escrevermos nome do objeto.nome do atributo. p.peso = 12 # alterac¸~ao do atributo peso do objeto Figura 64: Exibic¸a˜o do novo valor do atributo peso Python e´ uma linguagem muito aberta e o paradigma POO, de certa forma, na˜o e´ sentido. Em outras linguagens - Java ou C# - o programador fica restringido a programar dentro do paradigma. Por exemplo: para acessar os atributos seria obrigato´rio implementar me´todos dentro da classe que torna- se esse caminho poss´ıvel. Em python na˜o e´ necessa´rio. Pore´m, e´ boa pra´tica de programac¸a˜o fazeˆ-lo. Enta˜o, dentro da classe pessoa, seria interessante me´todos que retornassem o estado dos atributos. def retornaNome(self): return self.nome def retornIdade(self): 40 return self.idade def retornaAltura(self): return self.altura def retornPeso(self): return self.peso Agora, para acessarmos seus atributos utilizaremos seus me´todos espec´ıficos para isso. print(’Peso: ’, p.retornPeso()) Figura 65: Valor de retorno do me´todo retornPeso() da classe Pessoa 2.7.2 Heranc¸a, Super e Polimorfismo Classes sa˜o receitas gene´ricas de objetos. A cada n´ıvel de detalhe que chegar esse objeto, o programador teria que reescrever seu co´digo inteiro, colocando os atributos e me´todos espec´ıficos desse novo objeto. Por exemplo: Um cliente e´ uma pessoa, com atributos e me´todos a mais – RG, CPF, numero de carta˜o, saldo, etc. Para isso python permite usar a Heranc¸a, que e´ uma caracter´ıstica de POO. A Heranc¸a poupa retrabalho do programador, criando classes filhas duma classe ma˜e mais gene´rica a` medida que o co´digo for se especificando. Para criar uma classe filha basta que, no momento da declarac¸a˜o desta, se passe por paraˆmetro a classe ma˜e. class Cliente(Pessoa): A classe filha herda atributos e me´todos da classe ma˜e e, na imple- mentac¸a˜o de seu construtor __init__() passa-se por paraˆmetro os atributos da classe ma˜e e da classe filha. def init (self, nome, idade, altura, peso, rg, cpf, numCartao, saldo): 41 Dentro do construtor da classe filha acessa-se o construtor da classe ma˜e usando o me´todo super(), um me´todo especial para o uso da heranc¸a em POO. super(). init (nome, idade, altura, peso) Polimorfismo e´ a capacidade que as classes tem de subscrever os me´todos da classe ma˜e, ou seja: A classe Cliente pode ter os mesmos me´todos que a classe Pessoa, inclusive com o mesmo nome. Se isso acontecer, no momento em que for chamado, o co´digo chamado sera´ o da classe filha e na˜o o da ma˜e. # arquivo pessoa.py class Pessoa: def __init__(self, nome, idade, altura, peso): self.nome = nome self.idade = idade self.altura = altura self.peso = peso def retornaNome(self): print(’Nome da pessoa: ’, self.nome) def retornIdade(self): print(’Idade da pessoa: ’, self.idade) def retornaAltura(self): print(’Altura da pessoa: ’, self.altura) def retornaPeso(self): print(’Peso da Pessoa: ’, self.peso) class Cliente(Pessoa): def __init__(self, nome, idade, altura, peso, rg, cpf, numCartao, saldo): super().__init__(nome, idade, altura, peso) self.rg = rg self.cpf = cpf self.numCartao = numCartao self.saldo = saldo def retornaNome(self): 42 print(’Nome do Cliente: ’, self.nome) def retornIdade(self): print(’Idade do Cliente: ’, self.idade) def retornaAltura(self): print(’Altura do Cliente: ’, self.altura) def retornaPeso(self): print(’Peso do Cliente: ’, self.peso) # arquivo main.py 1 from pessoa import Pessoa # importa a classe Pessoa do arquivo pessoa.py 2 from pessoa import Cliente # importa a classe Cliente do arquivo cliente.py 3 4 5 p = Pessoa(’Jo~ao’, 12, 13, 14) 6 c = Cliente(p.nome, p.idade, p.altura, p.peso, 7 ’1287236122 90’, ’048.855.985-59’, 8 ’1234 1234 1234 1234 1234’, 100.00) 9 10 p.retornaPeso() 11 12 c.retornaPeso() Explicac¸a˜o de alguns pontos do co´digo main.py : As linhas 1 e 2 usam duas func¸o˜es importantes de python: from e im- port. A func¸a˜o import serve para que co´digos escritos em outro script sejam usados pelo co´digo que o chamar, desde que estejam dentro do mesmo projeto. Ja´ a func¸a˜o from especifica o que do script quer importar, facili- tando na hora da escrita do co´digo. Ao importar apenas o script pessoa.py ter´ıamos que sempre dizer pra python o que queremos de pessoa.py cada vez que quise´ssemos criar uma Pessoa ou um Cliente. Ao usarmos from pode- mos chamar as classes do co´digo pessoa.py como se elas estivessem escritas dentro do co´digo main.py. 43 Figura 66: Execuc¸a˜o dos me´todos retornPeso() de Pessoa e retornPeso() de Cliente 2.7.3 Atributo/Me´todos Esta´ticos e Encapsulamento POO em python permite definir atributos e me´todos esta´ticos. Que sa˜o atributos acessados somente pela classe e na˜o pelo objeto. Esse tipo de atributo/me´todo permite o controle de certos aspectos interessantes a` classe e na˜o a nenhum objeto em particular. Exemplo: A quantidade de clientes cadastrados em determinado sistema e´ uma informac¸a˜o relativa a` classe Cli- ente e na˜o a` qualquer objeto cliente que venha a ser instanciado. Assim,esse atributo pertence a` classe Cliente e na˜o ao objeto cliente. Atributos esta´ticos sa˜o declarados fora dos me´todos, geralmente no cabec¸a- lho da classe: class Cliente(Pessoa): totalDeClientes = 0 Aqui, criou-se um atributo esta´tico totalDeClientes e inicializamos com o valor zero. Para acessa´-los dentro da classe basta escrever o nome da Classe.n- ome do atributo esta´tico. Cliente.totalDeClientes += 1 Nesse caso, estamos somando 1 cada vez que uma novo objeto tipo Cliente e´ criado. from pessoa import Pessoa from pessoa import Cliente p = Pessoa(’Jo~ao’, 12, 13, 14) c = Cliente(p.nome, p.idade, p.altura, p.peso, ’1287236122 90’, ’950.729.080-03’, ’1234 1234 1234 1234 1234’, 100.00) p.retornaPeso() 44 c.retornaPeso() print(Cliente.totalDeClientes) p2 = Pessoa(’Pedro’, 23, 34, 89) c2 = Cliente(p2.nome, p2.idade, p2.altura, p2.peso, ’1237346342 90’, ’556.181.920-80’, ’3456 1234 4567 1234 6879’, 200.00) p2.retornaPeso() c2.retornaPeso() print(Cliente.totalDeClientes) Figura 67: Execuc¸a˜o do contador da classe Cliente Me´todos esta´ticos tem basicamente a mesma func¸a˜o, e para declara´-lo basta, ao inve´s do self que e´ passado por paraˆmetro obrigatoriamente ao criarmos um me´todo de objeto, deixamos o campo de paraˆmetros do me´todo vazio, isso indica a` python que esse me´todo e´ esta´tico e pertence a` classe. Para exemplificar, sera´ implementado um me´todo esta´tico para informar o total comprado por todos os clientes. Para isso, sera´ criada uma varia´vel esta´tica totalDeCompras que ira´ somar o total de compras feito pelos clientes toda vez que um novo objeto Cliente e´ instanciado; depois um me´todo esta´tico retornaTotalCompras que nos informara´ esse valor, caso solicitado. class Cliente(Pessoa): totalDeClientes = 0 totalDeCompras = 0 45 # bloco de co´digo # def retornaTotalCompras(): return Cliente.totalDeCompras No script main.py adiciona-se mais uma linha de co´digo: print(’Total de Compras: ’, Cliente.retornaTotalCompras()) Figura 68: Retorno da func¸a˜o retornaTotalCompra() com o valor guar- dado pelo atributo O encapsulamento em python e´ simples e so´ tem dois estados: public e private. Encapsulamento de me´todos e atributos e´ a capacidade que a classe tem de permitir ou na˜o o acesso a eles. Um atributo ou me´todo com n´ıvel de encapsulamento public pode ser chamado diretamente por qualquer co´digo. Por exemplo: Se escrevermos p.nome python nos retorna o atributo nome sem problemas, porque, ao definirmos o atributo nome na classe Pes- soa na˜o definimos ela como private. E para fazermos isso colocamos dois underlines ( ) na frente do nome do atributo ou me´todo que desejar se colocar como private. self. nome = nome self. idade = idade self. altura = altura self. peso = peso Agora, o atributo se chama nome, idade, altura, peso e seus valores so´ podem ser acessados por me´todos do objeto e fica a cargo do programador 46 implementar tais me´todos. Me´todos tambe´m podem ser encapsulados como private e seguem a mesma regra dos underlines. def __retornaNome(self): print(’Nome do Cliente: ’, self.nome) def __retornIdade(self): print(’Idade do Cliente: ’, self.idade) Agora os me´todos retornaNome(self) e retornaIdade(self) so´ podem ser acessados por me´todos da classe e na˜o mais fora do co´digo livremente. O encapsulamento dos atributos e´ um crite´rio do programador que vai levar em considerac¸a˜o a natureza do projeto que esta´ sendo desenvolvido. 47 3 Refereˆncias GRUS, J. Data Science do Zero:Primeiras regras com python. Traduc¸a˜o Welington Nascimento, Rio de Janeiro : Alta Books, 2016. 48