Significance of "start" parameter to string method "endswith"

Steven D'Aprano steve at REMOVE.THIS.cybersource.com.au
Fri Apr 20 22:13:23 EDT 2007


On Fri, 20 Apr 2007 15:21:56 -0700, John Machin wrote:

> On Apr 20, 9:12 am, Steven D'Aprano
> <s... at REMOVE.THIS.cybersource.com.au> wrote:
>> On Thu, 19 Apr 2007 13:57:16 -0700, Boris Dusek wrote:
>> >> > what is the use-case of parameter "start" in string's "endswith"
>> >> > method?
>>
>> >> def foo(function,instance,param):
>> >>     if function(instance,param,2,4):
>> >>         return True
>> >>     else: return False
>>
>> >> The function must work whether you pass it
>> >> foo(str.endswith,"blaahh","ahh"), or
>> >> foo(str.startswith,"blaahh","aah"). This is a really bad example, but
>> >> it gets the point across that similar functions must have similar
>> >> parameters in order to be Pythonic.
>>
>> > Thanks for explanation, this point makes sense. And I agree that I can
>> > hardly imagine any use of both parameters :-).
>>
>> No, sorry, it doesn't make sense because not all string methods take the
>> same arguments! See, for instance, ''.translate() and ''.lower().
>>
>> The best reason for giving string methods and functions start and end
>> parameters is to avoid copying potentially large lumps of text. Here's a
>> silly example. Instead of doing this:
>>
>> while text:
>>     p = text.find('parrot')
>>     buffer = text[:p]
>>     text = text[p:]
>>     do_something_with(buffer)
>>
>> You can do this:
>>
>> p = 0
>> while text:
>>     p = text.find('parrot', p)
>>     do_something_with(buffer, p)
>>
>> which avoids copying text unnecessarily.
> 
> ... but increases the care and attention required when coding:

There are always trade-offs.


> 
> (1) "while text"? "while 1" is a  more obvious way of stress-testing
> your CPU fan :-) but perhaps you meant "while p >= 0".

No, I meant exactly what I said. You might notice that text becomes
smaller after each iteration:

text = text[p:]

Eventually text becomes the empty string and the while loop is exited
cleanly.

"while p >= 0" would be an alternative, but you still need to copy chars
into a buffer, and you still need to shrink the text or else you'll just
keep getting the same p over and over again.


> (2) 4s/buffer/text/


Yes, a silly typo caused by copy-and-paste-without-proof-reading.



-- 
Steven.





More information about the Python-list mailing list