راه
۴ کیو· سختپیشرفتهPYTHON۴ ثانیه · ۲۵۶ مگابایت

کتابخانه‌ی درهم

داور به اینترنت دسترسی ندارد؛ یک سرور کتابخانه‌ی آزمایشی به نشانی http://127.0.0.1:8000/ جای آن جواب می‌دهد (بالای کدت آمده). کافی است همان‌طور که در صورت سؤال آمده از requests.get استفاده کنی.

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

سیستم کتابخانه به این صورت کار می‌کند که هر بخش از کتابخانه دارای یک آدرس اینترنتی (URL) منحصربه‌فرد است. با ارسال یک درخواست (request) به این آدرس، لیست کتاب‌های موجود در آن بخش، در قالب یک فایل JSON دریافت می‌شود.

فایل JSON دریافتی شامل یک لیست از کتاب‌ها است. هر کتاب دارای دو ویژگی اصلی است:

  • name – نام کتاب را نشان می‌دهد
  • category – موضوع کتاب را مشخص می‌کند. مقدار آن می‌تواند یکی از سه مقدار physics، math یا chess باشد.
json
{"name": "Introduction to Calculus", "category": "math"}

🔹 حالت‌های تشخیص

✅ حالت ۱: دسته‌بندی یکتا

اگر بخش موردنظر، حداقل یک کتاب داشته باشد و همه‌ی کتاب‌های موجود در آن بخش دارای موضوع یکسانی باشند (یعنی مقدار category همه‌ی کتاب‌ها یکسان باشد)، تابع باید رشته‌ی مربوط به آن موضوع را برگرداند.

ورودی

[ {"name": "The Road to Reality", "category": "physics"}, {"name": "Something Deeply Hidden", "category": "physics"} ]

خروجی: "physics"

❌ حالت ۲: عدم امکان تشخیص موضوع

اگر بخش مورد نظر خالی باشد (هیچ کتابی در آن وجود نداشته باشد) یا این‌که کتاب‌های موجود در آن بخش دارای موضوعات مختلفی باشند (یعنی حداقل دو کتاب با مقادیر متفاوت category وجود داشته باشند)، تابع باید رشته‌ی I can't recognize it را برگرداند.

ورودی (موضوعات مختلف)

[ {"name": "Graph Theory", "category": "math"}, {"name": "Fundamental of physics", "category": "physics"} ]

خروجی: "I can't recognize it"

ورودی (خالی)

[]

خروجی: "I can't recognize it"

⚠️ حالت ۳: خطای درخواست

اگر ارسال درخواست به آدرس داده شده با خطا مواجه شود (یعنی کد وضعیت HTTP پاسخ، چیزی غیر از 200 باشد)، تابع باید عبارت Bad Request را برگرداند.

ورودی‌های نامعتبر

find_category('quera-ir./math') # خروجی: "Bad Request" find_category('mokar.ir/machine-learning/') # خروجی: "Bad Request"

⚠️ حالت ۴: خطاهای غیرمنتظره

در هنگام کار با API و درخواست‌های HTTP ممکن است خطاهای مختلفی رخ دهند که باید به آن‌ها توجه کنید، مانند:

  • خطای JSON نامعتبر: زمانی که سرور پاسخی بدهد که قابل تبدیل به JSON نباشد (حتی با کد وضعیت 200)

در تمام این حالات، تابع باید عبارت Bad Request را برگرداند.


📖 راهنمایی

برای بررسی کد وضعیت HTTP پاسخ، می‌توانید از ویژگی status_code در شیء پاسخ (response) استفاده کنید:

python
import requests

data = requests.get(link)
print(data.status_code)

برای مدیریت خطاها، می‌توانید از بلوک try-except استفاده کنید. تمام کدی که احتمال بروز خطا دارد را درون بلوک try قرار دهید و در صورت بروز هر گونه خطا، در بلوک except مقدار Bad Request را برگردانید.

python
try:
    # کدهای شما
except:
    return "Bad Request"

✅ پاسخ نهایی

python
import requests

def find_category(url):
    try:
        # ارسال درخواست GET
        response = requests.get(url, timeout=5)

        # بررسی کد وضعیت
        if response.status_code != 200:
            return "Bad Request"

        # تبدیل به JSON
        books = response.json()

        # اگر لیست خالی باشد
        if not books:
            return "I can't recognize it"

        # دریافت دسته‌بندی اولین کتاب
        first_category = books[0]["category"]

        # بررسی یکسان بودن همه‌ی دسته‌بندی‌ها
        for book in books:
            if book["category"] != first_category:
                return "I can't recognize it"

        return first_category

    except:
        # هر گونه خطا (اتصال، JSON نامعتبر، timeout و ...)
        return "Bad Request"

📄 main.py


📖 توضیح کد

  • ارسال درخواست: با requests.get(url, timeout=5) درخواست GET ارسال می‌شود
  • بررسی کد وضعیت: اگر status_code برابر 200 نباشد، "Bad Request" برگردانده می‌شود
  • تبدیل به JSON: با response.json() داده‌ها به لیست پایتون تبدیل می‌شوند
  • بررسی خالی بودن: اگر لیست خالی باشد، "I can't recognize it" برگردانده می‌شود
  • بررسی یکسان بودن: اگر همه‌ی کتاب‌ها دسته‌بندی یکسانی داشته باشند، آن دسته‌بندی برگردانده می‌شود. در غیر این صورت "I can't recognize it"
  • مدیریت خطاها: هر گونه خطا (اتصال، JSON نامعتبر، timeout) با try-except گرفته شده و "Bad Request" برگردانده می‌شود

فایل‌های اضافه فقط جهت اجرای تست نمونه در پروژه‌ی اولیه قرار گرفته‌اند. در صورتی که نمی‌خواهید تست نمونه را روی سیستم خود اجرا کنید، نیازی به تغییر یا اجرای دیگر فایل‌ها نیست. تنها فایل main.py را تکمیل و ارسال نمایید.

🚀 پس از تکمیل تابع، می‌توانید آن را با تست‌های مختلف امتحان کنید و مطمئن شوید که همه‌ی حالات را پوشش می‌دهد.

نمونه‌ها

ورودی نمونه ۱
find_category("http://127.0.0.1:8000/physics/")
خروجی نمونه ۱
'physics'
ورودی نمونه ۲
find_category("http://127.0.0.1:8000/chess/")
find_category("http://127.0.0.1:8000/math/")
خروجی نمونه ۲
'chess'
'math'
ورودی نمونه ۳
find_category("http://127.0.0.1:8000/mixed/")
find_category("http://127.0.0.1:8000/empty/")
خروجی نمونه ۳
"I can't recognize it"
"I can't recognize it"
ورودی نمونه ۴
find_category('quera-ir./math')
find_category('mokar.ir/machine-learning/')
خروجی نمونه ۴
'Bad Request'
'Bad Request'
ورودی نمونه ۵
find_category("http://127.0.0.1:8000/missing/")
find_category("http://127.0.0.1:8000/broken/")
find_category("http://127.0.0.1:8000/nowhere/")
خروجی نمونه ۵
'Bad Request'
'Bad Request'
'Bad Request'

برای نوشتن پاسخ و دریافت امتیاز، ابتدا وارد حساب شوید.

ورود