وبلاگ سجاد نجفی

تجربه های وبگردی من

وبلاگ سجاد نجفی

تجربه های وبگردی من

وبلاگ سجاد نجفی

با خودم گفتم من که هر چند وقت یه بار دنبال مطلبی در اینترنت‌ام تا کار خودمو راه بندازم، خب وقتی کارم راه افتاد و اون مطلب رو در وب پیدا کردم، در یک وبلاگ انتشار بدم تا هم خودم اون مطالب رو داشته باشم و هم به کسایی که دنبال همون چیزایی‌اند که من دنبالشون بودم{!!!} کمکی کرده باشم!

پیام های کوتاه
۲۵
خرداد ۹۸

سلام دوستان

در این آموزش میخوایم با ماژول ها و ساخت اونها و استفاده از از کتابخانه استاندارد پایتون در برنامه هامون آشنا بشیم.

شاید ساده ترین توضیح برای ماژول ها این باشه که ماژول ها قطعاتی از یک برنامه هستند که در یک فایل جداگانه نوشته میشن و کار(های) خاصی انجام میدن و با تعریف کردن اونها توی هر صفحه ای از پروژه ما قابل اجرا هستند.

قبل از شروع آموزش یک نکته رو بگم:

من در آموزش های پیش از این از خود IDLE پایتون برای نوشتن برنامه ها استفاده میکردم و اگر توجه کرده باشید اول هر خط علامت <<< رو میدید، اما از این جلسه به بعد از برنامه Sublim Text برای نوشتن برنامه هامون استفاده میکنم(این همون برنامه ای هست که آقای شفر هم برای آموزش ازش استفاده میکنه) بنابراین دیگه اون علامت در ابتدای خط رو نخوایم دید. دوستانی که میخواین این برنامه رو داشته باشن کافیه توی نت اسم این برنامه رو وارد کنند.

خب در ادامه میخوایم ببینیم چطور یک ماژول رو تعریف میکنن و در پروژه وارد میشه.

برای ایجاد یک ماژول کافیه یک فایل با پسوند py ایجاد و هر تابع یا هر چیز دیگه ای میتونیم توش بنویسیم و در برنامه های خودمون استفاده کنیم.

برای مثال ما در این درس این کد ها رو توی فایلی به نام my_module.py ذخیره کردیم:

print('Imported my_module...')
test='Test String'
def find_index(to_search, target):
'''Find the index a value in sequence'''
for i, value in enumerate(to_search):
if value == target:
return i
return -1

در خط اول که کد print هست واسه این گذاشتیم که وقتی به پروژه مون وارد کردیم و خروجی گرفتیم بفهمیم کار وارد کردن رو درست انجام دادیم و توی خروجی مون 'Imported my_module...' چاپ میشه، بعدش هم یک متغیر به نام test هست که مقدار رشته ای بهش دادیم و بعد از اون یک تابع به نام find_index نوشتیم که کارش پیدا کردن ایندکس یک مقدار توی یک داده دنباله دار هست مثل لیست ها. اگه مقدار رو پیدا کنه ایندکس(شماره) مقدار پیدا شده رو برمیگردونه و اگر نه هم مقدار یک منفی رو برمیگردونه.

راستی این خطی که توی کد بالا وجود داره:

'''Find the index a value in sequence'''

این خط رو بهش میگن documentation یا همون مستندات؛ مستندات رو بین سه تا  علامت نقل قول تکی یا سه تا نقل قول دوتایی میذارن. مثلا این دو خط، هر دو مستندات هستند:

'''Find the index a value in sequence'''
"""Find the index a value in sequence"""

برنامه ما هم که توی فایلی به نام intro.py ذخیره کردیم اینه:

courses = ['History', 'Math', 'physics', 'CompSci']

در این پروژه مسیر فایل برنامه و ماژولی که ساختیم یکسان هست(دو فایل در کنار هم اند)

وارد کردن ماژول به پروژه:

import my_module
courses = ['History', 'Math', 'physics', 'CompSci']

خروجی:

Imported my_module...

همونطور که مشخصه جمله ای که انتظارشو داشتیم چاپ شده و این یعنی به درستی عمل ایمپورت کردن ماژول به پروژه مون انجام شده.

خب برای استفاده از تابع find_index که در ماژول نوشتیم نمیتونیم همینطوری تابع رو صدا بزنیم بلکه باید اول اسم ماژول رو بیاریم بعد تابعی که از توش میخوایم رو فراخونی کنیم. ببینید:

import my_module
courses = ['History', 'Math', 'physics', 'CompSci']
index= my_module.find_index(courses,'physics')
print(index)

خروجی:

Imported my_module...
2

خب برنامه به درستی کار کرد و شاخص 'physics' در لیست ما برابر 2 هست.

ایجاد نام جایگزین برای ماژول در پروژه

معمولا این کار برای مخفف نویسی نام یک ماژول انجام میشه ببینید:

import my_module as mm
courses = ['History', 'Math', 'physics', 'CompSci']
index= mm.find_index(courses,'physics')
print(index)

خروجی این برنامه با برنامه قبل یکسانه.

وارد کردن فقط یک تابع از ماژول به برنامه

میتوانیم به جای وارد کردن ماژول به برنامه فقط توابعی که از اون نیاز داریم رو به برنامه وارد کنیم، با انجام این کار دیگه نیاز نیست هر دفعه که بخوایم تابع رو استفاده کنیم نام ماژول رو ذکر کنیم بلکه میتونیم مستقیما از تابع استفاده کنیم:

from my_module import find_index
courses = ['History', 'Math', 'physics', 'CompSci']
index= find_index(courses,'physics')
print(index)

اگر دوباره به کدهای درون ماژول توجه کنید خواهید دید که ما متغیری داریم به نام test که توی اون یک مقدار متنی هست. اما با روش گفته شده در بالا دیگه به این متغیر دسترسی نداریم، برای دسترسی به هر متغیر یا تابعی در ماژول کافیه از اون نام ببریم و با کاما اونها رو از هم جدا کنیم:

from my_module import find_index, test
courses = ['History', 'Math', 'physics', 'CompSci']
index= find_index(courses,'physics')
print(index)
print(test)

خروجی:

Imported my_module...
2
Test String

خب اینجا هم میتونیم از قانون خلاصه کردن اسم هم استفاده کنید و مثلا به جای find_index میخوایم اسم خلاصه بذاریم fi ببینید:

from my_module import find_index as fi, test
courses = ['History', 'Math', 'physics', 'CompSci']
index= fi(courses,'physics')
print(index)
print(test)

خروجی این هم با قبلی یکسانه.

نکته: در استفاده از کار خلاصه نوشتن نام دقت کنید که نامی نذارید که خیلی خلاصه باشه و بعدا وقتی باهاش مواجه بشین خودتون هم ندونید چی بوده و خوانایی کدهاتون رو کم نکنید با این کار.

وارد کردن همه چیز از یک ماژول

برای این کار کافیه مقابل import علامت * (ستاره) بذارید. اما این روش توصیه نمیشه چرا؟ چون که خوانایی پروژه تون رو کم میکنه و شما وقتی پروژه ای بزرگ داشته باشید نمیدونید در این فایل از پروژه از چه توابعی از ماژول استفاده کردید و ردیابی خطاها در پروژه سخت میشه. 

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

مکان یابی مسیر ماژول ها در پایتون

وقتی ما یک ماژول رو حالا یا از کتابخانه استاندارد پایتون یا خودمون تعریف میکنیم پایتون چطوری میفهمه مسیر این ماژول کجاست؟

ما که هیچ مسیری به پایتون معرفی نکردیم و نگفتیم مکان این ماژول چیه فقط از اون استفاده کردیم.

وقتی که ما یک ماژول رو وارد پروژه میکنیم پایتون چند مکان رو بررسی میکنه و این مکان هایی که بررسی میشن رو در لیستی به نام sys.path قرار داره که ما میتونیم توی پروژه مون وارد کنیم و ببینم توی این لیست چی داره. ببینید:

from my_module import find_index, test
import sys
courses = ['History', 'Math', 'physics', 'CompSci']
index= find_index(courses,'physics')
print(sys.path)

خروجی:

Imported my_module...
['C:\\Users\\najafi\\Desktop\\my_works\\sample_1', 'C:\\Users\\najafi\\AppData\\Local\\Programs\\Python\\Python37-32\\python37.zip', 'C:\\Users\\najafi\\AppData\\Local\\Programs\\Python\\Python37-32\\DLLs', 'C:\\Users\\najafi\\AppData\\Local\\Programs\\Python\\Python37-32\\lib', 'C:\\Users\\najafi\\AppData\\Local\\Programs\\Python\\Python37-32', 'C:\\Users\\najafi\\AppData\\Local\\Programs\\Python\\Python37-32\\lib\\site-packages']

مقدار اولی جایی هست که همین اسکریپت در حال اجرا هست. مقدار دوم محل متغیرهای محیطی پایتون هست. بعد از اون مسیرهای کتابخانه های استاندارد پایتون هست که ما میتونیم ماژول های استاندارد رو از این کتابخانه به پروژه هامون وارد کنیم و بعد مکان سایت پکیج های پایتون قرار گرفته.

افزودن مسیر ماژول دلخواه به sys.path

در اول این آموزش گفتیم که فایل ماژول رو در کنار فایل برنامه قرار میدیم تا در برنامه استفاده کنیم، اما الان میخوایم این فایل رو در جای متفاوت بذاریم. من در دسکتاپ سیستمم یک پوشه به نام My-Modules ایجاد و فایل ماژول my_module.py رو به این پوشه میبرم. با اجرای دوباره برنامه با خطا مواجه خواهم شد چون دیگه در کنار فایل برنامه ماژول نیست و مکان جدید هم در sys.path تعریف نشد. 

برای تعریف مکان در sys.path می تونید به این روش عمل کنید:

import sys
sys.path.append('/Users/najafi/Desktop/My-Modules')

این کد رو باید قبل از کد وارد کردن ماژول خودتون بذارید، در واقع اول باید مکان ماژول رو به پایتون معرفی کنید بعد از اون رو وارد و استفاده کنید.

اما این روش بهترین روش برای انجام این کار نیست چون اولا باید همیشه این کد رو باید قبل از کد وارد کردن ماژول خودتون بذارید و این که اگر جای ماژول رو بعدا مجور بشیم تغییر بدیم باید توی هر فایلی که اولش این کد رو نوشتیم مکان رو تغییر بدیم.

راه دیگه مستر شفر برای این موضوع این هست که ما ماژولی که ساختیم رو متغیرهای محیطی پایتون اضافه کنیم(قبل از این در sys.path بهش اشاره کردیم):

انجام این کار در محیط مک و ویندوز با هم متفاوته و از اون جایی که 99 درصد ملت ایران زمین از ویندوز استفاده میکنن(به ویژه خودم!) راهی که برای انجام این کار در ویندوز میگه رو براتون مینویسم:

افزودن ماژول به متغیرهای محیطی پایتون در ویندوز7

در منوی استارت روی Computer کلیک راست کنید و Properties رو بزنید و در صفحه ای که باز میشه در منویی سمت راست دارید روی Advanced windows settings کلیک کنید.

در صفحه باز شده تب Advanced رو بزنید و پایین این صفحه بر روی Environment Variables… رو کلیک کنید.

و در قسمت بالا که مربوط به متغیر های یوزر هست(و نه سیستم) روی دکمه New… کلیک کنید. 

و در بخش Variable Name با حروف بزرگ بنویسید PYTHONPATH و در بخش Variable Value محل پوشه ماژولی که ساختید بنویسید که برای من این کادر به این صورت هست:

بعد OK رو میزنیم و OK در صفحه قبل از این هم میزنیم و سپس از منوی استارت cmd رو جستجو میکنیم(cmd.exe) و وارد محیط برنامه خط فرمان ویندوز میشیم.

توی cmd کلمه python رو تایپ میکنیم. و بعد فقط کافیه ماژولی که ساختیم رو وارد کنیم پس کافیه بنویسیم:

Import my_module

اگه درست وارد شده باشه باید این پیام بیاد براتون:

Imported my_module

خب در این مرحله برای اطمینان از این که این مسیر به مسیر های متغیرهای محیطی پایتون اضافه شده این رو تایپ کنید و اینتر رو بزنید:

Import sys

و بعد این رو بنویسید و اینتر رو بزنید:

sys.path

حالا براتون مسیرها رو نمایش میده و اینجا باید در ابتدا اون مسیری که در بخش Variable Value وارد کرده بودید وجود داشته باشه که اگر وجود داشته باشه یعنی همه کارا رو درست انجام دادید.

خب حالا در برنامه مون دیگه نیاز نیست که همش آدرس رو بزنیم فقط کافیه هر جا بخوایم استفاده کنیم sys رو وارد کنیم. مثل این:

import sys
from my_module import find_index, test
courses = ['History', 'Math', 'physics', 'CompSci']
index= find_index(courses,'physics')
print(index)
print(test)
خروجی این برنامه:
Imported my_module...
2
Test String

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

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

استفاده از کتابخانه های استاندارد پایتون مثل ماژول هایی که خودمون ساختیم دردسر نداره و فقط با دستور import میتونید به طور مستقیم در برنامه های خودتون از توابعشون استفاده کنید. مزیت استفاده از کتابخانه های استاندارد خود پایتون هم در اینه که این کتابخانه ها رو بهترین برنامه نویسان دنیا نوشتن و کدها در بهینه ترین حالت قرار دارن.

مثلا در این مثال ما میخوایم از کتابخانه random در پایتون استفاده کنیم:

import random
courses = ['History', 'Math', 'physics', 'CompSci']
random_course=random.choice(courses)
print(random_course)

خروجی این برنامه با هر بار اجرا متفاوت و یکی از مقادیر لیست courses چاپ میشه.

شما میتونید با کتابخانه های مختلفی که خود پایتون داره تمرین کنید و با جستجو در اینترنت می تونید درباره کتابخانه استاندارد پایتون اطلاعات زیادی کسب و استفاده کنید.

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

نظر یادتون نره دوستان :)

دوستانی که پست اول این سری آموزش رو نخوندن حتما بخونن! >>> پست اول آموزش پایتون

نظرات  (۱)

۰۹ شهریور ۰۱ ، ۲۰:۰۸ صادق شفایی نیک

آقا خیلی دمت گرم، ادامه بده لطفا

پاسخ:
زنده باشی صادق جان، آموزش ها رو بر اساس ویدئوی یوتیوب آقای شافر نوشتم که خیلی خوب توضیح میداد. آخر آموزش لینک پست اول این سری آموزش رو نوشتم داخل اون پست لینک یوتیوب ایشونو گذاشتم که به صورت ویدئویی به زبان انگلیسی توضیح میده.

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی