Packing and Unpacking

سلام خوب هستین؟
میخواستم در مورد Packing and Unpacking در پایتون ازتون بپرسم
که اصلا چین و بیشتر به چه دردی میخورن
اگه بشه ساده توضیح بدین بفهمم خیلی خوب میشه … مثلا پکینگ و ان پکینگ تو dictionary و tuple
ممنون ازتون .

دوتا حالت داره.
حالت اولش (یه ستاره) برای list و tuple استفاده میشه.
به جای اینکه موقع صدا زدن تابع، زمانی که دیتای ما لیست هست، به جای اینکه دونه دونه ورودیها رو بنویسیم، خود لیست رو ارسال میکنیم.

def myfunction (firstname, lastname):
    print("first function:", firstname)
    print("first function:", lastname)

namelist = ["pouya", "abbassi"]    #دیتا
myfunction(namelist[0], namelist[1])    #بد
myfunction(*namelist)                   #خوب

اینجا خط ۶ و ۷ دقیقا یک کار رو انجام میدن. و هردو صحیح هستن ولی خط هفتم خوشگلتر و خواناتره.


یه روش دیگه هم هست که زمان تعریف تابع ستاره میذاریم. و تابع هرچی که به سمتش بیاد رو هندل میکنه.

def newfunction (*name):         #اینجاش با تابع معمولی فرق داره
    name = list(*name)
    print(name[0])
    print(name[1])

newfunction(namelist)

توی این روش، میشه ورودیهایی به تعداد نامحدود به تابع فرستاد و با for each هندل کرد. (یا وقتی یه سری دیتا از یه جایی به دست میاریم)


حالت دوم (دوتا ستاره) هم برای دیکشنری استفاده میشه.
مزیتش اینه که {کلید: دیتا} مشخصه. (توی کار با json چیز خوبیه) برای فرستادن دیکشنری، دوتا ستاره میذاریم.

namedict = {"firstname": "pouya", "lastname": "abbassi"}

myfunction(**namedict)

لازم به ذکر است که تابع همون شکل تابع اوله (به اسم تابع ها دقت کنید) و لازم نیست زمان تعریف تابع، کار خاصی انجام بشه.


پ.ن:
اینو توی ماژولهای پایتون زیاد دیدم.
برای مثال اول، اینکه گفتم خواناتر میشه، به معنی این نیست که حتما همه چیزو بریزیم توی لیست بعد بفرستیم به تابع. این قابلیت، برای این توی زبون گذاشته شده که اگه دیتای ما ذاتا لیست بود، دیگه تبدیل نکنیم.
برای مثال دوم، به نظرم مزیتش برای کار با دیتاهای زیاده که تعدادشون مشخص نیست. و احتمالا بهتره برای دیتاهایی استفاده بشه که هم ارزش هستن (مثلا میخوایم یه کار یکسانی روی یه تعداد دیتای مشابه انجام بدیم و برامون فرقی نمیکنه دیتاها چی باشن)
برای مثال سوم، کار با دیتاهای دسته بندی شده (برعکس دیتای اول) و تعداد نامحدود راحتتر میشه.

2 پسندیده

خیلی عالی بود کاملا فهمیدم
پس این نوع کار کردن رو باید تو پروژه های عملی و پیشرفته تر ببینم … چون هنوز در حال اموزش دیدن بودم برام گنگ مونده بود…
دستتون درد نکنه

(آف تاپیک)
من خودم یه پروژه دیپلوی کردم بعد اینو دیدم :joy:
مشخصه روش یادگیری من و شما کاملا با هم فرق داشته.

من علاقه دارم توی کار کردن یاد بگیرم. واسه همین یه کم از اون زبون رو یاد میگیرم بعد میرم سراغ کد زدن. هرجا گیر کردم میرم سرچ میکنم ببینم چی میگن. هیچوقت کتاب رو تا آخر نمیخونم (یا ویدیوها رو تا آخر نمیبینم) بعد برم سراغ کد. مگر اینکه هدف اون کتاب همین باشه. (مثل کتاب head first)

1 پسندیده

:rofl::rofl::rofl: جالبه…
نه حالا شما فرق دارین منکه مهارت کد زدن هنوز ندارم و اولین تجربمه …
بخدا وقتی یه ویدیو تموم میشه میخوام کد بزنم همون ویدیو رو استرس میگیرم :sweat_smile::sweat_smile:
ولی اره هر کی یه جوری یاد میگیره …

خب اینکه چه جوری کار می کنه رو فکر کنم توضیح دادن، فقط یکی دو تا مثال ساده از کاربردش می زنم.
یه کاربرد معمولش وقتیه که می خوای یه جورایی adapter بنویسی. فرض کن داری از کتابخونه requests پایتون استفاده می کنی تا یه سری GET بزنی.
requests.get("http://your_api.local/test")
حالا می خوای یه چیزی بالای این بنویسی، می خوای عین همین متد با همین پارامتر ها صدا زده بشن و قبلش هم یه چیزی پرینت کنی مثلا!می تونی یه همچین چیزی بنویسی:

def get(message, *args, **kwargs):
        print(message)
        requests.get(*args, **kwargs) 

get("hello world", "http://your_api.local/test")

برای method overloading هم میشه ازش استفاده کرد.
و …

2 پسندیده