Это будет генерировать то, что вам нужно. Лучше ли это, чем помещать код внутри 4 для циклов, я не уверен.
kc = np.linspace (0.1 , 1, 10)
tauI = np.linspace (0.1 , 1, 10)
tauD = np.linspace (0.1 , 1, 10)
tauC = np.linspace (0.1 , 1, 10)
def possible_combinations():
for k in kc:
for ti in tauI:
for td in tauD:
for tc in tauC:
yield k, ti, td, tc
for a,b,c,d in possible_combinations():
print( a, b, c, d )
itertools.combination делает все комбинации из n элементов из одного списка.
from itertools import combinations
for i, j in combinations([1,2,3,4], 2):
print(i,j)
out: 1 2
1 3
1 4
2 3
2 4
3 4
Это должно гарантировать, что можно рассматривать набор объектов как тот же тип и затем выполнить некоторые операции на том типе (Вы знаете, что он должен наследоваться объекту).
Думайте о нем как атрибуты. Это - метаданные типа.
Вы также могли бы хотеть выполнить операцию на известном типе (например, Система. Сеть. UI.Control), но только выполняют ту операцию, если тип наследовался определенному интерфейсу (например, INamingContainer).
foreach(var ctrl in this.Controls)
{
if (ctrl is INamingContainer)
{
// Do something on the control
}
}
Это - интерфейс маркера. Это может использоваться для украшения типов так, чтобы можно было узнать это, тип корректен во время выполнения с использованием отражения. мы используем его, чтобы гарантировать, что универсальные типы корректны в вызываемом.
Чтобы перепутать pythonistas, кто думает, утиный ввод прохладен.
Интерфейсы Memberless используются для обеспечения подобных mixin возможностей в C#. Так, учитывая класс A:
class A : B { ... }
Можно дать ему дополнительную функциональность (множественное наследование крыла) путем определения интерфейса IStuff:
interface IStuff {}
затем 'реализовывая' его в A:
class A : B, IStuff { ... }
и затем добавление дополнительных опций
class Methods {
public static void Something(this IStuff stuff) {
// some functionality here
}
}