Ошибка типа: неподдерживаемые типы операндов для%: 'range' и 'int' - PullRequest
0 голосов
/ 20 мая 2018

Напишите программу на Python для поиска чисел от 120 до 200, которые делятся на 7 и кратны 5 без использования цикла for.

Я пытался разобраться в этом способе ...

x = range(120, 200)
if x % 7 == 0 and x % 5 == 0:
    print(x)

Но скорее я получаю эту ошибку.Что я мог упустить?

Traceback (most recent call last):
File "C:\Users\User\Desktop\skillshare-code\if else statements\4.py", line 
    11, in <module>
if x % 7 == 0 and x % 5 == 0:
TypeError: unsupported operand type(s) for %: 'range' and 'int'

Ответы [ 5 ]

0 голосов
/ 06 мая 2019

Я только что столкнулся с проблемой, которая была очень похожа.На самом деле так похоже, что мне интересно, написал ли ОП проблему неправильно.В моем чтении задача состояла в том, чтобы найти все числа в диапазоне, которые делятся на 7, а не на пять.Это очень отличается от простого сокращения проблемы до x% 35. Тем не менее, создание понимания списка было ответом.Вот что сработало для меня:

x = range (2000, 3201) num = [n для n в x, если n% 7 == 0 и n% 5! = 0]

Как только это будет сделано, просто напечатайте (num), и у вас есть ответы.

0 голосов
/ 20 мая 2018

Я думаю, что использование понимания списка более идиоматично для Python, чем filter (конечно, если вам позволено).

x = range(120, 200)
valid_nums = [num for num in x if num % 35 == 0]

Или при создании:

valid_nums = [num for num in range(120, 200) if num % 35 == 0]
0 голосов
/ 20 мая 2018

То, что вы пытаетесь сделать, это определить x как диапазон чисел, но это создаст список чисел xa, и вам все равно придется просмотреть каждое число, чтобы проверить его.Поскольку «цикл for» недопустим, вы можете использовать цикл while или вызывать рекурсивную функцию, начиная с нижнего предела, пока передаваемый параметр не достигнет верхнего предела.

def func(x):
       if (condition satisfied):
            print(x)
       if x<upper_limit:
            func(x+1)
       return
0 голосов
/ 20 мая 2018

Твоему учителю это нравится.Делимое на 7 и кратное 5 означает просто делимое на 7 и 5, поэтому 35 ...

Ваш исходный код нуждается в цикле.Но в Python есть встроенные модули, которые генерируют циклы без оператора for или while (и они намного быстрее, чем for или while, потому что они обычно используют собственный скомпилированный код C)

sshashank124 дал хороший ответ, но его можно упростить еще больше:

  • , выбрав правильную range начальную точку путем "выравнивания" 120 на следующем кратном 35
  • используйте шаг 35 в range

следующим образом:

>>> list(range(((120//35)+1)*35,200,35))
[140, 175]

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

0 голосов
/ 20 мая 2018

Поскольку вам не разрешено использовать конструкцию for, вы можете выполнить это с помощью метода filter:

valid_nums = filter(lambda x: x % 35 == 0, range(120, 200))

Обратите внимание, что проблема не задаетсяВы должны напечатать числа, а вместо этого «найти» их, что означает создание некоторой формы списка или коллекции допустимых значений

PS: я сделал x % 35 == 0, потому что «делится на» и «кратно» означаетто же самое и 35 - из 7*5.

PPS: filter возвращает объект фильтра, который является генератором.Вам нужно будет преобразовать это в список, если вы хотите просмотреть список, выполнив list(valid_nums).Вам не нужно выполнять преобразование, если вам просто нужно перебрать значения и использовать их для чего-то другого, так как генератор будет отлично работать для этого

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...