2013-09-28 2 views
-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 неправильно, но я не могу понять это, даже если это то, чего мне не хватает.

+0

Это может помочь: [Что 'return' делать? Ничто никогда не возвращается] (http://stackoverflow.com/questions/19066925/what-does-return-do-nothing-is-ever-returned), а BTW ваш оператор 'return' не имеет отступов должным образом. –

ответ

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 
+0

Просто примечание: есть соглашение (или, ну, это обычное дело) использовать '_' в качестве переменной цикла, если вы не собираетесь его использовать. –

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))) 

Примечание: это называется generator expression

+0

Это все еще не отвечало: ** Когда я запускаю этот код, ничего не происходит ** –

+0

@hcwhsa Вероятно, вы захотите добавить оператор 'print' перед' random_characters (3) ', если вы хотите, чтобы какой-то вывод отображался : 'print random_characters (3)'. Прямо сейчас вы генерируете случайную строку и отбрасываете ее. –

+0

Это то, о чем просил OP, и вы не упомянули ничего, что связано с этим в вашем ответе. Даже если они используют ваш код, они не получат никакого вывода. –

Смежные вопросы