این پست بخش دوم از آموزش مجموعه فوت و فن هایی هست که من برای کار با ژوپیتر نوت بوک ها از منابع مختلف جمع کرده ام. در این بخش هم در خصوص دستورهای جادویی که یکی از ویژگی های فوق العاده کااربردی ژوپیتر حساب می شود صحبت می کنم.
مجموعه کاملی از فوت و فن های کار با Jupyter Notebook - بخش 1/4
مجموعه کاملی از فوت و فن های کار با Jupyter Notebook - بخش 2/4 (دستورهای جادویی)
پست کامل، بروزتر و البته کمی از نظر بصری خواناتر در وبسایت شخصی خودم
دستورهای جادویی ژوپیتر
یکی از اهداف اصلی ژوپتیر این هست که تمامی جنبه های کدنویسی تعاملی را برای ما راحت تر کند و تجربه کاربری بهتری را به ما بدهد. به طور مثال، اکثر ما دوست داریم که به جای این که هر بار یک کد رسم نمودار را اجرا می کنیم به جای این که نمودار در یک پنجره جدید باز و نمایش داده شود در همان محیطی که با آن کار کنیم به ما نشان داده شود. یا مثلا به جای این که هر بار یک که کتابخانه را نصب می کنیم یا تغییری که در یک ماژول اعمال می کنیم، برای استفاده از این تغییرات مجبور نباشیم که هر برنامه را ریستارت کنیم.ژوپیتر برای این که برخی از این مشکلات را برای ما حل کند از یک سری دستور به اسم توابع/دستور جادویی (Magic Functions/commands ) استفاده می کند. این دستورهای جادویی معمولا با علامت % شروع می شوند و آن ها را هم در سلول های کد اجرا می کنیم. در ادامه به طور مفصل بعضی از پرکاربردترین و مهم ترین دستورهای جادویی را به شما معرفی می کنم و توضیح می دهم و در آخر هم یک خلاصه از این دستورها به اضافه یک سری دستور جادویی دیگر را در جدولی به شما نشان خواهم داد.
دستور جادویی time%
یک دستور جادویی کاربردی دستور time% است که هر زمان که بخواهیم زمان اجرای یک خط کد در یکی از سلول های ژوپیتر را به دست آوریم از دستور جادویی time% در آن سلول و قبل از آن خط کد استفاده می کنیم. حالا وقتی که آن سلول را اجرا کنیم مدت زمانی که اجرای آن خط طول کشیده است به ما نشان داده می شود.
12x=2%time for i in range(10000000): x=1+x
Wall time: 1.26 sاگر هم بخواهیم زمان اجرای چندین خط کد را به دست آوریم به جای % از دو علامت %% استفاده می کنیم.
%%time x = 2 for i in range(10000000): x=1+x for j in range(100000): x = x*1.1
Wall time: 1.28 s
دقت کنید که به طور کلی دستورهای جادویی ژوپیتر نوت بوک می توانند هم برای اجرای تنها یک خط از کد به کار روند و یا می توانند کل کد موجود در سلول را اجرا کنند. در نوع اول قبل از دستورهای جادویی یک بار علامت % می آید و فقط خط کد بعد از دستور اجرا می شود. دستورهایی هم که برای اجرا کردن تمام کد سلول به کار می روند هم با دو علامت %% آغاز می شوند.
دستور جادویی matplotlib%
احتمالا پرکاربردترین دستور جادویی که از آن در محیط ژوپیتر استفاده می کنیم دستور matplotlib inline% است. از این دستور به طور خاص زمانی استفاده می کنیم که بخواهیم درون خود نوت بوک ها و بدون فراخوانی متد ()plt.show نمودارهایی که با کتابخانه matplotlib (و تقریبا هر کتابخانه مصوری سازی دیگر در پایتون) رسم کرده ایم را نمایش دهیم. در صورتی که از این دستور استفاده نکنیم نمودار درون نوت بوک نشان داده نمی شود و به صورت یک پنجره باز شده دیگر نمایش داده می شوند. معمولا این دستور را در ابتدای نوت بوک قرار می دهیم و یک بار اجرای آن برای نمایش دادن نمودارها در نوت بوک کافی است.
%matplotlib inline import seaborn as sns import matplotlib.pyplot as plt import numpy as np sns.set() np.random.seed(123) x = np.random.randn(100) y = np.random.randn(100) plt.scatter(x, y, color = 'indianred') plt.show()
دستور جادویی run% با استفاده از دستور run% ما می توانیم هر نوع فایلی را به عنوان یک برنامه پایتون درون محیط Ipython اجرا کنیم. به عنوان مثال، فرض کنید که کد زیر را در فایل plot_func.py ذخیره کرده اید:
import seaborn as sns import matplotlib.pyplot as plt import numpy as np sns.set() np.random.seed(123) x = np.random.randn(100) plt.hist(x, bins=20) plt.show()
حالا در محیط Ipython با استفاده از دستور run% و نام و مسیر این فایل به صورت زیرمی توانیم آن را اجرا کنیم:
%run test.py
%matplotlib inline
%run plot_func.py
مزیت دیگر این دستور جادویی این است که با اجرای آن تمامی متغیرهای، کلاس ها، توابع و سایر اشیاء های که درون اسکریپت هستند در محیط ژوپیتر قابل دسترسی خواهند بود. مثلا در مثال بالا، متغیر x ای که درون اسکریپت فایل plot_func.py تعریف کرده ایم در محیط ژوپیتر هم موجود است.
به علاوه مزیت دیگر دستور run% این است که ما حتی می توانیم فایل های نوت بوک های دیگر را نیز با این دستور جادویی در یک نوت بوک دیگر اجرا کنیم.
دستور جادویی load%
برخی مواقع هم می خواهیم کد نوشته شده در یک فایل را بدون کپی و پیست کردن به نوت بوک اضافه اضافه کنیم، در این حالت از دستور load% برای این کار استفاده می کنیم. بعد از اجرا، این دستور محتوای فایل اسکریپ را که می تواند در کامپیوتر شما یا بر روی اینترنت ذخیره شده باشد را درون سلول که در آن قرار دارد می ریزد. فایل مثال بالا را در نظر بگیرید اگر ما دستور loadplot_func.py% را درون یک سلول اجرا کنیم تمامی کد درون این اسکریپت در سلولی که قرار دارد بارگزاری می شود.
دستور جادویی store%
دستور مفید دیگری که می توانیم استفاده کنیم دستور store% است که به ما امکان می دهد که از متغیرهای یک نوت بوک درنوتبوک دیگر استفاده کنیم یا به عبارتی دیگر داده های بین نوت بوک ها را انتقال بدهیم. به طور مثال فرض کنید که در یک نوت بوک آرایه نامپای x زیر که ساخته ایم را با دستور store% به صورت زیر ذخیره می کنیم.
حالا می توانیم با دستور store –r% در نوت بوک جدیدی که ساخته ایم بدون نیاز به هیچ کار دیگری از این متغیر x استفاده کنیم.
لود کردن لحظه ای کتابخانه ها و ماژول هابعضی مواقع در حال کد زدن در ژوپیتر به موقعیتی می رسیم که نیاز می شود یک کتابخانه را نصب کنیم یا تغییری در یک ماژول ایجاد کنیم. وقتی که تغییری در کد یک ماژول می دهیم یا با استفاده از خط فرمان (خارج از محیط ژوپیتر) کتابخانه ای نصب می کنیم این تغییرات به صورت خودکار در ژوپیتر اعمال نمی شوند. مثلا فرض کنید که به یک جای کد رسیده اید که نیاز به بروزرسانی کتابخانه Pandas دارید ولی برای ابن کار فقط محیط خط فرمان و با دسترسی ادمین به روزرسانی را انجام دهید. در حالت عادی وقتی بروزرسانی را انجام دادیم برای استفاده از نسخه جدید کتابخانه Pandas باید یک بار نوت بوک را Shut down و سپس آن را ریستارت کنیم که کار بسیار مسخره ای است. به همین دلیل و برای این که این تغییرات به صورتی آنی در نوت بوک ما در نظر گرفته شوند می توانیم دو دستور جادویی زیر را به اول هر نوت بوک اضافه کنیم تا به صورت اتوماتیک هر تغییری که در سایر ماژول ها و کتابخانه ها اعمال شد نوت بوک ما هم به صورت خودکار به روزرسانی شود. این دستور هم خیلی به درد می خورد پس حواستان به آن باشد
%reload_ext autoreload;
%autoreload 2
در جدول زیر بعضی دیگر از مهم ترین دستورهای جادویی که ممکن است سر و کار ما با آن ها بیفتد را می توانید مشاهده کنید. البته این تنها بخش کوچکی از دستورهای جادویی قابل استفاده برای ما است. برای دیدن لیست کامل دستورهای جادویی ژوپیتر می توانیم از یک دستور جادویی دیگر به نام lsmagic% استفاده کنیم.به علاوه خودمان هم می توانیم دستورهای جادویی مخصوص خودمان را بسازیم که این موضوع البته از محدوده این آموزش خارج است و به آن نمی پردازیم ولی برای کسب اطلاعات بیشتر می توانید به این لینک مراجعه کنید. مستندات کامل مربوط به دستورات جادویی پیش فرض ژوپیتر هم در این لینک قابل مشاهده هستند.
چند نکته مهم در خصوص دستورهای جادویی ژوپیتر
به صورت پیشفرض دستورهای جادویی پایتون را می توان بدون استفاده از علامت % هم اجرا کرد البته تا زمانی که متغیر یا تابعی با نام مشابه آن ها در محیط برنامه تعریف نشده باشد.
برای این که اطلاعات بیشتری در خصوص دستورهای جادویی Ipython اطلاع کسب کنیم و دیدن مستندات این دستورهای جادویی می توانیم مشابه با سایر دستورهای پایتون از ؟ پیش یا بعد از آن استفاده کنیم.