Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

Importação de um módulo criado pelo próprio programador!

Criei dois arquivos:

o primeiro é ConstroiMatriz.py que constroi uma matriz dados o número de linhas e o número de colunas. (está funcionando)

segundo: TrocaElementosMatriz.py que deveria chamar a função matriz do arquivo ConstroiMatriz.py para após receber a matriz, trocar dois elementos.

O problema: TrocaElementosMatriz.py não consegue acessar a função matriz e não enxerga a variável matrix.

ConstroiMatriz.py :

m = int(input("Digite o número de linhas da matriz: "))
n = int(input("Digite o número de colunas da matriz: "))    
def matriz(m,n):
    matrix = []


    for i in range(1,m+1):
        linha = []
        for j in range(1,n+1):

            x= int(input("Digite o valor ({},{}): ".format(i,j)))
            linha.append(x)

        global matrix    
        matrix.append(linha)

    return matrix




def main():
    pass



if __name__ == "__main__":
    main()



print(matriz(m,n))

TrocaElementosMatriz.py:

import ConstroiMatriz


def troca():

    pos1 = int(input("Digite a linha do elemento a ser trocado: "))
    pos2 = int(input("Digite a coluna do elemento a ser trocado: "))
    pos3 =int(input("Digite a linha do elemento a ser trocado: "))
    pos4 = int(input("Digite a coluna do elemento a ser trocado: "))



    matrix[pos1][pos2], matrix[pos3][pos4] = matrix[pos3][pos4],matrix[pos1][pos2]

    return matrix



print(matriz(1,1))    
print(troca())

Alguma ideia?

6 respostas

Edson, quando você faz um import absoluto de um método (como você fez com import ConstroeMatriz) todas as variáveis e funções definidas dentro desse método só serão acessíveis através de nome_do_modulo.nome_da_variavel. Assim, você pode mudar o final de seu código do TrocaElementosMatriz.py para:

matrix = ConstroiMatriz.matriz(1,1)
print(matrix)
print(troca())

Resolveu!

Só mais uma coisinhas:

Como fazer para quando eu importar o módulo, não sair executando tudo? Por exemplo:

No IDLE, quando dei import ConstroeMatriz,

saiu executando isso:

m = int(input("Digite o número de linhas da matriz: "))
n = int(input("Digite o número de colunas da matriz: "))

Eu lembro que resolvia usando o

if __name__ == "__main__":

Mas não faço ideia como!

Opa , Edson, boa pergunta (e boa resposta já haha!). Como você já adiantou, é com esse if __name__ == "__main__". Tudo o que estiver dentro desse condicional só será executado se você estiver de fato executando esse arquivo em específico, ou seja, não será executado se você apenas importar o módulo. Assim, é só você colocar essas linhas dentro do bloco desse if:

if __name__ == '__main__':
    m = int(input("Digite o número de linhas da matriz: "))
    n = int(input("Digite o número de colunas da matriz: ")) 
    print(matriz(m,n))

Surgiu outro problema:

print(matriz(m,n)) NameError: name 'm' is not defined

solução!

Você lembrou de mover a linha print(matriz(m,n)) para dentro do bloco condicional? Queremos tirar todo código solto desse arquivo, para não ser executado no import, lembra disso!

Só tinha faltado isso! Muito obrigado!