ارگومان های اختیاری چیست ؟

0

ارگومان های اختیاری چیست ؟

در بخش 14-5 ،چگونگی استفاده از آرگومانهاي اختیاري را توضیح دادیم. در روش مزبـور مـا مجبور بودیم مقادیري را به پارامترها به طور پیشفرض نسبت دهـیم تـا در توابـع اسـتفاده شـوند، امـا نمیتوانستیم بیش از آرگومانهاي مقداردهی شده آرگومانی را به تابع بفرستیم. بهتر است آن نسـخه از تابع sequence را که ما با یک چندتایی ابعاد نوشتیم، طوري نوشته شود کـه نیـازي بـه اسـتفاده از چندتایی نباشد. این کار بسیار صریحتر هـدف تـابع sequence را مشـخص مـیکنـد. پـایتون نحـوة نگارشی را تدارك دیده است که در آن آرگومانهاي تابع واقعاً اختیاري هستند. در یک مثال ساده این نحوة نگارش را ملاحظه کنید:

>> def func(a, *b): print a ; print b
>>> func(2, 3)
2
(3,)

تابع func دو آرگومان میگیرد و هر کدام را در یک خط چاپ میکند. علامت سمیکلنی (;) که دو دستور print را از هم مجزا کرده است، نشان دهندة پایان دستور اول است. بـراي نشـان دادن چند دستور در یک خط، میتوانید از این علامت استفاده کنید. مفسر پایتون در صورت برخورد بـا ایـن علامت دستور قبل از آن را اجرا میکند و سپس بقیۀ جمله را ادامه میدهد. با نگاهی به خروجی برنامه نحوة عمل * را هم متوجه خواهید شد. دستور b print آرگومان 3 را به عنوان یک چندتایی چاپ کرده است. بار دیگر ایـن تـابع را بـا تعـداد آرگومانهـاي متنـوعتـري، فراخوانی میکنیم:

>>> func(2,3,{‘key’:’value’},’string’,(‘tuple’,),[‘list’])
2
(3, {‘key’: ‘value’}, ‘string’, (‘tuple’,), [‘list’])

همان طور که میبینید، همۀ آرگومانها به جـز آرگومـان اول بـه عنـوان یـک چنـدتایی چـاپ شدهاند. این چندتایی شامل یک عدد صحیح، یک دیکشنري، یک رشته، یـک چنـدتایی و یـک لیسـت است. با قرار دادن دو علامت ستاره (**) در ابتداي پارامترهاي یک تابع، میتوانیم عمـل جالـبتـري هم انجام دهیم. تابع زیر را ملاحظه کنید:

>> def func2(a, *b, **c): print a ; print b ; print c
>>> func2(2,3,4,5,key=’value’)
2
(3, 4, 5)
{‘key’:’value’}

اگر در این گونه توابع پارامتري را با انتسـاب یـک مقـدار بـهعنـوان آرگومـان بـه تـابع بدهیـد، میتوانید در تابع از آن به عنوان یک دیکشنري استفاده کنیـد. در ایـن حالـت پـارامتر فرسـتاده شـده، به عنوان یک کلید و مقدار انتسابی به عنوان یک مقدار در دیکشنري استفاده خواهد شد. باید توجه داشته باشید که در صورتی که بخواهیـد از هـر سـه نـوع پـارامتر (c, **b, *a ( استفاده کنید، باید ترتیب آنها را حفظ کنید. پـارامتري کـه بـا یـک سـتاره اسـتفاده مـیشـود پـس از آرگومانهاي عادي و آرگومانی که با دو ستاره استفاده میشود همیشه در آخر قرار میگیرد. همچنین باید توجه داشته باشید که هر کدام از این دو نوع پارامتر را تنها یکبار مـیتوانیـد در هر تابع بهکار ببرید. با این قابلیت میتوانیم تابع sequence را هم بازنویسی کنیم:

def sequence(*n):
zeroList = lambda x:[0 for I in range(x)]
zl = zeroList(n[0])
if len(n) == 1:
return zl
for i in range(len(zl)):
zl[i] = sequence(n[1:])
return zl

این تابع کار نمیکند. به محلی که [i[zl در آن مقدار دهی مـیشـود، نگـاه کنیـد. مـا یـک فراخوانی بازگشتی داریم و یک چندتایی را به عنوان آرگومان به آن میفرسـتیم، امـا ایـن چنـدتایی در تابع sequence خود درون یک چندتایی دیگر قرار میگیرد، چرا که ما از فرم n *استفاده کردهایم. براي تصحیح کد ما قبل از هر چیز بررسی میکنیم کـه اولـین عضـو چنـدتایی سـاخته شـده بهوسیلۀ فرم n *از چه نوعی است و در صورتی که این عضو یک چندتایی بود آن را بیرون میکشـیم و آن را جایگزین چندتایی موجود میکنیم:

def sequence(*n):
from types import TupleType
if type(n[0]) == TupleType:
n = n[0]
zeroList = lambda x:[0 for i in range(x)]
zl = zeroList(n[0])
if len(n) == 1:
return zl
for i in range(len(zl)):
zl[i] = sequence(n[1:])
return zl

در بخش 5-8 براي اینکه نوع دادهها را با هم مقایسه کنـیم، از تـابع type اسـتفاده کـردیم و یک نوع دادهاي مشخص را با نوع دادهاي مورد نظرمان مقایسه کردیم. در اینجـا مـا از مـاژول types استفاده نمودیم. این ماژول همۀ انواع دادهاي پیشساخته را در بر میگیرد. در صورتی که بخواهید یـک نوع دادهاي را بهکار ببرید آن را از ماژول types وارد محیط کاري کنید. نام هر نوع دادهاي با حـروف بزرگ شروع میشود و با حروف کوچک ادامه مییابد و سپس کلمۀ Type در پایان آن قرار مـیگیـرد، مانند ListType یا TupleType . تابع sequence را براي ساختن یک دنبالۀ چندبعدي امتحان کنید. براي مثال ما این تـابع را با سه آرگومان فراخوانی میکنیم:

>> sequence(2,3,2)
[[[0, 0], [0, 0], [0, 0]], [[0, 0], [0, 0], [0, 0]]]

حال، هر یک از عناصر را به راحتی میتوان تغییر داد:

>> d = sequence(2,3,2)
>>> d[2][1][0] = 123
>>> print d
[[[0, 0], [0, 0], [0, 0]], [[0, 0], [123, 0], [0, 0]]]

در اینجا بهتر است براي ورود اطلاعات هم تابعی بنویسیم تا مجبور نباشیم تـکتـک عناصـر را بهصورت فوق مقداردهی کنیم. باز هم میتوانیم یک تابع بازگشتی بنویسیم. این تابع اعضاي یک دنبالـه را مـیپیمایـد. در صـورتی کـه عنصـر مـورد بررسـی، یـک عنصـر تجزیه ناپزیر باشد (دنباله نباشد) بـا تـابع input یـا input_raw آن را مقـداردهی مـیکنـیم و در صورتی که یک دنباله باشد تابع خودمان را براي آن فرا میخوانیم و در آخر دنبالۀ مقداردهی شده را بر میگردانیم:

def inputItems(Sequence):
from types import ListType
for i in range(len(Sequence)):
if type(Sequence[i]) != ListType:
Sequence[i] = input()
else:
inputItems(Sequence[i])
return Sequence

با داشتن توابع sequence و inputItems به راحتی میتوانیم نمرات را ذخیره کنیم، امـا باید توجه داشته باشید که در ورود اطلاعات اشتباه نکنید چراکه بهخاطر سپردن اینکه نمرة دانشجویی در محل مورد نظر وارد شده یا نه، در هنگام ورود اطلاعات در حجم بالا بسیار دشوار است. در این مثال هدف ما آموزش مفاهیم دنبالههـاي چنـدبعـدي و اسـتفاده از نحـوههـاي  نگـارش مختلف براي آسانسازي کد، مثل دستور lambda ،آرگومانهاي اختیـاري و اشـتمال لیسـتهـا بـود. براي نگهداري اطلاعات راههاي متنوعتر و کاربرپسندتري وجود دارد.

برای اموزش های ویدیویی زبان پایتون به بستر ویدیو های اموزشی بروید

بستر اموزش های ویدویی 

گذاشتن نظر
پاسخ خود را بنویسید .
  • فعال
  • بازدیدها1660 times
  • پاسخ ها1 پاسخ
ورود به متاورس | متاورس ایرانی
ورود به متاورس ایران یا همان متاورس ملی

علامت ذره بین Tutorials سمت راست به رنگ قرمز به شما کمک خواهد کرد .

جدید ترین سوالات پرسیده شده

منقضی شدن سم بتانال 1 پاسخ | 0 آرا
ایا ایدز گزفتم؟ 0 پاسخ ها | 0 آرا
انتخاب ورزش رزمی 0 پاسخ ها | 1 رای
وزارت تعاون کار و رفاه اجتماعی نماد اعتماد الکترونیک اسناد و املاک کشور مرکز آموزش ویدیویی انجمن حم فروشگاه ملی تولید کنندگان مدیریت بر مدیران حم سامانه حیوانات رسانه ملی اخبار متا دانشگاه متاورس استخدام | دانش فروشگاه حم تبلیغات ملی بازار NFT متاورس رنگ نقشه ملی سه بعدی متا املاک و مستغلات