
I agree with Art that this really shouldn't have much to do with "newbies" (how to define? -- new to Python in particular, or to programming in general; I suppose the latter). Forcing type coercian looks a bit easier when you write 3./4 vs p/q, as the former show their types by inspection. It's p/q that's more problematic because we don't know what it will do until we either (a) type check or (b) coerce, on the assumption that p and q are at least int, float or long. Suppose p = long('2847509247509234750924752309') and q = 5. Then p/q returns 569501849501846950184950461L whereas float(p)/q returns 5.6950184950184698e+026. We know that the former is how many times 5 divides evenly into p; there might still be a remainder (and there is: 4). Using // in the code tells other programmers that division of the former kind is expected (tossing out the remainder, keeping results integer). / says the result will be float. You don't need to look elsewhere in the code to try to figure out if p and q are both ints. Given this is code you didn't write, you maybe don't get to force a type coercian either (who said you could change what's written? -- maybe this is a commercial app and you job is to understand but NOT tweak). So you're left trying to discover the secret identities of p and q, if you want to know how this operator will behave. In a weakly typed language, that's not easy. Maybe the coder has some p *= 1. nearby, but who's to enforce such an idiom? Now of course we have overdetermination in + as well, i.e. a + b might concatenate, vs. add numbers. But it's somewhat easier to track when a variable is being treated as an str vs. some kind of number, than it is to be sleuthing the diff between float, int and long usages. So I can see the argument for making the return value explicitly typed thanks to what operator is used (/ or //). I don't need to think about newbies. I think about pro programmers studying code they didn't write and trying to figure it out. Kirby
float() 2.847509247509235e+027 float(long('2847509247509234750924752309'))/5
long('2847509247509234750924752309')/5
divmod(long('2847509247509234750924752309'),5) (569501849501846950184950461L, 4L)