مقدمه پایتون

پیش درآمد

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

اگر به دنبال یک دوره همراه MOOC هستید، دوره های Udacity و Coursera ( مقدمه برنامه نویسی [مبتدیان] یا مقدمه پایتون ) را امتحان کنید. در نهایت، اگر به دنبال یادگیری آنلاین خودسرانه و بدون تماشای ویدیو هستید، موارد ذکر شده در انتهای این پست را امتحان کنید - هر محتوای یادگیری ویژگی و همچنین یک مفسر تعاملی پایتون که می‌توانید با آن تمرین کنید. این "مترجم" که ذکر می کنیم چیست؟ در بخش بعدی متوجه خواهید شد!

معرفی زبان

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

یک راه عالی برای دیدن نحوه عملکرد کد پایتون، اجرای مفسر پایتون و تایپ کد مستقیم در آن است. اگر تا به حال سوالی مانند "اگر یک int به list اضافه کنم چه اتفاقی می افتد؟" فقط تایپ آن در مفسر پایتون یک راه سریع و احتمالاً بهترین راه برای دیدن آنچه اتفاق می افتد است. (برای اینکه ببینید واقعا چه اتفاقی می افتد به زیر مراجعه کنید!)

$ python3        ## Run the Python interpreter
Python 3.X.X (XXX, XXX XX XXXX, XX:XX:XX) [XXX] on XXX
Type "help", "copyright", "credits" or "license" for more information.
>>> a = 6       ## set a variable in this interpreter session
>>> a           ## entering an expression prints its value
6
>>> a + 2
8
>>> a = 'hi'    ## 'a' can hold a string just as well
>>> a
'hi'
>>> len(a)      ## call the len() function on a string
2
>>> a + len(a)  ## try something that doesn't work
Traceback (most recent call last):
  File "", line 1, in 
TypeError: can only concatenate str (not "int") to str
>>> a + str(len(a))  ## probably what you really wanted
'hi2'
>>> foo         ## try something else that doesn't work
Traceback (most recent call last):
  File "", line 1, in 
NameError: name 'foo' is not defined
>>> ^D          ## type CTRL-d to exit (CTRL-z in Windows/DOS terminal)

دو خط پایتون بعد از تایپ python و قبل از اعلان >>> چاپ می شود که در مورد نسخه پایتونی که استفاده می کنید و جایی که ساخته شده است می گوید. تا زمانی که اولین چیزی که چاپ می شود "Python 3" است، این نمونه ها باید برای شما مفید باشند.

همانطور که در بالا می بینید، آزمایش با متغیرها و عملگرها آسان است. همچنین، اگر کد سعی کند متغیری را بخواند که مقداری به آن اختصاص داده نشده است، مفسر به زبان پایتون یک خطای زمان اجرا ایجاد می کند. مانند C++ و جاوا، پایتون به حروف بزرگ و کوچک حساس است، بنابراین "a" و "A" متغیرهای متفاوتی هستند. انتهای یک خط پایان یک عبارت را نشان می دهد، بنابراین برخلاف C++ و جاوا، پایتون در انتهای هر دستور نیازی به نقطه ویرگول ندارد. نظرات با "#" شروع می شود و تا انتهای خط ادامه می یابد.

کد منبع پایتون

فایل های منبع پایتون از پسوند ".py" استفاده می کنند و "ماژول" نامیده می شوند. با ماژول Python hello.py ، ساده‌ترین راه برای اجرای آن با دستور پوسته "python hello.py Alice" است که مفسر پایتون را فرا می‌خواند تا کد را در hello.py اجرا کند و آرگومان خط فرمان "Alice" را به آن ارسال کند. صفحه اسناد رسمی را در تمام گزینه‌های مختلفی که هنگام اجرای پایتون از خط فرمان دارید، ببینید.

در اینجا یک برنامه بسیار ساده hello.py وجود دارد (توجه کنید که بلوک‌های کد کاملاً با استفاده از تورفتگی به جای پرانتزهای فرفری محدود می‌شوند - در ادامه در این مورد بیشتر توضیح خواهیم داد!):

#!/usr/bin/python3

# import modules used here -- sys is a very standard one
import sys

# Gather our code in a main() function
def main():
    print('Hello there', sys.argv[1])
    # Command line args are in sys.argv[1], sys.argv[2] ...
    # sys.argv[0] is the script name itself and can be ignored

# Standard boilerplate to call the main() function to begin
# the program.
if __name__ == '__main__':
    main()

اجرای این برنامه از خط فرمان به صورت زیر است:

$ python3 hello.py Guido
Hello there Guido
$ ./hello.py Alice  ## without needing 'python3' first (Unix)
Hello there Alice

واردات، آرگومان های خط فرمان و len()

بیرونی ترین عبارات موجود در یک فایل پایتون، یا "ماژول"، یکبار تنظیم خود را انجام می دهند - این عبارات اولین باری که ماژول وارد جایی می شود، از بالا به پایین اجرا می شود و متغیرها و توابع آن را تنظیم می کند. یک ماژول پایتون را می توان مستقیماً اجرا کرد - مانند python3 hello.py Bob - یا می تواند توسط ماژول دیگری وارد و استفاده شود. هنگامی که یک فایل پایتون به طور مستقیم اجرا می شود، متغیر ویژه "__name__" روی "__main__" تنظیم می شود. بنابراین، if __name__ ==... در بالا نشان داده شده باشد، معمول است که وقتی ماژول مستقیماً اجرا می‌شود، یک تابع main() را فراخوانی می‌کند، اما زمانی که ماژول توسط ماژول دیگری وارد می‌شود، چنین نیست.

در یک برنامه پایتون استاندارد، لیست sys.argv حاوی آرگومان های خط فرمان به روش استاندارد است که sys.argv[0] خود برنامه، sys.argv[1] اولین آرگومان و غیره است. اگر در مورد argc یا تعداد آرگومان ها می دانید، می توانید به سادگی این مقدار را با len(sys.argv) از پایتون درخواست کنید، درست مانند آنچه در کد مفسر تعاملی بالا هنگام درخواست طول رشته انجام دادیم. به طور کلی، len() می تواند طول یک رشته، تعداد عناصر موجود در لیست ها و تاپل ها (ساختار داده آرایه مانند دیگری) و تعداد جفت های کلید-مقدار در یک فرهنگ لغت را به شما بگوید.

توابع تعریف شده توسط کاربر

توابع در پایتون به صورت زیر تعریف می شوند:

# Defines a "repeat" function that takes 2 arguments.
def repeat(s, exclaim):
    """
    Returns the string 's' repeated 3 times.
    If exclaim is true, add exclamation marks.
    """

    result = s + s + s # can also use "s * 3" which is faster (Why?)
    if exclaim:
        result = result + '!!!'
    return result

همچنین توجه داشته باشید که چگونه خطوطی که تابع یا عبارت if را تشکیل می‌دهند توسط همه دارای یک سطح تورفتگی گروه‌بندی می‌شوند. ما همچنین 2 روش مختلف برای تکرار رشته ها ارائه کردیم، با استفاده از عملگر + که کاربر پسندتر است، اما * همچنین کار می کند زیرا عملگر "repeat" پایتون است، به این معنی که '-' * 10 '----------' می دهد. '----------' ، روشی منظم برای ایجاد یک "خط" روی صفحه. در کامنت کد، اشاره کردیم که * سریعتر از + کار می کند، دلیل آن این است که * اندازه شی حاصل را یک بار محاسبه می کند در حالی که با +، هر بار که + فراخوانی می شود این محاسبه انجام می شود. هر دو + و * عملگرهای "overloaded" نامیده می شوند زیرا معنای آنها برای اعداد در مقابل رشته ها (و سایر انواع داده ها) متفاوت است.

کلمه کلیدی def تابع را با پارامترهای داخل پرانتز و کدهای تورفتگی تعریف می کند. خط اول یک تابع می تواند یک رشته مستندسازی ("docstring") باشد که توصیف می کند که تابع چه کاری انجام می دهد. رشته docstring می تواند یک خط تک خطی یا یک توضیح چند خطی مانند مثال بالا باشد. (بله، اینها «نقل‌های سه‌گانه» هستند، یک ویژگی منحصر به فرد برای پایتون!) متغیرهای تعریف شده در تابع برای آن تابع محلی هستند، بنابراین «نتیجه» در تابع فوق جدا از متغیر «نتیجه» در تابع دیگری است. دستور return می تواند یک آرگومان بگیرد، در این صورت این مقداری است که به تماس گیرنده برگردانده می شود.

در اینجا کدی وجود دارد که تابع repeat() فوق را فراخوانی می کند و آنچه را که برمی گرداند چاپ می کند:

def main():
    print(repeat('Yay', False))      ## YayYayYay
    print(repeat('Woo Hoo', True))   ## Woo HooWoo HooWoo Hoo!!!

در زمان اجرا، توابع باید قبل از فراخوانی با اجرای یک "def" تعریف شوند. معمول است که یک تابع main() را به سمت پایین فایل با توابعی که بالای آن فراخوانی می کند، تعریف کنید.

تورفتگی

یکی از ویژگی‌های غیرمعمول پایتون این است که تورفتگی فضای خالی یک قطعه کد بر معنای آن تأثیر می‌گذارد. یک بلوک منطقی از عبارات مانند آنهایی که یک تابع را تشکیل می‌دهند، همگی باید دارای تورفتگی یکسانی باشند که از تورفتگی تابع والد یا «اگر» یا هر چیز دیگری تنظیم می‌شود. اگر یکی از خطوط یک گروه دارای تورفتگی متفاوت باشد، به عنوان یک خطای نحوی علامت گذاری می شود.

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

یک سوال رایج که مبتدیان می پرسند این است: "چند فاصله باید تورفتگی کنم؟" طبق راهنمای رسمی سبک پایتون (PEP 8) ، شما باید با 4 فاصله تورفتگی داشته باشید. (واقعیت جالب: دستورالعمل سبک داخلی گوگل تورفتگی با 2 فاصله را دیکته می کند!)

کد در زمان اجرا بررسی شد

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

def main():
    if name == 'Guido':
        print(repeeeet(name) + '!!!')
    else:
        print(repeat(name))

دستور if حاوی یک خطای آشکار است، که در آن تابع ()repet به طور تصادفی به عنوان repeeeet () تایپ می شود. چیز خنده دار در پایتون ... این کد تا زمانی که نام آن در زمان اجرا 'Guido' نباشد، کامپایل می شود و به خوبی اجرا می شود. تنها زمانی که یک run واقعاً سعی کند repeeeet() را اجرا کند، متوجه می شود که چنین تابعی وجود ندارد و خطایی ایجاد می کند. همچنین یک خطای دوم در این قطعه وجود دارد. قبل از اینکه نام با «Guido» مقایسه شود، مقداری به آن اختصاص داده نشده است. اگر بخواهید یک متغیر اختصاص داده نشده را ارزیابی کنید، پایتون یک "NameError" ایجاد می کند. اینها نمونه هایی هستند که نشان می دهند زمانی که برای اولین بار یک برنامه پایتون را اجرا می کنید، برخی از اولین خطاهایی که مشاهده می کنید اشتباهات تایپی ساده یا متغیرهای بدون مقدار اولیه مانند این خواهد بود. این یکی از حوزه‌هایی است که زبان‌هایی با سیستم نوع پرمخاطب‌تر، مانند جاوا، دارای مزیت هستند... آنها می‌توانند چنین خطاهایی را در زمان کامپایل دریافت کنند (اما البته شما باید همه آن اطلاعات نوع را حفظ کنید... این یک معامله است).

پایتون 3 نکات نوع را معرفی کرد. نکات نوع به شما امکان می دهد نوع هر آرگومان را در یک تابع مشخص کنید و همچنین نوع شی را که توسط تابع برگردانده شده است، مشخص کنید. به عنوان مثال، در تابع مشروح def is_positive(n: int) -> bool: آرگومان n یک int و مقدار بازگشتی یک bool است. ما بعداً به معنای این انواع خواهیم پرداخت. نکات نوع کاملا اختیاری هستند. بیشتر و بیشتر کدهایی را خواهید دید که نکات نوع را می پذیرند زیرا اگر از آنها استفاده کنید، برخی ویرایشگرها مانند cider-v و VS.code می توانند بررسی هایی را انجام دهند تا تأیید کنند که توابع شما با انواع آرگومان مناسب فراخوانی شده اند. آنها حتی می توانند آرگومان ها را هنگام ویرایش کد پیشنهاد و تأیید کنند. این آموزش نکات نوع را پوشش نمی دهد، اما ما می خواهیم مطمئن شویم که اگر در مورد آنها شنیدید یا آنها را در طبیعت مشاهده کردید، از آنها آگاه هستید.

نام های متغیر

از آنجایی که متغیرهای پایتون در کد منبع هیچ نوع مشخصی ندارند، بهتر است نام‌های معنی‌داری به متغیرهای خود بدهید تا به خودتان یادآوری کنید که چه اتفاقی در حال رخ دادن است. بنابراین اگر یک نام واحد است از "name" و اگر لیستی از نام ها از "names" و اگر لیستی از چند تایی است از "Tuples" استفاده کنید. بسیاری از خطاهای اساسی پایتون ناشی از فراموش کردن نوع مقدار در هر متغیر است، بنابراین از نام متغیرهای خود (همه چیزی که واقعا دارید) استفاده کنید تا به درست نگه داشتن همه چیز کمک کنید.

تا آنجا که نامگذاری واقعی پیش می رود، برخی از زبان ها underscored_parts را برای نام متغیرهایی که از "بیش از یک کلمه" تشکیل شده اند ترجیح می دهند، اما زبان های دیگر camelCasing را ترجیح می دهند. به طور کلی، پایتون روش زیر خط را ترجیح می‌دهد ، اما توسعه‌دهندگان را راهنمایی می‌کند تا در صورت ادغام با کد پایتون موجود که قبلاً از آن سبک استفاده می‌کند، از CamelCasing موکول شوند. خوانایی مهم است. در بخش نامگذاری قراردادها در PEP 8 بیشتر بخوانید.

همانطور که می توانید حدس بزنید، کلمات کلیدی مانند "if" و "while" را نمی توان به عنوان نام متغیر استفاده کرد - اگر این کار را انجام دهید یک خطای نحوی دریافت خواهید کرد. با این حال، مراقب باشید که از داخلی به عنوان نام متغیر استفاده نکنید. برای مثال، در حالی که «str»، «list» و «print» ممکن است نام‌های خوبی به نظر برسند، شما باید آن متغیرهای سیستم را نادیده بگیرید. توکارها کلمات کلیدی نیستند و بنابراین، مستعد استفاده ناخواسته توسط توسعه دهندگان جدید پایتون هستند.

بیشتر در مورد ماژول ها و فضای نام آنها

فرض کنید یک ماژول "binky.py" دارید که حاوی یک "def foo()" است. نام کاملاً واجد شرایط آن تابع foo "binky.foo" است. به این ترتیب، ماژول‌های مختلف پایتون می‌توانند توابع و متغیرهای خود را هر چه می‌خواهند نام‌گذاری کنند، و نام متغیرها با هم تداخلی ندارند - module1.foo با module2.foo متفاوت است. در واژگان پایتون، ما می گوییم که binky، module1 و module2 هرکدام "فضای نام" خود را دارند، که همانطور که می توانید حدس بزنید پیوندهای نام به شی متغیر هستند.

به عنوان مثال، ماژول استاندارد "sys" را داریم که شامل برخی از امکانات استاندارد سیستم، مانند لیست argv و تابع ()exit است. با عبارت "import sys" می توانید به تعاریف موجود در ماژول sys دسترسی داشته باشید و آنها را با نام کاملاً واجد شرایط خود، به عنوان مثال sys.exit() در دسترس قرار دهید. (بله، 'sys' یک فضای نام نیز دارد!)

  import sys

  # Now can refer to sys.xxx facilities
  sys.exit(0)

فرم واردات دیگری وجود دارد که به این صورت است: "از sys import argv، exit". که باعث می شود argv و exit() با نام کوتاهشان در دسترس باشند. با این حال، ما فرم اصلی را با نام‌های کاملاً واجد شرایط توصیه می‌کنیم، زیرا تعیین اینکه یک تابع یا ویژگی از کجا آمده است بسیار آسان‌تر است.

ماژول‌ها و بسته‌های زیادی وجود دارند که با نصب استاندارد مفسر پایتون همراه شده‌اند، بنابراین برای استفاده از آنها نیازی به انجام کار اضافی ندارید. اینها در مجموع به عنوان "کتابخانه استاندارد پایتون" شناخته می شوند. ماژول ها/بسته های پرکاربرد عبارتند از:

  • sys - دسترسی به exit()، argv، stdin، stdout، ...
  • دوباره - عبارات منظم
  • سیستم عامل - رابط سیستم عامل، سیستم فایل

می‌توانید مستندات همه ماژول‌ها و بسته‌های کتابخانه استاندارد را در http://docs.python.org/library بیابید.

کمک آنلاین، help() و dir()

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

  • جستجوی گوگل را انجام دهید، با کلمه "python" شروع کنید، مانند "python list" یا "python string". اولین ضربه اغلب پاسخ است. به نظر می رسد این تکنیک به دلایلی برای پایتون بهتر از سایر زبان ها کار می کند.
  • سایت رسمی پایتون docs - docs.python.org - دارای اسناد با کیفیت بالایی است. با این وجود، من اغلب جستجوی چند کلمه ای در گوگل را سریعتر پیدا می کنم.
  • همچنین یک لیست پستی رسمی Tutor وجود دارد که به طور خاص برای کسانی که تازه وارد پایتون و/یا برنامه نویسی شده اند طراحی شده است!
  • بسیاری از سؤالات (و پاسخ ها) را می توان در StackOverflow و Quora یافت.
  • از توابع help() و dir() استفاده کنید (به زیر مراجعه کنید).

در داخل مفسر پایتون، تابع help() رشته های مستندسازی را برای ماژول ها، توابع و متدهای مختلف می کشد. این رشته های doc شبیه جاوادوک جاوا هستند. تابع dir() به شما می گوید که ویژگی های یک شی چیست. در زیر چند راه برای فراخوانی help() و dir() از مفسر آورده شده است:

  • help(len) - رشته کمکی برای تابع len() داخلی؛ توجه داشته باشید که "len" است نه "len()"، که فراخوانی تابعی است که ما نمی خواهیم
  • help(sys) - رشته راهنما برای ماژول sys (ابتدا باید یک import sys انجام شود)
  • dir(sys)dir() مانند help() است اما فقط فهرستی سریع از نمادهای تعریف شده یا "ویژگی ها" را ارائه می دهد.
  • help(sys.exit) - رشته کمکی برای exit() در ماژول sys
  • help('xyz'.split) - رشته کمکی برای متد split() برای اشیاء رشته. شما می توانید help() را با خود آن شی یا نمونه ای از آن شی به اضافه ویژگی آن فراخوانی کنید. برای مثال، فراخوانی help('xyz'.split) مانند فراخوانی help(str.split) است.
  • help(list) - رشته راهنما برای اشیاء list
  • dir(list) - ویژگی‌های شی list ، از جمله روش‌های آن را نمایش می‌دهد
  • help(list.append) - رشته کمکی برای متد append() برای اشیای list