برای موفق شدن 🌱 با این عبارت خداحافظی کن: "باشه فردا"🍃 💻 برای دسترسی راحت تر به مطالب به "لیست پین شده" برو🙃 👩💻 Support: @narges_madhi 🪧 ads: @teachifyads 💁♀️ instagram : instagram.com/teachify_ir
✔️چگونه اطلاعات اضافی را در رابطههای ManyToMany جنگو ذخیره کنیم؟
در جنگو، روابط چند به چند بهصورت پیشفرض ساده هستند و تنها رابطه بین دو مدل را نگهداری میکنند. اما وقتی نیاز به ذخیره اطلاعات اضافی درباره این رابطه دارید (مثل تاریخ، وضعیت، یا توضیحات)، باید از ویژگی قدرتمند through استفاده کنید. بیایید با جزئیات این مفهوم را بررسی کنیم:
اگر بهصورت ساده از ManyToManyField
استفاده کنید، جنگو خودش یک جدول واسط (Intermediate Table) برای مدیریت رابطه بین دو مدل ایجاد میکند که در تصویر مدل BookAuthor میباشد.
در این حالت جنگو خودکار جدولی ایجاد میکند که تنها دو ستون دارد و شما نمیتوانید اطلاعات اضافه (مثل تاریخ انتشار یا نقش نویسنده) را ذخیره کنید.
| book_id | author_id |
وقتی نیاز دارید اطلاعات بیشتری در مورد رابطه ذخیره کنید، through به شما امکان میدهد یک مدل سفارشی برای جدول واسط بسازید. این مدل میتواند علاوه بر کلیدهای خارجی، فیلدهای اضافی هم داشته باشد.
فرض کنید میخواهید رابطه بین کتاب و نویسنده را ذخیره کنید و علاوه بر آن، تاریخ انتشار همکاری را نیز نگهدارید، کد شما به صورت تصویر پیوست شده خواهد بود.
ایجاد نویسنده و کتاب:
author = Author.objects.create(name="John Doe")
book = Book.objects.create(title="Python for Beginners")
BookAuthor.objects.create(book=book, author=author, publication_date="2024-01-01")
relations = BookAuthor.objects.all()
for relation in relations:
print(f"{relation.author.name} wrote '{relation.book.title}' on {relation.publication_date}")
✔️ تفاوت copy و deepcopy در پایتون!
کپی ساده (Shallow Copy):
وقتی یک کپی ساده از یک شیء میگیرید، فقط ارجاع به عناصر اصلی درون شیء ساخته میشه.
import copy
original_list = [1, 2, [3, 4]]
shallow_copy = copy.copy(original_list)
# تغییر در لیست اصلی
original_list[0] = 100
print("Original:", original_list) # [100, 2, [3, 4]]
print("Shallow Copy:", shallow_copy) # [1, 2, [3, 4]]
# تغییر در یک عنصر تو در تو
original_list[2][0] = 300
print("Original:", original_list) # [100, 2, [300, 4]]
print("Shallow Copy:", shallow_copy) # [1, 2, [300, 4]]
deep_copy = copy.deepcopy(original_list)
# تغییر در عنصر تو در تو
original_list[2][0] = 500
print("Original:", original_list) # [100, 2, [500, 4]]
print("Deep Copy:", deep_copy) # [1, 2, [300, 4]]
✔️ تفاوت 3 نوع دیتاتایپ لیست، تاپل و ست در پایتون چیست؟
1. لیست (List)
تغییرپذیر (Mutable): میتوانید عناصر را اضافه، حذف یا تغییر دهید.
مرتب (Ordered): ترتیب عناصر همانطور که اضافه شدهاند حفظ میشود.
اجازه مقادیر تکراری: میتوانید مقادیر تکراری داشته باشید.
از براکت ([]) برای تعریف استفاده میشود.
my_list = [1, 2, 3, 3, 4]
my_list.append(5) # اضافه کردن عنصر
my_list[0] = 10 # تغییر مقدار
print(my_list) # خروجی: [10, 2, 3, 3, 4, 5]
my_tuple = (1, 2, 3, 3, 4)
# my_tuple[0] = 10 # خطا: تغییرناپذیری
print(my_tuple[1]) # دسترسی به عنصر دوم: 2
my_set = {1, 2, 3, 3, 4}
my_set.add(5) # اضافه کردن عنصر
print(my_set) # خروجی: {1, 2, 3, 4, 5} (بدون تکرار و ترتیب مشخص)
مسیر برگشت از مصاحبه 🥲
مصاحبه کننده در یک کلام عالی بود❤️
✅ @Teachify | برنامه نویسی
کی امروز از اینجا رد شده؟
✅ @Teachify | برنامه نویسی
فردا مصاحبه دارم
پس فردا مصاحبه دارم
یه مصاحبه برای پریروز بود که کنسل کردن و تایمش رو گفتن اعلام میکنن که ممکنه اونم همین 2-3 روز دیگه باشه :))
پ.ن: هنوز قسمت نشده از فریلنسری دربیام بیرون :|
سوالاتی که ازم پرسیده میشه رو حتما براتون میذارم.
✅ @Teachify | برنامه نویسی
✔️ اضافه کردن و حذف عناصر از هر دو طرف لیست
اگر میخواهید عناصری را از هر دو طرف یک لیست اضافه یا حذف کنید، میتوانید از deque (صف دوطرفه) استفاده کنید. برخلاف لیستهای معمولی که فقط امکان اضافه یا حذف عناصر از یک طرف را میدهند، deque این امکان را فراهم میکند که از هر دو طرف لیست (چپ و راست) عناصر را مدیریت کنید.
این ویژگی زمانی که با دادههای بزرگ یا ساختارهایی مثل پشته و صف کار میکنید بسیار کاربردی است. برای استفاده از deque باید ماژول collections را وارد کنید. مثال زیر نشان میدهد که چطور میتوانید از این قابلیت بهره ببرید:
from collections import deque
# Create a deque
queue = deque()
# Add elements to both ends
queue.append(10) # Add to the right end
queue.appendleft(5) # Add to the left end
# Remove elements from both ends
right = queue.pop() # Remove from the right end
left = queue.popleft() # Remove from the left end
print(f"Right end: {right}, Left end: {left}")
Right end: 10, Left end: 5
✔️ ساخت توابع خاص با functools.partial در پایتون
قابلیت functools.partial
به شما کمک میکنه که از یک تابع موجود، نسخهای بسازید که برخی از ورودیهاش بهصورت پیشفرض تنظیم شده باشه.
فرض کنید تابعی دارید که دو عدد رو ضرب میکنه:
from functools import partial
# تعریف تابع اصلی
def multiply(x, y):
return x * y
# ساخت یک تابع جدید که مقدار x همیشه 5 باشه
partial_func = partial(multiply, 5)
# استفاده از تابع جدید
print(partial_func(3)) # خروجی: 15
print(partial_func(10)) # خروجی: 50
partial
میتونیم یک نسخه جدید از تابع بسازیم که فقط یک عدد رو بگیره و مقدار x
همیشه 5 باشه! ✔️ فشردهسازی شرطها در پایتون با استفاده از all و any
گاهی نیاز دارید چندین شرط را همزمان بررسی کنید، اما نمیخواهید کدتان شلوغ و ناخوانا شود. اینجاست که توابع all و any به کمک شما میآیند!
فرض کنید میخواهید بررسی کنید که آیا تمام اعداد یک لیست مثبت هستند:
numbers = [3, 7, 9, 12]
if all(num > 0 for num in numbers):
print("All numbers are positive!")
if any(num % 2 == 0 for num in numbers):
print("At least one number is even!")
✔️مدیریت فنی در گوگل - Kianoosh Mokhtarian
توی این قسمت از اپیزود طبقه 16، کیانوش مختاریان، مدیر و رهبر فنی در گوگل از مسیر جذاب خودش، از دانشگاه شریف تا کار در گوگل و نهایتاً بازگشت به ایران حرف میزنه
موضوعات جذاب گفتگو:
اهمیت یادگیری زبانهای مختلف برنامهنویسی و الگوریتمها تو دنیای واقعی
مهارتهای نرم و کار تیمی
نکات کلیدی برای موفقیت در فرآیند استخدام گوگل
اگه به مهندسی نرمافزار، توسعه فردی و کار در شرکتهای بزرگ علاقه داری، این گفتگو یه فرصت عالی برای یادگیری و الهام گرفتنه.
https://youtu.be/oXbVKzIt-gQ?si=sM37GBtw5JUGovj3
#گوگل #برنامهنویسی #مهندسی_نرمافزار #مصاحبه
✅@Teachify | برنامه نویسی
✔️ توی یک #مصاحبه ای بودم
مصاحبه کننده واقعا درک کافی از مصاحبه رو داشت و من خیلی خوشم اومد از این مصاحبه.
سوالاتی که میپرسید بیشتر توی حوزه مهندسی نرم افزار بود و میخواست ببینه جواب من و تفکرات من به چه صورته ...
و در آخر هم گفت نیاز نیست شما با مصاحبه کننده های بعدی مقایسه بشید، شما با خودتون و با توجه به رزومه خودتون مقایسه میشید.
✅@Teachify | برنامه نویسی
فک کن یه تسک داری که باید انجام بدی
محدودیت کامل زمانی هم داری،
اونوقت آنتن و اینترنت و همه چی به یک باره قط بشه :/
چیکار میکنی؟
✅@Teachify | برنامه نویسی
✔️ متدهای جادویی __getitem__ و __setitem__ در پایتون
در پایتون میتونید با __getitem__
و __setitem__
یک شیء رو مثل لیستها و دیکشنریها مدیریت کنید! این متدها امکان دسترسی و تغییر عناصر با اندیسگذاری رو فراهم میکنند.
مثال:
class CustomList:
def __init__(self, data):
self.data = data
def __getitem__(self, index):
return self.data[index]
def __setitem__(self, index, value):
self.data[index] = value
clist = CustomList([10, 20, 30])
print(clist[1]) # دسترسی به اندیس 1
clist[1] = 50 # تغییر اندیس 1 به 50
✔️ آشنایی با کتابخانه Requests در پایتون
کتابخانه Requests یکی از قدرتمندترین ابزارهای پایتون برای ارسال درخواستهای HTTP است که کار را با APIها و ارتباطات وبی ساده میکند. این کتابخانه به شما امکان میدهد به راحتی درخواستهای GET، POST، PUT و DELETE را ارسال و پاسخها را مدیریت کنید.
▪️نمونه کد برای درخواست GET:
import requests
response = requests.get('https://api.example.com/data')
if response.status_code == 200:
data = response.json()
print(data)
else:
print("درخواست با شکست مواجه شد!")
✔️ مشکل کوئری N+1 در جنگو
این مشکل زمانی پیش میاد که برای هر رکورد، کوئریهای اضافی به دیتابیس ارسال بشه تا اطلاعات مرتبط رو بگیریم. مثلاً فرض کنید میخواید لیستی از کتابها و نویسندههاشون رو نمایش بدید، و به ازای هر کتاب، اطلاعات نویسنده رو بهصورت جداگانه دریافت میکنید. در این حالت، کوئریهای زیادی به دیتابیس ارسال میشه که باعث کاهش سرعت برنامه میشه!
راهحلهای Django برای حل مشکل N+1:
استفاده از select_related: برای روابط OneToOne یا ForeignKey از select_related استفاده کنید تا کوئریها بهینه بشن و دادهها رو با یک کوئری بازیابی کنید.
استفاده از prefetch_related: برای روابط ManyToMany یا ForeignKey معکوس بهتره از prefetch_related استفاده کنید که کمک میکنه دادههای مرتبط با چندین کوئری از پیش فراخوانی بشن.
✅ @Teachify | برنامه نویسی
یکی از جنبه های اصلی ORM که معمولا نادیده گرفته میشه!
این جنبه اینه که ORM میتونه رفتار خاص هر پایگاه داده رو مدیریت کنه و توسعهدهنده رو از این پیچیدگیها بینیاز کنه.
از اونجایی که دیتابیسها اصول و رفتارهای خاص خودشون رو دارن، مثلاً:
گویشهای SQL یا SQL Dialect:
هر پایگاه داده (مثل MySQL، PostgreSQL یا Oracle) نسخه خاص خودش از SQL رو داره که ممکنه در جزئیات مثل نحوه نوشتن کوئری، نوع دادهها یا عملیات پیشرفته تفاوت داشته باشه. ORM این تفاوتها رو پنهان میکنه و شما میتونید با یک زبان واحد (مثل کدهای پایتون در SQLAlchemy یا Django ORM) کار کنید.
بهینهسازی عملکرد:
از اونجایی که ORM میدونه هر دیتابیس در چه چیزی قویتره (مثلاً PostgreSQL برای Queryهای پیچیده عالیه، ولی SQLite برای عملیاتهای سبک مناسبتره) و سعی میکنه بهینهترین کوئریها رو برای اون دیتابیس تولید کنه.
محدودیتهای خاص دیتابیسها:
مثلاً برخی دیتابیسها از ویژگیهای خاصی مثل Partial Indexes، Full Text Search یا JSON Fields پشتیبانی میکنن. ORMها اغلب این قابلیتها رو شناسایی کرده و ازشون استفاده میکنن.
مدیریت اتصال و تنظیمات خاص:
با استفاده از ORMها تنظیمات خاص دیتابیس مثل زمانبندی اتصالات، مدیریت تراکنشها و تنظیمات سطح دسترسی رو به طور خودکار انجام میشن.
در نتیجه با استفاده از ORM، نیازی نیست که توسعهدهنده خودش با پیچیدگیهای دیتابیس خاصی درگیر بشه. ORM این نقش رو بر عهده میگیره و به سیستم کمک میکنه که بفهمه دقیقاً با چه دیتابیسی سروکار داره و چطور باید باهاش رفتار کنه.
این یعنی، ORM فراتر از یک ابزار برای تبدیل اشیا به جداول عمل میکنه؛ بلکه یه مدیر هوشمند بین دیتابیس و برنامه است که باعث میشه توسعه نرمافزار راحتتر، سریعتر و سازگارتر با انواع دیتابیسها باشه.
✅ @Teachify | برنامه نویسی
✔️ مقایسه زبانهای برنامهنویسی!!!
یک تحلیل جذاب از عملکرد زبانهای مختلف برنامهنویسی:
نکات مهم:
- زبان های Java و Kotlin عملکرد بسیار سریعی دارند؛ احتمالاً به دلیل تمرکز ویژه گوگل روی بهینهسازی این زبانها.
- زبان JavaScript در بین زبانهای تفسیری و JIT، از نظر سرعت عملکردی فوقالعاده دارد.
- زبان Python، در مقایسه با سایر زبانها، بدون استفاده از ابزارهایی مثل PyPy نسبتاً کندتر است.
📂 کدهای مربوط به این بررسی را میتوانید در مخزن زیر ببینید:
https://github.com/bddicken/languages
#برنامهنویسی
✅ @Teachify | برنامه نویسی
توی این مصاحبه سوالات زیاد بود به خصوص pure python.
حتما سرفرصت براتون تا جایی که یادم میاد مینویسم
ترب یه آگهی استخدام گذاشته و تکنولوژی های مورد استفاده اش رو گفته:
یکم خودتون رو محک بزنید :))
زبان برنامهنویسی: پایتون، جاوا اسکریپت.
فریمورک به ترتیب اهمیت: Django, React, Starlette, FastAPI, Flask.
ذخیره و بازیابی اطلاعات به ترتیب اهمیت: postgresql, elasticsearch, redis, mongo, MinIO, ClickHouse, Influx, Prometheus,
داشبورد: grafana, kibana, metabase, amplitude.
زیرساخت: docker, kubernetes.
کنترلپروژه: gitlab.
تست و دیپلوی: gitlab-ci.
لینک جابینجا
✅ @Teachify | برنامه نویسی
دوستان این پروژه رو میتونید توی لینک زیر ببینید:
https://github.com/yousefvafaei/Django-Upload-Manager
حتما اگه وقتش رو داشتین تست کنین و نظراتتون رو برام بگین.
اگه کدهاش رو دیدین و براتون مفید بود ممنون میشم اگه star بدین.
✔️ پورتهای پیشفرض برخی از پایگاه دادههای مهم
دیتابیس SQLite بدون پورت (فایلمحور است).
دیتابیس PostgreSQL با پورت 5432
دیتابیس MySQL/MariaDB با پورت 3306
دیتابیس Oracle با پورت 1521
دیتابیس SQL Server با پورت 1433
دیتابیس MongoDB با پورت 27017
✅ @Teachify | برنامه نویسی
✔️ خوبه قبل از برنامه نویس شدن اینا رو ندیدم :)))
#fun #فان
✅ @Teachify | برنامه نویسی
✔️ یه roadmap خوب برای SQL
✅ @Teachify | برنامه نویسی
Finally after a week🥲
✅ @Teachify | برنامه نویسی
من هنوز درگیر اینما :))
واس همون کم پست میذارم🥲
همین چیزاست که باعث میشه شبا بیدار بمونیم و کار کنیم.🥲
پ.ن: فایل منیجر یا آپلود منیجر با قابلیت های فراوان که با زبان پایتون و فریمورک جنگو نوشته شده.
هنوز 50 درصدش اوکی شده!
✅@Teachify | برنامه نویسی
✔️ چقدر حقه این تصویر :))
دلم واسه ویکیپدیا سوخت🥹
#fun
✅@Teachify | برنامه نویسی
✔️ استفاده از متد جادویی __call__ در پایتون
متد __call__
در پایتون به شما اجازه میدهد تا یک شیء از کلاس خود را مثل یک تابع فراخوانی کنید. این کار میتواند در سناریوهایی که نیاز به پردازش پیچیده دارید، بسیار مفید باشد.
فرض کنید میخواهیم یک کلاس به نام Multiplier
ایجاد کنیم که هر بار شیء آن مثل تابع فراخوانی میشود، ورودیها را با یک مقدار خاصی که در ابتدا تنظیم شده، ضرب کند.
class Multiplier:
def __init__(self, factor):
self.factor = factor
def __call__(self, value):
return value * self.factor
# استفاده از کلاس
double = Multiplier(2)
triple = Multiplier(3)
print(double(5)) # خروجی: 10
print(triple(5)) # خروجی: 15
Multiplier
به عنوان یک تابع استفاده کرد و در عین حال از ویژگیهای شیءگرایی بهره برد.✔️حذف فاصلههای خالی از ابتدا و انتهای رشته در پایتون
در زبان برنامهنویسی پایتون، برای حذف فاصلههای خالی (فاصله، تب، و خطوط جدید) از ابتدای و انتهای یک رشته، از متد strip() استفاده میکنیم.
text = " Hello, World! "
cleaned_text = text.strip()
print(cleaned_text) # Output: "Hello, World!"
text = " Learn Python with teachify "
print(text.lstrip()) # Output: "Learn Python with teachify "
print(text.rstrip()) # Output: " Learn Python with teachify"
✔️ سناریو دارک و کثیف یک شرکت ایرانی!
چندی پیش، مطلبی درباره یک اقدام انقلابی یکی از شرکت های ایرانی منتشر شد که بر اساس آن، به صورت آزمایشی یک روز از هفته به تعطیلی اختصاص داده شد تا کارکنان تنها چهار روز در هفته کار کنند. این اقدام به عنوان یک آزمایش مطرح شد و قرار بود در صورت عدم کاهش بازدهی، به طور دائمی اجرا شود.
بسیاری این اقدام را تحسین کردند و در شبکههای اجتماعی مورد توجه زیادی قرار گرفت.
اما به تازگی خبری منتشر شد که نشان میداد پس از اجرای آزمایشی، بازدهی کاهش نیافت. بنابراین این نتیجهگیری به عمل آمد که تعداد قابل توجهی از کارکنان اضافه هستند، و به همین دلیل تعدادی از نیروها تعدیل شدند و شرایط کاری به پنج روز در هفته بازگشت.
این خبر از سوی بسیاری به عنوان یکی از تیرهترین سناریوهای ممکن از استثمار کارکنان تلقی شده است.
با این حال، صحت و سقم هیچیک از این داستانها به طور قطعی تایید نشده است. امید میرود که این شرکت در راستای شفافسازی این آزمایش و نتایج آن، بیانیهای صادر کند.
✅ @Teachify | برنامه نویسی