Как я могу исправить эту проблему с переменной Python? - PullRequest
1 голос
/ 09 декабря 2010

Хорошо, если вы запустите приведенный ниже код в Python, он печатает только первую букву переменной вопроса, однако остальное печатает просто отлично. Это происходит только тогда, когда у меня есть функция цикла внутри моего скрипта Python. Любые идеи о том, как это исправить, чтобы я получил весь вопрос переменной печати?

    import random
    global nouns
    global verbs
    global question
    nouns =["website","browser","server","printer","computer","disc","software","desktop","a internet connection","the internet","site","forum","smf forum","phpbb forum","money making website","money making blog","firefox","chrome","opera","",""]
    verbs = ["cosntruct","build","create","design","update","reconstruct","clean","fix","repair","browse","discover","formualte","form","plan"]
    question = ["How do I","How would I", "how do i", "how would i", "what is a", "what is the", "how would i", "how should i", "when does a", "When does a", "How should I"]


    def q_gen():
       global nouns
       global verbs
       global question
       noun_pick = random.choice(nouns)
       verb_pick = random.choice(verbs)
       question = random.choice(question)
       create = question+" "+verb_pick+" "+noun_pick+"?"
       print create

    num_count = 0
    for num_count in range(1, 100):
       num_count=num_count+1
       q_gen()

Ответы [ 2 ]

9 голосов
/ 09 декабря 2010

Это происходит потому, что вы перезаписываете глобальную переменную question одним из значений question в этой строке:

question = random.choice(question)

Это означает, что происходит следующее:

question = [...] # question is a list of strings
question = random.choice(question) # question is a single string
question = random.choice(question) # question is a character from that string

Решение состоит в том, чтобы заменить имя переменной на что-то другое:

question_pick = random.choice(question)
create = question_pick+" "+verb_pick+" "+noun_pick+"?"

Несколько заметок о стиле

В код можно внести ряд улучшений. Эти изменения могут улучшить читабельность, повысить производительность и сделать код более понятным.

  • Объявление переменных. Это не сделано в Python. Когда вы присваиваете переменную, она возникает. Это включает в себя for заявления

    global a # Unnecessary and dangerous
    a = 0
    
  • Итерация. Когда вы говорите for x in ..., вы выполняете набор операторов снова и снова. Каждый раз, когда вы проходите через комплект, x присваивается следующему пункту. Вам не нужно присваивать или увеличивать x самостоятельно.

    x = 0 # Not necessary; x is about to be assigned to the first
          # element of range(10), which is 0
    for x in range(10):
        ...
        x = x + 1 # Not necessary; as soon as this statement is done,
                  # x will be assigned to the next element of range(10)
    
    1036 **
  • Globals.

    • Они вам не нужны. Когда вы используете name = ..., вы создаете переменную уровня модуля. Каждая переменная доступна везде в вашем модуле (то есть в вашем текущем .py файле)

    • Они опасны. Если какой-то другой модуль использует переменную с именем name, вас может удивить неприятный сюрприз. Имейте это в виду, если вы планируете развивать этот код дальше.

  • Форматирование строки. Идея состоит в том, что вы создаете шаблон, а затем помещаете теги туда, куда хотите поместить значения. Тег %s означает «интерпретировать следующую переменную как строку и поместить это здесь ".

    create = "%s %s %s?" % (question, verb_pick, noun_pick)
    
  • Стиль. Python имеет руководство по стилю, известное как PEP 8 . Убедившись, что ваш код соответствует PEP 8, он будет читабельным и будет выглядеть более похожим на другой код Python. Например, операторы должны быть заключены в один пробел, после запятой должен быть один пробел и т. Д.

1 голос
/ 09 декабря 2010

Эта строка изменяет вашу глобальную переменную:

 question = random.choice(question)

И после первого раза random.choice получает строку вместо списка, поэтому он случайным образом выбирает букву.С тех пор random.choice получает одну символьную строку, поэтому он всегда использует одну и ту же букву.

Эта ошибка возникла из-за того, что вы без необходимости использовали global.Написание этого без global дало бы ошибку компиляции, потому что вопрос был изменен.

Вот код без global:

import random
nouns =["website","browser","server"]
verbs = ["construct","build","create"]
question = ["How do I","How would I", "how do i"]

def q_gen():
    noun_pick = random.choice(nouns)
    verb_pick = random.choice(verbs)
    question_pick = random.choice(question)
    create = question_pick+" "+verb_pick+" "+noun_pick+"?"
    print create

for num_count in range(1, 100):
    q_gen()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...