2011-03-27 15 views
0

私は非常にPythonには新しいので、私のコードは非常に非効率的であると確信していますが、現時点でやって学ぶので、私の一般的な無知を言い訳する。ランダム生成クイズを書くと、ランダムに生成されたオブジェクトを呼び出す必要があります

私のクイズは現在、一連の引用符を取り、その最初の20文字を(スライスを介して)ランダムに印刷します。その考え方は、クイズが残りの部分を暗唱しているということです。

私は引用符全体を取得する機能を追加したいと思いますが、ランダムモジュールが生成した最後のオブジェクトを呼び出すようにpythonに指示する方法はわかりません。ここで

は私のコードです:

import random 
control = True 

JCIIiii34 = "Valiant men never taste of death but once" 
SonnetSeventeen = "If I could write the beauty of your eyes,\nAnd in fresh numbers number all your graces,\nThe age to come would say this poet lies,\nSuch heavenly touches ne'er touched earthly faces." 
SonnetEighteen = "So long as men can breath and eyes can see,\nSo long lives this, and this gives life to thee." 
JCIii101 = "I had as lief not be as live to be\nIn awe of such a thing as I myself" 


print "After quote type 'exit' to leave, or 'next' for next quote" 

while control: 
    quote = random.choice([SonnetSeventeen,SonnetEighteen,JCIIiii,JCIii]) 
    print quote[:20] 
    var = raw_input ("\n") 
    if var == "exit": 
     control = False 
    elif var == "next": 
     print "\n" 
     control = True 

だから、私は何をできるようにしたいことはprint文はそのオブジェクトへの呼び出しはどこ

elif var == "answer": 
    print #the full quote 

を言って1つの以上のelif文を追加していますもともとスライスされていたが、完全に印刷していた。

ランダムモジュール用のPythonライブラリエントリを読んだところ、答えが見つかりませんでした。

私はこれを実行するより効率的な方法にもオープンしています(私は引用符を別のファイルに保存できますが、それはまだ分かりません)。

ありがとうございました!

答えて

2

あなたはquote自体を使用することができます。

while control: 
    quote = random.choice([SonnetSeventeen,SonnetEighteen,JCIIiii34,JCIii101]) 
    print quote[:20] 
    var = raw_input ("\n") 
    if var == "exit": 
     control = False 
    elif var == "next": 
     print "\n" 
     control = True 
    elif var == "answer": 
     print quote 
+0

まあ私は愚か者のように感じる。私はそれを考慮しましたが、ランダムに再び生成すると仮定しました。だから私が間違っていない場合、このようなwhileループでは、ループするまでランダムモジュールは再びランダム化されず、オブジェクト "quote"は一時的に最後に生成されたオブジェクトをポイントします。それは正確ですか?編集:ありがとう! – user679400

+0

はい、それです。それを長く保つ必要がある場合は、引用符を別の変数( 'last_quote'など)に保存してください。 –

+0

優秀、ありがとう! – user679400

2

quote[:20]は、元quoteを破壊しません。だから平野print quoteはうまくいくはずです!

エミリオとして

+0

私はダミーです。私は、引用がランダムに生成するオブジェクトに割り当てられたので、呼び出されるたびにランダムに生成されると仮定しましたが、ループでは、再度生成するように指示されるまで生成されます。 – user679400

+0

いいえ、そうです、毎回再生します。私はユーザーが1回のループサイクルでクイズに答えると仮定しました。そうでなければ、現在のループの外側で引用方法を選択し、別のループを導入する必要があります:現在の引用を推測するための内部ループ、プログラムロジックの外部ループ(次の引用/終了) – pajton

0

同じ答え(BTW。あなたはまだそれが必要な場合は、randomからの最後の値をリコールする必要はありません、あなたはそれが返された最後の値を格納することができます)、しかし、あなたはまた、プリントを使用することができます[20:]これまでに表示されなかった残りの見積もりを印刷するだけです。また、エミリオが言っsimpiflyするために、あなただけ行うことができます:ときにそれが既にTrueであるため、「elifのVAR == 『次へ』」声明の中で

while True: 
    quote = random.choice([SonnetSeventeen,SonnetEighteen,JCIIiii34,JCIii101]) 
    print quote[:20] 
    var = raw_input ("\n") 
    if var == "exit": 
     break 
    elif var == "next": 
     print "\n" 
    elif var == "answer": 
     print quote[20:] 

を、あなたはTrueにコントロールを割り当てる必要はありませんその点に達する。

関連する問題