Почему выражение for i in работает с множеством, как for in in range?
‘123’ это строка. А строка - это последовательность символов. Поэтому строку можно превратить в любую другую последовательность, её можно перебирать посимвольно, перегнать её в список посимвольно. 
А вот с перенесением строки в множество set() будет облом: ты получишь по одному экземпляру каждого символа из строки :)
1. Что-то странное у вас 
>>> a = set('123')
>>> a
{'2', '3', '1'}
>>> for i in a: print(i)
2
3
1
2. Потому что 1,2,3 неинтерируемая последовательность чисел. Будет работать, если, например, собрать из них список или кортеж : [1, 2, 3] , (1, 2, 3)