Dúvida em exercício com vogais e consoantes

Pessoal, tô fazendo um curso de Python no Coursera e um dos exercícios é assim:

"Escreva a função vogal que recebe um único caractere como parâmetro e devolve True se ele for uma vogal e False se for uma consoante.

Note que

vogal(“a”) deve devolver True

vogal(“b”) deve devolver False

vogal(“E”) deve devolver True

Os valores True e False devolvidos devem ser do tipo bool (booleanos)

Dica: Lembre-se que para passar uma vogal como parâmetro ela precisa ser um texto, ou seja, precisa estar entre aspas."

Escrevi esse código:

def vogal(z):
    v = True
    if z == "a":
        return v
    if z == "e":
        return v
    if z == "i":
        return v
    if z == "o":
        return v
    if z == "u":
        return v
    if z == "A":
        return v
    if z == "E":
        return v
    if z == "I":
        return v
    if z == "O":
        return v
    if z == "U":
        return v
    else:
        return not v

Fui aprovado no exercício, mas gostaria de saber outras formas mais elegantes de escrever essa função. Uma dúvida é sobre o porquê de eu não ter conseguido escrever algo como:

def vogal(z):
    v = True
    if z == "a" or "e" or "i" or "o" or "u":
       return v
    else:
       return not v

Não dá mesmo pra usar o ‘or’ neste caso?

Grato desde já! :wink:

Outra forma…

def vogal(z):
    vogais = ['a', 'e', 'i', 'o', 'u']
    return z.lower() in vogais

Isso “bruto”, se quiser validar…

def vogal(z):
    if z is not str or len(z) != 1:
        return False

    vogais = ['a', 'e', 'i', 'o', 'u']
    return z.lower() in vogais

Muito obrigado, @LostSoldier!

O primeiro código funcionou, mas o segundo não: retornou False tanto para vogais como para consoantes…

Em todo caso, você poderia fazer a gentileza de me explicar “o que acontece” nesse primeiro código? Na primeira linha você define o nome da função e o parâmetro, na segunda você cria uma lista com as vogais… e na terceira? O que acontece? O que significa z.lower( )? O que essa linha faz? :grin:

Outra coisa: nesse primeiro exemplo de código você só colocou as vogais minúsculas na lista. E mesmo assim funcionou quando testei com as vogais maiúsculas. Pode me explicar o porquê? Pois no meu código eu tive que “prever” as maiúsculas também… :unamused:

Obrigado por responder! :wink:

Você mesmo respondeu o que o z.lower() faz…

Ambos os códigos fiz pela lógica, ignore o segundo caso de validação, posso ter errado em algo…

A lógica é simples, verificar se a letra informada está na lista de vogais, o que estiver fora (seja consoante, um número inteiro, float, etc) automaticamente é False…

Mas ai nesses casos de int, float, etc… o lower() vai gerar erro, já que é um método da classe str… por isso indiquei a validação no segundo código…

OBS: no segundo caso, se ainda quiser a validação, creio que isso sirva…

if not isinstance(z, str) or len(z) != 1:
    return False

Faça alguns testes, informe um número, um texto completo e veja o comportamento…

Sim, agora rolou a validação: retornando False para tudo o que não é vogal e retornando True para vogais minúsculas e maiúsculas. :slight_smile:

Valeu pelo toque do lower e por todo o resto!

O código final ficou assim:

def vogal(z):
    if not isinstance(z, str) or len(z) != 1:
        return False

    vogais = ["a", "e", "i", "o", "u"]
    return z.lower() in vogais

Ainda entendendo como o código opera… mas pelo menos já saquei o básico.

Valeu mesmo! :pray:

1 curtida

Nunca vi python na vida, mas, creio que esse or não está muito direito.
Não seria assim

if z == "a" or z == "e" or z == "i" or z == "o" or z == "u":

1 curtida

Verdade, @Luis_Augusto_Santos! É isso mesmo.

Valeu! :wink:

Explicando um pouco o funcionamento…

Na verdade esse código até funciona…

if z == "a" or "e" or "i" or "o" or "u":

Não como o esperado obviamente, para o python ficou assim (z seria ‘z’ por exemplo)…

if False or True or True or True or True:

Isso porque para instruções de comparação como if e while por exemplo, alguns valores são definidos como False por padrão, dentre eles…

0 # int
0.0 # float
False # boolean
None # nulo
"" ou '' # string vazia

E tudo diferente disso, automaticamente é considerado True…

Agora se sua intenção era comparar z com todos os outros usando or como “âncora”, isso não funciona pois tanto or quanto and, são operadores digamos de agrupamento… por exemplo…

if (z == 'a') or (z == 'b') or (z == 'c')...

Que poderia ter essa saída…

if (True) or (False) or (False)...

Ele prioriza cada “grupo” entre parênteses (precedência é o termo técnico utilizado), para depois determinar a condição final…

A partir desse “agrupamento” o if aplica a álgebra booleana, ou seja nesse exemplo…

True or False = True

Depois…

True or False = True

Até retornar um único comparativo, sendo ele True ou False…

1 curtida

Olá pessoal!

Tô nessa da vogal aí devido ao curso que estou fazendo, acredito que o mesmo do colega que criou o tópico.

Se alguém puder me ajudar gostaria de entender porque o meu código não funciona?

def vogal(z):
    vogais = ['a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U']
    
    for i in range(len(vogais)):
        if i == z:
            return True
        else:
            return False

Não consegui entender a lógica da solução postada aqui por ainda está iniciando.

Grato.

Agora mesmo, veja, se você digitar print(i) logo abaixo do for, você verá que será “printado” um valor numérico, logo abaixo, você está comparando um inteiro com uma string, ou seja, o resultado sempre será False para o seu código.

#Função
def vogal(z):
    vogais = ['a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U']

    for i in range(len(vogais)):
        print(i)
        if i == z:
            return True
        else:
            return False

#Debugando
resultado = vogal("A")
print(resultado)  #False

Como resolver isso?! Simples você resolve isso com apenas um If e sem for, veja o exemplo abaixo.

#Função
def vogal(z):
    vogais = ['a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U']

    if z in vogais:
        return True
    else:
        return False

#Debugando
resultado = vogal("A")
print(resultado) #True

resultado = vogal("2")
print(resultado) #False

Ou de uma maneira mais rápida:

#Função
def vogal(z):
    vogais = ['a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U']

    if z in vogais:
        return True
    
    return False

#Debugando
resultado = vogal("E")
print(resultado) #True

resultado = vogal("C")
print(resultado) #False

Ou ainda mais rápido.

#Função
def vogal(z):
    vogais = ['a', 'e', 'i', 'o', 'u']

    if z.lower() in vogais:
        return True

    return False

#Debugando
resultado = vogal("U")
print(resultado) #True

resultado = vogal("C")
print(resultado) #False

Compreendendo o que o Python está fazendo (Leia atentamente o comentário no código).

#Função
def vogal(z):
    vogais = ['a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U']
   
    #Se existir z (argumento da funçao) em (in) vogais (lista) então (:) faça.
    #Se existir algum z dentro da lista vogais faça:
    if z in vogais:

Abraço!

1 curtida

vogal = [“a”, “e”, “i”, “o”, “u”]
res = input("digite uma letra: ")
if res in vogal:
print(‘A letra digitada é uma vogal’)
else:
print(‘A letra digitada é uma consoante’)

1 curtida