Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) problema com função


Victor Santos Silva

Pergunta

Boa noite galera, sou iniciante em python, estou aprendendo seguindo o livro: Use a cabeça Python. Consegui manipular as listas, tudo tranquilo até aqui. Estou estudando a parte de funções, daí criei uma função que funcionou perfeitamente para uma lista, porém não consigo criar a opção dela funcionar para outra lista, idêntica em número de elementos. A função é essa:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
lista = [ "1", "2", [ "3", "4", [ "5", "6"]]]
def printar(the_list):
for x in lista:
if isinstance(x, list):
for y in x:
if isinstance(y, list):
for z in y:
if isinstance(z, list):
print(z)
else:
print(y)
else:
print(x)
h =raw_input("Aperte x para exibir a função, e qualquer outra coisa para não fazer nada.")
if h == ("x"):
printar(lista)
else:
print("você digitou outra coisa, hihiih")
Com os devidos recuos. Esta função funcionou para esta lista. Porém, quando acrescentei mais uma lista ao código e dei a opção dele escrever a segunda lista, ele acusa erro. O segundo programa é assim:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
lista1 = [ "1", "2", [ "3", "4", [ "5", "6"]]]
lista2 = [ "0", "0", [ "0", "0", [ "0", "0"]]]
def printar(lista1, lista2):
for x in list:
if isinstance(x, list):
for y in x:
if isinstance(y, list):
for z in y:
if isinstance(z, list):
print(z)
else:
print(y)
else:
print(x)
h =raw_input("Aperte x para exibir a função, e y para exibir outra função.")
if h == ("x"):
printar(lista1)
if h == ("y"):
printar(lista2)
else:
print("nada")
Eu não sei se entendi muito bem a lógica das funções, ao meu ver uma função serve para que eu não necessite copiar todas as linhas para executar novamente, assim eu posso imprimir duas listas diferentes, usando quase que a mesma quantidade de linhas para imprimir uma lista. Portanto, eu acredito que eu fiz alguma coisa errada na maneira de chamar a lista, no entanto não sei o que. Ajuda aê galera?
Valeu ^^
Link para o comentário
Compartilhar em outros sites

10 respostass a esta questão

Posts Recomendados

  • 0

ola victor

você esta com problemas em argumentos de função, e escopo de variáveis

1- def printar(the_list):
2- for x in lista:
1 = você esta usando o argumento the_list, mas no corpo da função você não esta utilizando(este é o argumento de função)
2 = você usa lista com o for, ou seja esta usando uma variável global(é o escopo), esse código esta acabando com a reutilização da sua função
Como você esta usando o livro, basta dar uma olhada nestes dois topicos e provavelmente encontrara a solução
Link para o comentário
Compartilhar em outros sites

  • 0
lista = [ "1", "2", [ "3", "4", [ "5", "6"]]] 

def printar(*args):
        for i in args:
                for x in i:
                        if isinstance(x, list):
                                for y in x:
                                        if isinstance(y, list):
                                                for z in y:
                                                        if isinstance(z, list):
                                                                print(z)

                                                        else:
                                                                print(z)
                                        else:
                                                print(y)
                        else:
                                print(x)

printar(lista)

essa função printa individualmente cada valor das listas dentro da lista, bom ainda digo para rever o material de passagem de argumento e escopo

Link para o comentário
Compartilhar em outros sites

  • 0

acredito que o problema seja mais em como chamar a outra lista, por exemplo, eu criei essa função pois tenho várias listas para imprimir, mas eu não sei como chamar a segunda lista, ou terceira lista. Esse é o código do segundo programa:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
lista1 = [ "1", "2", [ "3", "4", [ "5", "6"]]]
lista2 = [ "0", "0", [ "0", "0", [ "0", "0"]]]
def printar(list):
for x in list:
if isinstance(x, list):
for y in x:
if isinstance(y, list):
for z in y:
if isinstance(z, list):
print(z)
else:
print(y)
else:
print(x)
h =raw_input("Aperte x para exibir a função, e qualquer outra coisa para exibir outra função.")
if h == ("x"):
printar(lista1)
if h == ("y"):
printar(lista2)
else:
print("nada")
E esse é o erro dado insiro x ou y:
File "listafuncao.py", line 20, in <module>
printar(lista1)
File "listafuncao.py", line 7, in printar
if isinstance(x, list):
TypeError: isinstance() arg 2 must be a class, type, or tuple of classes and types
Pois qualquer caractere exceto esses dois, faz de acordo com o programa.
Link para o comentário
Compartilhar em outros sites

  • 0

na função que passei, você pode adicionar quantas listas quizer

printar(lista1, lista2, lista3)

agora nesse seu ultimo exemplo:

def printar(list):
#aqui você definiu o argumento de função list, não use list como argumento
for x in list:
# aqui esta correto, mesmo argumento da passagem da função, mas o problema é que você usou list como argumento de função e isso não é legal
if isinstance(x, list):
# e aqui vem o porque não é legal usar list como argumento
list é tipo de objeto, ou seja o seu lista = [1, 2, 3] é um objeto list
isinstance(x, list), confere se o objeto x é uma instancia da classe list, mas como você esta usando list como argumento da função, o interpretador esta usando um objeto e não uma constante, e isso gera o seu erro:
TypeError: isinstance() arg 2 must be a class, type, or tuple of classes and types
Link para o comentário
Compartilhar em outros sites

  • 0

Então, o problema é que você criou a função pra receber dois argumentos "def printar(lista1, lista2)", e depois você está chamando a função com 1 só argumento printar(lista1). Se você deixar a função igual a do começo com um argumento só, ela deve funcionar.
Agora se você precisa de uma função que aceite mais argumentos, use a do ArteEN.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...