Python3
200 subscribers
100 photos
6 videos
26 files
518 links
🎓 آموزش و پروژه‌های Python
آموزش‌های کاربردی و پروژه‌های عملی Python برای همه سطوح. 🚀
Download Telegram
پارت ۹: مدیریت فایل‌ها در پایتون 🗂️🐍

در این پارت، به بررسی نحوه کار با فایل‌ها در پایتون می‌پردازیم. مدیریت فایل‌ها یکی از قابلیت‌های مهم پایتون است که به ما اجازه می‌دهد تا فایل‌ها را باز کنیم، بخوانیم، بنویسیم و تغییر دهیم.

۱. باز کردن و بستن فایل‌ها

برای کار با فایل‌ها در پایتون از تابع open استفاده می‌کنیم. این تابع دو آرگومان اصلی دارد: نام فایل و حالت باز کردن فایل.

حالت‌های باز کردن فایل

- r: باز کردن فایل برای خواندن (پیش‌فرض)
- w: باز کردن فایل برای نوشتن (اگر فایل وجود نداشته باشد، ایجاد می‌شود؛ اگر فایل وجود داشته باشد، محتوای آن پاک می‌شود)
- a: باز کردن فایل برای اضافه کردن محتوا (اگر فایل وجود نداشته باشد، ایجاد می‌شود)
- b: باز کردن فایل در حالت باینری (برای فایل‌های غیر متنی)

باز کردن و بستن فایل
# باز کردن فایل
file = open('example.txt', 'r')

# انجام عملیات با فایل

# بستن فایل
file.close()

در اینجا فایل example.txt را برای خواندن باز کرده و سپس آن را بسته‌ایم.

** ۲. خواندن از فایل
برای خواندن محتوای فایل از متدهای read, readline و readlines استفاده می‌کنیم.**

خواندن کل محتوا با read

file = open('example.txt', 'r')
content = file.read()
print(content)
file.close()

در این مثال، تمام محتوای فایل example.txt خوانده و چاپ می‌شود.

خواندن یک خط با readline

file = open('example.txt', 'r')
line = file.readline()
print(line)
file.close()

در این مثال، فقط یک خط از فایل خوانده و چاپ می‌شود.

خواندن تمام خطوط با readlines

file = open('example.txt', 'r')
lines = file.readlines()
for line in lines:
print(line)
file.close()

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

** ۳. نوشتن به فایل
برای نوشتن در فایل از متد write استفاده می‌کنیم.**

نوشتن در فایل
file = open('example.txt', 'w')
file.write('Hello, World!\n')
file.write('This is a test.\n')
file.close()

در این مثال، دو خط متن به فایل example.txt نوشته می‌شود.

اضافه کردن به فایل
file = open('example.txt', 'a')
file.write('Appending a new line.\n')
file.close()

در این مثال، یک خط جدید به انتهای فایل example.txt اضافه می‌شود.

** ۴. استفاده از with برای مدیریت فایل‌ها
با استفاده از کلمه کلیدی with می‌توانیم به طور خودکار فایل را پس از اتمام عملیات ببندیم.**

استفاده از with
with open('example.txt', 'r') as file:
content = file.read()
print(content)

در این مثال، فایل example.txt برای خواندن باز شده و پس از اتمام عملیات، به طور خودکار بسته می‌شود.

**۵. کار با فایل‌های CSV
برای کار با فایل‌های CSV از کتابخانه csv استفاده می‌کنیم.**

خواندن فایل CSV
import csv

with open('data.csv', 'r') as file:
reader = csv.reader(file)
for row in reader:
print(row)

در این مثال، فایل data.csv خوانده شده و هر ردیف آن چاپ می‌شود.

نوشتن به فایل CSV
import csv

with open('data.csv', 'w', newline='') as file:
writer = csv.writer(file)
writer.writerow(['Name', 'Age', 'City'])
writer.writerow(['Ali', 25, 'Tehran'])
writer.writerow(['Sara', 30, 'Mashhad'])

در این مثال، داده‌ها به فایل data.csv نوشته می‌شوند.

** ۶. مدیریت فایل‌های JSON
برای کار با فایل‌های JSON از کتابخانه json استفاده می‌کنیم.**

خواندن فایل JSON
import json

with open('data.json', 'r') as file:
data = json.load(file)
print(data)

در این مثال، فایل data.json خوانده شده و محتوای آن چاپ می‌شود.

نوشتن به فایل JSON
import json

data = {
'name': 'Ali',
'age': 25,
'city': 'Tehran'
}

with open('data.json', 'w') as file:
json.dump(data, file)

در این مثال، داده‌ها به فایل data.json نوشته می‌شوند.
__________
تمرین‌ها

1. یک فایل متنی به نام notes.txt ایجاد کنید و چند خط متن به آن اضافه کنید. سپس محتوای آن را بخوانید و چاپ کنید.


   with open('notes.txt', 'w') as file:
file.write('Line 1\n')
file.write('Line 2\n')

with open('notes.txt', 'r') as file:
content = file.read()
print(content)
2. یک فایل CSV به نام employees.csv ایجاد کنید که شامل ستون‌های Name, Age و Department باشد و چند ردیف داده به آن اضافه کنید. سپس داده‌های فایل را بخوانید و چاپ کنید.


   import csv

with open('employees.csv', 'w', newline='') as file:
writer = csv.writer(file)
writer.writerow(['Name', 'Age', 'Department'])
writer.writerow(['Ali', 25, 'IT'])
writer.writerow(['Sara', 30, 'HR'])

with open('employees.csv', 'r') as file:
reader = csv.reader(file)
for row in reader:
print(row)

3. یک فایل JSON به نام config.json ایجاد کنید که شامل تنظیمات مختلف یک برنامه باشد. سپس تنظیمات را از فایل خوانده و چاپ کنید.


   import json

config = {
'setting1': 'value1',
'setting2': 'value2',
'setting3': 'value3'
}

with open('config.json', 'w') as file:
json.dump(config, file)

with open('config.json', 'r') as file:
settings = json.load(file)
print(settings)

(آموزش کامل پایتون توی کانال ما)

#پایتون #آموزش_پایتون #برنامه_نویسی #مدیریت_فایل #فایل_متنی #CSV #JSON
👍4
پارت ۱۰: مدیریت استثناها در پایتون 🛠️🐍

در این پارت، به بررسی مدیریت استثناها در پایتون می‌پردازیم. استثناها شرایط خاصی هستند که در زمان اجرای برنامه رخ می‌دهند و می‌توانند منجر به خطا شوند. پایتون ابزارهایی برای مدیریت این استثناها فراهم می‌کند تا برنامه‌ها به طور روان‌تری اجرا شوند و از برخورد با خطاهای غیرمنتظره جلوگیری شود.

۱. ساختار کلی مدیریت استثناها
پایتون از بلوک‌های try, except, else و finally برای مدیریت استثناها استفاده می‌کند.

بلوک try و except

try:
# کد اصلی که ممکن است خطا ایجاد کند
x = 1 / 0
except ZeroDivisionError:
# کد مدیریت خطا
print("خطا: تقسیم بر صفر غیرمجاز است.")

در این مثال، سعی می‌کنیم عددی را بر صفر تقسیم کنیم که منجر به خطای ZeroDivisionError می‌شود. در بلوک except، این خطا را مدیریت کرده و پیام خطا را چاپ می‌کنیم.

بلوک else

try:
x = 10 / 2
except ZeroDivisionError:
print("خطا: تقسیم بر صفر غیرمجاز است.")
else:
print(f"نتیجه تقسیم: {x}")

در اینجا، اگر هیچ خطایی رخ ندهد، بلوک else اجرا می‌شود و نتیجه عملیات چاپ می‌شود.

بلوک finally

try:
x = 10 / 0
except ZeroDivisionError:
print("خطا: تقسیم بر صفر غیرمجاز است.")
finally:
print("این بلوک همیشه اجرا می‌شود.")

بلوک finally همیشه، چه خطایی رخ دهد و چه رخ ندهد، اجرا می‌شود.

۲. مدیریت چندین نوع استثنا
می‌توانیم چندین نوع استثنا را در یک بلوک except مدیریت کنیم.

try:
x = int(input("یک عدد وارد کنید: "))
y = 10 / x
except ZeroDivisionError:
print("خطا: تقسیم بر صفر غیرمجاز است.")
except ValueError:
print("خطا: لطفا یک عدد صحیح وارد کنید.")

در این مثال، هم خطای تقسیم بر صفر و هم خطای ورود داده نامعتبر مدیریت می‌شود.

۳. ایجاد استثنای سفارشی
می‌توانیم استثناهای سفارشی خود را با ایجاد یک کلاس جدید تعریف کنیم.

class MyCustomError(Exception):
pass

try:
raise MyCustomError("این یک استثنای سفارشی است.")
except MyCustomError as e:
print(e)

در اینجا، یک استثنای سفارشی به نام MyCustomError ایجاد کرده‌ایم و از آن استفاده می‌کنیم.

۴. نمونه‌های عملی
خواندن فایل و مدیریت استثناها

try:
with open('example.txt', 'r') as file:
content = file.read()
except FileNotFoundError:
print("خطا: فایل یافت نشد.")
else:
print(content)
finally:
print("پایان عملیات فایل.")

در این مثال، سعی می‌کنیم یک فایل را بخوانیم و در صورت عدم وجود فایل، خطای FileNotFoundError را مدیریت می‌کنیم.

ورودی کاربر و مدیریت استثناها

try:
number = int(input("یک عدد وارد کنید: "))
result = 10 / number
except ValueError:
print("خطا: لطفا یک عدد صحیح وارد کنید.")
except ZeroDivisionError:
print("خطا: تقسیم بر صفر غیرمجاز است.")
else:
print(f"نتیجه: {result}")
finally:
print("پایان عملیات.")

در اینجا، ورود کاربر را مدیریت کرده و در صورت ورود داده نامعتبر یا تقسیم بر صفر، خطاها را مدیریت می‌کنیم.



تمرین‌ها

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


   try:
a = int(input("عدد اول را وارد کنید: "))
b = int(input("عدد دوم را وارد کنید: "))
result = a / b
except ValueError:
print("خطا: لطفا یک عدد صحیح وارد کنید.")
except ZeroDivisionError:
print("خطا: تقسیم بر صفر غیرمجاز است.")
else:
print(f"نتیجه تقسیم: {result}")
finally:
print("پایان عملیات.")

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


   try:
with open('data.txt', 'r') as file:
lines = file.readlines()
except FileNotFoundError:
print("خطا: فایل یافت نشد.")
else:
print(f"تعداد خطوط فایل: {len(lines)}")
finally:
print("پایان عملیات فایل.")

3. یک استثنای سفارشی ایجاد کنید که زمانی که کاربر سنی کمتر از ۱۸ سال وارد می‌کند، آن را مدیریت کند.
class UnderageError(Exception):
pass
try:
age = int(input("سن خود را وارد کنید: "))
if age < 18:
raise UnderageError("خطا: شما زیر ۱۸ سال هستید.")
except ValueError:
print("خطا: لطفا یک عدد صحیح وارد کنید.")
except UnderageError as e:
print(e)
finally:
print("پایان بررسی سن.")



🔗لینک کانال ما 👇
(https://t.iss.one/hamidpython123)

#پایتون #آموزش_پایتون #برنامه_نویسی #مدیریت_استثنا #مدیریت_خطا #Exception_Handling
👍4
📝 نکته‌ای که شاید ندانید: استفاده از Memory-Mapped Files در پایتون

Memory-Mapped Files یا فایل‌های نگاشت شده به حافظه، یک تکنیک پیشرفته برای دسترسی به محتوای فایل‌ها است که به شما اجازه می‌دهد تا به بخش‌های مختلف یک فایل بزرگ بدون نیاز به خواندن کل آن، دسترسی پیدا کنید. این تکنیک می‌تواند در بهینه‌سازی عملکرد و کاهش مصرف حافظه موثر باشد.

پایتون با استفاده از ماژول mmap این قابلیت را فراهم می‌کند. در اینجا یک مثال ساده برای استفاده از mmap آورده شده است:

💻 مثال: خواندن و نوشتن در فایل با استفاده از Memory-Mapped Files

import mmap

# باز کردن فایل 📂
with open("example.txt", "r+b") as f:
# ایجاد یک memory-map به اندازه کل فایل 📜
mm = mmap.mmap(f.fileno(), 0)

# خواندن اولین خط فایل 📖
first_line = mm.readline()
print("First Line:", first_line.decode('utf-8'))

# جایگزینی محتوای خاص در فایل ✏️
mm.seek(0) # برگشت به ابتدای فایل
mm.write(b'New content that replaces old content\n')

# بستن memory-map 🗄️
mm.close()

توضیح:
1. باز کردن فایل: ابتدا فایل را در حالت خواندن و نوشتن باینری باز می‌کنیم (r+b). 📂
2. ایجاد memory-map: یک mmap ایجاد می‌کنیم که به کل فایل نگاشت می‌شود. 📜
3. خواندن از فایل: می‌توانیم مانند یک فایل عادی از mmap بخوانیم. 📖
4. نوشتن در فایل: می‌توانیم محتوای فایل را تغییر دهیم بدون نیاز به بارگذاری کل فایل در حافظه. ✏️
5. بستن memory-map: پس از انجام عملیات، memory-map را می‌بندیم. 🗄️

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

💡 نکته خیلی خیلی مهم: استفاده از memory-mapped files می‌تواند به شدت به بهبود عملکرد و کارایی برنامه‌های شما در مواقعی که نیاز به دسترسی سریع به بخش‌های خاصی از فایل دارید، کمک کند. 🚀

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

(نکته ها اموزشای بیشتر اینجا کلیک کن)

#پایتون #برنامه_نویسی #فایل_ها #بهینه_سازی #حافظه
👍5
👍5
ساخت یک مفسر ساده در پایتون 🚀

مرحله ۱: تعریف زبان برنامه‌نویسی 📜

ابتدا باید قواعد و دستورات زبان برنامه‌نویسی خودتون رو تعریف کنید. برای این آموزش، ما یک زبان ساده به نام "MiniLang" با دستورات پایه‌ای تعریف می‌کنیم:

1. دستور PRINT برای چاپ متن.
2. دستور SET برای تعریف متغیرها.
3. دستور ADD برای جمع کردن مقادیر.

مرحله ۲: نوشتن Lexer 🔍

Lexer یا تجزیه‌کننده لغوی، متن برنامه را به توکن‌ها (قطعات کوچکتر) تقسیم می‌کند.

import re

def lexer(code):
tokens = []
for line in code.splitlines():
line = line.strip()
if line:
if line.startswith("PRINT"):
tokens.append(("PRINT", line[6:]))
elif line.startswith("SET"):
match = re.match(r"SET (\w+) (.+)", line)
if match:
tokens.append(("SET", match.group(1), match.group(2)))
elif line.startswith("ADD"):
match = re.match(r"ADD (\w+) (\w+)", line)
if match:
tokens.append(("ADD", match.group(1), match.group(2)))
return tokens

مرحله ۳: نوشتن Parser 🔍

Parser یا تجزیه‌کننده نحوی، توکن‌ها را به دستورات قابل اجرا تبدیل می‌کند.

def parser(tokens):
commands = []
for token in tokens:
if token[0] == "PRINT":
commands.append(("PRINT", token[1]))
elif token[0] == "SET":
commands.append(("SET", token[1], token[2]))
elif token[0] == "ADD":
commands.append(("ADD", token[1], token[2]))
return commands

مرحله ۴: اجرای دستورات 🏃‍♂️

Interpreter یا مفسر، دستورات را اجرا می‌کند.

def interpreter(commands):
variables = {}
for command in commands:
if command[0] == "PRINT":
print(command[1])
elif command[0] == "SET":
variables[command[1]] = eval(command[2], {}, variables)
elif command[0] == "ADD":
if command[1] in variables and command[2] in variables:
variables[command[1]] += variables[command[2]]
return variables

مرحله ۵: استفاده از مفسر 📟

حالا کد کامل برای مفسر خودمون رو داریم. می‌تونیم یک برنامه MiniLang رو اجرا کنیم.

code = """
SET x 5
SET y 10
ADD x y
PRINT x
"""

tokens = lexer(code)
commands = parser(tokens)
interpreter(commands)

این کد مقدار ۱۵ را چاپ خواهد کرد چون ابتدا مقدار ۵ به متغیر x و مقدار ۱۰ به متغیر y اختصاص داده شده و سپس این دو مقدار با هم جمع شده و نتیجه چاپ می‌شود.

[آموزش ساخت مفسر]

#Python #Programming #CodingTips #LearnPython #Interpreter #MiniLang
👍2
👇نمونش کامل 👇

import re

# Lexer: تبدیل کد به توکن‌ها
def lexer(code):
tokens = []
for line in code.splitlines():
line = line.strip()
if line:
if line.startswith("PRINT"):
tokens.append(("PRINT", line[6:]))
elif line.startswith("SET"):
match = re.match(r"SET (\w+) (.+)", line)
if match:
tokens.append(("SET", match.group(1), match.group(2)))
elif line.startswith("ADD"):
match = re.match(r"ADD (\w+) (\w+)", line)
if match:
tokens.append(("ADD", match.group(1), match.group(2)))
return tokens

# Parser: تبدیل توکن‌ها به دستورات قابل اجرا
def parser(tokens):
commands = []
for token in tokens:
if token[0] == "PRINT":
commands.append(("PRINT", token[1]))
elif token[0] == "SET":
commands.append(("SET", token[1], token[2]))
elif token[0] == "ADD":
commands.append(("ADD", token[1], token[2]))
return commands

# Interpreter: اجرای دستورات
def interpreter(commands):
variables = {}
for command in commands:
if command[0] == "PRINT":
if command[1] in variables:
print(variables[command[1]])
else:
print(command[1])
elif command[0] == "SET":
variables[command[1]] = eval(command[2], {}, variables)
elif command[0] == "ADD":
if command[1] in variables and command[2] in variables:
variables[command[1]] += variables[command[2]]
return variables

# کد نمونه MiniLang
code = """
SET x 5
SET y 10
ADD x y
PRINT x
"""

# اجرای مراحل Lexer، Parser و Interpreter
tokens = lexer(code)
commands = parser(tokens)
interpreter(commands)
👍6
آقا سه ری اکشن بزنین ادن روحیه فعالیت بگیره خو
👍63
🔴اینو جواب بدید دیگه خدایش میخام برای منظم شدن چنل
Anonymous Poll
76%
تازه کار هستم 🥺
24%
کهنه کار و حرفه ای🤫😏
سلام دوستان ❤️
ادمین جدید هستم
امیدوارم از من خوشتون بیاد 😅

قراره چالش ها و دانستنی های زیادی درباره پایتون داشته باشیم✔️

ری‌اکشن بیشتر = حمایت از ما ❤️
👇
5👍2
Python3
🔴اینو جواب بدید دیگه خدایش میخام برای منظم شدن چنل
برای بهتر شدن پست های چنل ، لطفاً جواب این نظرسنجی رو بدید 🥰
👍6
صبح بخیر دوستان ☕️
6
🌟 ۷ خبر مهم امروز از دنیای پایتون 🌟

📰 #1: گوگل سرویس جدید Cloud AI Notebooks را با پشتیبانی از پایتون عرضه کرد ☁️🤖
امروز گوگل سرویس Cloud AI Notebooks را معرفی کرد. این سرویس به طور ویژه برای پروژه‌های هوش مصنوعی و یادگیری ماشین طراحی شده و از پایتون پشتیبانی می‌کند. گوگل اعلام کرده که این ابزار جدید به توسعه‌دهندگان کمک می‌کند تا سریع‌تر و کارآمدتر کار کنند.


📰 #2: انتشار نسخه جدید FastAPI 0.70 🚀
کتابخانه محبوب FastAPI نسخه 0.70 خود را منتشر کرد. این نسخه شامل بهبودهایی در مستندات و رفع برخی باگ‌ها است. توسعه‌دهندگان می‌توانند از این به‌روزرسانی‌ها برای ساخت APIهای سریع و کارآمدتر بهره ببرند.


📰 #3: معرفی ابزار جدید Poetry برای مدیریت وابستگی‌ها 📦
ابزار Poetry به عنوان یک ابزار قدرتمند برای مدیریت وابستگی‌ها و بسته‌بندی پروژه‌های پایتون معرفی شده است. این ابزار با استفاده آسان و ویژگی‌های متنوع خود، جایگزین مناسبی برای pip و virtualenv محسوب می‌شود.


📰 #4: پیشرفت‌های جدید در Pandas 1.3.3 🧮
کتابخانه Pandas نسخه 1.3.3 خود را منتشر کرد. این نسخه شامل بهبودهایی در عملکرد و افزایش قابلیت‌های جدید برای تجزیه و تحلیل داده‌ها می‌باشد. اگر با داده‌ها کار می‌کنید، حتماً به این به‌روزرسانی نگاهی بیاندازید.


📰 #5: معرفی دوره جدید "Machine Learning with Python" توسط Coursera 📚
پلتفرم آموزشی Coursera دوره جدیدی با عنوان "Machine Learning with Python" را معرفی کرد. این دوره توسط متخصصان برجسته طراحی شده و برای تمامی سطوح مناسب است. اگر به یادگیری ماشین علاقه دارید، این دوره را از دست ندهید.


📰 #6: برگزاری کنفرانس PyCon 2024 در آمستردام 🇳🇱
خبر هیجان‌انگیز برای علاقه‌مندان به پایتون! کنفرانس سالانه PyCon 2024 در آمستردام برگزار خواهد شد. این رویداد فرصتی عالی برای شبکه‌سازی و آشنایی با آخرین پیشرفت‌ها و ابزارهای پایتون فراهم می‌کند.


📰 #7: به‌روزرسانی افزونه VSCode برای توسعه‌دهندگان پایتون 🛠️
افزونه VSCode برای توسعه‌دهندگان پایتون به‌روز شده و امکانات جدیدی از جمله تکمیل خودکار کد و دیباگینگ پیشرفته به آن افزوده شده است. این به‌روزرسانی تجربه توسعه با پایتون را بهبود می‌بخشد و کار را برای برنامه‌نویسان راحت‌تر می‌کند.


📢 با دنبال کردن کانال تلگرام ما، از آخرین اخبار و به‌روزرسانی‌های دنیای پایتون مطلع شوید!


(اینجا کلیک کن تا از اخبار مهم پایتون با خبر باشی)


#Python #Google #AI #FastAPI #Python #Poetry #DependencyManagement #MachineLearning #Python
#VSCode #IDE #Python
#PythonNews #TelegramChannel
👍2
دانستی مخفی درباره پایتون 🐍

صبح بخیر دوستان! 🌞 آیا می‌دانستید که در پایتون، می‌توانید از توابعی استفاده کنید که درون خودشان صدا زده می‌شوند، به این حالت توابع بازگشتی می‌گویند (Recursion)!؟ شاید این ویژگی برای بسیاری ناشناخته باشد، اما با استفاده از این روش، می‌توانید مسائل پیچیده را به سادگی حل کنید.

یک مثال ساده از توابع بازگشتی، محاسبه فاکتوریل یک عدد است:

def factorial(n):
if n == 1:
return 1
else:
return n * factorial(n - 1)

print(factorial(5)) # خروجی: 120
در این مثال، تابع factorial خودش را برای مقدارهای کوچکتر از n صدا می‌زند تا به مقدار نهایی برسد. این نکته کوچک می‌تواند برای بسیاری از مسائل ریاضی و الگوریتمی، کد شما را بسیار کوتاه‌تر و کارآمدتر کند. 🌟

روز خوبی داشته باشید! ☀️

[اینم لینک کانال ما ]

#Python #Recursion #CodingTips #ProgrammingSecrets #صبح_بخیر #پایتون #نکته_پایتون
👍1
نظرتون چیه یه چالش یهویی برگذار کنیم😅🏆

توجه : چالش جایزه خاصی نداره فقط برای اندازه گیری توان شما در کدنویسی هست ❗️
👍5
برگذار بشه = 👍
برگذار نشه = 👎
👍7
#چالش
از همین الان بهترین کد های خودتون رو بفرستید به پیوی «
@Mr_Xplus » ❤️‍🔥

3 تا از بهترین کدها رو داخل چنل قرار میدیم ❤️‍🔥


ساعت 1 چالش تموم میشه
2👍2
فقط یک ساعت مونده تا پایان چالش🎖🔥
👍4
چالش تمام شد
4👎1