My folder vip
76 subscribers
202 photos
82 videos
622 files
499 links
آرشیو یادگیری هک/امنیت

اینجا فولدر شخصی من برای یادگیری و ثبت مطالب Linux، Networking و Cyber Security است.

🔐 LPIC | Network+ | CEH | SANS
🐧 Linux & System Administration
🌐 Networking & Troubleshooting
💻 Python & Security Tools
🧪 Labs | CTF | Prac
Download Telegram
My folder vip
🐍 فصل پنجم — پایتون مقدماتی — ساختار داده —————————————- 1️⃣ لیست — list لیست را زمانی استفاده می‌کنیم که بخواهیم چند مقدار را کنار هم نگه داریم و امکان تغییر آنها را داشته باشیم. مثلاً سن چند نفر: ages = [20, 10, 1, 15, 16] هر عضو یک Index دارد. ⚠️ نکته…
1️⃣7️⃣ get()
روش دیگر برای گرفتن مقدار:
print(student.get("age"))

خروجی:
20

تفاوت مهم این دو:
student["phone"]

اگر phone وجود نداشته باشد، KeyError می‌گیریم.
اما:
student.get("phone")

اگر وجود نداشته باشد، به‌صورت پیش‌فرض:
None

برمی‌گرداند.
حتی می‌توانیم مقدار جایگزین تعیین کنیم:
print(student.get("phone", "Not Found"))

اگر phone وجود نداشته باشد:
Not Found


————————————

1️⃣8️⃣ تغییر مقدار Dictionary
مثلاً:
student["name"] = "Reza"

حالا:
print(student["name"])

می‌شود:
Reza



—————————-

1️⃣9️⃣ اضافه کردن Key جدید
مثلاً:
student["phone"] = "09132565464"

حالا Dictionary شامل phone هم می‌شود.
نکته جالب:
اگر Key از قبل وجود داشته باشد:
student["age"] = 25

مقدار قبلی تغییر می‌کند.
اگر Key وجود نداشته باشد:
student["phone"] = "..."

یک مورد جدید اضافه می‌شود.

——————————-

2️⃣0️⃣ حذف از Dictionary
با del:
del student["age"]

Key و مقدار مربوط به آن حذف می‌شوند.


pop()
می‌توانیم مقدار حذف‌شده را هم دریافت کنیم:
a = student.pop("phone")

print("a is", a)

یعنی:
phone
را حذف کن و مقدارش را داخل

a
قرار بده.


————————————

🔥 حالا مهم‌ترین سؤال: کِی از کدام استفاده کنیم؟
این قسمت را خیلی خوب یاد بگیر:
🟢 List
وقتی:
چند داده داریم، ترتیب برایمان مهم است و می‌خواهیم بتوانیم آنها را تغییر دهیم.

مثلاً:
servers = ["server1", "server2", "server3"]

—————————

🔵 Tuple
وقتی:
چند داده داریم، ترتیب مهم است ولی نمی‌خواهیم داده‌ها تغییر کنند.

مثلاً:
server = ("192.168.1.10", 22, "SSH")

———————-

🟡 Set
وقتی:
فقط اعضای منحصربه‌فرد برایمان مهم هستند و تکراری نمی‌خواهیم.

مثلاً:
blocked_ips = {
"1.1.1.1",
"2.2.2.2",
"1.1.1.1"
}

IP تکراری حذف می‌شود.


—————————————-


🔴 Dictionary
وقتی:
می‌خواهیم هر داده یک اسم/کلید داشته باشد.

مثلاً:
server = {
"ip": "192.168.1.10",
"port": 22,
"service": "SSH"
}

خیلی راحت می‌توانیم بگوییم:
server["ip"]



——————————-

🧠 یک مثال امنیتی که هر 4 تا را با هم ببینیم
فرض کن اطلاعات یک سرور را داریم:
server = {
"name": "WebServer",
"ip": "192.168.1.10",
"ports": [22, 80, 443],
"protocols": ("SSH", "HTTP", "HTTPS"),
"users": {"ali", "reza", "ali"}
}

اینجا:
dict → اطلاعات کلی سرور
list → پورت‌ها چون ترتیب/لیست‌بودن و تغییرپذیری می‌تواند مهم باشد
tuple → پروتکل‌های ثابت
set → کاربران بدون تکرار
این دقیقاً جایی است که Data Structures در پروژه‌های واقعی شبکه و امنیت کاربرد پیدا می‌کند. 🔥
🐍 فصل ششم — پایتون مقدماتی — control flow
—————————————-
Control Flow یعنی کنترل جریان اجرای برنامه.
تا قبل از این، برنامه معمولاً خط‌به‌خط اجرا می‌شد:
print("A")
print("B")
print("C")

اما با شرط‌ها می‌توانیم بگوییم:
اگر این اتفاق افتاد، این کار را انجام بده؛ وگرنه کار دیگری انجام بده.


=================

1️⃣ if — شرط
مثلاً می‌خواهیم نمره را بررسی کنیم:
score = int(input("Enter your score: "))

if score > 50:
print("Afarin")

یعنی:
اگر

score
بزرگ‌تر از 50 بود،

Afarin
را چاپ کن.

⚠️ دو نکته مهم
در جزوه نوشته بودی:
if score > 50;

❌ اشتباه است.
باید : باشد:
if score > 50:

و دستور داخل if باید Indentation داشته باشد:
if score > 50:
print("Afarin")

===============

2️⃣ if / else
اگر بخواهیم برای حالت غلط هم کاری انجام دهیم:
score = int(input("Enter your score: "))

if score > 50:
print("Afarin")
else:
print("Niyaz be talash")

یعنی:
اگر score > 50
↓
آفرین

در غیر این صورت
↓
نیاز به تلاش



>=
اگر بنویسیم:
if score >= 50:

یعنی:
بزرگ‌تر از 50 یا مساوی 50

پس خود 50 هم قبول می‌شود.
تفاوت:
> 50   → خود 50 قبول نیست
>= 50 → خود 50 هم قبول است

====================

3️⃣ Nested If — شرط تو در تو
مثالی که نوشتی مربوط به Login بود:
user = input("Enter user: ")
password = input("Enter pass: ")

if user == "admin":
if password == "1234":
print(f"Welcome {user}")
else:
print("Password eshtebah")
else:
print("User eshtebah")

اینجا دو شرط داریم.
اول:
if user == "admin":

اگر Username درست بود، می‌رود سراغ Password:
if password == "1234":

اگر هر دو درست باشند:
Welcome admin

اگر Username درست باشد ولی Password اشتباه باشد:
Password eshtebah

و اگر Username اشتباه باشد:
User eshtebah



==================

4️⃣ elif
گاهی بیشتر از دو حالت داریم.
مثلاً می‌خواهیم بر اساس نمره Grade تعیین کنیم:
score = int(input("Enter your score: "))

grade = ""

if score >= 90:
grade = "A"
elif score >= 80:
grade = "B"
elif score >= 70:
grade = "C"
else:
grade = "F"

print(grade)

⚠️ یک اشتباه در جزوه:
نوشته بودی:
elif score => 80:

❌ اشتباه
درست:
elif score >= 80:




🧠 elif چطور کار می‌کند؟
Python شرط‌ها را از بالا به پایین بررسی می‌کند.
مثلاً:
score = 95

اول بررسی:
score >= 90

درست است → A
دیگر سراغ:
elif score >= 80
elif score >= 70

نمی‌رود.
یعنی وقتی یک شرط درست شد، آن شاخه اجرا می‌شود و زنجیره شرط تمام می‌شود.




🔥 چرا ترتیب elif مهم است؟
مثلاً این کد را ببین:
score = 95

if score >= 70:
grade = "C"
elif score >= 80:
grade = "B"
elif score >= 90:
grade = "A"

اینجا 95 >= 70 درست است.
پس همان اول C می‌شود! 😄
بنابراین باید از بزرگ‌ترین شرط به کوچک‌ترین شرط برویم:
if score >= 90:
grade = "A"
elif score >= 80:
grade = "B"
elif score >= 70:
grade = "C"
else:
grade = "F"



=================

5️⃣ Short-Hand If — شرط یک‌خطی
برای شرط‌های ساده می‌توانیم از حالت کوتاه استفاده کنیم.
مثلاً:
age = 20

status = "old" if age >= 50 else "young"

print(status)

چون:
20 >= 50

غلط است، نتیجه:
young

ساختار کلی:
value_if_true if condition else value_if_false

مثلاً:
result = "Pass" if score >= 50 else "Fail"

یعنی:
اگر نمره حداقل 50 بود

Pass
، وگرنه

Fail
.





===================
My folder vip
🐍 فصل ششم — پایتون مقدماتی — control flow —————————————- Control Flow یعنی کنترل جریان اجرای برنامه. تا قبل از این، برنامه معمولاً خط‌به‌خط اجرا می‌شد: print("A") print("B") print("C") اما با شرط‌ها می‌توانیم بگوییم: اگر این اتفاق افتاد، این کار را انجام بده؛…
🔐 مثال کاربردی برای مسیر امنیت
فرض کن می‌خواهیم بررسی کنیم یک IP در لیست IPهای مجاز هست یا نه:
allowed_ips = {
"192.168.1.10",
"192.168.1.20",
"192.168.1.30"
}

ip = input("Enter IP: ")

if ip in allowed_ips:
print("Access Granted")
else:
print("Access Denied")

اینجا شرط داریم:
ip in allowed_ips

که نتیجه‌اش True یا False می‌شود.
این نوع منطق را بعداً در اسکریپت‌های شبکه و امنیت خیلی زیاد می‌بینی.
🐍 فصل هفتم — پایتون مقدماتی — Control Flow Loops
—————————————-
Loop یعنی حلقه؛ یعنی یک قسمت از برنامه را چندین بار اجرا کنیم.
مثلاً به جای اینکه 5 بار بنویسیم:
print("Hello")
print("Hello")
print("Hello")
print("Hello")
print("Hello")

می‌توانیم از حلقه استفاده کنیم.

==========================

1️⃣ حلقه for
for زمانی خیلی کاربردی است که بخواهیم روی اعضای یک مجموعه یکی‌یکی حرکت کنیم.
مثلاً:
miveha = ("apple", "banana", "cherry")

for mive in miveha:
print(mive)

خروجی:
apple
banana
cherry

نحوه کار
Python می‌گوید:
miveha
↓
apple → print
banana → print
cherry → print

ساختار کلی:
for variable in collection:
code

یعنی:
برای هر عضو داخل collection، این کد را اجرا کن.


===================

2️⃣ for روی Dictionary
مثلاً:
person = {
"name": "Ali",
"age": 25
}

اگر بخواهیم هم Key و هم Value را بگیریم:
for key, value in person.items():
print(f"{key} = {value}")

خروجی:
name = Ali
age = 25

.items() چیست؟
person.items()

باعث می‌شود Key و Value را با هم دریافت کنیم.
یعنی تقریباً:
name → Ali
age → 25

==============

3️⃣ range()
یکی از مهم‌ترین چیزهایی که در for استفاده می‌شود:
range()

مثلاً:
for i in range(5):
print(i)

خروجی:
0
1
2
3
4

⚠️ نکته مهم:
range(5) از 0 تا قبل از 5 است.
یعنی:
0, 1, 2, 3, 4

پس 5 خودش چاپ نمی‌شود.

======================

4️⃣ حلقه while
while یعنی:
تا زمانی که شرط درست است، حلقه را ادامه بده.

مثلاً:
counter = 0

while counter < 10:
print("Hello bro")
counter += 1

اینجا:
counter = 0

شروع می‌شود.
هر بار:
counter += 1

یک واحد به آن اضافه می‌شود.
پس:
0
1
2
3
...
9

وقتی به 10 برسد:
counter < 10

دیگر False می‌شود و حلقه تمام می‌شود.
====================

⚠️ چرا counter += 1 مهم است؟
اگر این را ننویسیم:
counter = 0

while counter < 10:
print("Hello")

حلقه هیچ‌وقت به 10 نمی‌رسد!
چون counter همیشه 0 باقی می‌ماند.
پس یک Infinite Loop یا حلقه بی‌نهایت خواهیم داشت.

==================

5️⃣ while True
مثلاً:
while True:
print("Hello bro")

اینجا شرط همیشه:
True

است.
بنابراین حلقه خودش هیچ‌وقت تمام نمی‌شود.
برای متوقف کردن چنین حلقه‌ای معمولاً از break استفاده می‌کنیم.


===================

6️⃣ مثال گرفتن نام 10 دانش‌آموز

students = []
counter = 0

while counter < 10:
student = input("Enter name: ")
students.append(student)
counter += 1

print(students)

for name in students:
print(name)

اینجا:
students = []

لیست خالی است.
بعد:
student = input(...)

نام را داخل یک متغیر موقت می‌گیریم.
و:
students.append(student)

نام را به لیست اضافه می‌کنیم.
در نهایت 10 نفر داریم.


===================

🛑 7️⃣ break
break یعنی:
کلاً از حلقه خارج شو.

مثلاً همان برنامه دانش‌آموزها را در نظر بگیر.
فرض کن می‌گوییم اگر کاربر 0 وارد کرد، دیگر اسم بیشتری نگیریم:
students = []

while True:
student = input("Enter name: ")

if student == "0":
break

students.append(student)

print(students)

حالا اگر کاربر وارد کند:
Ali
Reza
Mohammad
0

وقتی 0 وارد شود:
if student == "0":
break

اجرا می‌شود و کل حلقه تمام می‌شود.
نتیجه:
['Ali', 'Reza', 'Mohammad']

خود 0 هم وارد لیست نمی‌شود.
🧠 حفظ کن:
break
↓
خروج کامل از حلقه 🛑



===================
🔄 8️⃣ continue
continue با break فرق دارد.
continue می‌گوید:
این تکرار را رها کن و برو سراغ تکرار بعدی.

مثلاً:
students = []

while len(students) < 5:
student = input("Enter name: ")

if student == "0":
continue

students.append(student)

print(students)

فرض کنیم:
Ali
0
Reza
Mohammad
...

وقتی 0 وارد شود:
continue

اجرا می‌شود.
یعنی:
این ورودی را بی‌خیال شو و دوباره برو اول حلقه.

پس 0 به لیست اضافه نمی‌شود، ولی حلقه تمام هم نمی‌شود.
تفاوت اصلی:
break
↓
کل حلقه تمام می‌شود 🛑

ولی:
continue
↓
فقط این دور از حلقه رد می‌شود
↓
دور بعدی 🔄




===========

9️⃣ مثال خیلی ساده برای تفاوت break و continue
break
for i in range(5):
if i == 3:
break

print(i)

خروجی:
0
1
2

وقتی به 3 رسید، کل حلقه تمام شد.

—————-
continue
for i in range(5):
if i == 3:
continue

print(i)

خروجی:
0
1
2
4

وقتی به 3 رسید:
فقط چاپ 3 را رد کرد و رفت سراغ 4



=====================

🟡 10️⃣ pass
pass یعنی:
فعلاً هیچ کاری انجام نده.

مثلاً:
for i in range(5):
if i == 3:
pass

print(i)

خروجی:
0
1
2
3
4

pass حلقه را متوقف نمی‌کند.
حتی تکرار را هم رد نمی‌کند.
فقط یک دستور خالی است.



pass
کجا کاربرد دارد؟
گاهی هنوز نمی‌دانیم قرار است داخل یک شرط یا تابع چه کدی بنویسیم.
مثلاً:
if score > 90:
pass
else:
print("Try again")
یعنی:
اگر نمره بیشتر از 90 شد، فعلاً هیچ کاری نکن.
بعداً می‌توانیم کد واقعی را جای pass بگذاریم.
My folder vip
🐍 فصل هفتم — پایتون مقدماتی — Control Flow Loops —————————————- Loop یعنی حلقه؛ یعنی یک قسمت از برنامه را چندین بار اجرا کنیم. مثلاً به جای اینکه 5 بار بنویسیم: print("Hello") print("Hello") print("Hello") print("Hello") print("Hello") می‌توانیم از حلقه استفاده…
🔐 یک مثال امنیتی
فرض کن می‌خواهیم IPها را بررسی کنیم:
ips = [
"192.168.1.10",
"192.168.1.20",
"192.168.1.30"
]

for ip in ips:

if ip == "192.168.1.20":
continue

print(f"Scanning {ip}")

خروجی:
Scanning 192.168.1.10
Scanning 192.168.1.30

IP دوم را Skip کردیم.
اگر به جای continue می‌نوشتیم:
break

به محض رسیدن به IP دوم، کل اسکن متوقف می‌شد.
این منطق در اسکریپت‌های شبکه و امنیت خیلی کاربردی است. 🔥
👍1
🐍 فصل هشتم — پایتون مقدماتی —Functions
—————————————-
1️⃣ Function چیست؟
Function یا تابع یک بخش از کد است که یک کار مشخص انجام می‌دهد و می‌توانیم هر وقت خواستیم آن را صدا بزنیم.
مثلاً:
def print_1_4():
print("1")
print("2")
print("3")
print("4")

print_1_4()

خروجی:
1
2
3
4

یعنی به جای اینکه این 4 خط را هر بار تکرار کنیم، یک بار داخل تابع می‌نویسیم و هر چند بار خواستیم:
print_1_4()

صدا می‌زنیم.
🧠 مفهوم اصلی
یک بار بنویس، هر چند بار خواستی استفاده کن.


———————-

2️⃣ ساختار Function
ساختار کلی:
def function_name():
# code

مثلاً:
def hello():
print("Hello")

⚠️ صرفاً تعریف تابع باعث اجرای آن نمی‌شود.
برای اجرا باید آن را Call کنیم:
hello()


——————————

3️⃣ تابع با Parameter
می‌توانیم اطلاعاتی را به تابع بدهیم.
مثلاً:
def plus(x):
print(x)

plus(5)

اینجا:
x → Parameter
5 → Argument

یعنی x یک جای خالی است که هنگام اجرای تابع مقدار می‌گیرد.
اگر:
plus(10)

باشد، x می‌شود 10.

———————————

4️⃣ return چیست؟
این قسمت خیلی مهم است. 🔥
return یعنی:
نتیجه تابع را به جایی که تابع را صدا زده‌ایم برگردان.

مثلاً:
def plus(x):
return x + 10

حالا:
a = plus(5)

print(a)

خروجی:
15

اینجا اتفاقی که افتاده:
plus(5)
↓
5 + 10
↓
15
↓
a

پس:
a = plus(5)

یعنی نتیجه‌ای که تابع return کرده داخل a ذخیره می‌شود.

————————

⚠️ تفاوت print و return
این دو را خیلی خوب یاد بگیر.
print
فقط نتیجه را نمایش می‌دهد:
def plus(x):
print(x + 10)

a = plus(5)

اینجا 15 چاپ می‌شود، اما تابع چیزی برای ذخیره کردن در a برنمی‌گرداند.
عملاً:
a = None


———————
return
نتیجه را برمی‌گرداند:
def plus(x):
return x + 10

a = plus(5)

print(a)

اینجا:
a = 15

🧠 حفظی:
print → نمایش بده 🖥

return → نتیجه را برگردان ↩️


——————————-

5️⃣ return اجرای تابع را تمام می‌کند
مثلاً:
def test():
print("A")
return
print("B")

خروجی:
A

چون بعد از return دیگر ادامه تابع اجرا نمی‌شود.

——————————

6️⃣ *args
حالا می‌رسیم به کدی که نوشتی:
def sum_all(*args):
total = 0

for num in args:
total += num

return total

اینجا *args یعنی:
تابع می‌تواند هر تعداد آرگومان دریافت کند.

مثلاً:
print(sum_all(1, 2, 3))

نتیجه:
6

یا:
print(sum_all(10, 20, 30, 40, 50))

نتیجه:
150

—————————-

*args داخل تابع چه شکلی است؟
مثلاً:
sum_all(10, 20, 30)

تقریباً می‌توانیم تصور کنیم:
args = (10, 20, 30)

یعنی args به شکل یک Tuple در اختیار تابع قرار می‌گیرد.
بعد:
for num in args:
total += num

یکی‌یکی اعداد را جمع می‌کند.


———————-

7️⃣ مثال کاربردی
فرض کن می‌خواهیم مجموع چند نمره را حساب کنیم:
def sum_scores(*scores):
total = 0

for score in scores:
total += score

return total

result = sum_scores(18, 19, 15, 20)

print(result)

خروجی:
72

—————————

🧵 بخش دوم — String Methods
حالا می‌رسیم به متدهای مهم String.
فرض کنیم:
name = "python programming"



8️⃣ lower()
همه حروف را کوچک می‌کند:
print(name.lower())

مثلاً:
PYTHON

تبدیل می‌شود به:
python



9️⃣ upper()
همه حروف را بزرگ می‌کند:
print(name.upper())

🔟 دسترسی به کاراکتر
print(name[0])

اولین کاراکتر را می‌دهد.
⚠️ Index از 0 شروع می‌شود.
مثلاً:
python
012345

پس:
name[0]  # p
name[1] # y
name[2] # t



1️⃣1️⃣ startswith()
بررسی می‌کند رشته با چه چیزی شروع می‌شود:
print(name.startswith("py"))

اگر شروع شود:
True

اگر شروع نشود:
False



1️⃣2️⃣ endswith()
بررسی می‌کند رشته با چه چیزی تمام می‌شود:
print(name.endswith("ing"))



1️⃣3️⃣ find()
موقعیت یک عبارت را پیدا می‌کند:
name = "python programming"

print(name.find("py"))

خروجی:
0

چون py از Index صفر شروع شده.

1️⃣4️⃣ index()
مثل find() موقعیت عبارت را پیدا می‌کند:
print(name.index("py"))

اما اگر پیدا نشود:
name.index("xyz")

❌ Error می‌دهد.
تفاوت:
find()
↓
پیدا نشد → -1

index()
↓
پیدا نشد → Error

این یکی را برای امتحان حتماً حفظ کن. 🔥


1️⃣5️⃣ split()
رشته را بر اساس یک جداکننده تقسیم می‌کند.
مثلاً:
name = "ali,reza,mohammad"

print(name.split(","))

خروجی:
['ali', 'reza', 'mohammad']

یعنی هر جا , دید، رشته را جدا کن.




1️⃣6️⃣ splitlines()
برای جدا کردن رشته بر اساس خط‌های جدید استفاده می‌شود.
مثلاً:
text = "Ali\nReza\nMohammad"

print(text.splitlines())

خروجی:
['Ali', 'Reza', 'Mohammad']
1️⃣7️⃣ strip()
فاصله‌های ابتدا و انتهای رشته را حذف می‌کند.
name = "   ali   "

print(name.strip())

نتیجه:
ali

می‌توانیم کاراکتر مشخص هم بدهیم:
text = ",,,ali,,,"

print(text.strip(","))

نتیجه:
ali
1️⃣8️⃣ rstrip()
فقط از سمت راست حذف می‌کند.
text = "ali,,,"

print(text.rstrip(","))

نتیجه:
ali



1️⃣9️⃣ swapcase()
حروف بزرگ را کوچک و حروف کوچک را بزرگ می‌کند:
text = "Ali PYTHON"

print(text.swapcase())

نتیجه:
aLI python

⚠️ swapcase() معمولاً آرگومان نمی‌گیرد.
یعنی:
text.swapcase()



2️⃣0️⃣ replace()
برای جایگزین کردن یک بخش از رشته:
name = "ali"

print(name.replace("a", "A"))

خروجی:
Ali

مثلاً:
text = "I like Python"

print(text.replace("Python", "Linux"))

خروجی:
I like Linux
My folder vip
1️⃣8️⃣ rstrip() فقط از سمت راست حذف می‌کند. text = "ali,,," print(text.rstrip(",")) نتیجه: ali 1️⃣9️⃣ swapcase() حروف بزرگ را کوچک و حروف کوچک را بزرگ می‌کند: text = "Ali PYTHON" print(text.swapcase()) نتیجه: aLI python ⚠️ swapcase() معمولاً آرگومان نمی‌گیرد.…
🔐 مثال کاربردی در امنیت
فرض کن ورودی کاربر را می‌گیریم و می‌خواهیم Username را استاندارد کنیم:
username = input("Enter username: ")

username = username.strip().lower()

print(username)

اگر کاربر وارد کند:
   ALI

نتیجه:
ali

این نوع پاک‌سازی و استانداردسازی ورودی‌ها در برنامه‌های واقعی خیلی کاربردی است.
🐍 فصل نهم — پایتون مقدماتی varuable scope
—————————————-
1️⃣ Variable Scope چیست؟
Scope یعنی محدوده‌ای از برنامه که در آن می‌توانیم به یک متغیر دسترسی داشته باشیم.
در پایتون متغیرها می‌توانند محدوده‌های مختلفی داشته باشند؛ مثلاً:
Local → متغیر محلی داخل تابع
Global → متغیر سراسری در سطح ماژول
Nonlocal → متغیر مربوط به تابع بیرونی در توابع تو در تو

————————

2️⃣ Local Variable — متغیر محلی
متغیری که داخل یک تابع تعریف می‌شود، به‌صورت پیش‌فرض Local است.
مثلاً:
def my_func():
x = 10
print(x)

my_func()

خروجی:
10

اینجا متغیر x داخل تابع تعریف شده و در محدوده همان تابع قابل دسترسی است.
اگر بیرون تابع به آن دسترسی پیدا کنیم:
def my_func():
x = 10

my_func()

print(x)

❌ خطا می‌گیریم:
NameError

چون x یک متغیر Local است و بیرون از تابع تعریف نشده.
نکته: متغیر Local معمولاً فقط در محدوده تابعی که داخل آن تعریف شده، قابل دسترسی است.

————————

3️⃣ Global Variable — متغیر سراسری
متغیری که خارج از توابع تعریف می‌شود، در سطح ماژول Global است.
مثلاً:
x = 10

def my_func():
print(x)

my_func()

خروجی:
10

چون تابع می‌تواند متغیر Global را بخواند.
اما اگر بخواهیم مقدار Global را داخل تابع تغییر دهیم چه؟
اینجا از کلمه کلیدی global استفاده می‌کنیم.
x = 5

def my_func():
global x
x = 10

my_func()

print(x)

خروجی:
10

با global x به پایتون می‌گوییم که منظورمان همان متغیر x در سطح ماژول است، نه یک متغیر محلی جدید.
پس مقدار متغیر اصلی تغییر می‌کند.
⚠️ دقت کن: اگر فقط بخواهیم مقدار Global را بخوانیم، معمولاً نیازی به global نداریم؛ این کلمه برای انتساب مجدد به متغیر Global استفاده می‌شود.

————————-

4️⃣ Nonlocal — متغیر در تابع بیرونی
حالا می‌رسیم به قسمت مهم جزوه‌ات! 🔥
nonlocal در توابع تو در تو (Nested Functions) کاربرد دارد.
فرض کن یک تابع داریم که داخل آن، تابع دیگری تعریف شده است.
def outer():
count = 0

def inner():
nonlocal count
count += 1
print(count)

inner()
inner()
inner()

outer()

خروجی:
1
2
3

بیایم خط‌به‌خط بررسی کنیم:
ابتدا تابع outer() اجرا می‌شود:
count = 0

بعد تابع inner() تعریف می‌شود.
داخل آن داریم:
nonlocal count

یعنی:
منظورم متغیر

count
متعلق به تابع بیرونی است؛ نمی‌خواهم یک متغیر محلی جدید بسازم.

سپس:
count += 1

در هر بار فراخوانی، مقدار count یکی افزایش پیدا می‌کند.
پس:
فراخوانی
مقدار count
بار اول
1
بار دوم
2
بار سوم
3
اگر nonlocal را حذف کنیم چه می‌شود؟
اگر داخل inner() بنویسیم:
def inner():
count += 1

پایتون خطای UnboundLocalError می‌دهد؛ چون count را به‌دلیل انتساب داخل تابع، Local در نظر می‌گیرد، اما قبل از مقداردهی محلی، تلاش می‌کنیم مقدارش را بخوانیم.
بنابراین برای تغییر متغیر تابع بیرونی از nonlocal استفاده می‌کنیم.

———————-

5️⃣ تفاوت Global و Nonlocal
این قسمت امتحانیه! 🎯
کلمه کلیدی
کاربرد
global
تغییر متغیر در سطح ماژول
nonlocal
تغییر متغیر در تابع بیرونیِ نزدیک‌تر
بدون این کلمات
انتساب به نام متغیر داخل تابع معمولاً آن را Local می‌کند
مثال ساده:
x = 10

def outer():
y = 20

def inner():
global x
nonlocal y

x = 100
y = 200

inner()

print(y)

outer()
print(x)

خروجی:
200
100

چرا؟
x با global به متغیر سطح ماژول اشاره می‌کند.
y با nonlocal به متغیر تابع outer() اشاره می‌کند.

———————
🐍 فصل دهم — پایتون مقدماتی Lambda Functions
—————————————-

1️⃣ اول از همه: تابع معمولی در Python
تا الان یاد گرفتیم با def تابع تعریف کنیم:
def square(x):
return x * x

print(square(5))

خروجی:
25

این تابع یک عدد می‌گیرد و مربع آن را برمی‌گرداند.
اما اگر بخواهیم یک تابع خیلی کوچک و ساده بنویسیم، می‌توانیم از Lambda استفاده کنیم.

———————

2️⃣ Lambda چیست؟
lambda یک روش برای ساختن تابع کوچک و بدون نام (Anonymous Function) است.
ساختار کلی:
lambda parameters: expression

مثلاً تابع بالا را با Lambda بنویسیم:
square = lambda x: x * x

print(square(5))

خروجی:
25

مقایسه تابع معمولی و Lambda
با def:
def square(x):
return x * x

با lambda:
square = lambda x: x * x

هر دو نتیجه یکسانی دارند.
نکته مهم امتحانی
در Lambda:
از کلمه کلیدی lambda استفاده می‌کنیم.
می‌تواند چند پارامتر داشته باشد.
فقط یک عبارت (Expression) دارد.
نتیجه عبارت به‌صورت خودکار برگردانده می‌شود؛ نیازی به return نیست.
مثلاً:
add = lambda a, b: a + b

print(add(10, 20))

خروجی:
30


————————

3️⃣ قبل از Lambda، تابع map()
تابع map() برای اجرای یک تابع روی تک‌تک اعضای یک مجموعه قابل پیمایش (Iterable) استفاده می‌شود.
مثلاً فرض کن لیستی از اعداد داریم و می‌خواهیم همه را دو برابر کنیم.
روش معمولی با for:
numbers = [1, 2, 3, 4, 5]

result = []

for num in numbers:
result.append(num * 2)

print(result)

خروجی:
[2, 4, 6, 8, 10]

حالا با map():
def double(x):
return x * 2

numbers = [1, 2, 3, 4, 5]

result = map(double, numbers)

print(list(result))

خروجی:
[2, 4, 6, 8, 10]

map() دقیقاً چه کار می‌کند؟
map(function, iterable)

یعنی:
تابع را روی هر عضو از مجموعه اجرا کن.

در این مثال:
map(double, numbers)

تقریباً یعنی:
double(1)
double(2)
double(3)
double(4)
double(5)

نکته: در Python 3، map() یک Iterator برمی‌گرداند؛ برای دیدن همه نتایج به شکل لیست، از list() استفاده می‌کنیم.

———————-

4️⃣ ترکیب map() با lambda
اینجا قدرت Lambda مشخص می‌شود! 🔥
به‌جای اینکه تابع جداگانه با def تعریف کنیم:
def double(x):
return x * 2

می‌توانیم مستقیم از Lambda استفاده کنیم:
numbers = [1, 2, 3, 4, 5]

result = map(lambda x: x * 2, numbers)

print(list(result))

خروجی:
[2, 4, 6, 8, 10]

این کد را چطور بخوانیم؟
map(lambda x: x * 2, numbers)

یعنی:
هر عدد از

numbers
را بگیر، در 2 ضرب کن و نتیجه را تولید کن.


———————-

5️⃣ تابع filter()
حالا فرض کنیم لیستی داریم و می‌خواهیم فقط اعداد زوج را از آن جدا کنیم.
اینجا از filter() استفاده می‌کنیم.
filter() اعضایی را نگه می‌دارد که نتیجه تابع شرطی برایشان True باشد.
روش معمولی با for:
numbers = [1, 2, 3, 4, 5, 6]

result = []

for num in numbers:
if num % 2 == 0:
result.append(num)

print(result)

خروجی:
[2, 4, 6]

روش با filter():
def is_even(x):
return x % 2 == 0

numbers = [1, 2, 3, 4, 5, 6]

result = filter(is_even, numbers)

print(list(result))

خروجی:
[2, 4, 6]


————————-

6️⃣ ترکیب filter() با lambda
حالا تابع is_even() را حذف می‌کنیم و مستقیماً Lambda می‌نویسیم:
numbers = [1, 2, 3, 4, 5, 6]

result = filter(lambda x: x % 2 == 0, numbers)

print(list(result))

خروجی:
[2, 4, 6]

این کد یعنی چه؟
filter(lambda x: x % 2 == 0, numbers)

یعنی:
از بین اعداد، فقط عددهایی را نگه دار که باقی‌مانده تقسیمشان بر 2 برابر صفر باشد.


——————————-
My folder vip
🐍 فصل دهم — پایتون مقدماتی Lambda Functions —————————————- 1️⃣ اول از همه: تابع معمولی در Python تا الان یاد گرفتیم با def تابع تعریف کنیم: def square(x): return x * x print(square(5)) خروجی: 25 این تابع یک عدد می‌گیرد و مربع آن را برمی‌گرداند. اما…
🔐 8️⃣ مثال کاربردی در شبکه و امنیت
فرض کن لیستی از پورت‌ها داریم و می‌خواهیم پورت‌های بالاتر از 1024 را جدا کنیم:

ports = [21, 22, 80, 443, 8080, 3306]

high_ports = filter(lambda port: port > 1024, ports)

print(list(high_ports))

خروجی:
[8080, 3306]

حالا با map() می‌توانیم پورت‌ها را به رشته تبدیل کنیم:

ports = [22, 80, 443]

result = map(lambda port: f"Port: {port}", ports)

print(list(result))

خروجی:
['Port: 22', 'Port: 80', 'Port: 443']

این‌ها مثال‌های ساده‌ای از پردازش داده‌ها در اسکریپت‌های شبکه هستند.
🐍 فصل یازدهم — پایتون مقدماتی Modules
—————————————-

Modules
| ماژول‌ها و کتابخانه‌ها
توی این فصل یاد می‌گیریم چطور از کدهایی که دیگران نوشته‌اند استفاده کنیم و چطور کدهای خودمون رو در فایل‌های جداگانه قرار بدیم تا بتونیم در پروژه‌های مختلف ازشون استفاده کنیم.
۱. ماژول (Module) چیست؟
ماژول در پایتون، به‌طور ساده، یک فایل پایتون با پسوند .py است که می‌تونه شامل متغیر، تابع و کلاس باشه.
مثلاً فرض کن یک تابع برای ضرب دو عدد نوشتیم. به‌جای اینکه هر بار این تابع رو در برنامه‌های مختلف بنویسیم، می‌تونیم اون رو داخل یک فایل قرار بدیم و هر جا خواستیم ازش استفاده کنیم.
مثال:
فایل mymath.py:
def multiply(a, b):
return a * b

حالا در یک فایل پایتون دیگه، مثلاً main.py، می‌تونیم از ماژول خودمون استفاده کنیم:
import mymath

result1 = mymath.multiply(3, 4)

print(result1)

خروجی:
12

نکته: برای اینکه پایتون فایل mymath.py رو پیدا کنه، معمولاً باید در مسیر قابل‌دسترسی برای پایتون، مثل پوشه فعلی پروژه، قرار داشته باشه.

——————-
۲. کتابخانه (Library) چیست؟

کتابخانه مجموعه‌ای از کدهای آماده است که برای انجام کارهای مشخصی در اختیار برنامه‌نویس قرار می‌گیره.

کتابخانه‌ها می‌تونن شامل چندین ماژول و بخش مختلف باشن.

برای مثال، پایتون ابزارهای آماده زیادی برای کار با تاریخ، ریاضیات، فایل‌ها و شبکه در اختیارمون قرار می‌ده.

——————-
۳. استفاده از ماژول‌های آماده با import
برای استفاده از یک ماژول، از دستور import استفاده می‌کنیم.
مثال اول: ماژول math
ماژول math توابع و مقادیر ریاضی آماده‌ای داره.
import math

print(math.sqrt(25))
print(math.pi)

خروجی:
5.0
3.141592653589793

توضیح:
math.sqrt(25) جذر ۲۵ رو محاسبه می‌کنه.
math.pi مقدار تقریبی عدد پی رو برمی‌گردونه.
چرا نوشتیم math.sqrt؟
چون تابع sqrt داخل ماژول math قرار داره.

———————
۴. کار با ماژول datetime
ماژول datetime برای کار با تاریخ و زمان استفاده می‌شه.
مثال:
import datetime

today = datetime.date.today()

print(today)

خروجی نمونه:
2026-09-21

دقت کن که در کد جزوه، tody() اشتباه تایپی بود و شکل صحیحش today() هست.
اینجا:
datetime ماژول ماست.
date برای کار با تاریخ استفاده می‌شه.
today() تاریخ امروز رو برمی‌گردونه.

——————-

۵. تغییر نام ماژول با as
گاهی اسم یک ماژول طولانیه یا می‌خوایم در کد کوتاه‌تر بنویسیم.
برای این کار از as استفاده می‌کنیم.
import datetime as dt

today = dt.date.today()

print(today)

در این مثال، به‌جای نوشتن datetime، از اسم کوتاه‌تر dt استفاده می‌کنیم.
مثال دیگر:
import math as m

print(m.sqrt(36))

خروجی:
6.0


—————

۶. وارد کردن یک تابع مشخص از ماژول
فرض کن فقط به تابع sqrt از ماژول math نیاز داریم.
می‌تونیم فقط همون تابع رو وارد کنیم:
from math import sqrt

print(sqrt(49))

خروجی:
7.0

در این حالت دیگه نیازی نیست بنویسیم:
math.sqrt(49)

چون تابع sqrt رو مستقیماً وارد کردیم.
وارد کردن چند تابع مشخص
from math import sqrt, pi

print(sqrt(64))
print(pi)



—————

۷. استفاده از from module import *
این دستور همه نام‌هایی رو که ماژول برای وارد کردن در دسترس قرار داده، وارد فضای نام فعلی برنامه می‌کنه.
from math import *

print(sqrt(81))
print(pi)

اما استفاده از import * معمولاً پیشنهاد نمی‌شه؛ چون ممکنه نام توابع یا متغیرها با هم تداخل پیدا کنه و مشخص نباشه هر تابع از کجا اومده.
روش‌های زیر معمولاً خواناتر هستن:
import math

یا:
from math import sqrt


————————

۸. مثال عملی — ساخت ماژول شخصی
فرض کن می‌خوایم چند تابع ریاضی بسازیم و در برنامه‌های مختلف ازشون استفاده کنیم.
فایل اول: mymath.py
def add(a, b):
return a + b


def multiply(a, b):
return a * b


def subtract(a, b):
return a - b

فایل دوم: main.py
حالا می‌تونیم کل ماژول رو وارد کنیم:
import mymath

print(mymath.add(10, 5))
print(mymath.multiply(3, 4))

خروجی:
15
12

یا فقط تابع موردنیاز رو وارد کنیم:
from mymath import add

print(add(10, 5))

خروجی:
15

نکته: هر دو فایل mymath.py و main.py رو در یک پوشه قرار بده تا این مثال به‌سادگی اجرا بشه.


—————————
My folder vip
🐍 فصل یازدهم — پایتون مقدماتی Modules —————————————- Modules | ماژول‌ها و کتابخانه‌ها توی این فصل یاد می‌گیریم چطور از کدهایی که دیگران نوشته‌اند استفاده کنیم و چطور کدهای خودمون رو در فایل‌های جداگانه قرار بدیم تا بتونیم در پروژه‌های مختلف ازشون استفاده…
ارتباط ماژول‌ها با امنیت و شبکه

ماژول‌ها کمک می‌کنن کدهای امنیتی و شبکه‌ای خودمون رو مرتب و قابل استفاده مجدد بنویسیم.
برای مثال، ماژول ipaddress در پایتون برای کار با آدرس‌های IP و شبکه‌ها استفاده می‌شه:
import ipaddress

ip = ipaddress.ip_address("192.168.1.10")

print(ip.version)

خروجی:
4

این کد مشخص می‌کنه آدرس واردشده از نوع IPv4 هست.
در پروژه‌های بزرگ‌تر، می‌تونیم توابع مربوط به اسکن شبکه، پردازش لاگ‌ها یا اعتبارسنجی IP رو در ماژول‌های جداگانه قرار بدیم و در برنامه اصلی ازشون استفاده کنیم.
🐍 فصل دوازدهم — پایتون مقدماتی Work With Files
—————————————-

توی این فصل یاد می‌گیریم چطور با پایتون فایل بسازیم، اطلاعات داخل فایل رو بخونیم، داخلش بنویسیم و در نهایت فایل رو به‌درستی ببندیم.

مثلاً فرض کن می‌خوایم با پایتون یک فایل لاگ برای ثبت رویدادهای یک سرور ایجاد کنیم؛ اینجا کار با فایل‌ها به دردمون می‌خوره.
————————-

۱. باز کردن فایل با open()
برای باز کردن یک فایل در پایتون از تابع open() استفاده می‌کنیم.
file = open("ali.txt", "r")

در این مثال:
open() فایل رو باز می‌کنه.
ali.txt اسم فایله.
"r" حالت باز کردن فایل برای خواندنه (Read).

————————

حالت‌های مهم باز کردن فایل
حالت
کاربرد
"r"
خواندن فایل؛ فایل باید از قبل وجود داشته باشه

"w"
نوشتن؛ اگر فایل وجود نداشته باشه ساخته می‌شه، اگر وجود داشته باشه محتویات قبلی پاک می‌شه

"a"
اضافه کردن محتوا به انتهای فایل، بدون پاک کردن محتوای قبلی

"b"
حالت باینری؛ معمولاً همراه حالت‌های دیگه استفاده می‌شه

"x"
ایجاد فایل جدید؛ اگر فایل از قبل وجود داشته باشه خطا می‌ده

مثلاً:
file = open("image.jpg", "rb")

اینجا فایل تصویری رو در حالت خواندن باینری باز می‌کنیم.
نکته: "b" به‌تنهایی معمولاً حالت کاملی برای باز کردن فایل نیست؛ معمولاً با "r" یا "w" ترکیب می‌شه، مثل "rb" و "wb".

———————

۲. خواندن اطلاعات فایل با read()
فرض کنیم فایل ali.txt این محتوا رو داره:
Hello Ali
Welcome to Python

برای خوندن کل محتویات فایل:
file = open("ali.txt", "r")

content = file.read()

print(content)

file.close()

خروجی:
Hello Ali
Welcome to Python

تابع read() محتوای فایل رو می‌خونه و به‌صورت رشته (str) برمی‌گردونه.
خواندن تعداد مشخصی از کاراکترها
file = open("ali.txt", "r")

content = file.read(5)

print(content)

file.close()

خروجی:
Hello

عدد 5 یعنی پنج کاراکتر اول فایل خونده بشه.
——————————-

۳. بستن فایل با close()
بعد از کار با فایل، باید اون رو ببندیم:
file.close()

چرا؟
چون فایل باز، منابع سیستم رو درگیر می‌کنه و بستن اون باعث می‌شه منابع آزاد بشن.
اما یک روش بهتر و حرفه‌ای‌تر هم وجود داره که جلوتر می‌بینیم.

——————
۴. خواندن فایل خط‌به‌خط با readline() و readlines()
روش اول: استفاده از readline()
متد readline() هر بار یک خط از فایل رو می‌خونه.
file = open("ali.txt", "r")

line1 = file.readline()
line2 = file.readline()

print(line1)
print(line2)

file.close()

هر بار که readline() اجرا می‌شه، به خط بعدی می‌ره.
روش دوم: استفاده از readlines()
متد readlines() تمام خطوط فایل رو می‌خونه و به شکل یک لیست برمی‌گردونه.
file = open("ali.txt", "r")

lines = file.readlines()

print(lines)

file.close()

خروجی نمونه:
['Hello Ali\n', 'Welcome to Python\n']

دقت کن که \n نشان‌دهنده کاراکتر رفتن به خط بعدیه.
روش سوم: استفاده از حلقه for (پیشنهادی)
برای خواندن فایل خط‌به‌خط، می‌تونیم مستقیماً روی فایل حلقه بزنیم:
file = open("ali.txt", "r")

for line in file:
print(line.strip())

file.close()

اینجا پایتون هر بار یک خط از فایل رو به متغیر line می‌ده.
اصلاح نکته جزوه: این کد:
for line in content.readline():

درست نیست؛ چون content معمولاً خروجی read() و یک رشته است و readline() متد فایل محسوب می‌شه. برای خواندن خط‌به‌خط، از for line in file: یا file.readlines() استفاده کن.

———————
۵. متد strip() چیست؟
وقتی از فایل خط می‌خونیم، ممکنه انتهای هر خط کاراکتر \n وجود داشته باشه.
برای حذف فاصله‌ها و کاراکترهای خالی ابتدا و انتهای رشته از strip() استفاده می‌کنیم:
text = "   Hello Ali\n"

print(text.strip())

خروجی:
Hello Ali

نکته مهم: strip() فقط وقتی اجرا بشه که با پرانتز نوشته شده باشه.
line.strip()

نه:
line.strip

حالت دوم فقط به خود متد اشاره می‌کنه و اون رو اجرا نمی‌کنه.


———————-
۶. نوشتن داخل فایل با write()
برای نوشتن در فایل از حالت "w" استفاده می‌کنیم.
file = open("ali.txt", "w")

file.write("Hi")

file.close()

اگر فایل وجود نداشته باشه، ساخته می‌شه.
اگر از قبل وجود داشته باشه، محتویات قبلی اون پاک می‌شه و اطلاعات جدید نوشته می‌شه.
نوشتن چند خط در فایل
file = open("ali.txt", "w")

file.write("Hello Ali\n")
file.write("Welcome to Python\n")
file.write("End")

file.close()

محتوای فایل:
Hello Ali
Welcome to Python
End

\n باعث می‌شه متن بعدی از خط جدید شروع بشه.


_————————

۷. اضافه کردن محتوا به انتهای فایل با a
فرض کن داخل فایل ali.txt از قبل اطلاعاتی داریم و نمی‌خوایم پاک بشن.
در این حالت از "a" (Append) استفاده می‌کنیم:
file = open("ali.txt", "a")

file.write("\nEnd\n")

file.close()

این دستور، متن End رو به انتهای فایل اضافه می‌کنه.
تفاوت مهم:
"w" محتویات قبلی رو پاک می‌کنه و از اول می‌نویسه.
"a" محتوای جدید رو به انتهای فایل اضافه می‌کنه.

——————————

۸. روش حرفه‌ای باز کردن فایل با with
در پایتون، استفاده از with open() روش پیشنهادی برای کار با فایله؛ چون بعد از پایان بلوک، فایل به‌صورت خودکار بسته می‌شه.
with open("ali.txt", "r") as file:
content = file.read()
print(content)

دیگه نیازی به نوشتن file.close() نیست.
مثال نوشتن با with
with open("ali.txt", "w") as file:
file.write("Hello Ali\n")
file.write("Python is great")

بعد از خروج از بلوک with، فایل به‌صورت خودکار بسته می‌شه.
My folder vip
🐍 فصل دوازدهم — پایتون مقدماتی Work With Files —————————————- توی این فصل یاد می‌گیریم چطور با پایتون فایل بسازیم، اطلاعات داخل فایل رو بخونیم، داخلش بنویسیم و در نهایت فایل رو به‌درستی ببندیم. مثلاً فرض کن می‌خوایم با پایتون یک فایل لاگ برای ثبت رویدادهای…
۹. مثال کاربردی امنیتی — ثبت لاگ
فرض کن می‌خوایم نتیجه یک بررسی امنیتی رو داخل فایل ثبت کنیم.
with open("security.log", "a") as file:
file.write("Login attempt detected\n")

هر بار که این کد اجرا بشه، پیام جدید به انتهای فایل security.log اضافه می‌شه.
این روش می‌تونه برای ذخیره رویدادهای برنامه، خطاها یا نتایج بررسی‌های امنیتی استفاده بشه.
🐍 فصل سیزدهم — پایتون مقدماتی Error Handling
—————————————-

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

——————-
۱. خطا (Error / Exception) چیست؟
هنگام اجرای برنامه ممکنه اتفاقی بیفته که اجرای عادی برنامه رو مختل کنه.
مثلاً:
number = int(input("Enter a number: "))

result = 100 / number

print(result)

این برنامه دو مشکل احتمالی داره:
اگر کاربر به‌جای عدد، متن وارد کنه، با ValueError مواجه می‌شیم.
اگر کاربر عدد صفر وارد کنه، با ZeroDivisionError مواجه می‌شیم.
در حالت عادی، این خطاها می‌تونن اجرای برنامه رو متوقف کنن.

————————

۲. دستور try و except
برای مدیریت خطاها از try و except استفاده می‌کنیم.
ساختار کلی:
try:
# کدی که ممکن است خطا ایجاد کند
except:
# کدی که هنگام بروز خطا اجرا می‌شود

یعنی پایتون کد داخل try رو اجرا می‌کنه. اگر خطایی رخ بده که با except مطابقت داشته باشه، وارد بخش except می‌شه.
مثال ساده
try:
number = int(input("Enter a number: "))
result = 100 / number

print(result)

except:
print("An error occurred!")

حالا اگر کاربر ورودی نامعتبر وارد کنه یا عدد صفر بده، برنامه به‌جای نمایش خطای خام، پیام خودمون رو نمایش می‌ده.
اما یک نکته مهم: استفاده از except خالی معمولاً پیشنهاد نمی‌شه؛ چون ممکنه خطاهای غیرمنتظره رو هم پنهان کنه. بهتره خطاهای مشخص رو مدیریت کنیم.

————————-

۳. مدیریت ValueError
خطای ValueError زمانی رخ می‌ده که نوع داده از نظر کلی قابل‌قبوله، اما مقدار ارائه‌شده برای عملیات موردنظر معتبر نیست.
مثلاً:
number = int("hello")

پایتون نمی‌تونه رشته "hello" رو به عدد صحیح تبدیل کنه؛ بنابراین ValueError ایجاد می‌شه.
مثال کاربردی
try:
number = int(input("Enter a number: "))

result = 100 / number

print(result)

except ValueError:
print("Lotfan adad vared konid!")

اگر کاربر به‌جای عدد، مثلاً hello وارد کنه، پیام زیر نمایش داده می‌شه:
Lotfan adad vared konid!

در این مثال، خطای ValueError مدیریت می‌شه؛ اما اگر کاربر صفر وارد کنه، همچنان ZeroDivisionError رخ می‌ده.

—————————

۴. مدیریت چند خطای مختلف
می‌تونیم برای هر نوع خطا، پیام جداگانه‌ای نمایش بدیم.
try:
number = int(input("Enter a number: "))

result = 100 / number

print(result)

except ValueError:
print("Lotfan adad sahih vared konid!")

except ZeroDivisionError:
print("Adad nemitavanad sefr bashad!")

—————————

۶. مدیریت خطای FileNotFoundError
فرض کن برنامه ما می‌خواد یک فایل رو بخونه، اما فایل وجود نداره.
try:
file = open("data.txt", "r")

content = file.read()

print(content)

file.close()

except FileNotFoundError:
print("File not found!")

اگر فایل data.txt وجود نداشته باشه، به‌جای نمایش خطای خام، پیام مناسب نمایش داده می‌شه.
روش بهتر، استفاده از with هست تا فایل به‌صورت خودکار بسته بشه:
try:
with open("data.txt", "r") as file:
content = file.read()

print(content)

except FileNotFoundError:
print("File not found!")

——————

۷. استفاده از else و finally
علاوه بر try و except، دو بخش دیگه هم داریم.
بخش else
بخش else زمانی اجرا می‌شه که داخل try هیچ خطایی رخ نداده باشه.
try:
number = int(input("Enter a number: "))

except ValueError:
print("Invalid input!")

else:
print("Your number is:", number)

بخش finally
بخش finally در پایان اجرای ساختار مدیریت خطا اجرا می‌شه؛ چه خطا رخ داده باشه، چه رخ نداده باشه.
try:
number = int(input("Enter a number: "))

except ValueError:
print("Invalid input!")

finally:
print("Program finished!")

finally برای کارهایی مثل آزادسازی منابع یا پاک‌سازی وضعیت برنامه کاربرد داره.
My folder vip
🐍 فصل سیزدهم — پایتون مقدماتی Error Handling —————————————- رسیدیم به یکی از مباحث مهم پایتون که هم در برنامه‌نویسی روزمره و هم در توسعه ابزارهای امنیتی خیلی کاربرد داره. فرض کن کاربر باید یک عدد وارد کنه، اما به‌جای عدد، حروف وارد می‌کنه. اگر برنامه…
نکته امنیتی مهم 🔐


درسته که مدیریت خطا می‌تونه از نمایش جزئیات فنی ناخواسته به کاربر جلوگیری کنه؛ اما پنهان کردن خطا به‌تنهایی به معنی امن شدن برنامه نیست.

برای مثال، در یک برنامه تحت وب، نمایش جزئیات خطا مثل مسیرهای داخلی سرور، اطلاعات اتصال دیتابیس یا Stack Trace ممکنه اطلاعات غیرضروری در اختیار مهاجم قرار بده.

روش اصولی:
به کاربر پیام ساده و غیرحساس نمایش بده.
خطای فنی رو در لاگ داخلی ثبت کن.
اطلاعات محرمانه مثل رمز عبور، توکن و کلیدهای API رو در لاگ ذخیره نکن.
خطاهای مشخص رو مدیریت کن؛ از except خالی برای پنهان کردن همه خطاها استفاده نکن.

مثلاً:
try:
number = int(input("Enter a number: "))
result = 100 / number

except ValueError:
print("Please enter a valid number.")

except ZeroDivisionError:
print("Number cannot be zero.")

این روش هم تجربه کاربر رو بهتر می‌کنه و هم از پنهان شدن ناخواسته خطاهای غیرمنتظره جلوگیری می‌کنه.
🐍 فصل چهاردهم — پایتون مقدماتی OOP
—————————————-

برنامه‌نویسی شی‌گرا
رسیدیم به یکی از مفاهیم مهم برنامه‌نویسی پایتون! 😎
برنامه‌نویسی شی‌گرا (OOP) روشی برای طراحی برنامه است که در اون کدها رو بر اساس کلاس‌ها (Class) و اشیا (Object) سازمان‌دهی می‌کنیم.
برای اینکه بهتر متوجه بشی، مثال رو با موضوعی مرتبط با شبکه و امنیت پیش می‌بریم.
———————————
۱. برنامه‌نویسی شی‌گرا (OOP) چیست؟
فرض کن می‌خوایم یک برنامه برای مدیریت سرورها بنویسیم.
هر سرور می‌تونه ویژگی‌هایی داشته باشه، مثل:
نام سرور
آدرس IP
سیستم‌عامل
همچنین می‌تونه کارهایی انجام بده، مثل:
نمایش اطلاعات سرور
روشن یا خاموش شدن
بررسی وضعیت
در OOP، ما این ویژگی‌ها و رفتارها رو داخل یک ساختار به نام Class قرار می‌دیم.

————————

۲. کلاس (Class) چیست؟
کلاس مثل یک نقشه یا قالب برای ساخت اشیاست.
مثلاً نقشه یک خودرو مشخص می‌کنه خودرو چه ویژگی‌هایی داره؛ اما خود نقشه، یک خودرو واقعی نیست.
در پایتون هم کلاس مشخص می‌کنه اشیایی که از اون ساخته می‌شن چه ویژگی‌ها و رفتارهایی داشته باشن.
مثال: ساخت کلاس Server
class Server:
def __init__(self, name, ip, os):
self.name = name
self.ip = ip
self.os = os

def show_info(self):
print(f"Server: {self.name}")
print(f"IP: {self.ip}")
print(f"OS: {self.os}")

بیا قسمت‌های مختلف رو بررسی کنیم.
class Server:
با کلمه کلیدی class یک کلاس به نام Server تعریف می‌کنیم.
این کلاس قالبی برای ساخت اشیای سرور خواهد بود.
__init__()
این متد هنگام ساخت یک شیء جدید اجرا می‌شه و معمولاً برای مقداردهی اولیه ویژگی‌های اون استفاده می‌شه.
مثلاً وقتی یک سرور می‌سازیم، می‌تونیم نام، IP و سیستم‌عاملش رو مشخص کنیم.
self
کلمه self به شیء فعلی اشاره می‌کنه.
مثلاً:
self.name = name

یعنی مقدار name رو داخل ویژگی name همین شیء ذخیره کن.
show_info()
این یک متد (Method) است؛ یعنی تابعی که داخل کلاس تعریف شده و اطلاعات سرور رو نمایش می‌ده.
———————-

۳. شیء (Object) و اینستنس (Instance) چیست؟
وقتی از روی یک کلاس، یک شیء واقعی می‌سازیم، به اون شیء یک Instance از کلاس می‌گیم.
به زبان ساده:
Class = قالب یا نقشه
Object / Instance = نمونه ساخته‌شده از روی قالب
حالا از کلاس Server دو سرور مختلف می‌سازیم:
server1 = Server("Web-Server", "192.168.1.10", "Ubuntu")

server2 = Server("DB-Server", "192.168.1.20", "Windows")

در اینجا:
Server کلاس ماست.
server1 یک Instance از کلاس Server است.
server2 هم یک Instance دیگر از همون کلاس است.
هر Instance ویژگی‌های خودش رو داره.
برای مثال:
print(server1.name)
print(server2.name)

خروجی:
Web-Server
DB-Server

می‌تونیم متد کلاس رو هم اجرا کنیم:
server1.show_info()

خروجی:
Server: Web-Server
IP: 192.168.1.10
OS: Ubuntu

نکته: در پایتون، ساخت شیء از روی کلاس رو معمولاً Instantiation می‌گن.

——————-

۴. ارث‌بری (Inheritance) چیست؟
ارث‌بری یکی از قابلیت‌های مهم OOP است.
با استفاده از Inheritance می‌تونیم یک کلاس جدید بسازیم که ویژگی‌ها و متدهای کلاس دیگه‌ای رو به ارث ببره.
مثلاً فرض کن کلاس Server رو داریم؛ حالا می‌خوایم دو نوع سرور تعریف کنیم:
LinuxServer
WindowsServer
هر دو سرور ویژگی‌های عمومی مثل نام، IP و سیستم‌عامل دارن؛ پس لازم نیست همه کدها رو از اول بنویسیم.
می‌تونیم از کلاس Server ارث‌بری کنیم.
در این حالت:
Server = کلاس والد (Parent / Base Class)
LinuxServer = کلاس فرزند (Child / Derived Class)
WindowsServer = کلاس فرزند (Child / Derived Class)

————————
۵. مثال کامل ارث‌بری در پایتون
class Server:
def __init__(self, name, ip):
self.name = name
self.ip = ip

def show_info(self):
print(f"Name: {self.name}")
print(f"IP: {self.ip}")


class LinuxServer(Server):
def __init__(self, name, ip, distro):
super().__init__(name, ip)
self.distro = distro

def show_linux_info(self):
self.show_info()
print(f"Distro: {self.distro}")

حالا از کلاس فرزند، یک Instance می‌سازیم:
linux1 = LinuxServer(
"Web-Server",
"192.168.1.10",
"Ubuntu"
)

linux1.show_linux_info()

خروجی:
Name: Web-Server
IP: 192.168.1.10
Distro: Ubuntu

این کد چطور کار می‌کنه؟
۱. class LinuxServer(Server):
با قرار دادن نام کلاس والد داخل پرانتز، مشخص می‌کنیم که LinuxServer از Server ارث‌بری می‌کنه.
۲. super().__init__(name, ip)
با super() به پیاده‌سازی کلاس والد دسترسی پیدا می‌کنیم.
در این مثال، متد __init__() کلاس Server رو اجرا می‌کنیم تا ویژگی‌های name و ip مقداردهی بشن.
۳. self.distro = distro
این ویژگی مخصوص کلاس فرزند است و توزیع لینوکس سرور رو ذخیره می‌کنه.
۴. self.show_info()
چون LinuxServer از Server ارث‌بری کرده، می‌تونه از متد show_info() کلاس والد استفاده کنه.
پس لازم نیست اون متد رو دوباره بنویسیم!

——————

۶. چرا ارث‌بری مهم است؟

فرض کن برای هر نوع سرور، تمام ویژگی‌ها و متدهای مشترک رو دوباره تعریف کنیم.

با زیاد شدن تعداد کلاس‌ها، کدمون تکراری و نگهداریش سخت می‌شه.

Inheritance کمک می‌کنه:

کدهای مشترک رو فقط یک بار بنویسیم.
کلاس‌های تخصصی‌تر بسازیم.
کدها رو مرتب‌تر و قابل نگهداری‌تر کنیم.
قابلیت‌های کلاس والد رو در کلاس فرزند گسترش بدیم.

البته هر جا کلاس‌ها رابطه منطقی والد و فرزندی ندارن، استفاده از ارث‌بری لزوماً انتخاب مناسبی نیست.
🐍 فصل پانزدهم — پایتون مقدماتی regex
—————————————-

خب رسیدیم به یکی از مباحث بسیار کاربردی پایتون، مخصوصاً برای امنیت شبکه، پنتست، تحلیل لاگ و پردازش داده‌ها. 🔐
فقط اول یک اصلاح مهم: Regex مربوط به رمزنگاری (Encryption) نیست. ریجکس ابزاری برای جست‌وجو، شناسایی و بررسی الگوهای متنیه.

——————————

۱. Regex چیست؟
Regex مخفف Regular Expression است.
به زبان ساده، Regex به ما اجازه می‌ده داخل متن، دنبال یک الگوی مشخص بگردیم.
مثلاً فرض کن یک فایل لاگ داریم که داخلش هزاران خط اطلاعات وجود داره. می‌خوایم تمام آدرس‌های IP یا ایمیل‌ها رو از داخلش پیدا کنیم.
به‌جای اینکه تک‌تک خطوط رو بررسی کنیم، با Regex می‌تونیم الگوی موردنظر رو مشخص کنیم و پایتون اون رو جست‌وجو کنه.
کاربردهای Regex
جست‌وجو در متن
اعتبارسنجی ایمیل و شماره تلفن
استخراج آدرس‌های IP از لاگ‌ها
بررسی فرمت رمز عبور
پیدا کردن الگوهای مشکوک در لاگ‌های امنیتی
پردازش و پاک‌سازی داده‌های متنی
در پایتون، ماژول داخلی re برای کار با Regex استفاده می‌شه و نیازی به نصب جداگانه نداره.
import re

—————-
۲. جست‌وجو در متن با re.search()
متد re.search() در یک متن، دنبال اولین تطابق با الگوی مشخص‌شده می‌گرده.
مثال جزوه
import re

text = "hi"
pattern = "rain"

match = re.search(pattern, text)

if match:
print("Find")
print(f"From character {match.start()} to {match.end()}")
else:
print("Not found")

خروجی:
Not found

چرا؟
چون کلمه rain داخل متن hi وجود نداره.
مثال دوم
import re

text = "Hello rain world"
pattern = "rain"

match = re.search(pattern, text)

if match:
print("Find")
print(f"From character {match.start()} to {match.end()}")
else:
print("Not found")

خروجی:
Find
From character 6 to 10

——————

۳. آشنایی با نمادهای مهم Regex
حالا بریم سراغ نمادهایی که در جزوه‌ات نوشتی.
\d — پیدا کردن عدد
\d هر رقم عددی رو شناسایی می‌کنه.
مثال:
import re

text = "My age is 25"

result = re.findall(r"\d", text)

print(result)

خروجی:
['2', '5']

اگر بخوایم اعداد چندرقمی رو یکجا پیدا کنیم:
print(re.findall(r"\d+", text))

خروجی:
['25']

—————-


\w — کاراکترهای کلمه‌ای
\w معمولاً حروف، اعداد و زیرخط (_) رو شناسایی می‌کنه.
مثال:
import re

text = "ali_123!"

result = re.findall(r"\w", text)

print(result)

خروجی:
['a', 'l', 'i', '_', '1', '2', '3']

علامت ! پیدا نمی‌شه؛ چون جزو کاراکترهای \w نیست.
نکته: در پایتون، \w به‌صورت پیش‌فرض کاراکترهای حرفی Unicode، از جمله بسیاری از حروف فارسی، رو هم شامل می‌شه.

—————————

\+ — پیدا کردن علامت + به‌صورت واقعی
علامت + در Regex یک معنی ویژه داره؛ یعنی «یک یا چند بار تکرار».
اگر بخوایم خود علامت + رو جست‌وجو کنیم، باید قبلش بک‌اسلش بذاریم:
import re

text = "5+3"

result = re.search(r"\+", text)

if result:
print("Plus found")

خروجی:
Plus found

. — هر کاراکتر
نقطه (.) در Regex معمولاً به معنی هر کاراکتری به‌جز خط جدید (\n) است.
مثال:
import re

text = "cat"

result = re.findall(r"c.t", text)

print(result)

خروجی:
['cat']

چون نقطه می‌تونه با کاراکتر a تطبیق پیدا کنه.
مثال‌های دیگه:
c.t → cat
c.t → cot
c.t → c7t

اما c.t با ct تطبیق پیدا نمی‌کنه؛ چون نقطه باید با یک کاراکتر تطبیق داشته باشه.

——————


مثال ترکیبی
import re

text = "Ali123"

result = re.findall(r"\w+", text)

print(result)

خروجی:
['Ali123']

چون تمام حروف و اعداد پشت سر هم، با الگوی \w+ تطبیق پیدا می‌کنن.

———————

۵. اعتبارسنجی ایمیل با Regex
حالا بریم سراغ مثال ایمیل که در جزوه‌ات نوشتی.
هدف اینه که بررسی کنیم آیا ایمیل واردشده، با یک الگوی مشخص مطابقت داره یا نه.
نسخه اصلاح‌شده کد
import re

def is_valid_email(email):
pattern = r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$"

return re.fullmatch(pattern, email) is not None


email = input("Enter email: ")

if is_valid_email(email):
print("Valid email")
else:
print("Invalid email")

مثال ورودی و خروجی
ورودی:
ali123@gmail.com

خروجی:
Valid email

ورودی:
ali123gmail.com

خروجی:
Invalid email

چون در ایمیل دوم علامت @ وجود نداره.


——————-