Если вы хотите, чтобы циклические объекты были в основном нетронутыми, а нециклические объекты ведут себя как список из 1 элемента, вы можете сделать что-то вроде:
def forceiter(x):
return getattr(x,"__iter__",lambda:(x,))()
Демо:
for x in [1,[2],range(3),"abc",(),{3:3,4:"x"}, np.logspace(0,3,4)]:
print(x,end=" --> ")
for i in forceiter(x):
print(i,end=" ")
print()
# 1 --> 1
# [2] --> 2
# range(0, 3) --> 0 1 2
# abc --> a b c
# () -->
# {3: 3, 4: 'x'} --> 3 4
# [ 1. 10. 100. 1000.] --> 1.0 10.0 100.0 1000.0