[EMAIL PROTECTED] wrote: > What languages besides Python use the Python slicing convention?
Java uses it for the "substring" method of strings. > In C starting at > 0 may be justified because of the connection between array subscripting > and pointer arithmetic, but Python is a higher-level language where > such considerations are less relevant. Maybe less relevant, but relevant nonetheless. First, there's the desire for familiarity. Many Python programmers are also C programmers, and that fact has had an influence on the development of the language. That's why we write "x += 0x20" rather than "x := x + $20". Why not array indexing as well? More importantly, there are reasons for counting from zero that have nothing to do with pointers. The biggest reason involves modular arithmetic: r=n%d satifies 0 <= r < d, which conveniently matches Python's array syntax. DAY_NAMES = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"] def weekday_name(date): return DAY_NAMES[date.toordinal() % 7] Modular arithmetic's preference for 0-based counting goes beyond array indexing. For example, consider our notation for time, from 00:00:00 to 23:59:59. def time_add(time, delta): """ time = an (hour, minute, second) tuple for a time of day delta = an (hour, minute, second) tuple for an amount of time Returns time+delta, as an (hour, minute, second) tuple. """ hour = time[0] + delta[0] minute = time[1] + delta[1] second = time[2] + delta[2] # Normalize the time second = ((hour * 60) + minute) * 60 + second minute, second = divmod(second, 60) hour, minute = divmod(minute, 60) hour %= 24 return hour, minute, second Imagine that the time notation went from 01:01:01 to 24:60:60. Try writing a time_add function for that. The only simple way I can think of is to temporarily convert to zero-based notation! def time_add(time, delta): # Add like terms and convert to zero-based notation. hour = time[0] + delta[0] - 1 minute = time[1] + delta[1] - 1 second = time[2] + delta[2] - 1 # Normalize the time second = ((hour * 60) + minute) * 60 + second minute, second = divmod(second, 60) hour, minute = divmod(minute, 60) hour %= 24 # Convert back to one-based notation on output return hour + 1, minute + 1, second + 1 > Along the same lines, I think the REQUIREMENT that x[0] rather than > x[1] be the first element of list x is a mistake. At least the > programmer should have a choice, as in Fortran or VBA. If you really want 1-based arrays, just do what most BASIC programmers do: Ignore x[0]. >>> months = [None, "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] >>> print months[4] Apr -- http://mail.python.org/mailman/listinfo/python-list