Pamphlet (Session04)
Pamphlet (Session04)
هرگونه کپی برداری غیرقانونی و حرام است و هیچ گونه رضایت مولف را در بر ندارد
فصل هفتم
بگیم چیا رو تا االن گفتیم!
عملگرهای عضویت
عملگرهای هویت
این عملگرهای در احراز هویت خیلی میتونن بهمووون کمک کنن ☺!
دوتا هم هستن ( 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میتونیم از تابع sumاستفاده کنیم:
]a=[1,5,7
)print( sum(a )
خروجی13 :
برای تعریف تابع از کلمه کلیدی ( defمخفف defineبه معنی تعریف کردن) برای تعریف تابع
استفاده میکنیم.
def Koolac():
"""(print
By: Sajjad Rahmani
Website: www.Koolac.Org
)"""
)(Koolac
در اینجا یک تابع تعریف کردیم که وظیفش چاپ یک سری چیز میز است! اسم تابع رو هم گذاشتیم
Koolac
خب! یک قسمت از کد باال پسزمینه آبی داره و یه قسمت دیگه پسزمینه بنفش.
اون قسمتی که پسزمینه آبی داره ،مربوط به تعریف تابع است و اون قسمتی که پسزمینه بنفش داره
مربوط به فراخوانی تابع است.
تذکر :نکات مربوط به indentationو ...دقیقاً مشابه مواردی است که سابقاً مطرح کردیم.
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
در اون قسمتی که پسزمینه بنفش داره هم داریم 2 3رو با تابع powerکه ساختیم حساب میکنیم و
خروجیش رو با دستور printچاپ میکنیم.
ax + b
که aهمون شیب معادله خط و bهمون عرض از مبدأ است .فرض کنید میخوام معادله خطی رو در
نظر بگیریم که . a = 2, b = 3پس در اینصورت معادله خط ما میشه:
2x + 3
حاال فرض کنید یکی از بندگان خدا عالقهمنده که مقدار این معادله خط رو در نقطه x = 1بدست بیاره.
خب حاال بریم همینو توی پایتون بنویسیم .هدفهمون اینه که تابعی بنویسیم که کاربر خودش xو aو b
رو بده و ما براش مقدار معادله خط رو به ازای مقادیری که داده حساب کنیم.
def khat(x,a,b):
return a*x+b
یک قسمت از کد باال پسزمینه آبی داره و یه قسمت دیگه پسزمینه بنفش.
اون قسمتی که پسزمینه آبی داره ،مربوط به تعریف تابع است و اون قسمتی که پسزمینه بنفش داره
مربوط به فراخوانی تابع است.
در قسمتی که پسزمینه آبی داره ،اومدیم تابع رو تعریف کردیم که بیاد تهش مقدار معادله خط به ازای
اون xو aو bکه کاربر وارد میکنه رو برگردوونه.
در قسمتی که پسزمینه بنفش داره هم اومدیم همون مثالی که اون همه دربارش صحبت کردیم رو به
پایتون دادیم تا پایتون رو هم یه محکی بزنیم ☺!
تذکر :واضح است که میتونید توابع با پارامترهای بیشتری هم به طریق مشابه تعریف کنید.
ax + b
فرض کنید میخوایم اینجوری در نظر بگیریم که اگر کاربر مقدار bرو وارد کرد که هیچی! [وارد کرده
دیگه]
اما اگر وارد نکرد ،میخوایم به طور پیشفرض اون رو صفر در نظر بگیریم.
def khat(x,a,b=0):
return a*x+b
(print )khat(1,2 )
اون جایی که نوشتیم ،b=0یعنی مقدار پیشفرض این پارامتر صفر هست ،مگر اینکه کاربر خودش یه
چیزی رو صراحتاً وارد کنه.
خب در اون قسمت فراخوانی تابع هم دیگه کاربر گرامی مقدار bرو مشخص نکرده! و ماهم طبق
چیزی که صحبت کردیم ،قرار شد اون صفر در نظر بگیریم.
پس خروجی باید بشه 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یک متغیر سراسری است .یعنی متغیری که همهجا ،منجمله داخل تابع ،قابل
دسترسی است)
خروجی:
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داریم چیزی رو برمیگردونیم که اصالً تعریف نشده است و این قطعاً خطا میده.
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
lambda function
توی این فیلم موضوعی رو آموزش میدیم که موقعی که دارید آموزش رو گوش میکنید با خودتون
میگید:
که چی؟! این مسخرهبازیها چیه؟ همون تابع خودمون رو تعریف کنیم! این کارا چیه دیگه!
اما یکم تجربه کسب کنین و کدهای این و اون رو ببینید و با چشم خودتون ببینید چقدر کاربرد داره،
قطعاً دعامون میکنید.
ما برای هر مثال ،یه تابع ساده بهتون نشون میدیم و اون رو میایم به شکل lambda function
بازنویسی میکنیم.
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است.
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
این فایلها صرفاً برای خریدار این آموزشها تهیهشدهاست و هرگونه کپی برداری ،به اشتراکگذاری و ...این فایلها
غیرقانونی و حرام است و هیچ گونه رضایت مولف را در بر ندارد.