مشارکت کننده های مختلفی ممکنه روی این کتاب کار بکنن و نکات تخصصی تری رو بنویسن تا از دانش دوستان بهره مند بشیم. از همینجا عمیقا از دوستان مشارکت کننده معذرت میخوام که برای شروع نام خودمو بردم. کوچیک شما هم هستم ❤ .
خب سلام سلام. من علیرضا فاضلی هستم ، الان که این کتاب یا اگه بشه بهش گفت کتاب رو وقتی مینویسم که هجده سالمه ، حالا بعدا بزرگتر میشم :) . بنده حدود سه سالی هست که برنامه نویسی کار میکنم و توی حوزه های مختلف برنامه نویسی کار کردم ، اولش که صبح تا شب گیم میزدم مثل تمامی همسن و سالای خودم ، بعدش یکی از رفقا گفت یک زبان برنامی نویسی هست به نام پایتون بشین یادش بگیر خیلی باحاله ، اقا ما نشستیم یادش گرفتیم . مدتی باهاش کار کردیم تا اینکه وارد پروژه ای با دوست خوبم سجاد عبدالهی شدم. و اونجا منو با JavaScript آشنا کرد و خلاصه یکسالو نیمی رفتم برای خودم که با جی اس کار کنم. حالا که رسیده به این زمان علاقه پیدا کردم که برم سمت هوش مصنوعی و بینایی کامپیوتر .
خب پیشنیاز اولیه یادگیری هوش مصنوعی ، زبان برنامه نویسی پایتون هستش ، من برای خودم دوره آموزشی پایتون از وبسایت Zero To Mastery انتخاب کردم. من همیشه عادت دارم که کوچکترین چیزیو که یاد میگیریم بیام توی دفترم بنویسم ، ولی این بار با خودم گفتم پسر یکم اپدیت بشو توی این قضیه . تصمیم گرفتم نکاتی که یاد میگیرم رو روی نرم افزار Notion بنویسم. اومدم صفحه یادگیری نوشنم رو پابلیک کردم تا بقیه دوستان هم بیان نظرشونو بگن و توی این مطلب کمکم بکنن و توی توییتر توییتش کردم ، تا اینکه دوست عزیزم محمد زرچی بهم گفت که چرا توی گیتهاب نمیزاریش تا بقیه راحت تر بتونن توش مشارکت داشته باشن ، با خودم گفتم فکر خوبیه و این شد که الا توی گیتهاب در خدمتتون هستیم.
زمینه یادگیری عمیق هر چیزی شناخت تاریخچه و اهداف و علت های ساخت اون چیزه
پایتون که امروز به یه زبان همه منظوره و مفسری شناخته میشه که اولین بار در سال 1991 عرضه شد نویسنده پایتون گیدو ون راسوم (Guido van Rossum) است که متولد 1956 و اهل هلند است
نام زبان برنامهنویسی پایتون از علاقه نویسنده آن به کمدین بریتانیایی معروف، مونتی پایتون (Monty Python)، گرفته شده است. گویدو ون راسوم، نویسنده این زبان برنامهنویسی، به خاطر علاقه خود به این برنامه تلویزیونی کمدی و همچنین برای جذب توجه ویژهای به این زبان، از نام "پایتون" برای نامگذاری این زبان استفاده کرد.
بر خلاف نظر اکثریت که فکر می کنند پایتون زبان جدیدیه، پایتون یه زبان نسبتا قدیمی حساب میشه علت این افکار عموما به این بر میگرده که پایتون توی سال های اخیر تازه بر سر زبان ها افتاده و تونسته جای خودش رو در صدر جدول برای چند سالی نگه داره
برای مثال جاوااسکریپت (JavaScript) سال 1995 عرضه شد 5 سال بعد از پایتون
روبی(Ruby) هم سال 1995 عرضه شد
سی شارپ(C#) سال 2001 عرضه شد
جولیا(Julia) سال 2012 عرضه شد
گو(Go) سال 2009 عرضه شد
عموما پایتون زبانی سطح بالا با سینتکس راحت و خوانا نزدیک به زبان انسان است برای همین می تونه گزینه خوبه برای شروع برنامه نویسی باشه و همچنین با توجه به محبوبیت و رشد پایتون و همچنین پکیج های زیادی که داره میتونه یه انتخاب مناسب برای شروع و کار در فیلد های مختلف باشه
زبان های برنامه نویسی مثل ابزار های مختلف برای ساخت یک خونه میمونن مثل انبر ، چکش ، اره ، بیل ، کلنگ. هر کدوم از اینا برای کاری ساخته شدن ، مثلا با چکش نمیشه چاله کند.
به عنوان مثال زبان پایتون یک زبان با سرعت پایین هستش و High level. ما میخوایم برای سخت افزارمون برنامه نویسی بکنیم و سرعت برنامه سخت افزاری ما باید زیاد باشه . ما نمیتونیم از زبانی مثل پایتون که به سخت افزار نزدیک نیست و توی این مورد سرعت پایینی داره استفاده بکنیم پس میایم از زبان اسمبلی یا سی استفاده میکنیم.
زبان پایتون یک زبونیه که بهره وری رو بالاتر میبره به دلیل راحتی در کد و نزدیک بودن به زبان انگلیسی سرعت توسعه رو خیلی بالا میره.
به طور خلاصه هر زبونی رو بهر کاری ساختن و هر زبونی توی یک سری کارها بهتر از بقیه زبون هاست.
accountability = مسئولیت instructions = دستور عمل gibberish = بیهودگی
valuable = hard to acquire
نکته : همیشه بالای مطلبی معانی زبانی هستن که نوشتم ، این معانی خیلی توی دنیای کامپیوتر استفاده میشن پس به دردتون میخوره .
زبان ماشین به صورت اعداد باینری (0 و 1) و یا بیت ها نوشته میشود. زبانی هست که فقط کامپیوتر (مدار های کامپیوتر) میفهمه و میتونه برنامه های مارو اجرا بکنه. و زبان های برنامه نویسی که ما باهاشون کار میکنیم و جوری طراحی شدن که برای ما قابل فهمه مثل زبان های برنامه نویسی پایتون ، جاوااسکریپت ، پایتون ، گولنگ .... زبان های میانی بین زبان ماشین و زبان انسان هستن . به خاطر همینه که ما راحت به حروف انگلیسی میتونیم برنامه های مختلف بسازیم وگرنه پوستمون کنده میشد.
زبان های Low level : زبان هایی هستن که به زبان ماشین نزدیک تر هستند مثل c , c++ , assembly ... .
زبان های High Level : زبان هایی که به زبان انسان نزدیک تر هستند ، مثل : python , JavaScipt ....
زبان سطح بالا به زبان هایی گفته میشه که به زبان ما انسان ها نزدیکه و درکش برای ما اسون و در عوض برای کامپیوتر سخته ولی زبان های سطح پایین برعکس برای ما سخت ولی برای کامپیوتر اسونه!
Translator: وظیفه مترجم اینه که زبان برنامه نویسی که ما باهاش کد میزنیم رو به زبان ماشین ترجمه بکنه ، به عنوان مثال ما داریم پایتون کد میزنیم و به پایتون میگیم که یه متنی رو برای من چاپ بگیر ، کامپیوتر نمیفهمه که من توی زبان پایتون چی نوشتم ، میگه که این چرتو پرت چیه تحویل من میدی ، اینجاست که مترجم ها وارد کار میشن و و اون چرت و پرت رو برای کامپیوتر به زبان ماشین ترجمه میکنن و کامپیوتر حالا میگه که اها داداش تو میخوای واست یه متنیه چاپ بگیرم ، بیا اینم متنت .
- compiler
کار کامپایلر به این صورت هستش که میاد کد های مارو از اول و تا آخر میخونه اگر مشکلی ، اروری چیزی نداشت میاد کد مارو تبدیل به فایل اجرایی میکنه مثلا فایل .exe ، و هر سری برای اجرای این برنامه نیاز نیستش از اول این کد کامپایل بشه و دوبارخ فایل اجرایی جدید برای اجرا ساخته بشه ولی تا زمانی که بخواید توی کدتون تغیری ایجاد کنید ، اونموق دوباره نیازه که کدتون کامپایل بشه و خب سرعت زبان های کامپایلری از زبان های interpreter یا همون مفسری بیشتر . به عنوان مثال زبان های : C++ , C# , Java زبان های کامپایلری هستند.
- interpreter
مفسر میاد خط به خط کدامون رو میخونه و اگر اون خط مشکلی نداشت خروجی همونو بهمون میده و مفسر هیچ فایل اجرایی نداره چون کامپایل نمیشه و داره ترجمه میشه پس در نتیجه برای هربار اجرا باید این روند رو طی بکنه و همین موضوع سرعتش رو پایین میره !. زبان مفسری مثل : python , PHP , JavaScript , Ruby.
شما برای برنامه نویسی به صورت انلاین ( فقط برای یاگیری ) میتونید از وبسایت های زیر استفاده کنید:
print(’hello world’)
این دستور توی پایتون برای ما هر چی که بخوایم رو در درون ترمینال برای ما خروجی میگیره. این ساده ترین دستور درون پایتونه . به طور تخصصی به این اینا میگن سینتکس و این سینتکس ها از قبل درون زبان برنامه نویسی پایتون قرار داده شدند.
اول از همه ما کدی رو که توی پایتون مینویسم مثل همین print('hello world')
، این به مفسر پایتون داده میشه
و بعدش اون مفسری که از قبل براش نوشتن ، میاد کد مارو به بایت کد ترجمه میکنه و اون بایت کد درون ماشین مجازی زبان سی به نام cpython قرار میگیره
و اون ماشین مجازی ، بایت کد مارو به زبان ماشین تبدیل میکنه :) .
input('Whats your name ?')
این تابع یا فعلا بهتره از لفظ تابع استفاده نکنیم ، چون زوده یکم ، بهتره بگیم این کد ، کارش اینه که میاد از ما ورودی دریافت میکنه ، از کجا ؟ خب از ترمینال ما ، همونجایی که ما کد پایتونیمون رو خروجی میگیریم. به مثال زیر دقت کنید:
اگه دقت کنید میتونید ببینید ، از ما پرسیده که اسمت چیه ؟ خب من جواب دادم علیرضا. ولی این اسم نه جایی ذخیره شده نه حرکتی زده شده مثلا بیاد بگه سلام علیرضا.
باید چیکار بکنیم ؟ اینو توی یک متفیر ذخیره بکنیم ، وقتی چیزی رو توی متفیر ذخیره میکنیم این توی مموریما میره و ذخیره میشه و ما میتونیم با این کار های مختلف بکنیم.
userName = input('whats your name ? ')
print('Hello ' + userName)
و حالا میبینید که ما تونستیم از این تابع input استفاده بکنیم ، یک ورودی از کاربر دریافت بکنیم و اون ورودی رو درون متغیر بریزیم و از اون متغیر به عنوان خروجی استفاده بکنیم .
evolving = درحال تکامل | decided = تصمیم گرفت | legacy = میراث
به اپدیتی گفته میشه که وقتی میاد دیگه اپلیکیشن ها برنامه ها و پروژه ها نمیتونن از اون اپدیت استفاده بکنن چون اصلا براشون طراحی نشده. به عنوان مثال وقتی پایتون 3 اومد دیگه شرکت ها نمیتونستن خودشونو تا مدت ها اپدیت بکنن و باید خط به خط پروژه هاشونو اپدیت میکردن. یعنی همه چی برای شرکتا ف**اکداپ شده بود 😂.
از سال 2008 سازنده پایتون تصمیم گرفت که ورژن جدید پایتون رو بسازه یعنی ورژن 3 که انقلابی در کامیونیتی پایتون بودش و اینکه اومد کلا تمامی زیرساخت های زبان پایتون رو از نو کوبید و ساخت باعث breaking changes شد.
#python 2 :
print ‘hello world’
#python 3 :
print(’hello world’)
data = داده | type = نوع | fundamental = بنیادی ، اساسی
اول بزار لیستی از دیتا تایپ های تو پایتون، توی پایتون رو بهت معرفی بکنم، فقط میخوایم به اسمشون اشنا بشیم:
- int
myAge = 18
- float
myMoney = 3.9
- str
myName = "Alireza Fazeli"
- bool
single = True
- list
- tuple
- set8
- dict
کلاس ها نمونه ای از دیتا تایپ های شخصی سازی شده هستند.
جلوتر به صورت تخصصی کلاس رو یاد میگیریم، فعلا فقط گوش ما باهاش اشنا بشه.
جلوتر به صورت تخصصی این بخش رو یاد میگیریم، فعلا فقط گوش ما باهاش اشنا بشه.
ماژول ها نمونه ای از دیتا تایپ های خاص در پایتون هستنید
خب ، مثلا فکر کنید میخواید یه برنامه بسازید ، که عملایت بعلاوه تو ریاضی رو انجام بده و ما میخوایم از مقدار قبلی توی متغیر استفاده بکنیم ، یکم گیج شدید 😂؟ منم گیج شدم بیا کدشو ببین :
numberOne = 2
numberOne = 2 + 3
کد بالارو نگاه کنید ، الان من میخوام از همون متغیر برای مقدار دهی استفاده کنم و متغیر جدیدی نیام نسازم. اما الان تو کد بالا ما اومدیم چرتو پرت نوشتیم ، اخه دو بعلاوه سه ؟ پس مقدار قبلی متغیر رو چجوری بگیریم ؟ به روش زیر :
numberOne = 2
numberOne = numberOne + 3
به همین اسونی تونستیم مقدار قبلی متغیر رو توی همون متغیر بریزیم و یک عملایت جدید انجام بدیم . ولی میتونیم این کار رو خیلی راحت تر انجام بدیم ، یک عملی هست که توی تمام های زبان های برنامه نویسی هستش ، اسم تخصصیش میشه : augmented assignment operator حالا حفظم نکردی نکردی این اسمو مهم نیست 😂😂.
numberOne = 2
numberOne += 3
خب این یعنی همون قطعه کد قبلی ولی ساده تر، اگه بخوام بگم میشه : نامبر وان بعلاوه مساوی هست با 3 . ایم سو خارجی 😎.
string = رشته |
آش رشته های برنامه نویسی، یا همون استرینگ ها (string). خب ما توی زبان های به متن ها میگیم استرینگ که معنی فارسیش میشه رشته. چرا ؟ چون حروف ها مثل رشته بهم دیگه وصل شدن، توی دنیای کامپیوتر هرکدوم این حروف یک کد باینری مخصوص خودشو داره و اینا وقتی بهم وصل میشن بهشون میگن استرینگ.
تک کوت : (Single Quote)
myName = `alireza`
دابل کوت : (Double Quote) :
myName = "Alireza"
لانگ استرینگ (Long String) : این برای چیه ؟ خب ما وقتی بخوایم متنی بلندی رو در زبان پایتون چاپ بگیریم میتونیم از لانگ استرینگ استفاده بکنیم. شما اقایون و خانوما نمیتونید از سینگل کوت و دابل کوت برای نوشتن متن های چند خطی استفاده بکنید. بریم که از لانگ استرینگ استفاده کنیم :
hayedeMusic = '''
مـیگن مستی گناه به انگشت ملامت بایـد مستـها رو حد زد به شلاق ندامت
سبوی ما شکستـه در مـیکده بستـه امـیـد همه ی ما به همت تـو بستـه
'''
اقا هایده گوش بدید موقع کد زدن، حلال حلاله 😂😂.
concatenation = الحاق | first name = اسم کوچک | last name = فامیلی |
خداوکیلی تبدیل این کلمات تخصصی سخته به فارسی. تا جایی که بشه سعی میکنم تبدیلشون بکنم ولی یکجایی نمیشه خدایی .
ما یکجا هایی نیاز داریم که دوتا استرینگ رو بهم وصل بکنیم ، مثلا من دوتا متغیر دارم که یکیش اسم من و یکیش فامیلیه منه ، خب برای اینکار باید چیکار بکنم که توی یک استرینگ بیان ؟ باید از عملی استفاده بکنیم به نام string concatenation که از عملگر ریاضی بعلاوه میاد. کد زیر رو نگاه کنید ، چیز خاصی ندار اصلا :
firstName = 'alireza'
lastName = 'fazeli'
fullName = firstName + lastName
# خروجی : alirezafazeli
# برای اینکه بتونیم متنمون رو خوشگل تر بکنیم میتونیم از متن های دیگه استفاده بکنیم :
fullName = 'Name :' + ' ' + firstName + ' . ' + 'last name :' + ' ' + lastName
# حواستون هست که باید fullName رو پرینت بگیرید ؟
print(fullName)
# خروجی : Name : alireza . last name : fazeli
خب برای اینکه بخوایم رشته رو به هم الحاق کنیم یا از متغیر ها توی رشته هامون استفاده بکنیم، واقعا سخته که بیایم هی از عملگر ریاضی (+) استفاده کنیم. پس بریم با روش خیلی خفن پایتون 3 استفاده کنیم :) .
ما میتونیم در پایتون بدون اینکه نیازی باشه از عملگر برای الحاق رشته استفاده بکنیم ، میتونیم از چیزی به نام F String استفاده کنیم.
first_name = "alireza"
last_name = "fazeli"
full_name = f"Your Full Name Is : {first_name} - {last_name}"
print(full_name)
# خروجی
# Your Full Name Is : alireza - fazeli
به همین سادگی ما میتونیم از متغیر ها در رشته هامون استفاه بکنیم و نیازی نداریم که سختی بکشیم. اول از f در اول استرینگمون استفاده میکنیم ، و بعد هرجایی که نیاز بود یه پرانتز باز میکنیم و متغیرمون رو درونش قرار میدیم .
Function : تابع
بزارید اول از همه یک چیزی رو بگم، ما قرار نیست تو پایتون یا هر زبان برنامه نویسی دیگه همه چیز رو یاد بگیریم، بلکه قرار چیزهایی رو یاد بگیریم که مورد نیازمونه و هرچیزی رو که نمیدونیم بریم سرچ بزنیم چون همه چیز کف اینترنت ریخته و ما نیاز داریم که پایه های کار رو بدونیم . 😃
یک نکته دیگه رو هم بگم اینکه فعلا کار به این نداشته باشید که تابع چیه چون که جلوتر مفصل دربارش حرف میزنم، فعلا فقط بدونید که تابع مثل یک کارخونست، یک ورودی بهش میدی و اون نسبت به اون ورودی بهت یک محصولی رو ارائه میده 💣.
این تابع از اسمش معلومه کارش چیه، اعداد رو برای ما روند میکنه یا گرد میکنه. این تابع اگه اعداد اعشاری، اعشارشون از پنج کمتر باشه، میاد رو به پایین گرد میکنه و اگه پنج یا بالاتر از پنج باشن، رو به بالا گرد میکنه. مثلا عدد 3.5 میشه 4 و عدد 3.4 میشه 3.
print(round(3.5)) # خروجی : 4
print(round(3.4)) # خروجی : 3
این فانکشن میاد علامت پشت یه عدد رو، بر میداره و برای ما خود اون عدد رو بر میگردونه به عنوان مثال اگه ما عدد (-8) داشته باشیم، این میاد (-) بر میداره و عدد 8 رو بر میگردونه.
print(abs(-8)) # خروجی : 8
Efficient : کارآمد ، موثر | Precedence : تقدم ، اولویت
در پایتون عملگر های ریاضی یک اولویت بندی دارن، دقیقا مثل ریاضی. به عنوان مثال شما قراره یک محاسباتی رو انجام بدین خب باید بدونید وقتی که دارید این محسبات رو انجام میدید بر چه اساسیه و اولویت های اون چی هستن. به ترتیب میریم جلو :
**1- () ** : خب پرانتز اولویت اول رو داره و هرچیزی که درون پرانتز قرار بگیره اولویت اول رو داره. دقیقا تمام این اولویت ها مثل ریاضی که یادگرفتین هستن.
**2- ** ** : توان ! . این عملگر همون توان در ریاضیات هستش ، با استفاده از این عملگر هر عددی رو میتونیم به توان عدد دیگری برسونیم.
print(2 ** 2) # دو به توان دو
# خروجی : 4
**3 - * ** : ضرب ! . اولویت بعدی با ضرب هستش.
print(2 * 2) # دو ضرب در دو
# خروجی : 4
**4- / ** : تقسیم ! . اولویت بعدی با تقسیم هستش ما میتونیم با این عملگر هر عددی رو تقسیم بر عدد دیگری کنیم.
print(8 / 2) # هشت تقسیم بر دو
# خروجی : 4
**5- + **: بعلاوه ! . خب بعلاوه بعلاوست دیگه 😂.
print(2 + 2) # دو بعلاوه دو
# خروجی : 4
6- ( - ) : منها ! .
print(8 - 2) # هشت منها دو
# خروجی : 6
sensitive : حساس | Variable : متغیر | Dynamic : پویا | Constant : ثابت
خب ما درباره متغیر ها یکم حرف زدیم. و حالا دقیق تر ببینیم متغیر ها چی هستن؟ متغیر ها مثل ظرف هایی هستن که داده های مارو نگهداری میکنن. به عنوان مثال کابری توی سایت من ثبت نام میکنه ، من کجا باید اسمشو نگهداری کنم و نشونش بدم؟ توی متغیر !. و خب این متغیر ها کجا ذخیره میشن؟ هر وقت که پروژمون رو ران میکنیم درون مموری کامپیوتری یه گوشه ای رو برای خودشون رزرو میکنن و داده هارو نگهداری میکنن. به صورت کلی تر، متغیر ها با یک آدرسی در یک جای مموری، فضایی رو اشغال میکنن تا value های مارو یا همون مقدار های ما یا داده های مارو درون اون فضا قرار بدن تا ما بتونیم در پروژمون ازش استفاده بکنیم.
user_name = "alireza fazeli"
# یک اسمی برای متغیر انتخاب کردیم و یک مقداری رو ریختیم توش. اسم متغیر من user_name هست .
# و مقدار من alirezafazeli
پایتون یک زبان dynamic type هستش. یعنی نیازی نیستش که ما برای اینکه متغیر تعریف کنیم به پایتون بگیم که آقا من قراره توی تو بیام استرینگ بریزم یا اینتیجر بریزم. پایتون کاری به این کارا نداره ! میگه هرچی دل تنگت میخواهد بریز تو من 😂.
پایتون یک زبان حساس به نوع نوشتاری متغیر هستش ، یعنی اینکه متغیر به نام : iq با iQ فرق داره و اگه متغیری با این دو نوع نوشتاری تعریف بکنی باهم دیگه فرق دارن، پس در نتیجه حواستون باشه ! .
به متغیر هایی در زبان برنامه نویسی گفته میشه که قرار نیست هیچوقت مقادیر درونش تغییر بکنه. به عنوان مثال عدد پی یک عدد همیشه ثابته و اون عدد : 3.14 هستش. پس در نتیجه اگه من بخوام متغیری به نام عدد پی داشته باشم این هیچوقت قرار نیست تغییر بکنه و من به عنوان یک برنامه نویس باید منظورمو یک جوری به برنامه نویس های دیگه برسونم ! با چه روشی؟ به روش زیر :
روش اول : در این روش اگه ما نام متغیرمون به صورت حروف بزرگ بنویسیم یا به اصطلاح upper case یعنی داریم میگیم که اون متغیر Constant هستش ! .
PI = 3.14 # این یکی متغیر ثابت هستش
روش دوم : اگه دو خط تیره به اول متغیرمون اضافه بکنیم یعنی داریم میگیم که این متغیر ثابت یا constant هستش.
__PI = 3.14
شاید براتون جاب باشه ولی ما میتونیم چندین متغیر رو در یک خط مقدار دهی بکنیم و نیاز نباشه بیایم برای هر متغیر در هر خط مجزا مقدار دهی بکنیم.
a, b, c = 1, 2, 3
# a = 1
# b = 2
# c = 3
در این روش همونطوری که ما به ترتیب اومدیم اسم متغیر هارو نوشتیم همونجوری به ترتیب باید مقدار دهی بکنیم که متغیر اولی مقدارش میشه همون عدد اولی. به همین آسونی !
شاید براتون سوال باشه که آیا ما میتونیم نوع داده هارو به یکدیگر تبدیل بکنیم یا نه ؟ مثلا یک استرینگ '3' رو آیا میتونیم به اینتیجر 3 تبدیل کنیم ؟ باید بگم بله این امکان پذیره !
ما با استفاده از تابع type در زبان برنامه نویسی پایتون میتونیم بفهمیم که آقا نوع این داده ما چی هستش به عنوان مثال برنامه به ما میگه خروجی شما عدد 100 هستش ! آیا این عددی که داری به من میدی 100 از نوع استرینگ هستش ("100") یا از نوع اینتیجر (100) ؟! با استفاده از این تابع ما میتونیم این موضوع رو بفهمیم.
number_one = 100
number_two = '100'
user_name = 'alireza fazeli'
is_married = True
print(type(number_one)) # خروجی : int
print(type(number_two)) # خروجی : str
print(type(user_name)) # خروجی : str
print(type(is_married)) # خروجی : bool
ما میتونیم هر داده ای رو با استفاده از تابع string تبدیل بکنیم به نوع داده string کنیم. به عنوان مثال من در کد زیر میخوام عدد 100 رو که از نوع داده اینتیجر هستش رو به استرینگ تبدیل کنم .
number_one = 100
number_two = str(number_one)
print(number_two) # خروجی : 100
print(type(number_two)) # حروجی : str
ما میتونیم هر داده ای رو با استفاده از تابع int تبدیل بکنیم به نوع داده int کنیم . به عنوان مثال من در کد زیر میخوام عدد "100" رو که از نوع داده string هستش رو به int تبدیل کنم . این تابع هم کاراییش دقیقا مثل بالایی هستش فقط با این تفاوت که نوع تبدیل داده فرق میکنه.
number_one = "100"
number_two = int(number_one)
print(number_two) # خروجی : 100
print(type(number_two)) # حروجی : int
این مورد مثل جادو میمونه، ما میتونیم از یکسری ورد های جادویی توی استرینگ هامون استفاده بکنیم . به طور کلی Escape Sequences ها یکسری دستور عمل یا دستور هستن که فرم استرینگ مارو تغیر میدن.
به عنوان مثال اگه من بخوام از دوتا تک کوتیشن یا دوتا دابل کوتیشن توی کدم استفاده بکنم نمیشه. من نمیتونم مثل کد زیر از استرینگ ها استفاده بکنم. چرا؟ اگه دقت بکنید میبینید اگه مات در درون یک کوتیشن از یک کوتیشن دیگه استفاده بکنیم انگار داریم دوتا استرینگ مجزا تعریف میکنیم و پایتون گیج میشه و میگه داداش داری چیکار میکنی ؟ 🤷♂️😐
"This is Alireza Fazeli From "Iran" " # ارور میده ❌
'This is Alireza Fazeli From 'Iran' ' # ارور میده ❌
یادتون نره برنامه نویس ها جادوگر هستن و میتونن جادو بکنن. پس بریم جادوگری یاد بگیریم.
بک اسلش ! اگه از همین اسلش ساده توی کدتون استفاده بکنید دارید به پایتون میگید که که بعد از اسلش هر چیزی اومد رو یک استرینگ در نظر بگیر نه یک دستور ناشناخته. شل کن پایتون جان :)
quote = "This Is Alireza Fazeli From \"Iran\" " # دیگه اروری نمیده و دابل کوتیشن های مارو به عنوان یک استرینگ شناخت نه به عنوان دو استرینگ مجزا !
وقتی (بک اسلش تی) توی استرینگ استفاده بشه، میاد از هرجایی که استفاده شده ، به اندازه یک تب (Tab) برای ما فاصله میندازه.
music = "کفتر کاکل به سر \t وای فای"
print(music) # خروجی : کفتر کاکل به سر وای فای
وقتی از این دستور در درون استرینگمون بیایم استفاده بکنیم ، میاد از هرجایی که استفاده شده میپره رو خط جدید ادامه استرینگ رو از خط جدید ادامه میده. معنی \n یعنی new line هستش.
music = " Nazi naz kon ke nazet \n ye sarve naze "
print(music)
# خروجی : Nazi naz kon ke nazet
# ye sarve naze
یکی از بخش های جذاب با جادوگری های جذاب همین بخش string index هستش. به طور کلی و ساده میشه گفت که استرینگ ها از حروف تشکیل شدن و این حروف ها هم در مموری جایگاهی دارن. مثلا حرف a از جمله alireza در مموری یک ادرسی و جایگاهی داره که ما میتونیم بهش دسترسی داشته باشیم. و با این حروف و اون استرینگ بازی بکنیم یا یکسری استفاده ها بکنیم.
خب چجوری میتونیم به این حروف دسترسی داشته باشیم؟ اول از همه باید گفت شمارش در برنامه نویسی از عدد 0 هستش. پس وقتی ما بخوایم به خونه یک در یک استرینگ دسترسی داشته باشیم باید از عدد 0 استفاده بکنیم.
به جایگاه های هر خونه از اون استرینگ ایندکس گفته میشه که از عدد صفر شروع میشه . حالا این ایندکس جاهای دیگه ای غیر استرینگ ها هم استفاده میشه که مهم ترین استفاده اش در list ها هستش. جلوتر به این موضوع می پردازیم.
بریم چندتا مثال حل بکنیم !
ما میخوایم به حروف a از کلمه alireza دسترسی داشته باشیم. برای این منظور باید به صورت زیر عمل کنیم.
name = "alireza"
print(name[0]) # ایندکس صفر برابر هستش با حروف اول این استرینگ
# خروجی : a
# ----------------------------
print(name[3])
# خروجی : r
حالا ما میتونیم بخش خاصی از یک استرینگ رو به راحتی برش بزنیم و بگیریم تو مشتمون. برای این منظور اول بهش میگیم که از کدوم ایندکس شروع بشه تا کدوم ایندکس ادامه داشته باشم.
name = "alireza fazeli"
print(name[0:7])
# خرجی : alireza
نکته که ای که باید در نظر داشته باشید اینه که وقتی دارید ایندکس دوم رو وارد میکنید باید یک عدد بیشتر وارد بکنید .
ما میتونیم حروف رو در string index وقتی برش میدیم و انتخاب میکنیم ، بر اساس گام ها باشه. مثلا حروف دوتا دوتا بره یا سه تا تا بره جلو تا به اون ایندکس مقصد برسه. بزارید اینجور بگم که مثلا من گفتم که از ایندکس 20 تا 50 یک استرینگ رو برای من بگیر و بیار. حالا میتونم بهش بگم وقتی داری میری از ایندکس 20 تا 50 میاری در این فاصله به صورت چندتا چندتا بیاری؟
بریم کد رو ببینیم تا بفهمیم :
quote = "123456789"
print(quote[0:6:2])
# خروجی : 135
بهش گفتم که از ایندکس 0 تا ایندکس 6 رو به صورت یکی درمیون برام بگیره و بیاره. که از عدد 1 تا 5 اگه ما یکی در میون بریم جلو، اعداد 1 ، 3 ، 5 برای ما در میاد.
ما در string index اگه خونه ای ایندکسمون رو خالی بزاریم در واقع داریم یک معنی خاصی رو به زبان پایتون میرسونیم.
- اگه خونه اول رو خالی بزاریم یعنی از ایندکس صفر شروع بکن.
- اگه خونه دوم رو خالی بزاریم یعنی اخرین خونه ایندکس ما . مثل اگه 10 تا ایندکس داشته باشیم ، خالی گذاشتن به معنای عدد 10 هستش.
- خونه سوم اگه خالی بشه یعنی یک یکی به صورت عادی ایتم های درون استرینگ رو جلو بره.
immutability : تغییر ناپذیری | greet : تبریک گفتن ، سلام دادن
یکی از بحث های بسیار مهم بحث immutability در زبان پایتون هستش که باید درکش بکنید. استرینگ ها در زبان پایتون تغییر ناپذیر هستند. به عنوان مثال ما میتونیم محتوای یک متغیر رو تغییر بدیم :
name = "alireza"
print(name)
# خروجی : alireza
name = "sasan"
print(name)
#خروجی : sasan
ولی نمیتونیم محتوای ایندکس یک استرینگ رو تغییر بدیم. به عنوان مثال من اگه یک استرینگ به نام 'alireza' تعریف کرده باشم، دیگه نمیتونیم بیام مثلا حروف اول علیرضا که a هستش رو تبدیل بکنم به z . این مورد در زبان برنامه نویسی پایتون غیر امکان پذیره که ما ساختار یک استرینگی رو تغییر بدیم. ما با استرینگ ها نمیتونیم به شکل زیر رفتار بکنیم :
name = "alireza"
name[0] = "z" # امکان تغییر ساختار یک استرینگ وجود نداره !
print(name) # خروجی : TypeError: 'str' object does not support item assignment
ما فقط میتونیم محتوای درون یک متغیر رو تغییر بدیم که تو مثال قبلی دیده بودید. تنها راه تغییر یک استرینگ اینه که ما یک استرینگ جدید ایجاد بکنیم یا به اصطلاح، produce بکنیم. جلوتر درباره این موضوع صحبت میکنیم.
این یک تابع built in یا از پیش ساخته شده در زبان پایتون هستش که کارایی های بسیار زیادی داره. ما میتونیم با استفاده از این تابع، هر چیزی که قابل اندازه گیری باشه رو اندازه گیری بکنیم. با استفاده از این تابع ما میتونیم تعداد آیتم های درون یک لیست ، آرایه ، دیکشنری ... ، یا استرینگ رو بفهمیم. منظور از تعداد آیتم های یک استرینگ همون تعداد حروف یک استرینگ هستش. مثلا کلمه alireza از چند حروف تشکیل شده !؟ .
نکته : تابع len میاد مثل یک انسان عادی برای با از 1 میشماره، نه صفر. حواستون باشه خلاصه !
بریم ببینیم چجوری کار میکنه :
name = "alireza"
last_name = "fazeli"
greet = "Ye Toop Daram Ghel ghelie !"
print(len(name)) # خروجی : 7
print(len(last_name)) # خروجی : 6
print(len(greet)) # خروجی : 27
میخوایم باهم یک پروژه تمرینی بزنیم و یکم کیف کنیم 😁. اول از همه میخوایم از کاربر یک ورودی بگیریم، بعدش بیایم تعداد مقادیر استرینگ ورودی کاربر رو محاسبه بکنیم و بعد به کاربر بگیم که داداش ، این متن تو ، این تعداد مقادیر تو، حالشو ببر دیگه. سعی کنید این مور رو خودتون انجام بدید. اگه دادید چه خوب ، اگه نتونستید سورس کد پایین رو ببینید که کامل انجامش دادم.
get_input = input("داداچ یه چیزی بنویس : ")
calc_input = len(get_input)
show_msg = f"""
داداچ متن تو این بود : {get_input}
تعداد حروفات انقدره : {calc_input}
نه جان من حال کردی؟ 💣
"""
print(show_msg)
متود ها شبیه به فانکشن ها هستن ولی متعلق به یک چیزین. برای یک چیز خاص یک کار خاصی رو انجام میدن. جلوتر به صورت کاملا مفصل درباره اینا اشنا میشیم، ولی برای شروع همینکه بدونیم متود ها برای یک سری چیزا هستن کافیه. مثلا استرینگ ها یکسری متود ها دارن که برای استرینگ ها یکسری کارهارو انجام میدن. مثلا یکی از متود ها میاد استرینگ مارو تمام حروف هاشو بزرگ میکنه یا یکی کوچیک میکنه. خلاصه هرکدوم از این استرینگ هارو بهر کاری ساخته اند !.
متود هایی که متلع به استرینگ ها در پایتون هستند رو string method میگن که مثالشو بالا براتون زدم. که چجوریاست. برای اینکه ما از این متو ها استفاده بکنیم نیازه که بعد استرینگ یا بعد از متغیر حاوی یک استرینگ بیایم اون متود رو بهش اضافه بکنیم. به عنوان مثال :
"hello".upper()
# یا
name = "alireza"
name.upper()
این متود کارش اینه که میاد حروف های استرینگ مارو به حروف های بزرگ تبدیل میکنه. مثلا اگه من در استرینگم، یک حرف a داشته باشم اون میاد تبدیلش میکنه به A . یا اگه salam داشته باشیم تبدیل میکنه به SALAM . به همین اسونی.
مثال :
name = "alireza"
letter = "j"
print(name.upper()) # خروجی : ALIREZA
print(letter.upper()) # خروجی : J
نکته : اگه شما این متود رو برای متغیر تون استفاده بکنید و اوت متغیرتون رو پرینت بگیرید. میبینید که متغیر شما هیچ تغییری نمیکنه. علتش چیه؟ علتش اینه که استرینگ همونجوری که گفته بودیم immutable هستش . شما برای اینکه محتوای درون متغیر خودتون رو تغییر بدید، باید با محتوای جدیدی که ساختیت جایگزین بکنید. شما در واقع با استفاده از این متود یک مقدار جدید produce کردید.
نحوه جایگزینی با مقدار جدید :
name = "alireza"
name = name.upper()
print(name) # خروجی : ALIREZA
الان میبینید که خروجی متغیر ما تغییر کرده.
این متود دقیقا مثل متود بالایی هستش با این تفاوت جای اینکه بیاد حروف هارو بزرگ بکنه ، کوچیک میکنه. یعنی ما اگه داشته باشیم A این میکنه a. به همین آسونی ! .
مثال :
name = "ALIREZA FAZELI"
letter = "B"
print(name.lower()) # خروجی : alireza fazeli
print(name.lower()) # خروجی : b
این متود میاد فقط اولین حروف از استرینگ مارو بزرگ میکنه. یعنی اگه ما استرینگ داشته باشیم : alireza fazeli این میاد تبدیل میکنه به Alireza fazeli .
name = "james clear"
print(name.capitalize()) # خروجی : James clear
این متود از اسمش معلومه، find،به معنای پیدا کردن. این میره توی استرینگ برای ما میگرده که آیا یک حروفی، جمله ای، کلمه ای، درون اون استرینگ برای وجود داره یا خیر. اگر وجود داشته باشه، فقط اون اولین موردی که پیدا کرد رو اون ایندکس اولش رو برای میفرسته. به عنوان مثال من یک جمله دارم : To be or not to be که توی این جمله از چند تا be تشکیل شده که من میگم برو پیدا بکن که توی استرینگ من آیا اصلا be هست ؟ این میگه اره هست ، چندتا هم هست. برای من اون ادرس ایندکس اون اولین موردی که پیدا کرد رو میفرسته. دیگه بقیه رو نمیگه، میگه به من چه، خودت برو پیدا بکن. اگر پیدا نکرد، برای ما عدد -1 رو بر میگردونه.
greet = "to be or not to be"
print(greet.find("be")) # خروجی : 3 . این عدد 3 همون ایندکس 3 هستش.
نکته : ما میتونیم به متود فایند بگیم که از کجا تا کجای استرینگ مارو بگرده به این صورت که ایندکس اول اون کلمه ای که مدنظرمونه، ایندکس دوم اینکه از کجای استرینگ یا از کدوم ایندکس بگرده، و ایندکس سوم اینکه تا کجای استرینگ و تا کدوم ایندکس بگرده.
مثال :
greet = "to be or not to be"
print(greet.find("not", 8, 12)) # خروجی : 9
این متود هر حروفی، جمله ای ، کلمه ایکه ما بهش بگیم رو توی تمام اون جمله با چیزی که ما بهش میگیم عوض میکنه. به عنوان مثال جمله to be or not to be رو در نظر بگیرید. اگه من بهش بگم که be رو به duck عوض بکن ، این میاد تمامی be هارو با duck عوض میکنه. و جمله ما میشه to duck or not to duck .
greet = "to be or not to be"
greet = greet.replace("be", "duck")
print(greet) # خروجی : to duck or not to duck
بولین ها یک نوع داده در زبان برنامه نویسی پایتون هستند. این نوع داده دوتا هم بیشتر نیست. بله ! خیر ! فقط همین ! . بله و خیر. True به معنای بله هستش و False به معنای خیر. کابرد اینا کجاست ؟ به عنوان مثال فرض بکنید که شما یک وبسایتی دارید که قراره از کاربر یکسری اطلاعاتی رو بگیرید . یکی از اون اطلاعات ها این هستش که آیا ازدواج کرده یا خیر؟ خب این جواب دو گزینه بیشتر نداره شما یا باید بگید بله یا خیر. همین ! .
is_married = True
print(is_married) # خروجی : True
is_married = False
print(is_married) # خروجی : False
prons and cons : مزایا و معایب
شاید براتون جالب باشه . ما در زبان پایتون میتونیم استرینگ هارو بدون نیاز به حلقه ها که جلوتر دربارش یاد میگیرید تکرار بکنیم. فقط کافیه اون استرینگ مورد نظر رو ضربدر اون تعداد بکنیم.
print("*" * 10) # خروجی : **********
بریم باهم یک پروژه ای بسازیم که نام کاربری مارو ازمون میگیره و بعد پسورد مارو ازمون میگیره و نسبت به تعداد حروف پسوردمون اونو برای ما مخفی میکنه و جاش * میزاره.
get_username = input("لطفا نام کاربری را وارد کنید : ")
get_password = input("لطفا پسورد خود را وارد کنید : ")
hide_password = "*" * len(get_password)
greet_to_user = f"""
سلام {get_username} پسورد {hide_password} در سیستم وارد شد. 😊
"""
print(greet_to_user)