<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های مهدی موسوی</title>
        <link>https://virgool.io/feed/@mahdithejedi</link>
        <description>May the FORCE be with you</description>
        <language>fa</language>
        <pubDate>2026-06-21 16:10:39</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/27565/avatar/0mjbNf.jpeg?height=120&amp;width=120</url>
            <title>مهدی موسوی</title>
            <link>https://virgool.io/@mahdithejedi</link>
        </image>

                    <item>
                <title>در اعماق پایتون ۱ - چگونگی مدیریت لیست ها در پایتون</title>
                <link>https://virgool.io/@mahdithejedi/listsubmarine-shno8mcdxwzt</link>
                <description>مقدمهتو دنیای کامپیوتر یکسری ابزار داریم که با اون ها کار هامون رو انجام میدیم مثل زبان های برنامه نویسی. بیایید یه کمی ساده تر حرف بزنیم فک کنید که شما میخواید پریز خونتون رو عوض کنید , ازچه ابزاری استفاده میکنید؟ درسته فازمتر. پیچ هارو با فارمتر باز میکنید, پریز جدید رو قرار میدید و پیچ هارو میبندید تهش هم با همون فازمتر امتحان میکنید ببینید برق داره یا نه. زبان های برنامه نویسی هم مثل همون فازمترن. ازشون استفاده میکنیم تا به اهدافمون (که همون تعویض پریزه) برسیم. حالا ما توی سری در اعماق پایتون میخوایم ببینیم خود این ابزار چگونه کار میکنه. تو این سری باید یه کمی سی, و  پایتون بلد باشید. البته من تمام سعی خودم رو کردم که همه چیز رو ساده و روون توضیح بدم اما برای درک عمیق موضوع خیلی نیازتون میشه. نکته بعدی اینه که پایتون چند تا مفسر داره مثل CPython, PyPy, pythonnet, jython و... ما در اینجا از مشهور ترین مفسر پایتون یعنی همونی که اکثرمون استفاده میکنیم یعنی CPython استفاده میکنیم.لیست ها در پایتوناول از همه خیلی کوتاه و مختر ببینیم لیست توی پایتون چیه؟لیست خیلی خیلی ساده بخوایم بگیم مجموعه ای چیزهاست (جلوتر میبینیم این چیز ها همشون آبجکت هستن)مثلا لیست A:A = [1, 2.3, &#039;a&#039;, &#039;HI&#039;]همون طور که میدونیم پایتون در مفسر CPython با زبان برنامه نویسی C ساخته شده. یعنی لیست ها در پایتون با  C پیاده شدن. حالا بریم ببینیم که لیست ها یا خیلی رسمی تر آرایه ها در C چی هستن.آرایه ها در Cمفهوم آرایه ها در سی شبیه پایتونه, یعنی مجموعه از ای چیز ها. اما دوتا موضوع رو باید درنظر بگیریم.سایز آرایه محدود هست و ما باید اون رو قبل از ساختن آرایه تعیین کنیمتمام اجزای آرایه باید یک تایپ مشترک داشته باشن مثلا همشون Interger یا Float باشنبیایید با مثال بریم جلو ببینیم منظورمون چیه.به مثال بالا که زدم دقت کنید:A = [1, 2.3, &#039;a&#039;, &#039;HI&#039;]ما اینجا نه تعداد عناصر آرایه A و نه تایپ ورودی آرایه A رو وارد کردیم یعنی توش هم Integer داره هم Float هم string اما در سی اینطوری نیست مثلا برای تعریف یک آرایه میگیم:int A[10];این یعنی ما یک آرایه به نام A  داریم که قراره ده تا Integer بگیره. این ده تا به هیچ وجه نمیتونه بشه 11 تا و به هیچ وجه نمیشه به آرایه A چیزی غیر از Integer دادint A[5] = {1000, 2, 3, 7, 50};همون طور که میدونیم پایتون برپایه سی ساخته شده و دو قانون گفته شده (ثابت بودن سایز و نوع آرایه) باید در پایتون برقرار باشه. پس چطوری در پایتون ما میتونیم آرایه ای بدون محدودیت های گفته شده بسازیم؟بریم دونه دونه این دوتا مورد رو بررسی کنیممحدودیت تایپ اجزای آرایههمونطور که گفتیم در سی اجزای آرایه باید تایپ مشترکی داشته باشن مثلا همشون Integer یا Float باشن اما در پایتون اینطوری نیست.نکته جالب اینجاست که توی پایتون هم همه اعضای یک لیست تایپ مشترکی رو دارن! یعنی آرایه  A = [1, 2.3, &#039;a&#039;, &#039;HI&#039;]که توش هم Int داره هم Float هم String همشون از دید پایتون یک Type مشترک دارن همشون فرزند PyObject هستن.typeof strcut _object{
    _PyObject_HEAD_EXTRA
    Py_ssize_t ob_refcnt;
    PyTypeObject *ob_type;
    } PyObject;همون طور که میدونید همه چیز در پایتون آبجکت هست و اون آبجکت ها فرزند های PyObject هستن. یعنی زمانی که یک آرایه در پایتون ساخته میشه انگار آرایه ای از PyObject ها داریم حتی اگه یک کلاس جدید بسازیم:class A:pass
a = A()A = [1, 2.3, &#039;a&#039;, &#039;HI&#039;, a]. پس مشکل اول حل شد بریم سراغ مشکل دوماندازه آرایهخوب همونطور که گفتیم اندازه لیست ها توی سی ثابته درحالی که توی پایتون اینطوری نیست اما در اصل موضوع اینه که پایتون هم لیست های ثابت میسازه اما هروقت اون لیست پر شد یک آرایه دیگه که یه کمی بزرگ تره میسازه و کل اون دیتاهارو کپی میکنه تو اون لیست جدید. (بهش میگن Dynamic Array).مثلا توی C آرایه زیر رو داریم:int A[5] = {1000, 2, 3, 7, 50};حالا برای اینکه بتونیم اعداد 25, 30 رو توش اضافه کنیم باید یک آرایه جدید دیگه بسازیم و اعضای آرایه قبل رو همراه با دو عدد گفته شده (25, 30) بهش اضافه کنیم:int ANew[7];for (int i = 0; i&lt;5; i++){  ANew[i] = A[i];}ANew[5] = 25;ANew[6] = 30;خوب بریم سراغ دنیای پایتون و کدی که پایتون ازش استفاده میکنه تا آرایه جدید بسازه رو بررسی میکنیم.ما در اینجا فانکشن list_resize رو برسی میکنیم.PyObject **items; 
size_t new_allocated, num_allocated_bytes;
 Py_ssize_t allocated = self-&gt;allocated;خوب اینجا متغیر هارو تعریف میکنیم, new_allocated اندازه جدید آرایه و num_allocated_bytes سایز اون آرایه توی حافظه هست.if (allocated &gt;= newsize &amp;&amp; newsize &gt;= (allocated &gt;&gt; 1)) {    assert(self-&gt;ob_item != NULL || newsize == 0);     Py_SIZE(self) = newsize;     return 0; }توی این بخش بررسی میکنیم که تعداد ورودی جدید حتما بزرگتر از مقدار خود آرایه باشه در غیر این صورت همون آرایه قبلی رو بدون تغییر برمیگردونیم با اهتمام به این نکته که سایز آرایه جدید رو به عنوان سایز آرایه فعلی قرار دادیم.new_allocated = (size_t)newsize + (newsize &gt;&gt; 3) + (newsize &lt; 9 ? 3 : 6);اینجا میاییم و اندازه جدید آرایه رو ست میکنیم اینجاست که میگیم دفعه اول که آرایه ساخته شد سایزش 0 باشه و بعدش به صورت زیر رشد میکنه0, 4, 8, 16, 25, 35, 46, 58, 72, 88 ...و در نهایت ساخت یک آرایه جدید و کپی کردن کل مقدارش به اون:items = (PyObject **)PyMem_Realloc(self-&gt;ob_item, num_allocated_bytes);و تمام. البته خود کد خیلی پیچیده تره ولی ما اینجا خیلی ساده به موضوع نگاه کردیمموخرههمون طور که میبیند بخش های اصلی پایتون کاملا روی سی پیاده شده. در نظر دارم توی بخش های بعدی در اعماق پایتون به بررسی بخش های دیگه هسته پایتون (CPython) بپردازم.در نهایت هم خیلی عالی میشه هر نظری دارید بگید , بدون تعارف بدون پرده :)</description>
                <category>مهدی موسوی</category>
                <author>مهدی موسوی</author>
                <pubDate>Mon, 10 May 2021 22:42:17 +0430</pubDate>
            </item>
                    <item>
                <title>پایتون مفسری هست  یا کامپایلری؟بله!</title>
                <link>https://virgool.io/@mahdithejedi/%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-%D9%85%D9%81%D8%B3%D8%B1%DB%8C-%D9%87%D8%B3%D8%AA-%DB%8C%D8%A7-%DA%A9%D8%A7%D9%85%D9%BE%D8%A7%DB%8C%D9%84%D8%B1%DB%8C%D8%A8%D9%84%D9%87-x27xrudvykjo</link>
                <description>اگه از من بپرسید پایتون چیه بدون شک بهتون میگم پایتون یک زبان برنامه‌نویسی تفسیری، سطح بالا، و همه منظوره استدقیقا همون چیزی که توی ویکیپدیا نوشته اما قضیه به همین سادگی ها هم نیست یعنی کلا زندگی اینطور نیست که همه چیز سیاه یا سفید باشه زندگی پر از رنگ ها و طرح های زیبا و مختلف هستقضیه اینه که :پایتون مفسری نیست! کامپایلری هم نیست!!!!!!برای اینکه قضیه روشن بشه بریم یک تعریف کوچولو از کامپایلر ببینیمکامپایل کردن یعنی چی و کامپایلر چی کار میکنه؟خود لغت کامپایل کردن یعنی فرایند تفسیر یا ترجمه کردن از زبان A به زبان B  و کامپایلر هم یعنی چیزی یا کسی که این فرایند رو انجام میده . کامپایلر ها هم تو کامپیوتردقیقا  همین کارو میکنن میان کد یا برنامه شمارو از یک زبان سطح بالا که برای انسان قابل فهم هست (مثلا سی یا سی پلاس پلاس) تبدیلش میکنن به یک زبان قابل فهم برای کامپیوتر. اما طبق تعریف میشه این رو گسترده تر کرد مثلا دوست شما ازتون میخواد که درس جلسه پیش رو که استاد توضیح داده و دوستتون  غایب بوده  رو براش  توضیح بدید کاری که شما میکنید اینه که حرف های معلم رو به زبون خودتون برای دوستتون توضیح میدید یعنی دارید حرف های معلم یا استادتون رو برای دوستتون کامپایل میکنیدپایتون هم از این قاعده مستثنی نیست . پایتون میاد و کد شما رو کامپایل میکنه به بایدکدبایدکد ها دستوراتی هستن  شبیه دستورات cpu با این تفاوت که مستقیم توسط cpu اجرا نمیشن  بلکه  توسط یک ماشین مجازی که تقریبا ! یک جور شبیه ساز cpu هست اجرا میشن خط به خط. تفسیری!ممکنه با خودتون بپرسید این فایل های بایدکد چطورین و دستوراتش چه شکلیه؟&gt;&gt;&gt; import dis
&gt;&gt;&gt; def example(x):
...  for i in range(x):
...  print(2 * i)
...
&gt;&gt;&gt; dis.dis(example)
  2           0 SETUP_LOOP              28 (to 30)
              2 LOAD_GLOBAL              0 (range)
              4 LOAD_FAST                0 (x)
              6 CALL_FUNCTION            1
              8 GET_ITER
        &gt;&gt;   10 FOR_ITER                16 (to 28)
             12 STORE_FAST               1 (i)

  3          14 LOAD_GLOBAL              1 (print)
             16 LOAD_CONST               1 (2)
             18 LOAD_FAST                1 (i)
             20 BINARY_MULTIPLY
             22 CALL_FUNCTION            1
             24 POP_TOP
             26 JUMP_ABSOLUTE           10
        &gt;&gt;   28 POP_BLOCK
        &gt;&gt;   30 LOAD_CONST               0 (None)
             32 RETURN_VALUE
&gt;&gt;&gt;این ها دستورات بایدکدی هستن که توسط ماشین مجازی پایتون تولید میشن و بعد توسط ماشین مجازی اجرا میشن . این که این دستورات چی هستن و هر کدوم دقیقا چی کار میکنن موضوع بحث الان ما نیست اما از اینجا میتونید یه کلی اطلاعات جالب درباره دستورات بایدکد پایتون به دست بیارید فایل های بایتکد پایتون  که پسوندشون pyc هستن رو  میشه توی پوشه __pycache__  پیدا  کرد. بزارید با یک مثال مفهوم رو روشن تر کنمبرنامه های پایتونی زیر رو در نظر بگیرید که یکیشون یک آدرس یک پوشه رو میگیره و اون یکی نمایششون میده . یکیشون رو اسمش رو میذاریم list_files.py که قراره لیست فایل هارو برگردونه from os import listdir
from os.path import isfile, join
def list_files(path):
    return [f for f in listdir(path) if isfile&#40;join(path, f&#41;)]اون یکی هم  show_files.py که قراره فایل هارو نشون بدهfrom list_files import list_files
path = input(&#039;Please enter your path!\t&#039;)
files = list_files(path)
for file_name in files:
    print(file_name)حالا بیایید برنامه رو اجرا کنیم و نتیجه رو ببینیمنتیجه اجرای برنامه show_files همون طور که میبینید بعد از اجرای برنامه برای باراول یک پوشه ایجاد شد به نام __pycache__ که توی اون پوشه محتوای کامپایل شده برنامه رو میشه دیدمحتوای پوشه __pycache__این که چرا فقط فایل list_files رو کامپایل کرده به دلیل اینکه ما توی فایل show_files مون اومدیم و فایل list_files رو import کردیمحالا سوال اینجاست دقیقا چه اتفاقی میفته زمانی که برای بار اول این برنامه رو اجرا میکنیم؟پایتون برای بار اول که این برنامه رو اجرا میکنید میاد و یک دفعه تمام فایل های پایتونی رو کامپایل میکنه (خودتون  میتونید با python -m py_compile show_files هم دستی برنامه رو کامپایل کنید) و یکرسی هاشون رو  توی پوشه __pycache__ میریزه و بعد محتوای اون پوشه رو همراه با تمام فایل های کامپایل شده  میده به ماشین مجازی و ماشین مجازی هم خط به خط تمام فایل های کامپایل شده رو اجرا میکنه!!!دفعه های بعد که برنامه رو اجرا میکنید یک مرحله از کار کم میشه پایتون  فایل های  کامپایل شده رو داره و فقط میده شون به ماشین مجازی و این باعث میشه برای دفعه های بعد برنامه سریع تر اجرا بشهزمان اجرای برنامه برای اولین بار بدون وجود پوشه __pycache__زمان اجرای برنامه برای دومین بار با وجود پوشه __pycache__خوب پس با این تفاسیر دفعه بعد که یکی ازتون پرسید پایتون چیه دیگه دقیق تر بهش توضیح میدید کهپایتون تقریبا یک زبان برنامه‌نویسی تفسیری، سطح بالا، و همه منظوره استپی نوشت: این نوشته اولین نوشته من هست و طبیعیه که یه کلی غلط داشته باشه یا خوندنش خیلی سخت باشه برای همین به بزرگی خودتون تمام این مشکلات رو نادیده بگیرد و حتی نظر بدید که بتونم در نوشته های آینده مشکلاتم رو رفع کنم.کوچیک شما Pyrannosaurus!</description>
                <category>مهدی موسوی</category>
                <author>مهدی موسوی</author>
                <pubDate>Mon, 19 Oct 2020 22:28:23 +0330</pubDate>
            </item>
            </channel>
</rss>