✍️ نبودن هدف در اولین خانه به معنی نبودن آن در کل فهرست نیست. برای اعلام شکست باید همه خانههای لازم را ببینیم. مثلاً در [2, 8, 4] جستوجوی هشت بعد از یک نابرابری هنوز ادامه دارد و در خانه یک موفق میشود. فقط برای هدفی مثل نه، کل مسیر به پایان میرسد.
حالا خروجی این قطعه را مشخص کن:
def find_first(values, target):
for i, value in enumerate(values):
if value == target:
return i
return -1
print(find_first([6, 1, 4], 9))
سه مقایسه انجام میشود و هیچکدام برابر نیستند. به تورفتگی return -1 دقت کن؛ این خط بیرون حلقه است، بنابراین فقط پس از تمام شدن جستوجو اجرا میشود. خروجی، تعداد مقایسهها یا آخرین عضو نیست، بلکه علامت شکست قرارداد است.
خطای رایج اینه که منفی یک را «خطای اجرا» تصور کنیم. اینجا هیچ استثنایی رخ نداده و تابع درست کار کرده است. اگر فهرست خالی هم باشد، تابع همین مقدار را برمیگرداند، چون هیچ خانهای برای بررسی وجود ندارد. علامت شکست باید هنگام مصرف جواب جداگانه کنترل شود.
فعالیت شما
خروجی print را در جستوجوی 9 داخل [6,1,4] انتخاب کن؛ در نبود هدف find_first مقدار -1 میدهد.