در این درس، زبان برنامهنویسی Python معرفی میشود و نقش آن در حوزه Genomic Data Science و Bioinformatics بررسی میگردد. هدف اصلی این بخش، آشنایی اولیه با دلیل اهمیت یادگیری برنامهنویسی برای زیستشناسان، اصول طراحی یک برنامه، ویژگیهای زبان Python و تاریخچه توسعه آن است.
پس از مطالعه این درس، باید بتوانید:
- توضیح دهید چرا یک زیستشناس ممکن است به برنامهنویسی نیاز داشته باشد.
- مراحل طراحی یک برنامه را قبل از نوشتن کد درک کنید.
- مفهوم Pseudocode (شبهکد) را توضیح دهید.
- ویژگیهای اصلی Python را بشناسید.
- تفاوت زبانهای Interpreted و Compiled را بیان کنید.
- تاریخچه و نسخههای مختلف Python را بشناسید.
- دلیل محبوبیت Python در زیستمحاسبات (Bioinformatics) را درک کنید.
استفاده از زبانهای برنامهنویسی برای تحلیل، پردازش و مدیریت دادههای زیستی مانند توالیهای DNA، RNA و دادههای ژنومی.
این دوره برای افرادی طراحی شده است که:
- دانشمند کامپیوتر نیستند.
- پیشزمینه برنامهنویسی ندارند.
- در حوزههایی مانند زیستشناسی مولکولی و ژنتیک فعالیت میکنند.
هدف دوره این نیست که یک برنامهنویس حرفهای ایجاد کند، بلکه هدف آن ایجاد مهارت کافی برای انجام وظایف محاسباتی در زیستشناسی است.
در زیستشناسی مدرن، حجم دادهها بسیار زیاد شده است. توانایی نوشتن برنامههای کوچک میتواند به پژوهشگر اجازه دهد:
- دادهها را سازماندهی کند.
- تحلیلهای اختصاصی انجام دهد.
- ابزارهای جدید ایجاد کند.
- محدودیت ابزارهای آماده را برطرف کند.
برنامهنویسی یعنی دادن دستورهای دقیق به کامپیوتر برای انجام عملیات روی دادهها.
یک زیستشناس الزاماً برای انجام Bioinformatics به برنامهنویسی نیاز ندارد، زیرا ابزارهای آماده زیادی وجود دارند.
اما برنامهنویسی زمانی بسیار مفید میشود که:
- ابزار موجود کاری که شما نیاز دارید انجام نمیدهد.
- فردی برای نوشتن ابزار جدید در دسترس نیست.
- نیاز دارید دادههای خود را به شکل خاصی خلاصه یا پردازش کنید.
فرض کنید یک پژوهشگر هزاران توالی DNA دارد و میخواهد:
- طول هر توالی را محاسبه کند.
- درصد GC را اندازهگیری کند.
- توالیهای خاصی را پیدا کند.
اگر ابزار آماده وجود نداشته باشد، یک برنامه کوچک Python میتواند این کار را انجام دهد.
قبل از نوشتن کد، باید مشخص کنیم:
- چه دادهای داریم؟
- چه کاری باید روی آن انجام شود؟
- خروجی چه خواهد بود؟
کامپیوتر فقط دستورهای دقیق را اجرا میکند. بنابراین برنامهنویس باید:
- نوع داده را مشخص کند.
- قالب داده را تعیین کند.
- مراحل پردازش را طراحی کند.
یک برنامه را میتوان مانند دستور پخت غذا تصور کرد.
| برنامهنویسی | پخت کیک |
|---|---|
| دادهها (Data) | مواد اولیه |
| الگوریتم | مراحل تهیه کیک |
| پردازش | مخلوط کردن و پختن |
| خروجی | کیک آماده |
قبل از شروع برنامهنویسی باید بدانیم:
- چه دادهای وارد برنامه میشود.
- چه عملیاتهایی انجام میشود.
- نتیجه نهایی چیست.
شبهکد، توضیح مراحل یک برنامه با زبان ساده و نزدیک به زبان برنامهنویسی است، اما قابل اجرا توسط کامپیوتر نیست.
وقتی برنامه کمی پیچیده میشود، نوشتن شبهکد کمک میکند:
- ایده برنامه مشخص شود.
- خطاهای منطقی قبل از کدنویسی پیدا شوند.
- طراحی برنامه سادهتر شود.
DNA شامل چهار نوکلئوتید است:
- A
- C
- G
- T
درصد GC نشان میدهد چه مقدار از DNA شامل بازهای:
- G (Guanine)
- C (Cytosine)
است.
- دریافت توالی DNA
- شمارش تعداد Cها
- شمارش تعداد Gها
- محاسبه طول توالی
- جمع کردن G و C
- تقسیم مقدار به طول کل توالی
- تبدیل به درصد
- نمایش نتیجه
فرمول:
[ GC% = \frac{G+C}{Total\ Length} \times 100 ]
Python یک زبان برنامهنویسی سطح بالا، ساده و قدرتمند است که برای کاربردهای مختلف از جمله تحلیل داده و Bioinformatics استفاده میشود.
Python دارای:
- ساختار دستوری ساده (Simple Syntax)
- خوانایی بالا (Readability)
است.
برنامههای Python معمولاً کوتاهتر از برنامههای مشابه در:
- C
- C++
- Java
هستند.
Python از مفهوم Object-Oriented Programming (OOP) پشتیبانی میکند.
در این روش، دادهها و عملکردهای مربوط به آنها در قالب اشیاء (Objects) سازماندهی میشوند.
البته برای بسیاری از برنامههای ساده این ویژگی ضروری نیست.
Python دارای ساختارهای داده آماده است که:
- نیاز به پیادهسازی دستی ندارند.
- کار با دادهها را سریعتر میکنند.
مانند:
- Lists
- Dictionaries
- Tuples
در زبان مفسری، کد برنامه مستقیماً توسط Interpreter اجرا میشود و نیاز به مرحله Compile ندارد.
میتوان:
- یک خط کد نوشت.
- همان لحظه اجرا کرد.
- نتیجه را مشاهده کرد.
مثلاً در محیط Python:
>>> print("Hello")
بلافاصله اجرا میشود.
| ویژگی | Interpreted | Compiled |
|---|---|---|
| مثال | Python | C, C++ |
| اجرا | خط به خط | پس از کامپایل |
| سرعت | معمولاً کمتر | معمولاً بیشتر |
| توسعه و آزمایش | آسانتر | پیچیدهتر |
ضعف Python:
- سرعت کمتر نسبت به زبانهایی مانند C و C++
اما برای دادهها و پروژههای این دوره، Python کاملاً مناسب است.
Python توسط:
Guido van Rossum
در اواخر دهه ۱۹۸۰ و اوایل دهه ۱۹۹۰ توسعه یافت.
محل توسعه اولیه:
National Research Institute for Mathematics and Computer Science
| نسخه | سال انتشار | ویژگی |
|---|---|---|
| Python 1.0 | 1994 | اولین نسخه رسمی |
| Python 2.0 | 2000 | بهبود امکانات و توسعه جامعه |
| Python 3.0 | 2008 | نسخه جدید با تغییرات اساسی |
Python 3:
- کتابخانههای جدیدتر دارد.
- نسخه آیندهمحور محسوب میشود.
اما Python 2:
- در برخی سیستمها از قبل نصب شده بود.
- هنوز در برخی پروژههای قدیمی استفاده میشد.
برای پروژههای جدید، Python 3 پیشنهاد میشود.
ساختار ساده و خوانا
امکان آزمایش سریع کدها
کتابخانههای آماده فراوان
قابل اجرا روی:
- Windows
- Linux
- Mac
قابلیت اتصال به زبانهایی مانند C و C++
مناسب برای:
- برنامههای کوچک
- پروژههای بزرگ
| اصطلاح انگلیسی | ترجمه فارسی | توضیح |
|---|---|---|
| Programming | برنامهنویسی | نوشتن دستور برای کامپیوتر |
| Python | پایتون | زبان برنامهنویسی مورد استفاده در این دوره |
| Bioinformatics | زیستاطلاعاتی | استفاده از محاسبات برای تحلیل دادههای زیستی |
| Genomic Data Science | علم دادههای ژنومی | تحلیل دادههای ژنتیکی با روشهای محاسباتی |
| Data | داده | اطلاعاتی که برنامه روی آن کار میکند |
| Algorithm | الگوریتم | مجموعه مراحل حل یک مسئله |
| Pseudocode | شبهکد | نمایش مراحل برنامه بدون زبان واقعی |
| DNA Sequence | توالی DNA | ترتیب نوکلئوتیدهای DNA |
| GC Content | درصد GC | نسبت بازهای G و C در DNA |
| Interpreter | مفسر | برنامهای که کد را مستقیم اجرا میکند |
| Compiler | کامپایلر | برنامهای که کد را به زبان ماشین تبدیل میکند |
| Object-Oriented Programming | برنامهنویسی شیءگرا | مدل سازماندهی برنامه بر اساس اشیاء |
| Syntax | نحو زبان | قوانین نوشتن کد |
| Standard Library | کتابخانه استاندارد | مجموعه توابع آماده زبان |
هدف:
محاسبه درصد بازهای G و C در یک توالی DNA.
ورودی:
ATGCGCAT
شمارش:
- G = 2
- C = 2
- طول توالی = 8
محاسبه:
[ GC%= \frac{4}{8}\times100=50% ]
خروجی:
GC Content = 50%
برای ساخت برنامه:
- ابتدا مواد اولیه (دادهها) را جمع میکنیم.
- مراحل پردازش را مشخص میکنیم.
- نتیجه نهایی را تعیین میکنیم.
بدون طراحی مناسب، برنامه ممکن است اشتباه اجرا شود.
- Python یک زبان برنامهنویسی ساده و قدرتمند برای تحلیل دادههای ژنومی است.
- زیستشناسان بدون برنامهنویسی هم میتوانند از ابزارهای آماده استفاده کنند، اما برنامهنویسی توانایی حل مسائل اختصاصی را افزایش میدهد.
- قبل از نوشتن کد باید داده، مراحل پردازش و خروجی مشخص شوند.
- شبهکد ابزاری برای طراحی برنامه قبل از کدنویسی است.
- Python یک زبان Interpreted است و نیاز به کامپایل ندارد.
- زبانهای Compiled مانند C و C++ معمولاً سریعتر هستند.
- Python دارای ساختار ساده، کتابخانههای گسترده و قابلیت اجرا روی سیستمهای مختلف است.
- محاسبه GC Content یکی از مثالهای ساده کاربرد Python در ژنومیک است.
- Python توسط Guido van Rossum ایجاد شد.
- برای پروژههای جدید معمولاً Python 3 توصیه میشود.
پاسخ: برای انجام تحلیلهای اختصاصی، پردازش دادههای بزرگ، ساخت ابزارهای جدید و حل مسائلی که ابزار آماده برای آنها وجود ندارد.
پاسخ: در زبان Interpreted مانند Python، کد مستقیماً اجرا میشود؛ اما در زبانهای Compiled مانند C ابتدا باید کد به فایل اجرایی تبدیل شود.
پاسخ: برای طراحی منطق برنامه قبل از نوشتن کد واقعی استفاده میشود و کمک میکند مراحل حل مسئله مشخص شوند.
پاسخ: درصد نوکلئوتیدهای G و C نسبت به کل طول توالی DNA است.
پاسخ: زیرا یادگیری آسان، کتابخانههای فراوان، خوانایی بالا و قابلیت پردازش مناسب دادههای زیستی دارد.
پاسخ: سرعت اجرای آن نسبت به زبانهای کامپایلشونده مانند C و C++ کمتر است، بنابراین برای پردازشهای بسیار سنگین ممکن است نیاز به زبانهای سریعتر باشد.
در این درس، اولین گامهای عملی برنامهنویسی با زبان Python معرفی میشود. هدف اصلی این بخش، آشنایی با مفاهیم پایهای مانند Data Types (انواع داده)، انجام عملیات روی دادهها، کار با Numbers (اعداد) و Strings (رشتهها) و استفاده از آنها در تحلیل دادههای زیستی است.
در پایان این درس، دانشجو قادر خواهد بود:
- محیط Python Interpreter را اجرا کند.
- عملیات ریاضی ساده انجام دهد.
- انواع مختلف دادههای عددی را تشخیص دهد.
- با رشتهها (Strings) کار کند.
- توالیهای DNA را بهعنوان رشته پردازش کند.
- عملیات پایه روی دادههای متنی انجام دهد.
Python Interpreter محیطی است که کدهای Python را دریافت کرده و بلافاصله اجرا میکند.
برای شروع کار با Python میتوان در یک Terminal دستور زیر را وارد کرد:
pythonپس از اجرا، مفسر Python فعال شده و آماده دریافت دستورات است.
مثال:
print("Hello World")خروجی:
Hello World
این ویژگی یکی از مزیتهای زبانهای Interpreted است، زیرا امکان آزمایش سریع دستورات را فراهم میکند.
نوع داده مشخص میکند که یک مقدار چه نوع اطلاعاتی را نشان میدهد و چه عملیاتهایی میتوان روی آن انجام داد.
در این درس دو نوع داده اصلی معرفی میشوند:
- Numbers
- Strings
اعداد در Python برای انجام محاسبات ریاضی استفاده میشوند.
Python میتواند مانند یک ماشین حساب عمل کند.
مثال:
5 + 5خروجی:
10
5 + 5نتیجه:
10
مثال:
10.5 - 2 * 3ترتیب عملیات مانند ریاضیات معمول است:
ابتدا ضرب:
[ 2 \times 3 = 6 ]
سپس:
[ 10.5 - 6 = 4.5 ]
در Python برای توان از دو علامت ستاره استفاده میشود:
10 ** 2نتیجه:
100
در برخی نسخههای Python، تقسیم اعداد صحیح ممکن است فقط بخش صحیح نتیجه را برگرداند.
مثال:
12 / 5در Python 2:
2
اما در Python 3:
2.4
برای محاسبه باقیمانده تقسیم از علامت % استفاده میشود.
مثال:
17 % 3نتیجه:
2
زیرا:
[ 17 = (3 \times 5) + 2 ]
Python چند نوع عددی دارد:
اعدادی بدون بخش اعشاری.
مثال:
5برای مشاهده نوع داده:
type(5)خروجی:
int
اعدادی که دارای بخش اعشاری هستند.
مثال:
3.5بررسی نوع:
type(3.5)خروجی:
float
در علوم کامپیوتر، اعداد حقیقی معمولاً با نام Float شناخته میشوند.
اعدادی که شامل بخش حقیقی و موهومی هستند.
در Python بخش موهومی با حرف j نمایش داده میشود.
مثال:
3 + 2jنوع:
type(3+2j)خروجی:
complex
اعداد مختلط در بیشتر کاربردهای Bioinformatics استفاده نمیشوند، اما Python از آنها پشتیبانی میکند.
String مجموعهای از کاراکترها است که داخل علامت نقل قول قرار میگیرد.
مثال:
"atg"یا:
'atg'در Bioinformatics، بسیاری از دادهها به شکل رشته هستند.
مثلاً:
یک توالی DNA:
ATGCGTAC
در واقع یک String از حروف زیر است:
- A
- T
- G
- C
توالی پروتئین نیز یک String است، اما با الفبای بزرگتر:
- 20 اسید آمینه مختلف
بنابراین تحلیل توالیهای زیستی تا حد زیادی شامل کار با Strings است.
Python اجازه میدهد Stringها با:
- Single Quote
' ' - Double Quote
" "
تعریف شوند.
مثال:
'atg'یا:
"atg"هر دو صحیح هستند.
مثال:
'This is a codon, isn't it?'این کد خطا ایجاد میکند.
دلیل:
Python تصور میکند علامت ' در کلمه:
isn't
پایان String است.
مثال:
"This is a codon, isn't it?"اکنون Python میداند که String با علامت " شروع و پایان مییابد.
میتوان از Backslash استفاده کرد:
'This is a codon, isn\'t it?'علامت \ به Python میگوید که کاراکتر بعدی را بهعنوان یک کاراکتر معمولی در نظر بگیرد.
Escape Characterها برای نمایش کاراکترهای خاص استفاده میشوند.
در Python، علامت:
\
کاراکتر Escape است.
| کد | معنی |
|---|---|
\n |
خط جدید (New Line) |
\t |
Tab |
\\ |
نمایش خود Backslash |
\" |
نمایش Double Quote |
برای ذخیره رشتههای طولانی میتوان از سه علامت نقل قول استفاده کرد:
"""
sequence
sequence
sequence
"""توالیهای DNA معمولاً بسیار طولانی هستند و نمیتوان آنها را در یک خط نوشت.
Python میتواند چند خط را بهعنوان یک String واحد ذخیره کند.
مثال:
ATGC
CGTA
GGCA
به صورت یک رشته ذخیره میشود.
تابع print() برای نمایش خروجی به شکل خواناتر استفاده میشود.
مثال:
print("ATGC\nCGTA")خروجی:
ATGC
CGTA
به جای نمایش:
ATGC\nCGTA
برخلاف اعداد، روی Stringها عملیات ریاضی معمول انجام نمیشود، اما Python چند عملیات مهم ارائه میدهد.
ترکیب چند رشته با علامت +.
مثال:
"atg" + "ccc"نتیجه:
atgccc
تکرار یک رشته با استفاده از *.
مثال:
"atg" * 3نتیجه:
atgatgatg
برای بررسی وجود یک مقدار از:
innot in
استفاده میشود.
بررسی وجود:
"atg" in "atgcct"نتیجه:
True
بررسی نبودن:
"n" in "atgc"نتیجه:
False
-
Python دارای انواع داده مختلف است و هر نوع داده عملیات خاص خود را دارد.
-
DNA و Protein Sequenceها در Python به شکل String ذخیره میشوند.
-
ترتیب عملیات ریاضی در Python مانند ریاضیات استاندارد است.
-
برای تشخیص نوع داده از تابع داخلی
type()استفاده میشود. -
در Python 3، تقسیم اعداد صحیح نتیجه اعشاری واقعی تولید میکند.
-
برای ذخیره رشتههای چندخطی از Triple Quotes استفاده میشود.
-
Escape Character با Backslash (
\) مشخص میشود. -
عملیات مهم روی Stringها شامل:
- اتصال
- تکرار
- بررسی وجود
است.
- یادگیری کار با Stringها برای تحلیل توالیهای DNA ضروری است.
| اصطلاح انگلیسی | ترجمه فارسی | توضیح |
|---|---|---|
| Data Type | نوع داده | مشخصکننده نوع اطلاعات در برنامه |
| Number | عدد | داده عددی قابل محاسبه |
| Integer (int) | عدد صحیح | عدد بدون بخش اعشاری |
| Float | عدد اعشاری | عدد دارای بخش اعشاری |
| Complex Number | عدد مختلط | عدد دارای بخش حقیقی و موهومی |
| String | رشته | مجموعهای از کاراکترها |
| Character | کاراکتر | یک نماد یا حرف منفرد |
| DNA Sequence | توالی DNA | ترتیب نوکلئوتیدهای DNA |
| Protein Sequence | توالی پروتئین | ترتیب اسیدهای آمینه |
| Interpreter | مفسر | اجراکننده مستقیم کد |
| Escape Character | کاراکتر فرار | نمایش کاراکترهای خاص |
| Concatenation | اتصال رشتهها | ترکیب چند String |
| Replication | تکرار رشته | ایجاد نسخههای متعدد از String |
| Membership | عضویت | بررسی وجود یک مقدار در رشته |
| Modulo | باقیمانده تقسیم | عملگر % |
توالی:
ATGCGT
در Python مانند یک متن ساده ذخیره میشود:
dna = "ATGCGT"سپس میتوان:
- طول آن را بررسی کرد.
- کاراکترها را جستجو کرد.
- تعداد G و C را شمرد.
- Python Interpreter امکان اجرای فوری دستورات را فراهم میکند.
- دادهها در Python دارای انواع مختلف هستند.
- مهمترین انواع عددی شامل Integer، Float و Complex هستند.
- String مجموعهای از کاراکترهاست که با
' 'یا" "تعریف میشود. - توالیهای DNA و Protein در Bioinformatics معمولاً به شکل String ذخیره میشوند.
- برای نمایش کاراکترهای خاص از Escape Character استفاده میشود.
\nبرای ایجاد خط جدید استفاده میشود.- رشتههای طولانی DNA را میتوان با Triple Quotes ذخیره کرد.
- تابع
print()خروجی رشتهها را خواناتر نمایش میدهد. - عملیات مهم روی Stringها شامل اتصال، تکرار و بررسی وجود است.
پاسخ: زیرا دادههای زیستی مانند DNA Sequence و Protein Sequence معمولاً به صورت مجموعهای از حروف ذخیره میشوند و این ساختار دقیقاً با Stringها تطابق دارد.
پاسخ: Integer اعداد بدون بخش اعشاری هستند، اما Float شامل بخش اعشاری است.
مثال:
5 → Integer
5.5 → Float
پاسخ:
با استفاده از تابع:
type()مثال:
type(5)'This isn't correct'پاسخ:
زیرا علامت ' داخل کلمه isn't باعث میشود Python تصور کند رشته در همان نقطه پایان یافته است.
پاسخ:
با استفاده از عملگر +.
مثال:
"ATG" + "CGT"خروجی:
ATGCGT
پاسخ:
با استفاده از عملگر in.
مثال:
"G" in "ATGC"نتیجه:
True
در این درس، مفاهیم پایهایتر برنامهنویسی در Python معرفی میشوند. تمرکز اصلی این بخش بر مفهوم Variables (متغیرها)، قوانین نامگذاری متغیرها، دسترسی به بخشهایی از رشتهها (String Indexing and Slicing) و استفاده از توابع و متدهای داخلی Python برای پردازش دادههای زیستی است.
از آنجا که دادههای زیستی مانند DNA Sequence و Protein Sequence عمدتاً به شکل رشته ذخیره میشوند، یادگیری روشهای کار با Stringها یکی از مهارتهای پایه در Bioinformatics Programming محسوب میشود.
در پایان این درس، دانشجو باید بتواند:
- مفهوم متغیر در Python را توضیح دهد.
- مقداردهی و تغییر مقدار متغیرها را انجام دهد.
- قوانین نامگذاری متغیرها را رعایت کند.
- به کاراکترهای خاص یک رشته دسترسی پیدا کند.
- بخشهایی از یک رشته را استخراج کند.
- طول یک رشته را محاسبه کند.
- از متدهای String برای تحلیل توالیهای DNA استفاده کند.
Variable یک نام برای ذخیره یک مقدار در حافظه کامپیوتر است.
به جای کار مستقیم با دادهها، آنها را داخل متغیرها ذخیره میکنیم تا بتوانیم بعداً از آنها استفاده یا آنها را تغییر دهیم.
در Python مقداردهی متغیر با علامت مساوی:
=انجام میشود.
مثال:
codon = "ATG"در اینجا:
- نام متغیر:
codon - مقدار ذخیرهشده:
"ATG"
اکنون به جای استفاده مستقیم از رشته "ATG" میتوان از نام codon استفاده کرد.
dna_sequence = "GTACCGTA"در این مثال:
dna_sequenceیک متغیر است.- مقدار آن یک توالی DNA است.
زمانی که یک متغیر مقداردهی میشود، Python معمولاً چیزی نمایش نمیدهد.
مثلاً:
codon = "ATG"خروجی ندارد.
اما اگر:
codonرا وارد کنیم، مقدار آن نمایش داده میشود.
قرار دادن یک مقدار در یک متغیر.
مثال:
a = 4یعنی مقدار ۴ را در متغیر a ذخیره کن.
در برنامهنویسی:
b = b + 3به معنی معادله ریاضی نیست.
بلکه یعنی:
- مقدار فعلی
bرا بردار. - سه واحد به آن اضافه کن.
- نتیجه جدید را دوباره در
bذخیره کن.
مثال:
ابتدا:
b = 4سپس:
b = b + 3نتیجه:
b = 7اما مقدار:
aهمچنان:
4است.
نام متغیرها باید از قوانین مشخصی پیروی کند.
Python به تفاوت بین حروف بزرگ و کوچک حساس است.
این سه متغیر متفاوت هستند:
myvariable = 1
MyVariable = 2
MYVARIABLE = 3بنابراین:
DNAdna
دو متغیر جداگانه هستند.
نام متغیر باید با:
- حرف انگلیسی
- یا underscore (
_)
شروع شود.
صحیح:
sequence1
_DNA
nameغلط:
1sequenceزیرا با عدد شروع شده است.
مجاز:
- حروف
- اعداد (به جز ابتدای نام)
- underscore
غیرمجاز:
name#
year@20در برنامههای علمی بهتر است نام متغیرها معنیدار باشند.
ضعیف:
x
a
sبهتر:
dnaSequence
genomeLength
gcContentIndexing یعنی دسترسی به یک کاراکتر خاص در یک رشته.
برای این کار از براکت استفاده میشود:
string[index]فرض کنید:
dna = "GATTC"برای گرفتن اولین کاراکتر:
dna[0]نتیجه:
G
در Python اولین موقعیت رشته شماره:
0
است.
مثال:
| کاراکتر | Index |
|---|---|
| G | 0 |
| A | 1 |
| T | 2 |
| T | 3 |
| C | 4 |
این روش در اکثر زبانهای برنامهنویسی وجود دارد.
Python اجازه میدهد از انتهای رشته به عقب حرکت کنیم.
مثال:
dna[-1]یعنی:
آخرین کاراکتر رشته.
اگر:
GATTC
باشد:
dna[-1]نتیجه:
C
جدول:
| Index | موقعیت |
|---|---|
| -1 | آخرین کاراکتر |
| -2 | دومین کاراکتر از انتها |
استخراج بخشی از یک رشته.
ساختار:
string[start:end]عدد دوم شامل نمیشود.
مثال:
dna[0:3]یعنی:
- شروع از index 0
- پایان قبل از index 3
پس:
indexهای:
0,1,2
برگردانده میشوند.
رشته:
GATTCA
کد:
dna[0:3]نتیجه:
GAT
اگر مقدار اول نوشته نشود:
dna[:3]یعنی:
از ابتدای رشته تا قبل از index 3.
اگر مقدار دوم حذف شود:
dna[2:]یعنی:
از index 2 تا انتهای رشته.
تابع:
len()تعداد کاراکترهای یک رشته را برمیگرداند.
مثال:
len(dna)اگر طول DNA برابر 49 باشد:
خروجی:
49
در برنامهنویسی شیءگرا، دادهها به صورت Object (شیء) در نظر گرفته میشوند که دارای:
- ویژگیها (Attributes)
- عملکردها (Methods)
هستند.
یک انسان میتواند یک Object باشد.
ویژگیها:
- نام
- آدرس
عملکردها:
- صحبت کردن
- فکر کردن
در Python، String فقط یک مقدار ساده نیست؛ بلکه یک Object است.
بنابراین میتواند عملکردهای مخصوص خود را داشته باشد.
این عملکردها:
Methods (متدها)
نامیده میشوند.
شمارش تعداد وقوع یک کاراکتر یا رشته در یک String.
مثال:
dna.count('c')تعداد Cها را در DNA محاسبه میکند.
مثال خروجی:
9
همچنین میتوان رشتههای بزرگتر را شمارش کرد:
dna.count('gc')تعداد دفعات وجود الگوی:
GC
را برمیگرداند.
تبدیل تمام حروف String به حروف بزرگ.
مثال:
dna.upper()نکته مهم:
این متد مقدار اصلی متغیر را تغییر نمیدهد.
مثلاً:
dna.upper()فقط یک نسخه جدید ایجاد میکند.
پیدا کردن اولین موقعیت یک Substring.
مثال:
dna.find('ag')نتیجه:
16
یعنی اولین AG در index شماره 16 قرار دارد.
میتوان مشخص کرد جستجو از کجا شروع شود:
dna.find('ag',17)جستجو از انتهای رشته.
مثال:
dna.rfind('ag')آخرین موقعیت AG را پیدا میکند.
بررسی میکند آیا تمام حروف کوچک هستند یا خیر.
مثال:
dna.islower()بررسی میکند آیا تمام حروف بزرگ هستند یا خیر.
جایگزین کردن بخشی از رشته.
مثال:
dna.replace('a','A')تمام aهای کوچک را به A بزرگ تبدیل میکند.
- متغیرها برای ذخیره و مدیریت دادهها ضروری هستند.
- علامت
=در Python برای مقداردهی استفاده میشود، نه مقایسه ریاضی. - نام متغیرها باید خوانا و معنیدار باشند.
- Python به حروف بزرگ و کوچک حساس است.
- Index در Python از صفر شروع میشود.
- در Slicing، موقعیت پایان شامل نمیشود.
- دادههای DNA در Python معمولاً به شکل String ذخیره میشوند.
- Stringها در Python دارای متدهای داخلی زیادی هستند.
- متدها با نقطه (
.) فراخوانی میشوند. - بسیاری از متدهای String مقدار اصلی را تغییر نمیدهند، بلکه نتیجه جدید ایجاد میکنند.
| اصطلاح انگلیسی | ترجمه فارسی | توضیح |
|---|---|---|
| Variable | متغیر | نامی برای ذخیره یک مقدار |
| Assignment | مقداردهی | ذخیره مقدار در متغیر |
| Variable Name | نام متغیر | شناسهای که برای داده انتخاب میشود |
| Case Sensitive | حساس به بزرگی حروف | تفاوت بین حروف بزرگ و کوچک |
| Index | اندیس | شماره موقعیت یک کاراکتر |
| Indexing | اندیسگذاری | دسترسی به کاراکتر خاص |
| Slicing | برش رشته | استخراج بخشی از رشته |
| String Object | شیء رشتهای | String به عنوان یک Object |
| Method | متد | تابع مربوط به یک Object |
| Attribute | ویژگی | اطلاعات مربوط به یک Object |
| Built-in Function | تابع داخلی | تابع آماده Python |
| Substring | زیررشته | بخشی از یک رشته بزرگتر |
| Concatenation | اتصال رشتهها | ترکیب چند String |
| Replace | جایگزینی | تغییر یک بخش از رشته |
متغیر مانند یک ظرف دارای برچسب است.
مثلاً:
ظرف: dna_sequence
محتوا:
ATGCGCTA
به جای اینکه هر بار کل توالی را بنویسیم، فقط نام ظرف را استفاده میکنیم.
فرض کنید:
dna = "ATGCGTAC"میتوانیم:
اولین باز را پیدا کنیم:
dna[0]خروجی:
A
یا سه باز اول را بگیریم:
dna[:3]خروجی:
ATG
-
Variable برای ذخیره دادهها در Python استفاده میشود.
-
مقداردهی با علامت
=انجام میشود. -
نام متغیر باید با حرف یا
_شروع شود. -
Python به بزرگی و کوچکی حروف حساس است.
-
DNA Sequenceها معمولاً به صورت String ذخیره میشوند.
-
Index در Python از صفر شروع میشود.
-
Index منفی از انتهای رشته شمارش میکند.
-
Slicing برای استخراج بخشهایی از رشته استفاده میشود.
-
len()طول رشته را برمیگرداند. -
Stringها دارای Methodهایی مانند:
count()upper()find()replace()هستند.
-
متدها با استفاده از عملگر نقطه (
.) فراخوانی میشوند.
پاسخ: متغیری است که یک مقدار را ذخیره میکند و با یک نام قابل دسترسی است.
b = b + 3پاسخ:
زیرا در برنامهنویسی علامت = به معنی مقداردهی است، یعنی مقدار جدیدی بر اساس مقدار قبلی ساخته و ذخیره میشود.
پاسخ: زیرا توالی DNA مجموعهای از کاراکترهای A، T، G و C است و ساختار String برای نمایش آن مناسب است.
"GENOME"[0]پاسخ:
G
زیرا اولین موقعیت رشته در Python برابر index صفر است.
پاسخ:
- Index یک کاراکتر مشخص را انتخاب میکند.
- Slicing یک بخش از رشته را استخراج میکند.
پاسخ: برای پیدا کردن موقعیت اولین وقوع یک رشته یا زیررشته در یک String استفاده میشود.
پاسخ:
با استفاده از:
dna.count('c')این دستور تعداد C موجود در رشته DNA را برمیگرداند.
در این درس، مفاهیم پایهای که در بخشهای قبل آموخته شد، برای ساخت اولین برنامه واقعی در Python به کار گرفته میشوند. هدف اصلی، طراحی برنامهای برای محاسبه GC Content (درصد GC) در یک توالی DNA است.
در این برنامه از مفاهیمی مانند:
- متغیرها (Variables)
- رشتهها (Strings)
- متدهای رشتهای (String Methods)
- توابع داخلی (Built-in Functions)
- عملیات ریاضی
- ذخیره برنامه در فایل
- اجرای فایل Python
- نوشتن توضیحات (Comments)
استفاده میشود.
پس از مطالعه این درس، دانشجو باید بتواند:
- یک برنامه ساده Python برای تحلیل DNA بنویسد.
- تعداد نوکلئوتیدهای خاص را در یک توالی شمارش کند.
- طول یک توالی DNA را محاسبه کند.
- درصد GC را محاسبه و نمایش دهد.
- برنامه Python را در یک فایل ذخیره و اجرا کند.
- برای خوانایی بهتر کد، Comment اضافه کند.
GC Content درصد بازهای نیتروژنی:
- Guanine (G)
- Cytosine (C)
در یک توالی DNA است.
درصد GC یکی از ویژگیهای مهم ژنوم است و برای بررسی ویژگیهای DNA گونههای مختلف استفاده میشود.
فرمول:
[ GC% = \frac{G+C}{Total\ Length} \times 100 ]
قبل از نوشتن Python، ابتدا مراحل حل مسئله مشخص میشوند.
- دریافت توالی DNA
- شمارش تعداد Cها
- شمارش تعداد Gها
- محاسبه طول DNA
- جمع تعداد G و C
- تقسیم بر طول کل DNA
- ضرب در 100 برای تبدیل به درصد
- نمایش نتیجه
فرض کنید توالی DNA داریم:
dna = "atgcgc..."از متد:
count()استفاده میکنیم.
مثال:
no_c = dna.count('c')در اینجا:
dna.count('c')- تعداد Cهای موجود در DNA را برمیگرداند.
- مقدار حاصل در متغیر
no_cذخیره میشود.
مشابه C:
no_g = dna.count('g')از تابع:
len()استفاده میکنیم.
مثال:
dna_length = len(dna)فرمول در Python:
gc_percent = ((no_c + no_g) * 100.0) / dna_lengthمراحل:
- تعداد C و G جمع میشود.
- در 100 ضرب میشود.
- بر طول DNA تقسیم میشود.
با:
print(gc_percent)نتیجه نمایش داده میشود.
مثلاً:
53.06
اگر برنامه را خط به خط در Python Interpreter بنویسیم:
- برنامه فقط همان لحظه وجود دارد.
- برای اجرای دوباره باید همه دستورات را دوباره وارد کنیم.
این روش برای برنامههای واقعی مناسب نیست.
کدها در یک فایل متنی ذخیره میشوند.
مثلاً:
gc.py
پسوند:
.py
نشاندهنده فایل Python است.
به جای وارد کردن دستورات، فایل را به Python میدهیم:
python gc.pyPython فایل را خوانده و اجرا میکند.
در سیستمهای Unix/Linux میتوان در ابتدای فایل Python خطی قرار داد که مشخص کند برنامه با چه مفسری اجرا شود.
مثال:
#!/usr/bin/pythonاین خط به سیستم عامل میگوید:
«این فایل یک برنامه Python است، آن را با Python اجرا کن.»
پس به جای:
python gc.pyمیتوان نوشت:
./gc.pyدر سیستم Unix، یک فایل معمولاً به صورت پیشفرض قابل اجرا نیست.
برای فعال کردن اجرای فایل از دستور:
chmodاستفاده میشود.
مثال:
chmod a+x gc.pyمعنی:
a→ همه کاربران+x→ اضافه کردن قابلیت اجرا
برای پیدا کردن محل نصب Python:
which pythonاستفاده میشود.
خروجی ممکن است:
/usr/bin/python
باشد.
این مسیر در خط Shebang استفاده میشود.
Commentها بخشهایی از برنامه هستند که توسط Python اجرا نمیشوند و فقط برای توضیح کد نوشته میشوند.
در برنامههای بزرگ:
- به یادآوری هدف کد کمک میکنند.
- فهم برنامه توسط دیگران را آسانتر میکنند.
- نگهداری برنامه در آینده سادهتر میشود.
برای توضیحات چندخطی:
"""
This program computes
GC content of DNA
"""Python این بخش را نادیده میگیرد.
برای توضیح کوتاه:
no_c = dna.count('c') # count C basesهر چیزی بعد از:
#
تا پایان خط Comment محسوب میشود.
- یک برنامه خوب ابتدا طراحی میشود و سپس نوشته میشود.
- GC Content یکی از مثالهای ساده کاربرد Python در Bioinformatics است.
- متد
count()برای شمارش کاراکترها در DNA استفاده میشود. - تابع
len()طول توالی DNA را محاسبه میکند. - ذخیره برنامه در فایل
.pyامکان اجرای مجدد را فراهم میکند. - خط Shebang برای اجرای مستقیم برنامه در Unix استفاده میشود.
- مجوز اجرایی فایل باید با
chmodتنظیم شود. - Commentها بخش مهمی از برنامهنویسی حرفهای هستند.
- نامگذاری مناسب متغیرها خوانایی کد را افزایش میدهد.
| اصطلاح انگلیسی | ترجمه فارسی | توضیح |
|---|---|---|
| GC Content | درصد GC | درصد بازهای G و C در DNA |
| Algorithm | الگوریتم | مراحل حل یک مسئله |
| Script | اسکریپت | فایل شامل دستورات برنامه |
| Python Interpreter | مفسر Python | اجراکننده کدهای Python |
| Source Code | کد منبع | دستورات نوشتهشده برنامه |
| File Extension | پسوند فایل | بخش انتهایی نام فایل مانند .py |
| Shebang | خط معرفی مفسر | دستور ابتدای فایل برای مشخص کردن Interpreter |
| Executable | قابل اجرا | فایلی که سیستم اجازه اجرای آن را دارد |
| Permission | مجوز | سطح دسترسی فایل |
| chmod | تغییر مجوز فایل | دستور Unix برای تغییر Permission |
| Comment | توضیح کد | متن نادیده گرفتهشده توسط Python |
| Documentation | مستندسازی | توضیح دادن عملکرد برنامه |
| Method | متد | تابع وابسته به یک Object |
فرض کنید یک کتاب دارید و میخواهید درصد حروف خاصی را محاسبه کنید:
- تعداد حرف G و C → تعداد حروف موردنظر
- تعداد کل حروف → طول کتاب
- تقسیم این دو → درصد حضور آنها
در DNA نیز دقیقاً همین کار انجام میشود.
dna = "atgcgcaa"
no_c = dna.count('c')
no_g = dna.count('g')
dna_length = len(dna)
gc_percent = ((no_c + no_g) * 100.0) / dna_length
print(gc_percent)- اولین برنامه Python این دوره برای محاسبه GC Content نوشته شد.
- GC Content برابر درصد G و C نسبت به کل DNA است.
- متد
count()تعداد یک کاراکتر را در String پیدا میکند. - تابع
len()طول DNA را محاسبه میکند. - نتیجه محاسبه در متغیر
gc_percentذخیره میشود. - برنامهها بهتر است در فایلهای
.pyذخیره شوند. - فایل Python را میتوان با Python Interpreter اجرا کرد.
- Shebang اجازه اجرای مستقیم فایل در Unix را میدهد.
- دستور
chmod a+xفایل را اجرایی میکند. - Commentها برای توضیح و نگهداری بهتر کد ضروری هستند.
پاسخ: درصد بازهای Guanine و Cytosine نسبت به کل طول یک توالی DNA است.
پاسخ: زیرا میتوانیم برنامه را بارها اجرا کنیم بدون اینکه دوباره دستورات را وارد کنیم.
پاسخ: طول یک رشته یا تعداد کاراکترهای موجود در آن را برمیگرداند.
پاسخ: مجوز اجرای فایل را برای کاربران فعال میکند.
پاسخ: زیرا توضیح میدهد برنامه چه کاری انجام میدهد و باعث میشود کد در آینده راحتتر فهمیده و نگهداری شود.
پاسخ:
- در Interpreter دستورات معمولاً به صورت تعاملی و خطبهخط اجرا میشوند.
- در Script، مجموعه دستورات در یک فایل ذخیره شده و یکجا اجرا میشوند.
در این درس، روشهای دریافت داده از کاربر و نمایش بهتر خروجیها در Python بررسی میشود. تا این مرحله، دادههای DNA به صورت مستقیم داخل برنامه نوشته میشدند؛ اما در برنامههای واقعی، معمولاً دادهها از کاربر یا فایل دریافت میشوند.
در این بخش یاد میگیریم:
- چگونه از کاربر ورودی دریافت کنیم.
- چرا ورودیها همیشه به صورت String ذخیره میشوند.
- چگونه String را به عدد تبدیل کنیم.
- چگونه خروجی برنامه را با قالببندی مناسب نمایش دهیم.
- چگونه نتیجه محاسبات زیستی مانند GC Content را خواناتر چاپ کنیم.
User Input روشی است که برنامه به جای دریافت دادههای از پیش نوشتهشده، از کاربر اطلاعات دریافت میکند.
در Python برای دریافت ورودی از کاربر از تابع:
input()استفاده میشود.
در Python 2 این تابع:
raw_input()نام دارد.
dna = input("Enter a DNA sequence please:")عملکرد:
- پیام زیر نمایش داده میشود:
Enter a DNA sequence please:
- برنامه منتظر ورود کاربر میماند.
- مقدار واردشده در متغیر
dnaذخیره میشود.
به جای نوشتن مستقیم:
dna = "ATGCGTA..."میتوان از کاربر یا فایل، توالی DNA دریافت کرد.
این روش برای دادههای بزرگ ژنومی ضروری است.
حتی اگر کاربر عدد وارد کند، Python آن را به صورت String دریافت میکند.
مثال:
my_number = input("Please enter a number:")اگر کاربر وارد کند:
10
مقدار واقعی:
"10"است، نه:
10در ظاهر این دو مشابه هستند:
10
"10"
اما در Python تفاوت دارند:
10→ عدد صحیح (Integer)"10"→ رشته (String)
بنابراین قبل از انجام محاسبات باید تبدیل انجام شود.
برای تبدیل String به انواع دیگر داده، از توابع تبدیل استفاده میکنیم.
int()تبدیل رشته به عدد صحیح.
مثال:
actual_number = int(my_number)اگر:
my_number = "10"باشد:
نتیجه:
actual_number = 10خواهد بود.
float()برای تبدیل به عدد اعشاری استفاده میشود.
مثال:
x = float("10.5")نتیجه:
10.5complex()برای ایجاد اعداد مختلط استفاده میشود.
مثال:
complex("2+3j")اگرچه در اکثر برنامههای Bioinformatics استفاده کمی دارد.
chr()یک عدد را به کاراکتر تبدیل میکند.
مثال:
chr(65)خروجی:
A
کامپیوترها در داخل خود، کاراکترها را با عدد ذخیره میکنند.
برای مثال:
| عدد | کاراکتر |
|---|---|
| 65 | A |
| 66 | B |
تابع chr() این تبدیل را انجام میدهد.
در برنامه GC Content ممکن است خروجی مانند زیر باشد:
53.06122448979591
اما معمولاً نیاز نداریم این تعداد رقم اعشار نمایش داده شود.
تابع print() میتواند چند مقدار را همزمان دریافت کند.
مثال:
print("The DNA sequence's GC content is", gc_percent, "%")در اینجا سه مقدار چاپ میشود:
- متن
- مقدار متغیر
- علامت درصد
برای کنترل تعداد ارقام خروجی از Formatting استفاده میکنیم.
فرمت:
%fبرای اعداد اعشاری (Floating Point) استفاده میشود.
print("GC content is %5.3f" % gc_percent)این دستور سه بخش دارد:
%5.3f
شروع دستور قالببندی
عرض کل فیلد خروجی را مشخص میکند.
یعنی حداقل 5 کاراکتر برای نمایش اختصاص داده شود.
تعداد ارقام بعد از اعشار را مشخص میکند.
مثلاً:
53.061
یعنی مقدار موردنظر یک:
floating point number
است.
Python فرمتهای مختلفی برای نمایش داده دارد.
%dبرای عدد صحیح.
مثال:
print("%d" % 10.6)خروجی:
10
زیرا بخش اعشاری حذف میشود.
مثال:
%3dیعنی عدد در فضایی با عرض 3 کاراکتر نمایش داده شود.
اگر فضای اضافی وجود داشته باشد، Python آن را با فاصله پر میکند.
%oنمایش عدد در مبنای هشت.
مثال:
10 → 12
%xنمایش عدد در مبنای شانزده.
%eبرای نمایش علمی اعداد بزرگ.
مثال:
10.6
به شکل:
1.06e+01
نمایش داده میشود.
%sبرای چاپ رشتهها.
مثال:
print("%s" % dna)خروجی:
توالی DNA نمایش داده میشود.
- تابع
input()همیشه خروجی از نوع String تولید میکند. - برای انجام محاسبات روی ورودی عددی باید ابتدا از
int()یاfloat()استفاده کرد. - در Python 2 نام تابع ورودی
raw_input()است، اما در Python 3 ازinput()استفاده میشود. - دادههای زیستی مانند DNA معمولاً به صورت String ذخیره میشوند.
- قالببندی خروجی باعث میشود نتایج علمی خواناتر باشند.
- برای نمایش درصد GC معمولاً تعداد محدودی رقم اعشار کافی است.
%fبرای اعداد اعشاری و%sبرای رشتهها استفاده میشود.- تابع
chr()ارتباط بین نمایش عددی داخلی کامپیوتر و کاراکترها را نشان میدهد.
| اصطلاح انگلیسی | ترجمه فارسی | توضیح |
|---|---|---|
| User Input | ورودی کاربر | دادهای که توسط کاربر وارد برنامه میشود |
| Input Function | تابع دریافت ورودی | تابعی برای گرفتن اطلاعات از کاربر |
| String | رشته | مجموعهای از کاراکترها |
| Integer | عدد صحیح | عدد بدون بخش اعشاری |
| Float | عدد اعشاری | عدد دارای بخش اعشاری |
| Type Conversion | تبدیل نوع داده | تغییر نوع یک مقدار به نوع دیگر |
| Output Formatting | قالببندی خروجی | کنترل نحوه نمایش نتیجه |
| Floating Point Number | عدد ممیز شناور | عدد دارای اعشار |
| Scientific Notation | نمایش علمی | نمایش اعداد بزرگ به شکل توان ده |
| Character Encoding | کدگذاری کاراکتر | تبدیل کاراکترها به نمایش عددی در کامپیوتر |
| ASCII | استاندارد نمایش کاراکترها | نگاشت اعداد به حروف و نمادها |
| Interpreter | مفسر | برنامهای که کد Python را اجرا میکند |
در یک آزمایشگاه، برنامه نباید همیشه یک نمونه ثابت را تحلیل کند.
بهتر است:
- نمونه جدید دریافت شود.
- برنامه آن را ذخیره کند.
- تحلیل روی نمونه انجام شود.
تابع input() همان مرحله دریافت نمونه جدید است.
بدون قالببندی:
GC content = 53.06122448979591
با قالببندی:
GC content = 53.061
نتیجه برای گزارش علمی خواناتر است.
- تابع
input()برای دریافت داده از کاربر استفاده میشود. - در Python 2 تابع مشابه آن
raw_input()است. - ورودیهای دریافتشده همیشه String هستند.
- برای تبدیل String به عدد از
int()وfloat()استفاده میکنیم. - تابع
chr()عدد را به کاراکتر تبدیل میکند. - تابع
print()میتواند چند مقدار را همزمان چاپ کند. - قالببندی خروجی با
%تعداد ارقام و نوع داده را کنترل میکند. %fبرای اعداد اعشاری استفاده میشود.%dبرای اعداد صحیح استفاده میشود.%sبرای رشتهها استفاده میشود.- قالببندی مناسب خروجی برای گزارشهای علمی اهمیت زیادی دارد.
پاسخ: زیرا Python ورودی دریافتشده از صفحهکلید را ابتدا به عنوان متن ذخیره میکند و نوع اصلی آن را تشخیص نمیدهد.
پاسخ:
با تابع:
int("25")نتیجه:
25پاسخ:
10یک Integer است."10"یک String است.
اولی قابل استفاده در محاسبات عددی است، اما دومی ابتدا باید تبدیل شود.
پاسخ: برای نمایش یک عدد اعشاری با عرض 5 کاراکتر و 3 رقم بعد از اعشار استفاده میشود.
پاسخ: زیرا نتایج تحلیلهای زیستی مانند GC Content معمولاً در گزارشها استفاده میشوند و باید خوانا و استاندارد نمایش داده شوند.
در این درس با یکی از مهمترین ساختارهای داده در Python یعنی List (لیست) آشنا میشویم. لیستها برای ذخیره و مدیریت مجموعهای از دادهها استفاده میشوند و در تحلیل دادههای زیستی، مانند ذخیره اطلاعات ژنها، توالیها و نتایج آزمایشها، کاربرد فراوان دارند.
در این بخش مفاهیمی مانند:
- ایجاد و دسترسی به عناصر لیست
- تفاوت List و String از نظر تغییرپذیری
- عملیات روی لیستها
- متدهای مهم List
- استفاده از List به عنوان Stack
- مرتبسازی دادهها
بررسی میشوند.
پس از مطالعه این درس باید بتوانید:
- دادههای چندگانه را در قالب List ذخیره کنید.
- عناصر لیست را با Index پیدا و تغییر دهید.
- تفاوت بین دادههای Mutable و Immutable را درک کنید.
- از متدهای مهم لیست برای پردازش دادهها استفاده کنید.
- لیستها را مرتب و مدیریت کنید.
List یک ساختار داده در Python است که چندین مقدار را در یک مجموعه مرتب ذخیره میکند.
لیست با استفاده از براکت مربع ایجاد میشود:
my_list = [value1, value2, value3]مثال:
gene_expression = ["gene", 0.05, 0.01, 7.33e-08]این لیست شامل:
- نام یک ژن (String)
- سه مقدار عددی (Float)
است.
بر خلاف بسیاری از ساختارهای داده که فقط یک نوع داده را ذخیره میکنند، در Python یک List میتواند شامل انواع مختلف داده باشد:
مثلاً:
["BRCA1", 2.5, True, 10]شامل:
- String
- Float
- Boolean
- Integer
است.
هنگامی که یک List ساخته میشود، دادههای آن در حافظه کامپیوتر ذخیره میشوند و متغیر List در واقع به محل ذخیره آن دادهها اشاره میکند.
به عبارت دیگر:
Variable → Memory Location → List Data
در تحلیل دادههای زیستی، List برای ذخیره مواردی مانند:
- نام ژنها
- مقادیر بیان ژن (Gene Expression)
- نتایج آزمایشها
- توالیهای مختلف
بسیار استفاده میشود.
مانند String، عناصر List نیز با Index قابل دسترسی هستند.
نکته مهم:
در Python شمارش از صفر (0) شروع میشود.
مثال:
gene_expression = ["gene", 0.05, 0.01, 7.33e-08]اندیسها:
| مقدار | Index |
|---|---|
| gene | 0 |
| 0.05 | 1 |
| 0.01 | 2 |
| 7.33e-08 | 3 |
دسترسی:
gene_expression[2]خروجی:
0.01
با Index منفی میتوان از انتهای لیست شمارش کرد.
مثال:
gene_expression[-1]آخرین مقدار لیست را برمیگرداند.
یکی از مهمترین تفاوتهای List و String در Python مربوط به تغییرپذیری است.
String ها قابل تغییر مستقیم نیستند.
مثال:
motif = "ACGT"
motif[0] = "T"خطا ایجاد میکند.
زیرا String:
Immutable
است.
یعنی پس از ایجاد، محتوای آن قابل تغییر نیست.
List ها قابل تغییر هستند.
مثال:
gene_expression[0] = "LIF"اکنون مقدار اولین عنصر تغییر کرده است.
بنابراین:
| نوع داده | قابل تغییر؟ |
|---|---|
| String | خیر |
| List | بله |
مانند String میتوان بخشی از List را جدا کرد.
ساختار:
list[start:end]مثال:
gene_expression[1:3]عناصر Index:
1 , 2
را برمیگرداند.
نکته:
Index انتهایی شامل نمیشود.
مثال:
gene_expression[-3:]یعنی:
از سومین عنصر انتهایی تا پایان لیست.
برخلاف Slice معمولی که فقط یک نسخه جدید ایجاد میکند، اگر به Slice مقدار جدید بدهیم، لیست اصلی تغییر میکند.
مثال:
gene_expression[1:3] = [10]دو عنصر قبلی با یک عنصر جدید جایگزین میشوند.
دو List را میتوان با علامت + ترکیب کرد.
مثال:
list1 + list2نتیجه:
یک List جدید ایجاد میشود.
با تابع:
len()تعداد عناصر مشخص میشود.
مثال:
len(gene_expression)خروجی:
3
برای حذف عنصر:
del gene_expression[1]عنصر دارای Index 1 حذف میشود.
پس از حذف، عناصر بعدی جابهجا میشوند.
List ها مانند String ها دارای Method هستند.
اضافه کردن عناصر یک List دیگر به انتهای List.
مثال:
gene_expression.extend([5,6])تفاوت با +:
+یک List جدید میسازد.extend()خود List اصلی را تغییر میدهد.
تعداد تکرار یک مقدار را پیدا میکند.
مثال:
gene_expression.count("LIF")اگر خروجی:
1
باشد، یعنی یک بار وجود دارد.
اگر:
0
باشد، آن مقدار وجود ندارد.
ترتیب عناصر را معکوس میکند.
مثال:
gene_expression.reverse()Stack یک ساختار داده است که قانون:
Last In, First Out (LIFO)
را دنبال میکند.
یعنی:
آخرین چیزی که وارد میشود، اولین چیزی است که خارج میشود.
مانند یک دسته بشقاب:
- بشقاب جدید روی همه قرار میگیرد.
- اولین بشقابی که برمیداریم، آخرین بشقاب اضافهشده است.
اضافه کردن عنصر به انتهای Stack:
stack.append("e")برداشتن آخرین عنصر:
element = stack.pop()آخرین عنصر اضافهشده حذف و برگردانده میشود.
دو روش اصلی وجود دارد:
یک List مرتبشده جدید ایجاد میکند.
مثال:
sorted(mylist)اما List اصلی تغییر نمیکند.
خود List را مرتب میکند.
مثال:
mylist.sort()بعد از اجرای آن، ترتیب اصلی List تغییر میکند.
| تابع | تغییر List اصلی | خروجی |
|---|---|---|
| sorted() | خیر | List جدید |
| sort() | بله | تغییر همان List |
Python میتواند String ها را نیز مرتب کند.
مثال:
sorted(["A","G","C","T"])خروجی:
["A","C","G","T"]
بر اساس ترتیب الفبایی مرتب میشوند.
- List یکی از پرکاربردترین ساختارهای داده در Python است.
- List با
[]ساخته میشود. - Index در Python از صفر شروع میشود.
- Index منفی برای دسترسی از انتهای List استفاده میشود.
- List ها Mutable هستند، اما String ها Immutable هستند.
- تغییر مستقیم عناصر List امکانپذیر است.
- Slice معمولی List اصلی را تغییر نمیدهد.
- اختصاص مقدار جدید به Slice باعث تغییر List میشود.
append()فقط یک عنصر اضافه میکند.extend()چندین عنصر را از یک List اضافه میکند.sort()لیست اصلی را تغییر میدهد ولیsorted()یک نسخه جدید میسازد.- Stack با ترکیب
append()وpop()ساخته میشود.
| اصطلاح انگلیسی | ترجمه فارسی | توضیح |
|---|---|---|
| Data Structure | ساختار داده | روشی برای ذخیره و سازماندهی دادهها |
| List | لیست | ساختار داده مرتب برای نگهداری چند مقدار |
| Index | اندیس | شماره موقعیت یک عنصر در داده |
| Slice | برش | استخراج بخشی از یک ساختار داده |
| Mutable | تغییرپذیر | دادهای که پس از ایجاد قابل تغییر است |
| Immutable | تغییرناپذیر | دادهای که پس از ایجاد تغییر نمیکند |
| Method | متد | تابعی که متعلق به یک Object است |
| Concatenation | اتصال | ترکیب دو ساختار داده |
| Stack | پشته | ساختار داده با قانون LIFO |
| Append | افزودن | اضافه کردن یک عنصر به انتهای List |
| Pop | حذف و بازگرداندن | حذف آخرین عنصر List |
| Sort | مرتبسازی درجا | مرتب کردن همان List |
| Sorted | مرتبسازی جدید | ایجاد نسخه مرتبشده جدید |
List مانند یک دسته بشقاب است:
A
B
C
D
اگر E اضافه شود:
A
B
C
D
E
با pop():
E حذف میشود
زیرا آخرین عنصر اضافهشده، اولین عنصر خارجشده است.
فرض کنید نتایج بیان یک ژن در شرایط مختلف را داریم:
gene_expression = ["BRCA1", 2.3, 4.5, 1.2]میتوانیم:
- نام ژن را تغییر دهیم.
- مقادیر را بررسی کنیم.
- دادهها را مرتب کنیم.
- List ساختاری برای ذخیره چند مقدار در Python است.
- List ها میتوانند انواع مختلف داده را همزمان ذخیره کنند.
- دسترسی به عناصر List با Index انجام میشود.
- شمارش Index در Python از صفر شروع میشود.
- String ها Immutable و List ها Mutable هستند.
- Slice برای استخراج بخشهایی از List استفاده میشود.
extend()لیست را تغییر میدهد، ولی+لیست جدید ایجاد میکند.append()یک عنصر اضافه میکند.pop()آخرین عنصر را حذف میکند.- List میتواند به عنوان Stack استفاده شود.
sorted()نسخه مرتبشده جدید میسازد.sort()همان List را تغییر میدهد.
پاسخ:
List یک ساختار داده برای ذخیره چند مقدار است و قابل تغییر است. اما String یک رشته متنی است و پس از ایجاد قابل تغییر نیست.
پاسخ:
زیرا Python از Zero-based Indexing استفاده میکند؛ بنابراین:
- عنصر اول → Index 0
- عنصر دوم → Index 1
- عنصر سوم → Index 2
پاسخ:
append() یک عنصر به List اضافه میکند، اما extend() عناصر یک List دیگر را به List موجود اضافه میکند.
پاسخ:
sort() خود List را تغییر میدهد، اما sorted() یک List جدید مرتبشده ایجاد میکند و List اصلی بدون تغییر باقی میماند.
پاسخ:
در Python، String ها به عنوان دادههای Immutable طراحی شدهاند، بنابراین تغییر یک کاراکتر باعث ایجاد خطا میشود. اما List ها Mutable هستند و عناصر داخلی آنها قابل تغییر است.
در درسهای قبلی با ساختارهای داده سادهتر مانند Numbers و Strings آشنا شدیم. در این درس سه ساختار داده مهم و پرکاربرد Python معرفی میشوند:
- Tuple (تاپل)
- Set (مجموعه)
- Dictionary (دیکشنری)
این ساختارها امکان ذخیره، سازماندهی و بازیابی دادهها را به شکلهای مختلف فراهم میکنند و در تحلیل دادههای زیستی (Bioinformatics) کاربرد زیادی دارند.
در پایان این درس باید بتوانید:
- تفاوت Tuple و List را درک کنید.
- دادههای بدون تکرار را با Set مدیریت کنید.
- عملیات مجموعهای مانند Union و Intersection را انجام دهید.
- دادهها را به صورت Key-Value در Dictionary ذخیره و بازیابی کنید.
- روش افزودن، حذف و تغییر دادهها در Dictionary را یاد بگیرید.
Tuple ساختاری شبیه List است که چندین مقدار را ذخیره میکند، اما عناصر آن پس از ایجاد قابل تغییر نیستند.
به عبارت دیگر:
Tuple یک ساختار داده Immutable (تغییرناپذیر) است.
Tuple با قرار دادن مقادیر کنار هم و جدا کردن آنها با کاما ساخته میشود.
مثال:
t = ("BRCA1", 0.05, 0.01)Python آن را به شکل زیر نمایش میدهد:
("BRCA1", 0.05, 0.01)همچنین میتوان از پرانتز استفاده کرد:
t = ("BRCA1", 0.05, 0.01)هر دو روش نتیجه یکسان دارند.
Tuple مانند List دارای ویژگیهای زیر است:
- دارای Index است.
- امکان دسترسی به عناصر وجود دارد.
- میتوان روی آن عملیاتهایی مانند خواندن، جستجو و شمارش انجام داد.
اما:
- نمیتوان عناصر آن را تغییر داد.
- نمیتوان عنصر جدید اضافه کرد.
- نمیتوان عنصر حذف کرد.
Tuple معمولاً برای ذخیره دادههایی استفاده میشود که نباید تغییر کنند.
مثلاً:
- مشخصات ثابت یک ژن
- مختصات یک موقعیت ژنومی
- اطلاعات یک نمونه آزمایشگاهی
Set مجموعهای از عناصر بدون ترتیب و بدون مقدار تکراری است.
ویژگیهای اصلی:
- عنصر تکراری ندارد.
- Index ندارد.
- ترتیب عناصر مهم نیست.
فرض کنید میخواهیم Annotationهای مربوط به ژن BRCA1 را ذخیره کنیم.
مثلاً:
BRCA1 = {
"DNA repair",
"cell cycle",
"DNA repair"
}اگر مقدار "DNA repair" دوبار وارد شود، Python آن را فقط یک بار نگه میدارد.
نتیجه:
{
"DNA repair",
"cell cycle"
}Set برای مقایسه مجموعههای زیستی بسیار مفید است.
مثلاً:
- مقایسه Gene Ontology بین دو ژن
- پیدا کردن ویژگیهای مشترک دو مجموعه داده
- حذف دادههای تکراری
فرض کنید:
BRCA1 = {...}
BRCA2 = {...}تمام عناصر موجود در هر دو مجموعه را برمیگرداند.
عملگر:
|مثال:
BRCA1 | BRCA2نتیجه:
تمام Annotationهای هر دو ژن.
عناصر مشترک بین دو Set را پیدا میکند.
عملگر:
&مثال:
BRCA1 & BRCA2نتیجه:
Annotationهایی که هر دو ژن دارند.
عناصر موجود در یک Set ولی نه در دیگری.
عملگر:
-مثال:
BRCA1 - BRCA2نتیجه:
Annotationهای اختصاصی BRCA1.
Dictionary ساختاری است که دادهها را به صورت:
Key : Value
ذخیره میکند.
مانند یک فرهنگ لغت:
- کلمه → معنی
در Python:
- Key → Value
Dictionary با آکولاد ساخته میشود:
dictionary = {
key1:value1,
key2:value2
}مثال زیستی:
TF_motif = {
"ATF":"TGACGTCA",
"SP1":"GGGCGG"
}در اینجا:
Key:
نام فاکتور رونویسی
Value:
توالی DNA مربوط به آن
باید Immutable باشد.
مثلاً:
مجاز:
- String
- Number
غیرمجاز:
- List
میتواند هر نوع دادهای باشد:
- String
- Number
- List
- Dictionary
- Object
برای گرفتن مقدار، از Key استفاده میکنیم.
مثال:
TF_motif["ATF"]خروجی:
TGACGTCA
مثلاً:
TF_motif["NF1"]اگر NF1 وجود نداشته باشد، Python خطا میدهد.
با:
inمیتوان بررسی کرد.
مثال:
"NF1" in TF_motifخروجی:
False
برای اضافه کردن Key جدید:
TF_motif["AP1"] = "TGACTCA"اگر Key از قبل وجود داشته باشد:
TF_motif["AP1"] = "NEW_SEQUENCE"مقدار قبلی جایگزین میشود.
با:
delمثال:
del TF_motif["SP1"]کل ورودی حذف میشود.
برای اضافه کردن چند Key-Value:
TF_motif.update(new_dictionary)این روش چندین مقدار را همزمان اضافه میکند.
تعداد Key-Value ها را برمیگرداند.
مثال:
len(TF_motif)خروجی:
6
یعنی Dictionary شامل 6 زوج Key-Value است.
تمام Key ها را برمیگرداند.
مثال:
list(TF_motif.keys())خروجی:
["ATF","SP1","c-Myc"]
تمام Value ها را برمیگرداند.
مثال:
list(TF_motif.values())برای مرتبسازی Key یا Value ها استفاده میشود.
مثال:
sorted(TF_motif.keys())در Python:
حروف بزرگ قبل از حروف کوچک قرار میگیرند.
مثلاً:
ATF
SP1
c-Myc
ممکن است c-Myc در انتها قرار گیرد، زیرا:
C بزرگ < c کوچک
| ویژگی | String | List | Dictionary |
|---|---|---|---|
| ترتیب دارد | بله | بله | خیر |
| Index دارد | بله | بله | خیر |
| Mutable | خیر | بله | بله |
| عنصر تکراری | بله | بله | Key خیر |
| دسترسی | Index | Index | Key |
- Tuple مانند List است اما Immutable است.
- Set برای حذف دادههای تکراری مناسب است.
- Set ها ترتیب ندارند و Index ندارند.
- عملیات Union، Intersection و Difference روی Set انجام میشود.
- Dictionary دادهها را به شکل Key-Value ذخیره میکند.
- Key در Dictionary باید Immutable باشد.
- Value در Dictionary میتواند هر نوع دادهای باشد.
- دسترسی به Dictionary با Key انجام میشود.
- استفاده از Key غیرموجود باعث خطا میشود.
keys()کلیدها وvalues()مقادیر را برمیگرداند.- Dictionary برای ذخیره اطلاعات مرتبط بسیار مناسب است.
| اصطلاح انگلیسی | ترجمه فارسی | توضیح |
|---|---|---|
| Tuple | تاپل | ساختار داده مرتب و تغییرناپذیر |
| Immutable | تغییرناپذیر | دادهای که پس از ایجاد تغییر نمیکند |
| Set | مجموعه | مجموعهای بدون ترتیب و بدون مقدار تکراری |
| Duplicate | مقدار تکراری | دادهای که بیش از یک بار وجود دارد |
| Union | اجتماع | ترکیب عناصر دو مجموعه |
| Intersection | اشتراک | عناصر مشترک دو مجموعه |
| Difference | تفاضل | عناصر موجود در یک مجموعه و نه دیگری |
| Dictionary | دیکشنری | ساختار Key-Value |
| Key | کلید | مقدار مورد استفاده برای جستجو |
| Value | مقدار | داده مرتبط با یک Key |
| Update | بهروزرسانی | افزودن یا تغییر دادهها |
| Annotation | حاشیهگذاری/توضیح داده | اطلاعات مرتبط با داده زیستی |
Dictionary مانند فرهنگ لغت است:
در فرهنگ:
Gene → BRCA1 function
در Python:
Key → Value
مثلاً:
ATF → TGACGTCA
یعنی:
نام فاکتور رونویسی → توالی DNA آن
دو ژن BRCA1 و BRCA2 را در نظر بگیرید:
BRCA1:
DNA repair
Cell cycle
BRCA2:
DNA repair
Recombination
اشتراک:
DNA repair
فقط با عملیات Intersection قابل استخراج است.
- Tuple نسخه غیرقابل تغییر List است.
- Set مجموعهای بدون ترتیب و بدون داده تکراری است.
- Dictionary دادهها را به صورت Key-Value ذخیره میکند.
- Tuple برای دادههای ثابت مناسب است.
- Set برای حذف تکرار و مقایسه مجموعهها کاربرد دارد.
- Dictionary برای ارتباط دادن دو نوع داده استفاده میشود.
- Key در Dictionary باید Immutable باشد.
- مقدار Value در Dictionary محدودیتی ندارد.
- Union با
|، Intersection با&و Difference با-انجام میشود. keys()کلیدها وvalues()مقادیر Dictionary را استخراج میکنند.
پاسخ:
List قابل تغییر است (Mutable)، اما Tuple پس از ایجاد قابل تغییر نیست (Immutable).
پاسخ:
زیرا Set دادههای تکراری را حذف میکند و امکان مقایسه مجموعه Annotationهای ژنها را فراهم میکند.
پاسخ:
با استفاده از عملگر in:
"ATF" in TF_motifپاسخ:
List با Index به عناصر دسترسی دارد، اما Dictionary با Key.
پاسخ:
از Intersection:
BRCA1 & BRCA2که عناصر مشترک دو Set را برمیگرداند.
در برنامهنویسی، معمولاً لازم نیست دستورات همیشه به صورت خطی و پشت سر هم اجرا شوند. بسیاری از برنامهها نیاز دارند بر اساس شرایط مختلف تصمیم بگیرند یا بخشهایی از کد را فقط در شرایط خاص اجرا کنند.
در این درس با مفاهیم زیر آشنا میشویم:
- ساختارهای تصمیمگیری در Python
- دستورهای
if،elseوelif - عبارتهای منطقی و Boolean Expressions
- عملگرهای مقایسهای، عضویت و هویت
- ترکیب چند شرط با
and،orوnot - کاربرد شرطها در تحلیل دادههای زیستی مانند بررسی توالی DNA
هدف اصلی این بخش، یادگیری نحوه کنترل مسیر اجرای برنامه و ایجاد برنامههایی است که بتوانند بر اساس دادههای ورودی تصمیم بگیرند.
Control Flow مشخص میکند که دستورات یک برنامه با چه ترتیبی اجرا شوند.
در برنامههای ساده، دستورات معمولاً از خط اول تا آخر اجرا میشوند. اما در برنامههای واقعی، نیاز داریم:
- اگر یک شرط برقرار بود، کاری انجام شود.
- اگر شرط برقرار نبود، کار دیگری انجام شود.
- چند حالت مختلف بررسی شوند.
برای این کار از ساختارهای کنترلی استفاده میکنیم.
در زیستمحاسبات (Bioinformatics)، کنترل جریان برای کارهایی مانند:
- بررسی معتبر بودن توالی DNA
- تشخیص وجود بازهای نامشخص
- تصمیمگیری بر اساس ویژگیهای دادههای ژنتیکی
بسیار مهم است.
دستور if اجازه میدهد یک بخش از کد فقط زمانی اجرا شود که یک شرط درست باشد.
if condition:
statementsاگر مقدار condition برابر True باشد، دستورات داخل بلوک اجرا میشوند.
فرض کنید کاربر یک توالی DNA وارد میکند و میخواهیم بررسی کنیم آیا باز نامشخص N در آن وجود دارد یا نه:
dna = input("Enter a DNA sequence:")
if 'n' in dna:
nbases = dna.count('n')
print(nbases)در این مثال:
- شرط بررسی میکند آیا
nداخل DNA وجود دارد. - اگر وجود داشته باشد، تعداد آن شمرده میشود.
در Python، فاصله ابتدای خطوط مشخص میکند کدام دستورات متعلق به یک بلوک هستند.
مثال:
if 'n' in dna:
print("Undefined bases found")خط print به دلیل تورفتگی، بخشی از دستور if است.
در زبانهایی مانند C یا Java معمولاً از {} استفاده میشود، اما Python از فاصلهگذاری استفاده میکند.
عبارتی که فقط یکی از دو مقدار زیر را برمیگرداند:
TrueFalse
0 < 1نتیجه:
True
مثال دیگر:
len('atgcgt') >= 10نتیجه:
False
برای مقایسه مقادیر استفاده میشوند.
| عملگر | مفهوم |
|---|---|
== |
برابر بودن |
!= |
نابرابر بودن |
< |
کوچکتر |
> |
بزرگتر |
<= |
کوچکتر یا مساوی |
>= |
بزرگتر یا مساوی |
یکی از مهمترین نکات Python:
عملگر انتساب (Assignment)
مثال:
a = 5یعنی مقدار 5 را داخل متغیر a ذخیره کن.
عملگر مقایسه
مثال:
a == 5یعنی بررسی کن آیا مقدار a برابر 5 است یا خیر.
برای بررسی وجود یک مقدار در یک مجموعه استفاده میشوند.
دو عملگر اصلی:
| عملگر | کاربرد |
|---|---|
in |
آیا وجود دارد؟ |
not in |
آیا وجود ندارد؟ |
motif in dnaبررسی میکند آیا یک الگوی DNA در توالی بزرگتر وجود دارد یا خیر.
مثلاً:
"ATG" in "CCCATGTT"نتیجه:
True
عملگرهای:
isis not
بررسی میکنند آیا دو متغیر به یک شیء در حافظه اشاره میکنند یا خیر.
مقایسه مقدار
مقایسه هویت شیء در حافظه
مثال:
alphabet = ['a','c','g','t']
new_alphabet = alphabet[:]در اینجا:
alphabet == new_alphabetنتیجه:
True
چون محتویات یکسان هستند.
اما:
alphabet is new_alphabetنتیجه:
False
زیرا دو لیست جداگانه در حافظه هستند.
برای زمانی استفاده میشود که دو حالت ممکن داریم.
ساختار:
if condition:
code1
else:
code2if 'n' in dna:
print("Undefined bases exist")
else:
print("DNA sequence has no undefined bases")اگر n وجود داشته باشد پیام اول چاپ میشود، در غیر این صورت پیام دوم.
وقتی چند حالت مختلف داریم از elif استفاده میکنیم.
ساختار:
if condition1:
code1
elif condition2:
code2
else:
code3ممکن است کاربر:
nکوچک وارد کند.Nبزرگ وارد کند.- هیچکدام را وارد نکند.
پس:
if 'n' in dna:
...
elif 'N' in dna:
...
else:
...برای ترکیب چند شرط استفاده میشوند.
| عملگر | مفهوم |
|---|---|
and |
هر دو شرط باید درست باشند |
or |
حداقل یکی از شرطها درست باشد |
not |
معکوس کردن شرط |
بررسی وجود باز نامشخص:
if 'n' in dna or 'N' in dna:
print("Undefined bases")یعنی:
اگر n یا N وجود داشت، توالی دارای باز نامشخص است.
- شرطها مسیر اجرای برنامه را تغییر میدهند.
- در Python، بلوکهای کد با indentation مشخص میشوند.
- هر شرط در
ifباید یک مقدار Boolean تولید کند. - برای مقایسه مقدار از
==استفاده میکنیم، نه=. - عملگر
inبرای جستجوی وجود یک مقدار در رشتهها و لیستها بسیار کاربردی است. isبا==متفاوت است؛ یکی هویت شیء و دیگری مقدار را بررسی میکند.- رشتهها و لیستها رفتار متفاوتی در حافظه دارند.
- میتوان چند شرط را با
and،orوnotترکیب کرد. - در تحلیل DNA معمولاً باید حروف بزرگ و کوچک را جداگانه یا با یک شرط ترکیبی بررسی کرد.
| اصطلاح انگلیسی | ترجمه فارسی | توضیح |
|---|---|---|
| Control Flow | کنترل جریان | تعیین ترتیب اجرای دستورات برنامه |
| Conditional Statement | دستور شرطی | اجرای کد بر اساس یک شرط |
| if Statement | دستور اگر | اجرای کد در صورت درست بودن شرط |
| else Statement | دستور در غیر این صورت | اجرای کد وقتی شرط غلط است |
| elif Statement | شرط دیگر | بررسی شرطهای اضافی |
| Boolean Expression | عبارت بولی | عبارتی که True یا False تولید میکند |
| Comparison Operator | عملگر مقایسهای | مقایسه دو مقدار |
| Membership Operator | عملگر عضویت | بررسی وجود یک عنصر در مجموعه |
| Identity Operator | عملگر هویتی | بررسی یکسان بودن شیء در حافظه |
| Logical Operator | عملگر منطقی | ترکیب چند شرط |
| Condition | شرط | عبارتی که باید ارزیابی شود |
| Indentation | تورفتگی | فاصله ابتدای خط برای تعیین بلوک کد |
فرض کنید یک توالی DNA داریم:
ATGCNNAG
حرف N نشاندهنده باز ناشناخته است.
برنامه میتواند بررسی کند:
- آیا N وجود دارد؟
- چند بار تکرار شده؟
- آیا توالی معتبر است؟
این یک مثال واقعی از کاربرد شرطها در Bioinformatics است.
فرض کنید دو کتاب دارید:
- هر دو عنوان و متن یکسان دارند.
- اما یکی نسخه چاپی جداگانه است.
== میگوید:
محتوای دو کتاب یکسان است.
is میگوید:
آیا دقیقاً همان کتاب فیزیکی هستند؟
- ساختارهای کنترلی باعث میشوند برنامه بر اساس شرایط تصمیم بگیرد.
- دستور
ifبرای اجرای شرطی کد استفاده میشود. - Python برای مشخص کردن بلوکها از indentation استفاده میکند.
- عبارتهای Boolean فقط مقدار
TrueیاFalseدارند. =برای انتساب و==برای مقایسه استفاده میشود.- عملگر
inوجود یک عنصر در رشته یا لیست را بررسی میکند. isبررسی میکند دو متغیر به یک شیء حافظهای اشاره میکنند یا خیر.elseحالت جایگزین زمانی اجرا میشود که شرط غلط باشد.elifامکان بررسی چند شرط پشت سر هم را فراهم میکند.and،orوnotبرای ترکیب شرایط استفاده میشوند.- در دادههای زیستی، شرطها برای اعتبارسنجی و تحلیل توالیها بسیار مهم هستند.
پاسخ:
دستور if اجازه میدهد یک بخش از برنامه فقط زمانی اجرا شود که یک شرط مقدار True داشته باشد.
پاسخ:
= برای ذخیره مقدار در یک متغیر استفاده میشود، اما == برای مقایسه دو مقدار است.
پاسخ:
برای مشخص کردن اینکه کدام دستورات متعلق به یک بلوک مانند if هستند.
پاسخ:
== مقدار دو متغیر را مقایسه میکند، اما is بررسی میکند آیا دو متغیر به یک شیء واحد در حافظه اشاره میکنند یا خیر.
**پاسخ:
if 'N' in dna or 'n' in dna:
print("Undefined bases")این شرط بررسی میکند آیا یکی از شکلهای باز نامشخص در توالی وجود دارد یا خیر.
در برنامهنویسی، معمولاً لازم نیست دستورات همیشه به صورت خطی و پشت سر هم اجرا شوند. ساختارهای کنترل جریان (Control Structures) به برنامه اجازه میدهند بر اساس شرایط مختلف تصمیمگیری کند یا یک بخش از کد را چندین بار اجرا نماید.
در این درس دو مفهوم اصلی بررسی میشوند:
- شرطها (Conditional Statements) برای تصمیمگیری در برنامه
- حلقهها (Loops) برای تکرار عملیات روی دادههای زیاد
این مفاهیم در تحلیل دادههای زیستی، مخصوصاً هنگام پردازش توالیهای DNA و پروتئین، اهمیت زیادی دارند؛ زیرا معمولاً با فایلها و مجموعه دادههای بسیار بزرگ سروکار داریم.
ساختارهای کنترل جریان تعیین میکنند که برنامه کدام بخش از کد را اجرا کند و چه زمانی اجرا را تکرار نماید.
به صورت پیشفرض، برنامهها دستورات را از بالا به پایین اجرا میکنند. اما با استفاده از کنترل جریان میتوان:
- اجرای کد را بر اساس یک شرط تغییر داد.
- بخشی از برنامه را چندین بار اجرا کرد.
- در شرایط خاص اجرای حلقه را متوقف کرد.
دو نوع اصلی کنترل جریان:
- تصمیمگیری →
if - تکرار →
loops
عبارتی که فقط یکی از دو مقدار زیر را تولید میکند:
TrueFalse
شرطهایی که در دستورات if استفاده میشوند، معمولاً عبارتهای بولی هستند.
مثال:
0 < 1خروجی:
Trueیا:
len("ATGC") >= 10خروجی:
Falseدستور if اجازه میدهد یک بخش از کد فقط زمانی اجرا شود که یک شرط درست باشد.
ساختار:
if condition:
statementsمثال زیستی:
بررسی وجود باز غیرمشخص (N) در DNA:
if "n" in dna:
nbases = dna.count("n")اگر حرف n در توالی DNA وجود داشته باشد، تعداد آن شمرده میشود.
برای زمانی استفاده میشود که بخواهیم برای هر دو حالت درست و غلط شرط، دستور مشخصی داشته باشیم.
ساختار:
if condition:
code1
else:
code2مثال:
if "N" in dna:
print("DNA contains undefined bases")
else:
print("DNA has no undefined bases")اگر DNA شامل N باشد پیام اول چاپ میشود، در غیر این صورت پیام دوم.
برای بررسی چندین شرط مختلف در یک ساختار شرطی استفاده میشود.
ساختار:
if condition1:
code1
elif condition2:
code2
else:
code3مثال:
بررسی وجود بازهای غیرمشخص کوچک و بزرگ:
if "n" in dna:
...
elif "N" in dna:
...
else:
...برای مقایسه مقادیر استفاده میشوند.
| عملگر | معنی |
|---|---|
== |
برابر است |
!= |
نابرابر است |
< |
کوچکتر |
> |
بزرگتر |
<= |
کوچکتر یا مساوی |
>= |
بزرگتر یا مساوی |
در پایتون:
=برای انتساب مقدار است.
مثال:
x = 10اما:
==برای مقایسه است.
مثال:
x == 10دو عملگر مهم:
بررسی وجود یک عنصر در یک مجموعه:
"A" in "ATGC"خروجی:
Trueبررسی نبودن عنصر:
"U" not in proteinدو عملگر:
isis not
== بررسی میکند دو مقدار برابر هستند یا نه.
اما:
is
بررسی میکند آیا دو متغیر به یک شیء یکسان در حافظه اشاره میکنند یا خیر.
مثال:
alphabet = ["A","C","G","T"]
new_alphabet = alphabet[:]دو لیست مقدار مشابه دارند:
alphabet == new_alphabetنتیجه:
Trueاما:
alphabet is new_alphabetنتیجه:
Falseزیرا دو شیء متفاوت در حافظه هستند.
برای ترکیب چند شرط استفاده میشوند.
هر دو شرط باید درست باشند.
مثال:
A and Bحداقل یکی از شرطها باید درست باشد.
مثال:
"n" in dna or "N" in dnaمقدار شرط را معکوس میکند.
مثال:
not Trueنتیجه:
Falseحلقهها اجازه میدهند یک قطعه کد چندین بار اجرا شود.
در دادههای ژنومی معمولاً:
- میلیونها باز DNA
- هزاران توالی پروتئین
- فایلهای بزرگ ژنومی
وجود دارند و بررسی دستی آنها امکانپذیر نیست.
تا زمانی که یک شرط درست باشد، کد تکرار میشود.
ساختار:
while condition:
codeهدف:
پیدا کردن تمام توالیهای:
GT
در DNA.
تابع:
dna.find("gt")اگر پیدا نشود:
-1برمیگرداند.
حلقه تا زمانی ادامه دارد که مقدار پیدا شده معتبر باشد.
برای پیمایش روی عناصر یک مجموعه یا توالی استفاده میشود.
ساختار:
for item in sequence:
codeمثال:
for motif in motifs:
print(motif)هر بار یک motif پردازش میشود.
برای ایجاد مجموعهای از اعداد استفاده میشود.
مثال:
range(4)تولید میکند:
0,1,2,3
مثال:
for i in range(4):
print(i)خروجی:
0
1
2
3
ساختار:
range(start, stop, step)مثال:
range(1,10,2)خروجی:
1,3,5,7,9
حلقه را فوراً متوقف میکند.
مثال:
بررسی معتبر بودن پروتئین:
اگر یک آمینواسید غیرمجاز پیدا شود:
breakاجرا متوقف میشود.
ادامه حلقه را حفظ میکند اما اجرای باقی کدهای همان تکرار را رد میکند.
مثال:
حذف آمینواسیدهای غیرمجاز:
اگر کاراکتر غیرمجاز باشد:
continueو به عنصر بعدی میرود.
پایتون اجازه میدهد بعد از حلقه for یا while از else استفاده کنیم.
مثال:
for x in sequence:
...
else:
...else فقط زمانی اجرا میشود که حلقه بدون break تمام شود.
اگر حلقه با break متوقف شود:
- بخش
elseاجرا نمیشود.
دستوری است که هیچ کاری انجام نمیدهد.
کاربرد:
وقتی از نظر ساختاری باید دستوری وجود داشته باشد اما هنوز کدی برای آن ننوشتهایم.
مثال:
if condition:
passبعداً میتوان جای آن کد واقعی قرار داد.
-
دستورات شرطی با
ifمسیر اجرای برنامه را تغییر میدهند. -
شرطها همیشه باید یک مقدار بولی (
TrueیاFalse) تولید کنند. -
در پایتون فاصلهگذاری (Indentation) برای مشخص کردن بلوک کد ضروری است.
-
حلقه
whileزمانی مناسب است که تعداد تکرار مشخص نیست و وابسته به یک شرط است. -
حلقه
forبرای پیمایش روی مجموعهها و تعداد مشخصی از عناصر مناسب است. -
=با==تفاوت دارد:=→ مقداردهی==→ مقایسه
-
isبا==متفاوت است:==→ برابری مقدارis→ یکسان بودن شیء در حافظه
-
breakحلقه را متوقف میکند. -
continueفقط یک مرحله از حلقه را رد میکند. -
elseدر حلقه فقط زمانی اجرا میشود که حلقه باbreakمتوقف نشده باشد.
| اصطلاح انگلیسی | ترجمه فارسی | توضیح |
|---|---|---|
| Control Flow | جریان کنترل | تعیین مسیر اجرای برنامه |
| Conditional Statement | دستور شرطی | اجرای کد بر اساس شرط |
| Boolean Expression | عبارت بولی | عبارتی با مقدار True یا False |
| Comparison Operator | عملگر مقایسهای | مقایسه دو مقدار |
| Membership Operator | عملگر عضویت | بررسی وجود عنصر در مجموعه |
| Identity Operator | عملگر هویتی | بررسی یکسان بودن شیء |
| Logical Operator | عملگر منطقی | ترکیب چند شرط |
| Loop | حلقه | اجرای تکراری کد |
| While Loop | حلقه while | تکرار تا زمانی که شرط درست است |
| For Loop | حلقه for | پیمایش روی مجموعه |
| Range | بازه عددی | تولید دنباله اعداد |
| Break | توقف حلقه | خروج فوری از حلقه |
| Continue | ادامه حلقه | رفتن به تکرار بعدی |
| Pass | دستور خنثی | بدون انجام عملیات |
| Indentation | تورفتگی | فاصله ابتدای خطوط برای تعیین بلوک |
فرض کنید یک توالی DNA داریم:
ATGGTACGT
میخواهیم تمام موقعیتهایی که GT وجود دارد پیدا کنیم.
حلقه while:
- اولین
GTرا پیدا میکند. - موقعیت آن را ذخیره میکند.
- جستجو را از موقعیت بعد ادامه میدهد.
- این کار تا زمانی ادامه دارد که دیگر
GTوجود نداشته باشد.
حلقهها مانند بررسی یک کتاب بزرگ هستند:
به جای اینکه بگوییم:
«صفحه ۱ را بررسی کن، صفحه ۲ را بررسی کن، صفحه ۳ را بررسی کن...»
یک حلقه مینویسیم که:
«هر صفحه را بررسی کن و همین عملیات را تکرار کن.»
- ساختارهای کنترل جریان باعث تغییر مسیر اجرای برنامه میشوند.
ifبرای تصمیمگیری بر اساس شرط استفاده میشود.- شرطها باید مقدار Boolean تولید کنند.
elifبرای بررسی چند شرط متوالی استفاده میشود.and،orوnotبرای ترکیب شرایط هستند.forبرای پیمایش روی عناصر یک مجموعه استفاده میشود.whileتا زمانی که شرط برقرار باشد اجرا میشود.- تابع
range()برای تولید دنباله اعداد کاربرد دارد. breakحلقه را متوقف میکند.continueیک مرحله از حلقه را رد میکند.passیک جاینگهدار بدون عملیات است.- در Python تورفتگی خطوط برای تعیین بلوکهای کد حیاتی است.
چرا در تحلیل دادههای ژنومی استفاده از حلقهها ضروری است؟
پاسخ: زیرا دادههای ژنومی معمولاً بسیار بزرگ هستند و انجام عملیات تکراری روی میلیونها عنصر بدون حلقه امکانپذیر نیست.
تفاوت while و for چیست؟
پاسخ:
while تا زمانی اجرا میشود که یک شرط برقرار باشد، اما for معمولاً برای پیمایش روی عناصر یک مجموعه یا بازه عددی استفاده میشود.
اگر بخواهیم بررسی کنیم آیا DNA شامل باز N است، از چه عملگری استفاده میکنیم؟
پاسخ:
از عملگر عضویت in:
"N" in dnaتفاوت break و continue چیست؟
پاسخ:
breakکل حلقه را متوقف میکند.continueفقط اجرای فعلی را رد کرده و به تکرار بعدی میرود.
چرا ممکن است از else بعد از حلقه استفاده کنیم؟
پاسخ:
برای اجرای کدی که فقط زمانی اجرا شود که حلقه بدون استفاده از break کامل شده باشد.
در این درس با مفهوم Function (تابع) در برنامهنویسی پایتون آشنا میشویم. توابع یکی از مهمترین ابزارهای برنامهنویسی هستند که به ما اجازه میدهند یک قطعه کد را یک بار بنویسیم و بارها در برنامه استفاده کنیم.
در زیستمحاسبات (Bioinformatics)، توابع اهمیت ویژهای دارند زیرا بسیاری از عملیات روی توالیهای DNA و پروتئین به صورت تکراری انجام میشوند؛ مانند:
- محاسبه درصد GC در DNA
- بررسی وجود codonهای توقف (Stop Codons)
- پردازش و تحلیل توالیها
هدف این درس:
- آشنایی با مفهوم تابع
- یادگیری نحوه تعریف تابع در Python
- آشنایی با ورودی، خروجی و مستندسازی توابع
- درک مفهوم Scope (دامنه دسترسی متغیرها)
تابع یک بخش مستقل از برنامه است که:
- ورودی دریافت میکند.
- روی ورودی عملیات انجام میدهد.
- یک خروجی برمیگرداند.
ساختار کلی:
Input → Processing → Output
تابع مانند یک ماشین کوچک در برنامه است.
برای مثال:
- ورودی: یک توالی DNA
- پردازش: شمارش بازهای G و C
- خروجی: درصد GC
به جای نوشتن دوباره کد محاسبه GC در قسمتهای مختلف برنامه، آن را داخل یک تابع قرار میدهیم و هر زمان لازم بود آن را فراخوانی میکنیم.
استفاده از توابع باعث میشود:
یک بار کد نوشته میشود و بارها استفاده میشود.
برنامه به مجموعهای از مراحل مشخص تقسیم میشود.
مثلاً:
calculate_GC()
check_stop_codons()
translate_DNA()هر تابع یک وظیفه مشخص دارد.
میتوان از توابع نوشتهشده توسط دیگر برنامهنویسان استفاده کرد بدون اینکه لازم باشد جزئیات داخلی آنها را بدانیم.
توابعی هستند که از قبل در Python وجود دارند.
مثال:
برای نمایش خروجی:
print("Hello")برای محاسبه طول:
len("ATGC")خروجی:
4
تابعی که خود برنامهنویس ایجاد میکند.
در Python با کلمه کلیدی:
defساخته میشود.
ساختار کلی:
def function_name(arguments):
statements
return outputاجزای اصلی:
| بخش | توضیح |
|---|---|
def |
اعلام شروع تعریف تابع |
| function_name | نام تابع |
| arguments | ورودیهای تابع |
: |
شروع بلوک تابع |
| indentation | مشخصکننده بدنه تابع |
| return | مقدار خروجی |
در Python برخلاف بسیاری از زبانها، تورفتگی برای مشخص کردن بلوک کد ضروری است.
مثال:
def example():
print("Hello")خط دوم متعلق به تابع است زیرا دارای تورفتگی است.
اولین خط داخل تابع میتواند یک متن توضیحی درباره عملکرد تابع باشد.
مثال:
def GC(DNA):
"Computes GC percentage of a DNA sequence"این متن برای مستندسازی تابع استفاده میشود.
با دستور:
help(GC)میتوان توضیحات تابع را مشاهده کرد.
برای برگرداندن نتیجه محاسبه تابع استفاده میشود.
ساختار:
return valueمثال:
return GC_percentپس از اجرای تابع، مقدار خروجی به برنامه اصلی برمیگردد.
ایجاد تابعی که درصد بازهای:
- G
- C
را در یک توالی DNA محاسبه کند.
def GC(DNA):ورودی:
DNAیک رشته شامل توالی DNA است.
اگر DNA شامل:
N
باشد، نمیتوان آن را در محاسبه وارد کرد.
پس تعداد آنها را ذخیره میکنیم:
nbases = DNA.count("N")فرمول:
[ GC% = \frac{G+C}{Total\ Bases} \times 100 ]
اما تعداد بازهای نامشخص حذف میشود:
[ GC% = \frac{G+C}{Length(DNA)-N} \times100 ]
نتیجه در متغیری مانند:
GC_percentذخیره شده و با:
return GC_percentبرگردانده میشود.
پس از تعریف تابع، میتوان آن را اجرا کرد.
مثال:
GC("ATGCGCTA")تابع:
- توالی را دریافت میکند.
- درصد GC را محاسبه میکند.
- مقدار خروجی را برمیگرداند.
Scope مشخص میکند یک متغیر در کدام بخش برنامه قابل مشاهده و استفاده است.
دو نوع اصلی دارد:
- Global Scope
- Local Scope
متغیری که خارج از تمام توابع تعریف میشود.
مثال:
dna = "ATGC"این متغیر در بخشهای مختلف برنامه قابل دسترسی است.
متغیری که داخل یک تابع تعریف میشود.
مثال:
def GC(DNA):
nbases = 3در اینجا:
nbases
فقط داخل تابع GC وجود دارد.
پس از پایان اجرای تابع، برنامه اصلی نمیتواند به متغیر محلی دسترسی داشته باشد.
مثلاً:
print(nbases)باعث خطا میشود زیرا:
nbases
در خارج از تابع شناختهشده نیست.
- توابع برای کاهش تکرار کد و افزایش خوانایی برنامه استفاده میشوند.
- هر تابع بهتر است یک وظیفه مشخص انجام دهد.
- تعریف تابع با
defانجام میشود. - بدنه تابع باید دارای indentation باشد.
returnمقدار خروجی تابع را مشخص میکند.- رشته توضیحی ابتدای تابع برای مستندسازی استفاده میشود.
- متغیرهای داخل تابع معمولاً Local هستند.
- متغیرهای خارج از تابع Global هستند.
- یک متغیر محلی فقط در محدوده تابع خودش قابل استفاده است.
- در پروژههای Bioinformatics، توابع برای تحلیلهای تکراری روی توالیها بسیار مهم هستند.
| اصطلاح انگلیسی | ترجمه فارسی | توضیح |
|---|---|---|
| Function | تابع | بخش مستقل برنامه که ورودی گرفته و خروجی تولید میکند |
| Argument | آرگومان / ورودی تابع | مقداری که هنگام فراخوانی به تابع داده میشود |
| Input | ورودی | دادهای که تابع دریافت میکند |
| Output | خروجی | نتیجهای که تابع برمیگرداند |
| Built-in Function | تابع داخلی | تابع آماده موجود در Python |
| User Defined Function | تابع تعریفشده توسط کاربر | تابعی که برنامهنویس ایجاد میکند |
| Definition | تعریف تابع | ایجاد ساختار تابع با def |
| Return Statement | دستور بازگشت | برگرداندن نتیجه تابع |
| Documentation String | رشته مستندسازی | توضیح عملکرد تابع |
| Scope | دامنه دسترسی | محدودهای که متغیر قابل استفاده است |
| Global Variable | متغیر سراسری | متغیری قابل دسترسی در کل برنامه |
| Local Variable | متغیر محلی | متغیری محدود به یک تابع |
تابع مانند یک دستگاه است:
ورودی:
دو عدد
عملیات:
جمع کردن
خروجی:
نتیجه جمع
در Bioinformatics نیز:
ورودی:
DNA sequence
عملیات:
محاسبه تعداد G و C
خروجی:
GC percentage
فرض کنید چند هزار توالی DNA داریم.
بدون تابع:
برای هر توالی باید دوباره کد محاسبه GC را بنویسیم.
با تابع:
GC(sequence1)
GC(sequence2)
GC(sequence3)همان کد برای همه توالیها استفاده میشود.
- تابع مجموعهای از دستورات است که یک کار مشخص انجام میدهد.
- توابع باعث کاهش تکرار کد و افزایش خوانایی میشوند.
- توابع داخلی مانند
print()وlen()از قبل در Python وجود دارند. - توابع جدید با
defساخته میشوند. - ورودیهای تابع در قالب argument دریافت میشوند.
- خروجی تابع با
returnمشخص میشود. - اولین خط تابع میتواند توضیح مستندسازی باشد.
- Scope تعیین میکند متغیر در کدام بخش برنامه قابل استفاده است.
- Global Variable خارج از تابع تعریف میشود.
- Local Variable فقط داخل همان تابع قابل مشاهده است.
- در تحلیل زیستی، توابع برای عملیات تکراری روی DNA و پروتئین بسیار کاربردی هستند.
چرا استفاده از توابع در برنامهنویسی مفید است؟
پاسخ: زیرا باعث استفاده مجدد از کد، کاهش خطا، افزایش خوانایی و سادهتر شدن ساختار برنامه میشود.
تابع چیست؟
پاسخ: تابع بخشی از برنامه است که ورودی دریافت میکند، عملیات مشخصی انجام میدهد و یک خروجی تولید میکند.
اگر بخواهیم درصد GC یک DNA را چندین بار محاسبه کنیم، بهترین روش چیست؟
پاسخ:
ایجاد یک تابع مانند GC(DNA) و فراخوانی آن برای هر توالی.
تفاوت Global و Local Variable چیست؟
پاسخ:
- Global Variable در کل برنامه قابل دسترسی است.
- Local Variable فقط داخل تابعی که در آن تعریف شده قابل استفاده است.
چرا متغیر nbases در تابع GC خارج از تابع قابل استفاده نیست؟
پاسخ: زیرا داخل تابع تعریف شده و Scope آن محلی است. خارج از تابع، Python آن متغیر را نمیشناسد.
در این درس مفهوم Function (تابع) در پایتون ادامه داده میشود و با نوع خاصی از توابع به نام Boolean Functions (توابع بولی) آشنا میشویم. این توابع به جای بازگرداندن مقدارهای پیچیده، فقط یکی از دو مقدار True یا False را برمیگردانند و معمولاً برای تصمیمگیری در ساختارهای شرطی مانند if استفاده میشوند.
در ادامه، یک مثال زیستی واقعی بررسی میشود: طراحی تابعی برای تشخیص وجود In-frame Stop Codon در یک توالی DNA. همچنین مفهوم مهم Default Parameter (پارامتر پیشفرض) معرفی میشود که به تابع اجازه میدهد در صورت عدم دریافت یک ورودی، از مقدار مشخصی استفاده کند.
- درک مفهوم توابع بولی در پایتون
- یادگیری طراحی توابع برای مسائل زیستی مانند تحلیل DNA
- آشنایی با نحوه پیمایش توالی DNA در قالب Codon
- استفاده از پارامترهای پیشفرض در توابع
تابعی است که خروجی آن فقط یکی از دو مقدار منطقی زیر است:
True(درست)False(نادرست)
در برنامهنویسی همیشه لازم نیست یک تابع عدد، رشته یا داده پیچیده برگرداند. گاهی فقط میخواهیم بدانیم یک شرط برقرار است یا خیر.
مثلاً:
- آیا یک توالی DNA دارای Codon توقف است؟
- آیا یک رشته شامل یک الگوی خاص است؟
- آیا یک داده معتبر است؟
در این موارد از تابع بولی استفاده میکنیم.
ساختار استفاده:
if boolean_function(data):
do somethingتابع بررسی میکند و اگر نتیجه True باشد، کد داخل شرط اجرا میشود.
در Bioinformatics بسیاری از توابع برای پاسخ به سوالات بله/خیر استفاده میشوند:
- آیا توالی DNA دارای Mutation خاصی است؟
- آیا یک توالی شامل Motif مشخصی است؟
- آیا پروتئین دارای ویژگی خاصی است؟
Stop Codon یک توالی سه نوکلئوتیدی در DNA یا RNA است که پایان ترجمه پروتئین را مشخص میکند.
در ترجمه DNA به پروتئین:
- توالی DNA به گروههای سهتایی تقسیم میشود.
- هر گروه سهتایی یک Codon (کدون) نام دارد.
- هر Codon معمولاً یک آمینواسید را مشخص میکند.
اما سه Codon ویژه وجود دارند که به جای آمینواسید، پایان ترجمه را اعلام میکنند:
| Stop Codon |
|---|
| TGA |
| TAG |
| TAA |
Reading Frame مشخص میکند تقسیم توالی DNA به Codonها از کدام موقعیت شروع شود.
چون هر Codon سه باز دارد، یک توالی DNA میتواند سه حالت خوانش داشته باشد:
- Frame 0 → شروع از باز اول
- Frame 1 → شروع از باز دوم
- Frame 2 → شروع از باز سوم
مثال:
DNA:
AAATGA
Frame 0:
AAA | TGA
Frame 1:
AAT | GA...
Frame 2:
ATG | A...
یک Stop Codon ممکن است در یک Reading Frame وجود داشته باشد ولی در Frame دیگر دیده نشود.
در تحلیل ژنها، پیدا کردن Codon توقف باید در چارچوب خوانش صحیح انجام شود؛ زیرا یک تغییر در نقطه شروع باعث تغییر تمام Codonهای بعدی میشود.
هدف: بررسی اینکه آیا یک توالی DNA دارای Stop Codon در یک Reading Frame مشخص است یا خیر.
ساختار کلی تابع:
def has_stop_codon(dna):ورودی:
dna→ توالی DNA
خروجی:
True→ اگر Stop Codon پیدا شودFalse→ اگر پیدا نشود
ابتدا فرض میکنیم Stop Codon وجود ندارد:
stop_codon_found = Falseبا حلقه for سه باز سه باز حرکت میکنیم:
for i in range(0, len(dna), 3):یعنی:
- شروع از موقعیت صفر
- پایان تا انتهای DNA
- افزایش سهتایی
سه باز متوالی استخراج میشوند:
codon = dna[i:i+3]مثلاً:
ATGCGTAA
به شکل زیر بررسی میشود:
ATG
CGT
AA
Codon بررسی شده با لیست Stop Codonها مقایسه میشود:
if codon in stop_codons:اگر پیدا شود:
stop_codon_found = True
breakو تابع متوقف میشود.
پارامتری است که اگر کاربر هنگام فراخوانی تابع مقدار آن را وارد نکند، مقدار مشخصی به صورت خودکار دریافت میکند.
بدون مقدار پیشفرض:
def has_stop_codon(dna, frame):کاربر مجبور است بنویسد:
has_stop_codon(dna, 0)با مقدار پیشفرض:
def has_stop_codon(dna, frame=0):اکنون:
has_stop_codon(dna)معادل است با:
has_stop_codon(dna, 0)پارامترهای پیشفرض باعث میشوند:
- استفاده از تابع سادهتر شود.
- رفتار استاندارد برای تابع تعریف شود.
- در صورت نیاز بتوان مقدار را تغییر داد.
- تابع بولی معمولاً برای استفاده در شرطهای
ifطراحی میشود. - Stop Codonها شامل سه توالی
TGA,TAG,TAAهستند. - برای پیدا کردن Stop Codon باید Reading Frame صحیح را در نظر گرفت.
- حرکت در DNA برای پیدا کردن Codonها معمولاً با گام ۳ انجام میشود.
- استفاده از
breakباعث توقف فوری حلقه پس از پیدا کردن نتیجه موردنظر میشود. - در مقایسه DNA بهتر است حروف کوچک و بزرگ یکسانسازی شوند:
مثلاً:
dna.lower()- پارامترهای پیشفرض باید هنگام تعریف تابع مشخص شوند.
- وجود یک Stop Codon در یک Frame الزاماً به معنی وجود آن در Frameهای دیگر نیست.
فرض کنید توالی DNA زیر را داریم:
AAATGACCC
اگر از Frame 0 شروع کنیم:
AAA | TGA | CCC
Codon:
TGA
یک Stop Codon است، بنابراین تابع مقدار:
True
برمیگرداند.
اما اگر از Frame 1 شروع کنیم:
AAT | GAC | CC
دیگر Stop Codon وجود ندارد و نتیجه:
False
خواهد بود.
Reading Frame مانند خواندن یک جمله با فاصلههای سهتایی است.
مثلاً:
THE CAT ATE
اگر گروهبندی را از ابتدای جمله شروع کنیم:
THE | CAT | ATE
معنی مشخصی دارد.
اما اگر یک حرف جلوتر شروع کنیم:
HEC | ATA | TE...
گروهبندی کاملاً تغییر میکند.
در DNA نیز تغییر نقطه شروع باعث تغییر Codonها میشود.
| اصطلاح انگلیسی | ترجمه فارسی | توضیح |
|---|---|---|
| Function | تابع | قطعهای از کد که ورودی دریافت کرده و خروجی تولید میکند |
| Boolean Function | تابع بولی | تابعی که فقط True یا False برمیگرداند |
| Boolean Value | مقدار منطقی | یکی از دو مقدار True یا False |
| Stop Codon | کدون توقف | توالی سهنوکلئوتیدی که پایان ترجمه را مشخص میکند |
| Codon | کدون | گروه سهتایی نوکلئوتیدها در DNA/RNA |
| Reading Frame | چارچوب خوانش | نقطه شروع تقسیم DNA به Codonها |
| Default Parameter | پارامتر پیشفرض | مقداری که در صورت نبود ورودی استفاده میشود |
| Argument | آرگومان | مقداری که هنگام فراخوانی تابع به آن داده میشود |
| Break | توقف حلقه | دستور خروج فوری از حلقه |
| Lower Method | متد تبدیل به حروف کوچک | تبدیل رشته به حروف کوچک برای مقایسه آسانتر |
- تابع میتواند هر نوع دادهای را برگرداند، اما گاهی فقط به پاسخ True/False نیاز داریم.
- Boolean Function برای بررسی شرایط منطقی استفاده میشود.
- Stop Codonها سه توالی
TGA،TAGوTAAهستند. - DNA هنگام ترجمه به Codonهای سهتایی تقسیم میشود.
- سه Reading Frame مختلف برای هر توالی DNA وجود دارد.
- وجود Stop Codon وابسته به Reading Frame است.
- در تابع
has_stop_codonابتدا مقدار پیشفرض False قرار داده میشود. - حلقه
forبا گام ۳ برای بررسی Codonها استفاده میشود. - دستور
breakپس از یافتن نتیجه موردنظر حلقه را متوقف میکند. - Default Parameter باعث میشود تابع بدون وارد کردن همه آرگومانها قابل استفاده باشد.
پاسخ: تابعی است که خروجی آن فقط یکی از دو مقدار منطقی True یا False است و معمولاً برای بررسی شرایط استفاده میشود.
پاسخ: زیرا DNA میتواند از سه نقطه مختلف به Codonهای سهتایی تقسیم شود و یک Stop Codon ممکن است فقط در یکی از این چارچوبها وجود داشته باشد.
پاسخ:
- TGA
- TAG
- TAA
پاسخ: زیرا هدف فقط تشخیص وجود یا عدم وجود Stop Codon است و پس از یافتن اولین مورد، ادامه بررسی ضرورتی ندارد.
پاسخ: باعث میشود تابع در حالت معمول بدون وارد کردن مقدار اضافی قابل استفاده باشد، اما همچنان امکان تغییر مقدار در صورت نیاز وجود داشته باشد.
در این بخش، مفاهیم پیشرفتهتر Functions در Python بررسی میشوند. پس از یادگیری ساختار اولیه توابع، در این درس با نحوه ارسال آرگومانها، ایجاد توابع کاربردی در تحلیل توالیهای DNA، مدیریت مقادیر پیشفرض، کار با رشتهها (Strings)، ساخت Reverse Complement و استفاده از تکنیکهایی مانند List Comprehension و آرگومانهای متغیر آشنا میشویم.
هدف اصلی این درس:
- یادگیری روشهای مختلف ارسال ورودی به توابع
- طراحی توابع کاربردی برای مسائل Bioinformatics
- درک نحوه پردازش توالیهای DNA با Python
- آشنایی با ابزارهای قدرتمند پردازش رشتهها و لیستها
هنگام فراخوانی یک تابع، مقادیری که به آن ارسال میکنیم Arguments نام دارند. Python دو روش اصلی برای ارسال آرگومانها دارد:
- ارسال بر اساس موقعیت (Positional Arguments)
- ارسال بر اساس نام (Keyword Arguments)
در این روش، مقدار آرگومانها بر اساس ترتیب قرار گرفتن آنها در تعریف تابع مشخص میشود.
مثال:
has_stop_codon(seq, 1)اگر تابع به شکل زیر تعریف شده باشد:
def has_stop_codon(dna, frame):Python تشخیص میدهد:
seq→ مربوط بهdna1→ مربوط بهframe
این روش رایجترین و سادهترین روش فراخوانی توابع است.
در این روش هنگام فراخوانی تابع، نام متغیرهای ورودی را مشخص میکنیم.
مثال:
has_stop_codon(frame=0, dna=seq)در این حالت ترتیب آرگومانها مهم نیست.
Python بر اساس نام متغیرها مقداردهی میکند.
برای استفاده از این روش باید نام دقیق پارامترهای تابع را بدانیم.
مثلاً:
def has_stop_codon(dna, frame):در اینجا باید از نامهای:
dnaframe
استفاده کنیم.
DNA دو رشتهای است و دو رشته آن مکمل یکدیگر هستند.
قواعد مکمل بودن:
| Base | Complement |
|---|---|
| A | T |
| T | A |
| C | G |
| G | C |
اما علاوه بر مکمل شدن، جهت رشته DNA نیز اهمیت دارد.
بنابراین برای تبدیل یک رشته DNA به رشته مقابل، باید:
- رشته را برعکس کنیم (Reverse)
- بازهای آن را مکمل کنیم (Complement)
این عملیات را:
Reverse Complement
مینامیم.
در تحلیل ژنومی، معمولاً مشخص نیست یک الگوی DNA روی کدام رشته قرار دارد.
بنابراین باید:
- رشته اصلی را بررسی کنیم.
- Reverse Complement آن را نیز بررسی کنیم.
این عملیات در:
- Genome Analysis
- Sequence Alignment
- Motif Searching
بسیار کاربرد دارد.
در Python میتوان بخشهایی از یک رشته را با استفاده از Index استخراج کرد.
ساختار:
string[start:end]مثال:
dna[0:3]نتیجه:
سه کاراکتر اول رشته:
position 0,1,2
نکته:
Index پایان (end) شامل نمیشود.
ساختار کامل:
string[start:end:step]مثال:
dna[0:3:2]یعنی:
- شروع از index صفر
- پایان قبل از index سه
- حرکت با گام دو
نتیجه:
فقط کاراکترهای یکی در میان انتخاب میشوند.
یک تکنیک بسیار مهم:
seq[::-1]معنی:
- کل رشته را انتخاب کن.
- با گام منفی یک حرکت کن.
نتیجه:
رشته کاملاً برعکس میشود.
مثال:
ATGCتبدیل میشود به:
CGTAبرای ایجاد مکمل DNA معمولاً از یک Dictionary استفاده میکنیم.
مثال:
basecomplement = {
'A':'T',
'T':'A',
'C':'G',
'G':'C'
}Dictionary مشخص میکند هر باز به چه باز مکملی تبدیل شود.
همچنین باید حالتهای:
- حروف بزرگ
- حروف کوچک
- کاراکتر N
پشتیبانی شوند.
List Comprehension روشی کوتاه برای ساخت لیست جدید از روی یک لیست یا رشته موجود است.
ساختار کلی:
new_list = [operation(item) for item in old_list]ابتدا رشته DNA را به لیست تبدیل میکنیم:
letters = list(DNA)مثلاً:
"ATGC"
تبدیل میشود به:
['A','T','G','C']سپس:
letters = [basecomplement[base] for base in letters]برای هر باز:
- مکمل آن پیدا میشود.
- لیست جدید ساخته میشود.
یک رشته را به لیستی از بخشها تقسیم میکند.
مثال:
sentence.split()نتیجه:
"DNA analysis is useful"
تبدیل میشود به:
["DNA","analysis","is","useful"]مثال:
sentence.split("and")رشته را بر اساس کلمه and جدا میکند.
برعکس Split عمل میکند.
یک لیست را به یک رشته تبدیل میکند.
مثال:
"".join(letters)تمام عناصر لیست را بدون فاصله به هم متصل میکند.
مثلاً:
['A','T','G','C']تبدیل میشود به:
ATGC
گاهی نمیدانیم یک تابع چند ورودی دریافت خواهد کرد.
Python اجازه میدهد تعداد متغیری از آرگومانها تعریف کنیم.
با استفاده از:
*argsمثال:
def newfunction(first, second, third, *rest):اگر فراخوانی کنیم:
newfunction(1,2,3,4,5)نتیجه:
| پارامتر | مقدار |
|---|---|
| first | 1 |
| second | 2 |
| third | 3 |
| rest | [4,5] |
-
آرگومانهای موقعیتی بر اساس ترتیب ارسال میشوند.
-
آرگومانهای نامگذاریشده با نام متغیرها مشخص میشوند.
-
DNA دارای دو رشته مکمل است؛ بنابراین بررسی هر دو رشته اهمیت دارد.
-
Reverse Complement شامل دو مرحله است:
- Reverse کردن رشته
- Complement کردن بازها
-
در Python،
[::-1]سریعترین روش معکوس کردن رشته است. -
Dictionary ابزار مناسبی برای تبدیل بازهای DNA به مکمل آنهاست.
-
split()رشته را به لیست تبدیل میکند. -
join()لیست را دوباره به رشته تبدیل میکند. -
*argsبرای دریافت تعداد نامحدودی ورودی استفاده میشود.
| اصطلاح انگلیسی | ترجمه فارسی | توضیح |
|---|---|---|
| Function Argument | آرگومان تابع | مقداری که هنگام فراخوانی به تابع داده میشود |
| Positional Argument | آرگومان موقعیتی | مقداردهی بر اساس ترتیب پارامترها |
| Keyword Argument | آرگومان نامگذاریشده | مقداردهی با نام پارامتر |
| Reverse Complement | مکمل معکوس | رشته DNA معکوسشده و سپس مکملشده |
| Complement | مکمل | باز جفتشده DNA بر اساس قوانین A-T و C-G |
| DNA Strand | رشته DNA | یکی از دو رشته مکمل DNA |
| Slicing | برش رشته | استخراج بخشهایی از رشته با index |
| Step | گام حرکت | فاصله بین انتخاب عناصر در slicing |
| Dictionary | فرهنگ داده | ساختار داده کلیدی-مقداری |
| List Comprehension | ساخت سریع لیست | روش کوتاه ایجاد لیست جدید |
| Split | تقسیم رشته | تبدیل رشته به لیست |
| Join | اتصال رشتهها | تبدیل لیست به رشته |
| Variable Arguments | آرگومانهای متغیر | دریافت تعداد دلخواه ورودی |
فرض کنید رشته DNA زیر را داریم:
CCGGAA
ابتدا آن را برعکس میکنیم:
AAGGCC
سپس مکمل میگیریم:
TTCCGG
نتیجه، Reverse Complement رشته اولیه است.
برای پیدا کردن Stop Codon باید هر سه نوکلئوتید را بررسی کنیم.
مثلاً:
AAATGA
اگر از موقعیت صفر شروع کنیم:
AAA
TGA
TGA یک Stop Codon است.
اما اگر از موقعیت یک شروع کنیم:
AAT
چارچوب خواندن متفاوت خواهد بود.
- توابع میتوانند آرگومانها را به دو روش موقعیتی و نامگذاریشده دریافت کنند.
- Keyword Argument ترتیب آرگومانها را حذف میکند.
- DNA دارای دو رشته مکمل است و برای بررسی هر دو رشته از Reverse Complement استفاده میشود.
- Reverse Complement ابتدا رشته را معکوس و سپس مکمل میکند.
- در Python،
seq[::-1]رشته را معکوس میکند. - Dictionary برای نگاشت بازهای DNA به مکمل آنها استفاده میشود.
- List Comprehension روش سریع ساخت لیست جدید است.
split()رشته را به لیست وjoin()لیست را به رشته تبدیل میکند.*argsامکان دریافت تعداد نامحدود آرگومان را فراهم میکند.- تکنیکهای پردازش رشته در تحلیل دادههای ژنومی بسیار پرکاربرد هستند.
پاسخ:
در Positional Argument ترتیب ارسال اهمیت دارد، اما در Keyword Argument مقدار با نام پارامتر مشخص میشود و ترتیب اهمیتی ندارد.
پاسخ:
تبدیل یک رشته DNA به رشته مکمل در جهت مخالف است که شامل معکوس کردن رشته و سپس جایگزینی هر باز با باز مکمل آن است.
پاسخ:
زیرا یک الگوی DNA ممکن است روی هر کدام از دو رشته DNA قرار داشته باشد و باید هر دو جهت بررسی شوند.
پاسخ:
رشته seq را از انتها به ابتدا میخواند و نسخه معکوس آن را ایجاد میکند.
پاسخ:
split() یک رشته را به لیست تبدیل میکند، در حالی که join() عناصر یک لیست را به یک رشته تبدیل میکند.
پاسخ:
برای تعریف توابعی که بتوانند تعداد متغیری از آرگومانها را دریافت کنند استفاده میشود.
در این درس با مفهوم Module و Package در Python آشنا میشویم. این دو مفهوم برای سازماندهی، استفاده مجدد و مدیریت بهتر کدها در پروژههای بزرگ ضروری هستند.
در برنامهنویسی، معمولاً توابعی که بارها استفاده میشوند نباید در هر برنامه دوباره نوشته شوند. Python با استفاده از Modules امکان ذخیرهسازی توابع و متغیرها در فایلهای جداگانه را فراهم میکند. همچنین با استفاده از Packages میتوان چندین Module مرتبط را در قالب یک مجموعه بزرگتر سازماندهی کرد.
هدف یادگیری این بخش:
- درک مفهوم Module و دلیل استفاده از آن
- ایجاد و استفاده از Moduleهای شخصی
- آشنایی با مسیر جستجوی Python برای پیدا کردن Moduleها
- یادگیری مفهوم Package و ساختار آن
- درک نحوه استفاده از Packageهای علمی مانند BioPython
Module یک فایل Python با پسوند .py است که شامل:
- توابع (Functions)
- متغیرها (Variables)
- کدهای مرتبط
میباشد.
به زبان ساده، Module یک فایل حاوی مجموعهای از کدهای مرتبط است که میتوان آن را در برنامههای مختلف استفاده کرد.
وقتی Python Interpreter بسته شود، تمام:
- تعریف توابع
- متغیرهای ایجادشده
از بین میروند.
برای جلوگیری از این مشکل، میتوان کدهای مهم را داخل یک فایل Python ذخیره کرد.
مثلاً:
dnautil.py
میتواند شامل توابع پردازش DNA باشد:
gc(dna)
has_stop_codon(dna, frame)
reverse_complement(seq)بعداً هر برنامهای میتواند این Module را وارد (Import) کرده و از توابع آن استفاده کند.
استفاده از Module باعث میشود:
- کدها دوباره نوشته نشوند.
- برنامهها خواناتر شوند.
- پروژهها بهتر سازماندهی شوند.
- توابع کاربردی بین چند برنامه به اشتراک گذاشته شوند.
برای ایجاد Module کافی است یک فایل با پسوند .py بسازیم.
مثال:
dnautil.py
در ابتدای فایل میتوان یک توضیح برای Module قرار داد:
"""
Useful functions for DNA sequence analysis
"""سپس توابع مورد نیاز را داخل آن قرار میدهیم:
def gc(dna):
...
def has_stop_codon(dna, frame):
...برای استفاده از یک Module در Python از دستور:
importاستفاده میکنیم.
مثال:
import dnautilنکته:
نیازی به نوشتن پسوند .py نیست.
درست:
import dnautilغلط:
import dnautil.pyوقتی Python یک Module را Import میکند، باید بداند فایل آن کجاست.
Python در چند مسیر به دنبال Module میگردد:
- مسیر فعلی برنامه (Current Directory)
- مسیر نصب Python
- مسیرهای تعریفشده در متغیر محیطی:
PYTHONPATH
Python ماژولی به نام:
sys
دارد که اطلاعات مسیرهای جستجو را نگهداری میکند.
مثال:
import sys
sys.pathخروجی، لیستی از مسیرهایی است که Python در آنها Module جستجو میکند.
اگر فایل Module در مسیر دیگری باشد، میتوان آن مسیر را اضافه کرد:
sys.path.append("/path/to/module")مثلاً:
sys.path.append("/users/python")پس Python میتواند Module موجود در آن مسیر را پیدا کند.
پس از Import کردن Module، برای استفاده از توابع آن باید نام Module را نیز ذکر کنیم.
مثال:
dnautil.gc(dna)زیرا Python باید بداند تابع gc متعلق به کدام Module است.
روش دیگر:
from dnautil import *این دستور تمام توابع Module را وارد میکند.
بعد از آن میتوان مستقیم نوشت:
gc(dna)به جای وارد کردن همه توابع میتوان فقط موارد مورد نیاز را وارد کرد:
from dnautil import gc, has_stop_codonدر این حالت فقط این دو تابع قابل استفاده هستند.
| روش | نحوه استفاده |
|---|---|
| import module | module.function() |
| from module import * | function() |
| from module import function | function() |
Package مجموعهای از Moduleهای مرتبط است که در یک پوشه قرار گرفتهاند.
به عبارت دیگر:
Package = مجموعهای از Moduleها
هر Package باید یک فایل خاص داشته باشد:
__init__.py
این فایل به Python اعلام میکند که این پوشه یک Package است.
این فایل حتی میتواند خالی باشد.
فرض کنید میخواهیم یک Package برای تحلیل توالیهای زیستی بسازیم:
bioseq/
│
├── __init__.py
│
├── dnautil.py
├── rnautil.py
└── proteinutil.py
این Package شامل:
- ابزارهای DNA
- ابزارهای RNA
- ابزارهای Protein
است.
Packageها میتوانند شامل Packageهای کوچکتر نیز باشند.
مثلاً:
bioseq/
│
├── fasta/
│ ├── __init__.py
│ └── fastautil.py
│
└── fastq/
├── __init__.py
└── fastqutil.py
در این ساختار:
bioseq→ Package اصلیfastaوfastq→ Subpackage
هستند.
برای استفاده از Module داخل Package چند روش وجود دارد.
import bioseq.dnautilبرای استفاده:
bioseq.dnautil.gc(dna)from bioseq import dnautilاکنون:
dnautil.gc(dna)کافی است.
مثال:
from bioseq.fasta.fastautil import fastaseqreadاکنون:
fastaseqread()مستقیماً قابل استفاده است.
در پروژههای زیستی، تعداد زیادی عملیات تکراری وجود دارد:
- پردازش DNA
- تحلیل RNA
- بررسی Protein
- خواندن فایلهای FASTA و FASTQ
بنابراین کتابخانههایی مانند:
Biopython
به شکل Package طراحی شدهاند.
برای استفاده از آنها باید:
- Package را نصب کنیم.
- Moduleهای مورد نیاز را Import کنیم.
- Module یک فایل
.pyشامل کدهای مرتبط است. - Package مجموعهای از Moduleها است.
- فایل
__init__.pyمشخص میکند که یک پوشه Package است. - Python برای یافتن Moduleها از
sys.pathاستفاده میکند. - اگر مسیر Module در
sys.pathنباشد، Import با خطا مواجه میشود. - استفاده از Module باعث جلوگیری از تکرار کدنویسی میشود.
- استفاده از
from module import *راحت است اما ممکن است باعث تداخل نامها شود. - در پروژههای بزرگ بهتر است از نام Module هنگام فراخوانی استفاده شود.
- کتابخانههای تخصصی مانند Biopython بر اساس همین ساختار Module و Package ساخته شدهاند.
| اصطلاح انگلیسی | ترجمه فارسی | توضیح |
|---|---|---|
| Module | ماژول | فایل Python شامل توابع و متغیرها |
| Package | پکیج | مجموعهای از Moduleهای مرتبط |
| Import | وارد کردن | اضافه کردن یک Module به برنامه |
| Function Definition | تعریف تابع | ایجاد یک تابع قابل استفاده |
| PYTHONPATH | مسیر Python | متغیر محیطی برای مسیر Moduleها |
| sys.path | مسیرهای جستجوی Python | لیستی از مسیرهایی که Python بررسی میکند |
| Current Directory | پوشه فعلی | محلی که برنامه از آن اجرا میشود |
| init.py | فایل معرفی Package | فایل مشخصکننده یک Package |
| Submodule | زیرماژول | Module داخل یک Package |
| Subpackage | زیرپکیج | Package داخل یک Package دیگر |
| Biopython | کتابخانه زیستی Python | مجموعه ابزارهای تحلیل دادههای زیستی |
یک Module مانند یک جعبه ابزار است.
مثلاً:
dnautil.py
یک جعبه ابزار مخصوص DNA است که ابزارهایی مانند:
- محاسبه GC Content
- بررسی Stop Codon
- Reverse Complement
را در خود دارد.
هر برنامهای که به این ابزارها نیاز داشته باشد، فقط این جعبه را وارد میکند.
Package مانند یک کیف بزرگ ابزار است.
مثلاً:
bioseq
یک کیف شامل:
- ابزار DNA
- ابزار RNA
- ابزار Protein
است.
- Module در Python یک فایل
.pyشامل توابع و متغیرها است. - هدف اصلی Module جلوگیری از تکرار کد و افزایش قابلیت استفاده مجدد است.
- با دستور
importمیتوان Moduleها را وارد کرد. - Python برای یافتن Moduleها مسیرهای موجود در
sys.pathرا بررسی میکند. sys.path.append()مسیر جدیدی به جستجو اضافه میکند.- برای استفاده از تابع یک Module میتوان از
module.function()استفاده کرد. from module import *تمام توابع را وارد میکند.- Package مجموعهای از Moduleهای مرتبط است.
- وجود فایل
__init__.pyباعث شناسایی یک پوشه به عنوان Package میشود. - کتابخانههای بزرگی مانند Biopython بر پایه ساختار Package و Module ساخته شدهاند.
پاسخ:
یک فایل Python با پسوند .py است که شامل تعریف توابع، متغیرها یا کدهای مرتبط میباشد.
پاسخ:
برای جلوگیری از تکرار کد، سازماندهی بهتر برنامه و استفاده مجدد از توابع در پروژههای مختلف.
پاسخ:
Module یک فایل Python است، اما Package مجموعهای از Moduleها در یک پوشه سازماندهیشده است.
پاسخ:
به Python اعلام میکند که یک پوشه باید به عنوان Package شناخته شود.
پاسخ:
باید مسیر قرارگیری Module را به sys.path یا PYTHONPATH اضافه کرد.
import dnautilو
from dnautil import *پاسخ:
در حالت اول باید هنگام استفاده نام Module نوشته شود:
dnautil.gc(dna)اما در حالت دوم توابع مستقیماً قابل استفاده هستند:
gc(dna)پاسخ:
زیرا تحلیل دادههای زیستی شامل تعداد زیادی ابزار و عملیات مختلف است و Packageها امکان سازماندهی و استفاده آسان از این ابزارها را فراهم میکنند.
در این درس با روش خواندن و نوشتن دادهها در فایلها (File I/O) در Python آشنا میشویم. در پروژههای Genomic Data Science معمولاً حجم دادهها بسیار بزرگ است و وارد کردن دستی دادهها از طریق ترمینال امکانپذیر نیست؛ بنابراین برنامهها باید دادهها را از فایلها دریافت و پردازش کنند.
هدف این بخش:
- یادگیری باز کردن فایلها در Python
- خواندن اطلاعات از فایل
- نوشتن و اضافه کردن اطلاعات به فایل
- مدیریت خطا هنگام کار با فایلها
- بستن صحیح فایلها پس از پایان کار
File Input/Output به عملیات خواندن داده از فایلها و نوشتن داده در فایلها گفته میشود.
در تحلیل دادههای زیستی، دادهها معمولاً در فایلهایی مانند:
- FASTA
- FASTQ
- CSV
- TXT
ذخیره میشوند. به جای اینکه کاربر دادهها را هنگام اجرای برنامه وارد کند، برنامه فایل را باز کرده و دادهها را پردازش میکند.
فرآیند کلی کار با فایل:
- باز کردن فایل (open)
- انجام عملیات روی فایل (خواندن یا نوشتن)
- بستن فایل (close)
تقریباً تمام پروژههای واقعی تحلیل داده، مخصوصاً در زیستمحاسبات، به کار با فایلها نیاز دارند.
تابع open() برای ایجاد ارتباط بین Python و یک فایل استفاده میشود.
ساختار کلی:
file_object = open(filename, mode)مثال:
f = open("myfile")برای خواندن اطلاعات از فایل استفاده میشود.
مثال:
f = open("myfile", "r")نکته:
- حالت
rحالت پیشفرض است. - بنابراین میتوان نوشت:
f = open("myfile")برای نوشتن داده در فایل استفاده میشود.
مثال:
f = open("myfile", "w")ویژگی مهم:
- اگر فایل از قبل وجود داشته باشد، محتوای قبلی حذف میشود.
- فایل جدید با محتوای جدید ساخته میشود.
بنابراین باید با احتیاط استفاده شود.
برای اضافه کردن اطلاعات جدید به انتهای فایل استفاده میشود.
مثال:
f = open("myfile", "a")تفاوت با w:
| حالت | رفتار |
|---|---|
w |
حذف محتوای قبلی و نوشتن از ابتدا |
a |
حفظ محتوای قبلی و اضافه کردن به انتها |
اگر فایلی وجود نداشته باشد:
f = open("unknown_file")Python خطا ایجاد میکند.
برای جلوگیری از توقف برنامه از ساختار:
try:
...
except:
...استفاده میکنیم.
مثال:
try:
f = open("myfile")
except IOError:
print("File does not exist")- Python ابتدا تلاش میکند فایل را باز کند.
- اگر موفق نشود، خطای
IOErrorایجاد میشود. - بخش
exceptاجرا میشود.
به جای اینکه برنامه ناگهانی متوقف شود، میتوان پیام مناسب به کاربر نمایش داد.
فرض کنید فایل شامل دو خط باشد:
This is the first line of the file
Second line of the file
چند روش برای خواندن فایل وجود دارد.
مثال:
for line in f:
print(line)Python فایل را خط به خط پیمایش میکند.
مزایا:
- مناسب برای فایلهای بزرگ
- مصرف حافظه کمتر
در دادههای ژنومی این روش بسیار مهم است، زیرا فایلها ممکن است چندین گیگابایت حجم داشته باشند.
مثال:
f.read()کل محتوای فایل را یکجا میخواند.
مثلاً:
content = f.read()خروجی:
This is the first line of the file
Second line of the file
پس از خواندن فایل، مکان فعلی فایل (File Pointer) به انتهای فایل منتقل میشود.
بنابراین اگر دوباره:
f.read()را اجرا کنیم، چیزی دریافت نمیکنیم.
Python هنگام خواندن فایل، یک مکاننما دارد که مشخص میکند اکنون در کجای فایل قرار داریم.
مثلاً:
Beginning ---------> End
^ ^
0 EOF
پس از خواندن کامل فایل:
Pointer = End of File
برای تغییر مکان فایل استفاده میشود.
مثال:
f.seek(0)یعنی:
بازگشت به ابتدای فایل
بعد از آن:
f.read()دوباره کل فایل را میخواند.
برای خواندن فقط یک خط از فایل استفاده میشود.
مثال:
line = f.readline()خروجی:
This is the first line of the file
زمانی که فایل بسیار بزرگ است و نمیخواهیم کل فایل را وارد حافظه کنیم.
برای نوشتن رشته در فایل استفاده میشود.
مثال:
f.write("This is a third line")نتیجه:
محتوا به فایل اضافه میشود.
ابتدا فایل را باز میکنیم:
f = open("myfile", "a")سپس:
f.write("This is a third line")خط جدید به انتهای فایل اضافه میشود.
پس از پایان کار باید فایل را ببندیم.
مثال:
f.close()بستن فایل:
- منابع سیستم را آزاد میکند.
- از مشکلات دسترسی جلوگیری میکند.
- یک عادت برنامهنویسی صحیح است.
اگر فایل بسته شده باشد:
f.read()باعث خطا خواهد شد.
- در پروژههای زیستمحاسباتی، دادهها معمولاً از فایل خوانده میشوند، نه از ورودی دستی.
- تابع
open()یک File Object ایجاد میکند. - حالت پیشفرض
open()، خواندن (r) است. - حالت
wاطلاعات قبلی فایل را پاک میکند. - حالت
aاطلاعات جدید را به انتهای فایل اضافه میکند. - پس از استفاده از فایل، باید آن را با
close()ببندیم. - برای فایلهای بزرگ ژنومی، خواندن خطبهخط بهتر از خواندن کل فایل با
read()است. seek(0)مکاننمای فایل را به ابتدای فایل برمیگرداند.- مدیریت خطا با
try/exceptباعث جلوگیری از توقف ناگهانی برنامه میشود.
| اصطلاح انگلیسی | ترجمه فارسی | توضیح |
|---|---|---|
| File I/O | ورودی/خروجی فایل | خواندن و نوشتن داده در فایل |
| File Object | شیء فایل | شیئی که Python برای ارتباط با فایل ایجاد میکند |
| open() | باز کردن فایل | تابع ایجاد ارتباط با فایل |
| read mode | حالت خواندن | باز کردن فایل برای دریافت داده |
| write mode | حالت نوشتن | ایجاد یا بازنویسی فایل |
| append mode | حالت اضافه کردن | افزودن داده به انتهای فایل |
| File Pointer | مکاننمای فایل | موقعیت فعلی خواندن یا نوشتن در فایل |
| seek() | تغییر مکان فایل | انتقال مکاننما به موقعیت مشخص |
| readline() | خواندن یک خط | دریافت یک خط از فایل |
| write() | نوشتن | ذخیره رشته در فایل |
| close() | بستن فایل | پایان ارتباط با فایل |
| IOError | خطای ورودی/خروجی | خطایی که هنگام مشکل فایل رخ میدهد |
میتوان فایل را مانند یک کتاب در نظر گرفت.
- باز کردن فایل = باز کردن کتاب
- File Pointer = انگشت شما روی صفحهای که در حال خواندن آن هستید
read()= خواندن صفحات باقیماندهseek(0)= برگشت به صفحه اولclose()= بستن کتاب
فرض کنید یک فایل DNA داریم:
ATGCGTAGCTAA
GGCCTTAGGA
به جای وارد کردن این توالیها به صورت دستی:
dna = input()میتوانیم فایل را باز کنیم:
f = open("sequence.txt")
for line in f:
process(line)و هر خط DNA را پردازش کنیم.
- Python برای کار با دادههای بزرگ از فایلها استفاده میکند.
- عملیات فایل شامل باز کردن، خواندن/نوشتن و بستن فایل است.
- تابع
open()برای ایجاد File Object استفاده میشود. rبرای خواندن،wبرای نوشتن وaبرای اضافه کردن است.- حالت
wمحتوای قبلی فایل را حذف میکند. - حلقه
forروش مناسبی برای خواندن فایلهای بزرگ است. read()کل فایل را میخواند.readline()فقط یک خط را میخواند.seek(0)مکاننمای فایل را به ابتدای فایل برمیگرداند.- استفاده از
try/exceptخطاهای فایل را مدیریت میکند. - همیشه پس از پایان کار فایل را با
close()ببندید.
پاسخ: زیرا حجم دادههای ژنومی بسیار بزرگ است و وارد کردن دستی آنها هنگام اجرای برنامه عملی نیست.
پاسخ:
w فایل را بازنویسی کرده و محتوای قبلی را حذف میکند، اما a داده جدید را به انتهای فایل اضافه میکند.
پاسخ: زیرا File Pointer پس از خواندن کامل فایل به انتهای آن منتقل شده است.
پاسخ:
با استفاده از:
f.seek(0)پاسخ:
خواندن خطبهخط با حلقه for، زیرا کل فایل را همزمان وارد حافظه نمیکند.
در این درس نحوه استفاده از عملیات فایل (File Operations) در پایتون برای خواندن دادههای زیستی آموزش داده میشود. تمرکز اصلی درس بر روی خواندن فایلهای FASTA و تبدیل محتوای آن به یک ساختار دادهای مناسب یعنی Dictionary است.
در تحلیلهای ژنومی، دادهها معمولاً بسیار بزرگتر از آن هستند که به صورت دستی وارد برنامه شوند؛ بنابراین باید از فایلها خوانده شوند. فایل FASTA یکی از رایجترین قالبها برای ذخیره توالیهای DNA است.
در پایان این درس باید بتوانید:
- ساختار فایل FASTA را درک کنید.
- فایلهای FASTA را خطبهخط در پایتون بخوانید.
- خطوط Header و Sequence را تشخیص دهید.
- توالیهای DNA را در یک Dictionary ذخیره کنید.
- یک برنامه ساده برای استخراج توالیها از فایل FASTA طراحی کنید.
FASTA یک قالب استاندارد برای ذخیره توالیهای زیستی مانند DNA، RNA و پروتئین است.
یک فایل FASTA معمولاً شامل یک یا چند توالی است. هر توالی دو بخش اصلی دارد:
-
Header Line (خط عنوان)
- با علامت
>شروع میشود. - شامل شناسه (Identifier) و توضیح مربوط به توالی است.
- با علامت
مثال:
>seq1 human_gene
-
Sequence Lines (خطوط توالی)
- شامل خود توالی DNA است.
- میتواند در یک خط یا چندین خط نوشته شود.
مثال:
ATGCGTACGTAG
یک فایل FASTA میتواند شامل چندین توالی پشت سر هم باشد:
>seq1
ATGCGT
>seq2
AACGTA
FASTA یکی از رایجترین قالبها در:
- تحلیل توالی DNA
- Genome Analysis
- Sequence Alignment
- ابزارهای Bioinformatics
است.
برای استفاده از دادههای ذخیرهشده در فایلها، ابتدا باید فایل را باز کرده، اطلاعات آن را خوانده و در پایان فایل را ببندیم.
فرآیند کار با فایل:
Open → Read/Process → Close
در پایتون از تابع:
open()استفاده میکنیم.
مثال:
f = open("myfile.fa")به صورت پیشفرض فایل در حالت خواندن (Read Mode) باز میشود.
به جای خواندن کل فایل، میتوان فایل را خطبهخط پردازش کرد.
مثال:
for line in f:
print(line)این روش برای فایلهای بزرگ ژنومی بسیار مناسب است، زیرا:
- حافظه کمتری مصرف میکند.
- امکان پردازش فایلهای بسیار بزرگ را فراهم میکند.
در این برنامه، هر شناسه FASTA به عنوان کلید (Key) و توالی DNA مربوط به آن به عنوان مقدار (Value) ذخیره میشود.
ساختار:
seqs = {
"sequence_id": "DNA_sequence"
}مثال:
{
"gene1": "ATGCGTA",
"gene2": "AACCTG"
}Dictionary باعث میشود:
- دسترسی به توالیها سریع باشد.
- هر توالی با شناسه خودش قابل بازیابی باشد.
برای فهمیدن اینکه یک خط Header است یا Sequence، باید اولین کاراکتر خط بررسی شود.
در FASTA:
>
نشانه Header است.
مثال:
if line[0] == ">":یعنی:
اگر اولین کاراکتر خط > بود، این خط مربوط به یک توالی جدید است.
حذف کاراکترهای اضافی انتهای خط مانند:
- New Line (
\n) - Return Characters
مثال:
قبل:
ATGC\n
بعد:
ATGC
استفاده:
line = line.rstrip()تقسیم یک رشته به چند بخش بر اساس فاصله یا جداکننده.
مثال:
words = line.split()اگر Header باشد:
>seq1 human gene
خروجی:
[">seq1", "human", "gene"]مراحل اصلی برنامه:
f = open("file.fa")seqs = {}for line in f:line = line.rstrip()اگر Header باشد:
- نام توالی استخراج میشود.
- یک ورودی جدید در Dictionary ساخته میشود.
اگر Header نباشد:
- خط فعلی به انتهای توالی قبلی اضافه میشود.
- فایل FASTA ممکن است شامل تعداد زیادی توالی باشد.
- طول هر توالی مشخص نیست؛ ممکن است یک خط یا میلیونها خط باشد.
- برنامه نباید فرض کند توالی در چند خط خاص قرار دارد.
- بهترین روش، خواندن فایل تا رسیدن به Header بعدی است.
- علامت
>همیشه نشاندهنده شروع یک توالی جدید است. - برای فایلهای بزرگ ژنومی، خواندن خطبهخط بهتر از خواندن کل فایل در حافظه است.
- Dictionary انتخاب مناسبی برای ذخیره ارتباط بین شناسه و توالی است.
| اصطلاح انگلیسی | ترجمه فارسی | توضیح |
|---|---|---|
| FASTA Format | قالب FASTA | استاندارد ذخیره توالیهای زیستی |
| Sequence | توالی | رشتهای از نوکلئوتیدهای DNA یا RNA |
| Header Line | خط عنوان | خطی که با > شروع شده و اطلاعات توالی را مشخص میکند |
| Identifier (ID) | شناسه | نام یکتا برای هر توالی |
| Dictionary | فرهنگ داده / دیکشنری | ساختار Key-Value برای ذخیره اطلاعات |
| Key | کلید | شناسهای که برای دسترسی به مقدار استفاده میشود |
| Value | مقدار | داده ذخیرهشده مربوط به کلید |
| File Object | شیء فایل | متغیری که به فایل بازشده اشاره میکند |
| Parsing | تجزیه و پردازش داده | استخراج اطلاعات ساختاریافته از فایل |
| New Line Character | کاراکتر خط جدید | علامت پایان هر خط در فایل متنی |
| rstrip() | حذف انتهای رشته | حذف فاصلهها و کاراکترهای انتهایی |
| split() | تقسیم رشته | تبدیل رشته به لیستی از بخشها |
میتوان فایل FASTA را مانند کتابی تصور کرد:
- Header مانند عنوان یک فصل است.
- Sequence متن آن فصل است.
- وقتی عنوان جدیدی پیدا میکنیم، فصل قبلی تمام شده و فصل جدید شروع میشود.
برنامه باید:
- عنوان فصل را پیدا کند.
- متن مربوط به آن را جمعآوری کند.
- آن را با نام فصل ذخیره کند.
- FASTA یک قالب استاندارد برای ذخیره توالیهای DNA است.
- هر توالی FASTA با یک Header که با
>شروع میشود مشخص میشود. - توالی DNA ممکن است در چندین خط نوشته شود.
- برای خواندن فایلهای بزرگ ژنومی باید از File I/O استفاده کرد.
- فایل ابتدا با
open()باز و در پایان باclose()بسته میشود. - بهترین روش پردازش FASTA، خواندن خطبهخط فایل است.
- Dictionary برای ذخیره رابطه بین شناسه توالی و خود توالی مناسب است.
line[0]برای بررسی اولین کاراکتر خط استفاده میشود.rstrip()کاراکترهای انتهایی مانند newline را حذف میکند.split()برای جدا کردن بخشهای Header استفاده میشود.- خطوط غیر Header به انتهای توالی فعلی اضافه میشوند.
- الگوریتم باید بتواند تعداد نامحدودی توالی FASTA را پردازش کند.
پاسخ:
FASTA یک قالب استاندارد برای ذخیره توالیهای زیستی است که هر توالی شامل یک Header با علامت > و یک یا چند خط Sequence است.
پاسخ:
زیرا دادههای ژنومی معمولاً بسیار بزرگ هستند و وارد کردن دستی آنها امکانپذیر نیست؛ بنابراین از فایلها خوانده میشوند.
پاسخ:
زیرا هر توالی یک شناسه یکتا دارد و Dictionary اجازه میدهد شناسه به عنوان Key و توالی به عنوان Value ذخیره شود.
پاسخ:
با بررسی اولین کاراکتر خط:
if line[0] == ">":اگر اولین کاراکتر > باشد، خط Header است.
پاسخ:
هر خط Sequence به انتهای مقدار قبلی در Dictionary اضافه میشود تا کل توالی ساخته شود.
پاسخ:
Header اطلاعات مربوط به نام و شناسه توالی را دارد و با > شروع میشود؛ Sequence شامل خود بازهای DNA مانند A، T، C و G است.
درس ۷-۳: ارتباط با محیط خارج در پایتون — بازیابی دادهها، آرگومانهای خط فرمان و اجرای برنامههای خارجی
Communicating with the Outside Part 3
در این درس ادامه کار با فایلها و دادههای خارجی در پایتون بررسی میشود. پس از یادگیری خواندن فایلها و ذخیره اطلاعات در ساختارهایی مانند Dictionary، لازم است بدانیم چگونه:
- دادههای ذخیرهشده در Dictionary را بازیابی کنیم.
- ورودیهای دریافتشده از خط فرمان (Command Line Arguments) را پردازش کنیم.
- برای برنامههای پایتون گزینههای اختیاری و اجباری تعریف کنیم.
- با جریانهای استاندارد سیستمعامل (Standard Streams) کار کنیم.
- برنامههای خارجی را از داخل یک اسکریپت پایتون اجرا کنیم.
هدف اصلی این بخش، آمادهسازی برنامههای پایتونی برای کار در محیط واقعی تحلیل دادههای ژنومی است؛ جایی که دادهها معمولاً از فایلها، دستورات سیستم و نرمافزارهای دیگر دریافت میشوند.
متد items() در پایتون اجازه میدهد کلیدها (keys) و مقدارهای (values) یک Dictionary را همزمان دریافت کنیم.
فرض کنید در درس قبل یک Dictionary به نام seqs ساختهایم که شامل شناسه توالیهای DNA و خود توالیها است:
seqs = {
"id1": "ATCGGCTA",
"id2": "GGCATTA"
}با استفاده از:
for name, seq in seqs.items():
print(name, seq)میتوانیم تمام جفتهای:
key → value
را پیمایش کنیم.
در این مثال:
name→ شناسه توالی DNAseq→ توالی DNA مربوط به آن شناسه
این روش برای پردازش مجموعههای بزرگ داده مانند:
- توالیهای DNA
- نتایج آزمایشها
- دادههای بیوانفورماتیکی
بسیار کاربردی است.
Command Line Arguments اطلاعاتی هستند که هنگام اجرای یک برنامه از طریق ترمینال به آن داده میشوند.
مثلاً:
python processfasta.py myfile.faدر اینجا:
processfasta.py→ نام برنامهmyfile.fa→ آرگومان ورودی برنامه
برای دسترسی به آرگومانهای خط فرمان از ماژول داخلی sys استفاده میکنیم:
import sysلیست آرگومانها در:
sys.argvذخیره میشود.
مثلاً:
print(sys.argv)ممکن است خروجی:
[
"processfasta.py",
"myfile.fa"
]باشد.
اندیسها:
| اندیس | محتوا |
|---|---|
sys.argv[0] |
نام برنامه |
sys.argv[1] |
اولین آرگومان کاربر |
بنابراین:
filename = sys.argv[1]نام فایل ورودی را دریافت میکند.
ماژول getopt برای مدیریت آرگومانهای پیچیدهتر استفاده میشود؛ مخصوصاً زمانی که برنامه:
- گزینههای اختیاری دارد.
- چندین پارامتر دریافت میکند.
فرض کنید برنامهای داریم:
processfasta.py -l 250 myfile.faکه معنی آن:
- فقط توالیهایی با طول بیشتر از 250 باز ذخیره شوند.
در اینجا:
-l
یک گزینه است و:
250
مقدار آن است.
مثلاً:
getopt.getopt(
sys.argv[1:],
"l:h"
)معنی:
l→ گزینه lengthh→ گزینه help
وجود : بعد از l یعنی این گزینه نیاز به مقدار دارد.
مثلاً:
-l 250
اما:
-h
فقط یک Flag است و مقدار ندارد.
تابعی که توضیح میدهد کاربر چگونه باید برنامه را اجرا کند.
مثال:
def usage():
print("Usage: processfasta.py -l length filename")اگر کاربر:
- آرگومان اشتباه وارد کند.
- فایل ورودی را فراموش کند.
- درخواست کمک کند.
برنامه میتواند پیام راهنما نمایش دهد.
گزینه رایج:
-hبرای نمایش Help استفاده میشود.
سیستمعامل برای ارتباط برنامهها با محیط سه جریان اصلی دارد:
جریانی برای دریافت داده.
معمولاً:
- صفحهکلید
- خروجی برنامه دیگر
به عنوان ورودی استفاده میشود.
در پایتون:
sys.stdinمحل پیشفرض نمایش خروجی برنامه.
مثلاً:
sys.stdout.write("Hello")معادل نمایش روی صفحه است.
جریانی جداگانه برای پیامهای خطا و هشدار.
مثال:
sys.stderr.write(
"Warning: file not found"
)مزیت:
میتوان خروجی عادی و خطا را جداگانه ذخیره کرد.
در سیستم Unix میتوان خروجیها را به فایل منتقل کرد.
مثلاً:
my_program > output.txtخروجی عادی در فایل ذخیره میشود.
یا:
my_program 2> error.txtخطاها در فایل جدا ذخیره میشوند.
این ویژگی برای اجرای تحلیلهای بزرگ ژنومی بسیار مهم است.
ماژول subprocess اجازه میدهد یک برنامه خارجی را از داخل پایتون اجرا کنیم.
اجرای دستور Unix:
import subprocess
subprocess.call(
["ls", "-l"]
)این دستور همانند اجرای:
ls -lدر ترمینال است.
بسیاری از ابزارهای ژنومی برنامههای مستقل هستند، مانند:
- ابزارهای RNA-seq
- ابزارهای Alignment
- برنامههای تحلیل ژنوم
به جای اجرای دستی هر دستور، میتوان آنها را از داخل پایتون فراخوانی کرد.
مثال:
اجرای ابزار:
TopHat
برای RNA-seq alignment:
subprocess.call([
"tophat",
"genome_index",
"reads_1.fq.gz",
"reads_2.fq.gz"
])پایتون برنامه خارجی را اجرا کرده و آرگومانها را منتقل میکند.
- Dictionary برای ذخیره دادههای ساختاریافته مانند ارتباط شناسه توالی ↔ توالی DNA بسیار مناسب است.
- متد
items()برای پیمایش همزمان کلید و مقدار استفاده میشود. sys.argvهمیشه نام برنامه را در اندیس صفر ذخیره میکند.- برای گرفتن آرگومانهای واقعی کاربر معمولاً از:
sys.argv[1:]استفاده میکنیم.
getoptزمانی مفید است که برنامه گزینههای متعدد و اختیاری داشته باشد.- گزینههایی مانند
-hمعمولاً برای نمایش راهنما استفاده میشوند. - سه جریان استاندارد عبارتاند از:
stdin
stdout
stderr
stderrجدا از خروجی معمولی است و برای پیامهای خطا استفاده میشود.- با
subprocessمیتوان ابزارهای خارجی بیوانفورماتیکی را از داخل Python کنترل کرد.
| اصطلاح انگلیسی | ترجمه فارسی | توضیح |
|---|---|---|
| Dictionary | دیکشنری | ساختار دادهای برای ذخیره جفتهای کلید و مقدار |
| Key | کلید | شناسهای که برای دسترسی به مقدار استفاده میشود |
| Value | مقدار | داده مرتبط با یک کلید |
| items() method | متد items | دریافت کلید و مقدارهای یک Dictionary |
| Command Line Argument | آرگومان خط فرمان | اطلاعاتی که هنگام اجرای برنامه به آن داده میشود |
| sys.argv | لیست آرگومانهای سیستم | محل ذخیره ورودیهای خط فرمان |
| getopt | پردازشگر گزینههای خط فرمان | ماژولی برای مدیریت آرگومانهای پیچیده |
| Optional Argument | آرگومان اختیاری | پارامتری که وجود آن الزامی نیست |
| Required Argument | آرگومان اجباری | پارامتری که باید وارد شود |
| stdin | ورودی استاندارد | جریان دریافت داده از محیط |
| stdout | خروجی استاندارد | جریان خروجی معمول برنامه |
| stderr | خطای استاندارد | جریان مخصوص پیامهای خطا |
| subprocess | زیرپردازش | ماژول اجرای برنامههای خارجی |
| Stream | جریان داده | مسیر انتقال داده بین برنامه و محیط |
فرض کنید یک فایل FASTA داریم:
>gene1
ATCGATCG
>gene2
GGCTTA
پس از پردازش:
seqs = {
"gene1":"ATCGATCG",
"gene2":"GGCTTA"
}اکنون با:
seqs.items()میتوانیم هر ژن و توالی آن را استخراج کنیم.
فرض کنید برنامهای داریم:
processfasta.py
بدون آرگومان:
python processfasta.py
برنامه نمیداند کدام فایل را پردازش کند.
اما:
python processfasta.py genome.fa
نام فایل را دریافت کرده و تحلیل را شروع میکند.
به جای اینکه صدها بار دستی اجرا کنیم:
tophat genome sample1.fastq
tophat genome sample2.fastq
tophat genome sample3.fastq
میتوانیم یک حلقه پایتون بنویسیم که این دستورات را خودکار اجرا کند.
- Dictionary برای ذخیره دادههای مرتبط مانند شناسه و توالی DNA استفاده میشود.
- متد
items()کلید و مقدار را همزمان برمیگرداند. sys.argvبرای دریافت ورودیهای خط فرمان استفاده میشود.- اولین عضو
sys.argvهمیشه نام برنامه است. getoptبرای مدیریت گزینههای پیچیده مانند-l 250استفاده میشود.- گزینههای Help معمولاً با
-hپیادهسازی میشوند. - سیستمعامل سه جریان اصلی دارد:
stdin،stdoutوstderr. stderrبرای پیامهای خطا و هشدار جدا از خروجی اصلی استفاده میشود.subprocessامکان اجرای برنامههای خارجی از داخل Python را فراهم میکند.- در بیوانفورماتیک، Python اغلب برای هماهنگ کردن ابزارهای مختلف تحلیل ژنومی استفاده میشود.
پاسخ: این متد تمام جفتهای کلید و مقدار موجود در Dictionary را برمیگرداند و امکان پیمایش همزمان آنها را فراهم میکند.
پاسخ:
sys.argv[0] نام برنامه است، در حالی که sys.argv[1] اولین آرگومان واقعی واردشده توسط کاربر است.
پاسخ: برای مدیریت آرگومانهای خط فرمان پیچیدهتر، مخصوصاً زمانی که برنامه گزینههای اختیاری و اجباری دارد.
پاسخ:
stdout برای خروجی معمول برنامه استفاده میشود، اما stderr مخصوص پیامهای خطا و هشدار است و میتواند جداگانه ذخیره شود.
پاسخ:
زیرا بسیاری از ابزارهای تحلیل ژنومی مستقل از Python هستند. با subprocess میتوان این ابزارها را از داخل اسکریپت Python اجرا و خودکارسازی کرد.
Biopython مجموعهای گسترده از ابزارها و کتابخانههای آماده برای انجام محاسبات و تحلیلهای زیستاطلاعاتی (Bioinformatics) در زبان Python است.
در این درس، هدف آموزش کامل Biopython نیست، بلکه معرفی قابلیتهای اصلی آن و نشان دادن یک مثال واقعی از کاربرد آن در ژنومیک است.
در پایان درس یاد میگیریم چگونه با استفاده از Biopython:
- فایلهای زیستی مانند FASTA را پردازش کنیم.
- به پایگاههای داده زیستی آنلاین متصل شویم.
- برنامه معروف BLAST را از داخل Python اجرا کنیم.
- نتایج BLAST را تحلیل و تفسیر کنیم.
Biopython یک مجموعه کتابخانه و ابزار Python برای انجام وظایف مرتبط با زیستشناسی محاسباتی و بیوانفورماتیک است.
پروژه Biopython در سال ۱۹۹۹ آغاز شد و هدف آن این بود که استفاده از Python در حوزه زیستشناسی آسانتر شود.
این پروژه شامل ماژولهایی برای کارهای مختلف است، از جمله:
- خواندن و نوشتن فرمتهای فایل زیستی
- اتصال به پایگاههای داده زیستی
- اجرای الگوریتمهای تحلیل توالی
- کار با برنامههای بیوانفورماتیکی
Biopython میتواند فایلهایی مانند:
- FASTA
- GenBank
- SwissProt
را بخواند و تحلیل کند.
Biopython امکان ارتباط با پایگاههایی مانند:
- NCBI
را فراهم میکند.
بسیاری از ابزارهای تحلیل زیستی را میتوان از داخل Python کنترل کرد.
در پروژههای واقعی ژنومیک، دادهها بسیار بزرگ هستند و نوشتن همه الگوریتمها از ابتدا منطقی نیست.
Biopython باعث میشود پژوهشگر بتواند از ابزارهای آماده استفاده کند و تمرکز خود را روی تحلیل علمی دادهها بگذارد.
برای بررسی اینکه Biopython نصب است یا نه:
import Bioاگر خطایی ایجاد نشود، Biopython نصب شده است.
برای مشاهده نسخه:
print(Bio.__version__)خروجی مثلاً:
1.65
نسخه نصبشده را نشان میدهد.
BLAST (Basic Local Alignment Search Tool) یکی از مهمترین ابزارهای بیوانفورماتیک برای پیدا کردن شباهت بین توالیهای DNA یا پروتئین است.
BLAST یک توالی ناشناخته را دریافت میکند و آن را با تعداد بسیار زیادی توالی موجود در پایگاه داده مقایسه میکند.
هدف:
یافتن پاسخ به این سؤال:
این توالی متعلق به چه موجود یا چه ژنی است؟
مثال:
یک بیمار بسیار بیمار است.
از نمونه او توالیهای DNA استخراج شدهاند.
بخشی از این توالیها:
- با ژنوم انسان تطبیق داده نمیشوند.
- منشأ آنها ناشناخته است.
با BLAST میتوان بررسی کرد که آیا این توالی متعلق به:
- ویروس
- باکتری
- قارچ
- موجود دیگر
است.
برای استفاده از BLAST آنلاین از طریق Biopython:
ابتدا:
from Bio.Blast import NCBIWWWسپس توالی FASTA خوانده میشود:
fasta_string = open("myseq.fa").read()اجرای BLAST:
result_handle = NCBIWWW.qblast(
"blastn",
"nt",
fasta_string
)نوع جستجو:
- DNA در برابر DNA
پایگاه داده:
Non-redundant nucleotide database
که شامل حجم بسیار زیادی از توالیهای ثبتشده در NCBI است.
نتیجه BLAST معمولاً بسیار بزرگ است، بنابراین باید آن را پردازش کنیم.
برای خواندن خروجی XML:
from Bio.Blast import NCBIXMLسپس:
blast_record = NCBIXML.read(result_handle)نتیجه BLAST شامل اطلاعات مختلفی است:
تطبیق بین توالی Query و توالی موجود در پایگاه داده.
امتیاز کیفیت تطبیق.
هرچه بیشتر باشد، تطبیق بهتر است.
احتمال اینکه چنین تطبیقی به صورت تصادفی رخ داده باشد.
تفسیر:
- مقدار بسیار کوچک → تطبیق واقعی و قابل اعتماد
- مقدار بزرگ → احتمالاً تصادفی
مثلاً:
2 × 10^-29
یک تطبیق بسیار قوی است.
بخشهایی از Alignment که بالاترین امتیاز را دارند.
برای هر تطبیق، BLAST اطلاعات HSP ارائه میدهد.
برای حذف نتایج ضعیف:
مثلاً:
e_value_thresh = 0.01سپس فقط تطبیقهایی انتخاب میشوند که:
hsp.expect < e_value_threshباشند.
یعنی:
احتمال تصادفی بودن کمتر از ۱٪ باشد.
از یک بیمار توالی DNA ناشناختهای به دست آمده است.
این توالی در ژنوم انسان پیدا نشده است.
- توالی به BLAST داده میشود.
- BLAST آن را با پایگاه داده NCBI مقایسه میکند.
- بهترین تطبیقها بررسی میشوند.
توالی بیمار با:
Ebola virus
تطبیق کامل نشان داد.
بنابراین مشخص شد عامل بیماری:
ویروس ابولا بوده است.
- Biopython جایگزین نوشتن الگوریتمهای پیچیده نیست؛ بلکه مجموعهای از ابزارهای آماده است.
- در پروژههای واقعی، استفاده از کتابخانههای آماده بسیار مهم است.
- BLAST یکی از پراستفادهترین ابزارهای تاریخ بیوانفورماتیک است.
- Biopython امکان اجرای BLAST از طریق اینترنت را فراهم میکند.
- خروجی BLAST معمولاً XML است و برای خواندن آن از
NCBIXMLاستفاده میشود. - E-value معیار اصلی برای تشخیص معنیدار بودن یک تطبیق است.
- مقدار E-value کوچکتر یعنی احتمال تصادفی بودن کمتر.
- HSP بخشهایی از Alignment هستند که بیشترین شباهت را دارند.
- در تحلیل ژنومی، ترکیب Python + Biopython + ابزارهایی مانند BLAST بسیار قدرتمند است.
| اصطلاح انگلیسی | ترجمه فارسی | توضیح |
|---|---|---|
| Biopython | بایوپایتون | مجموعه کتابخانههای Python برای بیوانفورماتیک |
| Bioinformatics | زیستاطلاعاتشناسی | استفاده از محاسبات برای تحلیل دادههای زیستی |
| FASTA | فرمت FASTA | قالب استاندارد ذخیره توالیهای DNA و پروتئین |
| GenBank | پایگاه GenBank | فرمت و پایگاه داده توالیهای زیستی |
| SwissProt | پایگاه SwissProt | پایگاه داده پروتئینها |
| BLAST | ابزار جستجوی شباهت توالی | مقایسه توالی با پایگاه داده بزرگ |
| Query Sequence | توالی مورد جستجو | توالی ناشناختهای که بررسی میشود |
| Database | پایگاه داده | مجموعه توالیهای مرجع |
| Alignment | همترازی | مقایسه موقعیتبهموقعیت دو توالی |
| Score | امتیاز | معیار کیفیت تطبیق |
| E-value | مقدار انتظار | احتمال رخ دادن تطبیق به صورت تصادفی |
| HSP | جفتهای با امتیاز بالا | بخشهای مهم Alignment |
| XML | فرمت XML | قالب ذخیره و انتقال دادههای ساختاریافته |
| NCBI | مرکز ملی اطلاعات زیستفناوری | پایگاه مهم دادههای زیستی |
فرض کنید یک جمله ناشناس پیدا کردهاید و میخواهید بدانید از کدام کتاب آمده است.
BLAST مانند یک موتور جستجوی بسیار تخصصی است که این جمله را با میلیونها جمله مقایسه میکند و نزدیکترین منابع را پیدا میکند.
در ژنتیک:
- جمله = توالی DNA
- کتابها = پایگاه داده ژنومی
- نتیجه جستجو = گونه یا ژن احتمالی
- Biopython مجموعه ابزارهای آماده Python برای بیوانفورماتیک است.
- این کتابخانه در سال ۱۹۹۹ ایجاد شد.
- Biopython میتواند فایلهای FASTA، GenBank و SwissProt را پردازش کند.
- با Biopython میتوان به سرویسهای NCBI متصل شد.
- BLAST برای یافتن منشأ یک توالی ناشناخته استفاده میشود.
NCBIWWW.qblast()امکان اجرای BLAST از داخل Python را فراهم میکند.- خروجی BLAST شامل Alignment، Score، E-value و HSP است.
- E-value کوچک نشاندهنده تطبیق قابل اعتماد است.
- Biopython خروجیهای پیچیده BLAST را برای تحلیل سادهتر پردازش میکند.
- استفاده از ابزارهای آماده، سرعت توسعه پروژههای ژنومی را افزایش میدهد.
پاسخ: Biopython مجموعهای از کتابخانههای Python برای انجام تحلیلهای زیستاطلاعاتی است که استفاده از ابزارهای ژنومی و پردازش دادههای زیستی را ساده میکند.
پاسخ: BLAST یک توالی DNA یا پروتئین را با پایگاه داده بزرگی از توالیها مقایسه میکند تا توالیهای مشابه و منشأ احتمالی آن را پیدا کند.
پاسخ: E-value احتمال رخ دادن یک تطبیق به صورت تصادفی را نشان میدهد. مقدار کمتر نشاندهنده تطبیق معتبرتر است.
پاسخ: برای تبدیل خروجی XML مربوط به BLAST به ساختاری قابل پردازش در Python استفاده میشود.
پاسخ: میتواند توالیهای ناشناخته بیمار را با ابزارهایی مانند BLAST مقایسه کند و به شناسایی عامل بیماریزا مانند ویروس یا باکتری کمک کند.