Get Mystery Box with random crypto!

بنیاد پایتون کاران فارسی

لوگوی کانال تلگرام psfarsi — بنیاد پایتون کاران فارسی ب
لوگوی کانال تلگرام psfarsi — بنیاد پایتون کاران فارسی
آدرس کانال: @psfarsi
دسته بندی ها: فن آوری ها
زبان: فارسی
مشترکین: 2.51K
توضیحات از کانال

مقالات و اخبار مرتبط با پایتون فارسی
✅ گروه رسمی بنیاد نرم افزار پایتون فارسی: @PyFarsi
✅ Pyfarsi Offtopic Group : @Pyfarsi_Offtopic

Ratings & Reviews

3.00

3 reviews

Reviews can be left only by registered users. All reviews are moderated by admins.

5 stars

1

4 stars

0

3 stars

0

2 stars

2

1 stars

0


آخرین پیام ها 2

2022-08-09 15:30:36 What is if __name__ == "__main__":?
اول از همه، همه چیز توی پایتون یه آبجکته، زیاد شنیدیم و کلیشه شده ولی جداً یه سری آبجکتا رو نمی‌شناسیم.

یکی از اون تایپ‌ها ModuleType هست.

هر فایلی که سورس کد پایتون توش باشه، رو بهش میگیم ماژول؛ چرا؟ چون پایتون اون رو میگیره، یه آبجکت براش توی مموری درست میکنه.

چرا؟ خب یکی از دلایل منطقی‌ش اینه که هر ماژول یه namespace باید داشته باشه (هر چند راحت‌تره بگیم هر ماژول یه namespace عه)
خب namespace‌ها توی پایتون چی هستن؟ خیلی ساده‌ست :) همه‌شون دیکشنری‌اند (البته داندر slots قضیه‌اش فرق میکنه)

هر ماژول هم یکی از پایه‌ای‌ ترین نیاز هاش اینه که namespace داشته باشه تا کلاس‌ها و توابع و متغیر‌ها رو در دسترس ما قرار بده.

پس تا اینجا هر ماژول تبدیل به یه آبجکت میشه و یه namespace محسوب میشه. (اگه نمیشد که منتغی میشد )

import types

print(type(types)) ->
print(isinstance(types, types.ModuleType)) -> True

میدونی سیستم ایمپورت کردن توی پایتون چجوری کار میکنه؟

اول دنبال فایل میگرده
بعدش لودش میکنه (آبجکتش رو درست میکنه)
بعد کاملا رانش میکنه تا چیزای داخلش رو توی مموری بسازه (همون دیکشنری یا namespaceاش رو populate کنه.)

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

باید چه کار کنیم؟

هر ModuleType یه اسمی داره، فایلی اصلی که پایتون اول رو ران میکنه اسمش میشه main، اسم هم توی خود namespace عه ماژول ذخیره میشه توی name

اما دیگر ماژول‌هایی که ایمپورت میشن اسمشون میشه اسم همون فایل‌شون

hola.py
hello.py

# inside hola.py
print(name)

# inside hello.py
import hola

# run hello.py
output: hola

پایتون یه شرط معروفی داره که صورت سوال ماست:
الان میدونیم معنیش چیه
if __name__ == "__main__":

داره میگه اگه ماژولی که ران میکنی اسمش main هست کدای زیرش رو اجرا کن

که الان میدونیم که وقتی ماژول ایمپورت میشه اسمش اسم فایلشه و داندر مین نیست و این شرط غلط میشه و کدای زیرش اجرا نمیشن

حالا میگیم اجرا نمیشن، اما کامپایل که میشن، پس اگه توی بلوک کد این if تو SyntaxError داشته باشی ارورش رو موقع ایمپورت کردنش می‌بینی.

ایمپورت کردن چیزی نیست که «ما» بخوایم روی بهینه‌کردنش وقت بذاریم چون جدا نمیتونیم، اما اگه خود پایتون بهینه‌اش کنه تاثیری خوبی رو می‌بینیم. البته نه توی چیزای کوچیک، یه اپلیکیشنی که خیلی ایمپورت زیادی داره توش مشخص میشه و حتی بهتر اگه یه اپلیکیشنی به بزرگی اینستاگرام اون جاست که این بهینه‌سازی میتونه ساعت‌‌ها کار رو سریع‌تر کنه، چجوری؟
یه سیستمی دارن توی پایتون ۳.۱۲ روش کار میکنن به اسم Lazy Imports، چطوری کار میکنه؟ وقتی ایمپورت‌‌ها تنبل بشن، دیگه همون اول اول همه‌شون evaluate نمیشن، کداشون execute نمیشه و ... و وقتی که نیاز شد، اون ماژول کداش execute میشه. خب چقدر تاثیر میذاره؟‌
همه میدونیم که اینستاگرام از پایتون و جنگو استفاده میکنه، شرکت متا (فیس‌بوک) یه پیاده‌سازی پایتون داره به اسم Cinder این برای اینستاگرام بهینه شده مثلا garbage collector اش خاموشه و جدیدا مقاله‌ای منتشر کردن که گفتن ما ایمپورت‌هارو کاملا lazy کردیم.

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

پایتون به اندازه‌ کافی سریعه، اما optimization باعث میشه که سریع‌تر بشه به این چیزا میگن بهینه‌سازی


@pyfarsi
597 viewsM4hdi, 12:30
باز کردن / نظر دهید
2022-08-08 18:16:24
از این به بعد با پایتون، فلاتر کد بزنید!
جدیدا فریم‌ورکی برای پایتون منتشر شده که کاری مشابه فلاتر میکنه برای آشنایی با این فریم‌ورک به لینک زیر مراجعه کنید :

https://vrgl.ir/ie5sI
786 views• Dom, 15:16
باز کردن / نظر دهید
2022-08-07 18:05:48 مرسی از @Pyeafp
651 viewsMahdi, 15:05
باز کردن / نظر دهید
2022-08-07 18:05:32 فایل ارائه

@SEYED_BAX
534 viewsMahdi, 15:05
باز کردن / نظر دهید
2022-08-07 18:05:31
«همه‌چیز در پایتون آبجکت است»

همه این رو یبار هم که شده شنیدیم!

ولی این عبارت در CPython و زبانی مثل C که مثل مثلا پایتون شئ‌گرایی و ارث‌بری به اون صورت نداره، چطور پیاده‌سازی شده؟
اصطلاحی مثل Duck typing در سطح کدهای C در CPython چطور اتفاق میوفته؟
در پایه‌ای ترین حالت آبجکت‌های پایتون، چه چیز‌های مشترکی دارن؟
تایپ float و تایپ dict چجوری نوشته شدن با C؟
چه تایپ‌هایی در CPython نشانی از داشتن len دارند؟
تابع len چگونه کار میکنه؟
تابع len چرا چنین، کار میکنه؟
پیچیدگی زمانی تابع len چگونه‌ است؟
تایپ list در CPython چطور نوشته شده است؟
#live #آرشیو

@SEYED_BAX
531 viewsMahdi, 15:05
باز کردن / نظر دهید
2022-08-05 18:31:47 «همه‌چیز در پایتون آبجکت است»

همه این رو یبار هم که شده شنیدیم!

ولی این عبارت در CPython و زبانی مثل C که مثل مثلا پایتون شئ‌گرایی و ارث‌بری به اون صورت نداره، چطور پیاده‌سازی شده؟
اصطلاحی مثل Duck typing در سطح کدهای C در CPython چطور اتفاق میوفته؟
در پایه‌ای ترین حالت آبجکت‌های پایتون، چه چیز‌های مشترکی دارن؟
تایپ float و تایپ dict چجوری نوشته شدن با C؟
چه تایپ‌هایی در CPython نشانی از داشتن len دارند؟
تابع len چگونه کار میکنه؟
تابع len چرا چنین، کار میکنه؟
پیچیدگی زمانی تابع len چگونه‌ است؟
تایپ list در CPython چطور نوشته شده است؟

روز یکشبه
ساعت ۷ عصر
اینجا https://t.me/SEYED_BAX?livestream
1.3K viewsM4hdi, edited  15:31
باز کردن / نظر دهید
2022-08-04 11:09:01 جواب

تا حالا تریس‌بک دیدید؟ خب معلومه! اما این چه ربطی به جواب داره؟

اول بیاید یه تریس‌بک ببینیم:
Traceback (most recent call last):
File "/.../fields.py", line 241, in set
inst.data[self.name] = self.validator.validate(value)
File "/.../fields.py", line 662, in validate
raise ValidationError(messages=error_messages)
typesystem.base.ValidationError: {0: 'Must be a string.', 1: 'Must be a string.'}

هر یه دونه خطی که نوشته فلان فایل و کجا و یه خطی ازش آورده، چیزیه به اسم frame object.
هر تابعی که صدا زده میشه، توی call stack عه پایتون، یه فریم آبجکت درست میشه که استک مورد نیاز و دیکشنری ()locals عه اون و مقداری که ازش باید return بشه یا exception عی که باید ازش propagate بشه رو مدیریت میکنه، و تابع اون تو ران میشه.

یعنی return کار میکنه چون فریم آبجکت وجود داره و اون این کار رو برامون انجام میده.

وقتی پایتون یه مقداری رو به فریم دیگه ریترن میکنه، اون فریم باید از بین بره و gc و پایتون اینجا درگیرن، بساز خراب کن بساز خراب کن (که این توی توابع recursive اندکی فرق میکنه، هی فریم ساخته میشه روی هم توی استک و بعدش دونه دونه خراب میشن)

از اون طرف صدا زده شدن تابع و همین ساخته شدن فریم و اینا تبعا یه overhead عی داره و اصطلاحا function call، اندکی توی پایتون expensive هست (که البته توی پایتون ۳.۱۱ خیلی بهتر شده و تا ۳.۱۵ خیلی بهتر میشه)

روش اولی که توی صورت سوال هست، اگه گفتید چند تا تابع داره؟
1. list
2. map
+ 500 lambda

یعنی ۵۰۲ تا فانکشن کال رو فقط ما داریم می‌بینیم.

این همهههههههه فانکشن کال اتفاق میوفته

اما روش دوم

ما دو تا تابع می‌بینیم:
1. listcomp
2. zip
(اگه نمی‌دونستید باید بگم که لیست کامپری‌هنشن ها به یه تابع تبدیل میشن.)

توابعی هم که ما نمی‌بینیم، در جفت مثال‌ها داندر contains (اونجایی که l in w داریم) صدا زده میشه که، این تابع C هست:

https://github.com/python/cpython/blob/75a6441718dcbc65d993c9544e67e25bef120e82/Objects/unicodeobject.c#L10627

با یه حساب سر انگشتی:
اولی یه لیست و یه مپ و ۵۰۰ تا لامبدا و ۵۰۰ تا متد contains
و دومی یه لیست کامپری‌هنشن و یه زیپ و ۵۰۰ تا متد contains

و اگه موارد مشترک رو کم کنیم
اولی -> 502
دومی -> 2 تا

و این میشه که روش اول کندتر میشه


@pyfarsi
760 viewsM4hdi, 08:09
باز کردن / نظر دهید
2022-08-02 15:30:58
فرض کنیم چنین سوالی داریم

"میخوایم ببینیم، آیا حرف nام letters در کلمه nام words وجود داره یا نه"

دو راه داریم که مشخص شدن.

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

و برای جواب‌تون حتما دلیل بتراشید


@pyfarsi
724 viewsM4hdi, edited  12:30
باز کردن / نظر دهید
2022-08-01 23:32:47
Fixed
750 viewsMahdi, edited  20:32
باز کردن / نظر دهید
2022-07-31 17:45:01 کمی مقدمه:
یکی از فرق های اصلی asyncio با threading این هست که اولی cooperative و دومی preemptive هست توی threading سیستم عامل با یه سری الگوریتم های خاص تصمیم میگیره کی، چه process یا thread ای رو در لحظه ران کنه و کی switch اتفاق بیفته(مثلا با کمک time slicing) . ولی توی asyncio ما میگیم! یعنی باید خود coroutine بگه کی آماده ی switch هست به خاطر همینم هست باید await داشته باشیم بین task ها. پس باهم cooperation انجام میدن coroutine ها و خودشون با yield کردن کنترل رو میدن به صورت خودکار بین instruction ها این اتفاق نمیفته و کل سیستم بلاک هست اونجا.

چرا اینو گفتیم؟ یکی از دوستان این سوال رو پرسید:
چرا با وجود اینکه await نداریم اون task هایی که داخل لیست ساختیم داره اجرا میشه و hola چاپ میشه؟
async def hola():
print("hola")

async def main():
tasks = [asyncio.create_task(hola()) for _ in range(3)]

asyncio.run(main())

حالا بشکافیمش:
تابع run یه فانکشن کمکی و سطح بالا هست که خودش میاد یه event loop میسازه خودشم close ش میکنه و coroutine ای که بهش پاس دادیم و میده به run_until_complete. حالا این چیکار میکنه ؟ coroutine عه مارو تبدیل به Task میکنه (طبیعتا schedule هم میشه) و بعد میاد run_forever عه event loop رو کال میکنه. اون چیکار میکنه ؟ میاد run_once_ رو ران میکنه. رسیدیم به جایی که باید برسیم...

تابع run_once_ کارش اینکه یه دور کامل هرچی توی event loop هست رو ران میکنه! task هایی که به انتها برسن StopIteration میدن و در نتیجه done میشن.
دلیل اینکه اون task هایی که await نکردیم ولی ران شدن همینه.
حالا بعدش چه اتفاقی میفته ؟ task هایی ممکنه داشته باشیم که توشون await داشته باشه و تموم نشده باشن یا به عبارتی Pending شده باشن.

وقتی event loop داره تموم میشه میاد تمام task های pending رو cancel میکنه. اتفاقی که میفته اینکه ارور عه CancellationError داخل coroutine ها throw میشه. coroutine ها میتونن هندل کنن این ارور رو اگه نکنن Task این کارو میکنه برای شما و اون Future رو Cancel میکنه (دلیل اینکه این ارور رو نمیبینید اینه که هندل شده)

حالا همه ی حرف ها رو با کد زیر در نظر بگیرید:
async def hola():
print("first line")
try:
await asyncio.sleep(1)
except asyncio.CancelledError:
print("hola, now cancelled.")

async def main():
print("main started")
tasks = [asyncio.create_task(hola()) for _ in range(3)]
print("main finished")

asyncio.run(main())

نکته ۱: همه ی فانکشن هایی که بالا گفتم خیلی کار های اضافه تری میکنن و صرفا ورژن خلاصه شدش بود

نکته۲: این ها رفتار event loop ای هست که asyncio به صورت دیفالت ازش استفاده میکنه. اگه شما از event loop عه دیگه ای استفاده کنید کاملا این برمیگرده به نویسنده ی اون event loop که چجوری میخواد پیاده سازیش کنه. event loop ها تا زمانی که یه api ای رو رعایت کنن (متد های لازم abstract class شون رو پیاده کنن) میتونن استفاده بشن. پس همچنان safe ترین راه این هست که رو رفتار event loop حساب نکنید و چیزی که گارانتی هست یعنی await کردن coroutine ها برای دادن کنترل به event loop رو انجام بدید.
749 viewsSorousH, 14:45
باز کردن / نظر دهید