Week 6
Python: Funções, Argumentos, Valores de Retorno, Variáveis, Expressões Booleanas, Condicionais, Loops, Módulos, Pacotes.
- Shorts
- Lab 6
- Problem Set 6
Notas
Lecture 6
- Bem-vindo(a)!
- Python
- Hello
- Tipos
- Speller
- Reconhecimento de Imagem
- Biblioteca CS50
- Condicionais
- Variáveis
- Loops
- Calculator
- Compare
- Programação Orientada a Objetos
- Meow
- Mario
- Scores
- Letras Maiúsculas
- Greet
- Status de Saída
- Search
- Agenda Telefônica
- Comparação
- Swap
- CSV
- Speech
- Resumindo
Bem-vindo!
- Nas últimas semanas, você foi apresentado aos blocos fundamentais da programação.
- Você aprendeu sobre programação em uma linguagem de programação de baixo nível chamada C.
- Hoje, vamos trabalhar com uma linguagem de programação de nível mais alto chamada Python.
- À medida que você aprende esta nova linguagem, você vai perceber que será capaz de se ensinar outras linguagens de programação.
Python
- Os seres humanos, ao longo das décadas, têm visto como decisões de design anteriores poderiam ser melhoradas.
- Python é uma linguagem de programação que se baseia no que você já aprendeu em C.
Hello
-
Até este ponto, o código se parecia com isto:
// A program that says hello to the world #include <stdio.h> int main(void) { printf("hello, world\n"); } - Hoje, você verá que o processo de escrever e compilar código foi simplificado.
-
Por exemplo, o código acima será renderizado em Python como:
# A program that says hello to the world print("hello, world")Observe que o ponto e vírgula sumiu.
-
No C, você pode se lembrar deste código:
// get_string and printf with %s #include <cs50.h> #include <stdio.h> int main(void) { string answer = get_string("What's your name? "); printf("hello, %s\n", answer); } -
Este código é transformado em Python para:
# get_string and print, with concatenation from cs50 import get_string answer = get_string("What's your name? ") print("hello, " + answer)Você pode escrever este código executando
code hello.pyna janela do terminal. Em seguida, você pode executar este código executandopython hello.py. Observe como o sinal de+concatena"hello, "eanswer. -
Da mesma forma, você poderia implementar o código acima como:
# get_string and print, with format strings from cs50 import get_string answer = get_string("What's your name? ") print(f"hello, {answer}")Observe como as chaves permitem que a função
printinterpole a variávelanswerpara que ela apareça dentro do texto.
Tipos
- Os tipos de dados em Python não precisam ser declarados explicitamente. Por exemplo, como visto acima, a variável
answeré uma string, mas não precisamos informar isso ao interpretador: ele sabe por si só. -
Em Python, os tipos mais comuns incluem:
bool float int strObserve que
longedoubleestão faltando. O Python lidará com qual tipo de dados deve ser usado para números maiores e menores. -
Alguns outros tipos de dados em Python incluem:
range list tuple dict set - Cada um desses tipos de dados pode ser implementado em C, mas em Python eles podem ser implementados de forma mais simples.
Speller
-
Para ilustrar essa simplicidade, vamos digitar 'código dicionário.py' na janela do terminal e escrever o código da seguinte forma:
# Words in dictionary words = set() def check(word): """Return true if word is in dictionary else false""" if word.lower() in words: return True else: return False def load(dictionary): """Load dictionary into memory, returning true if successful else false""" file = open(dictionary, "r") for line in file: word = line.rstrip() words.add(word) file.close() return True def size(): """Returns number of words in dictionary if loaded else 0 if not yet loaded""" return len(words) def unload(): """Unloads dictionary from memory, returning true if successful else false""" return TrueObserve que há quatro funções acima. Na função
check, se umapalavraestá emwords, ela retornaTrue. Muito mais fácil do que uma implementação em C! Da mesma forma, na funçãoload, o arquivo do dicionário é aberto. Para cada linha neste arquivo, adicionamos essa linha awords. Usandorstrip, a nova linha final é removida da palavra adicionada.sizesimplesmente retorna olenou comprimento dewords.unloadsó precisa retornarTrueporque o Python gerencia a memória por conta própria. - O código acima ilustra por que existem linguagens de nível mais alto: para simplificar e permitir que você escreva código com mais facilidade.
- No entanto, a velocidade é um trade-off. Como o C permite que você, o programador, tome decisões sobre o gerenciamento de memória, ele pode ser executado mais rapidamente do que o Python - dependendo do seu código. Enquanto o C executa apenas suas linhas de código, o Python executa todo o código que vem com ele quando você chama as funções integradas do Python.
- Você pode aprender mais sobre funções na documentação do Python.
Reconhecimento de imagem
- Numerosas bibliotecas foram escritas por colaboradores para o Python.
- Você pode utilizar essas bibliotecas em seu próprio código.
- Por exemplo, você pode simplesmente importar reconhecimento facial utilizando uma biblioteca do Python como
PIL. - Aldo forneceu uma demonstração de reconhecimento facial utilizando o Python e bibliotecas de terceiros.
Biblioteca CS50
- Assim como no C, a biblioteca CS50 pode ser utilizada no Python.
-
As seguintes funções serão de particular utilidade:
get_float get_int get_string -
Você também tem a opção de importar apenas funções específicas da biblioteca CS50 da seguinte forma:
from CS50 import get_float, get_int, get_string
Condicional
-
No C, você pode se lembrar de um programa como este:
// Conditionals, Boolean expressions, relational operators #include <cs50.h> #include <stdio.h> int main(void) { // Prompt user for integers int x = get_int("What's x? "); int y = get_int("What's y? "); // Compare integers if (x < y) { printf("x is less than y\n"); } else if (x > y) { printf("x is greater than y\n"); } else { printf("x is equal to y\n"); } } -
Em Python, isso seria apresentado da seguinte forma:
# Conditionals, Boolean expressions, relational operators from cs50 import get_int # Prompt user for integers x = get_int("What's x? ") y = get_int("What's y? ") # Compare integers if x < y: print("x is less than y") elif x > y: print("x is greater than y") else: print("x is equal to y")Observe que não há mais chaves ({}) na sintaxe. Em vez disso, são utilizadas indentações. Além disso, é utilizado dois pontos (:) na declaração do
if. Além disso, oelifsubstitui oelse if. Os parênteses também não são mais necessários nas declarações deifeelif.
Variáveis
- A declaração de variáveis também é simplificada. Em C, você pode ter
int contador = 1;. Em Python, essa mesma linha seria escrita comocontador = 1. Não é necessário declarar o tipo da variável. - Python prefere
contador += 1para incrementar em um, perdendo a capacidade encontrada em C de usarcontador++.
Laços de repetição
-
Os laços de repetição em Python são muito semelhantes aos de C. Você pode se lembrar do seguinte código em C:
// Demonstrates while loop #include <stdio.h> int main(void) { int i = 0; while (i < 3) { printf("meow\n"); i++; } } -
Em Python, este código aparece como:
# Demonstrates while loop i = 0 while i < 3: print("meow") i += 1 -
Os loops
forpodem ser implementados em Python da seguinte forma:# Better design for i in range(3): print("meow") -
Da mesma forma, pode-se expressar o código acima como:
# Abstraction with parameterization def main(): meow(3) # Meow some number of times def meow(n): for i in range(n): print("meow") main()Observe que uma função é utilizada para abstrair o ato de miar.
Calculator
-
Podemos implementar uma calculadora simples da mesma forma que fizemos em C. Digite
code calculator.pyna janela do terminal e escreva o código da seguinte forma:# Addition with int [using get_int] from cs50 import get_int # Prompt user for x x = get_int("x: ") # Prompt user for y y = get_int("y: ") # Perform addition print(x + y)Observe como a biblioteca CS50 é importada. Em seguida,
xeysão obtidos do usuário. Finalmente, o resultado é impresso. Observe que a funçãomain, que seria vista em um programa C, foi completamente removida! Embora se possa utilizar uma funçãomain, isso não é necessário. -
É possível remover as rodinhas de treinamento da biblioteca CS50. Modifique seu código da seguinte maneira:
# Addition with int [using input] # Prompt user for x x = input("x: ") # Prompt user for y y = input("y: ") # Perform addition print(x + y)Observe como a execução do código acima resulta em comportamento estranho do programa. Por que isso pode estar acontecendo?
-
Você pode ter percebido que o interpretador entendeu
xeycomo strings. Você pode corrigir seu código empregando a funçãointda seguinte forma:# Addition with int [using input] # Prompt user for x x = int(input("x: ")) # Prompt user for y y = int(input("y: ")) # Perform addition print(x + y)Observe como a entrada para
xeyé passada para a funçãoint, que a converte em um número inteiro. -
Podemos expandir as habilidades de nossa calculadora. Modifique seu código da seguinte forma:
# Division with integers, demonstration lack of truncation # Prompt user for x x = int(input("x: ")) # Prompt user for y y = int(input("y: ")) # Divide x by y z = x / y print(z)Observe que a execução deste código resulta em um valor, mas se você visse mais dígitos após
.333333, veria que estamos diante de imprecisão de ponto flutuante. -
Podemos revelar essa imprecisão modificando ligeiramente nossos códigos:
# Floating-point imprecision # Prompt user for x x = int(input("x: ")) # Prompt user for y y = int(input("y: ")) # Divide x by y z = x / y print(f"{z:.50f}")Observe que este código revela a imprecisão. O Python ainda enfrenta esse problema, assim como o C.
Compare
-
No C, enfrentamos desafios quando queríamos comparar dois valores. Considere o seguinte código:
// Conditionals, Boolean expressions, relational operators #include <cs50.h> #include <stdio.h> int main(void) { // Prompt user for integers int x = get_int("What's x? "); int y = get_int("What's y? "); // Compare integers if (x < y) { printf("x is less than y\n"); } else if (x > y) { printf("x is greater than y\n"); } else { printf("x is equal to y\n"); } } -
No Python, podemos executar o código acima da seguinte forma:
# Conditionals, Boolean expressions, relational operators from cs50 import get_int # Prompt user for integers x = get_int("What's x? ") y = get_int("What's y? ") # Compare integers if x < y: print("x is less than y") elif x > y: print("x is greater than y") else: print("x is equal to y")Observe que a biblioteca CS50 está importada. Além disso, existem pequenas alterações no comando
if. -
Observando mais sobre comparações, considere o seguinte código em C:
// Logical operators #include <cs50.h> #include <stdio.h> int main(void) { // Prompt user to agree char c = get_char("Do you agree? "); // Check whether agreed if (c == 'Y' || c == 'y') { printf("Agreed.\n"); } else if (c == 'N' || c == 'n') { printf("Not agreed.\n"); } } -
O acima pode ser implementado da seguinte forma:
# Logical operators from cs50 import get_string # Prompt user to agree s = get_string("Do you agree? ") # Check whether agreed if s == "Y" or s == "y": print("Agreed.") elif s == "N" or s == "n": print("Not agreed.")Observe que as duas barras verticais utilizadas em C são substituídas por
orem Python. De fato, as pessoas geralmente preferem o Python porque ele é mais legível para os seres humanos. Além disso, observe que em Python não existe o tipochar, em vez disso, são utilizadas asstrs. -
Outra abordagem para este mesmo código poderia ser a seguinte:
# Logical operators, using lists from cs50 import get_string # Prompt user to agree s = get_string("Do you agree? ") # Check whether agreed if s in ["y", "yes"]: print("Agreed.") elif s in ["n", "no"]: print("Not agreed.")Observe como podemos expressar várias palavras-chave como
yeyes.
Programação Orientada a Objetos
- Até este ponto, nossos programas neste curso têm sido lineares: sequenciais.
- É possível que certos tipos de valores não apenas tenham propriedades ou atributos dentro deles, mas também tenham funções. Em Python, esses valores são conhecidos como objetos.
- Em C, poderíamos criar uma
structna qual você poderia associar várias variáveis dentro de um único tipo de dados criado por si próprio. Em Python, podemos fazer isso e também incluir funções em um tipo de dados criado por si próprio. Quando uma função pertence a um objeto específico, ela é conhecida como um método. -
Por exemplo, em Python, as
strstêm métodos embutidos. Portanto, você poderia modificar seu código da seguinte maneira:# Logical operators, using lists from cs50 import get_string # Prompt user to agree s = get_string("Do you agree? ") # Check whether agreed if s.lower() in ["y", "yes"]: print("Agreed.") elif s.lower() in ["n", "no"]: print("Not agreed.")Observe como somos capazes de expressar várias palavras-chave como
yeyese converter qualquer entrada do usuário em letras minúsculas. -
Isto poderia ser ainda mais simplificado como:
# Logical operators, using lists from cs50 import get_string # Prompt user to agree s = get_string("Do you agree? ") s = s.lower() # Check whether agreed if s in ["y", "yes"]: print("Agreed.") elif s in ["n", "no"]: print("Not agreed.")Observe como o valor antigo de
sé sobrescrito com o resultado des.lower(). - Nesta aula, vamos apenas arranhar a superfície do Python. Portanto, a documentação do Python será de particular importância enquanto você continuar aprendendo.
- Você pode aprender mais sobre os métodos de string na documentação do Python
Meow
-
Voltando para o arquivo
meow.cde semanas atrás, lembre-se do seguinte código:// Demonstrates while loop #include <stdio.h> int main(void) { int i = 0; while (i < 3) { printf("meow\n"); i++; } } -
O exemplo acima pode ser implementado em Python da seguinte forma:
# Demonstrates while loop i = 0 while i < 3: print("meow") i += 1 -
Da mesma forma, utilizando um laço
for, podemos escrever o código da seguinte forma:# Better design for i in range(3): print("meow") -
Como sugerimos mais cedo hoje, você pode melhorar ainda mais este código usando funções. Modifique seu código da seguinte forma:
# Abstraction def main(): for i in range(3): meow() # Meow once def meow(): print("meow") main()Observe que a função
meowabstrai a instruçãoprint. Além disso, observe que a funçãomainaparece no topo do arquivo. Na parte inferior do arquivo, a funçãomainé chamada. Por convenção, espera-se que você crie uma funçãomainem Python. -
De fato, podemos passar variáveis entre nossas funções da seguinte forma:
# Abstraction with parameterization def main(): meow(3) # Meow some number of times def meow(n): for i in range(n): print("meow") main()Observe como agora
meowrecebe uma variáveln. Na funçãomain, você pode chamarmeowe passar um valor como3. Em seguida,meowutiliza o valor denno loopfor. -
Lendo o código acima, observe como você, como programador em C, é capaz de entender facilmente o código acima. Embora algumas convenções sejam diferentes, os blocos de construção que você aprendeu anteriormente são muito aparentes nessa nova linguagem de programação.
Mario
-
Lembre-se há algumas semanas do nosso desafio de construir três blocos um em cima do outro, como em Mario.

-
Em Python, podemos implementar algo semelhante a isso da seguinte forma:
# Prints a column of 3 bricks with a loop for i in range(3): print("#") -
No C, tínhamos a vantagem de um loop
do-while. No entanto, em Python é convenção utilizar um loopwhile, já que Python não possui um loopdo-while. Você pode escrever o código da seguinte maneira em um arquivo chamadomario.py:# Prints a column of bricks, using a helper function to get input from cs50 import get_int def main(): height = get_height() for i in range(height): print("#") def get_height(): while True: n = get_int("Height: ") if n > 0: return n main()Observe como o escopo de
nestá presente em toda a funçãoget_heightassim que é atribuído um valor. Além disso, observe que, por convenção, há dois espaços entre funções. -
Podemos remover as "rodinhas de treinamento" da biblioteca CS50 da seguinte forma:
# Prints a column of bricks, catching exceptions def main(): height = get_height() for i in range(height): print("#") def get_height(): while True: try: n = int(input("Height: ")) if n > 0: return n except ValueError: print("Not an integer") main()Observe que o
tryé utilizado para tentar converternem um número inteiro. Se não conseguir fazê-lo, um erro é produzido. -
Considere a seguinte imagem:

-
Em Python, poderíamos implementar modificando seu código da seguinte forma:
# Prints a row of 4 question marks with a loop for i in range(4): print("?", end="") print()Observe que você pode substituir o comportamento da função
printpara permanecer na mesma linha da impressão anterior. -
Similarmente à iterações anteriores, podemos simplificar ainda mais este programa:
# Prints a row of 4 question marks without a loop print("?" * 4)Observe que podemos utilizar
*para multiplicar a declaração de impressão e repeti-la4vezes. -
E quanto a um grande bloco de tijolos?

-
Para implementar o acima, você pode modificar seu código da seguinte forma:
# Prints a 3-by-3 grid of bricks with loops for i in range(3): for j in range(3): print("#", end="") print()Observe como um loop
forexiste dentro de outro. A instruçãoprintadiciona uma nova linha ao final de cada linha de tijolos. -
Você pode aprender mais sobre a função
printna documentação do Python
Scores
lists são uma estrutura de dados dentro do Python.lists têm métodos ou funções embutidos dentro delas.-
Por exemplo, considere o seguinte código:
# Averages three numbers using a list and a loop from cs50 import get_int # Get scores scores = [] for i in range(3): score = get_int("Score: ") scores.append(score) # Print average average = sum(scores) / len(scores) print(f"Average: {average}")Observe que você pode usar o método interno
append, no qual você podeanexara pontuação à lista. Observe também que usamos a funçãosumpara adicionar todos os elementos da lista. -
Você até pode utilizar a seguinte sintaxe:
# Averages three numbers using a list and a loop with + operator from cs50 import get_int # Get scores scores = [] for i in range(3): score = get_int("Score: ") scores += [score] # Print average average = sum(scores) / len(scores) print(f"Average: {average}")Observe que
+=é utilizado para adicionar a pontuação à lista. Neste caso, colocamos colchetes em torno descoreporque apenas umalistapode ser adicionada a outralistausando+ou+=. - Você pode aprender mais sobre listas na documentação do Python.
- Você também pode aprender mais sobre
lenna documentação do Python.
Maiúsculas
-
De maneira semelhante, considere o seguinte código:
# Uppercases string one character at a time before = input("Before: ") print("After: ", end="") for c in before: print(c.upper(), end="") print()Observe que cada caractere é colocado em maiúscula um de cada vez.
-
O Python tem um método integrado para
strs. Você pode modificar seu código da seguinte maneira:# Uppercases string all at once before = input("Before: ") after = before.upper() print(f"After: {after}")Observe que o método
upperé utilizado para colocar toda a string em maiúsculas de uma vez.
Greet
-
Assim como em C, você também pode utilizar argumentos de linha de comando. Considere o seguinte código:
# Prints a command-line argument from sys import argv if len(argv) == 2: print(f"hello, {argv[1]}") else: print("hello, world")Observe que
argv[1]é impresso usando uma string formatada, indicada pelofpresente no comandoprint. -
Você pode imprimir todos os argumentos em
argvda seguinte forma:# Printing command-line arguments, indexing into argv from sys import argv for i in range(len(argv)): print(argv[i])Observe que o exemplo acima não apresentará a palavra
pythonse executado, e o primeiro argumento será o nome do arquivo que está sendo executado. Você pode pensar na palavrapythoncomo sendo análoga a./quando estávamos executando programas em C. -
Você pode fatiar pedaços de listas. Considere o seguinte código:
# Printing command-line arguments using a slice from sys import argv for arg in argv[1:]: print(arg)Observe que a execução deste código resultará no nome do arquivo em execução sendo cortado.
-
Você pode aprender mais sobre a biblioteca
sysna documentação do Python.
Status de Saída
-
A biblioteca
systambém possui métodos integrados. Podemos usarsys.exit(i)para sair do programa com um código de saída específico:# Exits with explicit value, importing sys import sys if len(sys.argv) != 2: print("Missing command-line argument") sys.exit(1) print(f"hello, {sys.argv[1]}") sys.exit(0)Observe que a notação de ponto é utilizada para utilizar as funções integradas de
sys.
Search
-
O Python também pode ser utilizado para buscar. Na sua janela de terminal, digite
code names.pye escreva o código da seguinte forma:# Implements linear search for names import sys # A list of names names = ["Bill", "Charlie", "Fred", "George", "Ginny", "Percy", "Ron"] # Ask for name name = input("Name: ") # Search for name if name in names: print("Found") sys.exit(0) print("Not found") sys.exit(1)Observe que este código funciona. Na verdade, ele implementa uma busca linear.
-
Você pode utilizar as capacidades integradas do Python da seguinte forma:
# Implements linear search for names using `in` import sys # A list of names names = ["Bill", "Charlie", "Fred", "George", "Ginny", "Percy", "Ron"] # Ask for name name = input("Name: ") # Search for name if name in names: print("Found") sys.exit(0) print("Not found") sys.exit(1)Observe que a preposição
iné utilizada. O Python sabe como implementar o código de nível inferior para realizar uma busca linear.
Agenda telefônica
- Lembre-se de que um dicionário ou
dicté uma coleção de pares chave e valor. -
Você pode implementar um dicionário em Python da seguinte forma:
# Implements a phone book from cs50 import get_string people = { "John": "+55(82)99417-9669", "Aldo": "+55(82)99635-6612" } # Search for name name = get_string("Name: ") if name in people: print(f"Number: {people[name]}")Observe que o dicionário é implementado usando chaves. Em seguida, a declaração
if name in peopleprocura para ver se onameestá no dicionáriopeople. Além disso, observe como, na declaraçãoprint, podemos indexar o dicionáriopeopleusando o valor dename. Muito útil! - O Python fez o seu melhor para alcançar o tempo constante usando suas pesquisas incorporadas.
Comparação
-
Podemos implementar comparações da seguinte forma em Python:
# Compares two strings # Get two strings s = input("s: ") t = input("t: ") # Compare strings if s == t: print("Same") else: print("Different")Observe como o Python utiliza o
==para comparar duas variáveis. Além disso, observe que o Python permite que você compare duas strings sem examinar as strings caractere por caractere usando ponteiros como em C.
Swap
-
Além disso, podemos implementar um programa que troca valores como fizemos em C. Considere o seguinte código em Python:
# Swaps two integers x = 1 y = 2 print(f"x is {x}, y is {y}") x, y = y, x print(f"x is {x}, y is {y}")Observe que cada valor é trocado, utilizando uma sintaxe muito Pythonica
x, y = y, x.
CSV
-
Você também pode utilizar o Python para trabalhar com arquivos CSV. Considere o seguinte programa chamado
phonebook.py:# Saves names and numbers to a CSV file import csv # Get name and number name = input("Name: ") number = input("Number: ") # Open CSV file with open("phonebook.csv", "a") as file: # Print to file writer = csv.writer(file) writer.writerow([name, number])Observe que utilizando o bloco de código
with, com owritere seu trabalho acontecendo abaixo dele recuado, nos impede de precisarfecharnosso arquivo quando terminarmos. -
Comumente, arquivos CSV têm colunas que possuem nomes específicos. Um
DictWriterpode ser usado para criar o arquivo CSV e atribuir nomes específicos para cada coluna. Considere a seguinte modificação em nosso código:# Saves names and numbers to a CSV file using a DictWriter import csv # Get name and number name = input("Name: ") number = input("Number: ") # Open CSV file with open("phonebook.csv", "a") as file: # Print to file writer = csv.DictWriter(file, fieldnames=["name", "number"]) writer.writerow({"name": name, "number": number})Observe que as colunas
nameenumbersão definidas na penúltima linha do código e os valores são adicionados na última linha. -
Você pode aprender mais sobre arquivos CSV em Python na documentação do Python
Speech
-
Usando uma biblioteca de terceiros, o Python pode fazer conversão de texto em fala.
# Says hello to someone import pyttsx3 engine = pyttsx3.init() name = input("What's your name? ") engine.say(f"hello, {name}") engine.runAndWait() -
Além disso, você pode executar o seguinte código:
# Says "This was CS50" import pyttsx3 engine = pyttsx3.init() engine.say("This was CS50") engine.runAndWait()
Resumindo
Nesta lição, você aprendeu como os blocos de construção da programação das lições anteriores podem ser implementados em Python. Além disso, você aprendeu sobre como o Python permite um código mais simplificado. Você também aprendeu como utilizar várias bibliotecas do Python. No final, você aprendeu que suas habilidades como programador não se limitam a uma única linguagem de programação. Já está vendo como está descobrindo uma nova maneira de aprender por meio deste curso que poderia ajudá-lo em qualquer linguagem de programação - e talvez em quase todas as áreas de aprendizado! Especificamente, discutimos...
- Python
- Variáveis
- Condicionais
- Loops
- Tipos
- Bibliotecas
- Dicionários
- Argumentos de linha de comando
- Expressões regulares
Até a próxima!