2015-03-02 64 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