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

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

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


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

Python is a dynamically typed language. This means that the Python interpreter does type checking only as code runs, and the type of a variable is allowed to change over its lifetime.

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

۱. type نوع متغیر را در خروجی چاپ میکند. type(variable)

نکته ای که جالب است اینه که در پایتون علاوه بر اینکه به امکانات خوبی جهت پردازش stringها دسترسی داریم، کتابخانه های زیادی را جهت پردازش و کار با stringها نیز در اختیار ما قرار میدهد. برای مثال وقتی که با استفاده از متد dir یک string را به آن پاس دهیم dir(name) همه متدهایی را که برای string میتوانیم به کار ببریم را به ما نمایش می‌دهد.

نکته: اگر کد زیر را چاپ کنید تمام builtin functionهایی که توی زبان برنامه نویسی پایتون در دسترس است را برای شما چاپ میکند.

print(dir(__builtins__))

در رابطه با عملگرهای ریاضی باید این نکته رو درنظر بگیریم که علامت ** برای به توان رساندن یک عدد است و خروجی تقسیم یک عدد با علامت / یک عدد از نوع float است ولی خروجی تقسیم با علامت // از نوع int است.

Python Operator

با استفاده از متد str میتوانیم که نوع یک عدد را به string تبدیل کنیم و یا اینکه با متد int میتوانیم یک عدد که string است را به نوع integer تبدیل کنیم ولی stringهایی را میتوانیم تبدیل کنیم که قابل تبدیل شدن باشند برای اینکه از خطا جلوگیری کنیم میتوانیم قبل از تبدیل نوع با متد isdigit که برای stringهای پایتون وجود دارد چک کنیم که همه کاراکترها عددی هستند یا خیر که بعد از آن تبدیل نوع را انجام دهیم.

اگر بخواهیم یک string که مقدار آن اعشاری است را به نوع integer  تبدیل کنیم به خاطر اینکه علامت ممیز (dot) وجود دارد اول باید به float و بعد به integer تبدیل شود در غیر اینصورت با خطا مواجه میشویم. وقتی یک عدد اعشاری را به integer تبدیل میکنیم فقط مقدار صحیح آن در خروجی قرار داده میشود.

آشنایی با List در پایتون

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


empty_data = []
new_empty_data = list()
data = [1,2,3,5,5.2,'Salam', 'bye']

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

dir list in python3

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


data[1]     // 2
data[-1]    // 'bye'
data.index(3) // 2 , when we have more that one same items, the index method will return the first one 
data.count('bye') // 1 

len(data)   // 7

data[2:4]   // [3, 5]   // data[from, to, step_count]
data[-1:-4]   // []
data[-4:-1]   // [5, 5.2, 'Salam']
data[2:2]   // []
data[2:3]   // [3]
data[2:]    // [3, 5, 5.2, 'Salam', 'bye'], second item is empty so the default is until the end of the list

data[2:5:2]    // [3, 5.2] , third item is about step count
data[2:5:1]     // [3, 5, 5.2]
data[::3]       // [1, 5, 'bye']

data.append('new value')    // [1,2,3,5,5.2,'Salam', 'bye', 'new value']
data.append(['hello','salam'])  // [1, 2, 3, 5, 5.2, 'Salam', 'bye', 'new value', ['hello', 'salam']]
data.pop()  // output is: ['hello', 'salam'], the list will change to: [1,2,3,5,5.2,'Salam', 'bye', 'new value']
data.pop()  // output is: 'new value', the list will change to: [1,2,3,5,5.2,'Salam', 'bye']
data.pop(0) // output is: 1, the list will change to: [2,3,5,5.2,'Salam', 'bye']

new_data = [6,7,8]
data.extend(new_data)   // [2, 3, 5, 5.2, 'Salam', 'bye', 6, 7, 8]
data.insert(0, 'start')   //  ['start', 2, 3, 5, 5.2, 'Salam', 'bye', 6, 7, 8]
data.remove('Salam')        // ['start', 2, 3, 5, 5.2, 'bye', 6, 7, 8]
data.reverse()          // the main list will change to: [8, 7, 6, 'bye', 'Salam', 5.2, 5, 3, 2, 'start']

>>> data
['start', 2, 3, 5, 5.2, 'Salam', 'bye', 6, 7, 8]
>>> list(reversed(data))
[۸, ۷, ۶, 'bye', 'Salam', 5.2, 5, 3, 2, 'start']
>>> data
['start', 2, 3, 5, 5.2, 'Salam', 'bye', 6, 7, 8]

data.sort() 

// Output:
Traceback (most recent call last):
  File "", line 1, in 
TypeError: '<' not supported between instances of 'int' and 'str' data = [5,7,1,5,9,7,2] data.sort() // the main list will sort: [1, 2, 5, 5, 7, 7, 9] >>> data
[۵, ۷, ۱, ۵, ۹, ۷, ۲]
>>> sorted(data)
[۱, ۲, ۵, ۵, ۷, ۷, ۹]
>>> data
[۵, ۷, ۱, ۵, ۹, ۷, ۲]
>>>

در حالتی که از متد reverse استفاده میکنید خود لیست فعلی را تغییر میدهد ولی وقتی میخواهیم فقط مقدار موقت reverse شده را داخل متغیر دیگری قرار دهیم بدون اینکه لیست اصلی را تغییر دهیم از ساختار reversed(data) استفاده میکنیم.

نکته بسیار مهم: وقتی شما یک لیست دارید باید بدانیم که در واقع کامپیوتر خود مقادیر را ذخیره نمیکند بلکه رفرنسهایی به مقادیر را ذخیر میکند، از این رو وقتی شما یک لیست را داخل متغیر X قرار دادید و بعد y = x و بعد برای مثال مقدار y[1] را تغییر دهید مقدار لیست X هم تغییر میکند چونکه هر دوی آنها به یک رفرنس اشاره میکنند. ولی اگر میخواهید این اتفاق نیوفتد به صورت زیر باید کپی را انجام دهیم.

Set در زبان برنامه نویسی پایتون

برای تعریف set از علامت {} استفاده میکنیم.


data = {'Michael', 'Vahid', 'Kamran', 'Edris', 'Arman'}

همانطور که میدونیم لیستها در زبان پایتون mutable هستند یعنی اینکه هم میتوانیم آیتمی را اضافه کنیم و هم مقدار یک ایندکس مشخص را تغییر دهیم ولی مقادیری که داخل set داریم به این صورت است که میتوانیم مقداری را اضافه یا حذف کنیم ولی نمیتوانیم مقدار یک ایندکس مشخص را تغییر دهیم، یعنی خود set موردنظر که ایجاد شده mutable است ولی هر آیتم آن immutable یا غیرقابل تغییر است، همچنین داخل set نمیتوانیم مقادیر تکراری را ذخیره کنیم.

وقتی یک لیست از داده های تکراری داریم برای یونیک کردن لیست بهترین کار اینه که با تبدیل اون به ‌Set  همه داده های تکراری را حذف کنیم.

data = {'Michael', 'Vahid', 'Kamran', 'Edris', 'Arman'}
data.add('Bas')   // {'Bas', 'Kamran', 'Arman', 'Edris', 'Vahid', 'Michael'}
len(data)       // 6
data.add('Bas') // {'Bas', 'Kamran', 'Arman', 'Edris', 'Vahid', 'Michael'} , we don't have duplicate data in SET

new_data = {'Marten', 'Pascal', 'Lars', 'Kamran'}
data.union(new_data)  // output: {'Pascal', 'Edris', 'Vahid', 'Lars', 'Michael', 'Bas', 'Marten', 'Kamran', 'Arman'}

print(data) 
{'Bas', 'Kamran', 'Arman', 'Edris', 'Vahid', 'Michael'} // data will NOT change!

data.update(new_data)    // output: {'Lars', 'Marten', 'Edris', 'Kamran', 'Arman', 'Pascal', 'Vahid', 'Bas', 'Michael'}

print(data) // After update, the data has been changed!
{'Pascal', 'Edris', 'Vahid', 'Lars', 'Michael', 'Bas', 'Marten', 'Kamran', 'Arman'}

data.pop()  // 'Pascal', the data will change to: {'Edris', 'Vahid', 'Lars', 'Michael', 'Bas', 'Marten', 'Kamran', 'Arman'}
data.discard('Arman')   // the data will change to: {'Edris', 'Vahid', 'Lars', 'Michael', 'Bas', 'Marten', 'Kamran'}


list(data)  // ['Edris', 'Vahid', 'Lars', 'Michael', 'Bas', 'Marten', 'Kamran']
set(data)   // {'Bas', 'Marten', 'Kamran', 'Edris', 'Vahid', 'Lars', 'Michael'}

data_set_1 = {1,2,3,4,5}
data_set_2 = {4,5,6,7,8,9}

data_set_1.difference(data_set_2)   // {1,2,3}
data_set_1 - data_set_2   // {1,2,3}


data_set_3 = {1,2,3,4,5,6,7,8,9}
data_set_4 = {4,5,6}
data_set_4.issubset(data_set_3) // TRUE
data_set_3.issubset(data_set_4) // FALSE

Tuple و Dictionary

برای ایجاد یک tuple به صورت زیر مینویسیم:


data = (,)
data = tuple()

در توضیحات فوق به قابلیت mutable و immutable اشاره کردیم، در واقع tuple یک list است با این تفاوت که immutable است یعنی هیچ کدام از آیتمهای آن و حتی خود tuple قابل تغییر نیستند پس با توجه به این موضوع ما متدهای زیادی برای کار با tupleها نداریم چون نه میتوانیم مقدار جدیدی بهش اضافه یا حذف و یا تغییر داد و یک لیست ثابت و بدون تغییر است که تنها متدهای همچون count, index برای آن قابل استفاده هستند، پس سوالی که مطرح میشود چرا ما باید از tuple استفاده کنیم وقتی نمیتوانیم کار خاصی با آن انجام دهیم؟! علت استفاده از tuple بهبود memory management است چون طول آن و مقادیر آن کاملا مشخص و تعریف شده هستند پس در واقع هرجایی از برنامه که ساختار و مقادیر داده مشخص بود برای بهبود memory management از tuple استفاده میکنیم.

برای تعرف Dictionary مثل set از علامت {} استفاده میکنیم ولی نکته ای که در Dictionary داریم اینه که ساختار داده های آن به صورت key , value است و به این صورت قابل تفکیک و تشخیص است.


data = {'full_name': 'Michael Andish', 'age': 30, 'job': 'Senior Back-end developer'}
data = dict(full_name='Michael Andish', age=30, job='Senior Back-end developer')

data.keys()     // output: dict_keys(['full_name', 'age', 'job'])
data.values()   // output: dict_values(['Michael Andish', 30, 'Senior Back-end developer'])
data['age']     // output: 30
data['xyz']     
// output: 
Traceback (most recent call last):
  File "", line 1, in 
KeyError: 'xyz'

data.get('age')     // output: 30
data.get('xyz')     // output: NOTHING and we don't have any output error
data.get('xyz', 'default')  // output: default
data.get('age', 'default')  // output: 30
data.pop('age')             // output: 30 , removing age from the dictionary

data.setdefault('job', 'Senior Engineer')   // output: 'Senior Back-end developer' , because we have this value in our dictionary
data.setdefault('xyz', 'Hello')     // output: 'Hello' AND the key, value will add to the dictionary

new_data = {'skills': 'PHP, Python, Laravel,...'}
data.update(new_data)   // output: NOTHING
data    // output: {'full_name': 'Michael Andish', 'job': 'Senior Back-end developer', 'xyz': 'Hello', 'skills': 'PHP, Python, Laravel,...'}

del data['xyz']     // output: NOTHING
data    // {'full_name': 'Michael Andish', 'job': 'Senior Back-end developer', 'skills': 'PHP, Python, Laravel,...'}

{**data, **new_data}    // output: {'full_name': 'Michael Andish', 'job': 'Senior Back-end developer', 'skills': 'PHP, Python, Laravel,...'} , AND we don't change the other dictionaries


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

زبان برنامه نویسی پایتون – ۲

Python Lists

Comments