calmce
calmce

Reputation: 21

Passing Variables/lists through Functions

Im having trouble with sorting Variables/lists and then being able to transfer them across functions. Im still quite new to python and am probably missing something very basic. but ive been going over this for hours.

I need to create a program which generates 20 random integers and indicates whether each number is odd or even. I need to sort the two original integers into ascending order and transfer them to random.randint function but am having trouble, any help would be appreciated.

This is what i have so far.

import random

def userinput():

    global number1
    global number2

   number1 = int(input("Enter First Integer: "))
   number2 = int(input("Enter Second Integer: "))

userinput()

def numbersorting():

  global both
  both = [(number1),(number2)]
  sorted(both)

numbersorting()

def random_gen():

    global num
    i = 0

    for i in range(20):
        num = random.randint(number1,number2)

    def get_num():
        return values.pop


    def odd_even():
        if num % 2 == 0:
            print("Random Number", num, "is even")
        else:
            print("Random Number", num, "is odd")
    odd_even()

random_gen()

Upvotes: 2

Views: 77

Answers (5)

Al Johri
Al Johri

Reputation: 2041

Try both.sort()

sorted returns a new list.

sort() is done in place.

Upvotes: 0

Paul Rooney
Paul Rooney

Reputation: 21609

Avoid globals by passing the variables to functions and returning the new values from functions.

import random


def userinput():

    number1 = int(input("Enter First Integer: "))
    number2 = int(input("Enter Second Integer: "))
    return number1, number2


def numbersorting(nums):

    return sorted(nums)


def random_gen(hi, lo):

    return random.sample(range(hi, lo), 20)


def odd_even(num):
    if num % 2 == 0:
        print("Random Number %d is even" % num)
    else:
        print("Random Number %d is odd" % num)


nums = userinput()
sortnum = numbersorting(nums)
randoms = random_gen(*sortnum)
[odd_even(n) for n in randoms]

In keeping with your original function names.

You should be aware of the difference between list.sort and sorted. If you have a list li then li.sort() sorts in place, that is it alters the original list and returns None. So return li.sort() is always wrong. on the other hand return sorted(li) is ok, but just sorted(li) is a wasted sort since the result is thrown away.

Upvotes: 0

MANA624
MANA624

Reputation: 1028

from random import randint


def user_input():
    number1 = int(input("Enter First Integer: "))
    number2 = int(input("Enter Second Integer: "))

    if number1 > number2:
        number1, number2 = number2, number1

    return number1, number2


def odd_even(num):
    if num % 2 == 0:
        print("Random Number " + str(num) + " is even")
    else:
        print("Random Number " + str(num) + " is odd")


def random_gen():
    number1, number2 = user_input()
    for i in range(20):
        num = randint(number1, number2)
        odd_even(num)

random_gen()

You generally want to try to avoid using global variables when possible. It's just good programming practice, as they can get rather messy and cause problems if you don't keep careful track of them. As far as sorting your two integers, I think that that one if statement is a much more pythonic way of doing things. Well, I think it's easier at least. Also, in Python, you don't need to declare your for loop variables, so the line i=0 is unnecessary. Also, I'm sure this is an assignment, but in real life you're going to want to run an exception clause, in which you would say something like

while True:
    try:
        number1 = int(input("Enter First Integer: "))
        number2 = int(input("Enter Second Integer: "))
        break
    except ValueError:
        print("Oops! Try entering an integer!")

Hope that helps!

Upvotes: 0

Simon
Simon

Reputation: 10150

Are you looking for something like this?

I edited your code to work with what I understand your problem to be...

You want the user to input 2 numbers to set the upper and lower bound of each random number. Then you want to generate 20 random numbers within that range and find out whether each number of even or odd?

import random

def random_gen(number1, number2):
    for i in range(20):
        num = random.randint(number1,number2)

        if num % 2 == 0:
            print("Random Number", num, "is even")
        else:
            print("Random Number", num, "is odd")


number1 = int(input("Enter First Integer: "))
number2 = int(input("Enter Second Integer: "))

random_gen(number1, number2)

You have a few problems with your current code:

  1. Indentation (fixed in the edit)
  2. Unnecessary use of global variables. If you need that type of functionality you should consider passing the variables into each function as you need it instead
  3. A number of functions are unnecessary too. For example, you dont need the get_num() and odd_even() functions as you can just perform those actions within the loop that you have. Even in the case I just posted you dont even really need the random_gen() function - you can just move all of that code to after user input. I just left it there to show what I mean with point #2 above

Upvotes: 0

tuxskar
tuxskar

Reputation: 11

Well it doesn't seems so clear on the question what actually you want to do but the use of global is a really bad practice in general.

However you can use the methods that returns the values you need for instace: If you need a user input that returns 2 numbers it is better to use this approach:

def get_numeric_input(label):
    try:
        return int(input(label))
    except NameError:
        print "Please enter a number"
        return get_numeric_input(label)

With this function you can get a numeric value from a user.

Using it you can the 2 next values like

def get_user_input():
    n = get_numeric_input("Enter First Integer: ")
    m = get_numeric_input("Enter First Integer: ")
    return [n, m]

Now you have a function that returns the 2 values from the user and using the sort method for list you have those values sorted

def get_sorted_values(l):
    return l.sort()

Check this information about sorting in python https://wiki.python.org/moin/HowTo/Sorting

Using the random numbers as you have described is ok, but also try to use the is_odd and is_even function outside of any other function and you will be able to reuse them more times.

Upvotes: 1

Related Questions