رفتن به مطلب

آموزش پایتون


Mohammad Aref

ارسال های توصیه شده

دسته بندی

در این بخش به دسته‌بندی انواع شی بر اساس برخی از تعریف‌های پایتون پرداخته شده است.

  • انواع عددی (Numeric Types):
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
  • انواع دنباله (Sequence Types):
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
  • انواع تغییر ناپذیر (Immutable Types):
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
  • انواع تغییر پذیر (Mutable Types):
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
  • انواع نگاشت (Mapping Types):
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
  • انواع مجموعه (Set Types):
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
  • برخی دیگر:
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

 

  • Like 1
لینک به دیدگاه

دستورهای کنترلی

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

انتخاب

با استفاده از دستور انتخاب می‌توان بر حسب شرایط برنامه در زمان اجرا تعیین کرد که آیا یک بلاک دستور اجرا شود یا خیر و همچنین از بین دو یا چند بلاک دستور کدام یک انتخاب و اجرا گردد. پایتون تنها یک ساختار انتخاب را ارایه می‌دهد که می‌تواند به سه شکل «تک انتخابی»، «دو انتخابی» و «چند انتخابی» پیاده‌سازی گردد؛ این ساختار به نام دستور if خوانده می‌شود و در ادامه بررسی خواهد شد.

دستور if

۱. ساختار ساده (تک انتخابی)

این ساختار یک دستور مرکب است که در سرآیند آن یک «شرط» (Condition) بررسی می‌گردد و تنها در صورتی که این شرط برقرار باشد بدنه اجرا خواهد گشت؛ در غیر این صورت مفسر از اجرای دستور(های) بدنه صرف نظر کرده و به سراغ نخستین دستور بعد از این ساختار می‌رود. این ساختار با استفاده از کلمه کلیدی if و الگویی مشابه پایین پیاده‌سازی می‌گردد:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

منظور از شرط عبارتی است که می‌توان آن را به یکی از مقدار‌های بولی (True یا False) ارزیابی نمود؛ در اینجا اگر شرط برابر True ارزیابی گردد بخش بدنه دستور if اجرا می‌گردد. به نمونه کدهای پایین توجه نمایید:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

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

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

همانطور که در نمونه کد بالا نیز مشاهده می‌شود می‌توان از عملگرهای منطقی (not ،or ،and) برای بررسی برقرار بودن (یا نبودن) همزمان چندین شرط بهره گرفت.

می‌دانیم که: عدد یک و تمام اعداد مخالف صفر در پایتون برابر مقدار بولی True و عدد صفر، اشیا خالی به مانند "" یا [] برابر مقدار False ارزیابی می‌شوند:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

می‌توان از ساختار if به شکل تودرتو (Nested) نیز بهره برد. در این حالت بدنه دستور if حاوی یک یا چند دستور if دیگر می‌شود که البته آن‌ها نیز می‌توانند حاوی دستور‌های if دیگری در بدنه خود باشند:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

۲. ساختار همراه با else (دو انتخابی)

با استفاده از کلمه‌ کلیدی else می‌توان بلاکی را برای اجرا در حالتی که شرط برقرار نیست - زمانی که شرط if برابر مقدار بولی False ارزیابی می‌گردد - تعیین کرد. else یک بخش جدا است که سرآیند و بدنه مخصوص به خود را دارد؛ این سرآیند می‌بایست فاقد هر گونه شرطی باشد:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

۳. ساختار همراه با elif (چند انتخابی)

دستور if را می‌توان گسترش داد و بخش‌های بیشتری را با شرط‌های گوناگون ایجاد نمود؛ به این صورت که ابتدا شرط بخش if بررسی می‌گردد و چنانچه برابر True ارزیابی نگردد، شرط مربوط به نختسین بخش elif بررسی می‌گردد که اگر باز هم برابر True نشود شرط بخش elif بعدی بررسی خواهد شد و به همین صورت ادامه می‌یابد؛ در انتها نیز اگر هیچ کدام از شرط‌ها (if و elif) برابر True نشوند آنگاه بدنه مربوط به بخش else (در صورت وجود) اجرا می‌گردد. الگوی این ساختار مانند پایین است:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
  • هر elif یک بخش جدا است که سرآیند و بدنه مخصوص به خود را دارد.
  • تعداد بخش‌های elif اختیاری است و محدودیتی در آن وجود ندارد.
  • بخش elif نمی‌تواند قبل از if یا بعد از else قرار بگیرد.
  • در این ساختار نیز وجود بخش else اختیاری است.

در این ساختار بخش‌ها به ترتیب از بالا به پایین بررسی می‌شوند و با True ارزیابی شدن شرط هر بخش، بدنه مربوط به آن اجرا و از بررسی دیگر بخش‌ها صرف نظر می‌گردد. به نمونه کد پایین توجه نمایید:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

اگر بخواهیم نمونه کد بالا را با استفاده از if های تودرتو پیاده‌سازی نماییم به شکل پایین خواهد شد:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

چنانچه قصد دارید تمام شرط‌های مورد نظر بررسی شوند می‌توانید از چند دستور if به شکل متوالی استفاده نمایید:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

دستور switch/case

در صورتی که سابقه برنامه‌نویسی با زبان‌های دیگری همچون C و Java را داشته باشید حتما با دستور switch نیز آشنا هستید؛ این دستور در زبان پایتون پیاده‌سازی نشده است.

دستور switch مقداری را دریافت می‌کند و سپس آن را با مقدارهای هر case درون ساختار خود به ترتیب مقایسه می‌کند؛ در صورتی که این مقدار با یکی از case ها برابر باشد، دستورهای مرتبط با آن case را اجرا کرده و از بررسی دیگر case ها صرف نظر می‌کند. همچنین اگر مقدار دریافتی با هیچ یک از case ها مطابقت نداشته باشد دستورهای مربوط به بخش default (در صورت وجود) را اجرا می‌کند. در پایین نمونه‌ایی از این دستور در زبان Java آورده شده است:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

برای پیاده‌سازی چنین ساختاری در پایتون می‌توان از if/elif/else استفاده کرد:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

 

لینک به دیدگاه

تکرار

گاهی نیاز پیدا می‌کنیم که بلاکی را چندین بار پشت سرهم اجرا نماییم. به ساختار تکرار «حلقه» (Loop) گفته می‌شود؛ در ادامه به بررسی ساختار دو حلقه ارایه شده در زبان پایتون خواهیم پرداخت.

دستور while

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

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

شرط همواره می‌بایست از درون بدنه کنترل شود به گونه‌ای که در مرحله‌ خاصی برابر مقدار False ارزیابی گردد؛ در غیر این صورت یک حلقه بی‌نهایت ایجاد می‌شود که مفسر هیچگاه نمی‌تواند از اجرای آن خارج شود. برای نمونه اجرای دستور پایین هیچگاه توسط مفسر پایتون پایان نمی‌پذیرد و برای اتمام آن می‌بایست از سیستم عامل کمک گرفت:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

ولی در نمونه کد پایین مقدار متغیر a از درون بدنه کنترل و در هر بار اجرا یک واحد کاهش می‌یابد؛ بنابراین اجرای حلقه تنها تا زمانی که شرط نقض نشده باشد ادامه می‌یابد:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

در نمونه کد بالا بهتر می‌بود به جای عبارت a > 0 تنها از خود متغیر a به عنوان شرط حلقه استفاده نماییم؛ چرا که در هر مرتبه اجرا یک واحد از آن کم می‌شود و با رسیدن به مقدار صفر به صورت خودکار توسط مفسر پایتون به مقدار False ارزیابی و تکرار اجرای بدنه حلقه متوقف می‌گردد.

به عنوان نمونه‌ای دیگر،‌ فاکتوریل (

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
) عدد ۱۰ را می‌توان به صورت پایین محاسبه کرد:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

دستور continue

این دستور در هر نقطه از بخش بدنه که آورده شود، دستورهای بعد از آن نادیده گرفته می‌شوند و جریان اجرا به ابتدای حلقه یعنی بخش سرآیند پرش می‌کند. برای نمونه می‌خواهیم اعداد صحیح زوجی که کوچکتر از ۱۰ هستند را بر روی خروجی نمایش دهیم. در نمونه کد پایین برای اعداد فرد دستور continue از ادامه اجرا و نمایش آن‌ها جلوگیری می‌کند و جریان اجرا را به ابتدای حلقه پرش می‌دهد:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

البته مثال بالا را بدون continue نیز می‌توان به انجام رساند:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

دستور break

این دستور در هر نقطه از بخش بدنه که آورده شود، دستورهای بعد از آن نادیده گرفته می‌شوند و جریان اجرا از حلقه خارج می‌شود. در نمونه کد پایین با هر اجرای بدنه یک واحد به counter افزوده می‌شود و هرگاه مقدار آن برابر ۴ گردد، بدون توجه به شرط، اجرای حلقه متوقف می‌شود:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

در while نیز می‌شود از بخش else استفاده نماییم؛ به این صورت که اگر حلقه به صورت طبیعی پایان پذیرد - و نه توسط دستور break - آنگاه بدنه else اجرا می‌گردد.

نمونه کد پایین بررسی می‌کند که آیا عدد n یک «عدد اول» (

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
) هست یا خیر؛ این اعداد بزرگتر از یک بوده و به جز خود و عدد یک بر هیچ عدد دیگری بخش پذیر نیستند. بنابراین اگر عددی کوچکتر از n (به جز یک) پیدا شود که بر آن بخشپذیر باشد (یعنی باقی مانده تقسیم بر آن صفر باشد) اول نبودن عدد n ثابت می‌شود و حلقه به کمک دستور break متوقف می‌گردد:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

دستور for

این دستور مرکب یک حلقه تکرار است که بر اساس تعداد عضوهای یک شی دنباله یا در حالت کلی‌تر یک شی تکرارکننده (iterator) - که در انتها بررسی خواهد شد - اجرای دستورهای بدنه را تکرار می‌کند. الگوی این دستور به شکل پایین است:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

هر حلقه for دقیقا به تعداد عضوهای شی object تکرار می‌گردد؛ هر بار یک عضو از دنباله (یا تکرارکننده) object با حفظ ترتیب اعضا به متغیر target انتساب داده می‌شود و یک مرتبه بدنه اجرا می‌گردد؛ این روند تا پایان پیمایش عضوهای object ادامه می‌یابد. از متغیر target می‌توان در داخل بدنه استفاده کرد که در مرتبه نخست اجرای حلقه به عضو یکم و با اجراهای بعدی به عضوهای بعدی از object اشاره خواهد داشت. به نمونه کدهای پایین توجه نمایید:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

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

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

در نمونه کد بالا، متغیر both در هر مرتبه تکرار به یک شی تاپل اشاره دارد.

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

در حالت عادی برای یک شی دیکشنری،‌ کلیدهای آن پیمایش می‌شوند.

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

توجه: معمولا از حلقه for در مواقعی که تعداد تکرار مشخص باشد و از حلقه while زمانی که تعداد تکرار نامشخص است استفاده می‌شود.

مانند حلقه while در اینجا نیز می‌توان از دستورهای continue و break استفاده کرد. همچنین حلقه for می‌تواند شامل بخش else باشد.

مثال تشخیص عدد اول در حلقه while را با استفاده از حلقه for بازنویسی می‌کنیم:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

تابع (range(stop:

این تابع [

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
] یک شی از نوع range را برمی‌گرداند؛ این شی یک دنباله تغییر ناپذیر است که معمولا از آن برای پیمایش در حلقه for استفاده می‌شود. با تبدیل شی range به نوع لیست خواهیم دید که این شی یک دنباله مرتب از اعداد صفر تا آرگومان stop (و نه خود آن) است؛ آرگومان stop می‌بایست یک عدد صحیح مثبت باشد:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

این تابع را می‌توان به صورت دو آرگومانی ((range(start, stop) نیز فراخوانی نمود که آرگومان یکم عدد آغازین دنباله را تعیین می‌کند و می‌تواند یک عدد منفی نیز باشد:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

در این حالت می‌توان از آرگومان سومی نیز برای تعیین گام یا فاصله بین اعداد بهره گرفت:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
  • هر سه آرگومان می‌بایست از نوع صحیح باشند.
  • برای تعیین آرگومان stop منفی، می‌بایست آرگومان گام را نیز به شکل منفی تعیین نمود:
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

در نسخه‌های 2x پایتون دو نسخه از این تابع وجود دارد: تابع range [

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
] و تابع xrange [
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
].

خروجی تابع range یک شی از نوع لیست است:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

ولی خروجی تابع xrange یک شی از نوع xrange می‌باشد:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

خروجی تابع xrange ساده‌تر و بهینه تر از خروجی تابع range است بنابراین معمولا پیشنهاد می‌شود که در حلقه for از تابع xrange استفاده شود؛ به همین دلیل می‌باشد که تابع range در نسخه‌های 3x پایتون حذف شده است و تنها تابع xrange باقی‌مانده که با نام و نوع range پیاده‌سازی شده است.

  • چگونگی استفاده و تعداد آرگومان‌های هر دو تابع همانند نسخه 3x است که پیش از این بررسی شد.

چند مثال‌ ساده دیگر:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

می‌توان نتایج حلقه for را مستقیم در یک شی لیست قرار داد؛ برای نمونه دستور پایین را در نظر بگیرید:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

که می‌توان خیلی ساده آن را به صورت پایین بازنویسی کرد:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

و به عنوان مثال‌هایی دیگر به نمونه کدهای پایین توجه نمایید:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

از دستورهای مرکب پایتون می‌توان در داخل بدنه یکدیگر بهره برد که البته این موضوع برای دستورهای for و while نیز صادق است. از هر دو این دستورها می‌توان بر حسب نیاز در داخل بدنه یکدیگر یا به شکل تودرتو استفاده کرد:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

به نمونه کد بالا توجه نمایید؛ با هر بار تکرار حلقه یکم تمام دستورهای بدنه آن که شامل یک حلقه دیگر است اجرا می‌گردد. از متغیر i درون حلقه داخلی نیز استفاده شده است. در بار نخستِ اجرای حلقه بیرونی مقدار i برابر عدد 1 قرار داده می‌شود که در این صورت اجرای حلقه داخلی تنها یک بار تکرار می‌گردد (1 == ((len(range(0, 1) و یک مقدار 1 در خروجی نمایش داده می‌شود،‌ بار دوم i برابر عدد 2 می‌شود و در نتیجه حلقه داخلی دو بار تکرار می‌گردد که بر اثر آن دو مقدار 2 در خروجی چاپ می‌گردد. این روند تا پایان تکرار حلقه بیرونی ادامه می‌یابد.

تابع (یا دستور) print به صورت پیش‌فرض پس از اجرا و چاپ مقدار به سطر بعدی می‌رود.

اگر از پیش با زبان‌هایی نظیر C یا Java آشنایی دارید؛ برای درک بهتر ساختار حلقه for پایتون نمونه کد پایین که به زبان Java است را در نظر بگیرید:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

که می‌توانیم آن را توسط زبان پایتون به شکل پایین پیاده‌سازی نماییم:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

تابع (enumerate(iterable:

علاوه‌ بر تابع ()range در حلقه‌های for می‌توانیم از تابع ()enumerate [

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
] نیز استفاده کنیم. این تابع یک شی دنباله یا تکرارکننده را به عنوان آرگومان دریافت می‌کند و یک شی از نوع enumerate برمی‌گرداند:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

با تبدیل این شی به یک شی لیست مشاهده می‌شود که این شی عضوهای آرگومان ورودی خود را به شکل جفت‌هایی به همراه اندیس موقعیت آن‌ها ذخیره کرده است (index, value):

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

استفاده از این تابع در مواقعی که پیمایش یک دنباله غیر عددی یا بررسی اندیس دنباله حلقه را در نظر داشته باشید بسیار مفید است:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

این تابع همچنین یک آرگومان اختیاری با نام start دارد که با مقدار دادن به آن می‌توان عدد ابتدایی شمارش اندیس‌ها را تعیین نمود؛ مقدار پیش‌فرض این آرگومان عدد صفر است:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

شی تکرارکننده

در این بخش قصد داریم با مفهوم iterator (تکرارکننده) در پایتون آشنا شویم. برای این منظور بهتر است ابتدا مفهوم iterable (تکرارپذیر) را بدانیم.

تمام انواع دنباله یک iterable هستند؛ در واقع به اشیایی با این قابلیت که بتوان در هر لحظه یک عضو درون آن را دستیابی نمود iterable گفته می‌شود. اکثر انواع آماده شی که در پایتون می‌شناسیم یک iterable است؛ انواع شی رشته، لیست، تاپل، دیکشنری، range ،zip (یا xrange) یا یک شی فایل (file) و هر شی از کلاسی که خودتان به همراه متد‌های ویژه ()__iter__ یا ()__getitem__ تعریف نمایید یک iterable هستند.

شی iterator با استفاده از تابع آماده ()iter [

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
] ایجاد می‌شود؛ این تابع یک شی iterable را به عنوان آرگومان دریافت می‌کند و آن را در قالب یک شی iterator بر می‌گرداند:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

یک شی iterator این قابلیت را دارد که می‌توان عضوهای درون آن را یکی یکی با استفاده از متد ()__next__ (یا ()next در پایتون 2x) پیمایش کرد؛ این متد در بار نخستِ فراخوانی عضو یکم شی و در دفعات بعدی فراخوانی به ترتیب عضوهای بعدی را برمی‌گرداند:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

با فراخوانی پی در پی این متد و رسیدن به انتهای پیمایش؛ زمانی که دیگر عضوی برای برگرداندن وجود ندارد یک خطا - البته درست این است که بگوییم یک استثنا (Exception) - با نام StopIteration گزارش می‌گردد:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

این دقیقا همان کاری است که در دستور for به انجام می‌رسد. زمانی که از یک دنباله برای پیمایش در این دستور استفاده می‌کنید؛ for در پشت صحنه آن را به یک iterator تبدیل و سپس پیمایش یک به یک عضوها را آغاز می‌کند. در هر لحظه‌ که StopIteration رخ دهد، متوجه پایان دنباله شده و تکرار حلقه را پایان می‌بخشد.

در آینده توسط درس استثنا‌ها در پایتون خواهید دید که می‌توان با ایجاد iterator و استفاده از دستور try/except [که در همان درس خواهید آموخت] یک حلقه while را به مانند حلقه for پیاده‌سازی کرد.

با استفاده از ماژول itertools می‌توانید iterator های بی‌نهایت (Infinite) یا بدون توقف ایجاد نمایید. برای نمونه تابع cycle درون این ماژول، شی iterator ای می‌سازد که در انتهای پیمایش متوقف نمی‌شود و از نو به ابتدای شی برگشته و عضو یکم را برمی‌گرداند:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

این ماژول شامل تابع‌های کاربردی بسیاری است که برای مطالعه بیشتر می‌توانید به صفحه آن در

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
مراجعه نمایید.

لینک به دیدگاه

ورودی و خروجی

موضوع این درس به چگونگی دریافت یا خواندن داده‌ها از کاربر حالت تعاملی یا فایل‌ها و همچنین نمایش یا نوشتن در آن‌ها اختصاص یافته است؛ بر همین اساس در متن درس به بررسی شی فایل و تابع‌های آماده ()print و ()input در پایتون پرداخته خواهد شد. به برخی از تفاوت‌ها در پیاده‌سازی نسخه جدید پایتون (شاخه 3x) که به موضوع این درس مربوط می‌باشند نیز اشاره شده است.

فایل ها

فایل‌ها (Files) جزو منابع منطقی کامپیوتر به شمار می‌روند، توسط سیستم عامل مدیریت می‌شوند و امکانی برای نگهداری طولانی مدت از اطلاعات می‌باشند. فایل‌ها در واقع بیت‌هایی متوالی از صفر و یک هستند که بر روی دیسک ذخیره گشته‌اند و معمولا در دو قالب جداگانه:

  • «فایل‌‌ باینری» (binary file) - مانند: فایل‌های ویدئو، فایل‌های تصویر، فایل zip، فایل بایت‌کد پایتون و...
  • «فایل‌ متنی» (text file) - مانند: فایل HTML، فایل ماژول پایتون و...

شناخته می‌شوند.

همانطور که گفته شد فایل‌ها چیزی جز مجموعه‌ای از مقدارهای باینری (یا دودویی) نیستند و فایل‌های متنی نیز در واقع یک زیر مجموعه از فایل‌های باینری است با این تفاوت که بیت‌های یک فایل متنی در کنار هم، بسته به نوع کدگذاری آن متناظر با دنباله‌ای از کاراکترهایی مشخص و قابل چاپ هستند. محتوای این نوع فایل در سطرهایی جداگانه قرار داده می‌شود و با استفاده از برنامه‌های ویرایشگر متن برای انسان خوانا می‌باشد. در یک فایل متنی با کدگذاری ASCII (اَسکی) هر هشت بیت (یک بایت) برابر یک کاراکتر می‌باشد - کدهای اسکی هفت بیتی هستند ولی در اکثر کامپیوترها برای هر کدام یک بایت در نظر گرفته می‌شود - برای نمونه کلمه Python به شکل شش بایت که هر کدام به ترتیب برابر مقدار باینری کد اسکی هر یک از این کاراکترها می‌باشد، ذخیره می‌شود. اسکی تنها از ۱۲۸ کاراکتر - از کد ۰ تا ۱۲۷ (در پایه ده) - پشتیبانی می‌کند و به همین دلیل امروزه بیشتر از کدگذاری‌های استاندارد Unicode (یونیکد) استفاده می‌گردد. در یونیکد مجموعه بسیار بزرگتری از کاراکتر نسبت به کدگذاری اسکی پشتیبانی می‌شود به گونه‌ای که اسکی را نیز در برمی‌گیرد؛ برای نمونه در کدگذاری UTF-8 از این استاندارد، ۱۲۸ کد نخست (از کد ۰ تا ۱۲۷) برابر کد همان ۱۲۸ کاراکتر اسکی می‌باشد. کدگذاری UTF-8 کاراکترهای یونیکد را در یک دنباله بایت با طول متغیر (۱ تا ۶ بایت) ارايه می‌دهد؛ در این کدگذاری برای کاراکترهای اسکی تنها یک بایت در نظر گرفته می‌شود.

در یک فایل باینری وجود سطر مفهومی ندارد و بایت‌های آن ممکن است داده‌هایی را نمایش دهند که نمی‌توان آن‌ها را توسط هیچ یک از کدگذاری‌های کاراکتر (UTF-8 ،ASCII و...) چاپ کرد یا حتی ممکن است در صورت چاپ آن‌ها نیز حاصل برای انسان غیر قابل فهم باشد.

پایتون یک نوع شی آماده برای دستیابی فایل‌ها در برنامه ارایه می‌دهد که این شی با استفاده از تابع آماده  (open(file, mode [

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
] ایجاد می‌گردد؛ آرگومان نخست یک شی رشته حاوی نام کامل فایل (نشانی + نام + پسوند) مورد نظر بر روی دیسک کامپیوتر است و آرگومان دوم نیز یک رشته با مقداری خاص است و حالتی که این فایل می‌بایست در آن باز شود را مشخص می‌سازد؛ این آرگومان اختیاری است و مقدار پیش‌فرض آن 'r' می‌باشد. برای نمونه به کدهای پایین که با یکدیگر معادل هستند توجه نمایید:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

مسیر نمونه فایل بالا بر اساس سیستم فایل لینوکس درج شده است که در ویندوز برای مثال می‌تواند به یکی از دو شکل پایین درج گردد:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

آرگومان file را می‌توان تنها با نام خالی فایل و بدون ذکر مسیر آن مقداردهی کرد؛ در این صورت مفسر پایتون مسیر دایرکتوری جاری را برای آن در نظر می‌گیرد. با استفاده از تابع ()getcwd از ماژول os [

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
] می‌توانیم مسیر دایرکتوری جاری برنامه را به دست آوریم.

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

آرگومان mode نیز بر حسب نیاز می‌تواند یکی از مقدارهای پایین را داشته باشد:

  • 'r': فایل در قالب متنی تنها به منظور خواندن از آن باز می‌شود و اشاره‌گر در ابتدای آن قرار می‌گیرد. چنانچه فایلی با این نام موجود نباشد یک خطا (یا استثنا) FileNotFoundError گزارش می‌گردد. معادل 'rt'
  • 'w': فایل در قالب متنی تنها به منظور نوشتن در آن باز می‌شود؛ متن درون آن (در صورت وجود) پاک می‌شود و اشاره‌گر در ابتدای آن قرار می‌گیرد. چنانچه فایلی با این نام موجود نباشد، ابتدا ایجاد و سپس باز می‌شود. معادل 'wt'
  • 'a': فایل در قالب متنی تنها به منظور افزودن متنی در انتهای متن موجود در آن باز می‌شود؛ اشاره‌گر در انتهای فایل قرار دارد. چنانچه فایلی با این نام موجود نباشد، ابتدا ایجاد و سپس باز می‌شود. معادل 'at'
  • 'x': فقط در پایتون exclusive creation) - 3x) فایل در قالب متنی ایجاد و به منظور نوشتن در آن باز می‌شود؛ چنانچه این فایل از پیش موجود باشد یک خطا (یا استثنا) FileExistsError گزارش می‌گردد. معادل 'xt'
  • 'rb' و 'wb' و 'ab' و 'xb': همان توضیح گزینه‌های مشابه بالا را دارند ولی با این تفاوت که برای کار با فایل‌هایی در قالب باینری استفاده می‌شوند.
  • '+r': فایل در قالب متنی به منظور خواندن و نوشتن باز می‌شود و اشاره‌گر در ابتدای آن قرار می‌گیرد. چنانچه فایلی با این نام موجود نباشد یک خطا (یا استثنا) FileNotFoundError گزارش می‌گردد. توجه داشته باشید که در این حالت عمل نوشتن از همان ابتدای فایل، باعث جایگزین شدن متن جدید با متن حاضر می‌شود. معادل '+rt' یا 'r+t'
  • '+w': فایل در قالب متنی به منظور نوشتن و خواندن باز می‌شود؛ متن درون آن (در صورت وجود) پاک می‌شود و اشاره‌گر در ابتدای آن قرار می‌گیرد. چنانچه فایلی با این نام موجود نباشد، ابتدا ایجاد و سپس باز می‌شود. معادل '+wt' یا 'w+t'
  • '+a': فایل در قالب متنی به منظور افزودن متنی در انتهای متن موجود در آن و همچنین خواندن باز می‌شود؛ اشاره‌گر در انتهای فایل قرار دارد. چنانچه فایلی با این نام موجود نباشد، ابتدا ایجاد و سپس باز می‌شود. معادل '+at' یا 'a+t'
  • '+x': فقط در پایتون 3x - فایل در قالب متنی ایجاد و به منظور نوشتن و خواندن باز می‌شود؛ چنانچه این فایل از پیش موجود باشد یک خطا (یا استثنا) FileExistsError گزارش می‌گردد. معادل '+xt' یا 'x+t'
  • '+rb' یا 'r+b' و '+wb' یا 'w+b' و '+ab' یا 'a+b' و '+xb' یا 'x+b': همان توضیح گزینه‌های مشابه بالا را دارند ولی با این تفاوت که برای کار با فایل‌هایی در قالب باینری استفاده می‌شوند.
  • 'rU': خواندن یک فایل متنی با پشتیبانی از Universal Newline. معادل 'rtU'
  • 'rbU': خواندن یک فایل باینری با پشتیبانی از Universal Newline.

که در آن‌ها:

  • r: خواندن (read)
  • w: نوشتن (write)
  • a: درج در انتها (appending)
  • t: تعیین قالب متنی (text) برای فایل مورد نظر؛ قالب پیش‌فرض است و نیازی به درج آن نیست
  • b: تعیین قالب باینری (binary) برای فایل مورد نظر
  • +: فایل به منظور بروز رسانی (updating) باز می‌شود
  • U: حالت Universal Newline

در قرارداد سیستم‌های عامل گوناگون از رشته‌های مختلفی - که می‌تواند از یک یا چند کاراکتر تشکیل شده باشد - برای نشانه‌گذاری انتهای سطرهای یک فایل متنی استفاده شده است؛ برای نمونه در ویندوز از CRLF (یا 'r\n\') و در گنولینوکس از LF (یا 'n\') استفاده می‌شود. شی فایل پایتون به صورت پیش‌فرض از همان قرارداد سیستم عامل میزبان برای تعیین رشته Newline خود استفاده می‌کند؛ ولی چنانچه قصد دارید در پایتون فایلی با قرارداد سیستم عامل دیگری را به منظور خواندن باز نمایید می‌بایست این کار را در حالت Universal Newline انجام دهید. در این حالت به هنگام خواندن از یک فایل، پایتون تمام رشته‌های Newline موجود در فایل را به کاراکتر 'n\' نگاشت می‌کند [

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
]؛ دستور os.linesep [
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
] رشته Newline سیستم عامل میزبان را برمی‌گرداند:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

باز کردن یک فایل به منظور خواندن از آن حکم یک منبع ورودی (input) و باز کردن یک فایل به منظور نوشتن در آن حکم یک منبع خروجی (output) را در برنامه دارد.

تابع ()open آرگومان‌های اختیاری دیگری نیز دارد که برای بررسی آن‌ها می‌توانید به اسناد پایتون مراجعه نمایید.

متدهای شی فایل

(write(string: یک شی از نوع str یا bytes را دریافت می‌کند و آن را درون شی فایل مورد نظر می‌نویسد:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

در پایتون 3x، متد write تعداد کاراکترهایی که می‌نویسد را برمی‌گرداند.

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

در پایتون 3x به این دلیل که نوع رشته‌های باینری (bytes) از رشته‌های معمولی (str) جدا گشته است، نمی‌توان از شی str برای نوشتن در فایلی که در حالت باینری باز شده است استفاده کرد.

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

در رفتار گنولینوکس تفاوتی بین حالت متنی و باینری وجود ندارد؛‌ اکنون اگر هر دو فایل textfile.txt و binaryfile.bin را (در گنولینوکس) توسط برنامه ویرایشگر متن باز نمایید، خواهید دید که محتوای این دو فایل مشابه یکدیگر نمایش داده می‌شوند.

در گنولینوکس، باز کردن فایل textfile.txt توسط یک برنامه ویرایشگر متن:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

در گنولینوکس، باز کردن فایل binaryfile.bin توسط یک برنامه ویرایشگر متن:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

ولی در ویندوز به هنگام حالت متنی، اگر یک فایل را به منظور خواندن باز نمایید کاراکترهای 'n\' موجود در آن به شکل 'r\n\' برگردانده می‌شوند و اگر که یک فایل را به منظور نوشتن باز کنید، هر بار رشته 'r\n\' به جای 'n\' نوشته می‌شود. در حالت باینری این کارها انجام نمی‌شود.

اگر دستورهای یاد شده را در ویندوز اجرا نماییم؛ دو فایل مورد نظر با محتوای پایین توسط برنامه ویرایشگر متن نمایش داده خواهند شد.

در ویندوز، باز کردن فایل textfile.txt:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

در ویندوز، باز کردن فایل binaryfile.bin:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

به نمونه‌ کدهای بالا در پایتون 2x نیز توجه نمایید:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
  • ()close: پس از پایان کار با هر فایل می‌بایست که آن را ببندید؛ این متد فایل باز شده را می‌بندد. شی فایل مورد نظر پس از فراخوانی این متد، هیچ متد دیگری را نمی‌تواند فراخوانی کند.

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

همچنین برای بررسی اینکه یک فایل باز است یا اینکه بسته شده است می‌توانید از صفت closed استفاده نمایید؛ این صفت در صورتی که فایل بسته شده باشد حاوی مقدار True می‌باشد:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
  • ()read: تمام محتوای فایل را می‌خواند و در قالب یک شی از نوع str - برای فایل‌های متنی در هر دو شاخه پایتون و باینری در پایتون 2x - یا bytes - برای فایل‌های باینری در پایتون 3x - برمی‌گرداند:
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

این متد یک آرگومان اختیاری نیز دارد؛ این آرگومان یک عدد صحیح است که تعداد کاراکتر (یا بایت) که می‌بایست از فایل خوانده و برگردانده شوند را تعیین می‌کند:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

به نمونه کد بالا توجه نمایید؛ هنگامی که فایل در این حالت (rt) باز شده است اشاره‌گر در ابتدای فایل قرار گرفته و با هر میزان خواندن از فایل، موقعیت اشاره‌گر نیز به جلو حرکت داشته است.

  • ()readline: در هر فراخوانی یک سطر از فایل - تا رشته Newline - را برمی‌گرداند:
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
  • ()readlines: تمام سطرهای یک فایل را در قالب یک شی لیست بر می‌گرداند:
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
  • (writelines(list: یک شی لیست که تمام اعضای آن از نوع str هستند را به عنوان آرگومان گرفته و اعضای آن را به ترتیب در فایل مورد نظر می‌نویسد:
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

حاصل کد بالا؛ باز کردن فایل tf.txt توسط یک برنامه ویرایشگر متن:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
  • (seek(offset: آرگومان offset یک عدد صحیح است و این متد موقعیت اشاره‌گر فایل را به آن offset نسبت به ابتدای فایل تغییر می‌دهد:
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
  • ()flush: باعث ذخیره محتوای بافر در فایل می‌شود.

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

دستور for

از تابع ()open نیز می‌توان در حلقه for استفاده کرد؛ در این صورت در هر بار تکرار سطرهای فایل پیمایش می‌شوند:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

از آنجا که متن درون فایل خود حاوی Newline (در اینجا: 'n\') است، آرگومان end تابع ()print را برای جلوگیری از درج 'n\' در انتهای هر سطر تغییر دادیم.

دستور with/as

یک دستور مرکب است که از اشیایی که با نوع ”Context Manager“ [

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
] در پایتون شناخته می‌شوند، پشتیبانی می‌کند [
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
]. برخی از اشیا در پایتون - به مانند شی فایل - قابلیتی با نام ”Context Manager“ دارند؛ برای پیاده سازی این قابلیت، کلاس شی مورد نظر می‌بایست حاوی دو متد ویژه ()__enter__ و ()__exit__ باشد که به ترتیب در زمان‌های «ورود به» و «خروج از» بدنه دستور with/as فراخوانی می‌شوند.

دستور with/as ساختاری مشابه پایین دارد:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

در این ساختار، expression نماد بخشی از دستور است که یک شی از نوع Context Manager را برمی‌گرداند؛ این شی با استفاده از کلمه کلیدی as به یک متغیر ارجاع داده می‌شود. برای نمونه ساختار with/as مربوط به یک شی فایل در پایین نوشته شده است:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

پس از ایجاد شی فایل، این شی می‌بایست وارد اجرای دستور with/as شود؛ with/as این کار را با فراخوانی متد ()__enter__ انجام می‌دهد. در واقع این متد همان شی فایل ایجاد شده را برمی‌گرداند که در ادامه توسط as به متغیر output ارجاع داده می‌شود. همچنین با استفاده از این ساختار دیگر نیازی به فراخوانی متد ()close برای شی فایل نمی‌باشد؛ چرا که این کار پس از پایان دستورهای بدنه با فراخوانی شدن متد ()__exit__ توسط with/as به انجام می‌رسد؛ در واقع with/as بستن فایل را در پایان اجرای دستورهای بدنه خود تضمین می‌کند. همچنین در این ساختار چنانچه هنگام کار با فایل خطایی (یا استثنایی) رخ دهد، پیش از گزارش آن، ابتدا فایل بسته خواهد شد.

توجه داشته باشید که یک شی فایل همیشه باید بسته شود؛ در مواقعی که قصد استفاده از حلقه for برای یک شی فایل را دارید بهتر است از آن درون ساختار with/as بهره بگیرید:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

از دستور with/as می‌توان به شکل تودرتو نیز بهره گرفت:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

همچنین به نسخه‌های 2.7 و از 3.1 به بعد پایتون سینتکس جدیدی افزوده شده است که توسط آن می‌توان همزمان از چند Context Manager بهره گرفت:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

به مانند نمونه کد پایین که دو فایل را باز می‌کند؛ از یکی می‌خواند و برخی از سطرهای آن را در فایل دیگر می‌نویسد:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

 

لینک به دیدگاه

شی فایل استاندارد

سه نوع شی فایل توسط مفسر پایتون ایجاد می‌گردد که هر سه آن‌ها توسط ماژول sys در دسترس هستند:

  • sys.stdin: ورودی استاندارد [
    برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
    ]؛ برای دستیابی تمامی ورودی‌ها در حالت تعاملی پایتون - مانند فراخوانی تابع ()input - از این شی استفاده می‌گردد.
  • sys.stdout: خروجی استاندارد [
    برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
    ]؛ توسط print مورد استفاده قرار می‌گیرد.
  • sys.stderr: خطا استاندارد [
    برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
    ]؛ شی‌ای است که خطاها را دریافت می‌کند.

نه همیشه ولی می‌توان منبع sys.stdin را صفحه‌کلید کامپیوتر و منبع sys.stdout و sys.stderr را نیز صفحه‌نمایش در نظر گرفت.

لینک به دیدگاه

تابع ()input

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

پایتون 2x:

  • ()raw_input
  • ()input

در این شاخه از پایتون دو تابع ()raw_input [

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
] و ()input [
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
] برای همین منظور در دسترس است. تابع ()raw_input یک سطر از کاربر را می‌خواند و در قالب یک شی از نوع str برمی‌گرداند:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

با اجرا دستور سطر یکم، مفسر پایتون منتظر ورود متن می‌ماند - در این نمونه متن Hello Python نوشته می‌شود - سپس با دریافت کلید Enter تمام کاراکترهای دریافتی را در قالب یک شی رشته - نوع str - به متغیر s ارجاع می‌دهد:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

همچنین می‌توان متنی را برای مشاهده کاربر به صورت آرگومان در فراخوانی تابع قرار داد:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

تابع ()input در پایتون 2x نیز عملکردی برابر با دستور (()eval(raw_input دارد. ()eval [

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
] تابع آماده دیگری در پایتون است که یک شی رشته را دریافت و متن آن را به شکل کد پایتون تفسیر می‌کند:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

به نمونه کدهای پایین نیز توجه نمایید:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

تابع ()__import__ [

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
] عملکردی برابر با دستور import دارد ولی با این تفاوت که می‌توان از آن به شکلی پویا در طی اجرای برنامه برای وارد کردن ماژول‌های گوناگون استفاده نمود؛ در این حالت نام یک ماژول حتی می‌تواند به شکل یک متغیر در آرگومان تابع قرار بگیرد.

اکنون که با عملکرد تابع ()eval آشنا شده‌اید به بیان مثال‌هایی از تابع ()input - در نسخه‌های 2x - می‌پردازیم:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

در نمونه کد بالا؛ ورودی کاربر - متن Alen - با هیچ سینتکس تعریف شده‌ای در پایتون مطابقت نداشته و باعث بروز خطا گشته است:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

و مثالی دیگر:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

پایتون 3x:

  • ()input

در این شاخه از پایتون تابع ()input از شاخه 2x وجود ندارد (حذف شده) و تنها تابع ()raw_input باقی مانده است که آن هم به ()input [

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
] تغییر نام پیدا کرده است.

تابع ()input در پایتون 3x همانند تابع ()raw_input در پایتون 2x است:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

 

لینک به دیدگاه

تابع print()

پایتون 2x:

در این شاخه از پایتون print به شکل یک دستور ساده در پایتون پیاده‌سازی شده است [

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
]. این دستور یک یا چند شی را ابتدا به نوع str تبدیل کرده و سپس به خروجی می‌فرستد:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
  • اشیا می‌بایست توسط یک کاما , از یکدیگر جدا شوند.
  • این دستور به صورت پیش‌فرض یک حرف فاصله (یک کلید Space) در بین اشیا قرار می‌دهد.
  • در صورتی که یک عبارت محاسباتی یا منطقی به این دستور داده شود، ابتدا حاصل آن محاسبه یا ارزیابی شده و سپس به نوع str تبدیل می‌گردد.
  • دستور print به شکل تنها، یکی سطر خالی را ایجاد می‌کند.

دستور print همچنین به صورت پیش‌فرض یک 'n\' در انتهای هر سطر قرار می‌دهد؛ برای لغو این رفتار می‌توان در انتهای دستور یک کاما , قرار داد:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

این دستور توانایی نوشتن در شی فایلی غیر از شی استاندارد را نیز دارد؛ برای این منظور می‌بایست از الگوی پایین پیروی گردد:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

پایتون 3x:

دستور print به شکل تابع ()print در نسخه‌های 3x پایتون پیاده‌سازی شده است [

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
]؛ الگوی این تابع به شکل پایین می‌باشد:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
  • sep: رشته‌ای که می‌بایست بین اشیا قرار گیرد را تعیین می‌کند. مقدار این آرگومان در حالت پیش‌فرض یک حرف فاصله (یک کلید Space) است. مقدار ارسالی به این آرگومان می‌بایست یک شی رشته یا None باشد:
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
  • end: رشته‌ای که می‌بایست در انتهای هر سطر قرار گیرد را تعیین می‌کند. مقدار این آرگومان در حالت پیش‌فرض 'n\' است. مقدار ارسالی به این آرگومان می‌بایست یک شی رشته یا None باشد:
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

file: خروجی را تعیین می‌کند که می‌بایست یک شی به همراه متد (write(string درون کلاس خود، باشد. این آرگومان به صورت پیش‌فرض بر روی خروجی استاندارد مقداردهی شده است. این تابع قابلیت استفاده در حالت باینری فایل‌ها را ندارد:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
  • flush: این آرگومان از نسخه 3.3 به تابع ()print پایتون افزوده شده است. هنگامی که خروجی بر روی یک فایل قرار گرفته باشد؛ با تنظیم این گزینه بر روی مقدار True، عمل انتقال متن به فایل بدون اتلاف وقت انجام می‌پذیرد.

این تابع با استفاده از دستور import پایین در نسخه‌های 2.6 و 2.7 پایتون نیز در دسترس است [

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
]:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
لینک به دیدگاه
  • 3 هفته بعد...

کتابخانه استاندارد

کتابخانه استاندارد پایتون مجموعه‌ وسیعی از امکانات آماده است که با نصب پایتون در اختیار قرار می‌گیرد. فهرست کامل این امکانات را می‌توانید از نشانی‌های

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

math

این ماژول حاوی ثابت‌ها (Constants) و تابع‌های ریاضی است [

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
] که برخی از آن‌ها به شرح پایین است:

  • math.pi: ثابتی حاوی عدد π (
    برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
    ) است [
    برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
    ]:
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
  • math.e: ثابتی حاوی عدد e (
    برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
    ) است [
    برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
    ]:
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
  • math.inf: (از نسخه 3.5 به بعد) - ثابتی حاوی مقدار مثبت بی‌نهایت (Positive infinity) است که این مقدار برابر با خروجی تابع ('float('inf می‌باشد. math.inf - نیز برابر منفی بی‌نهایت است [
    برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
    ].

برای بررسی inf بودن (مثبت یا منفی) از تابع (math.isinf(x [

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
] استفاده می‌شود:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
  • math.nan: از نسخه 3.5 به بعد - ثابتی حاوی مقدار «تعریف نشده» یا NaN - اختصار Not a Number (
    برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
    ) - می‌باشد که این مقدار برابر با خروجی تابع ('float('nan است [
    برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
    ].

برای بررسی nan بودن از تابع (math.isnan(x [

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
] استفاده می‌شود:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
  • (math.ceil(x: کوچکترین عدد صحیحی که بزرگتر یا مساوی با عدد x باشد را برمی‌گرداند [
    برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
    ]:
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
  • (math.floor(x: بزرگترین عدد صحیحی که کوچکتر یا مساوی با عدد x باشد را برمی‌گرداند [
    برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
    ]:
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
  • (math.fabs(x: همانند تابع آماده ()abs [
    برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
    ] مقدار قدر مطلق (
    برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
    ) عدد x را برمی‌گرداند [
    برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
    ]:
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
  • (math.factorial(x: مقدار فاکتوریل (
    برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
    ) عدد x را برمی‌گرداند [
    برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
    ]:
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
  • (math.exp(x: حاصل e**x (
    برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
    ) را برمی‌گرداند [
    برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
    ]:
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
  • (math.log(x[, base]: حاصل لگاریتم (Logarithm) عدد x در پایه base را برمی‌گرداند؛ آرگومان base اختیاری است و چنانچه ذکر نگردد به صورت پیش‌فرض حاصل لگاریتم عدد x در پایه عدد e یا همان لگاریتم طبیعی (
    برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
    ) برگردانده می‌شود [
    برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
    ]:
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

برای سادگی استفاده در محاسبه‌های ریاضی دو تابع (log10(x [

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
] - محاسبه لگاریتم عدد x در پایه عدد 10 - و (log2(x [
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
] - محاسبه لگاریتم عدد x در پایه عدد 2؛ که از نسخه 3.3 به بعد اضافه شده است - نیز در دسترس هستند:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
  • (math.sqrt(x: ریشه دوم (Square root) یا همان جذر (
    برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
    )‌ عدد x را برمی‌گرداند [
    برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
    ]:
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
  • (math.pow(x, y: عدد x را به توان عدد y می‌رساند و حاصل را برمی‌گرداند [اسناد پایتون]:

این تابع هر دو آرگومان خود را به نوع float تبدیل می‌کند؛ چنانچه می‌خواهید با اعداد صحیح کار کنید، از عملگر ** یا تابع آماده ()pow [

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
] استفاده نمایید:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
  • توابع مثلثاتی (Trigonometric functions) [
    برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
    ]:  (cos(x و (sin(x و (tan(x و (acos(x و (asin(x و (atan(x که در تمام آن‌ها زاویه x بر حسب رادیان (Radian) است:
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
  • (math.degrees(x: زاویه x را از رادیان به درجه تبدیل می‌کند [
    برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
    ]:
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
  • (math.radians(x: زاویه x را از درجه به رادیان تبدیل می‌کند [
    برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
    ]:
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
  • توابع هذلولی (Hyperbolic functions) [
    برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
    ]:  (cosh(x و (sinh(x و (tanh(x و (acosh(x و (asinh(x و (atanh(x.
لینک به دیدگاه
  • 2 هفته بعد...

OS

این ماژول امکان استفاده از برخی قابلیت‌های وابسته به سیستم عامل را فراهم می‌آورد؛ مانند گرفتن مسیر دایرکتوری برنامه [

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
]. برخی از تابع‌های موجود در این ماژول به شرح پایین است:

  • os.environ: یک شی از نوع نگاشت - مانند نوع دیکشنری - است که حاوی متغیرهای محیطی سیستم عامل می‌باشد [
    برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
    ]

باید توجه داشت که مقدار این دستور متناسب با لحظه‌ای از سیستم عامل است که ماژول os به اسکریپت import شده است و شامل متغیرهایی که پس از این لحظه ایجاد شده باشند نمی‌شود.

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
  • ()os.getcwd: مسیر دایرکتوری جاری (Current Working Directory)‌ را برمی‌گرداند. خروجی این تابع برابر با دستور pwd در خط فرمان گنولینوکس یا %echo %CD در خط فرمان ویندوز می‌باشد. [
    برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
    ]:
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
  • (os.chdir(path: مسیر دایرکتوری جاری را به مسیر آرگومان دریافتی path تغییر می‌دهد. عملکرد این تابع برابر با دستور cd در خط فرمان‌های گنولینوکس و ویندوز است. [
    برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
    ]:
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
  • (os.listdir(path: یک شی لیست که شامل محتویات درون دایرکتوری path است را برمی‌گرداند. چنانچه آرگومان path ارسال نشود به صورت پیش‌فرض مسیر دایرکتوری جاری در نظر گرفته می‌شود. [
    برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
    ]
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
  • (os.mkdir(path: یک دایرکتوری که نام کامل آن توسط آرگومان path تعیین شده است را ایجاد می‌کند. در صورتی که این دایرکتوری از قبل موجود باشد یک استثنا FileExistsError رخ می‌دهد. [
    برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
    ]:
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

در نمونه کد بالا از آنجا که مسیر دایرکتوری ذکر نشده است؛ دایرکتوری dir1 به صورت پبش فرض در مسیر دایرکتوری جاری (که در اینجا: /home/saeid/ است) ایجاد می‌گردد؛ همین امر باعث بروز استثنا با اجرای دستور پایین می‌شود:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

نمونه کد بالا موجب ایجاد دایرکتوری dir2 درون مسیر دایرکتوری Documents می‌شود.

مسیر دایرکتوری می‌بایست به صورت صحیح وارد شود؛ در نمونه کد پایین نیز به همین دلیل که دایرکتوری dir3 وجود ندارد، استثنایی رخ داده است.

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
  • (os.makedirs(path: همانند (os.mkdir(path است ولی با این تفاوت که تمامی دایرکتوری‌های میانی مورد نیاز را هم ایجاد می‌کند. [
    برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
    ]

در نمونه کد پایین برای ایجاد دایرکتوری dir5 دایرکتوری‌های dir3 و dir4 - که البته وجود ندارند - نیز ایجاد می‌گردند.

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
  • (os.rmdir(path: دایرکتوری مشخص شده توسط آرگومان path را حذف می‌کند. این دایرکتوری می‌بایست خالی باشد در غیر این صورت یک استثنا OSError رخ می‌دهد. [
    برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
    ]

البته برای حذف کامل یک دایرکتوری به همراه تمام محتویات آن می‌توانید از تابع (rmtree(path درون ماژول shutil [

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
] استفاده نمایید:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
  • (os.removedirs(path: همانند (os.rmdir(path است ولی با این تفاوت که عملکردی بازگشتی دارد و تا زمانی که خطایی رخ نداده دایرکتوری‌های مشخص شده در آرگومان path را یکی یکی حذف می‌کند. [
    برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
    ]
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

در نمونه کد بالا ابتدا دایرکتوری dir3 (با مسیر 'home/dir1/dir2/dir3/') حذف می‌شود - البته اگر خالی باشد - و بعد از آن برای حذف دایرکتوری dir2 (با مسیر 'home/dir1/dir2/') تلاش می‌شود که اگر آن‌هم خالی باشد و حذف گردد، روند حذف به همین شکل برای باقی مسیر ادامه می‌یابد.

  • (os.rename(src, dst: این تابع برای تغییر نام یک فایل یا دایرکتوری کاربرد دارد. آرگومان src نام اصلی و آرگومان dst نیز نام جدید برای فایل یا دایرکتوری مورد نظر می‌باشند [
    برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
    ]:
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

توجه داشته باشید چنانچه فایل یا دایرکتوری موردنظر در مسیری دیگری از مسیر دایرکتوری جاری باشد؛ لازم است نام به شکل کامل (همراه با مسیر) ذکر گردد. همچنین بدیهی است که تغییر مسیر در آرگومان dst موجب عمل انتقال (Move) می‌شود:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

در گنولینوکس چنانچه بخواهیم نام فایلی به یک نام از پیش موجود تغییر داده شود؛‌ [در صورتی که کاربر نیز اجازه دسترسی (Permission) لازم را داشته باشد] یک عمل جایگزینی (Replace) صورت می‌گیرد، ولی برای چنین مواقعی در سیستم عامل ویندوز یک خطای OSError رخ خواهد داد. رویداد این ماجرا در هنگام تغییر نام یک دایرکتوری، باعث بروز خطای OSError در هر دو سیستم عامل می‌شود.

  • (os.renames(old, new: عملکردی مشابه با تابع ()rename دارد با این تفاوت که اگر دایرکتورهای میانی از مسیر آرگومان new، وجود نداشته باشند، آن‌ها را نیز ایجاد می‌کند [
    برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
    ]:
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
  • (os.walk(rootdirpath: مسیر یک دایرکتوری را به عنوان دایرکتوری ریشه پیمایش می‌کند و مسیر هر دایرکتوری را که می‌بیند به همراه نام دایرکتوری‌ها و فایل‌های درون آن برمی‌گرداند. [
    برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
    ]:
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

جهت پیمایش دایرکتوری‌ها به صورت پیش‌فرض از بالا (دایرکتوری ریشه) به پایین است که می‌توان با False قرار دادن آرگومان اختیاری topdown آن را معکوس نمود:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
  • os.sep: این متغیر حاوی کاراکتری می‌باشد که سیستم‌عامل از آن برای جدا سازی اجزای یک مسیر استفاده می‌کند. مانند: / در گنولینوکس یا \\ در ویندوز [
    برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
    ]
  • os.extsep: این متغیر حاوی کاراکتری می‌باشد که در سیستم‌عامل جاری از آن برای جدا سازی نام فایل از پسوند آن استفاده می‌گردد. مانند: . (نام فایل: script.py) [
    برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
    ]
  • os.pardir: حاوی مقداری است که در سیستم‌عامل جاری از آن برای اشاره به یک دایرکتوری بالاتر از دایرکتوری جاری استفاده می‌گردد (Parent Directory). مانند: .. در گنولینوکس و ویندوز [
    برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
    ]:
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
  • os.curdir: حاوی مقداری است که در سیستم‌عامل جاری از آن برای اشاره به دایرکتوری جاری استفاده می‌گردد (Current Directory). مانند: . در گنولینوکس و ویندوز [
    برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
    ]:
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

 

لینک به دیدگاه
  • 2 هفته بعد...

os.path

این ماژول توابعی مفیدی برای کار با مسیر فایل‌ها و دایرکتوری‌ها پیاده‌سازی کرده است [

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
].

ملاحظه: برای خواندن و نوشتن فایل‌ها از ()open و برای دسترسی به سیستم‌فایل از ماژول os استفاده نمایید.

  • (os.path.split(path: مسیر path دریافتی را به یک تاپل (dirname, basename) تجزیه می‌کند که در آن basename آخرین بخش از مسیر path و dirname نیز هر آنچه قبل از basename باشد، خواهند بود [
    برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
    ]:
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
  • (os.path.basename(path: مقداری برابر با بخش دوم از تاپل خروجی تابع (os.path.split(path را برمی‌گرداند [
    برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
    ]:
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
  • (os.path.dirname(path: مقداری برابر با بخش یکم از تاپل خروجی تابع (os.path.split(path را برمی‌گرداند [
    برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
    ]:
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
  • (os.path.splitext(path: مشابه تابع (os.path.split(path است با این تفاوت که پسوند را از path جدا کرده و نتیجه را به شکل تاپل بر می‌گرداند [
    برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
    ]:
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
  • (os.path.join(*paths: اجزای یک مسیر را به یکدیگر متصل می‌کند [
    برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
    ]:
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

همچنین برای ایجاد چندین مسیر به صورت همزمان، می‌توان اجزای هر مسیر را به صورت یک تاپل (یا لیست) درون یک لیست قرار داد و سپس با استفاده از حلقه for، اجزای هر مسیر را جداگانه به تابع join ارسال نمود. البته باید توجه داشت که می‌بایست پارامتر مشخص شده در تعریف تابع join با یک ستاره مشخص شده باشد؛ در این حالت اجزای درون یک تاپل (یا لیست) به صورت پارامترهای جدا تابع در نظر گرفته می‌شوند، چیزی مانند نمونه کد بالا - در درس تابع دوباره به این شیوه ارسال پارامتر اشاره خواهد شد - به نمونه کد پایین توجه نمایید:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

توجه: هر مسیر می‌بایست دقیقا شامل یک کاراکتر جدا کننده دایرکتوری (os.sep) باشد در غیر این صورت اجزا فقط از آخرین نمونه به بعد در نظر گرفته می‌شوند. این اتفاق در تاپل سوم ('one', 'two', '/three', 'four/') از نمونه کد بالا رخ داده است.

  • (os.path.expanduser(path: این تابع تنها یک پارامتر با ترکیب user~ می‌پذیرد و کاراکتر ~ را به مسیر دایرکتوری کاربر user در سیستم عامل تبدیل می‌کند [
    برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
    ]:
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
  • (os.path.expandvars(path: این تابع مقدار متغیرهای محیطی موجود در پارامتر دریافتی را جایگزین کرده و حاصل را برمی‌گرداند. نام متغیرها می‌بایست با الگوی name$ داخل پارامتر ذکر گردند. [
    برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
    ]:
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
  • (os.path.normpath(path: مسیر را نرمال‌سازی می‌کند. در این راه تمام مسیرهایی که به یکی از اشکال A//B A/B/ A/./B A/foo/../B هستند، به صورت A/B ارزیابی می‌شوند. همچنین در سیستم عامل ویندوز کاراکتر جداکننده دایرکتوری گنولینوکس (/) را به \ تبدیل می‌کند [
    برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
    ]:
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
  • (os.path.abspath(path: مسیر نسبی را نرمال‌سازی کرده و به مسیر مطلق (Absolute - مسیری از ابتدا یا همان روت سیستم فایل - در گنولینوکس: مسیری که با / شروع شده باشد - در ویندوز: مسیری که با نام یک درایو شروع شده باشد) تبدیل می‌کند. حاصل این تابع برابر با حاصل (os.path.normpath(os.path.join(os.getcwd(), path) می‌باشد. [
    برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
    ]:
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

گاهی لازم است که یک مسیر بررسی شود که آیا مربوط به یک فایل است یا دایرکتوری یا لینک نمادین (

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
)، مسیر مطلق (Absolute) است یا خیر، اصلا وجود دارد یا خیر و ... برای این منظور می‌توان از توابع پایین استفاده کرد:

isabs(path): چنانچه مسیر مطلق باشد True برمی‌گرداند [

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
]

isfile(path): چنانچه مسیر مربوط به یک فایل که موجود نیز هست باشد True برمی‌گرداند. این تابع لینک‌های به فایل را نیز دنبال می‌کند، پس این تابع می‌تواند همراه با تابع islink برای یک مسیر مشخص مقدار True را برگرداند. [

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
]

isdir(path): چنانچه مسیر مربوط به یک دایرکتوری که موجود نیز هست باشد True برمی‌گرداند. این تابع لینک‌های به دایرکتوری را نیز دنبال می‌کند، پس این تابع می‌تواند همراه با تابع islink برای یک مسیر مشخص مقدار True را برگرداند. [

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
]

islink(path): چنانچه مسیر مربوط به یک لینک نمادین باشد True برمی‌گرداند. [

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
]

exists(path): چنانچه مسیر دریافتی صرف نظر از اینکه مربوط به یک فایل است یا دایرکتوری، موجود باشد True برمی‌گرداند. [

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
]

lexists(path):چنانچه مسیر لینک نمادین دریافتی موجود باشد True برمی گرداند. این تابع لینک را دنبال نمی‌کند و بررسی نمی‌کند که لینک سالم هست یا خیر. [

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
]

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

متغیر __file__ در هر اسکریپتی به نام کامل آن اسکریپت اشاره دارد.

مسیر چهارم در نمونه کد بالا در واقع مسیر لینکی است به یک دایرکتوری دیگر.

لینک به دیدگاه
  • 1 ماه بعد...

در ادامه آموزش های مربوط به پایتون که در سایت کتاب آموزش برخط گذاشته شده قرار میگیره.

افزودن به لیست متد append

در این آموزش از کتاب برخط پایتون (Python)، متدی را برای افزودن یا add کردن یک شیء به لیست را بررسی خواهیم کرد. متد append()، شیء یا آبجکت ارسال شده را، به انتهای List فعلی اضافه می کند و معادل این کد می باشد: a[len(a):] = [obj]

شکل دستوری

شکل دستوری این method به صورت زیر است:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

پارامتر ها

obj شیء یا آبجکت اضافه شده در List است.

مقدار برگشتی (Return)

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

مثال

مثال زیر روش استفاده از این متد را نشان می دهد.

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

خروجی

بعد از اجرا کردن کد بالا، خروجی زیر حاصل خواهد شد:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

 

لینک به دیدگاه

متغیرها، عبارات و جمله ها در پایتون

مقادیر و نوع ها

مقدار (value) یکی از چیز های پایه می باشد که یک برنامه با آن سر و کار دارد، مانند یک حرف یا یک عدد.

این مقادیر متعلق به نوع های مختلفی می باشد: عدد 2 یک integer می باشد، و 'Hello, World!' یک رشته، زیرا رشته ای از حروف می باشد. شما (و مفسر) می توانید رشته ها را تشخیص دهید چرا که رشته ها درون علامت کتیشن قرار می گیرند.

در صورتی که نوع یک مقدار را نمی دانید، مفسر می تواند به شما نوع آن مقدار را نشان دهد.

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

موضوع عجیبی نیست، رشته ها متعلق به نوع str و اعداد متعلق به نوع int می باشند. بدیهی است که اعداد اعشاری متعلق به نوع float می باشند. چرا که این اعداد در قالب اعشاری نمایش داده می شوند.

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

گاهی اوقات مقادیر به شکل '17' و یا '3.2' نمایش داده می شوند، تکلیف این مقادیر چه می شود؟ این مقادیر شبیه به اعداد هستند، ولی درون علامت کتیشن قرار گرفته اند مانند رشته ها.

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

نوع این نوع مقادیر نیز رشته می باشد.

زمانی که می خواهید یک عدد طولانی را تایپ کنید، ممکن است بخواهید بین آن رقم سه رقم از کاما استفاده کنید، مانند 1,000,000. این یک نوع integer قانونی در پایتون به شمار نمی آید، ولی موردی نخواهد داشت:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

خوب، خروجی فوق به هیچ وجه چیزی نیست که ما انتظار داشتیم! پایتون 1,000,000 را ترتیبی از integer های جدا شده توسط کاما تفسیر می کند. این اولین مثال خطای معنایی است که مشاهده کردیم: کد بدون تولید هیج پیام خطایی اجرا می شود، ولی کاری درست را انجام نی دهد.

متغیرها

یکی از قدرتمند ترین خصوصیات یک زبان برنامه نویسی توانایی مدیریت متغیرها می باشد. متغیر نامی است که به یک مقدار نسبت داده می شود.

یک عبارت مقدار دهی، متغیرهای جدید را ایجاد و به آن ها مقادیر می دهد.

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

مثال فوق سه مورد مقدار دهی را نشان می دهد. اولی متغیری با نام message را مقدار دهی می کند. دومی عدد 17 را درون n می ریزد و سومی مقدار تقریبی عدد π را درون pi می ریزد.

رایج ترین روش برای نمایش متغیرها بر روی کاغذ، نوشتن نام نام متغیر به همراه یک پیکان که به مقدار متغیر اشاره می کند می باشد. این حالت نمایش را state diagram می نامند، به این دلیل که در این حالت وضعیتی که هر متغیر در آن است را نشان می دهد. شکل 1.1 نتیجه مثال قبل را نشان می دهد.

do.php?imgf=155784236260731.png

در واقع نوع یک متغیر، نوع مقداری است که به آن متغیر نسبت داده شده است.

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

تمرین 1

در صورتی که یک مقدار integer را با یک صفر در اول آن تایپ کنید، ممکن است با یک خطای گیچ کننده مواجه شوید:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

اعداد دیگری با این حالت به نظر می رسد بدون خطا کار می کنند، ولی خروجی عجیب و غریب است:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

آیا می توانید بیابید که موضوع از چه قرار است؟ اشاره: مقادیر 01، 010، 0100 و 01000 را در خروجی امتحان کنید.

نام متغیرها و کلمات کلیدی

برنامه نویسان معمولا اسامی معناداری برای متغیرهای خود انتخاب می کنند، آن ها دلیل استفاده هر متغیر را توضیح می دهند.

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

می توان از کاراکتر خط تیره (ـ) درون نام متغیر استفاده کرد. این کاراکتر معمولا برای نام هاییی که در آن ها چندین لغت به کار رفته استفاده می شود مانند my_name یا airspeed_of_unladen_swallow

در صورتی از یک نام غیر قانونی درون کد استفاده کنید، با خطای syntax مواجه خواهید شد.

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

متغیر 76trombones به دلیل اینکه با حرف شروع نشده است نامی غیر قانونی است. متغیر more@ به دلیل اینکه دارای یک کاراکتر غیر قانونی است استفاده از جایز نیس. ولی مشکل متغیر class چیست؟

نام class یکی از کلمات کلیدی پایتون می باشد. مفسر از کلمات کلیدی برای تشخیص ساختار برنامه استفاده می کند، و کلامت کلیدی نمی توانند برای نام متغیر استفاده شوند.

پایتون نسخه 2 دارای 31 کلمه کلیدی می باشد:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

در پایتون نسخه 3، exec دیگر یک کلمه کلیدی نبوده، ولی nonlocal یک کلمه کلیدی می باشد.

ممکن است نگه داشتن این لیست را برای خود سودمند بدانید. در صورتی که مفسر در مورد نام یکی از متغیرهای شما شروع به ایراد گرفتن کرد و شما دلیل آن را نتوانستید تشخیص دهید، می توانید نگاهی به لیست بیاندازید.

عملگرها و عملوندها

عملگرها (Operators) نمادهای خاصی می باشند که محاسبات را نمایش می دهند، مانند عملات جمع و ضرب. مقادیری که عملگر بر آن ها اعمال می شود را عملوند (Operands) می نامند.

همانطور که در مثال زیر مشاهده می کنید، عملگرهای ، -، *، / و ** به ترتیب عملیات جمع، تفریق، ضرب، تقسیم و به توان رساندن را انجام می دهند.

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

در بعضی زبان های برنامه نویسی، علامت ^ برای عملات توان استفاده شده است، ولی در پایتون این علامت برای عمگر بیتی که XOR نامیده می شود استفاده شده است. در مورد عمگرهای بیتی بعدا صحبت خواهیم کرد، ولی در صورت تمایل می توانید به

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
مراجعه کنید.

در پایتون نسخه 2 عملگر تقسیم ممکن است کاری را که شما دقیقا انتظار انجام آن را دارید، انجام ندهد.

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

مقدار متغیر minute عدد 59 می باشد، و بر طبق قوانین حساب، 59 تقسیم بر 60 می شود 0.9833، نه 0. دلیل این تفاوت به این خاطر است که پایتون برای تقسیم از floor division استفاده می کند بدین معنی که نتیجه تقسیم را به سمت عدد کمتر گرد می کند. در صورتی که مقادیر تقسیم شده بر یکدیگر هر دو integer باشند، نتیجه تقسیم نیز integer خواهد بود.

در پایتون نسخه 3، نتیجه تقسیم فوق یک مقدار اعشاری است. و عملگر جدید // کار floor division را انجام می دهد.

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

عبارات و جمله ها

عبارت (expression) ترکیبی از مقادیر، متغیرها و عملگرهاست. یک مقدار به تنهایی می تواند یک عبارت باشد، متغیر نیز به همین ترتیب، بنابراین بنابراین 3 خط زیر همگی عبارات قانونی پایتون به حساب می آیند (با فرض اینکه مقداری به متغیر X تخصیص داده شده است):

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

یک جمله (statement) بخشی از کد می باشد که مفسر می تواند آن را اجرا کند. تا اینجا ما با دو جمله آشنا شدیم: print و تخصیص مقادیر (assignment).

از نظر تکنیکی یک عبارت همچنین یک جمله نیز هست، ولی شاید ساده تر باشد که فکر کنیم این دو از یکدیگر متفاوت هستند.

حالت interactive و script

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

برای مثال، در صورتی که در حال استفاده از پایتون به عنوان یک ماشین حساب می باشید، ممکن است تایپ کنید

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

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

ولی در صورتیکه شما کد فوق را درون script نوشته و اجرا کنید، به هیچ وجه، هیچ خروجی مشاهده نخواهید کرد. در حالت script یک عبارت به تنهایی، هیچ خروجی نخواهد داشت. در واقع پایتون عبارت را محاسبه می کند، ولی هیچ مقداری را نمایش نخواهد داد مگر اینکه به آن گفته شود:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

این رفتار می تواند در ابتدا کمی گیج کننده باشد.

script معمولا حاوی ترتیبی از جمله ها می باشد. در صورتیکه بیشتر از یک جمله وجود داشته باشد، نتیجه ها در یک زمان بعد از اجرا ظاهر خواهند شد.

برای مثال:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

خروجی زیر را تولید می کند:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

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

تمرین 2

جملات زیر را درون interactive پایتون تایپ کنید و خروجی را مشاهده کنید:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

حالا کد فوق را درون یک script قرار داده و آن را اجرا کنید. خروجی آن چیست؟ script را ویرایش کرده و هر عبارت را درون یک جمله print قرار دهید و سپس آن را دوباره اجرا کنید.

ترتیب عملگرها

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

  • پرانتزها (Parantheses) دارای بالاترین اولیت هستند و می توان برای مجبور کردن عبارت به همان اولویتی می خواهید از آن ها استفاده کنید. از آنجاییکه پرانتز ها اول از همه ارزیابی می شوند، 2 * (3-1) می شود 4 و (1 1) ** (5-2) می شود 8. همچنین می توان از پرانتز برای بالا بردن خوانایی کد نیز استفاده کرد، برای مثال (minute * 100) / 60، حتی اگر هیچ تاثیری در نتیجه ندارد.
  • توان (Exponentiation) دارای اولیت دوم می باشد، بنابراین 2 ** 1 1 می شود 3، نه 4 و 3 * 1 ** 3 می شود 3 نه 27.
  • ضرب و تقسیم دارای اولیت یکسانی می باشند، و جمع و تفریق نیز با هم دارای اولیت یکسانی می باشند، ولی اولیت ضرب و تقسیم از جمع و تفریق بالاتر است.
  • عملگرهای با اولویت یکسان از چپ به راست ارزیابی می شوند (به استثنای توان). بنابراین در عبارت در عبارت degrees / 2 * pi، ابتدا عملیات تقسیم انجام می شود و نتیجه در pi ضرب می شود. To divide by 2 π, you can use parentheses or write degrees / 2 / pi.

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

عملگرهای رشته

به طور کلی، نمی توان عملگرهای ریاضی را بر روی رشته ها انجام داد، حتی اگر رشته مورد نظر شبیه به عدد باشد، بنابراین عبارات زیر صحیح نمی باشند:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

عملگر برای رشته ها استفاده می شود، ولی ممکن است چیزی که شما انتظار دارید نباشد: این عملگر عمل contatenation را انجام می دهد، بدین معنی که رشته ها را به یکدیگر متصل می کند. برای مثال:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

خروجی برنامه فوق کلمه throatwarbler می باشد.

همچنین عملگر * نیز برای رشته ها استفاده می شود. این عملگر باعث تکرار رشته می شود. برای مثال، 'Spam' * 3 می شود 'SpamSpamSpam'. در صورتیکه یکی از عملوند ها رشته باشد، دیگری باید یک integer باشد.

استفاده فوق از و * شباهت معناداری با جمع و ضرب را تداعی می کند. 3 * 4 برابر است با 4 4 4، ما فرض می کنیم که 'Spam' * 3 نیز به همین شکل است 'Spam' 'Spam' 'Spam'. از سوی دیگر تفاوت قابل توجهی در تکرار و به هم متصل کردن رشته ها با جمع و ضرب رشته وجود دارد.Can you think of a property that addition has that string concatenation does not?

کامنت ها

همانطور که برنامه ها بزرگتر و پیچیده تر می شوند، خواندن کد آن ها نیز مشکل تر می شود. زبان های رسمی بسیار متراکم هستند، و اغلب مشاهده بخشی از کد و تشخیص این که آن تکه کد چه کاری انجام می دهد بسیار مشکل می باشد.

به همین دلیل، ایده بدی نیست که برای توضیح قسمت هایی از کد، یادداشت هایی را درون برنامه اضافه کنیم. به این یادداشت ها کامنت می گویند که با علامت # آغاز می شوند:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

در مثال فوق، کامنت در یک خط قرار داده شده است. همچنین می توان کامنت را در انتهای یک خط نیز قرار داد.

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

همه چیز از علامت # به بعد تا انتهای خط نادیده گرفته خواهد شد، بدین معنی که هیچ تاثیری در برنامه نخواهد گذاشت.

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

کامنت زیر زائد و بدون استفاده است:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

کامنت زیر حاوی اطلاعات مفیدی است که درون کد وجود ندارد:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

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

لینک به دیدگاه

رشته ها در پایتون

در این آموزش از کتاب برخط (Online) فارسی پایتون (Python)، نوع داده رشته (String) و کاربرد آن را مورد بررسی قرار می دهیم.

رشته یک ترتیب است

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

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

خط دوم مثال فوق کارکتر اول fruit را انتخاب کرده و آن را درون letter می ریزد.

عبارت درون کروشه را اندیس می نامند. اندیس به کاراکترهای درون یک ترتیب اشاره می کند.

ولی ممکن است چیزی را انتظار خواهید داشت را دریافت نکنید:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

برای اکثر افراد، اولین حرف از کلمه 'banana' حرف b می باشد، نه حرف a. ولی در علوم کامپیوتر اندیس اولین قسمت از رشته می باشد، و اولین قسمت صفر می باشد.

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

بنابراین شاید بتوان به حالت طنز گفت که b صفرومین حرف 'banana' می باشد، a اولین و n نیز دومین حرف آن می باشد.

شما می توانید برای اندیس از هر عبارتی، شال متغیرها و عملگرهای استفاده کنید، ولی باید بخاطر داشت مقدار اندیس باید یک integer باشد، در غیر این صورت شما خطای زیر را دریافت خواهید کرد:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

طول رشته

len یک تابع داخلی پایتون می باشد که تعداد کاراکترهای موجود در یک رشته را بر می گرداند.

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

برای بدست آوردن آخرین حرف یک رشته، شما ممکن است همچین کاری را انجام دهید:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

دلیل خطای فوق این است که هیچ در 'banana' با اندیس 6 وجود ندارد. به این دلیل که ما شمارش را از صفر شروع کردیم 6 حرف مورد نظر از 0 تا 5 شماره گذاری شده اند. برای بدست آوردن آخرین کاراکتر، شما باید یک واحد از lenght کم کنید.

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

همچنین شما می توانید از اندیس های منفی استفاده کنید، که به صورت بر عکس، یعنی از ابتدا به انتها رشته را شمارش می کند. عبارت fruit[-1] نشان دهنده اندیس آخر، fruit[-2] نشان دهنده اندیس یکی مانده به آخر می باشد و الی آخر ...

پیمایش با حلقه for

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

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

این حلقه رشته را پیمایش کره و حروف داخل رشته را جدا جدا نمایش می دهد. شرط حلقه index < len(fruit) می باشد، بنابراین زمانی که index برابر با طول رشته شود، شرط False می شود، و بدنه حلقه دیگر اجرا نخواهد شد. آخرین کاراکتر مورد دسترسی اندیس len(fruti) - 1 می باشد، که آخرین کاراکتر رشته خواهد بود.

تمرین 1

تابعی بنویسید که یک رشته را به عنوان آرگومان دریافت کرده و حروف آن را به صورت وارونه نمایش دهد.

روش دیگر نوشتن یک پیمایش با استفاده از حلقه for می باشد:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

هر بار درون حلقه، کاراکتر بعدی درون رشته به متغیر char نسبت داده می شود. حلقه تا جایی ادامه پیدا می کند که دیگر هیچ کارکتری درون رشته باقی نماند.

مثال زیر نحوه استفاده از به هم متصل کردن رشته و یک حلقه for برای تولید یک سری حروف به ترتیب حروف الفبا را نشان می دهد. در کتاب make Way for Ducklings اثر Robert McCloskey نام جوجه اردک ها Jack، Kack، Lack، Mak، Nack، Ouack، Pack و Ouack می باشد، خروجی حلقه زیر این نام ها را به ترتیب چاپ می کند.

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

البته، خروجی به طور کامل صحیح نیست، "Oauck" و "Quack" از نظر املایی غلط می باشند.

تمرین 2

کد فوق را جهت رفع مشکل اصلاح کنید.

برش های رشته

یک بند از یک رشته را یک برش می گویند. انتخاب یک برش، دقیقا انتخاب یک کاراکتر است.

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

عملگر [n:m] بخشی از رشته یعنی رشته را از کاراکتر n تا بر می گرداند، که شامل اولین برش یعنی عدد n می شود، ولی شامل m نمی شود. این رفتار کمی عجیب به نظر می رشد، ولی ممکن است همانطور که در تصویر 8-1 مشاهده می کنید به این تصور کمک کند که نقطه اندیس بین کارکترها می باشد.

do.php?imgf=15583584022911.png

در صورتیکه اندیس اول (قبل از : را) از قلم بیاندازید، برش از ابتدا رشته شروع می کند و همچنین در صورتیکه اندیس دوم را از قلم بیاندازید، برش تا انتهای رشته ادامه پیدا می کند.

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

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

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

یک رشته خالی حاوی هیچ کارکتری نبوده و طول آن 0 می باشد، ولی با این حال مانند باقی رشته ها خواهد بود.

رشته ها تغییر ناپذیر هستند

به نظر وسوسه انگیز می رسد به منظور تغییر یک کاراکتر در رشته از عملگر [] در سمت چپ یک انتساب استفاده کرد برای مثال:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

"object" در مثال فوق رشته و "item" کارکتری است که انتساب داده شده است. فعلا یک شیء همان مقدار می باشد، ولی بعدا شیء را به تفصیل توضیح خواهیم داد. item یکی از مقادیر موجود در ترتیب (sequence) می باشد.

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

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

مثال فوق یک حرف جدید را به عنوان اولین حرف به برش greeting متصل می کند. انتساب فوق هیچ تاثیری بر رشته اصلی ندارد.

جستجو کردن

تابع زیر چه کاری انجام می دهد؟

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

در یک معنا، تابع فوق نقطه مقابل عملگر [] می باشد، بدین معنی که، به جای اینکه یک اندیس را گرفته و کاراکتر مرتبط با آن را بر گرداند، یک کاراکتر را گرفته و اندیس مربوط به کاراکتر را بر می گرداند. در صورتیکه کاراکتر مورد نظر پیدا نشود تابع -1 بر می گرداند.

این اولین مثالی است که جمله return درون حلقه قرار گرفته است. در صورتیکه word[index] == letter باشد، تابع حلقه را شکسته و به سرعت برگردانده می شود.

در صورتیکه کاراکتر در رشته وجود نداشته باشد، برنامه به طور عادی از حلقه خارج شده و -1 را بر می گرداند.

این توع الگوی محاسبه یعنی: پیمایش یک ترتیب و برگرداندن، هنگامی که چیزی که به دنبالش می باشیم را پیدا کردیم را جستجو می نامند.

استفاده از حلقه و شمارشگر

برنامه زیر تعداد کاراکتر a موجود در رشته را حساب می کند.

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

برنامه فوق الگوی محاسبه دیگری را نشان می دهد که شمارشگر نام دارد. متغیر count با مقدار اولیه 0 ایجاد شده و هر بار که کاراتر a در رشته یافت می شود یک واحد به آن اضافه می گردد. زمانی که حلقه خارج شود، متغیر count حاوی نتیجه خواهد بود یعنی تعداد a های موجود در رشته.

متدهای رشته

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

به جای استفاده از یک تابع به عنوان مثال upper(word)، در مثال زیر از syntax متد استفاده شده است: word.upper().

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

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

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

همانطور که معلوم است، یک متد رشته با نام find وجود دارد که به طور قابل ملاحظه ای شبیه به تابعی است که پیش از این نوشتیم:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

در مثال فوق، ما متد find را فراخوانی کرده و حرف مورد نظر خود را به عنوان پارامتر به آن ارسال کردیم.

در واقع، متد find کلی تر از تابعی است که ما قبلا نوشتیم، این متد نه تنها می تواند کاراکتر را پیدا کند، بلکه زیر رشته ها را نیز پیدا می کند:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

همچنین متد فوق یک آرگومان دیگر نیز دریافت می کند که مشخص می کند جستجو از کدام اندیس شروع شود:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

بعلاوه آرگومان سوم که مشخص می کند جستجو در کدام اندیس پایان یابد:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

جستجوی فوق موفق نبود چرا که b در محدوده اندیس 1 تا 2 (نه خود 2) وجود نداشت.

عملگر in

کلمه in یک عملگر boolean می باشد که دو رشته را گرفته و در صورتی که رشته اول زیر رشته یا زیر مجموعه رشته دوم باشد مقدار True بر می گرداند.

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

براث مثال، تابع زیر تمام حروف word1 را در صورتی که درون word2 باشد چاپ می کند.

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

در صورتیکه از نام های درست استفاده کنید، پایتون گاهی اوقات مانند زبان انگلیسی خوانده می شود: “for (each) letter in (the first) word, if (the) letter (appears) in (the second) word, print (the) letter.”

در زیر نتیجه مقایسه apples با oranges را با استفاده از تابع نوشته مشاهده می کنید:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

مقایسه رشته ها

عملگرهای انتسابی برای رشته ها استفاده می شوند. مقایسه این که آیا دو رشته با هم مساوی هستند:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

عملگرهای انتسابی دیگر برای قرار دادن لغات به ترتبی حروف الفبا کاربرد خواهند داشت:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

پایتون حروف بزرگ و کوچک را به همان روشی که در دنیای واقعی ما از آستفاده می کنیم، ‌کنترل نمی کند. تمامی حروف بزرگ قبل از حروف کوچک می آیند، ‌بنابراین:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

رایج ترین روش برای درست کردن این مشکل این است که، قبل از انجام عمل مقایسه، رشته ها را به حروف کوچک تبدیل کنیم.

لینک به دیدگاه

لیست در پایتون

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

پایتون دارای شش نوع از sequence ها می باشد، ولی رایج ترین آن ها لیست ها و Tuple ها می باشند، که در این آموزش به آن ها پرداخته شده است.

اعمال مشخصی وجود دارند که با نوع داده های sequence می توان انجام داد. این اعمال شامل فهرست کردن اعضاء، افزودن عضو، برش و چک کردن موجود بدون یک عضو می باشند. علاوه بر این ها، پایتون دارای توابع داخلی (built-in) برای بدست آوردن طول (length) ترتیب (sequence) و یافتن بزرگترین و کوچکترین المان می باشد.

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

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

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

همانند برش ها در رشته، برش های لیست نیز از 0 شروع می شوند، همچنین لیست ها را می تواند به یکدیگر چسبانده یا برش داد.

دسترسی به مقادیر

برای دسترسی به مقادیر در لیست ها، از کروشه بعد از نام متغیر لیست همانند مثال زیر استفاده می شود:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

خروجی کد بالا:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

به روز رسانی لیست ها

شما می توانید یک آیتم یا بیشتر از مقادیر لیست را با دادن اندیس آن به روز رسانی کنید.

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

خروجی کد بالا:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

حذف کردن آیتم ها

برای حذف یک آیتم لیست، در صورتی که دقیقا می دانید کدام آیتم را می خواهید حذف کنید، می توانید از عبارت del استفاده کنید، در غیر اینصورت می توانید از متد remove() استفاده کنید که در بخش انتها به توضیح آن پرداخته ایم:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

خروجی کد بالا:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

اعمال پایه ای List

لیست ها همانند رشته ها به عملگرهای و * پاسخ می دهند؛ در اینجا نیز این عملگرها برای اتصال و تکرار استفاده می شوند، با این تفاوت که نتیجه یک لیست جدید خواهد بود نه یک رشته.

در واقع، لیست ها به تمامی عملگرهای معمول sequence ها که در رشته استفاده می شوند، پاسخ می دهند.

عبارت پایتون نتیجه توضیح
len([1, 2, 3]) 3 Length
[1, 2, 3] [4, 5, 6] [1, 2, 3, 4, 5, 6] Concatenation
['Hi!'] * 4 ['Hi!', 'Hi!', 'Hi!', 'Hi!'] Repetition
3 in [1, 2, 3] True Membership
for x in [1,2,3] : print (x,end = ' ') 1 2 3

Iteration

برش در List

از آنجاییکه لیست یک sequence است، برش دادن آن هم همانند روش برش در رشته ها است.

ورودی های زیر را فرض کنید:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
عبارت پایتون نتیجه توضیح
L[2] 'Python' Offsets start at zero
L[-2] 'Java' Negative: count from the right
L[1:] ['Java', 'Python']

Slicing fetches sections

توابع و متدهای داخلی List

پایتون حاوی توابع List زیر می باشد:

  • cmp(list1, list2) در پایتون 3 دیگر در دسترس نیست.
  • len(list) طول لیست را بر می گرداند.
  • max(list) آیتمی را که بیشترین مقدار را دارد بر می گرداند.
  • min(list) آیتمی را که کمترین مقدار را دارد بر می گرداند.
  • list(seq) نوع داده tuple را به لیست تبدیل می کند.

پایتون حاوی متدهای List زیر می باشد:

  • list.append(obj) شیء obj را به list اضافه می کند.
  • list.count(obj) تعداد حضور obj در list را بر میگرداند.
  • list.extend(seq) محتویات seq را به لیست اضافه می کند.
  • list.index(obj) اولین اندیس حضور obj در لیست را بر می گرداند.
  • list.insert(index, obj) شیء obj را در مکان داده شده قرار می دهد.
  • list.pop(obj = list[-1]) آخرین شیء را حذف کرده و برمی گرداند.
  • list.remove(obj) شیء obj را از list حذف می کند.
  • list.reverse() اشیاء list را وارونه می کند.
  • list.sort([func]) اشیاء list را با استفاده از مقایسه func داده شده می چیند.
لینک به دیدگاه

دیکشنری در پایتون

در این آموزش از کتاب برخط (Online) فارسی پایتون (Python)، نوع داده دیکشنری (Dictionary) و کاربرد آن را مورد بررسی قرار می دهیم.

نوع داده دیکشنری (Dictionary) در زبان برنامه نویسی پایتون (Python)، به صورت لیستی از، کلیدها و value ها است، هر کلید توسط علامت کالن (:) از value جدا می شود، اندیس ها نیز توسط علامت کاما (,) از یکدیگر جدا می شوند. یک دیکشنری خالی بدون اندیس با استفاده از تنها دو آکولاد خالی به صورت {} نوشته می شود.

کلید ها در نوع داده dictionary یکتا می باشد (بدین معنی که نمی توان دو کلید یکسان داشت)، ولی value می تواند تکراری نیز باشد. value در دیکشنری می تواند هر نوعی باشد، ولی کلیدها باید یک نوع داده غیر قابل تغییر (immutable) مانند string، number، یا tuble باشد.

دسترسی به value ها در Dictionary

برای دسترسی به مقادیر دیکشنری، تنها کافی است از علامت کروشه و کلید متناظر با value مورد نظر استفاده کرد، در زیر مثالی ساده نشان داده شده است:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

زمانی که کد بالا اجرا شود، خروجی زیر را تولید می کند:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

در صورتی که کلید مورد نظر در دیکشنری موجود نباشد، خطای زیر رخ خواهد داد:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

زمانی که کد بالا اجرا شود، خروجی زیر را تولید می کند:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

بروزرسانی Dictionary

برای تغییر مقادیر، افزودن آیتم جدید به صورت زیر عمل می کنیم:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

زمانی که کد بالا اجرا شود، خروجی زیر را تولید می کند:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

حذف مقادیر دیکشنری

شما می توانید یک آیتم یا اندیس خاص و یا تمامی مقادیر یک دیکشنری را حذف کنید، حتی می تواند خود دیکشنری را به طور کلی با یک عملیات حذف کرد.

برای حذف کل یک دیکشنری، تنها کافی است از عبارت del استفاده کنید. در زیر مثال ساده ای آورده شده است:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

خروجی کد بالا.

بعد از del dict یک خطا (exception) ایجاد می شود، دیکشنری دیگر وجود ندارد.

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

متد del() در ادامه توضیح داده خواهد شد.

خصوصیات کلیدهای Dictionary

value ها هیچ محدودیتی ندارند. چرا که می توانند هر شیء دلخواهی از پایتون باشند، چه شیء های استاندارد و یا شیء های تعریف شده توسط کاربر. ولی این برای کلیدها صدق نمی کند.

دو نکته ی مهم درباره کلیدها در دیکشنری را باید بخاطر سپرد:

(الف) همانطور که گفته شد، کلیدها در این نوع داده نمی توانند تکراری باشند، زمانیکه کلید تکراری به یک دیکشنری اختصاص می دهید، آخرین مقدار جایگزین مقدار قبلی می شود. برای مثال:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

زمانی که کد بالا اجرا شود، خروجی زیر را تولید می کند:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

(ب) کلیدها باید از نوع داده های غیر قابل تغییر (immutable) باشند. این بدان معناست که می توان از string، number و tuple ها در کلید های دیکشنری استفاده کرد، ولی چیزی شبیه به ['key'] را نمی توان استفاده کرد، در زیر مثال ساده ای آورده شده است:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

زمانی که کد بالا اجرا شود، خروجی زیر را تولید می کند:

توابع و متدهای داخلی (built-in) در دیکشنری

پایتون حاوی توابع dictionary زیر می باشد:

  • cmp(dict1, dict2) در پایتون 3 دیگر قابل دسترس نیست.
  • len(dict) اندازه طول دیکشنری را بر می گرداند. این برابر با تعداد آیتم ها یا اندیس ها در دیکشنری است.
  • str(dict) یک رشته قابل نمایش از دیکشنری را تولید می کند.
  • type(variable) نوع داده مقدار ورودی بر می گرداند، در صورتی که مقدار ورودی یک دیکشنری باشد، نوع dictionary را برمی گرداند.

پایتون حاوی متدهای دیکشنری زیر می باشد:

  • dict.clear() تمامی اندیس های دیکشنری dict را حذف می کند
  • dict.copy() یک کپی از دیکشنری dict را بدون تغییر در مقادیر اصلی آن برمی گرداند.
  • dict.fromkeys() یک دیکشنری جدید با استفاده از کلید های seq ورودی ایجاد می کند.
  • dict.get(key, default=None) مقدار کلید key را برمی گرداند، و در صورتی که کلید در دیکشنری نباشد، مقدار default را بر می گرداند.
  • dict.has_key(key) این متد حذف شده است، بجای آن از عمل in استفاده کنید.
  • dict.items() لیستی از tuple های جفت شده از کلید و value های dict را بر می گرداند.
  • dict.keys() لیستی از کلیدهای دیکشنری را بر می گرداند.
  • dict.setdefault(key, default = None) شبیه به get() می باشد، با این تفاوت که در صورتیکه کلید وجود نداشته باشد مقدار default را در آن قرار می دهد.
  • dict.update(dict2) کلید ها و value های dict2 را به dict اضافه می کند.
  • dict.values() لیستی از value های دیکشنری dict را بر می گرداند.
لینک به دیدگاه
  • 4 هفته بعد...

حلقه for در پایتون

در این آموزش از کتاب برخط پایتون، Loop یا حلقه for را مورد بررسی قرار می دهیم. با استفاده از حلقه for در پایتون، امکان جستجو و پیمایش بین آیتم های داده هایی نظیر لیست و رشته فراهم خواهد شد.

شکل دستور

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

با توجه به مثال بالا آیتم های موجود در sequence یکی یکی به iterating_var اختصاص داده می شوند و درون بلاک statements(s) اجرا می شوند، این تا زمانی تکرار می شود که آیتم های درون sequence به پایان برسند. به مثال زیر توجه کنید:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

خروجی برنامه:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

تابع range() در پایتون

این تابع داخلی (build-in)، برای پیمایش درون ترتیبی از اعداد استفاده می شود. تابع range() یک iterator ایجاد می کند که برای حرکت و پیشروی در اعداد از 0 تا n-1 استفاده می شود. برای بدست آوردن شیء ای از لیست برای این ترتیب عددی از تابع تغییر تایپ list() استفاده می کنیم. حالا می توان با استفاده از Loop یا حلقه for درون این لیست پیمایش کرد:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

خروجی

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

مثال

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

خروجی:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

پیمایش با استفاده از اندیس ترتیب

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

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

خروجی

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

در اینجا، ما از تابع داخلی len() استفاده کرده ایم، که مجموع تعداد آیتم های درون لیست یا به عبارتی طول آن را بر میگرداند، همانطور هم تابع داخلی range() ترتیب عددی به اندازه طول لیست برای پیمایش در حلقه for در اختیار ما قرار می دهد.

استفاده از عبارت else در حلقه ها

زبان برنامه نویسی پایتون استفاده از عبارت else را به همراه حلقه for پشتیبانی می کند.

در صورتیکه عبارت else به همراه حلقه for استفاده شود، بلاک else تنها در صورتی اجرا می شود که حلقه به صورت معمول پایان یابد (و نه توسط عبارت break).
زمانیکه عبارت else به همراه حلقه while بیاید، عبارت else تنها در صورتی اجرا می شود که شرط آن false باشد.

مثال

مثال زیر ترکیب عبارت else با حلقه for را نشان می دهد، که عدد زوج را در لیست داده شده جستجو می کند.

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

خروجی

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

 

لینک به دیدگاه
  • 3 هفته بعد...

فایل ها و دیتابیس ها

ماندگاری داده ها

اغلب برنامه هایی که تا به حال دیده ایم برنامه هایی گذرا هستند، به این معنی که این برنامه ها برای مدت زمان کوتاهی اجرا می شوند و برای خود خروجی تولید می کنند، ولی وقتی برنامه به پایان می رسد، تمامی داده ها از بین می روند. در صورتی که برنامه را دوباره اجرا کنید، برنامه خالی از هرگونه داده خواهد بود.

ولی برنامه های دیگر به اصطلاح ماندگار هستند: این برنامه ها حداقل برخی از داده های خود را درون یک مخزنی (به عنوان مثال، هارد درایو) ذخیره می کنند؛ و در صورتی که برنامه خاموش یا دوباره راه اندازی شود، داده های خود را برای استفاده در اختیار خواهند داشت.

از جمله برنامه های مانگار می تواند سیستم عامل ها را نام برد، که به خوبی تا هر زمان که کامپیوتر در روشن است اجرا می شوند، و وب سرور ها در تمام مدت در حال اجرا بوده و منتظر درخواست هایی که از شبکه می آید می باشند.

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

روش دیگر، ذخیره داده های یک برنامه درون یک دیتابیس یا پایگاه داده می باشد. در این فصل یک دیتابیس ساده و یک ماژول به نام pickle را برای ذخیره داده های یک برنامه نشان خواهیم داد.

خواندن و نوشتن درون فایل در پایتون

فایل متنی ترتیبی از کارکترهای ذخیره شده در یک هارد دائمی مانند هارد درایو، فلش یا CD-ROM می باشد. نحوه باز کردن و خواندن فایل را در فصل بازی با کلمات آشنا شدیم.

برای نوشتن بر روی فایل، باید از 'w' به عنوان پارامتر دوم در تابع open استفاده کرد:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

در صورتی که فایل مورد نظر وجود داشته باشد، باز کردن آن در حالت نوشتن ('w')، داده های قبلی را به طور کامل پاک کرده و یک فایل جدید را ایجاد می کند، بنابراین در این مورد باید کمی مواظب باشید! در صورتیکه فایل وجود نداشته باشد نیز یک فایل جدید ساخته می شود.

متد write داده ها را درون فایل قرار می دهد.

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

شیء فایل جایی را که قرار دارد را درون خود نگه می دارد، بنابراین در صورتیکه متد write را دوباره فراخوانی کنید، داده مورد نظر دوباره به انتهای فایل اضافه می شود.

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

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

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

عملگر فرمت (%)

آرگومان write باید یک رشته باشد، بنابراین در صورتیکه بخواهیم مقادیر دیگری غیر ار رشته به متد write ارسال کنید، باید آن مقدار را به رشته تبدیل کنیم. ساده ترین راه استفاده از تابع str می باشد:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

روش دیگر برای تبدیل مقادیر دیگر به رشته، استفاده از عملگر فرمت (%) می باشد. در صورتیکه از این عملگر برای یک مقدار integer استفاده شود، کارکرد آن به شکل عملگر modulus (باقی مانده تقسیم) خواهد بود. ولی هنگامی که برای یک مقدار رشته از این عملگر استفاده شود به صورت عملگر فرمت رفتار خواهد کرد.

اولی عملوند در این حالت فرمت رشته می باشد، که حاوی یک یا چندین ترتیب فرمت می باشد و تعیین می کند که عملوند دوم به چه صورت قالب بندی شود.

برای مثال، '%d' بدین معنی است که عملوند دوم باید یک integer باشد (d مخفف decimal است):

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

نتیجه رشته '42' است، که هیچ تداخلی با 42 که یک integer است ندارد.

ترتیب فرمت می توانید در هر قسمتی از رشته قرار گیرد، بنابراین شما می توانید یک مقدار را درون یک جمله جای دهید:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

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

در مثال زیر از '%d' برای فرمت یک integer، از '%g' برای فرمت یک عدد اعشاری (نپرس چرا)، و از '%s' برای فرمت یک رشته استفاده شده است:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

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

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

در خط اول کد فوق، تعداد المان ها کافی نیستند، و در خط سوم نوع المان یک نوع اشتباه می باشد.

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

نام فایل و مسیر

فایل ها اصولا درون دایرکتوری ها (فولدر نیز نامیده می شود) قرار می گیرند. هر بنامه ای که در حال اجرا می باشد، دارای یک دایرکتوری جاری می باشد، که دایرکتوری پیشفرض برای اغلب عملیات ها می باشد. برای مثال، هنگامی که شما فایلی را برای خواندن باز می می کنید، پایتون درون دایرکتوری جاری به دنبال آن می گردد.

ماژول os دارای توابعی برای کار با فایل ها و دایرکتوری ها می باشد (os مخفف "operating system" است). os.getcwd نام دایرکتوری جاری را بر می گرداند:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

اصطلاح cwd مخفف "current working directory" به معنی دایرکتوری جاری در حال کار می باشد. نتیجه مثال فوق /home/aminpy می باشد، که دایرکتوری خانگی کاربری با نام aminpy می باشد (در سیستم عامل لینوکس).

شبه رشته (string like) فوق یعنی cwd یک فایل را که مسیر (path) نامیده می شود را شناسایی می کند. مسیر نسبی (relative path) از دایرکتوری جاری شروع می شود و مسیر کامل (absolute path) از بالاتری دایرکتوری سیستم فایل شروع می شود.

مسیرهایی که تا کنون دیدیم یک نام ها فایل ساده بوده اند، بنابراین این مسیرها مسیرهای نسبی از دایرکتوری جاری بوده اند. برای یافتن یک مسیر کامل به یک فایل، می توانیم از os.path.abspath استفاده کنیم:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

تابع os.path.exists وجود فایل یا دایرکتوری را بررسی می کند:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

در صورتیکه فایل مورد نظر وجود داشته باشد، os.path.isdir بررسی می کند که آن دایرکتوری است یا خیر:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

به همین ترتیب، os.path.isfile نیز بررسی می کند که آیا آرگومان ارسالی به آن یک فایل است یا خیر.

تابع os.listdir لیستی از فایل ها و دایرکتوری موجود در دایرکتوری داده شده را بر می گرداند:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

برای شرح این توابع، مثال زیر درون یک دایرکتوری گشته، و اسامی تمامی فایل ها را چاپ کرده، و خودش را به صورت بازگشتی (recursively) درون تمام دایرکتوری ها فراخوانی می کند.

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

تابع os.path.join نام یک دایرکتوری و فایل را دریافت کرده و آن ها را در یک مسیر کامل شده به هم متصل می کند.

کنترل خطا در فایل

هنگام خواندن یا نوشتن درون فایل اشتباهات بسیاری می تواند رخ دهد. در صورتیکه سعی کنید فایلی را که وجود ندارد را باز کنید، خطای IOErro رخ خواهد داد:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

در صورتیکه حق دسترسی به فایل را نداشته باشید با خطای زیر مواجه خواهید شد:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

و در صورتیکه یک دایرکتوری را برای خواندن باز کنید، خطای زیر را خواهید دید:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

برای جلوگیری از خطاهای فوق، می توان از توابعی مانند os.path.exists و os.path.isfile استفاده کرد، ولی این کار زمان زیادی را خواهد گرفت و کد تمام احتمالات را باید بررسی کنید (if “Errno 21” is any indication, there are at least 21 things that can go wrong).

بهتر است زمانی که مشکل رخ داد با آن درگیر شویم، این دقیقا کاری است که عبارت try انجام می دهد. syntax آن شبیه به عبارت if است:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

پایتون با اجرای بلاک try آغاز می کند. در صورتیکه همه چیز بدون مشکل در بلاک try انجام شود، پردازش بلاک except نادیده گرفته خواهد شد. در صورتی که یک خطا رخ دهد، مفسر از بلاک try بیرون پریده و بلاک except را اجرا می کند.

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

دیتابیس ها

دیتابیس یک فایل است که برای ذخیره سازی داده سازمان دهی شده است. اغلب دیتابیس ها همانند دیکشنری ساخته شده اند، بدین معنی که کلیدها را به مقادیر مرتبط می کنند. بزرگترین فرق آن این است که دیتابیس بر روی دیسک (یا هاردهای دائمی دیگر) می باشد، بنابراین بعد از اتمام برنامه نیز باقی خواهد ماند.

ماژول anydbm یک رابط برای ایجاد و به روز رسانی فایل های دیتابیس فراهم می کند. به عنوان مثال، ما یک دیتابیس که حاوی فایل های تصویری و عناوین آن می باشد را ایجاد خواهیم کرد:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

حالت 'c' بدین معنی است که دیتابیس در صورتی که وجود نداشته باشد ایجاد شود. نتیجه یک شیء دیتابیس است که می تواند (برای اغلب عملیات ها) مانند یک دیکشنری استفاده شود. در صورتیکه یک مورد جدید ایجاد کنیم، anydbm فایل دیتابیس را به روز رسانی می کند.

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

هنگامی که به یک از موارد دسترسی پیدا می کنیم، anydbm فایل را می خواند:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

در صورتیکه انتساب دیگری را برای یک کلید موجود ایجاد کنیم، anydbm مقدار جدید را با مقدار قدیمی جایگزین می کند:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

بسیاری از متدهای دیکشنری، مانند keys و items، با شیء های دیتابیس کار می کنند. بنابراین عملیات تکرار را با یک جمله for انجام می دهیم.

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

همانند فایل های دیگر، باید با استفاده از متد close شیء دیتابیس را مسدود کنیم:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

Pickling

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

ماژول pickle در این مورد سودمند خواهد بود. این ماژول تقریبا تمامی نوع شیء ها را به رشته مناسب با آن برای ذخیره درون دیتابیس ترجمه کرده و رشته های ترجمه شده را به شیء های قبلی آن بر می گرداند.

تابع pickle.dumps یک شیء را به عنوان پارامتر دریافت کرده و یک رشته متناظر با آن بر می گرداند (dumps کوتاه شده "dump string" می باشد):

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

فرمت رشته برگردانده شده واضح به نظر نخواهد رسید؛ این رشته جهت ساده شدن برای picke جهت تفسیر یه این شکل در آمده است. pickle.loads("loads string") شیء را بازسازی می کند:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

هرچند شیء جدید مقداری مشابه با شیء قدیمی دارد، ولی به طور کلی این دو شیء با یکدیگر یکی نخواهند بود:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

به عبارت دیگر، عمل pickling و سپس unpickling، تاثیری یکسان با کپی کردن شیء دارد.

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

Pipes

اغلب سیستم عامل ها دارای یک رابط خط فرمان شناخته شده به عنوان shell می باشند. shell ها معمولا دارای دستوراتی برای هدایت فایل سیستم و اجرای برنامه ها هستند. برای مثال در یونیکس می توان دایرکتوری ها را با دستور cd تغییر داد، می توان با دستور ls محتویات یک دایرکتوری را نمایش داد، و (به عنوان مثال) با تایپ دستور firefox مرورگر وب را اجرا کرد.

هر برنامه ای که را که از shell اجرا می کنید را، با استفاده از pipe می توان در پایتون نیز اجرا نمود. pipe یک شیء است که یک برنامه در حال اجرا را نشان می دهد.

به عنوان مثال، دستور یونیکس ls -l معمولا محتویات دایرکتوری فعلی (در یک فرمت بلند) نمایش می دهد. می توان دستور ls را با استفاده از os.popen (بهتر است از subprocess به جای آن استفاده کنید، ولی برای سادگی و درک مطلب در اینجا ما از این ماژول استفاده کردیم.) درون پایتون اجرا نمود.

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

آرگومان ارسالی یک رشته حاوی دستور shell می باشد. مقدار برگشتی یک شیء است که درست مثل یک فایل باز شده رفتار می کند. می توان خروجی پردازش ls را خط به خط با readline بدست آورد و یا با read به کل خروجی دسترسی پیدا کرد:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

بعد از اتمام کار، مانند فایل شیء مورد نظر را close می کنیم:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

مقدار برگشتی آخرین وضعیت پردازش ls می باشد، None به معنای پایان یافتن عادی (بدون خطا) می باشد.

برای مثال، اغلب سیستم های Unix دستوری با نام md5sum را برای خواندن محتویات یک فایل و محاسبه یک "checksum" ارائه می کنند. برای اطلاعات بیشتر در مورد MD5 می توانید به

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
مراجعه کنند. این دستور یک روش موثر برای بررسی یکی بودن محتویات دو فایل ارائه می کند. The probability that different contents yield the same checksum is very small (that is, unlikely to happen before the universe collapses).

می توان از pipe برای اجرای md5sum در پایتون و گرفتن نتیجه آن استفاده کرد:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

ماژول نویسی

هر فایلی که حاوی کد پایتون باشد می تواند به عنوان یک ماژول import شود. به عنوان مثال، فرض کنید فایلی به نام wc.py با محتویات زیر داریم:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

در صورتیکه برنامه فوق را اجرا کنیم، برنامه محتویات خود را خوانده و تعداد خطوط موجود در فایل را که عدد ۷ باشد را چاپ می کند. شما همچنین می توانید آن را import کنید:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

حالا ما یک شیء ماژول به نام wc در اختیار داریم:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

این ماژول دارای تابعی به نام linecount می باشد:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

و همه این ها مراحل نوشتن یک ماژول در پایتون نشان می دهند.

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

برنامه هایی که به صورت ماژول import می شوند، اغلب از کد زیر استفاده می کنند:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

__name__ یک متغیر داخلی پایتون است که زمانی که برنامه شروع می شود مقدار دهی می گردد. در صورتیکه برنامه مانند یک script اجرا شود، __name__ دارای مقدار __main__ می باشد؛ در این مورد، کد آزمایشی اجرا می شود. در غیر اینصورت، در صورتیکه ماژول import شود، کد آزمایشی نادیده گرفته می شود.

لینک به دیدگاه

توابع در پایتون

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

همانطور که می دانید، پایتون توابع داخلی بسیاری همانند print() و غیره را در اختیار شما قرار داده است. با این حال شما می توانید توابع خودتان را نیز ایجاد کنید. این توابع را، توابع تعریف شده توسط کاربر یا user-defined می نامند.

تعریف یک تابع

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

  • بلاک تابع با کلمه کلیدی def شروع شده و نام تابع و پرانتز ( () ) باز و بسته بعد از آن می آید.
  • تمامی پارامترها و آرگومان های ورودی باید درون پرانتز قرار بگیرند. شما همچنین می توانید پارامترها را درون پرانتز حتی تعریف کنید.
  • عبارت اول یک تابع می تواند یک عبارت اختیاری باشد - رشته ای برای مستندات تابع یا docstring.
  • بلاک کد درون هر تابع با یک علامت کالن (:) شروع شده و به صورت تو رفته (indented) است.
  • عبارت return باعث خروج از یک تابع می شود، و به طور دلخواه می تواند یک مقدار را به قسمتی از کد که تابع را فراخوانی کرده است برگرداند. عبارت return با هیچ آرگومانی همانند return None است.

نحوه تعریف تابع

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

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

مثال

تابع زیر یک پارامتر ورودی رشته دریافت کرده و آن را چاپ می کند.

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

فراخوانی تابع

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

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

زمانیکه کد بالا اجرا شد، خروجی زیر ایجاد می شود:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

فراخوانی با مقدار و با reference

تمامی پارامترها در زبان پایتون با reference ارسال می شوند. این بدان معناست که اگر شما پارامتر را درون تابع تغییر دهید، این پارامتر همچنین در تابع فراخوانی شده نیز تغییر خواهد کرد. برای مثال:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

خروجی:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

در مثالی دیگر آرگومانی که با reference ارسال شده است و reference آن درون تابع فراخوانی شده تغییر می کند:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

پارامتر mylist درون تابع changeme داخلی می باشد، تغییر mylist درون تابع تاثیری در mylist نخواهد گذاشت. تابع در واقع هیچ کاری انجام نداده و خروجی زیر ایجاد می شود:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

آرگومان های تابع

شما می توانید تابع را به از نظر آرگومان به شکل های زیر فراخوانی کنید:

  • آرگومان های اجباری
  • آرگومان های keyword
  • آرگومان های پیشفرض
  • آرگومان های variable-length

آرگومان های اجباری

آرگومان های اجباری آن های هستند که در مکان و ترتیب قرارگیری درست خود به تابع ارسال می شوند. در اینجا تعداد آرگومان های تابع فراخوانی شده باید دقیقا با تعریف تابع یکسان باشند.

جهت فراخوانی printme()، شما نیاز خواهید داشت دقیقا یک آرگومان به آن ارسال کنید، در غیر اینصورت خطای syntax همانند زیر ایجاد خواهد شد:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

خروجی:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

آرگومان های Keyword

آرگومان های keyword وابسته به فراخوانی تابع می باشند. زمانیکه شما آرگومان keyword را در یک فراخوانی تابع استفاده می کنید، آن بخش فراخوانی کننده این آرگومان را توسط نام پارامتر تشخیص می دهد.

مثال زیر فراخوانی keyword در تابع printme() نشان داده شده است:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

خروجی:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

مثال زیر تصویر واضح تری را ترسیم می کند. توجه داشته باشید که ترتیب پارامترها مشکلی ایجاد نمی کند.

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

خروجی:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

آرگومان پیشفرش

در صورتیکه هیچ مقداری به آرگومان فراخوانی شده اختصاص داده نشود، آرگومان پیشفرض مقدار آن را مشخص می کند. در مثال زیر در صورتی که مقدار age تعیین نشود مقدار پیشفرض آن چاپ می شود:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

آرگومان variable-length

شما ممکن است برای پردازش یک تابع نیاز به آرگومان هایی بیش از آن هایی که در تعریف تابع تعریف کرده اید داشته باشید. این آرگومان ها را variable-length می نامند و در تعریف تابع نام گذاری نمی شوند، به جز آرگومان های اجباری و پیشفرض.

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

علامت ستاره (*) قبل از نام متغیر قرار می گیرد و مقادیر تمامی آرگومان هایی که keyword نیستند را در خود نگه می دارد. این تاپل (tuple) در صورتیکه آرگومان اضافه ای در فراخوانی تابع تعیین نشود، خالی باقی می ماند.

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

خروجی:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

توابع Anonymous

این توابع anonymous نامیده می شوند، چرا که به صورت استاندارد با کلمه کلیدی def تعریف نمی شوند. شما می توانید برای ایجاد توابع کوچک anonymous از کلمه کلیدی lambda استفاده کنید.

  • فرم lambda می تواند هر تعداد آرگومان دریافت کند، ولی تنها یک مقدار را بر می گرداند. lambda ها نمی توانند حاوی چندین عبارت و دستور باشند.
  • تابع anonymous نمی تواند به صورت مستقیم برای چاپ فراخوانی شود چرا که نیاز به یک عبارت دارد.
  • توابع lambda دارای namespace های داخلی خود می باشند و تنها به متغیر های موجود در لیست پارامترها و آن هایی که در global تعریف شده اند دسترسی دارند.
  • اگرچه اینطور به نظر می رسد که lambda ها نسخه تک خطی توابع می باشند، آن ها همانند عبارت inline در C یا C نمی باشند.

شکل دستوری

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

مثال زیر فرم lambda و نحوه کارکرد آن را نشان می دهد:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

خروجی:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

عبارت return

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

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

خروجی:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

Scope متغیرها

تمامی متغیرهای موجود در برنامه ممکن است در همه جای برنامه در دسترس نباشند. این موضوع به مکانی که متغیر تعریف شده است بستگی دارد.

Scope یک متغیر تعیین می کند که یک متغیر در کدام بخش از برنامه قابل دسترسی می باشد. در پایتون دو scope برای متغیرها وجود دارد:

  • متغیرهای Global
  • متغیرهای Local

متغیرهای Local در برابر Global

متغیرهایی که درون بدنه تابع تعریف می شوند دارای محدوده local و آن هایی که بیرون از تابع تعریف می شوند دارای محدوده global می باشند.

این بدان معناست که متغیرهای local تنها درون تابعی که تعریف شده اند قابل دسترسی می باشند، در حالی که متغیرهای global در سراسر بدنه برنامه توسط تمامی توابع در دسترس می باشند. زمانیکه شما یک تابع را فراخوانی می کنید، متغیرهایی که درون آن تعریف شده اند به scope آورده می شوند:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

خروجی:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

 

لینک به دیدگاه
  • 3 هفته بعد...

چاپ هرم Pyramid در پایتون

در این بخش، مثالی از نحوه و چگونگی چاپ هرم در زبان برنامه نویسی پایتون را نشان خواهیم داد:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

خروجی

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

 

لینک به دیدگاه

پردازش XML در پایتون

در این بخش، نحوه parse و پردازش XML توسط زبان برنامه نویسی پایتون را با استفاده از API های DOM و SAX را نشان خواهیم داد. XML یک زبان قابل حمل (Portable) و متن باز است که به برنامه نویسان این امکان را می دهد تا برنامه های خود را توسعه دهند به طوری که این برنامه ها قابلیت خوانده شدن توسط برنامه های دیگر را داشته باشد، بدون در نظر گرفتن آنکه سیستم عامل و یا زبان برنامه نویسی مورد نظر چه خواهد بود.

XML چیست؟

XML مخفف Extensible Markup Language می باشد، که یک زبان نشانه گذاری مانند HTML یا SGML است. XML برای کار با داده های کم تا متوسط بدون نیاز به SQL بسیار کاربرد دارد.

معماری های XML Parser و API ها

کتابخانه استاندارد پایتون رابط های مختصر ولی مفیدی برای کار با XML فراهم کرده است.

دو تا از پایه ای ترین و از نظر استفاده گسترده ترین API ها برای داده XML رابط های SAX و DOM هستند.

  • SAX مخفف Simple API for XML: در اینجا، شما فراخوان هایی را برای رخدادهای مورد نظر ثبت می کنید و سپس به parser اجازه می دهید درون سند حرکت کند. این حالت زمانیکه سندهای شما خیلی بزرگ هستند و یا محدودیت حافظه دارید سودمند می باشد. در این حالت فایل های خوانده شده از دیسک parse می شوند و کل فایل هرگز در حافظه ذخیره نمی شود.
  • DOM مخفف Document Object Model: این API توصیه ی کنسرسیوم World Wide Web می باشد و اینگونه است که تمام فایل از حافظه خوانده شده و در یک فرم سلسله مراتبی (hierarchical) و درختی برای نمایش تمام ویژگی های سند XML ذخیره می شود.

واضح است که SAX نمی تواند پردازش اطلاعات در فایل های بزرگ را به همان سرعتی که DOM انجام می دهد، انجام دهد. از طرف دیگر، استفاده از DOM می تواند به طور جدی منابع شما را نابود کند، بخصوص اگر با فایل های کوچک با تعداد بالا کار می کنید.

Sax فقط خواندی است، در حالیکه DOM اجازه تغییرات در فایل XML را به شما می دهد. با توجه به اینکه این دو API متفاوت کاملا کامل کننده یکدیگر می باشند، دلیل ندارد که شما نتوانید از هردوی آن ها برای پروژه های بزرگ استفاده کنید.

در تمامی مثال های این آموزش، اجازه دهید از فایل XML ساده movies.xml زیر به عنوان ورودی استفاده کنیم:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

parse کردن XML با SAX

SAX یک رابط استاندارد برای parse کردن XML به صورت رویداد محور (event-driven) است. پردازش XML با استفاده از SAX به طور معمول نیاز به ایجاد ContentHandler شما توسط xml.sax.ContentHandler خواهد داشت.

ContentHandler شما تگ های خاص و attribute هایی XML شما را کنترل می کند. یک شیء ContentHandler متدهایی برای کنترل رویدادهای مختلفی را فراهم می کند. متدهای startDocument و endDocument در شروع و پایان فایل XML فراخوانی می شوند. متد characters(text) داده کاراکتر فایل XML توسط پارامتر text ارسال می کند.

ContentHandler در شروع و پایان هر المان (element) فراخوانی می شود. در صورتی که parser در مُد namespace نباشد، متد های startElement(tag, attributes) و endElement(tag) فراخوانی می شوند، در غیر اینصورت، متدهای متناظر startElementNS و endElementNS فراخوانی می شوند. در اینجا، tag المان تگ می باشد، و attributes یک شیء Attribute می باشد.

متد make_parser

متد زیر یک شیء جدید parser ایجاد کرده و آن را برمیگرداند. آبجکت parser ایجاد شده اولین نوع parser خواهد بود که سیستم پیدا می کند.

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

در زیر جزئیات پارامترها را مشاهده می کنید

parser_list: آرگومان اختیاری شامل یک لیست از parser ها مورد استفاده که باید همگی متد make_parser را پیاده سازی کنند.

متد parse

این متد یک SAX parser را ایجاد کرده و از آن برای parse کردن یک سند استفاده می کند.

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

در زیر جزئیات پارامترها را مشاهده می کنید:

xmlfile: نام فایل XML ای که قرار است خوانده شود.
contenthandler: شیء ContentHandler می باشد.
errorhandler: در صورت تعیین، errorhandler باید یک شیء SAX ErrorHandler باشد.

متد parseString

یک متد دیگر برای ایجاد یک SAX parser و همچنین parse رشته XML تعیین شده وجود دارد.

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

در زیر جزئیات پارامترها را مشاهده می کنید:

xmlfile: نام فایل XML ای که قرار است خوانده شود.
contenthandler: شیء ContentHandler می باشد.
errorhandler: در صورت تعیین، errorhandler باید یک شیء SAX ErrorHandler باشد.

مثال:

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

خروجی

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

parse یا پردازش XML با DOM

DOM یا Document Object Model یک API مستقل از زبان از کنسرسیوم World Wide Web یا W3C می باشد که برای دسترسی و ویرایش مستندات XML به کار می رود.

DOM برای برنامه های با دسترسی تصادفی (random-access) بسیار سودمند می باشد. SAX تنها اجازه دیدن یک بیت از سند را در یک زمان ان به شما می دهد. در صورتی که یک المان را در SAX مشاهده می کنید، به المان های دیگر دسترسی ندارید.

در اینجا ساده ترین راه برای بارگذاری سریع یک سند XML و ایجاد یک شیء minidom با استفاده از ماژول xml.dom است. شیء minidom یک روش ساده parser است که یک درخت DOM از فایل XML ایجاد می کند.

مثال

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

خروجی

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

 

لینک به دیدگاه
×
×
  • اضافه کردن...