A technique from a chatbot
Thomas Passin
list1 at tompassin.net
Tue Apr 2 15:31:26 EDT 2024
On 4/2/2024 1:47 PM, Piergiorgio Sartor via Python-list wrote:
> On 02/04/2024 19.18, Stefan Ram wrote:
>> Some people can't believe it when I say that chatbots improve
>> my programming productivity. So, here's a technique I learned
>> from a chatbot!
>> It is a structured "break". "Break" still is a kind of jump,
>> you know?
>> So, what's a function to return the first word beginning with
>> an "e" in a given list, like for example
>> [ 'delta', 'epsilon', 'zeta', 'eta', 'theta' ]
>>
>> ? Well it's
>> def first_word_beginning_with_e( list_ ):
>> for word in list_:
>> if word[ 0 ]== 'e': return word
>>
>> . "return" still can be considered a kind of "goto" statement.
>> It can lead to errors:
>>
>> def first_word_beginning_with_e( list_ ):
>> for word in list_:
>> if word[ 0 ]== 'e': return word
>> something_to_be_done_at_the_end_of_this_function()
>> The call sometimes will not be executed here!
>> So, "return" is similar to "break" in that regard.
>> But in Python we can write:
>> def first_word_beginning_with_e( list_ ):
>> return next( ( word for word in list_ if word[ 0 ]== 'e' ), None )
>
> Doesn't look a smart advice.
>
>> . No jumps anymore, yet the loop is aborted on the first hit
It's worse than "not a smart advice". This code constructs an
unnecessary tuple, then picks out its first element and returns that.
The something_to_be_done() function may or may not be called. And it's
harder to read and understand than necessary. Compare, for example,
with this version:
def first_word_beginning_with_e(target, wordlist):
result = ''
for w in wordlist:
if w.startswith(target):
res = w
break
do_something_else()
return result
If do_something_else() is supposed to fire only if the target is not
found, then this slight modification will do:
def first_word_beginning_with_e(target, wordlist):
result = ''
for w in wordlist:
if w.startswith(target):
res = w
break
else:
do_something_else()
return result
[Using the "target" argument instead of "target[0]" will let you match
an initial string instead of just a the first character].
> First of all, I fail to understand why there
> should be no jumps any more.
> It depends on how "return" and "if" are handled,
> I guess, in different context.
> Maybe they're just "masked".
> In any case, the "compiler" should have just
> done the same.
>
>> (if I guess correctly how its working).
>
> Second, it is difficult to read, which is bad.
> The "guess" above is just evidence of that.
>
> My personal opinion about these "chatbots", is
> that, while they might deliver clever solutions,
> they are not explaining *why* these solutions
> should be considered "clever".
> Which is the most important thing (the solution
> itself is _not_).
>
> bye,
>
More information about the Python-list
mailing list