I’m not able to do the listing to know how many products were sold and the quantity

Asked

Viewed 54 times

1

I’m not getting makes the listing to know how many products were sold and the quantity, I did a double count to store, but when I call in the other function it does not print and error

produtos = []
contagem = []

def menu():
    print('*****LANCHONETE*****\nDIGITE O NUMERO REFERENTE A SUA OPÇAO:\n'
          '1-ADICIONAR PRODUTOS AO ESTOQUE\n2-VER OS PRODUTOS DISPONIVEIS\n3-VENDER PRODUTOS\n'
          '4-VERIFICAR O TOTAL DE VENDAS POR DIA\n0-SAIR\n')


def adicionar(produtos):
    print('ADICIONAR PRODUTOS:\n')
    nome = input('Qual produto deseja adicionar? ')
    descricao = int(input('Qual a descriçao? '))
    valor = float(input('Qual sera o valor desse produto?'))
    produtos.append((nome, descricao, valor))
    chamar()


def verificar(produtos):
    for produto in produtos:
        nome, descricao, valor = produto
        print(f'Nome: {nome}, descrição: {descricao}, valor: {valor}')
    chamar()

def vender(produtos):
    descricao_desejada = int(input('Descricao do produto? '))
    for produto in produtos:
        nome, descricao, valor = produto
        if descricao_desejada == descricao:
            print(f'Nome: {nome}, descrição: {descricao}, valor: {valor}\nVENDIDO ')
            contagem.append((descricao_desejada, valor))
            chamar()
        else:
            print(f'Produto com descrição {descricao_desejada} não encontrado')
    chamar()

def vendas(contagem):
    for produto in contagem:
        descricao_desejada, valor = produto
        print(f'descrição: {descricao_desejada}, valor: {valor}')


def sair():
    print('Agradecemos a visita!')
    return


def chamar():
    chama = int(input('1-MENU 0-SAIR \n'))
    if chama == 1:
        main()
    else:
        sair()


def main():
    menu()
    opcao = int(input('Opção? '))
    if opcao == 1:
        adicionar(produtos)
    elif opcao == 2:
        verificar(produtos)
    elif opcao == 3:
        vender(produtos)
    elif opcao == 4:
        vendas(produtos)
    elif opcao == 0:
        sair()
    else:
        print('Opção inválida')


main()
  • Hello, what is the error that gives exactly? And look at "Description = int(input('What is the description? ')" This code snippet understands that the user must enter a text type value but in the code it converts to 'int'. Wouldn’t that be quantity rather than description? And within the sell function also induces the user to enter a text and in the code he makes a conversion to integer. desired description = int(input('Product description? '))

  • Ola Paulo Freitas, No use append is restricted to add sequence of values within a list. What was added in the list was a tuple. You created a list called product but when using the append you used a tuple when trying to scroll through the result is a tuple within a list.

1 answer

0

The problem is here in the function call vendas:

vendas(produtos)

You are passing the list produtos as a parameter. But how produtos has tuples with 3 elements, and in the function you only try to do the unpacking of 2 elements (in descricao_desejada, valor = produto), it gives error of "Too Many values to unpack".

What might be confusing is that you are using the same names inside and outside the function. When you define this function:

def vendas(contagem):
    for produto in contagem:
        etc...

The variable contagem is a function parameter, and is local to it (exists only within the function). It nay is the same contagem that was created outside the function. A simpler example can clarify better:

def vendas(contagem):
    print(contagem)

contagem = 10
produtos = 5
vendas(produtos) # imprime 5

In doing contagem = 10, I created a variable that nay is the same as inside vendas. Within the function, contagem Whatever value is passed when I call you. It doesn’t matter if the variable used in the function call has another name, what matters is its value (so much that I could do vendas(5), with no variable involved, which would give in the same).

So when you call venda(produtos), is passing its list of products, whose elements are tuples with 3 elements. When trying to do the unpacking for only 2 elements, gives the error.

So just switch to vendas(contagem) what would work.


But taking advantage, there is something else to change. You don’t have to make one function keep calling others indefinitely: main calls one of the others (vendas, adicionar, etc.), and they each call chamar, what call main again, etc.). Although it "works", this causes all these calls to be "hung up", since they never return (one flame calls another, one calls another, one calls another, etc., and these calls never end). And every function call takes up space on the execution stack, And if you do it this way, one hour the pile blows.

If you want to repeat something over and over again, use a loop:

while True:
    # faz o que precisa
    if condicao_de_saida:
        break # sai do while

while True repeats indefinitely what is inside it. If an output condition occurs (for example, if zero), the break interrupts the loop.

This is better than making one function call another, calling another, calling another, etc. Because now the functions close and do not occupy space in the stack.

Would look like this:

def menu():
    print('''
*****LANCHONETE*****
DIGITE O NUMERO REFERENTE A SUA OPÇAO:
1-ADICIONAR PRODUTOS AO ESTOQUE
2-VER OS PRODUTOS DISPONIVEIS
3-VENDER PRODUTOS
4-VERIFICAR O TOTAL DE VENDAS POR DIA
0-SAIR''')

def adicionar(produtos):
    print('ADICIONAR PRODUTOS:\n')
    nome = input('Qual produto deseja adicionar? ')
    descricao = int(input('Qual a descriçao? '))
    valor = float(input('Qual sera o valor desse produto?'))
    produtos.append((nome, descricao, valor))

def verificar(produtos):
    for produto in produtos:
        nome, descricao, valor = produto
        print(f'Nome: {nome}, descrição: {descricao}, valor: {valor}')

def vender(produtos, contagem):
    descricao_desejada = int(input('Descricao do produto? '))
    for nome, descricao, valor in produtos:
        if descricao_desejada == descricao:
            print(f'Nome: {nome}, descrição: {descricao}, valor: {valor}\nVENDIDO ')
            contagem.append((descricao_desejada, valor))
        else:
            print(f'Produto com descrição {descricao_desejada} não encontrado')

produtos = []
contagem = []
while True:
    menu()
    opcao = int(input('Opção? '))
    if opcao == 1:
        adicionar(produtos)
    elif opcao == 2:
        verificar(produtos)
    elif opcao == 3:
        vender(produtos, contagem)
    elif opcao == 4:
        vendas(contagem)
    elif opcao == 0:
        sair()
        break # sai do while
    else:
        print('Opção inválida')

See that I can do the unpacking straightforward: for nome, descricao, valor in produtos.

Also note that the function vender now receives 2 parameters: produtos and contagem, since both are needed inside.

I didn’t get other things, like validating whether a number was actually typed, and I have my doubts whether the description should really be a number. But anyway, these details you can arrange later.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.