2
respostas

Aprendendo um pouco de Def

Galera,

Estou começando a aprender de programação e estou fazendo alguns exercícios online. Um deles, usando Def, é através de uma letra digitada se ela é vogal ou não.

Será que poderiam verificar o que há de errado no meu código?

def check(letter,vowel):
    for letter in vowel:
        if str(letter).lower() in str(vowel).lower():
            return False
    return True

vowel = ['a','e','i','o','u']
letter = input('Please write a random letter of alphabet: ')

if check(letter,vowel):
    print('The letter is not a vowel.')
else:
    print('The letter is a vowel.')
2 respostas

Bom dia, Diego!

O problema está dentro do seu for. O que acontece é que o seu parâmetro de entrada para comparação com as vogais se chama letter, assim como a variável auxiliar dentro do for. Desta forma, a cada iteração do for, essa variável será sobrescrita para um dos valores dentro da lista vowel.

Exemplo:

# Chamada da função check para a letra 'g'
check('g', ['a', 'e', 'i', 'o', 'u'])

# Dentro da função acontecerá isso:
def check(letter, vowel):  # neste ponto, letter = 'g' e vowel = ['a', 'e', 'i', 'o', 'u']
    for letter in vowel:  # neste ponto, letter receberá uma letra da vowel pra cada iteração
        # iteração 1: letter = 'a', iteração 2: letter = 'e', iteração 3: letter = 'i' ...
        if str(letter).lower() in str(vowel).lower():  # a condição sempre será satisfeita
            return False
    return True

O que deve ser feito é simplesmente retirar-se laço for que o programa funcionará devidamente. Isso acontece porque, ao utilizar o in, você não precisa percorrer letra por letra da lista vowel para fazer a checagem, ele faz isso automaticamente.

'a' in 'banana'  # True

'b' in 'maçã'  # False

'c' in 'abacaxi'  # True

Para otimizar seu código, sugiro alterar a função "check" para:

def check(letter, vowels = 'aeiou'):
    return letter.lower() in vowels.lower()

Essa implementação da função já seta como default sua variável vowels como a palavra 'aeiou', não precisando definir ela toda vez que for chamar a função. Porém, se você quiser comparar a letra com alguma outra lista de letras, pode passar vowels como parâmetro também.

# Aqui comparamos letras com a string 'aeiou'
 check('a')  # True
 check('b')  # False

 # Aqui sobrescrevemos vowels para ser a string 'abcde' ao invés de 'aeiou'
 # sem passar o nome da variável
 check('c', 'abcde')  # True

 # passando o nome da variável
 check('c', vowels='abcde')  # True

E como a comparação letter.lower() in vowels.lower() já nos retorna True ou False, é possível apenas dar um return letter.lower() in vowels.lower(). Se você quiser fazer uma lógica invertida (True se não for vogal e False se for, como no seu programa) pode-se retornar a mesma coisa mas invertendo ela, fazendo: return not letter.lower() in vowels.lower().

Espero ter ajudado e não te confundido mais, hahaha.

Um abraço e bons estudos!

Excelente explicação. Entendi perfeitamente o erro e também entendi as dicas dadas.

Como estou começando a aprender a linguagem, algumas situações podem parecer besta, mas é tudo novidade para mim.

Mais uma vez, obrigado pela explicação e atenção aos detalhes.