Faragiri

همهٔ زبان‌ها

آموزش پایه‌های پایتونپایتون

پنج جفت کد که هر دو یک جواب می‌دهند و ستون دوم اندیس ندارد. همان‌جاست که جای پنهان شدن خطای یکی‌کم و یکی‌زیاد از بین می‌رود.

۴بخش
۳دقیقه خواندن
۴عمق

همان سه ردیف، دو بار

نسخه‌ای که کار می‌کند، و نسخه‌ای که جای پنهان شدن باگ ندارد

هر دو ستون اجرا می‌شوند و هر دو یک جواب می‌دهند. ستون دوم اندیس ندارد، و تفاوت واقعی همان‌جاست.

نوشته‌شده از روی زبان دیگراندیس، شمارنده، و یک فهرست موقتی
نوشته‌شده به پایتونباز کردن چندتایی، و حلقه‌ای که شکل خودش را می‌گوید
خواندن سه فیلدr[0], r[1], r[2]for kod, mojoodi, gheymat in radifha
وقتی جایگاه لازم استi = 0 و بعد i += 1enumerate(radifha, start=1)
جفت کردن دو فهرستحلقه روی range(len(kodha))dict(zip(kodha, gheymatha))
فیلتر کردن در یک دیکشنرییک دیکشنری خالی و یک if داخل حلقه{k: m for k, m, _ in radifha}
یک چاپ برای اشکال‌زداییprint("jam", jam)f"{jam=}"

ستون دوم علامت خورده، چون روی این پنج ردیف یک جواب درست وجود دارد. این درباره هر جفتی در این زبان صادق نیست، و نموداری که برنده تعیین می‌کند دارد موضع می‌گیرد و نه مقایسه.

پایتون را می‌شود با گرامر یک زبان دیگر نوشت و کار می‌کند. چیزی که فرق دارد این است که نسخه پایتونی معمولا اندیس ندارد، و اندیس همان جایی است که خطای یکی‌کم و یکی‌زیاد در آن زندگی می‌کند.

سه ردیف انبار به‌شکل چندتایی، و پنج کاری که روزانه رویشان انجام می‌شود:

  • for kod, mojoodi, gheymat in radifha: به‌جای خواندن با r[0] و r[1]
  • enumerate(radifha, start=1) به‌جای شمارنده دستی؛ عضو اولش (1, ('PL-14', 240, 18000)) است
  • dict(zip(kodha, gheymatha)) به‌جای حلقه روی range(len(kodha))
  • {k: m for k, m, _ in radifha} که می‌دهد {'PL-14': 240, 'PL-15': 180, 'PL-16': 95}
  • max(radifha, key=lambda r: r[2]) که گران‌ترین ردیف را می‌دهد، یعنی PL-16

زیرخط در ردیف چهارم قرارداد است و نه نحو: یعنی این مقدار را می‌گیرم و استفاده نمی‌کنم. خواننده بعدی از همان یک نویسه می‌فهمد که چیزی جا نیفتاده است.

سه چیزی که بیشتر از بقیه غافلگیر می‌کنند

برش رشته و فهرست سر بالا را شامل می‌شود و ته را نه: radifha[0:2] دو عضو می‌دهد. همین قاعده است که باعث می‌شود a[:n] و a[n:] دقیقا کل فهرست را بدون همپوشانی بپوشانند، و همین است که تقریبا همه خطاهای مرزی را حذف می‌کند.

فهرست و دیکشنری با انتساب کپی نمی‌شوند و همان شی مشترک می‌مانند، که موضوع مقدارها کجا می‌نشینند و چه وقت آزاد می‌شوند است. و مقایسه با is درباره یکی بودن شی است و نه برابری مقدار؛ برای مقدار همیشه ==، و is فقط برای None.

یک نویسه که وقت اشکال‌زدایی را نصف می‌کند

در رشته قالبی، علامت مساوی پس از نام، هم نام و هم مقدار را چاپ می‌کند: f"{jam=}" خروجی jam=515 می‌دهد. با چهار متغیر در یک سطر، همین یک نویسه در هر کدام، جای نوشتن دوباره نام‌ها را می‌گیرد و جای اشتباه چاپ کردن یک نام با مقدار دیگری را هم می‌بندد. از پایتون 3.8 هست و بیشتر کسانی که سال‌ها پایتون نوشته‌اند هنوز از آن خبر ندارند.

جایی که کار گیر می‌کند، ترجمه از سی و جاواست

بیشتر کسانی که در ایران پایتون را شروع می‌کنند، پیش از آن در درس‌های دانشگاهی سی یا جاوا دیده‌اند. نتیجه‌اش کدی است که در پایتون کار می‌کند و پایتون نیست: حلقه روی range(len(...))، متغیر شمارنده، فهرست موقتی که با append پر می‌شود، و دو سطر برای کاری که یک عبارت است. این کد غلط نیست و همین است که تشخیصش را سخت می‌کند؛ فقط جای بیشتری برای اشتباه دارد. راه عملی این است: هر جا در کدتان range(len( دیدید، یکی از پنج ردیف بالا جایش را می‌گیرد.

ابزار، و سالی که این حرف درست است

در سال ۲۰۲۶، ruff ابزار پیش‌فرض است و همین دسته از الگوها را نام‌به‌نام علامت می‌زند، از جمله حلقه روی range(len(...)) و ساختن فهرست با append جایی که یک عبارت کافی است. این ابزار جای زوج black و flake8 را گرفته که تا حدود سال ۲۰۲۳ استاندارد پایتون بودند، و رایگان و متن‌باز است. برای امتحان کردن سریع همین ردیف‌ها، خود مفسر تعاملی کافی است و python3 بدون هیچ آرگومانی بازش می‌کند.

پرسش بعدی این است که چه چیزی همراه خود پایتون می‌آید و یک وابستگی کم می‌کند، که چیزی که همراه پایتون می‌آید و یک وابستگی کم می‌کند است. و وقتی چیزی لازم شد که همراهش نیست، نصب کتابخانه، و جدا نگه داشتن پروژه‌ها از هم مرحله بعدی است.

بالای این