0% found this document useful (0 votes)
19 views18 pages

Pamphlet (Session04)

Uploaded by

paya ghaffarian
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
19 views18 pages

Pamphlet (Session04)

Uploaded by

paya ghaffarian
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 18

‫به نام خدایی که بیدریغ ستّار العیوب است‪...

‬‬

‫مؤلف‪ :‬سجّاد رحمانی‬

‫هرگونه کپی برداری غیرقانونی و حرام است و هیچ گونه رضایت مولف را در بر ندارد‬

‫فصل هفتم‬
‫بگیم چیا رو تا االن گفتیم!‬

‫تذکر‪ :‬در زبان انگلیسی به عملگر میگن ‪.operator‬‬

‫تا االن در مورد عملگرها‪ ،‬موارد زیر رو بررسی کردیم‪:‬‬

‫چیا هستن اینا؟‬ ‫نام عملگر‬


‫عملگرهای حسابی‬
‫(‪)%()//()**()/()*()-()+‬‬ ‫( ‪Arithmetic‬‬
‫‪)Operators‬‬
‫عملگرهای مقایسهای‬
‫(==)(=!)(>)(<)(=>)(=<)‬
‫‪Comparison Operators‬‬
‫عملگرهای تخصیص‬
‫(=)(=‪)%=()//=()**=()/=()*=()-=()+‬‬
‫‪Assignment Operators‬‬
‫که قراره این لیست رو در انتهای این فصل کاملتر کنیم‪.‬‬

‫عملگرهای عضویت‬

‫دو تا چیز هستن که باید یاد بگیریم‪:‬‬


‫‪ in )1‬که میگه فالن چیز درون بهمان چیز هست‪.‬‬
‫‪ not in )2‬که میگه فالن چیز درون بهمان چیز نیست‪.‬‬
‫مثال‪ :‬قطعه کد زیر رو در نظر بگیرید‪:‬‬
‫]‪a=[1,3,4,5,6‬‬
‫‪number=3‬‬
‫‪if number in a:‬‬
‫)"!‪print("Hast‬‬
‫‪else:‬‬
‫)"!‪print("Nist‬‬
‫یک لیست به اسم ‪ a‬تعریف کردیم‪ .‬یک متغیر هم با اسم ‪ numbers‬و مقدار ‪ 3‬تعریف کردیم‪.‬‬
‫حاال میگیم اگر اون ‪( number‬که ‪ 3‬هست) توی لیست ‪ a‬بود‪ ،‬چاپ کن هست‪.‬‬
‫در غیراینصورت چاپ کن‪ :‬نیست!‬
‫خروجی‪:‬‬
‫!‪Hast‬‬
‫مثال‪ :‬فرض کنید لیست زیر اسامی قبول شدگان کالس آمار است‪.‬‬
‫]"‪a=["Ali Reza","Mohammad Amin‬‬
‫توجه کنید که این استاد فقط ‪ 2‬نفر از کالس ‪ 500‬نفری رو قبول کرده! [درود بر شرف این استاد☺]‬
‫حاال افراد میخوان اسمشون رو وارد کنن و ببینن قبول شدن یا نه‪.‬‬
‫ما میایم اینو این شکلی کدنویسی میکنیم‪:‬‬
‫]"‪a=["Ali Reza","Mohammad Amin‬‬
‫)" ‪b=input("Enter your name:‬‬
‫‪if b not in a:‬‬
‫)"☺ ‪print("Failed‬‬
‫‪else:‬‬
‫)"‪print("Passed‬‬
‫که لیست ‪ a‬که قبلتر توضیح رو دادیم‪.‬‬
‫در خط دوم میایم یک ورودی از کاربر میگیریم و اسم اون ورودی که میگیریم رو میذاریم ‪.b‬‬
‫بعد میگیم اگر اسم بندهخدای دانشجو توی لیست نبود‪ ،‬بگه که افتادی و یک لبخند (☺) هم بزنه‪.‬‬
‫در غیراینصورت‪ ،‬بگه پاس شدی!‬
‫مثالً اگر من وارد کنم ‪ Sajjad‬میگه‪:‬‬
‫☺ ‪Failed‬‬

‫عملگرهای هویت‬

‫این عملگرهای در احراز هویت خیلی میتونن بهمووون کمک کنن ☺!‬
‫دوتا هم هستن ‪( is‬هست) و ‪( is not‬نیست)‪.‬‬
‫برای این فیلم کالً ‪ shell‬برو باز کنید و توی اون چیزایی که میگیم رو بنویسید [یا توی ‪ console‬خود‬
‫‪]PyCharm‬‬
‫مثال‪:‬‬
‫عبارت زیر رو بنویسید و ‪ Enter‬بزنید‪:‬‬
‫‪a=5‬‬
‫خب اینو که بزنید‪ ،‬مقدار ‪ a‬رو برابر ‪ 5‬در نظر میگیره (توجه کنید که ‪ a‬یک ‪ integer‬یعنی عدد صحیح‬
‫است)‪.‬‬
‫حاال عبارت زیر رو بنویسید و ‪ Enter‬بزنید‪:‬‬
‫‪type(a) is float‬‬
‫در اینجا داریم میگیم نوع متغیر ‪ a‬برابر است با ‪( float‬اعشاری)‬
‫که چون این شکلی نیست‪ ،‬بهمووون ‪ False‬رو برمیگردونه‪.‬‬
‫حاال عبارت زیر رو تایپ کنید و ‪ Enter‬بزنید‪:‬‬
‫‪type(a) is not list‬‬
‫یعنی داریم میگیم‪ :‬نوع ‪ a‬برابر نیست با لیست‪.‬‬
‫که چون حرف درستی داریم میزنیم بهمووون ‪ True‬رو برمیگردونه‪.‬‬
‫مثال‪:‬‬
‫))" ‪a=eval(input("Enter something:‬‬
‫‪if type(a) is int:‬‬
‫)"‪print("integer‬‬
‫‪elif type(a) is float:‬‬
‫)"‪print("float‬‬
‫‪elif type(a) is str:‬‬
‫)"‪print("string‬‬
‫‪elif type(a) is bool:‬‬
‫)"‪print("Boolean‬‬
‫‪elif type(a) is complex:‬‬
‫)"‪print("complex‬‬
‫‪elif type(a) is list:‬‬
‫)"‪print("list‬‬
‫‪elif type(a) is tuple:‬‬
‫)"‪print("tuple‬‬
‫‪elif type(a) is dict:‬‬
‫)"‪print("dictionary‬‬
‫‪elif type(a) is set:‬‬
‫)"‪print("set‬‬
‫‪else:‬‬
‫)"‪print("Others‬‬
‫در این مثال از کاربر ورودی میگیره و نوعش رو چک میکنه‪.‬‬
‫مثالً اگر ‪( int‬عدد صحیح) باشه چاپ میکنه ‪integer‬‬
‫اگر ‪ str‬باشه (مخفف ‪ string‬که یعنی رشته یا متن) چاپ میکنه ‪string‬‬
‫و الی آخر‪.‬‬
‫تذکر‪ :‬موارد فوق (همون ‪ )set ،dict ،tuple ،list ،complex ،bool ،str ،float ،int‬دو کارکرد‬
‫دارن‪:‬‬
‫‪ )1‬چک کردن نوع یک چیز [مثل این مثال باال که دیدید]‬
‫‪ )2‬تبدیل نوع یک چیز‬
‫برای فهم دومی به مثال زیر دقت کنید‪:‬‬
‫"‪a="5‬‬
‫)‪b=int(a‬‬
‫توی خط اول اومدیم یک ‪ string‬با مقدار "‪ "5‬تعریف کردیم‪.‬‬
‫در خط دوم گفتیم بیا تبدیل به ‪ integer‬کن اون ‪ a‬رو! همین! پس این میشه کارکرد دوم که تبدیل‬
‫هست‪.‬‬
‫تذکر جدی‪ :‬توجه داشته باشید که فیلم هندی نیست دیگه! یعنی مثالً توقع نداشته باشید هر چیزی رو‬
‫بشه تبدیل کرد و مثالً یهو هوایی نشید چیزی شبیه زیر رو بنویسید‪:‬‬
‫"‪a="Sajjad‬‬
‫)‪b=int(a‬‬
‫قطعاً این بهتون خطا میده! چون آخه ‪ Sajjad‬رو چجوری رو ‪ integer‬تبدیل کنه؟ قبول دارید نشدنی‬
‫است؟ [بله! قبول داریم!]‬

‫عملگر ‪not‬‬

‫از معنیش مشخصه که نقیض یک چیز رو در نظر میگیره‪.‬‬


‫مثال‪:‬‬
‫]‪a=[1,2,3,4,5,6,7,8,9,10‬‬
‫][=‪odd‬‬
‫‪for i in a:‬‬
‫‪if not(i%2==0):‬‬
‫)‪odd.append(i‬‬
‫)‪print(odd‬‬
‫در خط اول که یک لیست تعریف کردیم به اسم ‪.a‬‬
‫در خط دوم یک لیست تهی درست کردیم [البته قرار نیست تا آخر خالی بمونه]‪.‬‬
‫در خطوط بعدی میگیم‪ :‬برای هر مولفه مثل ‪ i‬در لیست ‪:a‬‬
‫اگر باقیمانده تقسیم مولفه بر ‪ 2‬مساوی صفر نبود‪ ،‬به لیست ‪ odd‬اضافش کن‪.‬‬
‫تهش هم میگیم بیاد اون لیست ‪ odd‬رو چاپ کنه‪.‬‬
‫والسّالم‪.‬‬
‫)‪if not(i%2==0‬‬ ‫‪ if‬یعنی اگر باقیمانده تقسیم ‪ i‬بر ‪ 2‬مساوی صفر بود‪ .‬اما‬ ‫‪i%2==0‬‬ ‫توجه کنید که‪:‬‬
‫یعنی اگر باقیمانده تقسیم ‪ i‬بر ‪ 2‬مساوی صفر نبود‪ .‬پس به این نقیض کردن شرط توسط ‪ not‬دقت‬
‫کنید‪.‬‬
‫لیستمون تکمیل شد!‬

‫اون لیستی که توی فیلم ‪ 1‬داشتیم رو به صورت زیر کامل میکنیم‪:‬‬


‫چیا هستن اینا؟‬ ‫نام عملگر‬
‫عملگرهای حسابی‬
‫(‪)%()//()**()/()*()-()+‬‬
‫(‪)Arithmetic Operators‬‬
‫عملگرهای مقایسهای‬
‫(==)(=!)(>)(<)(=>)(=<)‬
‫‪Comparison Operators‬‬
‫عملگرهای تخصیص‬
‫(=)(=‪)%=()//=()**=()/=()*=()-=()+‬‬
‫‪Assignment Operators‬‬
‫عملگرهای عضویت‬
‫(‪)not in()in‬‬
‫‪Membership Operators‬‬
‫عملگرهای هویت‬
‫(‪)is not()is‬‬
‫‪Identity Operators‬‬
‫عملگرهای منطقی‬
‫(‪)not()or()and‬‬
‫‪Logical Operators‬‬

‫فصل هشتم‬
‫تابع با صفر پارامتر ورودی (یعنی پارامتر ورودی نمیگیره!)‬

‫پایتون واسه خودش یک سری توابع از پیش تعریف شده داره (مثال زیر رو در نظر بگیرید)‪.‬‬

‫مثال‪ :‬برای محاسبه مجموع مولفههای لیست ‪ a‬میتونیم از تابع ‪ sum‬استفاده کنیم‪:‬‬

‫]‪a=[1,5,7‬‬
‫)‪print( sum(a‬‬ ‫)‬
‫خروجی‪13 :‬‬

‫اما خودمون هم میتونیم تابع تعریف کنیم‪.‬‬

‫برای تعریف تابع از کلمه کلیدی ‪( def‬مخفف ‪ define‬به معنی تعریف کردن) برای تعریف تابع‬
‫استفاده میکنیم‪.‬‬

‫مثال [تابع بدون ورودی!]‬

‫‪def Koolac():‬‬
‫"""(‪print‬‬
‫‪By:‬‬ ‫‪Sajjad Rahmani‬‬
‫‪Website: www.Koolac.Org‬‬
‫)"""‬
‫)(‪Koolac‬‬
‫در اینجا یک تابع تعریف کردیم که وظیفش چاپ یک سری چیز میز است! اسم تابع رو هم گذاشتیم‬
‫‪Koolac‬‬
‫خب! یک قسمت از کد باال پسزمینه آبی داره و یه قسمت دیگه پسزمینه بنفش‪.‬‬
‫اون قسمتی که پسزمینه آبی داره‪ ،‬مربوط به تعریف تابع است و اون قسمتی که پسزمینه بنفش داره‬
‫مربوط به فراخوانی تابع است‪.‬‬
‫تذکر‪ :‬نکات مربوط به ‪ indentation‬و ‪ ...‬دقیقاً مشابه مواردی است که سابقاً مطرح کردیم‪.‬‬

‫تابع با یک پارامتر ورودی‬

‫مثال [تابع با یک پارامتر ورودی]‬


‫فرض کنید میخوایم یک تابع بنویسیم که یک عدد رو به عنوان ورودی بگیره و دوبرابر اون رو چاپ‬
‫کنه! (و مثالً فرض کنید میخوایم اسم تابع رو هم بذاریم ‪ double‬به معنی دوووبل کردن یا همون‬
‫دوبرابر کردن خودمون!)‬

‫‪def double(number):‬‬
‫‪print( number*2‬‬ ‫)‬

‫)‪double(5‬‬
‫یک قسمت از کد باال پسزمینه آبی داره و یه قسمت دیگه پسزمینه بنفش‪.‬‬
‫اون قسمتی که پسزمینه آبی داره‪ ،‬مربوط به تعریف تابع است و اون قسمتی که پسزمینه بنفش داره‬
‫مربوط به فراخوانی تابع است‪.‬‬
‫در قسمت تعریف تابع‪ ،‬اومدیم اسم تابع رو ‪ double‬گذاشتیم و این تابع یک ورودی میگیره (که اسم‬
‫ورودی این تابع رو داخل پرانتز این تابع تعریف میکنیم)‬

‫توجه‪ :‬اسم خود تابع و اسم ورودیهایی که براش در نظر میگیریم اختیاری است‪.‬‬

‫توضیح کارکرد تابع‪:‬‬

‫تابع ‪ double‬که در باال تعریف کردیم‪ ،‬یک ورودی مثالً به اسم ‪ double‬دریافت میکنه و میاد دوبرابر‬
‫اون ورودی رو چاپ میکنه!‬

‫در اون قسمتی که پسزمینه بنفش هم داره‪ ،‬اومدیم از تابع ‪ double‬یک مثال رو فراخوانی میکنیم‪ .‬به‬
‫عنوان ورودی این تابع عدد ‪ 5‬رو دادیم‪ .‬پس توقع داریم در خروجی‪ ،‬دوبرابر این عدد یعنی ‪ 10‬رو‬
‫چاپ کنه‪.‬‬

‫دستور ‪return‬‬

‫دو کد زیر رو در نظر بگیرید‪:‬‬

‫کد ‪:1‬‬

‫‪def double(number):‬‬
‫‪print( number*2‬‬ ‫)‬
‫کد ‪:2‬‬

‫‪def double(number):‬‬
‫‪return number*2‬‬
‫در کد اول‪ ،‬تابع میاد دوبرابر ورودی رو چاپ میکنه! اما در کد دوم‪ ،‬دوبرابر ورودی رو برگردووونده‬
‫میشه! حاال ما اگر دوست داشتیم اون مقدار برگردوونده شده رو چاپ کنیم‪ ،‬در کد دوم باید از دستور‬
‫‪ print‬استفاده کنیم‪.‬‬

‫تابع با دو پارامتر ورودی‬

‫میخوایم تابعی بنویسیم که دو تا عدد مثل ‪ a‬و ‪ b‬رو میگیره و بعد عبارت زیر رو برمیگردونه!‬

‫‪ab‬‬

‫کدنویسی مثال‪ :‬قطعه کد زیر رو درنظر بگیرید‪:‬‬

‫‪def power(a,b):‬‬
‫‪return a**b‬‬

‫(‪print‬‬ ‫)‪power(2,3‬‬ ‫)‬


‫یک قسمت از کد باال پسزمینه آبی داره و یه قسمت دیگه پسزمینه بنفش‪.‬‬
‫اون قسمتی که پسزمینه آبی داره‪ ،‬مربوط به تعریف تابع است و اون قسمتی که پسزمینه بنفش داره‬
‫مربوط به فراخوانی تابع است‪.‬‬
‫خب اومدیم یک تابع تعریف کردیم با اسم ‪ ،power‬که میاد ‪ a b‬رو برمیگردونه!‬

‫در اون قسمتی که پسزمینه بنفش داره هم داریم ‪ 2 3‬رو با تابع ‪ power‬که ساختیم حساب میکنیم و‬
‫خروجیش رو با دستور ‪ print‬چاپ میکنیم‪.‬‬

‫تابع با سه پارامتر ورودی‬

‫در این قسمت میخوایم فرمول یک معادله خط رو با تابع بنویسیم‪.‬‬

‫یک معادله خط به صورت زیر رو در نظر بگیرید‪.‬‬

‫‪ax + b‬‬

‫که ‪ a‬همون شیب معادله خط و ‪ b‬همون عرض از مبدأ است‪ .‬فرض کنید میخوام معادله خطی رو در‬
‫نظر بگیریم که ‪ . a = 2, b = 3‬پس در اینصورت معادله خط ما میشه‪:‬‬

‫‪2x + 3‬‬

‫حاال فرض کنید یکی از بندگان خدا عالقهمنده که مقدار این معادله خط رو در نقطه ‪ x = 1‬بدست بیاره‪.‬‬

‫در این صورت داریم‪:‬‬


‫‪2( x ) + 3 = 5‬‬
‫{‬
‫‪1‬‬

‫خب حاال بریم همینو توی پایتون بنویسیم‪ .‬هدفهمون اینه که تابعی بنویسیم که کاربر خودش ‪ x‬و ‪ a‬و ‪b‬‬
‫رو بده و ما براش مقدار معادله خط رو به ازای مقادیری که داده حساب کنیم‪.‬‬

‫کدنویسی مثال‪ :‬قطعه کد زیر رو در نظر بگیرید‪:‬‬

‫‪def khat(x,a,b):‬‬
‫‪return a*x+b‬‬

‫(‪print‬‬ ‫)‪khat(1,2,3‬‬ ‫)‬

‫یک قسمت از کد باال پسزمینه آبی داره و یه قسمت دیگه پسزمینه بنفش‪.‬‬
‫اون قسمتی که پسزمینه آبی داره‪ ،‬مربوط به تعریف تابع است و اون قسمتی که پسزمینه بنفش داره‬
‫مربوط به فراخوانی تابع است‪.‬‬
‫در قسمتی که پسزمینه آبی داره‪ ،‬اومدیم تابع رو تعریف کردیم که بیاد تهش مقدار معادله خط به ازای‬
‫اون ‪ x‬و ‪ a‬و ‪ b‬که کاربر وارد میکنه رو برگردوونه‪.‬‬

‫در قسمتی که پسزمینه بنفش داره هم اومدیم همون مثالی که اون همه دربارش صحبت کردیم رو به‬
‫پایتون دادیم تا پایتون رو هم یه محکی بزنیم ☺!‬

‫تذکر‪ :‬واضح است که میتونید توابع با پارامترهای بیشتری هم به طریق مشابه تعریف کنید‪.‬‬

‫در نظر گرفتن مقادیر پیشفرض برای پارامترهای تابع‬

‫همون مثال معادله خط رو در نظر بگیرید‪.‬‬

‫‪ax + b‬‬

‫فرض کنید میخوایم اینجوری در نظر بگیریم که اگر کاربر مقدار ‪ b‬رو وارد کرد که هیچی! [وارد کرده‬
‫دیگه]‬

‫اما اگر وارد نکرد‪ ،‬میخوایم به طور پیشفرض اون رو صفر در نظر بگیریم‪.‬‬

‫در این صورت داریم‪:‬‬

‫‪def khat(x,a,b=0):‬‬
‫‪return a*x+b‬‬
‫(‪print‬‬ ‫)‪khat(1,2‬‬ ‫)‬
‫اون جایی که نوشتیم ‪ ،b=0‬یعنی مقدار پیشفرض این پارامتر صفر هست‪ ،‬مگر اینکه کاربر خودش یه‬
‫چیزی رو صراحتاً وارد کنه‪.‬‬

‫خب در اون قسمت فراخوانی تابع هم دیگه کاربر گرامی مقدار ‪ b‬رو مشخص نکرده! و ماهم طبق‬
‫چیزی که صحبت کردیم‪ ،‬قرار شد اون صفر در نظر بگیریم‪.‬‬

‫‪2 (1) + b{ = 2‬‬


‫‪0‬‬

‫پس خروجی باید بشه ‪ 2‬که اگر اجرا کنید‪ ،‬میبینید که همین شکلی هم میشه‪.‬‬

‫انواع پارامترهای ورودی تابع‪:‬‬

‫الف) پارامترهایی که براشون مقدار پیشفرض در نظر گرفتیم [بیاید همینجوری واسه دل خودمون به اینا‬
‫بگیم‪ :‬سیبزمینی]‪ :‬اگر کاربر حال کرد‪ ،‬برای این پارامترها مقدار مشخص میکنه‪ ،‬اما اگر حال نکرد‪ ،‬ما‬
‫خودمون به طور پیشفرض مقدار نظر گرفتیم و مشکلی پیش نمیاد‪.‬‬

‫ب) پارامترهایی که براشون مقدار پیشفرض در نظر نگرفتیم [بیاید همینجوری واسه دل خودمون به اینا‬
‫بگیم‪ :‬بچه آدمیزاد]‪ :‬در اینجا با کاربر شوخی نداریم! اگر کاربر مقدار این پارامترها رو مشخص نکنه‪ ،‬چنان‬
‫خطایی بهش میدیم که دفعه اول و آخرش باشه که همچین پارامترهایی رو بدون مقداردهی وِل میکنه و‬
‫میره ‪.‬‬

‫سخن بزرگان‪ :‬پارامترهای از نوع سیبزمینی‪ ،‬باید همیشه بعد بچههای آدمیزاد بیان!‬

‫یعنی حق نداریم‪ ،‬پارامترهایی که مقدار پیشفرض دارن رو زودتر از اونایی بیاریم که مقدار پیش فرض‬
‫ندارن‪ .‬به زبووونِ مثال‪ ،‬این چیزی که در پایین نوشتیم‪ ،‬به همین دلیلی که گفتیم غلطه‪.‬‬

‫‪def khat(a,b=0,x):‬‬
‫‪return a*x+b‬‬
‫متغیرهای محلی و سراسری‬

‫در دنیای پایتون هم‪ ،‬محله و بچه محل و ایناها وجود داره!‬

‫بعضی متغیرها هستن فقط توی محله خودشون واسه خودشون کسی هستن‪.‬‬

‫اما در محلههای دیگه شکالت هم نیستن!‬


‫مثالً تابع و چیزمیزایی که توی اون تعریف میکنیم‪ ،‬یک محله حساب میشه! (محلهی اون تابع)‬

‫مثال زیر رو در نظر بگیرید تا داستان رو ادامه بدیم‪:‬‬

‫‪def double(a):‬‬
‫‪print( a*2‬‬ ‫)‬
‫)‪double(4‬‬
‫)‪print(a‬‬
‫اگر دقت کنید‪ ،‬توی تابع یه دونه ‪ a‬داریم‪ ،‬که درواقع همون ورودی تابع است‪.‬‬

‫به نظر شما‪ ،‬خروجی کد باال چی میشه؟ بیاید باهم تحلیل کنیم‪:‬‬

‫اونجایی که گفتیم )‪ double(4‬که میره سراغ تابع و ورودی رو دوبرابر میکنه و ‪ 8‬رو چاپ میکنه‪.‬‬

‫اما اونجایی که نوشته )‪ print(a‬بهمووون خطا میده! چون اون ‪ a‬توی محل خودش (محلهی تابع‬
‫‪ )double‬کسی بود‪ ،‬خارج از اون محل‪ ،‬شکالت هم نیست و کسی به رسمیت نمیشناسَدِش‪.‬‬

‫نکته‪ :‬متغیرهای داخل توابع فقط داخل خودشون معنی دارن‪ ،‬خارج از تابع آدم حساب نمیشن‪.‬‬

‫مثال‪ :‬خروجی کد زیر چی میشه به نظرتون؟‬

‫‪def double(a):‬‬
‫‪print( a*2‬‬ ‫)‬
‫)‪double(4‬‬
‫‪a=10‬‬
‫)‪print(a‬‬
‫خب اونجایی که )‪ double(4‬نوشتیم‪ ،‬میاد ‪ 8‬رو چاپ میکنه‪.‬‬

‫در خط بعدی اومدیم متغیری به اسم ‪ a‬تعریف کردیم و در خط بعد هم چاپش میکنیم‪.‬‬

‫تاکید میکنم اون ‪ a‬داخل تابع‪ ،‬اصالً بیرون از تابع‪ ،‬آدم حسابش نمیکنن! پس اون ‪ a‬که تعریف کردیم‬
‫با مقدار ‪ ،10‬در خط بعد اون رو میاد چاپ میکنه‪.‬‬

‫خروجی‪:‬‬

‫‪8‬‬
‫‪10‬‬
‫مثال‪ :‬خروجی مثال زیر چی میشه؟‬

‫‪a=10‬‬
‫‪def double():‬‬
‫(‪print‬‬ ‫‪a*2‬‬ ‫)‬
‫)(‪double‬‬
‫اون ‪ a=10‬که در خط اول تعریف کردیم‪ ،‬یک متغیر سراسری است (یعنی متغیری که همهجا قابل‬
‫دسترسی است)‬

‫توی تابع داریم میگیم‪ :‬دوبرابر ‪ a‬رو چاپ کن‪( .‬و این ‪ a‬همون ‪a‬ای است که در خط اول تعریف‬
‫کردیم‪ .‬چون گفتیم اون ‪ a‬یک متغیر سراسری است‪ .‬یعنی متغیری که همهجا‪ ،‬منجمله داخل تابع‪ ،‬قابل‬
‫دسترسی است)‬

‫و بعد در بیرون از توابع داریم تابع ‪ double‬رو فراخوانی میکنیم‪.‬‬

‫خروجی‪:‬‬

‫‪20‬‬

‫مثال‪ :‬خروجی کد زیر چی میشه؟‬

‫‪def double():‬‬
‫‪print( a*2‬‬ ‫)‬
‫‪a=10‬‬
‫)(‪double‬‬
‫بازهم همون خروجی مثال قبل رو میده و توضیحاتش دقیقاً مثل قبلی است‪.‬‬

‫شاید بگید‪ :‬اِع! موقعی که داریم تابع رو تعریف میکنیم‪ ،‬اصالً ‪ a‬تعریف نشده که! نباید خطا بده که‬
‫همچین متغیری وجود نداره؟‬

‫جواب اینه که خیر! مالک فراخوانی تابع است نه تعریف تابع‪ .‬یعنی اگر تا موقع فراخوانی تابع‪ ،‬اون ‪a‬‬
‫مقدارش مشخص نمیشد‪ ،‬خطا دریافت میکردیم‪ .‬اما الحمداله اینجا قبل از فراخوانی تابع‪ a ،‬تعریف‬
‫شده‪.‬‬

‫ولی واضحه که کد زیر با خطا مواجه میشه‪ ،‬چون تا قبل از فراخوانی تابع‪ a ،‬تعریف نشده‪:‬‬

‫‪def double():‬‬
‫‪print( a*2‬‬ ‫)‬
‫)(‪double‬‬
‫‪a=10‬‬
‫مثال‪ :‬تابعی رو در نظر بگیرید که یک لیست بهش میدیم و میاد مجموع (‪ )summation‬و میانگین‬
‫(‪ )average‬اون لیست رو حساب میکنه‪[ .‬صرفاً حساب میکنه]‬

‫‪def calculate(a):‬‬
‫)‪n=len(a‬‬
‫)‪summation=sum(a‬‬
‫‪average=summation/n‬‬
‫]‪x=[1,2,3‬‬
‫)‪calculate(x‬‬

‫)‪print(n‬‬
‫در بیرون از تابع یک لیست به اسم ‪ x‬تعریف کردیم و در خط بعدی گفتیم تابع ‪ calculate‬رو با‬
‫گرفتن لیست ‪ x‬به عنوان ورودی‪ ،‬اجرا کن‪.‬‬

‫در خط بعدی گفتیم )‪ print(n‬که کار رو خراب کرده! چون ‪ n‬یک متغیر ‪( local‬محلی) است و فقط‬
‫در داخل تابع واسه خودش کسی است‪ .‬برای همین با خطا مواجه میشیم‪.‬‬

‫شاید بپرسید آیا راهی هست که یه نفر داخل یک محل رو معروف کنیم تا همهجا بشناسنش! یعنی آیا‬
‫ل تابع‪ ،‬یک متغیر سراسری بشه؟‬
‫مثالً در مثال باال میشه کاری کرد که اون ‪ n‬داخ ِ‬

‫جواب‪ :‬بله فقط باید قبل از تعریف متغیر ‪ n‬داخل تابع‪ ،‬اعالم کنید که اون متغیر سراسری است‪ ،‬و‬
‫اینکار به صورت زیر انجام میشه [به قسمتی که ‪ highlight‬کردم‪ ،‬توجه کنید]‪:‬‬

‫‪def calculate(a):‬‬
‫‪global n‬‬
‫)‪n=len(a‬‬
‫)‪summation=sum(a‬‬
‫‪average=summation/n‬‬
‫]‪x=[1,2,3‬‬
‫)‪calculate(x‬‬

‫)‪print(n‬‬
‫اگر خواستیم چندتا چیز رو ‪ global‬کنیم چی؟ [این بار کد زیر رو در نظر بگیرید]‬

‫‪def calculate(a):‬‬
‫‪global n,summation,average‬‬
‫)‪n=len(a‬‬
‫)‪summation=sum(a‬‬
‫‪average=summation/n‬‬
‫]‪x=[1,2,3‬‬
‫)‪calculate(x‬‬

‫)‪print(n‬‬

‫مثال‪ :‬قطعه کد زیر رو در نظر بگیرید و بگید مشکلش چیست؟‬

‫‪def calculate(a):‬‬
‫)‪n=len(a‬‬
‫)‪summation=sum(a‬‬
‫‪average=summation/n‬‬
‫‪def MEAN(a):‬‬
‫‪return average‬‬
‫‪def SUM(a):‬‬
‫‪return summation‬‬
‫]‪x=[1,2,3‬‬
‫)‪calculate(x‬‬
‫(‪print‬‬ ‫)‪SUM(x‬‬ ‫)‬
‫مشکلش اینه که اون ‪ summation‬فقط توی تابع اول (فقط توی محل خودشون) واسه خودش کسی‬
‫است‪ ،‬نه توی محلهای دیگه‪ .‬پس توی محلهی تابع ‪ SUM‬اصالً شناخته نشده است! پس عمالً توی‬
‫تابع ‪ SUM‬داریم چیزی رو برمیگردونیم که اصالً تعریف نشده است و این قطعاً خطا میده‪.‬‬

‫برای رفع این مشکل باید بیایم متغیرها رو ‪ global‬کنیم‪:‬‬

‫‪def calculate(a):‬‬
‫‪global n,summation,average‬‬
‫)‪n=len(a‬‬
‫)‪summation=sum(a‬‬
‫‪average=summation/n‬‬
‫‪def MEAN(a):‬‬
‫‪return average‬‬
‫‪def SUM(a):‬‬
‫‪return summation‬‬
‫]‪x=[1,2,3‬‬
‫)‪calculate(x‬‬
‫(‪print‬‬ ‫)‪SUM(x‬‬ ‫)‬
‫حاال بگید مشکل این کد زیر چیست؟‬

‫‪def calculate(a):‬‬
‫‪global n,summation,average‬‬
‫)‪n=len(a‬‬
‫)‪summation=sum(a‬‬
‫‪average=summation/n‬‬
‫‪def MEAN(a):‬‬
‫‪return average‬‬
‫‪def SUM(a):‬‬
‫‪return summation‬‬
‫]‪x=[1,2,3‬‬

‫(‪print‬‬ ‫)‪SUM(x‬‬ ‫)‬


‫مشکل اینه که تا تابع ‪ calculate‬فراخوانی نشه‪ ،‬اصالً چیزی به اسم ‪ summation‬و ‪ average‬و‬
‫غیره تعریف نمیشه که ما میخوایم توی تابع ‪ SUM‬قابل دسترس باشه‪ .‬پس اون ‪ calculate‬رو حتماً‬
‫باید بذاریم‪.‬‬

‫چه فیلم طوالنی بود! خسته شدم انقدر تایپ کردم!‬

‫‪lambda function‬‬

‫توی این فیلم موضوعی رو آموزش میدیم که موقعی که دارید آموزش رو گوش میکنید با خودتون‬
‫میگید‪:‬‬
‫که چی؟! این مسخرهبازیها چیه؟ همون تابع خودمون رو تعریف کنیم! این کارا چیه دیگه!‬

‫اما یکم تجربه کسب کنین و کدهای این و اون رو ببینید و با چشم خودتون ببینید چقدر کاربرد داره‪،‬‬
‫قطعاً دعامون میکنید‪.‬‬

‫ما برای هر مثال‪ ،‬یه تابع ساده بهتون نشون میدیم و اون رو میایم به شکل ‪lambda function‬‬
‫بازنویسی میکنیم‪.‬‬

‫مثال‪ :1‬تابعی که ورودی رو دوبرابر میکنه‪.‬‬

‫‪def double(a):‬‬
‫‪return a*2‬‬
‫به صورت ‪:lambda function‬‬

‫‪f=lambda a:a*2‬‬
‫(‪print‬‬ ‫)‪f(6‬‬ ‫)‬
‫اون ‪ lambda‬که نشووونه و کلمهکلیدی این توابع است‪ .‬بعد جلوی همون ‪ lambda‬مینویسیم که این‬
‫توابع یه چیزی مثل ‪ a‬دریافت میکنن و دوبرابرش رو برمیگردونن‪ .‬اسم این دم و دستگاهی که درست‬
‫کردیم رو هم گذاشتیم ‪ .f‬توی خط بعد هم میگیم )‪ f(6‬رو بیا چاپ کن‪ .‬که دوبرابر عدد ‪ 6‬یعنی ‪ 12‬رو‬
‫چاپ میکنه‪.‬‬

‫مثال‪ :2‬تابعی که دوعدد رو ورودی میگیره و در خروجی ضرب این دو عدد رو برمیگردونه‪.‬‬

‫‪def multiply(a,b):‬‬
‫‪return a*b‬‬
‫به صورت ‪:lambda function‬‬

‫‪g=lambda a,b:a*b‬‬
‫(‪print‬‬ ‫)‪g(3,5‬‬ ‫)‬
‫اینجا هم گفتیم‪ ،‬یک ‪ a‬و ‪ b‬ورودی گرفته میشه و ‪ a*b‬برگردوونده میشه‪ .‬اسم این تابع رو هم گذاشتیم‬
‫‪ g‬و بعد درخط بعدی ‪ 3‬و ‪ 5‬رو به عنوان ورودی به تابع دادیم تا ‪ 3*5‬رو حساب کنه و برگردونه‪.‬‬

‫مثال‪ :3‬تابعی که دوعدد رو ورودی میگیره و در خروجی جمع اون دو عدد رو میده‪.‬‬

‫‪def add(a,b):‬‬
‫‪return a+b‬‬
‫به صورت ‪:lambda function‬‬

‫‪f=lambda a,b:a+b‬‬
‫(‪print‬‬ ‫)‪f(5,6‬‬ ‫)‬
‫اومدیم گفتیم این تابع دو ورودی (مثالً مثل ‪ a‬و ‪ )b‬میگیره و در خروجی جمعِ این دو عدد رو‬
‫برمیگردونه‪ .‬یک مثال هم در خط بعدش داریم پیادهسازی میکنیم که در واقع حاصل جمع ‪ 5‬و ‪6‬‬
‫(یعنی ‪ )11‬است‪.‬‬

‫مثال‪ :4‬تابعی که یک عدد رو به عنوان ورودی میگیره و اون رو به توان ‪ 2‬میرسونه‪.‬‬

‫‪def square(a):‬‬
‫‪return a**2‬‬
‫به صورت ‪:lambda function‬‬
‫‪f=lambda a:a**2‬‬
‫(‪print‬‬ ‫)‪f(5‬‬ ‫)‬
‫در اینجا میگیم یک ورودی مثل ‪ a‬گرفته میشه و به توان دو اون عدد برگردووونده میشه‪.‬‬
‫در خط بعدی هم یک مثال (‪ 5‬به توان ‪ 2‬که جوابش میشه ‪ )25‬ازش رو داریم پیادهسازی میکنیم‪.‬‬
‫مثال‪ :5‬تابعی که دو عدد مثل ‪ a‬و ‪ b‬رو میگیره و در خروجی ‪ a b‬رو برمیگردووونه‪.‬‬
‫‪def power(a,b):‬‬
‫‪return a**b‬‬
‫به صورت ‪:lambda function‬‬
‫‪f=lambda a,b:a**b‬‬
‫(‪print‬‬ ‫)‪f(2,7‬‬ ‫)‬
‫خروجی‪128 :‬‬
‫مثال‪ :6‬تابعی که یک عدد رو به عنوان ورودی میگیره و چک میکنه که آیا عدد وارد شده‪ ،‬زوج هست‬
‫یا نه؟‬
‫‪def check_even(a):‬‬
‫‪return a%2==0‬‬
‫به صورت ‪:lambda function‬‬
‫‪f=lambda a:a%2==0‬‬
‫(‪print‬‬ ‫)‪f(8‬‬ ‫)‬
‫یک ورودی مانند ‪ a‬میگیره‪ ،‬و بعد درخروجی میگه‪( a%2==0 :‬یعنی باقیمانده تقسیم ‪ a‬بر ‪ 2‬برابر ‪0‬‬
‫است)‬
‫حاال اگر واقعاً عدد زوج باشه‪ ،‬این ‪ a%2==0‬برابر ‪ True‬است و مقدار ‪ True‬رو برمیگردونه‪.‬‬
‫درغیراینصورت ‪ False‬رو برمیگردونه‪.‬‬
‫مثالً در مورد عدد ‪ True ،8‬برمیگردونه‪ ،‬اما در مورد عدد ‪ 9‬عبارت ‪ False‬رو برمیگردونه‪.‬‬
‫تابع ‪ map‬و ترکیب آن با ‪lambda functions‬‬

‫یکی از معنیهای کلمه ‪ map‬در زبان انگلیسی‪ ،‬تصویر کردن و نگاشت کردن است‪.‬‬
‫مثالً فرض کنید یک تابع به صورت ‪ f ( x ) = x2‬داریم‪ .‬و همچنین فرض کنید یک لیست هم به صورت‬
‫زیر داریم‪:‬‬
‫]‪a=[1,2,3‬‬
‫اگر تابع ‪ f‬رو رووووی تک تک مولفههای لیست ‪ a‬نگاشت کنیم (یا تصویر کنیم)‪ ،‬این معادل این‬
‫است که بیایم اون تابع رو روووی تک تک مولفههای لیست ‪ a‬پیادهسازی کنیم که خروجی میشه‪:‬‬
‫]‪[1,4,9‬‬
‫یعنی توان دوّمِ هریک از مولفههای لیست‪.‬‬
‫مثال‪ :‬لیست ‪ a‬رو به صورت زیر در نظر بگیرید‪:‬‬
‫]‪a=[1,2,3,4‬‬
‫میخوایم یک لیست دیگه به اسم ‪ b‬درست کنیم که درواقع ‪2‬برابر هریک از مولفههای ‪ a‬در اوون قرار‬
‫داده شده است‪ .‬یکی از راهحلهاش اینه چیزی است که قبالً دیدیم‪:‬‬
‫][=‪b‬‬
‫‪for i in a:‬‬
‫)‪b.append(i*2‬‬
‫)‪print(b‬‬
‫یکی از راهحلهای دیگه استفاده از تابع ‪ map‬است‪.‬‬
‫‪def double(a):‬‬
‫‪return a*2‬‬
‫]‪a=[1,2,3,4‬‬
‫))‪b=list(map(double,a‬‬
‫)‪print(b‬‬
‫در خط ‪ 1‬و ‪ 2‬اومدیم تابعی به اسم ‪ double‬تعریف کردیم که هر مولفه ورودی خودش رو دوبرابر‬
‫میکنه‪.‬‬
‫در خط ‪ 3‬اومدیم یک لیست به اسم ‪ a‬تعریف کردیم‪.‬‬
‫در خط ‪ 4‬اومدیم از تابع ‪ map‬استفاده میکنیم‪ ،‬تا براساس تابع ‪ double‬روووی تک تک مولفههای ‪a‬‬
‫نگاشت انجام بده‪.‬‬
‫توجه کنید که اون )‪ map(double,a‬به شما لیست برنمیگردونه! برای اینکه لیست برگردونه از تابع ‪list‬‬
‫هم استفاده کردیم و اسم اون لیست نهایی رو گذاشتیم ‪.b‬‬
‫در خط بعد هم داریم همون ‪ b‬رو چاپ میکنیم‪.‬‬
‫نکته‪ :‬توی )‪ map(double,a‬حق نداریم بجای ‪ ،double‬بنویسیم )(‪ .double‬اگر این شکلی بنویسید‪،‬‬
‫یقیناً خطا دریافت میکنید‪.‬‬
‫حاال بیایم بجای اون تابع ‪ double‬از ‪ lambda function‬استفاده کنیم‪.‬‬
‫]‪a=[1,2,3,4‬‬
‫))‪b=list(map(lambda x:x*2,a‬‬
‫)‪print(b‬‬
‫و خروجی این هم دقیقاً همون چیزی که میخوایم میشه‪:‬‬
‫]‪[2, 4, 6, 8‬‬
‫والسّالم‪.‬‬
‫تذکر نهایی‪ :‬اگر دقت کرده باشید در تمام مثالهای ‪ lambda function‬از توابعی استفاده کردیم به‬
‫این شکل‪:‬‬
‫‪def double(x):‬‬
‫‪return x*2‬‬
‫این تابع فقط یه دونه ‪( expression‬یا عبارت) داره که ما اون رو با زرد هایالیت کردیم‪.‬‬
‫‪lambda function‬ها‪ ،‬فقط میتونن جایگزین توابع با یه دوونه ‪ expression‬بشن نه هر تابع خوف‬
‫و خفنی!‬

‫فصل نهم‬
‫آشنایی با پکیجها‬

‫اسامی دیگر پکیج‪ :‬ماژول (‪ :module‬البته تلفظ انگلیسیش ماژول نیست‪ ،‬ولی ما توی فارسی‬
‫میگیم ماژول)‪ ،‬کتابخانه‬

‫پکیج چیست؟ فرض کنید میخوایم میانگین یک لیست رو حساب کنیم‪ .‬یکی از راههاش اینه که‬
‫خودمون کدی بنویسیم که این کار رو انجام بده‪ .‬یه راه دیگهش هم اینه که از کدی که یک سری بندگان‬
‫خدا قبالً نوشتن استفاده کنیم‪.‬‬

‫مثالً یک سری از بندگان خدا اومدن پکیجی درست کردن به اسم ‪ .statistics‬این پکیج یک سری‬
‫کارهای آماری داخلش تعبیه شده‪ ،‬مانند محاسبه میانگین و مُد و میانه و ‪. ...‬‬
‫انواع پکیجها‬
‫ما دو نوع کلی از پکیجها رو داریم‪ )1 :‬داخلی ‪ )2‬خارجی‬
‫‪ -‬پکیجهای داخلی اونایی هستن که توی خود پایتون نصب هستن و نیازی به نصبشون نیست (مثالً‬
‫پکیج ‪ sys ،statistics ،random ،math‬و غیره)‪.‬‬
‫‪ -‬پکیجهای خارجی اونایی هستن که توی خود پایتون نصب نیستن و نیاز داریم نصبشون کنیم (مثل‬
‫‪ pandas ،matplotlib ،nump‬و غیره)‪.‬‬
‫مثال‪ :‬لیست زیر رو در نظر بگیرید‪ .‬میخوایم با استفاده از پکیج ‪ statistics‬میانگین این لیست رو‬
‫چاپ کنیم‪.‬‬
‫‪import statistics‬‬
‫]‪a=[1,2,3‬‬
‫(‪print‬‬ ‫)‪statistics.mean(a‬‬ ‫)‬
‫در خط اول که اومدیم پکیج ‪ statistics‬که برای کارهای آماری استفاده میشه رو وارد برنامه کردیم‬
‫(‪ import‬یعنی وارد کردن)‪.‬‬
‫در خط دوم‪ ،‬یک لیست به اسم ‪ a‬تعریف کردیم‪.‬‬
‫در خط آخر هم اومدیم از پکیج ‪ ،statistics‬تابع ‪ mean‬رو استفاده کردیم تا میانگین ‪ a‬رو محاسبه‬
‫کنیم و به لطف تابع ‪ ،print‬اون میانیگن رو هم چاپ میکنیم‪.‬‬
‫خروجی‪2 :‬‬
‫نصب پکیجهای مختلف‬

‫نصب پکیجهای مختلف چون پنجره محور است و نه کد محور‪ ،‬در این جزوه نیامده‪ .‬چون برای آموزش‬
‫نصب قطعاً باید فیلم رو نگاه کنید (حتی برای مرور)‪.‬‬
‫پکیج ‪sys‬‬

‫پکیج ‪ sys‬برای ‪( System specific parameters and functions‬توابع و پارامترهای مشخص‬


‫سیستم) استفاده میشه‪.‬‬
‫مثالً فرض کنید میخوایم به کوچکترین ‪ float‬مثبت (یا همون اپسیلون ‪ ) ‬که یکی از پارامترهای‬
‫مشخص سیستم است‪ ،‬دسترسی پیدا کنیم‪.‬‬
‫قطعه کد زیر رو در نظر بگیرید‪:‬‬
‫‪import sys‬‬
‫‪eps=sys.float_info.epsilon‬‬
‫)‪print(eps‬‬
‫در خط اول اومدیم پکیج ‪ sys‬رو ‪ import‬کردیم‪.‬‬
‫در خط دوم‪ ،‬میایم کوچکترین ‪ float‬مثبتی که سیستم براش تعریف شده رو میریزیم توی متغیری به‬
‫اسم ‪.eps‬‬
‫در خط آخر هم همووون ‪ eps‬رو پرینت میکنیم‪.‬‬

‫این فایلها صرفاً برای خریدار این آموزشها تهیهشدهاست و هرگونه کپی برداری‪ ،‬به اشتراکگذاری و ‪ ...‬این فایلها‬
‫غیرقانونی و حرام است و هیچ گونه رضایت مولف را در بر ندارد‪.‬‬

You might also like