انجمنهای فارسی اوبونتو
کمک و پشتیبانی => برنامهسازی => نویسنده: سالار مقدم در 28 آبان 1392، 07:28 بظ
-
سلام دوستان
از اونجایی که پایتونی کا خیلی کاربر فعال داره بر آن شدم که اینجا پست بدم :|
امروز داشتم آموزش های پایتون رو می خوندم که به کد زیر بر خوردم:
1 def total(initial=5, *numbers, **keywords):
2 count = initial
3 for number in numbers:
4 count += number
5 for key in keywords:
6 count += keywords[key]
7 return count
8 print(total(10, 1, 2, 3, vegetables=50, fruits=100))
هر چی فکر کردم نتونستم دقیق کد رو درک کنم، تاجایی که می تونم حدس بزنم numbers* و keywords** اینجا گروهی از متغیر ها هستند(شبیه به آرایه ها) که به وسیله ی اونا می تونیم چندین مقدار رو توشون ذخیره کنیم.
از جمله مشکلات دیگه هم اینه که فرق * با ** چیه؟ تو قسمت آرگومان ها چجوری مفسر متوجه میشه که کدوم مقدار برای کدوم یکی از این هاست؟ کلا در مورد این مبحث توضیح بدید ممنون میشم
-
http://docs.python.org/2/tutorial/controlflow.html#keyword-arguments
-
فکر کنم اون استار ( * ) واسه فرستادن مجموعه ای از مقادیر تک داده ای مثل یک لیست به عنوان آرگومان به یک فانکشنه :
list = (5, 10 ,15)
و دابل استار (**) دیکشنری میفرسته (که مقادیر شناسه و مقدارشناسه دارند) به یک فانکشن :
dictionary = {'singleDariush':5,'doubleDariush':10,'tripleDariush':15}
-
اول اینکه کد دارای خطای منطقی هست و اون هم اینه که return باید یک تب عقب بیاد، در غیر این صورت فقط یکبار for دوم رو اجرا میکنه. *something برای چند تایی مرتب به کار میره و **something برای دیکشنری. دیکشنری لیستی بدون ترتیب از keyword = value است. در کد شما ۱۰ جای initial میشینه، ۱ و ۲ و ۳ جای numbers، و vegetables=50, fruits=100 جای keywords. اگر کد شما رو به همین شکل اجرا کنیم جواب ۱۱۶ میشه که حاصل ۱۰+۱+۲+۳+۱۰۰ است، چون حلقهٔ دوم تنها یکبار اجرا میشود و تنها مقدار fruit جمع میگردد چون در دیکشنری جلوتر از vegetable است. اما اگر return رو به عقب بکشید مقدار vegetable هم اضافه میشود و حاصل ۱۶۶ است.
-
فکر کنم اون استار ( * ) واسه فرستادن مجموعه ای از مقادیر تک داده ای مثل یک لیست به عنوان آرگومان به یک فانکشنه :
list = (5, 10 ,15)
و دابل استار (**) دیکشنری میفرسته (که مقادیر شناسه و مقدارشناسه دارند) به یک فانکشن :
dictionary = {'singleDariush':5,'doubleDariush':10,'tripleDariush':15}
اول اینکه کد دارای خطای منطقی هست و اون هم اینه که return باید یک تب عقب بیاد، در غیر این صورت فقط یکبار for دوم رو اجرا میکنه. *something برای چند تایی مرتب به کار میره و **something برای دیکشنری. دیکشنری لیستی بدون ترتیب از keyword = value است. در کد شما ۱۰ جای initial میشینه، ۱ و ۲ و ۳ جای numbers، و vegetables=50, fruits=100 جای keywords. اگر کد شما رو به همین شکل اجرا کنیم جواب ۱۱۶ میشه که حاصل ۱۰+۱+۲+۳+۱۰۰ است، چون حلقهٔ دوم تنها یکبار اجرا میشود و تنها مقدار fruit جمع میگردد چون در دیکشنری جلوتر از vegetable است. اما اگر return رو به عقب بکشید مقدار vegetable هم اضافه میشود و حاصل ۱۶۶ است.
مرسی امید و داریوش، جواباتون کامل و عالی بودند :) آره اونجا اشتباه شد، چون از تو ویم کپی کردم یکم به هم ریخته بود درستش کردم اون ریترن جا افتاده بود :)
باکلی آزمون و خطا یه چیزایی فهمیدم.پس تک ستاره لیستی از اعداد میگیره، پس با این حساب به جز اولی که میره واسه initial هر آرگومان که عدده میره به numbers، این اعداد می تونن متغیر هم باشن. بعد توی فور این اعداد به ترتیب جایگزین میشن. حالا دو سوال پیش میاد .سوال اول اینه که ما می تونیم به هر مقدار مثل آرایه دسترسی داشته باشیم؟ مثلا مقدار سوم رو با چیزی شبیه numbers[2]n داشته باشیم؟سوال دوم اینه که درواقع توی دو ستاره متغیر هایی با مقدار اعلان میشن؟ یعنی ما یه متغیر رو با مقدارش می فرستیم؟ من پایگاه داده نخوندم منظور رو از کی ولیو دقیق متوجه نمیشم.
پ.ن : اون n ها رو که می بینین اضافه کردم برای این بود که پرانتز ها به هم نخوره