2015-03-02 45 views
-2

现在我试图编写一个需要20个数字的程序,并且可以用这些数字执行各种任务,例如查找最小/最大整数,找到总数,平均等返回一个整数的随机列表,Python 3.3

我有核心程序工作,但我想添加一个额外的选项,允许用户选择一个数字范围,并创建一个20值的列表。据我所知,我也有正确的写法。

我遇到的主要问题是,当我尝试返回列表以便它可能存储在先前定义的列表中时,它不会存储任何值。

下面是我写的一个用户输入自己的20个值的函数:

#Get Number List 
def input_numbers(): 
    print("Please enter a series of 20 numbers, pressing enter after each number.") 
    numList=[int(input('Enter a number: ')) for i in range(20)] 
    return numList 

这个工程就像一个魅力,不问任何问题。

在另一方面,这是我的随机生成的列表:

#Randomly generate 20 numbers. 
import random 
def randomly_generate(): 
    number1= int(input("Please enter the lower number: ")) 
    number2= int(input("Please enter the higher number: ")) 
    numList=random.sample(range(number1, number2), 20) 
    print(numList) 
    return numList 

为了澄清:我只能在函数中打印,检查随机数发生器的工作原理,它是。它将在指定范围内打印20个值。

但是,当我返回numList时,它不像第一个函数那样正确存储。这对我来说会导致问题,因为我无法用空列表执行其他功能。

编辑:这是什么导致的问题:我返回的值,但不重新定义numList,从而造成我的问题。

 elif choice == RANDOMLY_GENERATE: 
      randomly_generate() 

#Randomly generate 20 numbers 
#Import Random 
import random 
def randomly_generate(): 
    number1= int(input("Please enter the lower number: ")) 
    number2= int(input("Please enter the higher number: ")) 
    numList=random.sample(range(number1, number2), 20) 
    print(numList) 
    return numList 
+1

因为它与int(eval(raw_input(x)))相同,所以使用'int(input(x))'而不是'int(raw_input(x))'是不安全的。 – 2015-03-02 21:28:05

+1

你在哪里试图存储结果?你怎么知道它没有正确存储它们? – 2015-03-02 21:32:02

+3

@DanD。不是在Python 3下,其中['raw_input'现在被称为'input'](http://stackoverflow.com/questions/954834/how-do-i-use-raw-input-in-python-3-1) – zehnpaard 2015-03-02 21:35:27

回答

1

这里有一个简单的例子:看看你的代码

import random 

def randomly_generate(): 
    number1= int(input("Please enter the lower number: ")) 
    number2= int(input("Please enter the higher number: ")) 
    numList=random.sample(range(number1, number2), 20) 
    print(numList) 
    return numList 

if __name__ == "__main__": 
    returned_list = randomly_generate() 

    print(returned_list) 

#Randomly generate 20 numbers 
elif choice == RANDOMLY_GENERATE: 
    randomly_generate() 

你可以看到,你只是简单的调用该函数而不是分配函数的返回到任何变量。您需要这样做:

r_list = [] 
#... 

#Randomly generate 20 numbers 
elif choice == RANDOMLY_GENERATE: 
    r_list = randomly_generate() 
+0

谢谢!这解决了我的问题!我很欣赏这个建议。 – 2015-03-02 22:00:02

+0

我没有意识到我没有在我的elif语句下设置numList = randomly_generate()。 我为用户输入值做了这个,但不是随机生成的值。我浪费了你的一些时间,感觉很糟糕,但它帮助我提高了天文数字。 – 2015-03-02 22:10:01

+1

@BrianMorris我们都会在某个时间点出现这样的错误。很高兴我能成为你的[橡皮鸭子](http://en.wikipedia.org/wiki/Rubber_duck_debugging)。 – KronoS 2015-03-02 22:18:46

0

random.sample(sample, k)预计样本大小为k大小。如果你用输入0和20(元素0..19)运行第二个函数,它将正常工作。您要使用的功能是什么random.randrange(sample)

https://docs.python.org/2/library/random.html#random.randrange

#Randomly generate 20 numbers. 
import random 
def randomly_generate(): 
    number1= int(input("Please enter the lower number: ")) 
    number2= int(input("Please enter the higher number: ")) 
    numList= [ random.randrange(number1, number2) for i in range(20) ] 
    print(numList) 
    return numList 
+0

'[random.choice(range(number1,number2))for i in range(20)]'基本上与'random.sample(range(number1,number2),20)' – KronoS 2015-03-02 21:46:53

+0

>>> import作为r' '>>> r.sample(范围(1,5),20)' '回溯(最近通话最后一个):' '文件 “”,1号线,在' '文件 “/usr/lib/python3.4/random.py”,线路315,在sample' '提高ValueError异常( “样本超过人口大”)' 'ValueError异常:样本比population' – ProfOak 2015-03-02 21:51:02

+0

大我假设是用户知道它应该是一个范围大于20.除此之外,这不是核心问题。 – KronoS 2015-03-02 21:53:21

0

我也建议使用的xrange()迭代器,调用random.sample;在documentation中明确指出使用xrange()迭代器而不是创建范围列表()。

To choose a sample from a range of integers, use an xrange() object as an >argument. This is especially fast and space efficient for sampling from a large >population: sample(xrange(10000000), 60).

当然,你必须得到函数的返回值以某种方式存储在一个变量中。如果你这样做

numList = [] 

什么都不会发生在你的numList,因为你的numList只在函数范围内。您必须获得返回值才能在主功能范围内使用它

main() 
    numList = [] 
    numList = getrandomList() 
    print(numList) 

这应该这样做。

+0

你的建议是:xrange不适用于Python 3,其中'range'返回一个懒惰评估的迭代器。 (虽然对Python 2有很好的建议) – zehnpaard 2015-03-02 21:55:13

+0

对,它甚至在后期标题中指定,没有看到,我通常使用2.7,因此我忘记了这一点,但这是正确的@zehnpaard – hallole 2015-03-02 21:56:47

相关问题