Python: выбрать только части ввода? - PullRequest
0 голосов
/ 03 февраля 2011

Извините ... Я вроде как программист нуб.Я смотрел на некоторые наборы проблем в Интернете и нашел ЭТО ОДИН .Я написал так много:

import random

powerball=random.randint(1,42)

a=random.randint(1,53)
b=random.randint(1,53)
c=random.randint(1,53)
d=random.randint(1,53)
e=random.randint(1,53)

(f,g,h,i,j)=x=input("Your 5 Chosen Numbers:")

Моя проблема в том, что я не знаю, как заставить программу напечатать что-то вроде «Пожалуйста, введите 5 цифр, разделенных запятой», если введено больше или меньше пяти,И как мне это сделать, если бы я хотел, чтобы он отображал другое сообщение каждый раз, когда они совершали эту ошибку?

Ответы [ 3 ]

2 голосов
/ 03 февраля 2011

Попробуйте этот подход:

input_is_valid = False
while not input_is_valid:
    comma_separated_numbers = raw_input("Please enter a list of 5 numbers,separated by commas: ")
    numbers = [int(x.strip()) for x in comma_separated_numbers.split(",")]
    if len(numbers) != 5:
        print "Please enter exactly 5 numbers"
    else:
        input_is_valid = True
0 голосов
/ 03 февраля 2011

Глядя на вашу ссылку, я бы сказал:

import random

while True:
    sets = input('how many sets? ')
    if type(sets) == int:
        break
    else:
        pass

for i in range(sets):
    ri = random.randint
    powerball = ri(1,42)
    other_numbers = sorted(ri(1,53) for i in range(5))
    print 'your numbers:','\t',other_numbers,'\t','powerball:','\t',powerball

Кажется, это более или менее то, что он просит от вас. Если я прав, вы хотите, чтобы пользователь отправил свою серию, чтобы увидеть, извлечен ли ее один из наборов (амирит?)

тогда можно было бы сделать:

import random

while True:
    sets = input('how many sets? ')
    if type(sets) == int:
        break
    else:
        pass

while True:
    myset = raw_input('your 5 numbers:').split()
    if len(myset) != 5:
        print "just five numbers separated ny a space character!"
    else:
        myset = sorted(int(i) for i in myset)
        break


for i in range(sets):
    ri = random.randint
    powerball = ri(1,42)
    numbers = sorted(ri(1,53) for i in range(5))
    print 'numbers:','\t',numbers,'\t','powerball:','\t',powerball
    if numbers == myset:
        print "you won!" ##or whatever the game is about
    else:
        print "ahah you loser"

РЕДАКТИРОВАТЬ: будьте осторожны, это не проверяет случайно сгенерированные числа. Так бывает, что одно число может появляться более одного раза в одной и той же последовательности. Чтобы попрактиковаться, вы можете попытаться избежать такого поведения, делая медленный темп изучения некоторого питона так, как это может быть:

  1. сделать набор из копии списка "цифры" - используйте set ()
  2. если его длина меньше 5, сгенерировать другое число
  3. проверить, есть ли новый номер в списке
  4. если это так, добавьте его в список. если это еще не уникально, GOTO point 1: -)
  5. рассортируй все заново
  6. вот и все

Приятного чтения документов!

0 голосов
/ 03 февраля 2011

Мое предложение:

import random
import sys

powerball=random.randint(1,42)

a=random.randint(1,53)
b=random.randint(1,53)
c=random.randint(1,53)
d=random.randint(1,53)
e=random.randint(1,53)


bla = ["\nPlease enter 5 numbers separated by only a comma : ",
       "\nPlease, I need 5 numbers separated by only a comma : ",
       "\nPLEASE, 5 numbers exactly : ",
       "\nOh gasp ! I said 5 numbers, no more nor less : ",
       "\n! By jove, do you know what 5 is ? : ",
       "\n==> I warn you, I am on the point to go off : "]

i = 0
while i<len(bla):

    x = raw_input(warn + bla[i])

    try:
        x = map(int, x.split(','))
        if len(x)==5:
            break
        i += 1

    except:
        print "\nTake care to type nothing else than numbers separated by only one comma.",

else:
    sys.exit("You wanted it; I go out to drink a beer : ")

(f,g,h,i,j)=x
print f,g,h,j,i

.

Некоторое объяснение:

.

for_stmt :: = "для" target_list "в" expression_list":" suite ["else" ":" suite]

A оператор break , выполненный в первом наборе, завершает цикл без выполнения набора предложения else.Оператор continue, выполненный в первом наборе, пропускает оставшуюся часть и продолжает работу со следующим элементом или с предложением else, если следующего элемента не было.

http://docs.python.org/reference/compound_stmts.html#index-801

.

.

x = map (int, x.split (',')) означает, что функция int () применяется к каждомуэлемент итерируемого, который является вторым аргументом.Здесь итерируемым является список x.split (',') Следовательно, x - это список из 5 целых чисел. В Python 3 больше нет raw_input () , он был заменен на input () , который получает символы, как raw_input () в Python 2.

.

.

...