-2

只要不满足循环条件,我就想继续随机生成单个字符。我希望我下面的代码可以工作,但它没有:

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,而不是每次都设置它。构建一个list然后"".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

两个原因:

  • 您丢弃您创建的字符(通过重新分配给相同的名称)
  • 无论如何,您只返回第一个字符(通过在循环内返回)

相反,考虑这样做:

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 回答