در یک تقسیمبندی کلی، میتوان دستورات پایتون را در دو دستهٔ Simple و Compound قرار داد که در این آموزش قصد داریم با ذکر مثالهایی، به بررسی این دو گروه بپردازیم.
آشنایی با Simple Statements (دستورهای ساده)
تا به حال تمام چیزهایی که در زبان پایتون آموختم را در قالب دستورات سادهای در اختیار مفسر قرار دادهایم تا آنها را اجرا کند. به طور مثال، دستورهای زیر که در حالت تعاملی IDLE وارد میکنیم را در نظر بگیرید:
>>> num1 = 4 + 5 >>> message = """Welcome to SokanAcademy.com""" >>> num1 += 8 >>> 2 + 3 >= 6 False
همانطور که میبینیم، بعضی از این دستورها خروجی خاصی ندارند (همچون سه دستور اول) و در حقیقت با وارد کردن آنها مفسر پایتون در پشت صحنه عملیات انتساب را انجام میدهد و ما بعداً میتوانیم از نتایج این عملیات استفاده کنیم. مثلاً متغیر message که در این عملیات در حافظه ایجاد و به آبجکتی از نوع استرینگ و با محتوای «Welcome to SokanAcademy.com» منتسب شده است را چاپ کنیم اما دستور چهارم یک خروجی قابلمشاهده به ما نشان میدهد. همانطور که در این مثالها میبینید، هر یک از این دستورها را به صورت مستقل از هم در یک خط مثل دستور اول، یا در بیش از یک خط مثل دستور دوم نوشتهایم و اجرا میکنیم. در زبان پایتون اصطلاحاً به هر یک از این دستورهای ساده Logical Line یا «سطر منطقی» گفته میشود.
هشدار
به خاطر داشته باشید که دستورات سادهٔ پایتون را میتوان با قرار دادن کاراکتر \ در میانهٔ دستور شکست و در سطر بعدی ادامه داد اما این در حالی است که نمیتوانیم از این کاراکتر برای شکستن کامنتها، که در آموزش قبل با سینتکس آنها آشنا شدیم، استفاده کنیم و کامنت مورد نظر خود را در چند سطر بنویسم چرا که مفسر پایتون چیزهایی که در یک کامنت مینویسیم را نادیده میگیرد.
برای مثال، دستورات سادهٔ زیر را در نظر بگیرید:
>>> message = "Welcome to SyntaxError: EOL while scanning string literal >>> message = "Welcome to\ SokanAcademy.com" >>> message = "Welcome to \ # This is a line continuation character. SyntaxError: EOL while scanning string literal
همانطور که در دستور اول میبینید، وقتی بدون استفاده از کاراکتر \ دکمهٔ اینتر را میزنیم تا ادامهٔ دستور را در خط بعدی بنویسیم، مفسر پایتون بلافاصله اعلام خطای سینتکسی میکند؛ با این حال، زمانی که از کاراکتر \ استفاده میکنیم به راحتی میتوانیم به سطر بعدی برویم و ادامهٔ دستور خود را وارد نماییم. در دستور سوم هم میبینید که پس از قرار دادن کاراکتر \ نمیتوان آن خط را ادامه داد و توضیحی در آن وارد کرد، هرچند که مفسر توضیحات را نادیده میگیرد.
گرچه اکیداً توصیه میشود که دستورات ساده و مستقل از هم در خطوط جداگانه وارد شوند، با این حال برای نوشتن آنها در یک خط کافی است بین آنها کاراکتر ; را قرار دهیم. به مثال زیر که در حالت تعاملی IDLE وارد شده است توجه کنید:
>>> num = 2 ; num += 8 ; num 10
همانطور که میبینید، در این خط سه دستور متفاوت وارد شده است که با کاراکتر ; از هم جدا شدهاند.
نکته
در این حالت فراموش کردن درج کاراکتر سِمیکالن بین دستورات منجر به بروز خطای سینتکسی میشود.
آشنایی با Compound Statements (دستورهای مرکب)
دستورهای مرکب اجرای سایر دستورها را کنترل میکنند یا بر روند اجرای آنها تأثیر میگذارند. به طور مثال، دستورهای شرطی در این گروه جای میگیرند که در سادهترین حالت ممکن در صورت برقراری یک شرط خاص، مفسر یک سری از دستورات را اجرا میکند و در صورتی که شرط برقرار نباشد آن دستورات را نادیده گرفته و اجرا نخواهد کرد (در آموزشهای آتی، با دستورات شرطی بیشتر آشنا خواهیم شد.)
یک دستور مرکب از یک یا چند Clause (کلاز یا بند) تشکیل میشود. یک بند از یک اصطلاحاً Header و یک Suite تشکیل شده است که هر هِدِر با یک کلمهٔ کلیدی یکتا آغاز میشود و با کاراکتر : پایان مییابد. پیش از این، لیستی از کلمات کلیدی پایتون را معرفی کردیم و گفتیم این کلمات شناسههایی هستند که به صورت پیشفرض در این زبان تعریف شدهاند و معنای خاصی را به مفسر پایتون میرسانند:
if x > y: def move():
آنچه در بالا مشاهده میکنید، مثالهایی از تعریف هِدِر برای یک بند است و همانطور که میبینید، این هِدِرها با کلمات کلیدی if و def آغاز شدهاند و با : پایان یافتهاند که در آموزشهای بعدی با مفهوم هر یک از این کلمات کلیدی آشنا خواهیم شد.
Suite (بدنه) گروهی از دستورات هستند که اجرای آنها در یک بند کنترل میشود که این دست دستورات را میتوان به دو صورت نوشت. اول اینکه تمام دستورات Suite را در همان خطی بنویسیم که Header را وارد کردیم و در صورتی که چند دستور وجود داشته باشد، آنها را با ; از هم جدا کنیم. فرم کلی چنین بندی به صورت زیر خواهد بود:
Clause Header : Statement1 ; Statement2 ; …
به طور مثال:
if x > y: x = 0; y += 1; z = x+y
همانطور که میبینید، مثال بالا بدنه از سه دستور ساده تشکیل شده است که در همان خطی که هِدِر قرار دارد نوشته شدهاند و با ; از هم جدا شدهاند اما راهکار دوم این است که دستورات بدنه را در سطرهای مجزا که در یک بلوک کد مجزا از بلوک سطر هِدِر قرار دارند بنویسیم.
بلوکبندی دستورات در بسیاری از زبانهای برنامهنویسی همچون جاوا و سی با استفاده از آکولادهای باز و بسته {} انجام میشود اما در پایتون برای بلوکبندی کدها از اصطلاحاً Indentation (تورفتگی) استفاده میشود که با استفاده از فشردن کلیدهای Space یا Tab و ایجاد فاصله از آغاز سطر مشخص میشود.
نکته
استاندارد تورفتگی در پایتون مقداری برابر با فضای خالی ایجاد شده به واسطهٔ چهار بار فشردن کلید Space یا یک بار فشردن کلید Tab است و لازم به یادآوری است که IDLE در صورت نیاز به صورت خودکار تورفتگی هر بلوک را ایجاد میکند.
در ادامه، مثالی از یک دستور مرکب که به این فرم نوشته شده است را مشاهده میکنید:
if x > y: x = 0 y += 1 z = x+y
زمانی که تمام دستورات بدنه را در حالت تعاملی IDLE وارد کردیم، کافی است دو بار کلید اینتر را فشار دهیم تا مفسر بلوک بدنه را ببندد و دستور مرکب را اجرا کند اما در حالت اسکریپتی کافی است خودمان اشارهگر را جابهجا کنیم تا به بلوکی که هِدِر در آن قرار دارد برگردیم و ادامهٔ دستورات را وارد کنیم:
if x > y: x = 0 y += 1 z = x + y age = 5
همانطور که میبینید، بدنهٔ دستور مرکب if با دستور z = x + y پایان یافته است و دستور بعدی از ابتدای سطر بعد آغاز شده است و تورفتگی ندارد. در صورتی که بدنهٔ یک بند را به فرم دوم بنویسیم، خواهیم توانست از دستورات مرکب تودرتو استفاده کنیم. به طور مثال، در قطعه کد زیر میبینید که دستور if دوم در دستور if اول آمده است:
if x > y: if z > x: print("z is the greatest.") print("x is greater than y.") print("We found the greatest.")
گفتیم که بعضی از دستورات مرکب از چند بند تشکیل میشود که در این صورت هِدِرهای تمام بندها در یک سطح از تو رفتگی قرار میگیرند. به طور مثال، دستور مرکب if و else دارای دو بند است که بند اول با کلمهٔ کلیدی if و بند دوم با کلمهٔ کلیدی else آغاز میشود و از همین روی میزان تورفتگی هِدِر دو بند باید برابر باشد:
if x > y: print("x is greater than y.") else: print("y is greater than x.")
در این دستور مرکب انتظار داریم اگر شرط if برقرار بود بدنهٔ بند اول و در غیر این صورت بدنهٔ بند دوم اجرا گردد.