1

I am trying to write something in Python that will be like a piano. Each number that the user enters will play a different sound.

  1. The user is prompted for how many keys they want to be able to press (iterations).
  2. They will be prompted for a number for a sound the same amount of times as they entered for iterations. Each number is a different sound.
  3. It will play the sounds.

I am having trouble with the userNum function. I need all of the numbers that they enter for sounds to append to a list, and then another function will read the list and play each sound accordingly. This is what I have so far:

#Gets a user input for each sound and appends to a list.
def userNum(iterations):
  for i in range(iterations):
    a = eval(input("Enter a number for sound: "))
  myList = []
  while True:
    myList.append(a)
    break
  print(myList)
  return myList

This is what the printed list looks like with the code that I have so far:

>>> userNum(5)
Enter a number for sound: 1
Enter a number for sound: 2
Enter a number for sound: 3
Enter a number for sound: 4
Enter a number for sound: 5
[5]

Any thoughts of a way to get it to append each number to the list, or if there is a more efficient way of doing this?

jonrsharpe
  • 115,751
  • 26
  • 228
  • 437
Greysus
  • 571
  • 1
  • 7
  • 10
  • You create the list *after* the `for` loop, then have a `while` loop that only runs once. Why not create the list *before* the `for` loop, and `append` inside it? Also, you should use `int` not `eval`. – jonrsharpe Jan 09 '15 at 12:52
  • **[Do not ever use `eval` (or `exec`) on data that could possibly come from outside the program in any form. It is a critical security risk. You allow the author of the data to run arbitrary code on your computer](https://stackoverflow.com/questions/1832940/why-is-using-eval-a-bad-practice). It [cannot easily be sandboxed, and proper sandboxing is harder than using a proper tool for the job.](https://stackoverflow.com/questions/3068139)** – Karl Knechtel Mar 10 '23 at 09:28

3 Answers3

1

The first thing you should do in your function is initialize an empty list. Then you can loop the correct number of times, and within the for loop you can append into myList. You should also avoid using eval and in this case simply use int to convert to an integer.

def userNum(iterations):
    myList = []
    for _ in range(iterations):
        value = int(input("Enter a number for sound: "))
        myList.append(value)
    return myList

Testing

>>> userNum(5)
Enter a number for sound: 2
Enter a number for sound: 3
Enter a number for sound: 1
Enter a number for sound: 5
Enter a number for sound: 9
[2, 3, 1, 5, 9]
Cory Kramer
  • 114,268
  • 16
  • 167
  • 218
0

def userNum(iterations):

number_list = []

while iterations > 0:
    number = int(input("Enter a number for sound : "))
    number_list.append(number)
    iterations = iterations - 1
return number_list

print "Numbers List - {0}".format(userNum(5))

Enter a number for sound : 9

Enter a number for sound : 1

Enter a number for sound : 2

Enter a number for sound : 0

Enter a number for sound : 5

Numbers List - [9, 1, 2, 0, 5]

hariK
  • 2,722
  • 13
  • 18
0

You can simply return a list comp:

def userNum(iterations):
    return [int(input("Enter a number for sound: ")) for _ in range(iterations) ]

If you were using a loop you should use a while loop and verify input with a try/except:

def user_num(iterations):
    my_list = []
    i = 0
    while i < iterations:
        try:
            inp = int(input("Enter a number for sound: "))
        except ValueError:
            print("Invalid input")
            continue
        i += 1
        my_list.append(inp)
    return my_list
Padraic Cunningham
  • 176,452
  • 29
  • 245
  • 321