Более простой способ проверить список с помощью возрастающего значения (Python 2.5.X)

Я работаю над книгой, которая учит принципам компьютерного программирования с помощью Python. В одном из упражнений с пальцами мне предлагается: Написать программу, которая просит пользователя ввести целое число и выводит два целых числа, root и pwr, такие, что 0 ‹ pwr ‹ 6 и root^pwr равно целому числу, введенному командой Пользователь. Если такой пары целых чисел не существует, она должна вывести соответствующее сообщение. Я написал программу, которая делает то, о чем она просит. У меня только один вопрос о проверке уравнения с числами списка. Вот мой код:

x = int(raw_input('Enter an integer: '))
root = 0
pwr = [1,2,3,4,5]
listnum = 0

for root in range(0, x + 1):  
    while pow(root, pwr[listnum]) < x:
        root += 1
        if pow(root, pwr[listnum]) == x:
                print str(root) + '^' + str(pwr[listnum]) + ' = ' + str(x)
                break
        listnum += 1
        if pow(root, pwr[listnum]) == x:
                print str(root) + '^' + str(pwr[listnum]) + ' = ' + str(x)
                break
        listnum += 1
        if pow(root, pwr[listnum]) == x:
                print str(root) + '^' + str(pwr[listnum]) + ' = ' + str(x)
                break
        listnum += 1
        if pow(root, pwr[listnum]) == x:
                print str(root) + '^' + str(pwr[listnum]) + ' = ' + str(x)
                break
        listnum += 1
        if pow(root, pwr[listnum]) == x:
                print str(root) + '^' + str(pwr[listnum]) + ' = ' + str(x)
                break
        listnum = 0
    if pow(root, pwr[listnum]) == x:
        break
    else:
        print 'No combinations within parameters exist'

Я хотел бы знать, как проверить if pow(root, pwr[listnum]) ‹ x для всех 5 приращений без повторения listnum += 1...if... ломать несколько раз. Если вопрос не ясен, я могу попытаться уточнить больше. Я видел вопрос, касающийся именно этой проблемы, но ни один из них не дает четкого ответа на конкретный вопрос, который у меня есть, поэтому я не собираюсь повторно публиковать вопрос. Если будут сделаны какие-либо другие предложения, они будут высоко оценены. Спасибо!


person zmerilla    schedule 27.10.2013    source источник
comment
Во-первых, обратите внимание на pwr[listnum] == listnum + 1, поэтому в списке pwr нет необходимости. Вместо этого вы можете перебрать range(1, 6) (то есть [1, 2, 3, 4, 5]).   -  person Tim Peters    schedule 27.10.2013


Ответы (1)


Вот один из способов сделать то, что вам нужно:

def find(x):
    for root in range(x + 1):
        for pwr in range(1, 6):
            y = pow(root, pwr)
            if y > x:
                break
            if y == x:
                return root, pwr
    return None

x = int(raw_input('Enter an integer: '))
result = find(x)
if result is None:
    print 'No combinations within parameters exist'
else:
    root, pwr = result
    print root, "**", pwr, "=", x

Однако я не уверен, что вы действительно этого хотите. ^ в Python является побитовым исключающим ИЛИ, а не возведением в степень. Так что странно, что в постановке задачи использовалось ^.

Еще одна особенность заключается в том, что "No combinations ..." никогда не будет напечатано, потому что независимо от того, что вы вводите для x, pow(x, 1) == x будет найдено как решение.

person Tim Peters    schedule 27.10.2013
comment
Спасибо, Тим. Это сработало намного лучше. Я, будучи новичком в Python, по привычке написал root^pwr вместо root**pwr, которое напечатано в книге. Что касается сообщения об ошибке, которое он попросил меня напечатать, я думаю, что это тоже странно, может быть, его просто упустили из виду или пытаются приучить новых программистов иметь альтернативу условным выражениям. - person zmerilla; 27.10.2013