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.