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.py
na 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
print
interpole a variávelanswer
para 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 str
Observe que
long
edouble
estã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 True
Observe que há quatro funções acima. Na função
check
, se umapalavra
está 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.size
simplesmente retorna olen
ou comprimento dewords
.unload
só precisa retornarTrue
porque 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, oelif
substitui oelse if
. Os parênteses também não são mais necessários nas declarações deif
eelif
.
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 += 1
para 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
for
podem 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.py
na 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,
x
ey
sã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
x
ey
como strings. Você pode corrigir seu código empregando a funçãoint
da 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
x
ey
é 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
or
em 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 asstr
s. -
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
y
eyes
.
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
struct
na 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
strs
tê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
y
eyes
e 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.c
de 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
meow
abstrai a instruçãoprint
. Além disso, observe que a funçãomain
aparece no topo do arquivo. Na parte inferior do arquivo, a funçãomain
é chamada. Por convenção, espera-se que você crie uma funçãomain
em 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
meow
recebe uma variáveln
. Na funçãomain
, você pode chamarmeow
e passar um valor como3
. Em seguida,meow
utiliza o valor den
no 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
n
está presente em toda a funçãoget_height
assim 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 convertern
em 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
print
para 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-la4
vezes. -
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
for
existe dentro de outro. A instruçãoprint
adiciona uma nova linha ao final de cada linha de tijolos. -
Você pode aprender mais sobre a função
print
na documentação do Python
Scores
list
s são uma estrutura de dados dentro do Python.list
s 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ê podeanexar
a pontuação à lista. Observe também que usamos a funçãosum
para 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 descore
porque apenas umalista
pode ser adicionada a outralista
usando+
ou+=
. - Você pode aprender mais sobre listas na documentação do Python.
- Você também pode aprender mais sobre
len
na 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
str
s. 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 pelof
presente no comandoprint
. -
Você pode imprimir todos os argumentos em
argv
da 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
python
se executado, e o primeiro argumento será o nome do arquivo que está sendo executado. Você pode pensar na palavrapython
como 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
sys
na documentação do Python.
Status de Saída
-
A biblioteca
sys
també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.py
e 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 people
procura para ver se oname
está no dicionáriopeople
. Além disso, observe como, na declaraçãoprint
, podemos indexar o dicionáriopeople
usando 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 owriter
e seu trabalho acontecendo abaixo dele recuado, nos impede de precisarfechar
nosso arquivo quando terminarmos. -
Comumente, arquivos CSV têm colunas que possuem nomes específicos. Um
DictWriter
pode 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
name
enumber
sã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!