簡體   English   中英

調用變量內部的函數(隨機)

[英]Calling a function inside a variable (randomly)

因此,我有一系列不同的問題,根據所調用的函數分別提出不同的問題。 我想擁有它,因此對於每個問題,都會調用一個隨機類型的問題(函數)。 我認為這是最好的方法,但我不知道為什么它不起作用。

x = addition_question(int(random.randrange(0,101,1)),int(random.randrange(0,101,1)))

y = multiply_question(int(random.randint(1,10)),int(random.randint(1,10)))

z = subtract_question(int(random.randrange(0,101,1)),int(random.randrange(0,101,1)))

vars = [x,y,z]


import random

print("Question 1:")
print(random.sample(vars,1))
time.sleep(.25)

運行此命令將返回以下內容: http : //puu.sh/bP9dL/416caa5bc1.png

出於某種原因,它沒有打印出“ print(“問題1:”)”,而是在不調用變量的情況下打印了函數。

注意:錯誤在於變量的隨機化並調用它們。 當我指定要使用的問題(功能)類型時,它會按計划運行。

print("Question 1:")
addition_question(int(random.randrange(0,101,1)),int(random.randrange(0,101,1))) #creates addition question with randomised numbers between 1 and 101
print("")
time.sleep(.25)

print("Question 2:")
multiply_question(int(random.randint(1,10)),int(random.randint(1,10))) #creates multiplication question with randomised numbers between 1 and 10
print("")
time.sleep(.25)

隨意詢問有關其余代碼的問題!

當您這樣編寫代碼行時:

x = addition_question(int(random.randrange(0,101,1)),int(random.randrange(0,101,1)))

這將立即調用函數addition_question ,並將調用該函數的結果分配給x

您想要做的就是創建一些東西,以后可以懶惰地調用它,然后反復調用,每次返回不同的值。

這樣做的方法是定義一個函數:

def x():
    return addition_question(int(random.randrange(0,101,1)),int(random.randrange(0,101,1)))

然后,當然,您不想只打印x ,您想要調用 x並打印結果

print(random.sample(vars,1)())

這就是全部。


有關代碼的一些注意事項:

  • random.randrange返回一個整數; 沒有理由將其結果傳遞給int
  • random.sample(spam, n)選擇n值而不進行替換; n始終為1random.choice(spam)會更簡單random.choice(spam)
  • range一樣, random.randrange的參數都有默認值,因此您可以只編寫randrange(101) ,而不是randrange(0, 101, 1)
  • 沒有空格的長行代碼很難閱讀,尤其是在StackOverflow或典型的只能容納80個字符的終端窗口等地方。 在參數之間放置空格,如果它們太長,則將其分成兩行(或將它們重組為單獨的行,中間值存儲在臨時變量中),等等。請參見[PEP 8( http://legacy.python.org/dev/peps / pep-0008 / ),以獲取標准Python樣式指南。

在將函數存儲到vars列表之前,您已經調用了它們。 只需存儲對函數的引用,並選擇一個參數之后為參數傳遞隨機值:

questions = (addition_question, multiply_question, subtract_question)
print("Question 1:")
random.choice(questions)(random.randint(1,10), random.randint(1,10))

random.choice()隨機選擇三個函數引用之一,然后在random.choice()調用之后的(...)部分調用該隨機函數。 那時我們傳入了隨機選擇的參數。

注意,我沒有在random.randint()的返回值上使用int() random.randint() 該函數已經返回了整數,因此無需再次將其轉換為整數。 我還使用了random.choice()而不是使用樣本大小為1的random.sample()

如果您的函數需要不同的隨機整數范圍,則有幾種不同的選擇:

  • 將范圍與函數一起存儲,例如存儲在一個元組中,並在隨機調用random.randint()和所選擇的函數中選擇一個元組之后:

     questions = ( (addition_question, 0, 100), (multiply_question, 1, 10), (subtract_question, 0, 100), ) question, low, high = random.choice(questions) question(random.randint(low, high), random.randint(low, high)) 
  • 存儲lambda; 這些是匿名函數, 封裝了另一個在調用時要執行的表達式:

     questions = ( lambda: addition_question(random.randrange(101), random.randrange(101)), lambda: multiply_question(random.randint(1, 10), random.randint(1, 10)), lambda: subtract_question(random.randrange(101), random.randrange(101)), ) random.choice(questions)() 

在第一個選項中,我將值調整為可用於random.randint() ,在第二個選項中,我使用了最簡單的random.randrange()形式; 僅帶一個參數,它將默認開始為0 ,步長為1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM