A Value error is
Raised when a built-in operation or function receives an argument that has the right type but an inappropriate value
the float function can take a string, ie float('5'), it's just that the value 'string' in float('string') is an inappropriate (non-convertible) string
On the other hand,
Passing arguments of the wrong type (e.g. passing a list when an int is expected) should result in a TypeError
so you would get a TypeError if you tried float(['5']) because a list can never be converted into a float.
Cite
Answer from David on Stack OverflowIn this example:
x = int(input("x: "))
print(f'x = {x}')if the input is a string, a ValueError is raised. Why not a TypeError? An invalid data type is inputted after all.
A Value error is
Raised when a built-in operation or function receives an argument that has the right type but an inappropriate value
the float function can take a string, ie float('5'), it's just that the value 'string' in float('string') is an inappropriate (non-convertible) string
On the other hand,
Passing arguments of the wrong type (e.g. passing a list when an int is expected) should result in a TypeError
so you would get a TypeError if you tried float(['5']) because a list can never be converted into a float.
Cite
ValueError a function is called on a value of the correct type, but with an inappropriate value
TypeError : a function is called on a value of an inappropriate type
Value error, name error, type error?
ValueError vs TypeError
ValueError vs TypeError
Calling "if" statement on errors (TypeError, ValueError, SyntaxError...)
What is the difference between a TypeError and a ValueError?
How do I handle errors in Python?
What are common Python errors?
A string is a sequence too; you can unpack a string into separate characters:
>>> a, b = 'cd'
>>> a
'c'
>>> b
'd'
The ValueError is raised because a string of length 1 cannot be unpacked into two targets.
When looping over a sequence of integers, however, you are trying to unpack each integer value into two targets, and integers are not iterable at all. That's a TypeError, because this is directly connected to the type of object you are trying to unpack:
>>> a, b = 42
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'int' object is not iterable
Compare this to strings, lists, tuples, iterators, generators, etc. which are all types that are iterable.
If you wanted to unpack the set directly, don't use a for loop:
>>> a, b = set([1, 2])
>>> a
1
>>> b
2
but do know that sets have no fixed order (just like dictionaries), and in what order the values are assigned depends on the exact history of insertions into and deletions from the set.
Your for loop is possibly going deeper than you expect. You're trying to unpack individual members of the set, not the set itself. In the first example the member is 1 and the second the member is a. Neither has two values.
What you possibly want is one, two = s.
You can also find this out by writing:
>>> s = set([1, 2])
>>> for one_two in s:
... print one_two
1
2