مدرسه زبان برنامه‌نویسی PYTHON



متغیر ها (variables )

در بسیاری از زبانهای برنامه نویسی نقش بسیار مهمی ایفا می کنند و 

Python استثنا نیست. یک متغیر به شما امکان می دهد یک مقدار را با اختصاص آن به یک نام ذخیره کنید، که می تواند برای ارجاع به مقدار بعد در برنامه استفاده شود.

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

>>> x = 7
>>> print(x)
7
>>> print(x + 3)
10
>>> print(x)
7

متغیرها را می توان به عنوان چندین مرتبه مجددا تعیین کرد تا ارزش خود را تغییر دهند.
در پایتون، متغیرها انواع خاصی ندارند، بنابراین شما می توانید یک رشته را به یک متغیر اختصاص دهید، و بعد یک متغیر صحیح را به همان متغیر اختصاص دهید.

>>> x = 123.456
>>> print(x)
123.456
>>> x = "This is a string"
>>> print(x + "!")
This is a string!

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

>>> this_is_a_normal_name = 7

>>> 123abc = 7
SyntaxError: invalid syntax

>>> spaces are not allowed
SyntaxError: invalid syntax

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

>>> foo = "a string"
>>> foo
'a string'
>>> bar
NameError: name 'bar' is not defined
>>> del foo
>>> foo
NameError: name 'foo' is not defined

شما همچنین می توانید از متغیر ورودی کاربر استفاده کنید.

>>> foo = input("Enter a number: ")
Enter a number: 7
>>> print(foo)
7

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

اپراتور ها در محل (in-place operators)

اپراتورها در محل به شما اجازه می دهند کد را مانند ‘x = x + 3’ بنویسید، منتهی به شکلی خلاصه تر و با جایگیری کم تر به صورت ‘x=+3’.
هرچند که این حالت درباره بقیه اپراتور هایی همچون -، *، / و٪ نیز ممکن است.

>>> x = 2
>>> print(x)
2
>>> x += 3
>>> print(x)
5

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

>>> x = "spam"
>>> print(x)
spam

>>> x += "eggs"
>>> print(x)
spameggs

تغییر نوع (type conversion)

در پایتون، عملیات خاصی را با توجه به تیپ و نوع متغیر به صورت مختلف انجام می دهد. به عنوان مثال، شما نمی توانید دو رشته شامل اعداد 2 و 3 را برای تولید عدد صحیح 5 اضافه کنید، زیرا عملیاتی که روی رشته ها انجام می شود در نتیجه 23 را ایجاد می کند.
راه حل این نوع مشکلات تبدیل نوع متغیر است.
در این مثال، شما از تابع int استفاده می کنید.

>>> "2" + "3"
'23'
>>> int("2") + int("3")
5

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

>>> float(input("Enter a number: ")) + float(input("Enter another number: "))
Enter a number: 40
Enter another number: 2
42.0

رشته یا String

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

هنگامی که کنسول 

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

>>> "Python is fun!"
'Python is fun!'
>>> 'Always look on the bright side of life'
'Always look on the bright side of life'

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

کارکتر هایی مانند این ها باید با قرار دادن یک backslash (\) قبل از آنها از تداخل فرار کنند.
دیگر کارکتر های رایج که باید از تداخل فرار کنند، خطوط جدید است.

>>> 'Brian\'s mother: He\'s not the Messiah. He\'s a very naughty boy!'
'Brian's mother: He's not the Messiah. He's a very naughty boy!'

n\ نشان دهنده یک خط جدید است.

نکته: Backslashes همچنین می تواند برای فرار از زبانه ها، کاراکترهای Unicode، و چیزهای مختلف دیگر نیز مورد استفاده شود.

خطوط جدید (New Lines)

پایتون یک راه آسان برای جلوگیری از دستی نوشتن n\” برای فرار خطوط جدید در یک رشته فراهم می کند. یک String با سه مجموعه نقل قول ایجاد کنید و خطوط جدید که با فشار دادن Enter ایجاد می شوند به صورت خودکار برای شما از تداخل فرار می کنند.

>>> """Customer: Good morning.
Owner: Good morning, Sir. Welcome to the National Cheese Emporium."""

'Customer: Good morning.\nOwner: Good morning, Sir. Welcome to the National Cheese Emporium.'

همانطور که می بینید، n\ به طور خودکار در خروجی قرار داده شد، جایی که ما Enter وارد کردیم.

ورودی و خروجی در پایتون

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

>>> print(1 + 1)
2
>>> print("Hello\nWorld!")
Hello
World!

نکته:وقتی یک String چاپ می شود، نقل قول های اطراف آن نمایش داده نمی شوند.

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

>>> input("Enter something please: ")
Enter something please: This is what\nthe user enters!

'This is what\\nthe user enters!'

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

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

تلفیق

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

>>> "Spam" + 'eggs'
'Spameggs'

>>> print("First string" + ", " + "second string")
First string, second string

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

>>> "2" + "2"
'22'
>>> 1 + '2' + 3 + '4'
Traceback (most recent call last):
File "", line 1, in
TypeError: unsupported operand type(s) for +: 'int' and 'str'

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

رشته ها را نمی توان در رشته های دیگر ضرب کرد. رشته ها نیز نمی توانند توسط اعداد غیر صحیح ضرب شوند، حتی اگر تعداد عدد غیر صحیح در حقیقت کامل باشد (6.0).

>>> print("spam" * 3)
spamspamspam

>>> 4 * '2'
'2222'

>>> '17' * '87'
TypeError: can't multiply sequence by non-int of type 'str'

>>> 'pythonisfun' * 7.0
TypeError: can't multiply sequence by non-int of type 'float'

شروع برنامه نویسی پایتون

hello world!

مثل همیشه و طبق عادت شروع هر برنامه نویسی می خواهیم اولین برنامه را با نوشتن Hello world! در خروجی آغاز کنیم.
در پایتون، ما از دستور print برای خروجی متن استفاده می کنیم:

>>> print('Hello world!')
Hello world!

تبریک میگم شما اولین دستور و اولین برنامه خود را نوشتید. (خسته نباشید!! تازه شروع شد)

Print می تواند برای خروج چند خط متن نیز استفاده شود.
مثلا:

>>> print('Hello world!')
Hello world!
>>> print('Hello world!')
Hello world!
>>> print('Spam and eggs.')
Spam and eggs.

محاسبات ریاضی

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

>>> 2 + 2
4
>>> 5 + 4 - 3
6

نکته: فضاهای اطراف علائم جمع و تفریق در اینجا اختیاری هستند (کد بدون آنها کار می کند)، اما این کار خواندن را آسان تر می کند.

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

>>> 2 * (3 + 4)
14
>>> 10 / 2
5.0

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

>>> -7
-7
>>> (-7 + 2) * (-4)
20

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

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

>>> 11 / 0
Traceback (most recent call last):
  File "", line 1, in 
ZeroDivisionError: division by zero

نکته: در پایتون، آخرین خط یک پیام خطا نوع خطا را نشان می دهد.
پیام های خطا را با دقت بخوانید، زیرا اغلب به شما می گوید که چگونه یک برنامه را رفع خطا کنید!
Float در پایتون برای نشان دادن اعدادی که عدد صحیح نیستند استفاده می شود.
برخی از نمونه هایی از اعداد که به صورت float نمایش داده می شوند 0.5 و -7.8237591 هستند.
آنها می توانند به طور مستقیم با وارد کردن یک عدد با یک نقطه اعشار و یا با استفاده از عملیات مانند تقسیم بر عدد صحیح ایجاد شوند.( صفرهای اضافی در انتهای شماره نادیده گرفته می شوند.)

>>> 3/4
0.75
>>> 9.8765000
9.8765

نکته: کامپیتور ها نیز نمی توانند همانند انسان جواب کامل به بعضی عملایت هایی که به اعداد غیر صحیح خطم می شوند بدهند به عنوان مثال 1/3 جوابی مانند 0.333333 تا بی نهایت را تولید خواهد کرد که منجر به ایجاد خطا در سیستم خواهند شد.

اعداد تقریبی Float (غیر صحیح)

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

>>> 8 / 2
4.0
>>> 6 * 7.0
42.0
>>> 4 + 1.65
5.65

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

>>> 2**5
32
>>> 9 ** (1/2)
3.0

دیگر عملیات ریاضی

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

این کد نشان می دهد که 6 به 20 بار سه بار می رود و باقی مانده زمانی که 1.25 به 0.5 تقسیم می شود 0.25 است.

>>> 20 // 6
3
>>> 1.25 % 0.5
0.25

پایتون چیست؟ 


پایتون یک زبان برنامه نویسی سطح بالا است که با مفاهیم پویا تفسیر شده است. سطح بالای آن ساخته شده در ساختار داده ها، همراه با تایپ کردن پویا و اتصال پویا، آن را بسیار جذاب برای توسعه سریع برنامه، و همچنین برای استفاده به عنوان یک زبان اسکریپت یا چسب برای اتصال اجزای موجود با هم. نحو ساده و آسان یادگیری پایتون بر خوانایی تأکید دارد و بنابراین هزینه نگهداری برنامه را کاهش می دهد. پایتون از ماژول ها و بسته ها پشتیبانی می کند، که باعث می شود برنامه های مدولاسیون و استفاده مجدد کد را افزایش دهد. مترجم پایتون و کتابخانه استاندارد گسترده ای در قالب منبع یا باینری بدون هزینه برای تمام سیستم عامل های اصلی در دسترس هستند و می توانند آزادانه توزیع شوند.
اغلب، برنامه نویسان به خاطر افزایش بهره وری از طریق آن، به پایتون افتخار می کنند. از آنجا که هیچ مرحله تدوین وجود ندارد، چرخه ویرایش-تست-اشکادایی فوق العاده سریع است. اشکال زدایی برنامه های Python آسان است: یک اشکال یا ورودی بد هرگز خطای تقسیم بندی را ایجاد نمی کند. در عوض، هنگامی که مترجم یک خطا را پیدا می کند، یک استثنا را افزایش می دهد. هنگامی که این برنامه استثنا را دریافت نمی کند، مترجم یک رد پشته را چاپ می کند. Debugger سطح منبع اجازه می دهد بازرسی متغیرهای محلی و جهانی، ارزیابی عبارات دلخواه، تنظیم نقطه های شکستن، عبور از خط کد در یک زمان و غیره. اشکامان در خود پایتون نوشته شده است، که به قدرت درونگرایی پایتون شهادت می دهد. از سوی دیگر، اغلب سریع ترین راه برای اشکادایی یک برنامه، اضافه کردن چند اظهار نظر به منبع است: چرخه سریع ویرایش-تست-اشکال زدایی باعث می شود این روش ساده بسیار موثر باشد.


ماژول ها

سه نوع اصلی از ماژول ها در پایتون وجود دارد،آنهایی که خودتان می نویسید، آنهایی که از منابع خارجی نصب می کنید ودر آخز آنهایی که با پایتون از پیش نصب شده اند.
آخرین نوع کتابخانه استاندارد نامیده می شود و شامل بسیاری از ماژول های مفید می باشد.برخی از ماژول های مفید کتابخانه استاندارد عبارتند از:stringredatetimemathrandomosmultiprocessingsubprocess,socketemailjsondoctestunittestpdbargparse ,sys.

وظایفی که می تواند توسط کتابخانه استاندارد انجام شود عبارتند از تجزیه رشته، سریال سازی داده ها، آزمایش، اشکال زدایی و دستکاری تاریخ، ایمیل، استدلال خط فرمان و خیلی بیشتر!

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

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

برخی از ماژولهای کتابخانه استاندارد در پایتون نوشته شده و برخی از آنها در C نوشته شده است.
اکثر آنها در تمام سیستم عاملها قابل دسترسی هستند، اما برخی از آنها برای ویندوز یا یونیکس خاص هستند.

نکته: ما تمام ماژول های موجود در کتابخانه استاندارد را پوشش نمی دهیم. به سادگی بیش از حد وجود دارد. مستندات کامل کتابخانه استاندارد در سایت اینترنتی www.python.org در دسترس است.

ماژول ها

خیلی از ماژول های قابل نصب که توسط دیگران نوشته شده اند را می توان در قالبی از پکیج های پایتون یافت.(Python Package Index (

PYPI))
بهترین راه برای نصب این ماژول ها، استفاده از یک برنامه به نام 

pip است.
(برای نصب 

pip کافیست که فایل پیسوت شده به نام را دانلود و با دو بار کلیک بر روی آن اجرا نمایید، در اصل هدف اجرا شدن کد های نوشته شده در فایل get-pip.py هستش پس یا فایل رو باز کنید و اجرا کنید و یا در دایرکتوری فایل دانلود شده دستور python get-pip.py رو اجرا کنید تا پکیج نصب بشه. لطفا به نسخه پایتون نصب شده برای اجرای کد دقت کنید)

این به طور پیش فرض با توزیع های مدرن پایتون نصب می شود. اگر شما آن را ندارید، نصب آنلاین آسان است.هنگامی که شما آن را دارید، نصب کتابخانه ها از PyPI آسان است. به دنبال نام کتابخانه ای که می خواهید نصب کنید، به خط فرمان بروید (برای ویندوز Command Prompt) و فرمان pip install library_name را وارد کنید تا نصب شود. پس از انجام این کار، کتابخانه را وارد کنید و از آن در کد خود استفاده کنید.

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

نکته: مهم است که دستورات pip را در خط فرمان وارد کنید، نه مفسر پایتون.


ماژول ها Modules

ماژول در 

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

راه اصلی برای استفاده از یک ماژول، افزودن import module_name در بالای کد خود است و سپس با استفاده از module_name.var برای دسترسی به توابع و مقادیر با نام var در ماژول است.
به عنوان مثال، در مثال زیر از ماژول random برای تولید اعداد تصادفی استفاده می کند:

import random

for i in range(5):
   value = random.randint(1, 6)
   print(value)

خروجی:

>>>
2
3
6
5
4
>>>

نکته:کد از تابع randint تعریف شده در ماژول تصادفی برای چاپ 5 عدد تصادفی در محدوده 1 تا 6 استفاده می کند.

نوع دیگری از حالت import وجود دارد و برای زمانی است که شما می خواهید یک تابع خاص از ماژول را مورد استفاده قرار دهید. مدل استفاده آن به شکل from module_name import var خواهد بود که var تابع داخل ماژول را مشخص می کند.

from math import pi

print(pi)

خروجی:

>>>
3.141592653589793
>>>

همچنین می توانید از comma باری جدا سازی توابع بهره ببرید.

from math import pi, sqrt

نکته:* همه اشیا را از یک ماژول وارد می کند. به عنوان مثال:from math import *
این کار توصیه شده است، زیرا متغیرها را در کد خود با متغیرهای موجود در ماژول خارجی اشتباه می گیرد.

تلاش برای وارد کردن یک ماژول که در دسترس نیست، باعث ایجاد کردن خطا می شود.

import some_module

خروجی:

>>>
ImportError: No module named 'some_module'
>>>

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

from math import sqrt as square_root
print(square_root(100))

خروجی:

>>>
10.0
>>>

توابع به عنوان شئ

اگرچه آنها به صورت متفاوتی از متغیرهای عادی ایجاد می شوند، توابع مانند هر نوع دیگری در 

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

def multiply(x, y):
   return x * y

a = 4
b = 7
operation = multiply
print(operation(a, b))

خروجی:

>>>
28
>>>

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

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

def add(x, y):
  return x + y

def do_twice(func, x, y):
  return func(func(x, y), func(x, y))

a = 5
b = 10

print(do_twice(add, a, b))

خروجی:

>>>
30
>>>

نکته: همانطور که می بینید تابع do_twice یک تابع دیگر را به عنوان آرگومان ورودی دریافت می کند و در بدنه کد خود استفاده می کند.


کامنت گذاری در پایتون

نظرات حاوی نکات مربوط به کد مورد استفاده برای درک بهتر آن است. آنها بر نحوه اجرا کد تاثیر نمی گذارد.

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

x = 365
y = 7
# this is a comment

print(x % y) # find the remainder
# print (x // y)
# another comment

خروجی:

>>>
1
>>>

نکته:پایتون نظر چند منظوره عمومی ندارد، همانطور که زبان های برنامه نویسی مانند C.

Docstrings (رشته های مستند سازی) هدف مشترکی را در ایجاد نظرات ارائه می دهند، زیرا آنها برای توضیح کد طراحی شده اند.
به عنوان مثال:

def shout(word):
  """
  Print a word with an
  exclamation mark following it.
  """
  print(word + "!")
    
shout("spam")

خروجی:

>>>
spam!
>>>

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


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

مجدد نویسی

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

تذکر:گفته می شود که کد تکراری نامناسب با اصل WET مطابقت دارد که Write Everything Twice» است یا ما از تایپ کردن لذت می بریم.

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

print("Hello world!")
range(2, 20)
str(12)
range(10, 20, 3)

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

ساخت تابع

اولین قدم در ساخت تابع

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

def my_func():
   print("spam")
   print("spam")
   print("spam")

my_func()

خروجی:

>>>
spam
spam
spam
>>>

نکته:بلوک کد در هر تابع با یک کولون (:) آغاز می شود و از هم جدا است.

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

>>hello()

def hello():
    print("Hello world!")

خروجی:

>>>>>
NameError: name 'hello' is not defined
>>>

آرگومان (argument) در تابع

توابع حاوی آرگومان یا argument

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

def print_with_exclamation(word):
   print(word + "!")
    
print_with_exclamation("spam")
print_with_exclamation("eggs")
print_with_exclamation("python")

خروجی:

>>>
spam!
eggs!
python!
>>>

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

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

def print_sum_twice(x, y):
   print(x + y)
   print(x + y)

print_sum_twice(5, 8)

خروجی:

>>>
13
13
>>>

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

def function(variable):
   variable += 1
   print(variable)

function(7)
print(variable)

خروجی:

>>>
8

NameError: name 'variable' is not defined
>>>

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

بازگشت پاسخ از تابع return

بعضی توابع، مقادیری مانند int یا str، را می توانند بازگردانند تا بعدا استفاده شود.
برای انجام این کار شما می توانید از عبارت return استفاده کنید.

به عنوان مثال:

def max(x, y):
    if x >=y:
        return x
    else:
        return y
        
print(max(4, 7))
z = max(8, 5)
print(z)

خروجی:

>>>
7
8
>>>

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

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

def add_numbers(x, y):
  total = x + y
  return total
  print("This won't be printed")

print(add_numbers(4, 5))

خروجی:

>>>
9
>>>

ماشین حساب ساده

این درس در مورد پروژه ای ساده در 

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

while True:
   print("Options:")
   print("Enter 'add' to add two numbers")
   print("Enter 'subtract' to subtract two numbers")
   print("Enter 'multiply' to multiply two numbers")
   print("Enter 'divide' to divide two numbers")
   print("Enter 'quit' to end the program")
   user_input = input(": ")

   if user_input == "quit":
      break
   elif user_input == "add":
      .
   elif user_input == "subtract":
      .
   elif user_input == "multiply":
      .
   elif user_input == "divide":
      .
   else:
      print("Unknown input")

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

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

elif user_input == "add":
  num1 = float(input("Enter a number: "))
  num2 = float(input("Enter another number: "))

در حال حاضر، هنگامی که کاربر ورودی add” می دهد، برنامه درخواست وارد کردن دو عدد و ذخیره آنها را در متغیرهای متناظر را خواهد داشت.

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

elif user_input == "add":
  num1 = float(input("Enter a number: "))
  num2 = float(input("Enter another number: "))
  result = str(num1 + num2)
  print("The answer is " + result)

ما اکنون یک برنامه کاری داریم که از کاربر ورودی میگیرد و سپس مقدار خروجی را محاسبه و چاپ می کند.
کد مشابهی باید برای شاخه های دیگر (برای تفریق، ضرب و تقسیم) نوشته شود.


حلقه for و دیگر حلقه های تکرار:

گاهی نیاز است تا یک عمل را بر روی هر یک از اعضای یک لیست انجام دهید. که در اینجا نیاز به حلقه های تکرار است. و این کار با حلقه while و یک شمارنده به عنوان counter صورت می گیرد.
به عنوان مثال:

words = ["hello", "world", "spam", "eggs"]
cnt = 0
max_index = len(words) - 1
while cnt <= max_index:
   word = words[cnt]
   print(word + "!")
   cnt = cnt + 1

خروجی:

>>>
hello!
world!
spam!
eggs!
>>>

نکته:در مثال بالا با استفاده از شاخصه های عددی اعضای لیست صدایشان می کند و عمل مورد نظر را بر رویشان انجام می دهد.

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

words = ["hello", "world", "spam", "eggs"]
for word in words:
  print(word + "!")

خروجی:

>>>
hello!
world!
spam!
eggs!
>>>

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

for i in range(5):
  print("hello!")

خروجی:

>>>
hello!
hello!
hello!
hello!
hello!
>>>

تابع range

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

numbers = list(range(10))
print(numbers)

خروجی:

>>>
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>

نکته: صدا کردن تابع list اجباریست چرا که Range به تنهایی یک شی و آیتم را خواهد ساخت. و همچنین می بایستی به لیست تبدیل شود تا بتوان نشانش داد.

اگر لیست با یک آرگومان صدا زده شود به صورت پیش فرض از 0 تا آن بازه را در نظر می گیرد. و در صورتی که از دو آرگومان تشکیل شود بازه میانی آن دو را نشان خواهد داد.
البته به صورت n تا n-1 خواهد بود.

numbers = list(range(3, 8))
print(numbers)

print(range(20) == range(0, 20))

خروجی:

>>>
[3, 4, 5, 6, 7]

True
>>>

Range می تواند یک استدلال سوم داشته باشد که فاصله بازه تولید شده را تعیین می کند. این استدلال سوم باید یک عدد صحیح باشد.

numbers = list(range(5, 20, 2))
print(numbers)

خروجی:

>>>
[5, 7, 9, 11, 13, 15, 17, 19]
>>>

توابع در لیست

متد append

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

nums = [1, 2, 3]
nums.append(4)
print(nums)

خروجی:

>>>
[1, 2, 3, 4]
>>>

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

متد len

از متد len برای به دست آوردن تعداد آیتم های داخل لیست استفاده می شود.

nums = [1, 3, 5, 2, 4]
print(len(nums))

خروجی:

>>>
5
>>>

نکته: برخلاف append در حقیقت len یک تابع عادی است و نه یک متد. پس به این معناست که نیازی به نقطع ندارد و قبل از آیتم صدا زده می شود.

متد insert

این متد تشابهاتی با متد append دارد با این تفاوت که می توانید جایگاه اضافه کردن آیتم را نیز مشخص کنید حتی در انتها.

words = ["Python", "fun"]
index = 1
words.insert(index, "is")
print(words)

خروجی:

>>>
['Python', 'is', 'fun']
>>>
متد index

در این متد از 

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

letters = ['p', 'q', 'r', 's', 'p', 'u']
print(letters.index('r'))
print(letters.index('p'))
print(letters.index('z'))

خروجی:

>>>
2
0
ValueError: 'z' is not in list
>>>

نکته:
چند توابع و روش مفید برای لیست ها وجود دارد.
max (list): عنصر لیست با حداکثر مقدار را می دهد
min (list): آیتم لیست با حداقل مقدار را باز می گرداند
list.count (obj): شمارش تعداد چند بار یک مورد در یک لیست را نشان می دهد
list.remove (obj): حذف یک شی از یک لیست
list.reverse (): اشیا را در یک لیست مع می کند


عملیات ها در لیست

جایگزین کردن:

یک آیتم در جایگاه خاصی را می توان مقدارش را تغییر داد.

nums = [7, 7, 7, 7, 7]
nums[2] = 5
print(nums)

خروجی:

>>>
[7, 7, 5, 7, 7]
>>>
جمع و چند برابر کردن:

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

پایتون به یکدیگر اضافه و یا ضرب شوند.
برای مثال:

nums = [1, 2, 3]
print(nums + [4, 5, 6])
print(nums * 3)

خروجی:

>>>
[1, 2, 3, 4, 5, 6]
[1, 2, 3, 1, 2, 3, 1, 2, 3]
>>>

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

بودن یا نبودن:( مسئله کدومه؟!؟)

برای بررسی اینکه آیا یک آیتم در لیست است، از اپراتور in میتواند استفاده شود. اگر عنصر یک یا چند بار در لیست نمایش داده شود True، و در صورت نبودن مقدار False بر خواهد گشت.

words = ["spam", "egg", "spam", "sausage"]
print("spam" in words)
print("egg" in words)
print("tomato" in words)

خروجی:

>>>
True
True
False
>>>

نکته:اپراتور in در واقع می تواند بر پی بردن به اینکه یک رشته در واقع زیر مجموعه یک رشته دیگر است یا نه نیز استفاده شود.

برای بررسی اینکه آیا یک مورد در لیست نیست، شما می توانید از اپراتور not در یکی از روش های زیر استفاده کنید:

nums = [1, 2, 3]
print(not 4 in nums)
print(4 not in nums)
print(not 3 in nums)
print(3 not in nums)

خروجی:

>>>
True
True
False
False
>>>

Tuple در پایتون

Tuple ها به لیستها بسیار شبیه هستند، به جز اینکه Tuple ها غیرقابل تغییر هستند .
همچنین، آنها با استفاده از پرانتز، به جای براکت مربعی، ایجاد می شوند.
مثال:

words = ("spam", "eggs", "sausages",)

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

print(words[0])

تلاش برای تخصیص یک مقدار در یک Tuple، یک TypeError را ایجاد می کند.

words[1] = "cheese"

خروجی:

>>>
TypeError: 'tuple' object does not support item assignment
>>>

نکته:مانند لیست ها و dictionary ها، tuple ها را می توان در داخل یکدیگر قرار داد.

tuple ها را می توان فقط با جدا کردن مقادیر با کاما و بدون پرانتز ایجاد کرد.
مثال:

my_tuple = "one", "two", "three"
print(my_tuple[0])

خروجی:

>>>
one
>>>

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

tpl = ()

نکته:tuple ها سریعتر از لیست ها هستند اما قابل تغییر نیستند.


توابع dictionary

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

squares = {1: 1, 2: 4, 3: "error", 4: 16,}
squares[8] = 64
squares[3] = 9
print(squares)

خروجی:

{8: 64, 1: 1, 2: 4, 3: 9, 4: 16}

برای تعیین اینکه آیا یک کلید در یک dictionary است، می توانید از in و not in استفاده کنید، همانطور که می توانید برای یک لیست نیز استفاده کنید.
مثال:

nums = {
  1: "one",
  2: "two",
  3: "three",
}
print(1 in nums)
print("three" in nums)
print(4 not in nums)

خروجی:

>>>
True
False
True
>>>

یکی از متد های مفید پایتون که در Dictionary می باشد get است. این همان چیزی است که نمایه سازی (index) می کند، اما اگر کلید در dictionary یافت نشد، مقدار دیگر مشخص شده را به جای آن (به صورت پیش فرض none”) به دست می آید.
مثال:

pairs = {1: "apple",
  "orange": [2, 3, 4], 
  True: False, 
  None: "True",
}

print(pairs.get("orange"))
print(pairs.get(7))
print(pairs.get(12345, "not in dictionary"))

خروجی:

>>>
[2, 3, 4]
None
not in dictionary
>>>

dictionary در پایتون

Dictionaries ساختارهای داده مورد استفاده برای نمایش کلیدهای دلخواه به ارزش هستند.
لیست ها را می توان به عنوان فرهنگ لغت با کلید های صحیح در یک محدوده خاص در نظر گرفت.
Dictionaries را می توان به صورت مشابه با لیست ها، با استفاده از براکت های حاوی کلیدها، نشان داد.
مثال:

ages = {"Dave": 24, "Mary": 42, "John": 58}
print(ages["Dave"])
print(ages["Mary"])

خروجی:

>>>
24
42
>>>

نکته:هر عنصری را در dictionary می توان به حالت keyLvalue نشان داد.

تلاش برای باز کردن فهرست یک کلید که بخشی از dictionary نیست، KeyError را باز می کند.
مثال:

primary = {
  "red": [255, 0, 0], 
  "green": [0, 255, 0], 
  "blue": [0, 0, 255], 
}

print(primary["red"])
print(primary["yellow"])

خروجی:

>>>
[255, 0, 0]

KeyError: 'yellow'
>>>

همانطور که می بینید، یک dictionary می تواند هر نوع داده را به عنوان مقادیر ذخیره کند.

نکته:یک dictionary خالی را با {} نشان می دهند.

تنها اشیاء غیر قابل تغییر می توانند به عنوان کلید های dictionary مورد استفاده قرار گیرند. اشیاء غیر قابل تعویض هستند که قابل تغییر نیستند. تاکنون، تنها اشیا قابل تغییر که شما در آن قرار داده اید، لیست ها و dictionary ها هستند. تلاش برای استفاده از یک شیء قابل تغییر به عنوان یک کلید واژه دیکشنری سبب ایجاد TypeError می شود.

bad_dict = {
  [1, 2, 3]: "one two three", 
}

خروجی:

>>>
TypeError: unhashable type: 'list'
>>>

استفاده از None در پایتون

None برای نشان دادن عدم وجود یک مقدار استفاده می شود.
این در زبان های دیگر برنامه نویسی مشابه است.
مانند دیگر مقادیر خالی مانند 0، [] و رشته خالی، زمانی که به یک متغیر بولی تبدیل می شود false خواهد بود.
هنگامی که در کنسول Python وارد شدید، به عنوان رشته خالی نمایش داده می شود.

>>> None == None
True
>>> None
>>> print(None)
None
>>>

None در واقع توسط هر تابعی که به عنوان مقدار بازگردانده می شود که هیچ چیزی برای برگرداندن ندارد.

def some_func():
   print("Hi!")

var = some_func()
print(var)

خروجی:

>>>
Hi!
None
>>>

کار کردن با فایل

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

try:
   f = open("filename.txt")
   print(f.read())
finally:
   f.close()

این تضمین می کند که فایل همیشه بسته است، حتی اگر یک خطا رخ دهد.

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

with open("filename.txt") as f:
   print(f.read())

نکته:فایل به طور خودکار در انتهای بیانیه With بسته می شود، حتی اگر با Exception برخورد کند.


نوشتن در فایل

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

file = open("newfile.txt", "w")
file.write("This has been written to a file")
file.close()

file = open("newfile.txt", "r")
print(file.read())
file.close()

خروجی:

>>>
This has been written to a file
>>>

نکته:حالت w” یک فایل ایجاد می کند، اگر قبلا وجود نداشته باشد.

هنگامی که یک فایل در حالت نوشتن باز می شود، محتوای موجود در فایل حذف می شود.

file = open("newfile.txt", "r")
print("Reading initial contents")
print(file.read())
print("Finished")
file.close()

file = open("newfile.txt", "w")
file.write("Some new text")
file.close()

file = open("newfile.txt", "r")
print("Reading new contents")
print(file.read())
print("Finished")
file.close()

خروجی:

>>>
Reading initial contents
some initial text
Finished
Reading new contents
Some new text
Finished
>>>

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

متد write در صورتی که موفق باشد مقدار بایت نوشته شده رد فایل را فراخواهد خواند.

msg = "Hello world!"
file = open("newfile.txt", "w")
amount_written = file.write(msg)
print(amount_written)
file.close()

خروجی:

>>>
12
>>>

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

محتویات یک پرونده که در حالت متن باز شده است می تواند با استفاده از متد read خوانده شود. (خواندن فایل در حال حاضر محدود به فایل متنی است)

file = open("filename.txt", "r")
cont = file.read()
print(cont)
file.close()

نکته:این همه محتویات فایل filename.txt” را چاپ می کند.

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

file = open("filename.txt", "r")
print(file.read(16))
print(file.read(4))
print(file.read(4))
print(file.read())
file.close()

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

file = open("filename.txt", "r")
file.read()
print("Re-reading")
print(file.read())
print("Finished")
file.close()

خروجی:

>>>
Re-reading

Finished
>>>

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

file = open("filename.txt", "r")
print(file.readlines())
file.close()

خروجی:

>>>
['Line 1 text \n', 'Line 2 text \n', 'Line 3 text']
>>>

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

file = open("filename.txt", "r")

for line in file:
    print(line)

file.close()

خروجی:

>>>
Line 1 text

Line 2 text

Line 3 text
>>>

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


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


در این تمرین ابتدا با تابع input از کاربر یک رشته گرفته ایم و در word ریخته ایم. سپس با تابع len طول آن رشته را در یک متغیر به اسم i ذخیره کرده ایم. و سپس متغیر rev را برای رشته برعکس شده ساخته ایم.

در حلقه while شرط گذاشته ایم که تا وقتی که i صفر نشده، محتویات متغیر rev را با [i-1] رشته مان یعنی word جمع کن و بعد یکی از i کم کن.

همانطور که میدانید کامپیوتر ها از صفر میشمرند یعنی مثلا اگر طول word ما 3 بود بدین صورت است :

حرف اول : 0

حرف دوم: 1

حرف سوم:2

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

در آخر تمام این کدها در یک حلقه بینهایت (While True) قرار داده شده تا برنامه تا همیشه اجرا شود.


824627_photo_2019-06-27_23-26-00.jpg


چاپ جایگشت های حروف یک عبارت


برای محاسبه تعداد جایگشت های حروف یک کلمه ابتدا باید کتابخانه itertools را وارد کنیم، سپس از کاربر واژه مورد نظر را با input بگیریم و در متغیر word ذخیره کنیم. در نهایت میتوانیم با itertools.permutations به یک لیست از جایگشت های word برسیم که اینجا در متغیر per ذخیره شده.

حالا میتوانیم آنها را با یک حلقه چاپ کنیم. در حلقه گفته ایم به ازای هر i در per ، متغیر i را تبدیل به رشته معمولی کن - با استفاده از ''.join () - و چاپ کن.

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


02888_photo_2019-06-27_23-25-56.jpg


lambda

توابع lambda

ایجاد یک تابع به طور معمول با استفاده از def صورت می گیرد و به طور خودکار آن را به یک متغیر اختصاص می دهد.
این کار نسبت به ساخت دیگر object ها متفاوت است – مانند رشته ها و اعداد صحیح – که می توانند در هنگام کد نویسی و در هر جایی ایجاد شوند بدون اینکه آنها را به یک متغیر اختصاص دهید.
همان کار با توابعی امکان پذیر است، در صورتی که با استفاده از lambda ایجاد می شوند. توابع ایجاد شده در این روش ناشناس هستند.
این رویکرد اغلب هنگام انتقال یک تابع ساده به عنوان یک استدلال به عملکرد دیگر استفاده می شود. نحوه عملکرد آن در مثال زیر نشان داده شده است و شامل کلید واژه lambda است که به دنبال آن یک لیست از استدلال، کولون و بیانات برای ارزیابی و بازگشت پاسخ در نظر گرفته شده است.

def my_func(f, arg):
  return f(arg)

my_func(lambda x: 2*x*x, 5)

نکته: تابع lambda نام خود را از محاسبات لامبدا دریافت می کنند که یک مدل محاسباتی است که توسط کلیسای آلونزو اختراع شده است.

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

#named function
def polynomial(x):
    return x**2 + 5*x + 4
print(polynomial(-4))

#lambda
print((lambda x: x**2 + 5*x + 4) (-4))

خروجی:

>>>
0
0
>>>

نکته: در کد بالا، ما یک تابع ناشناس ایجاد کردیم و با یک استدلال آن را نامگذاری کردیم.

توابع lambda را می توان به متغیرها اختصاص داد و از توابع عادی استفاده کرد.
مثال:

double = lambda x: x * 2
print(double(7))

خروجی:

>>>
14
>>>

نکته:با این حال، به ندرت دلیل خوبی برای انجام این کار وجود دارد – معمولا بهتر است یک تابع با def تعریف کنیم.


برنامه نویسی تابع گرا یا functional programming

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

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

def apply_twice(func, arg):
   return func(func(arg))

def add_five(x):
   return x + 5

print(apply_twice(add_five, 10))

خروجی:

>>>
20
>>>

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

توابع خالص و ناخالص (pure and impure functions)

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

def pure_function(x, y):
  temp = x + 2*y
  return temp / (2*x + y)

عملکرد ناخالص:

some_list = []

def impure(arg):
  some_list.append(arg)

نکته:تابع بالا خالص نیست، زیرا حالت some_list را تغییر داد.

استفاده از توابع خالص هم مزایا و هم معایب دارد.
توابع خالص عبارتند از:
– ساده تر در شفاف سازی و تست کردن
– کارآمدتر. هنگامی که عملکرد برای یک ورودی ارزیابی می شود، نتیجه می تواند ذخیره شود و به دفعه بعد که عملکرد آن ورودی مورد نیاز است، نسبت دهد تا تعداد دفعاتی که تابع فراخوانی می شود کاهش یابد. به این مدل memoization یا به اصطلاح یادداشت برداری می گویند.
– راحت تر به صورت parallel یا موازی اجرا شود.

نکته:معایب اصلی استفاده از تنها توابع خالص این است که آنها وظیفه ساده و آسان I / O را به شدت پیچیده می کنند، زیرا به نظر می رسد به طور ذاتی نیاز به عوارض جانبی دارد. همچنین می توانند در بعضی موقعیت ها دشوار باشند.


توابع کاربردی

پایتون دارای بسیاری از توابع و روش های مفید درونیست که برای انجام وظایف مشترک است.
join – پیوستن به یک لیست از رشته ها با رشته دیگری به عنوان جدا کننده.
replace – جایگزین یک رشته در رشته با دیگری است.
start with و endswith – تعیین اینکه آیا زیر رشته در ابتدای و پایان رشته وجود دارد.
برای تغییر case یک رشته، می توانید از حروف بزرگ و کوچک استفاده کنید.
روش split ، مخالف join است، و یک رشته را با یک جداکننده خاص به یک لیست تبدیل می کند.
بعضی مثالها:

print(", ".join(["spam", "eggs", "ham"]))
#prints "spam, eggs, ham"

print("Hello ME".replace("ME", "world"))
#prints "Hello world"

print("This is a sentence.".startswith("This"))
# prints "True"

print("This is a sentence.".endswith("sentence."))
# prints "True"

print("This is a sentence.".upper())
# prints "THIS IS A SENTENCE."

print("AN ALL CAPS SENTENCE".lower())
#prints "an all caps sentence"

print("spam, eggs, ham".split(", "))
#prints "['spam', 'eggs', 'ham']"

برای پیدا کردن حداکثر یا حداقل برخی از اعداد یا یک لیست، می توانید از max یا min استفاده کنید.
برای پیدا کردن فاصله از یک عدد از صفر (مقدار مطلق آن)، از abs استفاده کنید.
برای گرد کردن یک عدد به تعداد مشخصی از اعشار، از round استفاده کنید.
برای پیدا کردن مجموع لیست، از sum استفاده کنید.
بعضی مثالها:

print(min(1, 2, 3, 4, 0, 2, 1))
print(max([1, 4, 9, 2, 5, 6, 8]))
print(abs(-99))
print(abs(42))
print(sum([1, 2, 3, 4, 5]))

خروجی:

>>>
0
9
99
42
15
>>>

اغلب در اظهارات شرطی مورد استفاده قرار می گیرد، همه و هر یک را به عنوان یک استدلال می گیرند، و همگی و یا یکی از آن ها مقدار true را در صورتی که برابر با مقدار درست باشد بر می گرداند.
تابع شمارش یا enumerate را می توان برای تکرار از طریق ارزش ها و شاخص های یک لیست به طور همزمان استفاده می شود.
مثال:

nums = [55, 44, 33, 22, 11]

if all([i > 5 for i in nums]):
   print("All larger than 5")

if any([i % 2 == 0 for i in nums]):
   print("At least one is even")

for v in enumerate(nums):
   print(v)

خروجی:

>>>
All larger than 5
At least one is even
(0, 55)
(1, 44)
(2, 33)
(3, 22)
(4, 11)
>>>

string format

قالب بندی رشته یا String formatting

تا کنون، برای ترکیب رشته ها و غیر رشته ها در 

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

# string formatting
nums = [4, 5, 6]
msg = "Numbers: {0} {1} {2}". format(nums[0], nums[1], nums[2])
print(msg)

خروجی:

>>>
Numbers: 4 5 6
>>>

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

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

a = "{x}, {y}".format(x=5, y=12)
print(a)

خروجی:

>>>
5, 12
>>>

list comprehensions

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

# a list comprehension
cubes = [i**3 for i in range(5)]

print(cubes)

خروجی:

>>>
[0, 1, 8, 27, 64]
>>>

نکته:فراخوانی فهرست توسط نماد set-builder در ریاضیات الهام گرفته شده است.

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

evens=[i**2 for i in range(10) if i**2 % 2 == 0]

print(evens)

خروجی:

>>>
[0, 4, 16, 36, 64]
>>>

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

even = [2*i for i in range(10**100)]

خروجی:

>>>
MemoryError
>>>

نکته:این مسئله توسط ژنراتورها حل شده است که در ماژول بعدی پوشش داده شده است.


list slices

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

squares = [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
print(squares[2:6])
print(squares[3:8])
print(squares[0:1])

خروجی:

>>>
[4, 9, 16, 25]
[9, 16, 25, 36, 49]
[0]
>>>

نکته:همانند آرگومان هایی برای Range، اولین شاخص ارائه شده در یک slice در نتیجه گنجانده شده است، اما در slice دوم آن نیست.

اگر شماره اول در یک slice حذف شده باشد،مقدارش برای شروع لیست در نظر گرفته شده است.
اگر عدد دوم حذف شده باشد، مقدارش برای پایان در نظر گرفته شده است.
مثال:

squares = [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
print(squares[:7])
print(squares[7:])

خروجی:

>>>
[0, 1, 4, 9, 16, 25, 36]
[49, 64, 81]
>>>

نکته:sliceنیز می تواند بر روی tuple نیز انجام شود.

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

squares = [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
print(squares[::2])
print(squares[2:8:3])

خروجی:

>>>
[0, 4, 16, 36, 64]
[4, 25]
>>>

نکته:[2: 8: 3] شامل عناصر شروع از 2 تا 8 با واسته 3 تایی است.

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

squares = [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
print(squares[1:-1])

خروجی:

>>>
[1, 4, 9, 16, 25, 36, 49, 64]
>>>

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


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


# Python program to print all  

# prime number in an interval 

  

start =int( input("Please Enter Statr Number: "))


end =  int( input("Please Enter End Number: "))

  

for val in range(start, end + 1): 

      

   # If num is divisible by any number   

   # between 2 and val, it is not prime  

   if val > 1: 

       for n in range(2, val): 

           if (val % n) == 0: 

               break

       else: 

           print(val) 


u76042_01.jpg


در این پست آموزشی قصد دارم که ارسال ُ نوشتن و ویرایش یک پست الکترونیک را با هم ببینیم و همچنین بعد با پروتکلها و استاندارهایی همچون MIME  و ارسال نامه به این سبک را آموزش دهم. با من (سعید دامغانیان) همراه باشید.

در قطعه کد زیر اولاْ ارسال یک ایمیل ساده را بررسی کنید :

# Import smtplib for the actual sending function
import smtplib

# Import the email modules we'll need
from email.message import EmailMessage

# Open the plain text file whose name is in textfile for reading.
with open(textfile) as fp:
    # Create a text/plain message
    msg = EmailMessage()
    msg.set_content(fp.read())

# me == the sender's email address
# you == the recipient's email address
msg['Subject'] = 'The contents of %s' % textfile
msg['From'] = me
msg['To'] = you

# Send the message via our own SMTP server.
s = smtplib.SMTP('localhost')
s.send_message(msg)
s.quit()

حال با استاندارد RFC822 آشنا شده و سپس کد زیر را بررسی کنید :

# Import the email modules we'll need
from email.parser import BytesParser, Parser
from email.policy import default

# If the e-mail headers are in a file, uncomment these two lines:
# with open(messagefile, 'rb') as fp:
#     headers = BytesParser(policy=default).parse(fp)

#  Or for parsing headers in a string (this is an uncommon operation), use:
headers = Parser(policy=default).parsestr(
        'From: Foo Bar <user@example.com>\n'
        'To: <someone_else@example.com>\n'
        'Subject: Test message\n'
        '\n'
        'Body would go here\n')

#  Now the header items can be accessed as a dictionary:
print('To: {}'.format(headers['to']))
print('From: {}'.format(headers['from']))
print('Subject: {}'.format(headers['subject']))

# You can also access the parts of the addresses:
print('Recipient username: {}'.format(headers['to'].addresses[0].username))
print('Sender name: {}'.format(headers['from'].addresses[0].display_name))

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

# Import smtplib for the actual sending function
import smtplib

# And imghdr to find the types of our images
import imghdr

# Here are the email package modules we'll need
from email.message import EmailMessage

# Create the container email message.
msg = EmailMessage()
msg['Subject'] = 'Our family reunion'
# me == the sender's email address
# family = the list of all recipients' email addresses
msg['From'] = me
msg['To'] = ', '.join(family)
msg.preamble = 'You will not see this in a MIME-aware mail reader.\n'

# Open the files in binary mode.  Use imghdr to figure out the
# MIME subtype for each specific image.
for file in pngfiles:
    with open(file, 'rb') as fp:
        img_data = fp.read()
    msg.add_attachment(img_data, maintype='image',
                                 subtype=imghdr.what(None, img_data))

# Send the email via our own SMTP server.
with smtplib.SMTP('localhost') as s:
    s.send_message(msg)

در قطعه کد زیر فصد داریم محتویات یک دایرکتوری را به استاندارد MIME ارسال کنیم.

#!/usr/bin/env python3

"""Send the contents of a directory as a MIME message."""

import os
import smtplib
# For guessing MIME type based on file name extension
import mimetypes

from argparse import ArgumentParser

from email.message import EmailMessage
from email.policy import SMTP


def main():
    parser = ArgumentParser(description="""\
Send the contents of a directory as a MIME message.
Unless the -o option is given, the email is sent by forwarding to your local
SMTP server, which then does the normal delivery process.  Your local machine
must be running an SMTP server.
""")
    parser.add_argument('-d', '--directory',
                        help="""Mail the contents of the specified directory,
                        otherwise use the current directory.  Only the regular
                        files in the directory are sent, and we don't recurse to
                        subdirectories.""")
    parser.add_argument('-o', '--output',
                        metavar='FILE',
                        help="""Print the composed message to FILE instead of
                        sending the message to the SMTP server.""")
    parser.add_argument('-s', '--sender', required=True,
                        help='The value of the From: header (required)')
    parser.add_argument('-r', '--recipient', required=True,
                        action='append', metavar='RECIPIENT',
                        default=[], dest='recipients',
                        help='A To: header value (at least one required)')
    args = parser.parse_args()
    directory = args.directory
    if not directory:
        directory = '.'
    # Create the message
    msg = EmailMessage()
    msg['Subject'] = 'Contents of directory %s' % os.path.abspath(directory)
    msg['To'] = ', '.join(args.recipients)
    msg['From'] = args.sender
    msg.preamble = 'You will not see this in a MIME-aware mail reader.\n'

    for filename in os.listdir(directory):
        path = os.path.join(directory, filename)
        if not os.path.isfile(path):
            continue
        # Guess the content type based on the file's extension.  Encoding
        # will be ignored, although we should check for simple things like
        # gzip'd or compressed files.
        ctype, encoding = mimetypes.guess_type(path)
        if ctype is None or encoding is not None:
            # No guess could be made, or the file is encoded (compressed), so
            # use a generic bag-of-bits type.
            ctype = 'application/octet-stream'
        maintype, subtype = ctype.split('/', 1)
        with open(path, 'rb') as fp:
            msg.add_attachment(fp.read(),
                               maintype=maintype,
                               subtype=subtype,
                               filename=filename)
    # Now send or store the message
    if args.output:
        with open(args.output, 'wb') as fp:
            fp.write(msg.as_bytes(policy=SMTP))
    else:
        with smtplib.SMTP('localhost') as s:
            s.send_message(msg)


if __name__ == '__main__':
    main()
در اینجا طریقه باز کردن ایمیل دریافتی مشابه بالا را در همان استاندارد بررسی خواهیم نمود 
#!/usr/bin/env python3

"""Unpack a MIME message into a directory of files."""

import os
import email
import mimetypes

from email.policy import default

from argparse import ArgumentParser


def main():
    parser = ArgumentParser(description="""\
Unpack a MIME message into a directory of files.
""")
    parser.add_argument('-d', '--directory', required=True,
                        help="""Unpack the MIME message into the named
                        directory, which will be created if it doesn't already
                        exist.""")
    parser.add_argument('msgfile')
    args = parser.parse_args()

    with open(args.msgfile, 'rb') as fp:
        msg = email.message_from_binary_file(fp, policy=default)

    try:
        os.mkdir(args.directory)
    except FileExistsError:
        pass

    counter = 1
    for part in msg.walk():
        # multipart/* are just containers
        if part.get_content_maintype() == 'multipart':
            continue
        # Applications should really sanitize the given filename so that an
        # email message can't be used to overwrite important files
        filename = part.get_filename()
        if not filename:
            ext = mimetypes.guess_extension(part.get_content_type())
            if not ext:
                # Use a generic bag-of-bits extension
                ext = '.bin'
            filename = 'part-%03d%s' % (counter,

  turtle و math  کدی نوشتم که شکل یک لانه ی زنبور را ترسیم کند. با استفاده از


# Hive

# By: Saeed Damghanian


from turtle import *

from math import *


def line(x, y, x2, y2):

    ''' Draw a line from (x, y) to (x2, y2) '''

    penup()

    goto(x, y)

    pendown()

    goto(x2, y2)



def draw_tree(x, y, size, angle,n):

    ''' Draw a tree of given size and angle at (x, y) '''

    if n==1:

        return

    if size < 4:

        return

    x2 = x + size * cos(radians(angle))

    y2 = y + size * sin(radians(angle))

    line(x, y, x2, y2)

    draw_tree(x2, y2, size , angle + 60,n-1)

    draw_tree(x2, y2, size , angle - 60,n-1)



# main program

#tracer(0,0)


#speed(10)

#delay(2)

draw_tree(0, 0, 50, 90,10)

mainloop()


u544287_Untitled.png


کدی که در ذیل مشاهده می‌کنید یک خورشید را به صورت خطهای هندسی رسم کرده و رنگ میزند. #جالبناک


from turtle import *

color('blue', 'yellow')

begin_fill()

while True:

    forward(200)

    left(100)

    if abs(pos()) < 1:

        break

end_fill()

done()


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

n488379_Untitled.png


برنامه ای نوشتم که آدرس یک سایت رو بگیره و آی پی سایت رو نمایش بده. خیلی ساده (البته گرافیکی* #پایتون )


#Code By Saeed Damghanian

#Software Engineer from Semnan


import os, socket

import tkinter as tk

from tkinter import font


def response(a):

    b = socket.gethostbyname(a)

    c = "\n \n \nProgrammer: Saeed Damghanian\nWebsPyschool.blog.ir\nWant to Join our Telegram Channel? >> t.me/ghoghnous_iran"

    return b + c


def do(a):

    label['text'] = response(a)


root = tk.Tk()

root.title('Get Website Ip')


canvas = tk.Canvas(root, height=500, width=600)

canvas.pack()


#background_image1 = tk.PhotoImage(file='bg.png')

#background_label =tk.Label(root, image=background_image1)

#background_label.place(relwidth=1, relheight=1)


frame = tk.Frame(root, bg='#C02F11', bd=5)

frame.place(relx=0.5, rely=0.1, relwidth=0.75, relheight=0.1, anchor='n')


entry = tk.Entry(frame, font=('Modern', 15))

entry.insert(0, 'Website URL')

entry.place(relwidth=0.65, relheight=1)


button = tk.Button(frame, text='Get IP', bd=0, bg='white', fg='#098f00', font=60, command=lambda:do(entry.get()))

button.place(relx=0.7, relheight=1, relwidth=0.3)


lower_frame = tk.Frame(root, bg='#0ed400', bd=10)

lower_frame.place(relx=0.5, rely=0.25, relwidth=0.75, relheight=0.6, anchor='n')


label = tk.Label(lower_frame, font=('Modern', 15), anchor='nw', bg='#323142', fg='white', justify='left', bd=4)

label.place(relwidth=1, relheight=1)


root.mainloop()


g241362_Untitled.png



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


#Programmer : Saeed Damghanian

#Web : Pyschool.blg.ir


# Function for nth Fibonacci number 

  

def Fibonacci(n): 

    if n<0: 

        print("Incorrect input") 

    # First Fibonacci number is 0 

    elif n==1: 

        return 0

    # Second Fibonacci number is 1 

    elif n==2: 

        return 1

    else: 

        return Fibonacci(n-1)+Fibonacci(n-2) 

  

# Driver Program 


n=int(input("Pleas Enter n: "))  

print(Fibonacci(n)) 

  


#------------Telegram: @Ghoghnous_Iran-----------------------




b444745_Untitled.png


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


#Programmer : Saeed Damghanian

#Web : Pyschool.blg.ir


def bubbleSort(arr):

    n = len(arr)

 

    # Traverse through all array elements

    for i in range(n):

 

        # Last i elements are already in place

        for j in range(0, n-i-1):

 

            # traverse the array from 0 to n-i-1

            # Swap if the element found is greater

            # than the next element

            if arr[j] > arr[j+1] :

                arr[j], arr[j+1] = arr[j+1], arr[j]

 

# Driver code to test above

arr = [64, 34, 25, 12, 22, 11, 90]

 

bubbleSort(arr)

 

print ("Sorted array is:")

for i in range(len(arr)):

    print ("%d" %arr[i])


#------------Telegram: @Ghoghnous_Iran-----------------------



a887838_Untitled.png



برنامه زیر ضرائب معادله درجه 2 را گرفته و معادله را حل نموده و جوابهای معادله را در صورت حقیقی بودن نمایش می‌دهد. سعی کنید برنامه‌ای بنویسید که جوابهای موهمومی معادله را نیز محاسبه و چاپ کند.


#Programmer : Saeed Damghanian

#Web : Pyschool.blg.ir


import math

a=int(input("Please Enter a: "))

b=int(input("Please Enter b: "))

c=int(input("Please Enter c: "))

delta=b*b-4*a*c

if delta==0 :

    x=(-b + math.sqrt(delta))

    print("Moadele Yek javab darad. X=",x)

elif delta<0:

    print("Moadele javabe haghighi nadarad!")

else :    

    x1=(-b + math.sqrt(delta))/(2*a)

    x2=(-b - math.sqrt(delta))/(2*a)

    print("Moadele 2 javab darad.\n X1= ",x1, "\nX2= " , x2)


#------------Telegram: @Ghoghnous_Iran-----------------------


 

h909262_Untitled.png


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

# Selection sort in Python
# time complexity O(n*n)
#sorting by finding min_index
def selectionSort(array, size):

	for ind in range(size):
		min_index = ind

		for j in range(ind + 1, size):
			# select the minimum element in every iteration
			if array[j] < array[min_index]:
				min_index = j
		# swapping the elements to sort the array
		(array[ind], array[min_index]) = (array[min_index], array[ind])

arr = [-2, 45, 0, 11, -9,88,-97,-202,747]
size = len(arr)
selectionSort(arr, size)
print('The array after sorting in Ascending Order by selection sort is:')
print(arr)

موفق و پیروز باشید - سعید دامغانیان


آخرین ارسال ها

آخرین وبلاگ ها

آخرین جستجو ها