Baixe o app para aproveitar ainda mais
Prévia do material em texto
PROVA MATCOMP 2° Tópico: Python e Spyder 1-O console é usado para: R: Executar imediatamente uma instrução 2-O IDE Spyder está disponível para ser instalado de graça em: R:Windows, Linux e Mac OS X 3-Os programas escritos na linguagem Python precisam ser compilados antes de serem executados pelo processador? R:Falso 4-Um aquivo fonte contém: R:Uma seqüência de instruções 5-È possível rodar programas escritos em Python no Windows? R:Verdadeiro 6-Selecione as linguagens compiladas da lista a seguir: R:Fortran, Pascal 7-Para usar a linguagem Python é preciso ter instalado um IDE? R:Falso 8-Só é posíivel usar Python se tivermos Spyder instalado? R:Não. Podemos usar Python sem ter instalado Spyder 3° Tópico: Variáveis e Operações básicas Avaliação sobre variáveis 1-Para permitir o gerenciamento da memória principal: R:Todos os compartimentos têm o mesmo tamanho, Ela está dividida em compartimentos, Cada compartimento possui um endereço único. 2-O seguinte nome de variável é válido: (nome_completo) R: Falso 3-O seguinte nome de variável é válido: 12_sobrenome R: Falso 4-O seguinte nome de variável é válido: contador 6 R: Falso 5-O seguinte nome de variável é válido: PrimeiroTempo R: Verdadeiro 6- O seguinte nome de variável é válido: primeiroTempo R: Verdadeiro 7- O seguinte nome de variável é válido: Está_Correto R: Falso 8- O seguinte nome de variável é válido: nome.completo R: Falso 9- O seguinte nome de variável é válido: Nome_____Comprido R: Verdadeiro 10- O seguinte nome de variável é válido: nome_completo R: Verdadeiro Avaliação sobre console 1- Qual é o resultado que Python retorna ao avaliar a seguinte expressão: 3.0 * "bingo" R: Python gera uma mensagem de erro. 2- Qual será o resultado que Python responde ao executar o último comando da seguinte figura? R: e. Python gera uma mensagem de erro. 3- Qual é o resultado que Python retorna ao avaliar a seguinte expressão: 12 + ( 3 < 5 ) + 10 R: 23 4- Qual será o resultado que Python responde ao executar o último comando da seguinte figura? R: ola ola ola ola 5- Qual será o resultado que Python responde ao executar o último comando da seguinte figura? R: True 6- Qual é o resultado de avaliar a seguinte expressão em Python? 1.0 + True R: 2.0 7- Qual é o resultado que Python retorna ao avaliar a seguinte expressão? 12 + 3 < 5 + 10 R: False 8- Qual será o resultado que Python responde ao executar o último comando da seguinte figura? R: Nenhuma das opções. 9- Qual é o resultado que Python retorna ao avaliar a seguinte expressão: - 3.0 * 2 < 21 / 30 R: True 10- Qual é o resultado que Python retorna ao avaliar a seguinte expressão? "bla" * 3 R: 'blablabla' 4° Tópico: Strings, trabalhando com texto 1- O método isdigit( ) das strings permite saber se todos os caracteres de uma string dada são dígitos: o método responde Truese for verdade ou False no caso contrário. Qual será o resultado dos seguintes dois comandos? s = "123.45" print s.isdigit( ) R: False 2- O método capitalize() das strings permite transformar a primeira letra de uma string em maiúscula. Qual será o resultado dos seguintes dois comandos? s = "palavra magica: abracadabra" print s.capitalize() R: Palavra magica: abracadabra 3- Qual é o resultado de dar o seguinte comando no console? print 'Bom' + ' ' + 'dia!' R: Bom dia! 4- O método startswith( 'substring' ) das strings permite saber se uma string dada começa com 'substring': o método respondeTrue se for verdade que 'substring' aparece no final ou False no caso contrário. Qual será o resultado dos seguintes dois comandos? s = "palavra magica: abracadabra" print s.startswith( "ala" ) R: False 5- O método count( 'substring' ) das strings permite contar quantas vezes 'substrings' aparece numa string dada. Qual será o resultado dos seguintes dois comandos? s = "palavra magica: abracadabra" print s.count( "ra" ) R: 3 6- Qual é o resultado de dar o seguinte comando no console? 'bra ' in 'abracadabra' R: False 7- Qual é o resultado de dar o seguinte comando no console? 'BRA' in 'abracadabra' R: False 8- Qual é o resultado de dar o seguinte comando no console? print 4 / 2 * 'eco ' R: eco eco 9- Qual é o resultado de dar o seguintes comandos no console? nome = 'Pedro' print 'Ola' + ' ' + nome R: Ola Pedro 10- O método isupper( ) das strings permite saber se todas as letras de uma string dada são maiúsculas: o método responde Truese for verdade ou False no caso contrário. Qual será o resultado dos seguintes dois comandos? s = "Password = Segredo" print s.isupper( ) R: False 5° Tópico: Interfaces gráficas básicas Avaliação sobre console e interfaces gráficas 1- No Spyder podemos escolher qualquer pasta como diretório de trabalho. R: Verdadeiro. 2- Escolha todos os comandos que geram a seguinte janela: R:easygui.msgbox("Qual será a resposta certa?", "Avaliação fácil") easygui.msgbox("Qual será a resposta certa?", "avaliação fácil".capitalize()) easygui.msgbox("Qual será" + " a resposta certa?", "Avaliação fácil") 3- As janelas que podemos usar contidas no módulo easygui só servem para mostrar mensagens padrão fixas. R: Falso 4- Escolha todos os comandos que geram a seguinte janela: R: easygui.enterbox("Digite a sua data de nascimento" + " (dd/mm/yy)", "ficha de cadastro".capitalize()) data_nascimento = easygui.enterbox("Digite a sua data de nascimento (dd/mm/yy)", "Ficha de cadastro") easygui.enterbox("Digite a sua data de nascimento (dd/mm/yy)", "Ficha de cadastro") 5- Precisamos copiar no diretório de trabalho aqueles módulos que preciisamos mas que não foram instalados no mesmo diretório onde se encontra o interpretador de Python. R: Verdadeiro 6- Para usar os recursos oferecidos pelo módulo easygui precisamos copiar o arquivo easygui.py para a pasta apontada como nosso diretório de trabalho. R: Verdadeiro 7- No diretório de trabalho encontram-se intalados todos os módulos usados por Python. R: Falso 8- As janelas que podemos usar contidas no módulo easygui são adaptadas às nossas necessidades mudando os argumentos das funções correspondentes. R:Verdadeiro 9- Escolha todos os comandos que geram a seguinte janela: R: nome = easygui.enterbox("qual e o seu nome?".capitalize(), "Cadastro de Usuario") easygui.enterbox("Qual e o seu nome?", "Cadastro de Usuario") nome = easygui.enterbox("Qual e o seu nome?", "Cadastro de Usuario") 10- Para usar os recursos oferecidos pelo módulo easygui precisamos usar um programa instalador no sistema operacional. R:Falso Avaliação para escrever programas 1- funções contidas no módulo easygui usam etiquetas para os seus argumentos para permitir que o programador possa chamar a função com os argumentos em qualquer ordem. R: Verdadeiro 2- Se o programa que estamos escrevendo usa as janelas disponíveis no módulo easygui então precisamos guardar o arquivo do programa na mesma pasta que se encontra o arquivo easygui.py. R: Verdadeiro 3- As strings delimitadas por três aspas duplas (ou simples) informam ao Python o tipo de codificação usada no arquivo. R: Falso 4- O símbolo # indica ao Python que tudo o que aparecer a seguir até o final da linha não contém nenhum comando a ser executado. R: Verdadeiro 5- O comentário # -*- coding: utf-8 -*- pode ser inserido na primeira, segunda, terceira, quarta ou quinta linha do arquivo. R: Falso 6° Tópico- Estruturas de Dados I: Listas e Tuplas 1- Considere a seguinte string: exemplo = "Mais uma frase" Se eu quero saber qual é a letra na penúltima posição da string exemplo qual é uma forma correta de obtê-la? R: exemplo[-2] 2- Considere a seguinte string: exemplo = "Mais uma frase" Se eu quero saber qual é a letrana quarta posição da string exemplo qual é uma forma correta de obtê-la? R: exemplo[3] 3- Considere a seguinte lista: exemplo = [2.3, 4.5, 1.9, 6.3, 9.2] Qual ou quais comandos representam a fatia com os três primeiros elementos da lista exemplo? R: exemplo[-5:-2] e exemplo[0:3] 4- Qual será o resultado do último comando? Escolher uma resposta: R: [10, 70, 50, 30, 40] 5- Considere a seguinte lista: exemplo = [3.7, "Pedro", [3,4], 'b', 7]Se eu quero mudar o valor 3 da lista contida na lista exemplo por 5 eu preciso dar qual comando? R: exemplo[2][0] = 5 6- Qual será o resultado do último comando? R: 50 7- Qual será o resultado do último comando? R: Python gera uma mensagem de erro 8- Considere a seguinte tupla: exemplo = (2, 3, 4, 5, 6, 7, 8, 9, 10) Qual ou quais comandos selecionam a fatia contendo somente os números múltiplos de 3 da tupla exemplo? R: exemplo[1::3] , exemplo[-8::3] , exemplo[1:29:3] e exemplo[-8:-1:3]. 9- Considere a seguinte lista: exemplo = [3.7, "Pedro", [3, 4], 'b', 7] Qual ou quais comandos trocam o 4 por um 8? R: exemplo[-3][1] = 8 , exemplo[2][-1] = 8, exemplo[2][1] = 8 e exemplo[-3][-1] = 8. 10- Para ler o conteúdo da última posição de uma tupla, lista ou string eu preciso saber o comprimento dessa tupla, lista ou string. R: Falso 11- Considere a seguinte lista:exemplo = [2.3, 4.5, 1.9, 6.3, 9.2]Qual ou quais comandos representam a fatia com os três últimos elementos da lista exemplo? R: exemplo[-3:] e exemplo[2:] 12- Qual será o resultado do último comando? R: nenhuma das opções 13- Qual será o resultado do último comando? R: nenhuma das opções 14- A principal diferença entre tuplas e strings é que não é possível mudar o conteúdo de uma tupla mas sim é possivel numa string. R: Falso 15- Se no programa que estou escrevendo preciso organizar dados relacionados que não irão mudar nunca então é conveniente pensar em usar tuplas. R: Verdadeiro 8° Tópico - Estruturas de Dados II: Dicionários 1- Qual será a resposta do Python após o último comando da lista a seguir? R: Python gera uma mensagem de erro 2- Qual será a resposta do Python após o último comando da lista a seguir? R: 9.3 3- Assim como as tuplas e os strings são inmutáveis, os dicionários não permitem mudar o valor da chave de um item. R: Verdadeiro 4- Assim como as listas permitem mudar o valor guardado num índice válido, os dicionários permitem mudar o valor associado a uma chave existente no mapa. R: Verdadeiro 5- Dicionários são compostos por uma chave e um valor relacionado sempre com valores consecutivos. R:Falso 6- Os dicionários permitem que dois ítens tenham a mesma chave desde que os valores correspondentes sejam diferentes. R: Falso 7- Assim como uma lista tem os seus índices ordenados em forma crescente, os dicionários mantém as suas chaves ordenadas também em ordem crescente. R: Falso 8- O que aparecerá na tela após o último comando abaixo? R: 1 9- Enquanto que uma lista permite conter uma outra lista como elemento os dicionários não permitem ter um outro dicionário como valor de um item. R: Falso 10- Dicionários diferenciam-se de strings, tuplas e listas por não serem indexados de forma sequencial. R: Verdadeiro 11- O que aparecerá na tela após o comando abaixo? R: 0 12: Enquanto que nas sequências os índices devem ser números inteiros, os dicionários permitem que as chaves sejam números decimais. R: Verdadeiro 11° Tópico - Sobrevivendo ao apagão: o uso de arquivos. 1- O que acontece se num programa aparecem consecutivos os seguites dois comandos? arquivo = open("naosei.txt", 'w') frase = arquivo.read() R: Python gerará uma mensagem de erro quando o programa seja executado 2- Os programas que manipulam planilhas eletrônicas (Excel, OpenOffice Calc) podem ler ou escrever em arquivos com formatoCSV , mesmo se esses arquivos foram criados por um programa escrito em Python.R: Verdadeiro 3- Todo programa precisa abrir pelo menos um arquivo para guardar informações nele.R: Falso 4- A função filesavebox() do módulo easygui fecha o arquivo escolhido pelo usuário.. R: Falso 5- O módulo csv disponibiliza um conjunto de funções que facilitam ao programador as tarefas de ler e de escrever em arquivos com formato CSV. R: Verdadeiro 6- Os programas usam arquivos para recuperar as informações relevantes guardadas em sessões anteriores de trabalho. R: Verdadeiro 7- O que acontece se num programa aparecem consecutivos os seguites dois comandos? arquivo = open("naosei.txt", 'r') arquivo.write("Outra vez a mesma frase!") R: Python gerará uma mensagem de erro quando o programa seja executado 8- Os programas usam arquivos para guardar as informações relevantes de uma sessão de trabalho. R: Verdadeiro 9- A função fileopenbox() do módulo easygui ajuda ao usuário na escolha do nome do arquivo que será aberto pela funçãoopen(). R:Verddeiro 10- O comando import easygui as ei tem por objetivo renomear o arquivo easygui.py. R: Falso 11- A informação que um programa quer preservar num arquivo está segura a partir do momento que esse programa fecha o arquivo onde ele escreveu. R: Verdadeiro 12- Todo programa que lê ou que escreve num arquivo precisa usar o formato CSV. R: Falso 1° Tópico - Linguagens de programação em geral, e Python em particular. Perguntas: Para que servem as linguagens de programação? Por que há tantas linguagens diferentes? Por que Python merece a nossa atenção? O porquê das linguagens de programação Os computadores somente são capazes de "compreender" e executar operações elementares muito simples. Qualquer tarefa, por exemplo mostrar uma mensagem na tela, requer de muitas (vários miles) de operações elementares para ser completada. Por este motivo é de praxe organizar conjuntos de operações elementares emprogramas. Toda pessoa que pretenda criar um programa para que o computador faça uma tarefa encontra a dificuldade de ter que listar o conjunto de ações de maneira que o computador possa "compreender". Os processadores dos computadores foram projetados para trabalhar com representação binária dos dados e das instruções. Os motivos dessa escolha são puramente tecnológicos mas a decisão permanece a pesar de ter sido tomada na década de 1940. Por outro lado, nós humanos temos dificuldade em compreender informações representadas em binário. Por este motivo, para faciliar a comunicação homen - máquina foram criadas as linguagens de programação. De modo geral, nós humanos escrevemos uma lista de tarefas que desejamos que o processador do computador faça, e guardamos essa lista num arquivo chamado arquivo fonte. Um programa especial tradutor (mais adiante descrevemos ele) toma esse arquivo fonte e gera a partir dele um arquivo binário cujo conteúdo é comprendido pelo processador do computador. Desta maneira a comunicação homen-máquina é facilitada pelo uso dessetradutor. Cada linguagem de programação possui o seu tradutor, e existem várias estratégias que as linguagens podem seguir para fazer a tradução. Sem querer entrar em detalhes técnicos, as linguagens de computação podem ser organizadas em dois grandes grupos: aquelas linguagens que traduzem num único passo a lista inteira de tarefas do arquivo fonte; são as chamadas linguagens compiladas. Entre elas encontramos linguagens tais como C / C++, FORTRAN, etc. aquelas linguagens que traduzem as tarefas contidas no arquivo fonte uma de cada vez; são as chamadaslinguagens interpretadas. Exemplo de tais linguagens são Python, Javascript, Perl etc. A linguagem Java encontra-se nas duas categorias (consulte o professor se quiser ter mais detalhes) Existem motivos históricos e tecnológicos que explicam a pletora de linguagens de programação. Por exemplo, a linguagem FORTRANteve a sua expansão na década de 1960, sendo a sua aplicação principal a criação de programas para cálculo numérico (o seu nome é um acônimo: FORmula TRANslator, tradutor de fórmulas). Atualmente ele continua sendo usado por pesquisadores e engenheiros que o aprenderam como primeira linguagem. O seu uso está históricamente justificado devido à grande quantidade de programas maduros (sem erros) que continuam sendo usados em áreas da física e engenharia. Por outro lado, a linguagem C foi criada no início da década de 1970 com o intuito de escrever o conjunto de programas que compõem o sistema operacional UNIX. Tanto o FORTRAN quanto o C tem a eficiência como principal caraterística. Entretanto, a medida que as aplicações do uso do computador iam se diversificando e ficando mais complexas, ficou em evidência a necessidade de contar com ferramentas que facilitassem a tarefa de escrever programas. A complexidade dos programas e o tempo (ou seja, dinheiro) necessários para criar as novas gerações de programas foram os principais fatores que impulsaram a invenção de novas linguagens de programação. Um terceiro fator importante entrou em cena com a diversificação dos computadores domésticos: nasceu a necessidade que o programa associado a uma aplicação dada possa ser executado numa ampla diversidade de plataformas (entende-se por plataforma ao conjunto formado pela máquina e o sistema operacional usado nela). Este último fator foi o promotor da expansão das linguagens interpretadas. Python: uma linguagem interpretada Python é uma linguagem de última geração que se desenvolveu muito rápidamente na primeira década deste século. A diferença de outras linguagens interpretadas que possuem uma área preferencial de aplicação, Python é empregada em quase todos os domínios, desde computação distribuida em clusters ou clouds, até aplicativos em celulares (por exemplo os celulares de Nokia e smartphones que usam Symbian). Duas caraterísticas de Python explicam o seu sucesso entre os programadores: 1. a sua chamada "curva de aprendizado" é quase exponencial. Ou seja, nenhuma outra linguagem de programação de propósito geral é aprendida mais facilmente que Python. (você mesmo irá comprovar isto neste curso) 2. a sua facilidade para combinar programas escritos em Python com aqueles escritos numa linguagens compilada. Destaca-se em particular, a facilidade de integração entre Python e C / C++. As linguagens interpretadas possuem a grande vantagem de facilitar o desenvolvimento de programas devido à possibilidade de avançar gradativamente na escrita do código fonte. Isto permite detectar e eliminar os erros no código fonte um depois do outro a medida que a execução do programa avança. Porém, a execução de um programa escrito numa linguagem interpretada não é tão eficiente quanto a execução de um programa escrito (e traduzido) numa linguagem como C. No caso de Python é possivel ter o melhor dos dois mundos: as partes de um programa cuja eficiência seja crítica podem ser escritas em linguagem C, e todo o resto pode ser escrito usando a facilidade e elegancia fornecidas pela linguagem Python. Um excelente exemplo de esta estratégia de combinar Python e C é a plataforma de Google. Todos as funções críticas (por exemplo, a busca e classificação de documentos) dos aplicativos de Google foram escritas em C: tudo o resto foi escrito em Python. Finalmente, duas vantagens importantísimas da linguagem Python: 1. o interpretador está disponível para quase todas as plataformas existentes (Linux, Mac OS X, Windows, etc) 2. ele é de graça. Resumo Aprender a criar programas na linguagem Python tem as seguintes vantagens: 1. ela é a linguagem de mais fácil aprendizado, 2. ela é uma linguagem de última geração, 3. ela permite ser combinada com linguagens de alta eficiência como C / C++, 4. o seu interpretador pode ser baixado e instalado de graça para todas as plataformas, não sendo necessário pagar por licenças pelo o seu uso 5. um programa escrito em Python roda sem mudanças tanto em Windows, Linux ou Mac OS X. 6. ela possui uma das maiores comunidades de desenvolvedores e usuários sendo assim muito fácil achar informação e ajuda para um problema particular de programação. 10° Tópico - Organizando um programa: definição de Funções O que é uma função? Como criar uma função? Escopo de variáveis Argumentos nomeados e valores padrão. Couvert Um programa pode ser visto como uma coleção de tarefas que devem ser feitas. A ordem em que essas tarefas são executadas depende das estruturas de controle de fluxo (if-elif-else, while, for) usadas no código, e das circunstâncias concretas de cada rodada (ações do usuário, valores concretos armazenados nas variáveis, etc). Quando nos preocupamos com a ordem de execução das tarefas estamos considerando alógica do programa. Por outro lado, também é muito importante considerar a forma como essas tarefas estão organizadas no código do programa. O foco, neste último caso, está na maneira em que o programa foi escrito e não na sua lógica de execução. Por este motivo, dois programadores podem escrever dois programas totalmente diferentes do ponto de vista do seu conteúdo, entretanto, do ponto de vista do usuário, os dois programas se comportam de igual forma. Uma pergunta válida é: por que é importante se preocupar com a organização do código? Existem muitos motivos pelos quais a organização do código é importante, que justificam a existência de uma grande área de pesquisa chamada Engenharia de Software. Entretanto, neste curso básico de programação vamos nos preocupar em organizar o código de maneira que fique mais fácil de escrever e de ler. No caso de programas muito simples não há nada com que se preocupar a respeito da organização do código. Mas, se o programa for um pouco mais ambicioso, o material deste capítulo fará toda uma diferença. Consideremos um exemplo já visto: escreva um programa para preparar caipirinha. Suponhamos que dispomos dos ingredientes: limões, açúcar, cachaça e gelo. A lista de tarefas que é preciso executar é a seguinte: 1. descascar limões; 2. amassar os limões descascados junto com o açúcar; 3. acrescentar a cachaça e misturar; 4. acrescentar o gelo. Cada uma dessas 4 tarefas possui detalhes que devem ser respeitados. Por exemplo, não foi explicado como descascar um limão, nem foi especificado que a parte branca do centro deve ser descartada. Esses detalhes de cada tarefa estão agrupados dentro da execução da tarefa. Se alguém quer conhecer os detalhes de como executar uma tarefa em particular terá que olhar no "código" correspondente a essa tarefa. A receita descrita acima descreve as grandes tarefas e deixa os detalhes de cada uma delas para uma explicação separada. Esse é exatamente o espírito de organizar o código de um programa usando funções: cada função é uma tarefa que o programa deve executar, e o código de cada função é uma sequência de tarefas menores que devem ser executadas para completar a tarefa. O que é uma função? Uma função é um conjunto de comandos que devem ser executados para completar uma tarefa específica. A definição é ampla pois ela não diz quantos comandos são necessários para escrever uma função, nem diz o quão específica deve ser a tarefa. Em última instância, fica a critério do programador decidir quais tarefas estarão no escopo de uma função. Também é possível que o programador escreva um programa inteiro sem criar qualquer função, mas isso não falaria muito bem dele como profissional, pois o programa se torna extenso e complexa a leitura e entendimento. Consideremos algumas das funções já prontas que usamos até agora no curso. Vimos dois grandes tipos de funções: aquelas de propósito geral, como é o caso da função len(), e aquelas associadas a uma classe específicade objeto, como no caso da função upper() dos strings. Este último tipo de função é conhecido como método. A pessoa que criou a função len() atacou o problema geral de saber quantos elementos há numa sequência. Sabemos que há três tipos de sequências em Python: strings, listas e tuplas. Mas nos três casos os elementos estão organizados de maneira consecutiva, e portanto a mesma solução pode ser aplicadas às três. Uma outra função que usamos com frequência é msgbox() do módulo easygui. De novo, o programador que escreveu essa função quis atacar a tarefa de criar uma janela com uma mensagem para o usuário. Neste curso não criaremos funções de propósito tão geral como é o caso de len() ou de msgbox(), mas com certeza elas resolverão uma tarefa específica. Em geral uma função precisa que lhe seja fornecida alguma informação para executar a tarefa para a qual ela foi desenhada. No exemplo da caipirinha, precisamos dos limões para executar a primeira tarefa. A função len() necessita de uma sequência para contar os seus elementos. Em programação chama-se argumentos (ou também parâmetros) às informações que uma função precisa ter para executar a sua tarefa. Assim, se pedimos ao Python para executar len("uma frase"), o string "uma frase" é o argumento que é fornecido à função len(). Para simplificar podemos dizer que os argumentos são todos os dados que colocamos dentro dos parênteses de uma função. Finalmente, depois que uma função completa a tarefa para a qual ela foi criada, ela retorna (ou devolve) o fruto do seu trabalho a quem a chamou. No caso da caipirinha o fruto da primeira tarefa são os limões descascados e desprovidos do miolo. No caso de len("uma frase") ela retornará o valor 9, resultado de contar quantos carateres há no string "uma frase". Resumindo tudo o visto nesta seção podemos afirmar que: uma função é um conjunto de comandos que servem para executar uma tarefa específica, escolhida a critério do programador; uma função geralmente precisa de informações para executar a sua tarefa; essas informações lhe são comunicadas usando os argumentosque a função espera. Esses argumentos aparecem dentro dos parênteses da função; uma função, depois de completar a sua tarefa, retorna o seu resultado para que este seja armazenado numa variável, seja usado numa fórmula ou simplesmente seja apresentado ao usuário. O resultado pode ser um simples inteiro como no caso de len(), ou pode ser uma estrutura mais complexa como no caso do multenterbox() que retorna uma lista de strings. Como criar uma função? Para definir uma função em Python precisamos primeiro escolher um nome e decidir quais são os argumentos que ela irá precisar. Os nomes de funções seguem as mesmas regras que os nomes de variáveis. Uma recomendação geral e óbvia é escolher nomes que sejam sugestivos da tarefa que a função vai executar; por exemplo: cadastrar_produto(), consultar_produto(), etc. Vejamos um exemplo simples de como definir uma função que conta a quantidade de vogais numa string. (copie o código no editor do Spyder e experimente rodar!!!) Comentários sobre a figura acima: Na linha 12 aparecem todos os ingredientes para definir uma função: começamos com a palavra reservada def, seguida do nome da função, os parênteses contendo os nomes dos argumentos, finalmente, os dois pontos. As linhas 13 até a 22 estão indentadas pois elas fazem parte do bloco contendo o código da função. Na linha 22 aparece a palavra reservada return. Quando Python encontra essa palavra dentro do bloco de uma função ele para de executar as instruções dentro da função e devolve o(s) dado(s) que seguem ao return para o código que chamou a função. No caso particular deste nosso exemplo, o Python devolve o conteúdo da variável contador para o código na linha 31 desde onde a função foi chamada. Para simplificar, podemos imaginar que o Python substitui na linha 31 conta_vogais(entrada) pelo valor que ficou armazenado em contador. Assim, na variável vogais fica armazenado o resultado do trabalho da função que criamos. Uma função pode usar o comando return mais de uma vez dentro do seu bloco, por exemplo se ela precisa retornar valores diferentes em diferentes condições. Repare que na definição da função na linha 12 chamamos o argumento de frase, mas quando usamos a função na linha 31 usamos a variável entrada. O que Python faz por baixo dos panos é copiar o conteúdo da variável entrada para uma nova variável frase que ele cria na hora de executar o código da função. Deste modo o conteúdo da variável entrada não é afetado pelas operações a serem efetuadas no bloco da função. Há uma exceção para este comportamento que veremos mais adiante neste capítulo. É muito importante lembrar que uma função precisa ser definida antes de ser usada. Se pensamos um pouco isso é óbvio: eu não posso cobrar do Python que ele faça uma tarefa se antes eu não disse pra ele como fazê-la. Por este motivo, toda vez que decidamos usar nossas próprias funções no código de um programa é preciso que as definamos antes. Vejamos um exemplo onde usamos funções para melhor organizar o código do programa. Vamos supor que queremos criar um sistema para gerenciar uma biblioteca pessoal. O sistema deve permitir: 1. cadastrar um novo livro; 2. remover um livro do cadastro; 3. emprestar um livro; 4. devolver um livro. Para organizar o cadastro de livros usaremos um dicionário cujas chaves correspondem ao ISBN de cada livro. Além do ISBN do livro, armazenaremos o título e o nome completo do primeiro autor. Estes dois atributos ficarão armazenados numa lista associada ao ISBN correspondente a cada livro. Para organizar os empréstimos usaremos um dicionário cujas chaves correspondem ao ISBN de cada livro. Além do ISBN do livro, armazenaremos o nome completo da pessoa que retirou o livro e a data em que ocorreu o empréstimo. Estes dois atributos ficarão armazenados numa lista associada ao ISBN correspondente a cada livro. Para organizar o código vamos usar 4 funções auxiliares que implementarão cada uma das 4 tarefas. Vejamos uma primeira versão do código: (copie o código no editor do Spyder e experimente rodar!!!) Comentários sobre a figura acima: as 4 funções definidas na figura acima por enquanto não executam as tarefas para as quais elas foram planejadas. Nesta fase do desenho do sistema só nos preocupamos pela organização geral do sistema. Por esse motivo, para poder conferir se as tarefas rodam segundo o esperado, em cada função criamos uma janela para conferirmos que a função correspondente à tarefa escolhida é chamada. Repare que as 4 funções recebem, cada uma, um parâmetro mas este não é usado no bloco da função. Esses parâmetros estão ali como lembretes do que a função irá precisar para implementar a sua tarefa. Note que nenhuma das funções usa a palavra reservada return. O motivo é simples: como as funções não precisam devolver nenhuma informação pro lugar onde elas foram chamadas não há necessidade de usar return. A execução da função acaba quando chegamos no final do bloco correspondente. Confira como ficou simples o loop principal do sistema onde é apresentado o menu de ações para o usuário. Nos programas que escrevemos no capítulo anterior, o código para criar a janela com o menu de opções ficava misturado com o código correspondente as tarefas a serem executadas. Isto deixava o código sobrecarregado e de difícil leitura. Usando funções podemos ir escrevendo o código gradativamente reduzindo assim o risco de espalhar erros. Exercício: Complete o código que falta dentro das funções para deixar o sistema funcionando. Nota: o seu aprendizado depende da sua disposição para fazer os exercícios sugeridos. Escopo de variáveisConsideremos o seguinte exemplo: (copie o código no editor do Spyder e experimente rodar!!!) Comentários sobre a figura acima: Na linha 12, dentro do bloco da função, criamos uma variável nome e guardamos nela o string "Bob". Na linha 15 criamos uma janela onde usamos o conteúdo da variável nome. Na linha 17, fora do bloco da função, criamos uma variável nome e guardamos nela o string "Ando". Na linha 19 chamamos a função teste() e ela cria uma mensagem usando o conteúdo da variável nome criada dentro da função, apesar de existir fora do bloco da função uma outra variável nome. Python sempre usa as variáveis simples definidas dentro do bloco que está em execução. Portanto, para usar uma variável simples dentro de uma função é preciso criá-la dentro do bloco da função. As variáveis criadas fora do bloco da função não existem dentro da função. Na linha 23 criamos uma janela que usa o conteúdo da variável nome definida na linha 17. O código da linha 12 não afeta o conteúdo da variável criada na linha 17 porque esta está fora do bloco da função. O mesmo raciocíno feito para as variáveis nome se aplica às variáveis msg e title criadas dentro e fora da função. No exemplo anterior vimos que dentro do bloco de uma função só podemos mudar o conteúdo de variáveis que foram criadas dentro da função. Em termos de programação esta limitação chama-se escopo. Resumindo podemos dizer que o escopo de uma variável é o bloco onde uma variável foi criada e ela existe. Vejamos uma situação diferente: (copie o código no editor do Spyder e experimente rodar!!!) Comentários sobre a figura acima: Neste exemplo, a função teste() possui o argumento lista. Na linha 12 mudamos o conteúdo da variável lista, acrescentando um elemento. Na linha 18 criamos uma variável convidados e guardamos nela uma lista com apenas um elemento. Na linha 23 criamos uma janela onde mostramos para o usuário o conteúdo da lista. Em 26 chamamos a função teste() fornecendo-lhe como parâmetro a variável convidado (criada fora de teste()). Em 15 usamos uma janela para mostrar como fica lista depois de acrescentar um elemento. A pergunta do milhão é: quando na linha 12 acrescentamos um elemento ao argumento estamos mudando também a composição da lista armazenada na variável convidados? Para tirar a dúvida anterior, na linha 31 usamos uma janela para mostrar mais uma vez o conteúdo da variável convidados. Copie e rode o programa para responder a pergunta acima. No primeiro exemplo deste capítulo, a função contadora de vogais, dissemos que Python copia o conteúdo do argumento da função para uma variável que ele cria na hora de executar a função. Este comportamento é adequado para o caso de variáveis simples, onde a informação a ser copiada é pouca. Entretanto, se na lista armazenada em convidados houvessem 1000 ou mais elementos, toda vez que chamamos a teste()Python precisaria criar uma cópia desses 1000 elementos antes de começar a rodar a função. Para evitar essa sobrecarga de estar copiando todo o conteúdo de uma lista, Python permite que somente no caso de listas e dicionários os seus conteúdos possam ser mudados desde que dentro de uma função, mesmo que essas listas ou dicionários tenham sido criados fora do bloco da função. Argumentos nomeados e valores padrão No console do Spyder experimente chamar a função len() sem fornecer nenhum argumento. O que acontece? Consideremos agora uma função que temos usado muito: a função msgbox() do módulo easygui. No console do Spyder experimente importar o módulo easygui e chamar a função msgbox() sem fornecer nenhum argumento. O que acontece? Por que as funções len() e a msgbox() se comportam de maneira tão diferente quando as chamamos sem nenhum argumento? A diferença entre ambas as funções está no que em programação chamam-se argumentos nomeados e valores padrão. A função len() foi concebida pelo programador que a criou sem nenhum valor padrão para o seu argumento: por este motivo, se chamamos a função len() sem argumentos ela não vai saber o que fazer e por isso Python gera uma mensagem de erro. Já no caso da função msgbox(), o seu criador achou conveniente ter um comportamento definido mesmo no caso em que ela seja chamada sem nenhum argumento. Por este motivo, o criador de msgbox() definiuvalores padrão para os argumentos de maneira que se ela for usada sem fornecer valores para os seus argumentos estes adotem os valores padrão. Para criar uma função que tenha valores padrão para os seus argumentos precisamos usar argumentos nomeados, que são os argumentos de uma função inicializados com um valor padrão, como nas linhas 11 e 12 do exemplo 5 abaixo. Vejamos um exemplo prático criando uma função que calcula valores de desconto. (copie o código no editor do Spyder e experimente rodar!!!) Comentários sobre a figura acima: Nas linhas 11 e 12 definimos a função desconto() que possui dois argumentos nomeados: valor_bruto e percentagem. Se ao chamarmos a função não especificamos o valor de algum desses dois parâmetros, a definição da função prevê valores padrão para eles (0.0 e 10.0 respectivamente). Na linha 17 usamos desconto() com valores para os dois argumentos e na 21 criamos uma janela comunicando ao usuário os preços, com e sem o desconto de 5%. Entre as linhas 22 e 27 refazemos o cálculo anterior mas usando o valor padrão para a percentagem de desconto. Conclusões O visto neste capítulo deve deixar duas conclusões importantes: 1. Toda vez que criamos a solução para um problema geral, tal como contar a quantidade de elementos numa sequência ou criar uma janela, a forma de disponibilizar essa solução para que outro programador a aproveite é implementando essa solução usando uma função. O móduloeasygui é um exemplo de como muitas funções gerais são "empacotadas" juntas para fornecer ao programador uma caixa de ferramentas para criar interfaces gráficas padronizadas. 2. O código de um programa de complexidade média para cima fica muito mais fácil de escrever e de entender se associamos uma função a cada uma das tarefas que o programa deve implementar. Com esta estratégia podemos implementar o programa aos poucos, escrevendo o código de uma função de cada vez.
Compartilhar