GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Dúvida em criação "encadeada" de variáveis

python
Tags: #<Tag:0x00007f9d21608220>

#1

Pessoal, agradeço se puderem me ajudar. :wink:

[ 1º ]

Dada uma variável x que recebe um número inteiro, eu gostaria de entrar em um while que criasse um número x de variáveis.

Se x recebe 3, por exemplo, depois desse while eu gostaria que fossem criadas 3 variáveis.

O problema é escrever essa “criação automática e sequencial” de variáveis, mas mais do que isso: o nome dessas variáveis.

Escrevi algo como:

x = 3
c = 0

while c < x:
   c = c + 1
   z = input("Digite um nome: ")

A partir desse ponto eu gostaria de saber como criar uma variável que tenha como nome a string guardada em z, guardar um float nela, seguir adiante, criar outra variável que tenha como nome a nova string guardada em z, guardar um float nela, seguir adiante, criar outra variável que tenha como nome a nova string guardada em z, guardar um float nela… e estourar o while porque a condição (c < x) passa a ser False.

[ 2º ]

Dada uma variável x que recebe um número inteiro, eu gostaria de entrar em um while que criasse um número (x * 2) de variáveis.

Se x recebe 3, por exemplo, depois desse while eu gostaria que fossem criadas 6 variáveis:

n1 = input("Digite um nome: ")
v1 = float(input("Digite um valor: "))
n2 = input("Digite um nome: ")
v2 = float(input("Digite um valor: "))
n3 = input("Digite um nome: ")
v3 = float(input("Digite um valor: "))

A ideia é que além da automatização na criação das variáveis, se estabeleça uma padronização no que se refere à nomeação das variáveis criadas: n1, v1, n2, v2, n3, v3… e assim por diante (dependendo do valor de x).

///

Como programar essas duas possibilidades?!

///

Mais uma dúvida que surgiu durante a tentativa de solucionar esse problema:

- Como renomear uma variável? Mudar seu nome, não seu valor.

///

Grato desde já!


#2

Vetor?


#3

Não sei… tô começando agora a programar. Só ouvi alguma coisa sobre vetores no meu breve e superficial curso de “introdução à lógica de programação”. :grin:


#4

Eu acho que a forma mais fácil seria fazer um dictionary. Conhece?

Basicamente é um “array” onde cada valor tem seu índice, porém você nomeia o seu índice.

Tipo:
meuDic = { 'nome': 'jose', 'idade': '13', 'sexo': 'm' }

Daí quando você quiser usar uma “variável” você chamaria ela assim: meuDic['nome'], e ele te retorna ‘jose’ e assim por diante…

Talvez isso te ajude!
Boa sorte.


#5

Vetores em python são listas e podem ou não ter seus elementos de um mesmo tipo, exemplo:

vetor1 = [1, 2, 3] # elementos de um unico tipo

vetor2 = [50, 'Produto X', 1.99, 20] # elementos diferentes

No vetor1 poderiamos classifica-lo como idades, como naquele exemplo das vogais tá lembrado?

Já no segundo vetor, podemos classifica-lo como uma descrição de um produto, o primeiro elemento seria o código, o segundo o nome, o terceiro o valor e o ultimo a quantidade…

Peceba como python é flexivel quanto aos vetores, cabe você decidir o que melhor te atende…

Para adicionar novos elementos ao vetor, podemos fazer de duas formas

vetor1.append(4) # sempre na ultima posição
vetor1[4] = 5

Lembrando também que vetores/listas, começam com índice a partir do zero, por isso que vetor1[4] cria uma nova posição (4) no vetor contendo o valor 5, já que vetor1[3] é 4, vetor1[2] é 3 etc…

Você pode (e creio que seja a melhor solução para seu problema). mesclar os benefícios da lista com os dicionários indicados pela @Vannessa dessa forma…

cadastros = [] # vetor vazio...
continuar = True

while continuar: 
    nome = input("Digite um nome: ") # input por padrao retorna str()
    valor = float(input("Digite um valor: "))
    novoCadastro = {'nome': nome, 'valor': valor}
    cadastros.append(novoCadastro)

    continuar = bool(input("Deseja continuar? True/False "))

print("Total de cadastros: ", len(cadastros))
for cadastro in cadastros:
    print("Nome: ", cadastro['nome'], ', Valor: ', cadastro['valor'])

#6

@Vannessa, muitíssimo obrigado pela dica dos dicionários! Não só usei no exercício que me propus a fazer como também fui ler mais sobre e acabei descobrindo algumas possibilidades bem interessantes. :wink:

Por conta disso pintou mais uma dúvida que coloco logo mais por aqui! :grin:

Valeu! :pray:


#7

Valeu MESMO, @LostSoldier! Acho que minha solução final vai passar bem por aí…

Muito obrigado, de verdade! :pray:

Lendo e relendo tua postagem. Até tudo encaixar. :slight_smile:


#8

Fico feliz em ajudar!

:slight_smile:


#9

Cara pra ser sincero nem testei o código, funcionou ai? :joy:

Fui totalmente pela lógica… sucesso nos estudos! :+1:


#10

Funcionou sim, mas não consegui fazer o valor booleano funcionar como condição nem a pau. Tentei de tudo quanto é jeito, mas não rolou. Acabou que ficou assim:

cadastros = []
continuar = 0

while continuar == 0:
    nome = input("Digite um nome: ")
    valor = float(input("Digite um valor: "))
    novoCadastro = {'nome': nome, 'valor': valor}
    cadastros.append(novoCadastro)

    z = input("Deseja continuar? S/N ")
    if z == 'n' or z == 'N':
        continuar = 1

print("Total de cadastros: ", len(cadastros))
for cadastro in cadastros:
    print("Nome: ", cadastro['nome'], ', Valor: ', cadastro['valor'])

Feio e impreciso, mas pelo menos rodou. :unamused:

Ainda não faz o que eu preciso… mas tanto o teu exemplo de código como também o link que você compartilhou estão sendo muito úteis nos testes que tô fazendo! :pray:


#11

Bom, é normal você ter dúvidas quando está iniciando, mas tenha em mente que o próprio while é um if, a diferença é que ele roda uma quantidade indefinida… pode tentar assim também…

...
continuar = 's'

while continuar == 's':
    ...
    continuar = input("Deseja continuar? S/N").lower()

Lembra do lower? Pois é, nesses casos em que se testa uma letra tanto minúscula, quanto maiúscula, “forçar” a linguagem um único tipo ajuda a testar uma única condição, sem precisar de or pegou?

Você pode achar estranho o input ter um método lower, mas como disse no comentário do código anterior, ele retorna um objeto str, logo, ele é uma string, enfim, vai avançando nos estudos que uma hora as coisas fazem sentido…