Я хочу знать, как создать итерацию, которая будет содержать несколько или несколько параметров с разными диапазонами. Например, я хочу создать несколько объектов с итерациями, которые имеют разные диапазоны. Как и функция треугольника, которая принимает три параметра, как я могу использовать итерации, чтобы дать один параметр одному значению из диапазона, например, от 50 до 100, а другой параметр - совсем другой. Я знаю, как создать экземпляр над одним параметром:
for i in range(100):
Но что мне делать, чтобы создать экземпляр, если требуется несколько параметров
Похоже, вы захотите использовать вложенные для циклов. Например, для трех параметров:
# these are just example ranges, replace with what meaningful for your problem
range_for_parameter_0 = range(100)
range_for_parameter_1 = range(150)
range_for_parameter_2 = range(75)
# start a nested for loop
for i in range_for_parameter_0:
for j in range_for_parameter_1:
for k in range_for_parameter_2:
# you can print something out to see exactly what happening
# feel free to comment out the print statement
print('Calling triangle_function with parameters {},{},{}'.format(i,j,k))
# evaluate your triangle_function which takes 3 parameters
triangle_function(i,j,k)
Вы можете попробовать выполнить итерацию по картезианскому product
.
Дано
import itertools as it
def is_tri(a, b, c):
"""Return True if the sides make a triangle."""
a, b, c = sorted([a, b, c])
return (a + b) > c
ranges = range(1, 2), range(1, 3), range(1, 5)
Код
[sides for sides in it.product(*ranges) if is_tri(*sides)]
# [(1, 1, 1), (1, 2, 2)]
подробности
Если вы не знакомы со списком, последнее эквивалентно следующему коду:
results = []
for x, y, z in it.product(*ranges):
if is_tri(x, y, z):
results.append((x, y, z))
results
# [(1, 1, 1), (1, 2, 2)]
За ваш комментарий is_tri()
предварительно сортирует аргументы, поэтому вы меняете их:
assert is_tri(13, 12, 5) == True
assert is_tri(12, 5, 13) == True
assert is_tri(5, 13, 12) == True
Если ваши диапазоны одинаковы, вы можете упростить ввод с помощью параметра repeat
, например it.product(range(1, 101), repeat=3)
.
Вы не можете. Вам нужны три итерации.
for i in range(x):
...
for j in range(y):
...
for k in range(z):
...
См. Определение range()
здесь
range(start, stop[, step])
может принимать только один параметр stop
, так что вы либо используете вложенный цикл во вложенном цикле (очень плохо с точки зрения производительности), либо вы полностью реструктурируете логику алгоритма и соответствующим образом реорганизуете свой код.