-2

ループ条件が満たされない限り、ランダムに 1 文字を生成し続けたい。以下のコードが機能することを望んでいましたが、機能しません。

import string
import random

def random_characters(number):
    i = 0
    new_string = ''

    while (i < number) :
        new_string = random.choice(string.ascii_lowercase)
        i = i + 1
        return new_string


random_characters(3)

このコードを実行しても何も起こらず、エラーに関するフィードバックも得られません。私は間違った方法で使用return new_stringしている可能性がありますが、それが欠けていても理解できません。

4

2 に答える 2

3

まず、returnループ内にあるため、何度もループすることはありません。に変更します

def random_characters(number):
    i = 0
    new_string = ''

    while (i < number) :
        new_string = random.choice(string.ascii_lowercase)
        i = i + 1
    return new_string # <<< Dedent

random_characters(3)
#>>> 'c'

new_string次に、毎回設定するだけでなく、実際にビルドする必要があります。listaをビルドしてから、次の"".joinようにします。

def random_characters(number):
    i = 0
    letters = [] # Place to put the letters

    while (i < number) :
        letters.append(random.choice(string.ascii_lowercase)) # <<< Add the letter
        i = i + 1
    return "".join(letters) # <<< Join the letters into one string

random_characters(3)
#>>> 'lgp'

次に、ループfor i in range(number)の代わりに使用する必要があります。while

def random_characters(number):
    letters = []

    for i in range(number): # <<< Deals with i for you.
        letters.append(random.choice(string.ascii_lowercase))

    return "".join(letters)

random_characters(3)
#>>> 'xay'

また、リスト内包表記で短縮版を使用できます。

def random_characters(number):
    # MAGIC!
    letters = [random.choice(string.ascii_lowercase) for i in range(number)]

    return "".join(letters) # <<< Join the letters into one string

random_characters(3)
#>>> 'yby'

これを実行したい場合は、いくつかの選択肢があります。対話型インタープリターでこれを実行できます。

%~> python -i random_characters.py
>>> random_characters(3)
'zgp'

printまたは、ファイル内の結果にそれを伝えることができます:

print(random_characters(3))  # Python 3
print random_characters(3)   # Python 2
于 2013-09-28T14:29:07.950 に答える
2

2 つの理由:

  • 作成したキャラクターを破棄します(同じ名前に再割り当てすることにより)
  • とにかく最初の文字だけを返します(ループ内に戻ることにより)

代わりに、次のことを検討してください。

import string
import random

def random_characters(number):
    i = 0
    random_chars = []

    while (i < number) :
        random_chars.append(random.choice(string.ascii_lowercase))  # Store the char you generate
        i = i + 1

    return ''.join(random_chars)  # Return once you have all the characters

もちろん、これはこれを行うための最も Pythonic な方法ではありません。人為的な条件をループしない方法は次のとおりです。

def random_characters(number):
    return "".join((random.choice(string.ascii_lowercase) for _ in xrange(number)))

注: これはジェネレータ式と呼ばれます

于 2013-09-28T14:28:17.987 に答える