حتماً دیدهاید که در بخش عضویت بسیاری از وبسایتها برای امنیت بیشتر محدودیتهایی بر روی نام کاربری و گذرواژه وجود دارد.
میخواهیم با پایتون ۳ تابعی بنویسیم که تعدادی نام کاربری و گذرواژه دریافت کند و بر اساس قواعدی معتبر بودن آنها را بررسی کند و در نهایت لیست نامهای کاربری مجاز به عضویت را برگرداند.
قواعد زیر را برای نام کاربری و گذرواژه در نظر گرفتهایم:
quera
و codecup
را میخواهیم برای خودمان نگه داریم.
کسی مجاز به عضویت با این نامهای کاربری نیست.تابعی با نام check_registration_rules
بنویسید که نام کاربری و گذرواژهی تعدادی کاربر را مانند نمونهی
زیر دریافت کند و در خروجی لیستی از نامهای کاربری مجاز به عضویت را برگرداند.
ترتیب اعضای لیست خروجی اهمیت ندارد.
source.py
که تابع check_registration_rules
در آن قرار دارد آپلود کنید.میخواهیم یک فروشگاه آنلاین را پیادهسازی کنیم که در آن کالاهایی برای بفروش بگذاریم و کاربران آنها را خریداری کنند و نظرات خود را راجع به کالاها بگذارند. بخشی از کد فروشگاه توسط فردی زده شدهاست و در حال حاضر در دسترس نیست. شما باید به آن امکاناتی اضافه کنید.
کد پروژه را میتوانید از این لینک دریافت کنید.
داخل پروژه ۲ فایل پایتون با نامهای models.py
و store.py
است. شما باید توابع ناقص فایل store.py
را تکمیل کنید.
داخل کلاس Store
چند تابع وجود دارد که نیاز به تکمیل دارند. همچنین object
آن دارای کالاهای موجود و کاربران ثبت نام شدهاست. کالاها به صورت dictonary
ذخیره شدهاند که هر key
آن یک کالا(Product
) است و هر value
آن تعداد موجودی آن کالاست. کاربران هم به صورت list
ذخیره شدهاند.
وظیفهی شما این است که توابع زیر را برای کلاس Store
پیادهسازی کنید.
remove_product
این تابع وظیفهی حذف کالا از فروشگاه را دارد.در صورت موجود نبود این تعداد کالا، استثایی با پیام Not Enough Products
پرتاب شود و هیچ کالایی از فروشگاه حذف نشود. در صورتی که موجودی یک کالا به صفر برسد باید از دیکشنری کالاها حذف شود.add_user
این تابع یک کاربر را به کاربران اضافه میکند. در صورتی که نام کاربری تکراری باشد کاربری اضافه نمیکند و مقدار None
بر میگرداند؛ در غیر این صورت، رشتهی نام کاربری آن کاربر را برمیگرداند.get_total_asset
این تابع جمع کل داراییهای فروشگاه را برمیگرداند (دارایی فروشگاه برابر مجموع قیمت کالاهای موجود است.)get_total_profit
این تابع مقدار سودی که فروشگاه کردهاست را برمیگرداند. مقدار سود فروشگاه برابر جمع قیمت کالاهای فروختهشده است. ( تعداد هریک از کالاهای لیست bought_products
در کلاس User
یک است.) get_comments_by_user
این تابع لیست متن نظراتی که یک کاربر خاص روی محصولات موجود در فروشگاه گذاشتهاست را بر میگرداند (ترتیب آنها مهم نیست)get_inflation_affected_product_names
این تابع لیستی از نام کالاهایی که تورم روی آنها تاثیر گذاشتهاست را برمیگرداند. (تورم روی کالاهایی اثر گذاشتهاست که کالایی هم اسم آنها ولی با قیمت کمتر داخل فروشگاه وجود داشتهباشد). توجه کنید که اگر چند قیمت از یک کالا موجود باشد، نام آن فقط یک بار باید در لیست بیاید. ترتیب اعضای لیست اهمیتی ندارد.clean_old_comments
این تابع ورودی یک تاریخ از نوع datetime
میگیرد و همهی نظراتی که قبل از آن تاریخ روی پستها گذاشته شدهاند را حذف میکند.get_comments_by_bought_users
این تابع لیستی از متن نظراتی را بر میگرداند که صاحب آن، کالا را خریداری کردهاست.store.py
هستید.store.py
که کلاس Store
در آن قرار دارد آپلود کنید.می خواهیم برنامه ای بنویسیم که با کمک آن بتوانیم فایل های خود را مدیریت کنیم.
با توجه به نیازمندیهایی که در بالا گفته شد، یک کلاس با نام FileManager
تعریف کنید که همه متدهای جدول زیر را طبق رفتار توضیح داده شده پیادهسازی کند.
رفتار | خروجی | متد |
---|---|---|
یک پوشه جدید با نام name در آدرس address می سازد. |
- |
create_dir(name, address) |
یک فایل جدید با نام name در آدرس address ایجاد می کند . |
- |
create_file(name, address) |
یک فایل با نام name را از آدرس address حذف می کند . |
- |
delete(name, address) |
آدرس تمام فایل های با نام name را از آدرس address به بعد برمیگرداند |
List |
find(name, address) |
فایل با نام name را بازیابی می کند. |
- |
restore(name) |
create_dir
در صورت عدم وجود پوشه باید پوشه ای جدید ساخته شود در غیر این صورت نباید هیچ اتفاقی بیفتد!create_file
در صورت عدم وجود فایل باید فایلی جدید ساخته شود در غیر این صورت نباید هیچ اتفاق دیگری بیفتد!delete
در صورت عدم وجود فایل نباید هیچ اتفاقی بیفتدfind
باید یک لیست از تمام آدرس ها برگردانده شود ودر صورت عدم وجود فایلی با این نام یک لیست خالی برگردانده شود ترتیب این ادرس ها اهمیتی نداردfind
باید از آدرس موجود در آرگومانها به بعد باشد (آدرس شامل خود آرگومان نیز میباشد)
.دقت شود که ممکن است فایل در سطوح پایین تر از سطح اول نیز موجود باشد.restore
restore
فایلها به صورت متوالی و با عکس ترتیب حذف، بازیابی شوند.یک فایل Zip شامل یک فایل به نام source.py
که کلاس FileManager
در آن قرار دارد آپلود کنید.
میخواهیم کلاسی در زبان پایتون طراحی کنیم که عملکرد یک پروکسی را برای اشیائی که نمایندهٔ آنان است داشته باشد. دقت کنید که این کلاس باید قادر باشد تمامی توابعی را که روی شی اصلی فراخوانی میشود، بدون تغییر کارکرد روی آنان اجرا کند. توجه کنید که این شئ میتواند از هر نوع کلاسی باشد.
فایل اولیه پروژه را از اینجا دریافت کنید.
برای مثال اگر کد زیر را برای کلاس Radio
داشته باشیم:
سپس اگر یک پروکسی از شئ از کلاس Radio
بسازیم
تمامی توابع بالا باید بر روی radio_proxy
قابل فراخوانی باشد:
اگر تابع فراخوانیشده، جزو توابع تعریفشده برای شئ هدف نباشد، باید استثنایی با پیام No Such Method
پرتاب شود.
همچنین کلاس Proxy
که باید توابع آن را پیادهسازی کنید، باید قادر باشد اطلاعاتی را نیز ذخیرهسازی کند. توابع و ویژگیهایی که این کلاس باید دارا باشد به شرح زیر است: (این فایل اولیه را می توانید از اینجا دریافت کنید.)
که در آن تابع last_invoked_method
نام آخرین متد معتبر فراخوانی شده بر روی شئ هدف را بازمیگرداند و تایپ خروجی آن باید رشته باشد. در صورتی که تا لحظهٔ فراخوانی این تابع، متدی روی شئ فراخوانی نشده بود، استثنایی با پیام No Method Is Invoked
پرتاب میشود.
تابع count_of_calls
میبایست به ازای نام متد ورودی، تعداد دفعاتی که این متد بر روی شئ فراخوانی شده را بازگرداند. اگر متد ورودی معتبر نباشد، مقدار 0
را برمیگرداند.
تابع was_called
به ازای نام متد معتبر ورودیَ، یک Boolean
را به عنوان خروجی برمیگرداند که اگر آن متد برروی شئ فراخوانی شده باشد مقدار True
و در غیر این صورت مقدار False
را برمیگرداند. اگر متد ورودی معتبر نباشد مقدار False
را برمیگرداند.
در نهایت توجه کنید که در صورتی که ویژگیها و متدهایی به شئ هدف، پس از ساختن پروکسی اضافه شوند، شئ پروکسی باید قادر به مدیریت توابع و ویژگیهای جدید نیز باشد.
پاسخ ارسالی شما، باید یک فایل زیپ با ساختار زیر باشد:
میخواهیم یک فایل HTML را پردازش کرده و همچنین اطلاعاتی را از آن استخراج کنیم. برای این کار، باید کلاسی به نام HTMLParser
طراحی کنید که ویژگیها و توابع زیر را دارا باشد:
فایل اولیه پروژه را از اینجا دریافت کنید.
پیش از شرح توابع و ویژگیها، مشخصههای جستجو finding_args
و مشخصهٔ خروجی output_arg
را شرح میدهیم:
۱- finding_args
: یک دیکشنری است که میتواند یک یا چند کلید از میان name
، id
، string
و class
بپذیرد. برای مثال برای تگی مانند مثال زیر:
مشخصهٔ name
برابر p
، مشخصهٔ id
برابر some-ID
، مشخصهٔ string
برابر you can access Quera here!
و مشخصهٔ class
برابر important
میباشد. تضمین میشود مشخصههای جستجوی ورودی تنها شامل مشخصههای فوق میباشد.
۲- output_arg
: یک str
است که مشخصهٔ مطلوب خروجی تابع را مشخص میکند و تضمین میشود مقادیری همانند بالا دارد. در صورتی که مقدار متناظر مشخصهٔ خروجی مقداردهی نشده بود، خروجی یک رشتهٔ خالی خواهد بود.
برای مثال فراخوانی یک تابع با مشخصههای فوق چنین است:
ویژگیها و توابع این کلاس به شرح زیر هستند:
۱- ویژگی html_doc
: کل کد HTML
به فرمت یک رشته str
است.
۲- متد find_first
: مقدار مشخصهٔ خروجی (output_arg
) اولین برچسب که با ویژگیهای finding_args
مطابقت داشته باشد را خروجی میدهد.
۳- متد find_all
: یک لیست به طول حداکثر n
از مقدار مشخصههای خروجی برچسبهای مطابق با finding_args
را برمیگرداند (n
تای اول). اگر تعداد برچسبهای یافتهشده کمتر از n
بود لیستی به اندازهٔ همان تعداد برمیگرداند.
مثال:
۴- متد find_parent
: مقدار مشخصهٔ خروجی اولین والد برچسب مطابق با مشخصههای جستجو را خروجی میدهد. (در صورتی که بیش از یک برچسب یافت شد، مقدار مطلوب را برای اولین برچسب یافتهشده خروجی میدهد.) تضمین میشود برچسبهای یافتهشده حداقل یک والد دارند.
مثال:
۵- متد find_grandparent
: مقدار مشخصهٔ خروجی n
اُمین جد (اولین جد همان والد است.) اولین برچسب مطابق با مشخصههای جستجو را خروجی میدهد. در صورتی که n
از تعداد جدهای برچسب یافته شده بیشتر باشد، استثنایی با پیام No Such Parent
پرتاب شود. تضمین میشود برچسبهای یافتهشده حداقل یک والد دارند.
۶- متد remove_comment
: اولین برچسب منطبق با مشخصهٔ ورودی را در صورتی که فقط محتوی کامنت باشد به طور کلی از html_doc
حذف میکند. کامنتهای HTML
به صورت زیر هستند:
در صورتی که محتویات اولین برچسب یافتهشده عاری از کامنت بود، استثایی با پیام No Comments Found
پرتاب شود.
۷- متد remove_all_comments
: تمامی برچسبهای محتوی کامنت را از html_doc
حذف میکند.
۸- متد remove_tag
: اولین برچسب مطابق با مشخصات ورودی را به طور کلی از html_doc
حذف میکند.
در تمامی متدهایی که میبایست برچسبی مطابق با مشخصات ورودی یافت شود، اگر برچسبی یافت نشد باید استثنایی با پیام No Such Tag
پرتاب شود.
در پاسخ ارسالی خود میتوانید از هر کتابخانهای که لازم میدانید استفاده کنید. اما در فایل ارسالی خود، علاوه بر فایل HTMLParser.py
که حاوی راهحل شما است، باید فایلی با نام python_requirements.txt
نیز موجود باشد که در آن نام کتابخانههای مورد نیاز و شمارهٔ نسخهٔ آنها به فرمت زیر در آن موجود باشد:
ساختار فایل .zip
ارسالی شما باید به صورت زیر باشد: