بازکردن آرگومان تابع در پایتون
یک ویژگی واقعا جالب اما کمی محرمانه، توانایی “باز کردن” آرگومان های تابع از دنباله ها و فرهنگ لغت ها با * و ** است.بیایید یک تابع ساده را به عنوان مثال تعریف کنیم:print(‘<%s, %s, %s>’ % (x, y, z))همانطور که می بینید، این تابع سه آرگومان (x، y، و z) می گیرد و آنها را با فرمت زیبا چاپ می کند. ممکن است از این تابع برای وکتورهای سه بعدی زیبا چاپ شده در برنامه ما:>>> print_vector(0, 1, 0) <0, 1, 0>حالا بسته به اینکه کدام ساختار داده را برای نمایش سه بعدی انتخاب کنیم بردارها با، چاپ آنها با تابع print_vector ما ممکن است def print_vector(x, y, z): کمی احساس ناخوشایندی کنید به عنوان مثال، اگر بردارهای ما به صورت نمایش داده شوند تاپل ها یا لیست ها باید به صراحت شاخص هر جزء را مشخص کنیم هنگام چاپ آنها:>>> list_vec = [1, 0, 1] >>> tuple_vec = (1, 0, 1) >>> print_vector(tuple_vec[0], tuple_vec[2]) tuple_vec[1], <1, 0, 1>استفاده از فراخوانی تابع معمولی با آرگومانهای مجزا به نظر غیرضروری است. اگر می توانستیم خیلی بهتر نمی شد فقط یک شی برداری را به سه جزء آن “منفجر کنید” و همه چیز را به یکباره به تابع print_vector منتقل کنید؟(البته، می توانید به سادگی print_vector را دوباره تعریف کنید تا طول بکشد یک پارامتر واحد که یک شی برداری را نشان می دهد – اما به خاطر خوشبختانه، راه بهتری برای مدیریت این وضعیت در پایتون وجود دارد بازکردن آرگومان تابع با استفاده از عملگر *:>>> print_vector(*tuple_vec) با داشتن یک مثال ساده، فعلاً آن گزینه را نادیده می گیریم.) >>> print_vector(*list_vec) <1, 0, 1> <1, 0, 1>قرار دادن یک * قبل از یک تکرار در یک فراخوانی تابع، آن را باز می کند و می گذرد عناصر آن به عنوان آرگومان های موقعیتی جداگانه برای تابع فراخوانی شده است. این تکنیک برای هر تکراری، از جمله عبارات مولد، کار می کند. استفاده از عملگر * در یک ژنراتور تمام عناصر را مصرف می کند از ژنراتور و ارسال آنها به تابع: >>> print_vector(*genexpr)علاوه بر عملگر * برای باز کردن توالی هایی مانند تاپل ها، لیست ها و مولدها به آرگومان های موقعیتی، همچنین عملگر ** برای وجود دارد باز کردن آرگومان های کلمه کلیدی از فرهنگ لغت. بردار ما را تصور کنید به عنوان شی dict زیر نمایش داده شد:>>> dict_vec = {‘y’: 0, ‘z’: 1, ‘x’: 1}ما میتوانیم این دستور را به همان روشی به print_vector منتقل کنیم اپراتور ** برای باز کردن بسته بندی:>>> print_vector(**dict_vec) >>> genexpr = (x * x for x in range(3)) <1, 0, 1>از آنجایی که دیکشنری ها مرتب نیستند، این با مقادیر فرهنگ لغت مطابقت دارد مقدار مربوط به کلید x را در فرهنگ لغت دریافت می کند.اگر از عملگر تک ستاره (*) برای باز کردن دیکشنری استفاده کنید، کلیدها به ترتیب تصادفی به تابع ارسال میشوند:>>> print_vector(*dict_vec) و آرگومان های تابع بر اساس کلیدهای فرهنگ لغت: آرگومان x <y, x, z>
قوانین ارسال دیدگاه در سایت