Skip to content

arashnm80/python-tutorial

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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

0. مقدمه و آشنایی (ویدیو در یوتیوب: https://youtu.be/Rd7v9dURO6Q)

توصیه های من به شما

  1. تا میتونید زبان انگلیسیتون رو قوی کنید، به نظرم مهم ترین مهارتیه که میتونید یاد بگیرید و شما رو توی زندگیتون بیشتر از هر چیزی جلو میندازه. وقتی زبانتون خوب باشه دیگه توی هر حوزه ای (برنامه نویسی، مهندسی، پزشکی، موسیقی، ...) میتونید تبدیل به یه متخصص بشید چون به بیشمار آموزش رایگان انگلیسی که توی اینترنت وجود داره دسترسی دارید که تعدادشون خیلی خیلی بیشتر و کیفیتشون بالاتر از آموزش های فارسیه.
  2. لازم نیست خودتون رو هلاک کنید، روزی 5 دقیقه وقت بذارید ولی مداوم و هر روز وقت بذارید. ما تو دنیایی زندگی میکنیم که بیشتر آدم ها ماه ها و سال های طولانی از زندگیشون رو بدون این که هیچ چیز جدیدی یاد بگیرند سپری میکنند. تو همچین شرایطی کافیه هر روز اندازه 5 دقیقه یه چیز به درد بخور یاد بگیرید تا در دراز مدت تبدیل به یه آدم حرفه ای تو حوزه کاریتون بشید.

ویدیو های جالب مرتبط با پایتون در یوتیوب

لینک ویدیو توضیحات
https://www.youtube.com/watch?v=qQXXI5QFUfw پر کاربرد ترین زبان های برنامه نویسی از 1965 تا 2022
https://www.youtube.com/watch?v=3PcIJKd1PKU مقایسه تعداد خطوط، مدت زمان ساخت و مدت زمان اجرای یک کار یکسان با 3 زبان برنامه نویسی مختلف
https://www.youtube.com/watch?v=_-KjEgCLQFw نمونه بازی مار ساخته شده در 60 خط طی 5 دقیقه با پایتون
https://www.youtube.com/watch?v=7kGNs5R-AM8 نمونه بازی تتریس یا همون خونه سازی در 180 خط طی 9 دقیقه با پایتون

مزایای پایتون

  1. سادگی و توانایی نوشتن برنامه هایی با تعداد خطوط کم تر در زمان کوتاه تر
  2. نزدیکی به زبان انسان و سطح بالا بودن (برای مثال مدیریت حافظه به صورت خودکار انجام میشه و دیگه نیازی نیست ما کاری کنیم)
  3. توانایی ساخت برنامه برای platform های مختلف (ویندوز، مک، لینوکس، اندروید، ...)
  4. توانایی ساخت هوش مصنوعی
  5. کتاب خانه ها و ماژول های متعدد

معایب پایتون

  1. سرعت پایین در اجرای برنامه: پایتون یک زبان تفسیری هست، یعنی کد رو خط به خط اجرا میکنه، نه اینکه اول کلش رو کامپایل کنه مثل C++ یا جاوا. برای این دلیل، برنامه های بزرگ یا محاسبات سنگین (مثل پردازش داده های عظیم) توش کندتر اجرا میشن. مثلا اگر بخوایم یک بازی گرافیکی سریع بسازیم، پایتون ممکنه مناسب نباشه و نیاز به بهینه سازی با ابزارهای دیگه مثل NumPy داشته باشیم.
  2. مصرف زیاد حافظه: به خاطر طراحی انعطاف پذیرش، پایتون حافظه رم بیشتری نسبت به زبان های کم مصرف مثل C اشغال میکنه. در پروژه های خیلی بزرگ یا روی دستگاه های ضعیف (مثل موبایل های قدیمی)، این میتونه مشکل ساز بشه و برنامه رو سنگین کنه. مثلا در سرورهایی با منابع محدود، ممکنه نیاز به تنظیمات خاص پیدا کنیم.
  3. تشخیص دیرهنگام خطاها: چون پایتون تایپ دینامیک داره (یعنی نوع متغیرها رو موقع اجرا چک میکنه)، خطاهای کد (مثل اشتباه در نوع داده) تا زمان اجرا معلوم نمیشن. این کار تست و دیباگ رو سخت تر میکنه، به خصوص در تیم های بزرگ که کدهای پیچیده مینویسن. در مقابل، زبان هایی مثل جاوا خطاها رو زودتر نشون میدن.
  4. محدودیت در موبایل و گرافیک پیشرفته: پایتون برای برنامه های موبایل (مثل اپ های اندروید/iOS) خیلی قوی نیست و معمولا از ابزارهای دیگه مثل Kotlin یا Swift استفاده میشه. همچنین، برای بازی های سنگین یا GUI های پیچیده (رابط کاربری گرافیکی)، library هاش مثل Kivy خوبه اما به اندازه Unity یا C# قدرتمند نیست. threading (چند نخی) هم به خاطر GIL (قفل مفسر جهانی) ضعیفه و سرعت رو کم میکنه.
  5. وابستگی به library ها: پایتون انعطاف پذیره، اما برای کارهای خاص (مثل وب یا داده کاوی) نیاز به نصب پکیج های خارجی مثل Django یا Pandas داری. اگر library قدیمی بشه یا conflict پیش بیاد، مدیریتش دردسر میشه، به خصوص در پروژه های بزرگ.

کاربرد ها و کتاب خانه ها

  1. Natural Language Processing (پردازش زبان طبیعی)
  2. Computer Vision (پردازش تصویر)
  3. GUI (رابط کاربری گرافیکی)
  4. Game (ساخت بازی)
  5. Web (وب)
  6. Data Science (علوم داده)
  7. Math (ریاضی)
  8. Machine Learning (یادگیری ماشین)

1. نصب نرم افزار و نحوه اجرای کد ها (ویدیو در یوتیوب: https://youtu.be/zo6jQ5ZAZW8)

نصب خود پایتون روی سیستم

اگر بخواهید توی سیستم با استفاده از نرم افزار هایی مثل vscode یا pycharm کد نویسی کنید نیازه که اول از همه خود پایتون نصب باشه. اگر ویندوز 10 یا 11 داشته باشید نسبت به ویندوز های قدیمی خیلی راحت تر خواهید بود. برای دانلودش میتونید به آدرس زیر مراجعه کنید. حواستون به این نکته هم باشه که موقع نصب هر کدوم از نرم افزار ها اگر گزینه (add python to path) وجود داشت تیکش رو بزنید. اینجوری میتونید در خط فرمان هم از نرم افزارتون استفاده کنید.
https://www.python.org/downloads سایت قابلیت تشخیص سیستم عامل رو داره و وقتی توی سایت برید میتونید بسته به نیاز و سیستم عامل خودتون برنامه رو دانلود کنید

محیط های توسعه یا همون IDE ها

این محیط ها کدنویسی رو برای ما راحت تر میکنند. مثلا خط ها رو رنگ بندی میکنند یا اشکالات تایپی رو متوجه میشند. علامتهایی مثل پرانتزها، کوتیشنها، یا tab رو برای ما میذارن. در نهایت فرق اساسی و مهمی ندارند و با هر کدوم که راحت تر هستید میتونید کار کنید. پس حتی اگر ویندوز قدیمی داشتید پایتون هم داشتید، اما IDE نداشتید، غصه نخورید، میتونید با notepad هم کد رو بنویسید و با پسوند .py ذخیره کنید و برنامه رو اجرا کنید

نام برنامه لینک دانلود توضیحات
vscode https://code.visualstudio.com/Download میشه گفت در حال حاضر محبوب ترین محیط برنامه نویسی برای اکثر زبان هاست. بعد از نصبش به هر زبانی که بخواید برنامه نویسی کنید پیغام دانلود افزونه مربوط به اون زبان رو میده که از داخل خودش اگه اینترنتتون وصل باشه قابل دانلوده
pycharm https://www.jetbrains.com/pycharm/download دانلود و استفاده از نسخه کامیونیتی اش رایگانه
sololearn code playground https://www.sololearn.com/compiler-playground/python نیازی به نصب نیست و میتونید تحت وب کدتون رو اجرا کنی
Pydroid 3 - IDE for Python 3 https://play.google.com/store/apps/details?id=ru.iiec.pydroid3 میتونید توی موبایل باهاش کدنویسی کنید

دستور نمونه برای امتحان کردن محیط اجرای کد

این دستور به ما جمع دو عدد رو روی صفحه نمایش نشون میده

print(2+3)

2. گرفتن ورودی و چاپ خروجی، کار با متغیر ها، اعمال ریاضی (ویدیو در یوتیوب: https://youtu.be/buwe3yIzd3Q)

نوشتن متن روی صفحه

print("hello world!")

حالت های دیگر پرینت:

print("hello ", end = "") # نوشتن متن روی صفحه بدون رفتن به خط بعد
print("world!")
print(10 * "stop") # ده بار نوشته استاپ رو پشت هم برای ما مینویسه

کامنت گذاری

وقتی که ما میخوایم یک توضیحی رو برای خودمون بنویسیم توی کد، که بعدها که دوباره نگاهی به کد انداختیم بدونیم چجور کدی نوشتیم، از کامنت گذاری استفاده میکنیم، ما با نوشتن این پیامها به پایتون میفهمونیم که این پیام جزء کد ما نیست، پایتون ارور نده، و پایتون اون خط، یا خطوطی که ما کامنت گذاشتیم رو نادیده میگیره. و برای کامنتهای تک خطی از # استفاده میکنیم برای کامنتهای چند خطی از """ اول و آخر کامنت استفاده میکنیم

print("این خط اجرا میشه")
# print("این خط اجرا نمیشه")
# کامنت تک خطی
"""
کامنت چند خطی
کامنت چند خطی
کامنت چند خطی
"""

استفاده از متغیر

اگر بخوایم به زبان ساده متغیرها رو درک کنیم، متغیرها مثل ظرفهایی هستن که ما میتونیم درونشون مقداری وسیله بذاریم، این ظرفهای ما میتونن کلی اسم داشته باشن، فقط نباید اولین بخششون عدد باشه، باید با حروف انگلیسی شروع بشه و حروف فارسی رو قبول نمیکنه، متغیرها حافظه هم اشغال میکنن حالا اگر بخوایم بحث متغیر رو بیشتر باز کنیم، ما یک متغیر تعریف میکنیم، در لفظ ساده، یه اسم برای ظرفمون میذاریم، حالا میخوایم درون ظرفمون چیزی که لازم داریم بذاریم، مثلاً شکلات، وقتی بخوایم چیزی رو به متغیر خودمون اختصاص بدیم، از = استفاده میکنیم، یعنی بعد از نوشتن اسم متغیر، وسیله ای که دست راستمون هست رو میریزیم توی متغیر، یعنی بعد از نوشتن اسم متغیر و نوشتن = اون مقداری که میخوایم رو توی ظرفمون میذاریم ما هیچ وقت فراموش نمیکنیم که ظرفمون باید همیشه دست چپمون باشه و با دست راستمون وسیله ها رو بذاریم توی ظرف، پایتون همیشه از سمت راست، یعنی بعد از = مقدار رو میگیره، و میذاره قبل از = یعنی سمت چپ یعنی توی متغیر اینجا یه سری کد نوشته شده و متغیر رو به درستی به ما نشون داده

age = 20
print(age)
other_age = age + 1
print(other_age)

انواع متغیر ها

age = 20 # integer عدد صحیح
score = 19.25 # float عدد اعشاری
name = "Arash" # string نوشته، متن
status = False # boolean درست یا غلط. که این توی شرط گذاری هم به کار میره

همچنین میشه برای کوتاه تر شدن نوشته چند تا متغیر رو پشت سر هم تو یه خط تعریف کرد، و به همون ترتیب باید مقدارها رو هم به متغیرها اختصاص بدیم،

a, b, c = 1, 19.5, "hello"
print(a)
print(b)
print(c)

برای دور محتوای نوشته هم میتونیم از نقل قول تکی هم از نقل قول 2 تایی استفاده کنیم که بهش کوتیشن هم میگن:

a = 'hello'
b = "hello"

البته اگر از کوتیشن یکی استفاده کنیم دچار مشکل میشیم، اگر ما بخوایم یک متن به زبان انگلیسی بنویسیم، دچار مشکل میشیم اگر بخوایم مخفف بنویسیم، برای همین بیشتر از کوتیشن دوتایی استفاده میشه، اما یک راه هم هست که بشه با کوتیشن یکی مخفف بنویسیم، برنامه ای مینویسیم، که یک لیست نمره داره، از کاربر میخوایم نمرش رو بگه، اگه کوچکتر از 18 بود، بهش بگیم it's okay تا روحیش خراب نشه و بیشتر تلاش کنه

list_of_grades = [2, 5, 7, 8, 10, 13, 15, 16, 17, 18, 19, 20]
print(list_of_grades)
grade_input = int(input("please enter your grade, from 0 to 20\n".strip())) # این قسمت ورودی کاربر رو هم تمیز کردیم
if grade_input <18:
    print('it\'s okay') # در این قسمت ما با کمک \ تونستیم هم مخفف بنویسیم، هم کوتیشن یکی بذاریم
else:
    print('well done') # برای اینکه دوست داشتیم کد کامل بشه این خط رو هم اضافه کردیم

نکته ی مهم راجب متغیرها

در نام گذاری متغیر ها حواستون باشه که پایتون به حروف بزرگ و کوچک حساسه و حتی یک اشتباه کوچک باعث ارور میشه، و نباید از space بین متغیر استفاده کنید. اگر میخواید اسم دو کلمه ای بذارید.

a = "hello"
A = 3
# این 2 متغیر متفاوت از هم هستند

شکل های درست و غلط برای نام گذاری متغیر ها:

# right forms✅:
myvar = "John"
my_var = "John"
_my_var = "John"
myVar = "John"
MYVAR = "John"
myvar2 = "John"

# wrong forms❌:
2myvar = "John"
my-var = "John"
my var = "John"

گرفتن ورودی از کاربر

تا الان ما print رو یاد گرفتیم، و حالا میخوایم یک چیز جدید به اسم input یاد بگیریم، که توی این دستور ما از کاربر میخوایم که چیزی بنویسه

print("enter your age:")
age = input()
print("your age is:", age)

شما میتونید وقتی ورودی از کاربر میگیرید، ورودی کاربر رو خط بعد ببرید

test = input("این یک پیام تسته هرچی دوست دارید وارد کنید\n")

با این روش ورودی کاربر میره خط بعد یا اگر که بخوایم قبل ورودی کاربر tab بذاریم، یا در هر دستوری یا متنی اینها رو اضافه کنیم

test = input("این یه متن تست هست\t")

محاسبه سن از روی تاریخ تولد

birthday = input("enter your birthday: ")
age = 2023 - int(birthday)
print(age)

یکبار هم به جای int(birthday) بنویسید birthday تا خطایی که میده رو ببینید

توابع تبدیل نوع متغیر ها

int() # تبدیل به عدد صحیح
float() # تبدیل به عدد اعشاری
bool() # تبدیل به غیر بولین (درست یا غلط)
str() # تبدیل به متن

تبدیل جنس های مختلف متغیر ها به یک دیگر (cast):

x = str(3)    # x = '3'
y = int(3)    # y = 3
z = float(3)  # z = 3.0

تشخیص جنس متغیر ها با استفاده از type :

x = 5
y = "Arash"
print(type(x))
print(type(y))

3. شرط و عبارات منطقی (لینک ویدیو در یوتیوب: https://youtu.be/8XJP8RAbmgI)

خلاصه و توضیح راجب شرطها علاوه بر ویدیو: ما 3 نوع شرط داریم که میتونیم توی پایتون ازشون استفاده کنیم، و بیشترین کاربرد رو داره if: یعنی اگر این بود یا نبود، که ما میتونیم مقدارش رو تغییر بدیم، مثلاً اگر ما بخوایم یه کد بنویسیم که وقتی کاربر عدد یک رو توی ادیت باکس وارد کنه بهش بگه شماره ی یک برای ورود به پلی لیست ویدیوهای این آموزش، انتخاب شد

user_input = int(input("اینجا میتونید عدد وارد کنید"))
if user_input == 1: # این شرط هست و به این معناست که اگر ورودی کاربر 1 باشه
    print("شماره ی یک برای ورود به پلی لیست ویدیوهای این آموزش، انتخاب شد") # شرطها کاری که انجام میدن رو باید توی یک tab یا چهار space جلوتر بنویسیم، و وقتی شرط رو بنویسیم، در پایانش باید از : استفاده کنیم

ما میتونیم شرطها رو کاراییش رو توی همون خط هم بنویسیم، اما بهتره این کار رو انجام ندیم تا استاندارد تر باشه. elif: بعد از شرط اول، یعنی if میاد، و ما نمیتونیم همون اول کد از elif استفاده کنیم، elif یعنی: اگه شرط اولی یا شرط قبلی نبود، این کار رو بکن، مثلاً ادامه ی کد قبلی، میخوایم به برناممون بگیم که اگه کاربر عدد 10 رو وارد کرد بگیم، این خیلی عدد بزرگیه، فقط عدد یک رو باید وارد کنی، کد رو اینجا میبینیم

elif user_input == 10:
    print("این خیلی عدد بزرگیه، فقط عدد یک رو باید وارد کنی")

else: اگر همه ی این حالتها نبود، این کار رو بکن، مثلاً میگیم اگه کاربر نه عدد یک رو وارد کرد، نه عدد 10 بگیم به خاطر اینکه عدد درستی وارد نکردی برنامه بسته میشه، توی کدمون ما اگر دقت کرده باشیم ورودی رو به عدد صحیح، یا همون int تبدیل کردیم

else:
    print("به خاطر اینکه عدد درستی وارد نکردی برنامه بسته میشه")

اگر ما یک مجموع از if, بعد elif, elif, elif داشته باشیم نمیتونیم بین elif هایی که گذاشتیم else بذاریم، چون else پایاندهنده مجموع شرطهای ما باشه، تا یک زنجیره رو بهش پایان بدیم. و elif یعنی اگر این نبود، این کار رو انجام بده، پس نمیتونیم بین elif ها else بذاریم چون پایتون نمیدونه else مربوط به elif قبلی بوده یا elif بعدی، و ارور سینتکسی میده

عملیات های ریاضی

print("taghsim:", 10 / 3)
print("taghsim rond shode be paeen:", 10 // 3)
print("zarb:", 10 * 3)
print("jam:", 10 + 3)
print("tafrigh:", 10 - 3)
print("baghi mande:", 10 % 3)
print("tavan:", 10 ** 3)
print(10 * "stop") # ده بار نوشته استاپ رو پشت هم برای ما مینویسه

اگر توی یه عبارت ترکیب چند تا عملیات ریاضی باشه مشابه چیزی که تو ریاضی خوندیم اول پرانتز حساب میشه، بعد ضرب و تقسیم و نهایتا جمع و تفریق.

مقایسه

x = input("enter x:")
x = int(x)
print(x == 10) # مساوی
print(x != 10) # مخالف
print(x > 10) # بزرگ تر
print(x >= 10) # بزرگ تر یا مساوی
print(x < 10) # کوچک تر
print(x <= 10) # کوچک تر یا مساوی

عبارات منطقی

x = input("enter x:")
x = int(x)
print(x < 20 and x > 10) # و
print(x > 100 or x < -100) # یا
print(not x == 10) # برعکس

شرط

temperature = 25

if temperature > 30: # اگر
    print("hot")
    print("drink water")
elif temperature > 20: # در غیر این صورت اگر
    print("nice weather")
    print("go and play outside")
else: # در غیر این صورت
    print("cold")
print("end")

توی نوشتن شرط، اگر بخوایم شرط رو منفی کنیم، میتونیم به دو شیوه این کار رو انجام بدیم، شیوه ی اول، مثلاً ما توی یک برنامه، میخوایم بگیم اگر کاربر دیوان حافظ رو نخونده بود، و توی برنامه ما مشخص کرده باشیم که اگه متغیری که ورودی از کاربر میگیریم که مثلاً عدد 1 رو وارد کنه، تا نشون بده دیوان حافظ رو تمامش رو خونده، یا نخونده، میتونیم یک بار به این شیوه بنویسیم:

question = int(input("کاربر عزیز آیا کل دیوان حافظ رو خوندی؟ اگه خوندی عدد 1 رو توی این ادیت باکس وارد کن"))
if question != 1: # این همون شیوه ی اولی هست که اینجا گفته شد، و این طریق نوشتن شرط رو میگن چون پایه ی پایتون از زبان c++ بوده اینطوری هم شرط مینویسن.
    print("پس لطفاً هر وقت دیوان رو خوندید، دوباره به برنامه بیاید")

شیوه ی دوم:

question = int(input("دیوان حافظ رو خوندی؟ اگه آره عدد 1 رو توی ادیت باکس بنویس"))
if not question == 1: # این شیوه ی دوم هست، که به جای != قبل متغیر not به کار میبریم
    print("حیف شد، کلی جایزه از دست دادی")

برنامه چک کردن سن:

if int(age) < 0:
    print("Age is wrong.")
    print("enter another age")
elif int(age) < 18:
    print("you are a child")
elif int(age) > 100:
    print("go die")
else:
    print("You are in a good age")
print("end")

برنامه ای که چک میکنه عدد ورودی بین 0 و 20 هست یا نه (به 4 شکل مختلف انجام دادم):

x = int(input())

print("1:")
if 0 < x < 20: # اگر ایکس بین 0 و 20 بود
    print("ok")
else: # در غیر این صورت
    print("not ok")

print("2:")
if 0 < x and x < 20: # نوع دیگر نوشتن، دقیقا همون کار مدل بالایی رو میکنه
    print("ok")
else: # در غیر این صورت
    print("not ok")

print("3:")
if x < 0 or x > 20: # نوع دیگر نوشتن، دقیقا همون کار دو مدل قبلی رو میکنه
    print("not ok")
else: # در غیر این صورت
    print("ok")

print("4:")
if not(x < 0 or x > 20): # نوع دیگر نوشتن، دقیقا همون کار سه مدل قبلی رو میکنه
    print("ok")
else: # در غیر این صورت
    print("not ok")

نمونه ای از if که سر کلاس امتحان کردیم:

y = input("enter a text: ")

if y.lower() != "hello":
    print("hello back to you")
else:
    print("bye")

چک کردن زوج یا فرد بودن یک عدد:

x = input("enter your number: ")
x = int(x)

y = x % 2 # محاسبه باقیمانده تقسیم بر 2

if y == 0: # اگر باقی مانده صفر بود
    print("even")
else: # اگر باقی مانده صفر نبود
    print("odd")





گیتهاب

  • گیتهاب چیه و به جه دردی میخوره؟ چطوری تو ساخت یک فایل با دیگران مشارکت داشته باشیم و چطور درباره پروژه های دیگران نظر بدیم؟ ویدیوی ثبت نام و استفاده تو آپارات: https://aparat.com/v/mOrKl
  • آموزش pull request در گیتهاب توسط محمد کهنوی: https://www.aparat.com/v/TKckQ در گذشته، ما باید git رو نصب میکردیم تا بتونیم repository های خودمون رو مدیریت کنیم و یه سری دستورات رو، با کمک خط فرمان استفاده کنیم، اما الان گیتهاب برای دسکتاپ هم به کمک ما اومده، برنامه ی گرافیکی هست که میتونه به ما کمک کنه repository بسازیم، اونها رو مدیریت کنیم، و فقط برای بعضی چیزها مثل تغییر repository به private شخصی کردن یا publick عمومی کردن repository باید به سایت گیتهاب بریم لینک دانلود گیتهاب دسکتاپ: https://soft98.ir/internet/webmaster-tools/698-github-9c.html لینک سایت هست، که شما میتونید بسته به نیاز خودتون توی سایت فایل رو دانلود کنید یه چیز خوب دیگه ای هم که هست این هست که ربات تلگرامی هم برای گیتهاب ساخته شده که میتونیم Repository به اون ربات اضافه کنیم و پیامهای مربوط بهشون رو اونجا ببینیم، ربات معتبری هم هست طبق تحقیقات، فقط باید حساب خودمون رو بهش بشناسونیم حتی میتونیم اونجا repository خودمون رو از لیستش حذف کنیم. تا پیام دریافت نکنیم، امکان حذف از گیتهاب وجود نداره، فقط میتونیم از ربات حذفش کنیم تا پیامهای مربوط به اون رو دریافت نکنیم. لینک ربات: https://t.me/GitHubBot

ویدیو ها

  • نحوه تبدیل فایل پایتون به فایل اجرایی exe در آپارات: https://aparat.com/v/Jmneh
  • آشنایی با ساخت ربات تلگرام با telebot در پایتون: https://aparat.com/v/nJyjc روش نصب این کتابخانه:
pip install telebot

معرفی چند کتابخانه برای تبدیل فایلهای پایتون به فایل exe

1: pyinstaller روش نصب:

pip install py installer

کتابخانه ای هست که همه ی محتوای فایل رو به برنامه ی exe برای اجرا کردن توی ویندوزهای دیگه هست، که همه ی وابستگیها، کتابخانه هایی که توی یک برنامه نوشته شده رو کپی میکنه و به فایل exe تبدیل میکنه روش تبدیل فایل: باید از طریق خط فرمان یا ویندوز پاورشل اقدام کنیم از طریق خط فرمان، یا ویندوز پاورشل میریم درون پوشه ی پروژه اگر یک فایل داشته باشیم توی پوشه ی همون فایل، با ویندوز پاورشل یا خط فرمان این دستور رو وارد میکنیم

pyinstaller my_file.py

به جای my_file.py اسم فایل خودمون رو وارد میکنیم بعد از تبدیل، توی پوشه ی فایل ما یه پوشه ای به اسم: dist ساخته میشه که فایل exe هم درون اون پوشه قرار داره اگر فایلی داشته باشیم که گرافیکی باشه و نخوایم کانسول رو ببینیم، این دستور رو وارد میکنیم

pyinstaller --windowed my_file.py

اگر فایل ما یک فایل باشه این دستور رو وارد میکنیم:

pyinstaller --onefile --windowed my_file.py 

این دستور فایل رو به یک فایل تکی تبدیل میکنه که کانسول هم نداره چون گرافیکیه، به جای my_file اسم فایل خودمون رو مینویسیم. اگر فایل ما یک فایل نیست، باید بهش داده های فایلمون مثل عکس، یا صدا اضافه کنیم

pyinstaller --add-data "picture.png;." my_file.py

ما اینجا برای این به این کتابخانه مسیر ندادیم چون فرض رو بر این گرفتیم که فایلهایی که میخوایم اضافه کنیم درون پوشه هستن، کنار فایل .py اگر که درون کد مسیر موقتی نداشته باشیم باعث میشه کد بهمون ارور بده. به جای picture.png اسم فایل خودمون رو میذاریم 2: استفاده از کتابخانه ی Auto Py to Exe روش نصب کتابخانه: توجه کنید که باید نسخه ی ما بالاتر از 3.7 باشه یا خود 3.7

pip install auto-py-to-exe

برای بروز کردن این کتابخانه باید این دستور وارد بشه:

pip install --upgrade auto-py-to-exe

این کتابخانه یک کتابخانه ی گرافیکی هست که میتونیم با اجرا کردن کتابخانه با ظاهر و گرافیکش رو به رو بشیم و فایل رو تبدیل کنیم روش تبدیل کردن فایل با این کتابخانه: توی خط فرمان یا ویندوز پاورشل میریم، و این دستور رو وارد میکنیم

auto-py-to-exe

کتابخانه برای ما باز میشه، ما از بین گزینه ها یک ادیت باکس برای نوشتن مسیر میبینیم، و گزینه ی بعدی browse هست که ما میتونیم از اون طریق به فایلها دسترسی پیدا کنیم و انتخابشون کنیم بعد از انتخاب فایل، ما گزینه هایی رو میبینیم، One Directory: اگر این گزینه رو انتخاب کنیم، یک پوشه میسازه که همه ی فایلها + فایل exe درون اون هست. One File: اگر این گزینه رو انتخاب کنیم، فایل به صورت exe فقط به ما نشون داده میشه Console Based: این برای برنامه های کانسولی مناسبه، مثل برنامه هایی که با ورودیها و خروجیها سر و کار داره و گرافیکی نیست Window Based (hide the console): این گزینه برای فایلهایی هستن که گرافیکی هستن، و در اونها کانسول نشون داده نمیشه، که بسته به نیاز انتخاب میشه ادیت باکس pyinstaller --noconfirm --onedir --console: اینجا میتونیم تنظیمات بیشتری انجام بدیم، بعضی برنامه هایی که مینویسیم، با مشکل گاهی مواجه میشن، این بیشتر توی برنامه های گرافیکی، یا برنامه هایی که کتابخانه دارن پیش میاد، که میتونیم اینجا دستوراتی بنویسیم که کتابخانه رو به صورت اجبار توی کد ما بذاره و فایل رو به فایل exe تبدیل کنه اینجا گزینه های دیگه هم دیده میشه، مثل گزینه ی: Additional Files (--add-data) که میتونیم با استفاده از این گزینه داده های خودمون رو اضافه کنیم. مثل عکس، صدا و ... گزینه های دیگه مثل icon هم هستن که میتونیم باهاشون icon اضافه کنیم

کتابخانه و نکات مربوط به آن

کتابخانه ی playsound برای پخش فایلهای صوتی با فرمت wav و mp3 نصب این کتابخانه با وارد کردن دستور

pip install playsound

در ویندوز پاورشل یا خط فرمان توی پایتون نسخه های جدیدتر، اگر این دستور رو به تنهایی وارد کنیم ارور sub prosess میده، مثلاً در پایتون نسخه ی 3.13.7 هم این ارور مشاهده شده. باید یک نسخه ی پایدار نصب کنیم، playsound==1.2.2

pip install playsound==1.2.2

وقتی که بخوایم با این کتابخانه صدا پخش کنیم باید مسیر کامل رو اگر فایل کنار فایلهامون نباشه بهش بدیم، اما اگه باشه میتونیم اسم فایل رو بنویسیم، و همیشه با پوشه و کنار صداها فایل پخش کنیم، اما در تبدیل فایل به فرمت exe برای ویندوز اگر کتابخانه های دیگه استفاده نکنیم مسیر رو مشخص نکنیم باعث میشه ارور بده، یک نمونه کد با توضیح ما توی کد فرض بر این میگیریم که فایل کنار صداها نیست

import playsound # فراخوانی کتابخانه ی playsound
musick1 = "C:/Users/pixel.210/Downloads/record.mp3" # قرار دادن این موزیک توی متغیر با مسیر کامل، به جای \ میتونیم از / هم استفاده کنیم، خود پایتون اونها رو به \ تبدیل میکنه، ما میتونیم از طریق propertiz این آدرس رو متوجه بشیم و کپی کنیم و ادامش اسم فایل خودمون رو بنویسیم
playsound.playsound(musick1) # اینجا به کتابخانه ی playsound میگیم که متغیری که ما بهش صدا رو دادیم پخش کنه

حالا اگر بخوایم فرض رو بر این بگیریم که صداهای ما کنار فایل .py ما قرار داره و میخوایم پخشش کنیم، فقط کد مربوط به همون قسمت رو با هم مشاهده میکنیم

music1 = "record.mp3" # چون اینجا فایل کنار صداها هست فقط اسم فایل رو میدیم

نحوه ی ساخت یک فایل از کتابخانه های یک پروژه یا کل کتابخانه ها

اگر بخوایم که از کل کتابخانه ها یک فایل txt بسازیم که بتونیم ازش استفاده کنیم، به خط فرمان یا ویندوز پاورشل میریم، درون پوشه ای که میخوایم فایل درونش ساخته بشه اگر که توی خط فرمان دستور

pip list

رو وارد کنیم لیست کل کتابخانه ها با نسخه هاشون رو به ما نمایش میده، اما توی یک فایل txt ذخیره نمیکنه، اما اگر دستور

pip freeze >requirements.txt

رو توی خط فرمان یا ویندوز پاورشل وارد کنیم، یک فایل به اسم requirements.txt برای ما توی پوشه میسازه. >requirements.txt یعنی اینکه پایتون فایل رو بسازه، و اون فایل رو توی پوشه قرار بده. اگر بخوایم فقط کتابخانه های مربوط به یک پروژه رو توی یک فایل درست کنیم، باید اول یک کتابخانه به نام کتابخانه ی pipreqs رو نصب کنیم

pip install pipreqs

ساخت فایل با کتابخانه ی pipreqs با کمک خط فرمان یا ویندوز پاورشل به پوشه ای که پروژه درون اون قرار داره میریم، دستور

pipreqs

باعث میشه فایل requirements.txt بعد از چند لحضه ساخته بشه نکته ی قابل توجه این هست که اگر پایتون درون کامپیوتر برای همه ی کاربران نصب باشه، این دستور ارور میده و ما نمیتونیم در محیط ویندوز پاورشل یا خط فرمان، این کتابخانه رو اجرا کنیم، برای اینکه ویندوز پاورشل ما دستور pipreqs رو نمیدونه مال کدوم سیستمه و برای همین فکر میکنه یه فایل، یا یه دستور کامپیوتریه، و ارور میده، برای رفع این مشکل باید پایتون خودمون رو به لیست متغیرهای سیستم اضافه کنیم برای نصب کتابخانه های فایلی که ساختیم، به کمک خط فرمان یا ویندوز پاورشل به پوشه ای که فایل requirements.txt رو ساختیم میریم، با وارد کردن این دستور تمام کتابخانه هایی که درون فایل txt ما نوشته شده نصب میشه

pip install -r requirements.txt

اگر بخوایم مطمئن بشیم که کتابخانه های ما بروز هستن، و یا از خیلی وقت پیش فایل دست ما باشه، به کمک ویندوز پاورشل یا خط فرمان، به پوشه ی مورد نظری که فایل requirements.txt ساخته شده میریم، و این دستور رو وارد میکنیم

pip install -r requirements.txt --upgrade

شمارش در دنیای کامپیوتر و برنامه نویسی از صفر شروع میشه

01234567...
↓↓↓↓↓
Arash...

اینجا ما عضوها رو از 0 میشماریم A, عضو 0. r, عضو 1. a عضو 2. s, عضو 3. h, عضو 4. به هر کدوم از اعضا در اصطلاح پایتون اندیس هم گفته میشه همچنین:

True = 1 = وصل بودن، روشن بودن، درست بودن
False = 0 = قطع بودن، خاموش بودن، غلط بودن

توابع کار با متن

text = "Arash Nemat Zadeh"
print(text) # حالت معمولی
print(text.upper()) # حروف بزرگ
print(text.lower()) # حروف کوچک
print(text.find("Nemat")) # پیدا کردن نوشته
print("Arash" in text) # True
print("Korosh" in text) # False
print(text.replace("Arash","Korosh")) # جایگزین کردن نوشته
print(len(text)) # اندازه ی اعضای یک رشته، یا همون طول رشته، چون از 0 شروع میشه، همیشه کمتر نشون داده میشه، مثلاً اگه از یک میشماردیم 5 عضو میدیدیم، ولی اصل پایتون به ما میگه که باید از 0 بشماریم پس حالا که از 0 شماردیم 4 عضو مشاهده میکنیم، 0 به نظر پایتون یک اندیس یا همون عضو هست.
text.split("a") # برش یک حرف یا یک کارکتر از متن مورد نظر ما، که باعث میشه متن ما به یک لیست بشکنه
print(text) # خروجی. اگر که درون کوتیشن چیزی نذاریم، خودش به طور خودکار فاصله ها رو حذف میکنه
text.strip() # این تابع به ما کمک میکنه که ابتدا و انتهای متن رو مثل فاصله های اضافه، یا خطوط جدید ازش جدا کنیم، البته که ما میتونیم خودمون کارکتر مشخص کنیم، ولی وقتی توی پرانتز چیزی ننویسیم ابتدا و انتهای رشته ی ما رو برش میده، فاصله ها، خطوط اضافه، و ... تفاوتش با split این هست که بر خلاف split یک رشته رو مستقیماً بهمون برمیگردونه.
print(text) # خروجی

لیست

لیست یکی از چیزهای مفید توی پایتونه، که برنامه نویسای پایتون اسمش رو ساختمان داده گذاشتن، حالا این ساختمان داده چجوریه و چه ویژگیهایی داره؟ این ساختمان داده به ما کمک میکنه که اطلاعات ذخیره کنیم، بتونیم ازشون استفاده کنیم، ساختمان داده که میگیم جاییه که اطلاعات رو میتونیم ذخیره کنیم ویرایش کنیم اضافه کنیم و ... ساختمان داده خودش رو بخوایم بدونیم، جاییه که میتونیم چیزهای مختلف رو ذخیره کنیم، ویرایش و کار با داده توی لیست خیلی راحتتره لیست ما، مثل همه چیز توی برنامه نویسی، که قابل شمارش هستن، عضوهاش از 0 شروع میشه، که بهش میگن اندیس

names = ['arash', 'korosh', 'maryam', 'mina', 'reza']
print(names)
print(names[0]) # عضو اول
print(names[1]) # عضو دوم
print(names[-1]) # عضو آخر
names[0] = 'aaaaarash'
print(names)
print(names[0:3]) # از عضو 0 تا 2 (خود 3 جزءش نیست)
print(names)
names[1:3] = ['k', 'm'] # جایگزین کردن بخشی از لیست با یه لیست دیگه
print(names)

استفاده از توابع لیست:

numbers = [10, 20, 30, 40, 50]
print(numbers)
print(len(numbers)) # نمایش تعداد اعضا
numbers.append(60) # اضافه کردن عضو به انتها
print(numbers)
numbers.insert(2, 100) # اضافه کردن عضو جدید قبل عضو دوم
print(numbers)
print(10 in numbers) # چک کردن حضور 10 بین اعضا
print(90 in numbers) # چک کردن حضور 90 بین اعضا
numbers.remove(100) # حذف 100 از بین اعضا
numbers.clear() # پاک کردن تمام اعضا
print(numbers)
numbers.pop(40) # وقتی جای اندیسی رو نمیدونیم ولی اسمش رو میدونیم و میخوایم پاکش کنیم
numbers.dell([0]) # وقتی شماره ی اندیسی رو میدونیم و میخوایم پاکش کنیم

دیکشنری

یه ساختمان داده داریم، به اسم دیکشنری، که این دیکشنری ما مثل تاپل و لیست نیست، تاپل و لیست، هر کدوم شماره ی مخصوص دارن، هر کدوم توی یه خط نوشته میشن، اما دیکشنری اینجوری نیست، دیکشنری هر عضوش توی یه خط نوشته میشه، با چهار فاصله، یا یک tab جلوتر، هر عضوش یه خونه داره، که میره درون اون جای میگیره، خونه ی عضو ما، مثل یه ظرف میمونه، که عضو ما میره درون اون، مثلاً ما میخوایم یه پک از خوراکی درست کنیم، میگیم اگه ما بیسکویت داشته باشیم، بعد خب این بیسکویت درون یه بسته هست، اون بسته دقیقاً خونه ی دیکشنری ماست، که بیسکویتها رو درونش گذاشتیم، ما باید بین هر عضو یه دیوار بکشیم، اگه خوراکی باشه، باید قفسه قفسه بذاریم، و قفسه هامون رو با , از هم جدا کنیم، وقتی هم بخوایم یه عضو رو درون خونش بذاریم با : اختصاص میدیم فرض میکنیم ما بیسکویت داریم، کاکائو داریم، کیک داریم، شکلات کاکائویی تلخ داریم، چیپس داریم، و .... حالا میخوایم اینها رو پک کنیم، با دیکشنری میتونیم این کار رو انجام بدیم، مثلاً نوع بیسکویت و خودش رو میتونیم درونش بذاریم، نمونه ای از خوراکیهای پک شدمون رو در داده ی دیکشنری مشاهده میکنیم

pack = {
    "biscuit": "cocoa",
    "cocoa": "bar cocoa",
    "cake": "benana",
    "chocolate": "cocoa bitter",
    "chips": "vinegar"
}

اینجا ما یه پک از خوراکیها ساختیم، درونش خوراکیهامون رو با نوعش گذاشتیم، دیکشنری ما توابعش، حتی برای خروجی گرفتن ازش با بقیه ی داده ها فرق میکنه، اگر بخوایم کلش رو بهمون نشون بده

print(pack.items())

اگر بخوایم به دیکشنری خودمون داده اضافه کنیم، یا تغییر بدیم

pack.update({"jelly": "strawberry"})

باعث میشه یک خوراکی دیگه هم به خوراکیهای ما اضافه بشه.

###فرمت استرینگ: وقتی که بخوایم محاسبات، یا یه سری متغیر رو با رشته نمایش بدیم استفاده میشه، دو شیوه فرمت استرینگ داریم، شیوه ی اول شیوه ی قدیمی فرمت استرینگ هست

txt1 = "My name is {fname}, I'm {age}".format(fname = "John", age = 36)
print(txt1)

شیوه ی دوم: میخوایم برنامه ای بنویسیم که سن کاربر رو توی خروجی نشون بده و نخوایم خیلی زیاد هم خطهای کدمون رو اشغال کنیم

age = int(input("چند سالته؟"))
print(f"کاربر عزیز پس شما {age} سال دارید") # اینجا متغیری که درون آکولاد میذاریم چاپ میشه
x = input()
y = "Hello, this is our {name1} class".format(name1 = x)
print(y)

حلقه

حلقه while: وقتی که ما میخوایم یک شرط بذاریم، که ندونیم زمانش کی تموم میشه، while یعنی تکرار کن تا زمانی که.....

i = 1
while i <= 5:
    print(i)
    i = i + 1

تکرار نوشته:

i = 1
while i <= 5:
    print(i * "Bye")
    i = i + 1

استفاده از حلقه while برای ساخت دنباله فیبوناچی(دنباله ای که هر عضو اون جمع 2 تا عدد قبلیه):

a, b = 0, 1
while a < 20:
    print(a)
    a, b = b, a + b

یا مثلاً اگر بخوایم یک برنامه بنویسیم که تا زمانی که عدد مورد نظر 100 نباشه، حلقه ادامه پیدا کنه اینجا از کتابخانه ی random هم استفاده کردیم که برای انتخاب تصادفی چه اعداد، چه رشته ها ساخته شده

import random
adad = random.randint(1, 200)
while not adad == 100:
    print("عدد مورد نظر نیست")

حلقه for: این حلقه برای زمانی هست که ما میدونیم قرار هست تا چه زمانی تکرار یا شرط برقرار بشه

names = ["ali", "amin", "shabnam"]
for i in names:
    print("Salam " + i)

انجام کار کد قبل با حلقه while

i = 0
while i < len(names):
    print("Salam " + names[i])
    i = i + 1

نمایش اندازه هر کلمه در لیست با حلقه for:

my_words = ['programmer', 'git', 'vscode']
for w in my_words:
    print(w, len(w))

range

range یعنی بازه ی فاصله ی عددی، مثلاً از 0 تا 100 از 100 تا 200 و ...

numbers = range(5) # از صفر تا 4 (خود 5 شاملش نیست)
for i in numbers:
    print(i)

for i in range(5): # همون کد قبلی به صورت کوتاه تر
    print(i)

numbers = range(15, 20) # از 15 تا 19 (خود 20 نیست)
for i in numbers:
    print(i)
    
numbers = range(10, 100, 5) # از 10 تا 100 پنج تا پنج تا (خود 100 که آخریه جزءش نیست)
for i in numbers:
    print(i)
    

دنباله فیبوناچی با حلقه for:

# fibonacci series: z = x + y
# 1 1 2 3 5 8 13 21
# x y z →
#   x y z →
#     x y z →
#       x y z →

x = 1
y = 1
for i in range(10):
    print(x)
    z = x + y
    x = y
    y = z

tuple

توضیح: tuple مشابه list است با این تفاوت که به صورت قطع قابل تغییر نیست. برای اینکه وقتی بخوایم تغییرش بدیم میتونیم به یکی از ساختمان داده های قابل ویرایش مثل لیست تبدیلش کنیم و تغییراتمون رو انجام بدیم. یک ساختمان داده هست. کاربردی هم که داره توی فرمها استفاده میشه

numbers = (1, 2, 3, 4)
numbers[0] = 10 # ارور میده چون قابل تغییر نیست

تو در تو نوشتن

چاپ مقسوم علیه های اعداد 1 تا 20:

for x in range(1, 21):
    print("\n")
    print(x, end=": ")
    for i in range(1, x + 1):
        if x % i == 0:
            print(i, end=", ")

try و except مدیریت خطا توی برنامه

تا حالا ممکنه براتون پیش اومده باشه که وقتی فایل نوشتید که درون اون، برای مثال یک ورودی از کاربر خواسته باشید که عدد باشه، یا وقتی توی برنامه ی خودتون تقسیمی انجام داده باشید که باقیموندش 0 بشه بعضی افراد کنجکاو هستن، میخوان بعضی چیزها رو مخصوصاً ورودیهایی که مینویسن رو نتیجش رو حس کنن، میان گاهی یه چیز دیگه جز عدد وارد میکنن، اگه برناممون ارور بده ممکنه ازش چیزی متوجه نشن، ولی خب خیلی هم براشون جالب نمیشه، مثلاً اگه ما الان یه برنامه بنویسیم، که اگه کاربر عدد وارد نکرد، جواب مناسب بگیره عدد وارد نکنه تموم نشه، این رو با try و except میتونیم بنویسیم، میخوایم یه برنامه بنویسیم که از کاربر سؤال میکنه چقدر عدد 10 رو دوست داره و شماره های مورد نظر رو میذاریم اگر کاربر چیز دیگه ای وارد کنه برنامه ی ما ارور نمیده

try:
    hello = int(input("چقدر عدد 10 رو دوست داری؟ 1 کم 2 زیاد 3 متوسط"
except ValueError:
    print("عدد وارد نکردی برای همین برنامه تموم شد")

همیشه باید خطای دقیق رو بنویسیم

فراخوانی ماژول ها و کتاب خانه های از پیش تعریف شده

تولید عدد رندوم:

import random # فراخوانی و وارد کردن توابع مربوط تو تولید اطلاعات رندوم به برنامه

n = random.randint(1,1000) # تولید عدد رندوم از 1 تا 1000
print(n)

برای انتخاب به صورت تصادفی برای یک لیست

a = ["سلام", "خوبی", "منم خوبم"]
choose1 = random.choice(a)
print(a)

توابع

تابع مثل یک ماشین هست که یه کار رو بهش میسپاری و انجام میده، ورودی و خروجی داره، گاهی اوقات میتونه چند ورودی داشته باشه یک خروجی، یا بر عکس تابع های ما return هم میتونن داشته باشن print هم میتونن داشته باشن، اسم که براشون میذاریم، توی ورودی متغیرهاشون نیازی نیست نگران باشیم چون جهانی نشدن، توی کد به کار نرفتن، تفاوت return با print این هست که وقتی از print استفاده میکنیم نتیجه جایی ذخیره نمیشه، با اینکه نشان داده میشه، اما return نتیجه رو برای ما قابل دسترسی میکنه و میتونیم ازش استفاده کنیم با اینکه نمیبینمش تا وقتی تابع رو فراخوانی نکنیم برای جهانی کردن یک متغیر توی یک تابع، قبل از تعریف متغیر، اول باید جهانی بشه بعد تعریف بشه، مثلاً ما تابعی داریم که bmi رو حساب میکنه، آخرین متغیرش result هست، اول جهانیش میکنیم بعد ازش استفاده میکنیم

global(result)

بعد ازش استفاده میکنیم، مثلاً میگیم قد تقسیم بر وزن به توان دو. بعد میتونیم در کد و بیرون از تابعمون استفادش کنیم درسته ما ممکنه با نوشتن توابع خطوط کدهامون زیاد بشه، ولی اینجوری از تو در تو نوشتن راحت میشیم، و این فقط مزیتش نیست، کدمون شلوغ نمیشه، همه ی توابع رو اولش میسازیم، بعد فوق فوقش بعضی متغیرها رو میذاریم بیرونش توی بدنه ی کدمون که تابعمون انعتاف بیشتری داشته باشه و حتی کارمونم راحتتر بشه و بتونیم ازش در پروژه های دیگه حتی استفاده کنیم، مثلاً فرض میکنیم ما یک برنامه داریم، میخوایم برناممون چندتا کار انجام بده، مثلاً برنامه ی ما کار کارخانه ای رو مدیریت میکنه، ما درون اون کارخانه فرض میکنیم وسیله های مختلف تولید میکنیم، مثل پکهای مختلف از لباسها، مثلاً ما فرض میکنیم لباسهایی که کارخانه ی ما تولید میکنه، نخهای خاصی داره و اگر توی پکی جز پک خودش باشه بهش آسیب میرسه، در یک بخش دیگه، طبقه ی بالای کارخانه ما چند کارمند داریم که به کارمندهایی که طبقه ی پایین هستن کمک رسانی میکنن، پس اینجا یک رابطه ی مستقیم بین کارمندها برقرار میشه، توابع هم به همین شکل هستن، یک عده از کارمندها میشن تابع اول، کسانی که پکهای لباس رو برای ما تولید میکنن، ممکنه کار اینها خیلی پیچ و خم داشته باشه، از return ها و print های زیادی در تابع استفاده کنیم، اما بعد که همه ی توابع رو اول کد بسازیم، فقط باید به هر طریقی مثل شرط، حلقه، یا فراخوانیشون در جای مناسب، به هم وصلشون کنیم. اگر میخواستیم اینها رو توی کد جایگذاری کنیم، باید میگفتیم اگه این کارمند این کار رو انجام داد، کارمند شماره ی ... بره کمکش، بعد اگه اون کارمند خسته شد و این کار رو انجام داد کارمند شماره ی ... بره کمکش، و این باعث میشد شرطهای تو در تو یه کم برامون سخت بشه اگر به tab گذاری خیلی دقت نداشته باشیم و سخت باشه برامون مثال اول:

def amin():
    print("be amin khosh oomadid:")
    x = int(input())
    y = int(input())
    print(x + y)

print("Hello")
amin()
print("bye")

مثال دوم:

import math # فراخوانی توابع ریاضی به برنامه خودمون

# تابع حسین پارامتر نداره
# یه دونه ورودی از ما میگیره و فاکتوریلش رو حساب میکنه
def hossein():
    print("ye adad vared konid:")
    x = input()
    x = int(x)
    # x = math.sqrt(x) # تابع نمونه دیگری تو توابع ریاضی که رادیکال رو چاپ میکنه
    x = math.factorial(x)
    x = int(x)
    print(x)

# تابع سید 2 تا پارامتر تو ورودی میگیره و ضربشون رو چاپ میکنه
def seyed(a, b):
    z = a*b
    print(z)

# مثلا میتونیم اینطوری از تابع سید که تو بالا تعریف کردیم استفاده کنیم:
# for i in range(20):
#     x = int(input("x: "))
#     y = int(input("y: "))
#     seyed(x, y)

مثال سوم: فرض کنید کل کد مثال قبل رو توی یک فایل به اسم دلخواه مثل myfunc.py ذخیره کنیم. حالا کنارش تو همون پوشه یه فایل پایتون دیگه درست میکنیم و اگه بخوایم میتونیم از توابع قبلی بدون این که دوباره نویسی کنیم اینطوری استفاده کنیم:

from myfunc import hossein # وارد کردن تابع حسین از فایل قبلی

hossein() # اجرای تابع حسین

کلاسها در پایتون

گاهی وقتی اسم کلاس در پایتون شنیده میشه، دیده میشه، خونده میشه، ممکنه یاد کلاس درس بیفتیم، اما کلاس توی پایتون اینطور نیست، کلاس اگر بخوایم خیلی سخت بگیم، ویژگیهایی هست که میتونیم به یه کار اختصاص بدیم، اگه بخوایم آسونترش رو بگیم، کلاس مجموعی از ویژگیها هست که یه کار میتونه داشته باشه، خب حالا چرا با تابع اینجوری نمیشه نوشتش؟ برای اینکه ما اگر بخوایم برای هر کار، یه ویژگی تعریف کنیم، یا مجموعی از چند ویژگی تعریف کنیم، یه کم سخت میشه، البته که کلاس مجموعی از توابع هم میشه گفت که هست، ولی خود تابع نیست، پایتون علاوه بر اینکه میتونه برنامه های معمولی رو توی قلبش جا بده، میگه من اگه بخوام میتونم اشیاء دنیا ی شما رو هم تصور کنم، چجوری؟ پایتون میگه: من قابلیت شیء گرایی دارم، شیء گرایی یعنی چی؟ یعنی اینکه شماها وقتی میخواید چیزی بسازید، باید یه قوانینی رو رعایت کنید، حتی توی دنیای خودتون، خب چطوری این قوانین رو اینجا رعایت کنیم؟ شماها باید به عنوان اولین چیز یادتون باشه که اسم چیزایی که میسازید رو باید با اسم اون کلاسی که ساختید بنویسید. چرا؟ چون من میگم، کلاسها به ما همین اجازه رو میدن، که بتونیم از هر چیزی هر چندتا که میخوایم داشته باشیم، اولین چیز توی کلاس ساختن این هست که: پایتون قبول میکنه که اسم کلاس با حروف کوچک هم نوشته بشه، اما بهترش اینه که ما با حروف بزرگ بنویسیم، چون یکی از قانونها توی پایتون هست، اینجا ما میخوایم یک کلاس داشته باشیم که مثلاً یک جعبه ی کادویی باشه، که توش یه گوشی آیفن باشه هر مدلی که دلمون بخواد، میخوایم بسازیمش تا به کسی هدیه بدیم، اول باید ویژگیهای جعبه ی کادویی خودمون رو مشخص کنیم، به زبان پایتون فعلاً کاری نداریم، هرچی هست فارسی فکر میکنیم. میخوایم که جعبه ی ما رنگش چجوری باشه؟ ما فرض میگیریم طلایی، میخوایم جنس جعبه ی ما چجوری باشه؟ ما فرض میگیریم چوبی، میخوایم بزرگ باشه یا کوچیک باشه یا متوسط باشه؟ ما فرض میگیریم متوسط و.... هر ویژگی که باز هم خواستیم بذاریم باید اسم کلاس رو مشخص کنیم، اسمش رو میذاریم gift box

class Gift_box: # ما به پایتون گفتیم که یه کلاس بساز، یه قالب بساز که اسمش Gift_box باشه
    def __init__(self): # self مثل یک قالب هست، که ما میتونیم درونش وسیله بذاریم، میتونیم به جای self یه اسم دیگه بذاریم، ولی کسی که کد ما رو میخونه ممکنه یه کم گیج بشه، و این یه قراره بین برنامه نویسای پایتون، ما یه تابع درست کردیم، بعد با __init__ بهش فهموندیم که تو یه تابع معمولی نیستی و قراره به ما کمک کنی که یه کلاس بسازیم، ما اینجا پرانتز باز کردیم، self رو نوشتیم، پرانتز رو بستیم، بهش ویژگیهاش رو توی ورودیش ندادیم، چرا؟ برای اینکه ما توی این کلاس دوست نداشتیم که از بدنه ی کدمون ورودی بگیریم یا به کاربر قدرت انتخاب بدیم که بتونه رنگ جعبه ای که به دوستش میده عوض کنه، یا جنسش یا اندازش رو عوض کنه، ما اینجا خودمون تعیین کردیم
        self.golden = "طلایی"
        self.wooden = "چوبی"
        self.medium = "متوسط"
#     توی این سه خط، ما به قالبمون گفتیم، جعبه ای که میسازی، حتماً باید طلایی باشه، جعبمون جنسش حتماً باید چوبی باشه، و حتماً باید اندازش متوسط باشه نه خیلی کوچیک که تلفن رو نتونیم توش بذاریم، نه خیلی بزرگ که انگار توش جعبه ی شیرینی گذاشتیم، و الان تا اینجا جعبه ای که ما داریم، ویژگیهاشم خودمون مشخص کردیم و اجازه ندادیم که کسی تغییرشون بده
    def gift_box_info(self): # ما توی کلاسمون یه تابع ساختیم، گفتیم اطلاعات جعبه ی ما، ورودیش دقیقاً الان لیست ویژگیهاست، که توی self ما تعیینشون کردیم، و نمیخواستیم کلاسمون آبکی باشه و فقط همینجوری کادو رو به دوستمون بده، برای همین یه تابع ساختیم توی کلاسمون که علاوه بر اینکه بتونیم نمایش بدیم بتونیم درونش یه کار دیگه یا هر کار بخوایم بکنیم
        user_text = input("جمله ای که میخوای وقتی کادو رو به دوستت بدی اینجا بنویس\n".strip()) # الان ما درون تابعمون از کاربر جملش رو ورودی گرفتیم تمیزش کردیم، و این ورودی توی خط بعد از صحبتی که ما نوشتیم نوشته میشه، یعنی کاربر ورودیش رو دقیقاً توی اون خطی که متن ما هست نمینویسه
        return f"تو چه خوشبختی که همچین دوستی داری! دوستت بهت یک کادو داده، جعبه ی کادویی تو رنگش: {self.golden} جنسش: {self.wooden} اندازش: {self.medium} هست، و جمله ی دوستت {user_text} هست" # ما از return + format string استفاده کردیم و حتی الان تونستیم جمله ی کاربرمون رو هم به متن ویژگیهای جعبه ی کادوییش اضافه کنیم
friend = Gift_box() # اینجا ما از کلاسمون یه شیء ساختیم، یعنی الان میتونیم ازش استفاده کنیم، ما میتونستیم اگر به کلاسمون ورودی داده بودیم اینجا به شیءمون 3 تا ویژگی بدیم به خاطر اینکه ویژگیهایی که توی کلاس ساختیم 3 تا بوده، اما اینجا چون ما ورودی به کلاس ندادیم پس درون پرانتز هم چیزی ننوشتیم
result = friend.gift_box_info() # اینجا ما از این شیءی که ساختیم استفاده کردیم، یعنی صداش کردیم، وقتی شیءی رو صدا بزنیم، پایتون میفهمه که ما میخوایم یه کاری باهاش انجام بدیم یا اجراش کنیم و برای اینکه بتونیم چاپش کنیم، چاپ کردن یه شیء یعنی همون اجرا کردنش، توی یه متغیر به اسم result ریختیمش
print(result) # در این قسمت به پایتون گفتیم اون شیءی که ساختم و توی متغیر result ریختمش یادته؟ همون شیء رو برام اجرا کن.

کلاسها هم مثل تابع میتونن ورودی نگیرن از بدنه ی کد، یا از کاربر، الان اگر کد رو اجرا کنیم، ازمون جمله ای که میخوایم به دوستمون بگیم ورودی میگیره و بعدش به دوستمون کادوش با جمله های ما میده حالا یه مثال دیگه از کلاسها رو با هم میبینیم که این کلاسمون رو بهش ورودی دادیم و شیءهاش رو هم ویژگیش رو مشخص کردیم، و هردو شیء رو اجرا کردیم

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def show_info(self):
        return f"سن من {self.age} اسم من {self.name} است"
person1 = Person("علی", 18)
person2 = Person("رضا", 30)
print(person1.show_info())
print(person2.show_info())
print(Person) # اینجا کلاسمون رو چاپ میکنه

خواندن و نوشتن فایل در پایتون

مقدمه

ما در پایتون یک فایل رو با دستور ()open باز میکنیم. این دستور برای کار کردن به 2 پارامتر نیاز داره: اسم فایل و mode کار کردن. مود یا حالت کار با فایل میتونه یکی از 4 حالت زیر باشه:

"r" - Read - خواندن - حالت پیشفرض همینه که در صورت وجود نداشتن فایل ارور میده
"a" - Append - ضمیمه در انتها - اگر فایل از قبل وجود نداشته باشه اون رو میسازه
"w" - Write - نوشتن - فایل رو برای نوشتن باز میکنه و اگر از قبل وجود نداشته باشه میسازدش
"x" - Create - ساختن - فایل رو ایجاد میکنه و اگر از قبل وجود داشته باشه اررور میده

همچنین میتونیم تعیین کنیم تا با فایل به صورت نوشته رفتار بشه یا دودویی:

"t" - Text - نوشته - حالت پیشفرض، برای متون
"b" - Binary - دودویی یا باینری - مثلا برا عکس ها

مثلا فرض کنید فایلی به اسم database.txt داریم. میتونیم این فایل رو با یکی از دستور های زیر باز کنیم (چون r و t مقادیر پیشفرض هستند اجباری نیست که حتما بنویسیمشون):

f = open("database.txt")
f = open("database.txt", "rt")

خواندن فایل

از دستور ()read برای خواندن اطلاعات فایل بعد از باز کردنش استفاده میشه.
فرض کنید داخل پوشه ای که فایل پایتون اصلی مون به نام main.py وجود داره یک فایل متنی به نام database.txt با محتوای زیر وجود داره:

Hi everybody!
My name is Arash Nemat Zadeh.
What is your name?
What are your hobbies?
Who do you like to be?

حالا داخل فایل پایتونمون میتونیم کد زیر رو بنویسیم تا اطلاعات اون فایل رو بخونه و تو خروجی نمایش بده:

f = open("database.txt", "r")
print(f.read()) 

اگر این database.txt تو پوشه دیگری باشه میتونیم آدرس کاملش رو مشابه زیر بنویسیم:

f = open("C:\\Users\\Arash\\Desktop\\folder1\\folder2\\database.txt", "r")
print(f.read())

گاهی نیاز نداریم همه فایل رو بخونیم. مثلا اگر بخواهیم فقط 20 کاراکتر اول فایل رو چک کنیم این کد رو مینویسیم:

f = open("database.txt", "r")
print(f.read(20)) 

گاهی نیاز داریم فایل رو خط به خط بخونیم. هر بار که بخواهیم یک خط جدید از فایل رو بخونیم یک بار دستور ()readline رو مینویسیم. مثلا اگر بخواهیم 2 خط اول فایلمون خوانده بشه 2 بار این دستور رو به شکل زیر مینویسیم:

f = open("database.txt", "r")
print(f.readline())
print(f.readline()) 

اگر بخواهیم همه خطوط رو تک تک بخونیم میتونیم از یک حلقه for به شکل زیر استفاده کنیم:

f = open("database.txt", "r")
for x in f:
    print(x, end="") 

یا مثلا وقتی میخوایم فقط یک خط به خصوص رو بخونیم به شکل زیر عمل میکنیم (چاپ خط سوم فایل در خروجی):

f = open("database.txt", "r")
line = 1
for x in f:
    if line == 4:
        print(x, end="")
    line += 1

به عنوان یک عادت خوب در دنیای برنامه نویسی همیشه در آخر برنامه بعد این که کار تان با فایل تمام شد آن را با دستور ()close ببندید:

f = open("database.txt", "r")
print(f.readline())
f.close()

نوشتن روی فایل

با دستور ()write میتونیم اطلاعات رو توی یک فایل بنویسیم و برای استفاده در آینده ذخیره کنیم:
حالت append یعنی نوشتن در ادامه مطالب قبلی:

# comment: باز کردن فایلی جدید و اضافه کردن یک خط نوشته در انتهای آن
f = open("database2.txt", "a")
f.write("This is a line appended to the end.")
f.close()

# comment: باز کردن فایل خطوط بالاتر و خواندن خط نوشته شده
f = open("database2.txt", "r")
print(f.read()) 

حالت write یعنی پاک کردن اطلاعات قبلی و نوشتن از اول:

# comment: باز کردن فایلی جدید و نوشتن روی آن با پاک کردن اطلاعات قبلی
f = open("database3.txt", "w")
f.write("This is a line written after deleting previous ones.")
f.close()

# comment: باز کردن فایل خطوط بالاتر و خواندن خط نوشته شده
f = open("database3.txt", "r")
print(f.read()) 

هنگام استفاده از دستور ()write اگر بعد از نوشتن یک خط بخواهیم به خط بعدی برویم به شکل زیر عمل میکنیم:

my_file.write("\n")

ساخت فایل جدید

با دستور ()open به 3 حالت زیر میتونیم یک فایل جدید بسازیم:

"x" - Create - ساختن - اگر فایل از قبل وجود داشته باشد ارور میدهد
"a" - Append - ضمیمه کردن - اگر فایل از قبل وجود نداشته باشد آن را میسازد
"w" - Write - نوشتن - اگر فایل از قبل وجود نداشته باشد آن را میسازد

حذف فایل

برای حذف فایل ماژول os را به برنامه اضافه کرده و از دستور ()remove استفاده میکنیم:

import os
os.remove("database.txt") 

اگر فایل وجود نداشته باشد ولی بخواهیم آن را با دستور قبلی حذف کنیم ارور میگیریم. برای جلوگیری از این ارور میتوانیم اول بررسی کنیم که فایل وجود دارد یا نه:

import os
if os.path.exists("database.txt"): # اگر فایل وجود داشت
  os.remove("database.txt")
else: # اگر فایل وجود نداشت
  print("The file does not exist") 

حذف پوشه

به روش زیر میتوانیم یک پوشه را حذف کنیم:

import os
os.rmdir("folder1") 

ساخت رابط کاربری یا GUI با استفاده از tkinter

نصب tkinter با وارد کردن کد زیر در ترمینال:

pip install tk

ساخت پنجره ساده:

from tkinter import * # وارد کردن کل اجزای ماژول تکینتر به برنامه

window = Tk() # ساخت پنجره

window.mainloop() # نمایش پنجره

تغییر ابعاد پنجره و محل قرار گرفتنش:

from tkinter import * # وارد کردن کل اجزای ماژول تکینتر به برنامه

window = Tk() # ساخت پنجره

# تنظیم ابعاد به فرمت زیر
# widthxheight+x+y
# میتونیم 2 تای آخر یا اصلا هر 4 تا رو ننویسیم
window.geometry("800x400+50+10")

window.mainloop() # نمایش پنجره

اضافه کردن label ها به صفحه:

from tkinter import * # وارد کردن کل اجزای ماژول تکینتر به برنامه

window = Tk() # ساخت پنجره

# تنظیم ابعاد به فرمت زیر
# widthxheight+x+y
# میتونیم 2 تای آخر یا اصلا هر 4 تا رو ننویسیم
window.geometry("800x400+50+10")

label1 = Label(window, text="Arash") # ساخت یک لیبل با نوشته دلخواه
label1.place(x = 10, y = 30) # قرار دادن لیبل در جای دلخواه

label2 = Label(window, text="Korosh") # ساخت یک لیبل با نوشته دلخواه
label2.pack(padx=5, pady=2) # قرار دادن لیبل با فاصله گذاری خودکار
label3 = Label(window, text="Ali") # ساخت یک لیبل با نوشته دلخواه
label3.pack(padx=5, pady=2) # قرار دادن لیبل با فاصله گذاری خودکار
label4 = Label(window, text="Reza") # ساخت یک لیبل با نوشته دلخواه
label4.pack(padx=5, pady=2) # قرار دادن لیبل با فاصله گذاری خودکار

label5 = Label(window, text="Maryam", font = ("Times", 20)) # تغییر سایز و فونت
label5.place(x = 500, y = 300)

label6 = Label(window, text = "Zahra", fg="blue", bg="yellow") # تنظیم رنگ نوشته و پس زمینه
label6.pack()

window.mainloop() # نمایش پنجره

ساخت Entry یا جای خالی تک خطی:

from tkinter import * # وارد کردن کل اجزای ماژول تکینتر به برنامه

win = Tk() # ساخت پنجره

entry1 = Entry(win) # ساخت جای خالی یک خطی برای نوشته
entry1.pack()

win.mainloop() # نمایش پنجره

قرار دادن یک label سمت چپ و یک entry سمت راست:

from tkinter import * # وارد کردن کل اجزای ماژول تکینتر به برنامه

win = Tk() # ساخت پنجره

entry1 = Entry(win) # ساخت جای خالی یک خطی برای نوشته
entry1.pack(side=RIGHT) # قرار دادن سمت راست

label1 = Label(win, text="my label")
label1.pack(side=LEFT) # قرار دادن سمت چپ

win.mainloop() # نمایش پنجره

برای علاقه مندان: بازی با حالت های دیگر چیدمان (زبانش فرانسویه ولی مهم نیست. میتونید به کد هاش نگاه مختصر بندازید و بعد چک کنید ببینید حاصل چه چیدمانی شده): https://infoforall.fr/python/python-act110.html

قرار دادن button (دکمه) کنار entry که با زدن روش متن داخلش رو تو ترمینال چاپ میکنه:

from tkinter import * # وارد کردن کل اجزای ماژول تکینتر به برنامه

def myfunc():
    text = entry1.get() # دریافت نوشته از entry
    print(text) # چاپ نوشته در ترمینال

win = Tk() # ساخت پنجره

entry1 = Entry(win) # ساخت جای خالی یک خطی برای نوشته
entry1.pack()

btn1 = Button(win, text="print", command=myfunc) # تعریف دستور برای زمان کلیک شدن دکمه
btn1.pack()

win.mainloop() # نمایش پنجره

حالا کد قبلی رو تغییر میدیم تا به جای چاپ تو ترمینال به صورت messagebox (پیغام) روی صفحه به ما نشون بده:

from tkinter import * # وارد کردن کل اجزای ماژول تکینتر به برنامه
from tkinter import messagebox # اضافه کردن ماژول پیغام به برنامه

def myfunc():
    text = entry1.get() # دریافت نوشته از entry
    messagebox.showinfo("my title", text) # نشان دادن پیغام در صفحه

win = Tk() # ساخت پنجره

entry1 = Entry(win) # ساخت جای خالی یک خطی برای نوشته
entry1.pack()

btn1 = Button(win, text="print", command=myfunc) # تعریف دستور برای زمان کلیک شدن دکمه
btn1.pack()

win.mainloop() # نمایش پنجره

نمونه استفاده از grid در tkinter پایتون: https://www.pythonguis.com/tutorials/create-ui-with-tkinter-grid-layout-manager/

تشخیص چهره با opencv و deepface

آموزش برگرفته از:

pip install opencv-python
pip install --no-deps deepface

کد:

import threading

import cv2
from deepface import DeepFace

cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)

cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)

counter = 0

reference_img = cv2.imread("reference.jpg")  # use your own image here

face_match = False


def check_face(frame):
    global face_match
    try:
        if DeepFace.verify(frame, reference_img.copy())['verified']:
            face_match = True
        else:
            face_match = False
    except ValueError:
        face_match = False


while True:
    ret, frame = cap.read()

    if ret:
        if counter % 30 == 0:
            try:
                threading.Thread(target=check_face, args=(frame.copy(),)).start()
            except ValueError:
                pass
        counter += 1
        if face_match:
            cv2.putText(frame, "MATCH!", (20, 450), cv2.FONT_HERSHEY_SIMPLEX, 2, (0, 255, 0), 3)
        else:
            cv2.putText(frame, "NO MATCH!", (20, 450), cv2.FONT_HERSHEY_SIMPLEX, 2, (0, 0, 255), 3)

        cv2.imshow('video', frame)

    key = cv2.waitKey(1)
    if key == ord('q'):
        break

cv2.destroyAllWindows()

About

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

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 11