How often have you used the function `range()` in Python? It's often something you use early on as you learn about the `for` loop…
But… did you know it's not really a function, after all?!
Have a look at the docs or use `help()` to check…
`range` is a class. And therefore `range()` creates an instance of the class as is always the case with a class.
So, my question is: "Does it matter?"
Technically, it does. A function is not a class – they're different things
But in practice, what matters is how it behaves and not what it is!
This is a key principle in Python when thinking about data types. What they do and how they behave matters more that what they are!
So you can use `range()` like a function, even though it's not!
@raymondlesley one could argue the functions are the __new__() and __init__() methods, as with any class, and not the class itself. But the class is callable, like a function, of course
@peterdrake @raymondlesley conceptually, I believe there is a difference. One creates a new object based on a template, the other normally performs actions with existing objects.
And the capital letter is just a convention, after all. I believe this is deliberate as the intention is that it’s used “like a function”, even though it isn’t. This comes from Python’s duck-typing philosophy.
@s_gruppetta @raymondlesley Can you give an example where the behavior is different?
@peterdrake @raymondlesley I never said the "behaviour" is different. On the contrary, if you look at my first post, I mention that their behaviour is the same and this is "what matters" in a duck typing language
@s_gruppetta @raymondlesley What's the difference between calling a class and calling its initializer?
Also, if range is a class, shouldn't it start with an upper case letter?