آموزش پایتون

آموزش پایتون – جلسه چهارم: متغیرها و انواع داده در python

فهرست مطالب:

کلمه کلیدی برای تعریف متغیر ها در پایتون

خبر خوب!

در پایتون نیازی به تعریف دستی متغیر ها به صورت int و double و string و اینها نیست.

یعنی متغیرها در پایتون از نوع dynamic type (نوع پویا) هستن. و هر چیزی داخلشون بریزی، همون نوع داده رو می گیرن.

از این نظر پایتون و جاوااسکریپت شبیه به هم هستن.

اما ما برای تعریف متغیرها در جاوااسکریپت از کلید واژه var بجای تمام انواع متغیرها استفاده می کردیم. که در پایتون فراخی را به حد اعلای خودش رسانده و همین var را هم برای تعریف متغیر ها نمی نویسیم!

مثلا فرض کنید ما میخوایم توی پایتون یک متغیر از نوع integer به نام x تعریف کنیم و مقدار ۵ رو داخلش بریزیم:

x = 5 

به همین راحتی!

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

x = 5 
x = 'salam' 

(البته اگر بخوایم،‌ در پایتون خودمون میتونیم صراحتاً نوع متغیر رو تعیین کنیم. که این رو هم در جای خودش براتون توضیح میدم)

تشخیص نوع داده در پایتون بوسیله فانکشن type

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

x = 5 
type(x) 
-> int 

x = 'salam' 
type(x) 
-> <class 'str'>

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

انواع داده (data types) در پایتون

زیان پایتون یک زبان کاملا شئ گراست. (زبان های برنامه نویسی #C و جاوا هم همینطور هستن).

یعنی هر چیزی در پایتون، یک شئ (به انگلیسی: Object) هستش.

بنا بر این هر کدام از انواع داده (data type) یک Class هستن و هر متغیر، یک نمونه (وهله یا instance) – یا همون Object – از اون کلاس محسوب میشه.

انواع داده در پایتون به چند دسته تقسیم میشن:

  • نوع داده عددی – Numeral data type
  • نوع داده ترتیبی – Sequence Type
  • نوع داده منطقی – Boolean data types
  • مجموعه ها – Set
  • نوع مپ (دیکشنری) – dictionary

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

python data types

نوع داده عددی – Numeral data type

نوع داده int

در پایتون برای تمامی اعداد صحیح مثبت و منفی از نوع داده int استفاده میشه. محدودیتی برای طول اعداد در پایتون وجود نداره. بنابر این احتیاجی به انواع داده شبیه longInt و BigDecimal در پایتون وجود نداره.

a = 5
print("Type of a: ", type(a)) 

-> Type of a:  <class 'int'>

نوع داده float

آقا اول این اسم float رو بهتون بگم از کجا اومده. float مخفف floating point هستش. floating point به معنای نقطه شناور هستش. یعنی همون چیزی که در ریاضی فارسی ما بهش میگیم ممیز یا اعشار. که توی ریاضی انگلیسی، بجای اسلشی که ما میذاریم، اونها نقطه میذارن. به همین خاطر بهش میگن floating point.

پس به اعداد اعشاری هم به اختصار میگن float.

توی پایتون هر عددی که ممیز داشته باشه،‌ میشه float. یعنی عدد ۵ از نوع int هستش. ولی 5.0 از نوع float.

b = 5.0
print("Type of b: ", type(b)) 

-> Type of b:  <class 'float'>

راستی همینجا بهتون بگم که نتیجه تقسیم در پایتون همیشه از نوع float میشه. حتی اگر مقسوم و مقسوم علیه هر دو از نوع int باشن!

نوع داده پیچیده (Complex)

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

نمونه هاشو اینجا ببینین:

x = 3+5j
y = 5j
z = -5j

print(type(x))
print(type(y))
print(type(z))

-> 
<class 'complex'>
<class 'complex'>
<class 'complex'>

نوع داده ترتیبی – Sequence Type

نوع داده متنی String

از String برای نگهداری رشته های متنی استفاده میشه.

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

به همین دلیل String ها در پایتون جزو انواع داده ترتیبی محسوب میشن.

در پایتون، نوع داده String به اختصار با حروف str نمایش داده میشه.

برای مشخص کردن String ها در پایتون میتونیم از سینگل کوتیشن ( ‘ ‘ ) دابل کوتیشن ( ” ” ) و یا حتی ترپیل کوتیشن ( ”’ ”’ ) استفاده کنیم.

استفاده از تریپل کوتیشن به ما اجازه می ده که استرینگ چند سطری (multiple line string) بنویسیم.

# Creating a String   
# with single Quotes  
String1 = 'String with the use of Single Quotes'
print(String1)

# Creating a String  
# with double Quotes  
String1 = "\nString with the use of Double Quotes"
print(String1)
print(type(String1))

# Creating a String  
# with triple Quotes  
String1 = '''\nString with the use of Triple Quotes'''
print(String1)
print(type(String1))

# Creating String with triple  
# Quotes allows multiple lines  
String1 = '''creating multiline strings
            with tripe quotes 
            in python   
            is possible '''
print(String1)
print(type(String1))

خروجی کد فوق:‌

String with the use of Single Quotes

String with the use of Double Quotes
<class 'str'>

String with the use of Triple Quotes
<class 'str'>
creating multiline strings
            with tripe quotes 
            in python   
            is possible 
<class 'str'>

Process finished with exit code 0

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

دسترسی به یک کاراکتر خاص در رشته، از طریق ایندکس آن

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

نکته: مثل تمام آرایه های دنیا، اولین حرف یک رشته String، ایندکس صفر می گیرد.

نکته دوم: آخرین حرف از یک رشته String در پایتون، ایندکس منفی یک (۱-) می گیرد.

String1 = "JavaFarsi"
print("Initial String: ")
print(String1)

# Printing First character  
print("\nFirst character of String is: ")
print(String1[0])

# Printing Last character  
print("\nLast character of String is: ")
print(String1[-1])

خروجی کد بالا :‌ (به ایندکس منفی ۱ برای آخرین کاراکتر دقت کنید)

Initial String: 
JavaFarsi

First character of String is: 
J

Last character of String is: 
i

نوع داده List

لیست در پایتون، همون چیزیه در سایر زبانهای برنامه نویسی بهش میگیم آرایه.

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

لیست های پایتون، یک مجموعه مرتب از عناصر همنوع هستن.

برای ایجاد یک لیست، از یک جفت براکت [ ] استفاده می کنیم.

myList = ["asghar", "jafar", "taghi"]
print(myList)

-> ['asghar', 'jafar', 'taghi']

برای دسترسی به هر کدوم از اعضای لیست، از اندیس اون عضو استفاده می کنیم. (یادتون هست که اندیس های آرایه ها از صفر شروع میشن؟)

myList = ["asghar", "jafar", "taghi"]
print(myList[0])
print(myList[2])

->
asghar
taghi

دسترسی به اعضای لیست از آخر

برای دسترسی به آخرین عضو لیست، از اندیس منفی یک ( ۱- ) استفاده می کنم.

به همین ترتیب برای دسترسی به عضو یکی مونده به آخر از اندیس منفی دو ( ۲- ) استفاده می کنیم والی آخر.

myList = ["asghar", "jafar", "taghi"]
print(myList[-1])
print(myList[-2])

-> 
taghi
jafar

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

لیست های تو در تو در پایتون معادل آرایه های چند بُعدی در سایز زبانهای برنامه نویسی هستن.

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

# Creating a Multi-Dimensional List  
# (By Nesting a list inside a List)  
List = [['hamed', 'askarian'], ['nima']]
print(List)
print(List[0])
print(List[0][1])

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

[['hamed', 'askarian'], ['nima']]
['hamed', 'askarian']
askarian

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

نوع داده tuple در پایتون

کلمه tuple ( با تلفظ تاپِل ) و به معنای چند تایی هستش.

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

# Creating a Tuple with
# the use of Strings
Tuple1 = ('hamed', 'askarian', 'java', 'farsi' )
print(Tuple1)

->
('hamed', 'askarian', 'java', 'farsi')

تبدیل list به tuple با استفاده از متد ()tuple

اگر یک لیست رو بعنوان آرگومان ورودی به متد ()tuple پاس بدین، یک tuple با اعضای اون لیست میسازه. درواقع یک نمونه tuple از روی لیست میسازه:

# Creating a Tuple with
# the use of list
list1 = [1, 2, 4, 5, 6]
print(tuple(list1))

-> 
(1, 2, 4, 5, 6)

تبدیل یک رشته string به tuple از کاراکتر ها با استفاده از متد ()tuple

اگر یک رشته string رو بعنوان آرگومان ورودی به متد ()tuple پاس بدین، یک tuple با کاراکترهای اون رشته میسازه. و البته در پایتون هر کاراکتر هم خودش یک string با طول ۱ محسوب میشه و نوع داده char نداریم. (یادتونه گفتم string ها هم یک جور آرایه هستن؟ )

# Creating a Tuple with the
# use of built-in function
Tuple1 = tuple('askarian')
print(Tuple1)

->
('a', 's', 'k', 'a', 'r', 'i', 'a', 'n')

ترکیب چند tuple باهم (tuple های تو در تو)

اگر چند متغیر از نوع tuple رو داخل یک tuple بریزیم، یک tuple تودرتو بدست میاد. اینشکلی:

# Creating a Tuple
# with nested tuples
Tuple1 = (0, 1, 2, 3)
Tuple2 = ('java', 'farsi')
Tuple3 = (Tuple1, Tuple2)
print(Tuple3)

->
((0, 1, 2, 3), ('java', 'farsi'))

دسترسی به اعضای tuple از طریق براکت و ایندکس

برای دسترسی به اعضای یک tuple دقیقا مثل لیست (آرایه) عمل می کنیم. دسترسی به آخرین عضو tuple هم دقیقاً مثل لیست ها با اندیس منفی هستش.

# Python program to
# demonstrate accessing tuple

tuple1 = tuple([1, 2, 3, 4, 5])

# Accessing element using indexing
print("Frist element of tuple")
print(tuple1[0])

# Accessing element from last
# negative indexing
print("\nLast element of tuple")
print(tuple1[-1])

print("\nThird last element of tuple")
print(tuple1[-3]) 

خروجی :

Frist element of tuple
1

Last element of tuple
5

Third last element of tuple
3

Process finished with exit code 0

به ایندکس های منفی در کد فوق دقت کنید!

نوع داده منطقی – Boolean data types

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

x = True
print(type(x))

->
<class 'bool'>

مجموعه ها – Set

مجموعه یا ست، یک نوع کلکسیون غیر مرتب (unordered collection) پیمودنی (iterable) و قابل تغییر (mutable) هستش.

ضمناً تمامی اعضای داخل یک مجموعه، نقش کلید رو دارن و به همین خاطر عضو تکراری در یک مجموعه وجود نخواهد داشت.

ایجاد یک مجموعه در پایتون

برای ایجاد یک set جدید از متد ()set استفاده می کنیم.

اشتباه بسیار رایج: پاس دادن چند آرگومان به متد ()set

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

set1 = set(1,2,3)
print("Intial blank Set: ")  
print(set1) 

-> 
Traceback (most recent call last):
  File "H:/Trainings/python/app01/python.py", line 2, in <module>
    set1 = set(1,2,3)
TypeError: set expected at most 1 argument, got 3

اشتباه بسیار رایج: پاس دادن یک شئ غیر قابل پیمایش (non-iterable) به متد ()set

علاوه بر اون، آرگومانی که متد ()set میگیره،‌ باید یک Object از نوع iterable باشه. یعنی باید یک کلکسیون باشه. (یک چیزی مثل لیست و استرینگ)

بنابر این، پاس دادن هر چیزی که iterable نباشه به این متد،‌باعث بروز خطا میشه:

(اینجا ما سعی کردیم یک عدد که نوع داده اش int هست رو به این متد پاس بدیم.)

set1 = set(1)
print("Intial blank Set: ")  
print(set1) 

-> 
Traceback (most recent call last):
  File "H:/Trainings/python/app01/python.py", line 2, in <module>
    set1 = set(1)
TypeError: 'int' object is not iterable

همونطور که در خط آخر خطا مشاهده می کنید، نوشته: int از نوع iterable نیست.

پاس دادن یک لیست به متد ()set

یک راه صحیح مقداردهی به ست ها، پاس دادن یک لیست به اونهاست.

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

myList = [1,2,3,4,5,6,1,2,3,4,5,6,7,8]
set1 = set(myList)
print(set1)

->
{1, 2, 3, 4, 5, 6, 7, 8}

همونطور که می بینید، ست عضو تکراری قبول نمی کنه. بنابراین تمامی اعضای تکراری لیست رو حذف می کنه و یک مجموعه غیر تکراری درست می کنه.

نوشتن مستقیم یک لیست در متد ()set

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

set1 = set([1,2,3,4,5,6,1,2,3,4,5,6,7,8])
print(set1)

-> 
{1, 2, 3, 4, 5, 6, 7, 8}

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

نوشتن یک مجموعه چرت و پرت داخل یک براکت و قرار دادن اون بعنوان آرگومان ورودی متد ()set

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

بر خلاف تصورتون، هیچ اروری که نمیده هیچی، خوشش هم میاد!

set1 = set([1, 2, 'asghar', 4, 'mammad', 6, 'asghar'])  
print(set1)

->
{1, 2, 4, 6, 'mammad', 'asghar'}

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

پس نتیجه می گیریم: لزومی به یکسان بودن نوع داده اعضای یک مجموعه ( set ) در پایتون وجود نداره

پاس دادن یک رشته (str) بعنوان آرگومان ورودی متد ()set

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

یک ست از کاراکتر های غیر تکراری! و تمام کاراکتر های تکراری رو از داخل استرینگ شما حذف میکنه:

set1 = set('parsal bahar daste jami rqafte boodim ziarat')
print(set1)

->
{'r', 'j', 's', 't', 'z', 'b', 'p', 'd', ' ', 'o', 'l', 'e', 'a', 'h', 'i', 'f', 'm', 'q'}

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

دسترسی به اعضای یک مجموعه در پایتون

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

یک راه دسترسی به اعضای ست اینه که داخل اون ست لوپ ایجاد کنیم (مثلا حلقه for).

و راه دوم دسترسی به اعضای یک ست هم اینه که با استفاده از دستور in بپرسیم که آیا این یک عضو از ست هست یا نه .

دستور in ، مقدار True و یا False بر میگردونه:

# Creating a set
set1 = set(["asghar", "taghi", "mammad"])
print(set1)

# Checking the element
# using in keyword
print("taghi" in set1)

->
{'taghi', 'asghar', 'mammad'}
True

نوع مپ (دیکشنری) – dictionary

نوع داده مپ یا دیکشنری در پایتون خیلی شبیه فرمت جیسون و همینطور شبیه آبجکت جاوااسکریپت هستش. یعنی یک لیست غیرمرتب هست که مقادیر key-value داخل خودش نگهداری میکنه.

نوع داده این key ها و value ها آزاده (کرتیل) و هر چیزی میتونه باشه.

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

نکته: key ها case sensitive هستن. یعنی به بزرگی و کوچکی حروف حساس هستن. بنابر این ، name با naMe متفاوت هستش.

چند نمونه دیکشنری ببینید:

# Creating an empty Dictionary
Dict = {}
print("Empty Dictionary: ")
print(Dict)

# Creating a Dictionary
# with Integer Keys
Dict = {1: 'Hamed', 2: 'nima', 3: 'Hamed'}
print("\nDictionary with the use of Integer Keys: ")
print(Dict)

# Creating a Dictionary
# with Mixed keys
Dict = {'Name': 'Hamed', 1: [1, 2, 3, 4]}
print("\nDictionary with the use of Mixed Keys: ")
print(Dict)

# Creating a Dictionary
# with dict() method
Dict = dict({1: 'Hamed', 2: 'nima', 3: 'Hamed'})
print("\nDictionary with the use of dict(): ")
print(Dict)

# Creating a Dictionary
# with each item as a Pair
Dict = dict([(1, 'Hamed'), (2, 'nima')])
print("\nDictionary with each item as a pair: ")
print(Dict)

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

Empty Dictionary: 
{}

Dictionary with the use of Integer Keys: 
{1: 'Hamed', 2: 'nima', 3: 'Hamed'}

Dictionary with the use of Mixed Keys: 
{'Name': 'Hamed', 1: [1, 2, 3, 4]}

Dictionary with the use of dict(): 
{1: 'Hamed', 2: 'nima', 3: 'Hamed'}

Dictionary with each item as a pair: 
{1: 'Hamed', 2: 'nima'}

دسترسی به اعضای دیکشنری

دسترسی به اعضای دیکشنری از طریق key ها امکانپذیره. که این key رو به دو روش میشه پیدا کرد:

۱- نوشتن نام key در داخل براکت جلوی اسم متغیر دیکشنری (شبیه کاری که با اندیس آرایه ها انجام میدیم)

2- استفاده از متد get

# Creating a Dictionary
Dict = {1: 'Hamed', 'name': 'Nima', 3: 'Askarian'}

# accessing a element using key
print("Accessing a element using key:")
print(Dict['name'])

# accessing a element using get()
# method
print("Accessing a element using get:")
print(Dict.get(3))

->
Accessing a element using key:
Nima
Accessing a element using get:
Askarian

چه موقع از لیست و مجموعه و دیکشنری استفاده کنیم؟

When to use a dictionary:
– When you need a logical association between a key:value pair.
– When you need fast lookup for your data, based on a custom key.
– When your data is being constantly modified. Remember, dictionaries are mutable.

When to use the other types:
– Use lists if you have a collection of data that does not need random access. Try to choose lists when you need a simple, iterable collection that is modified frequently.
– Use a set if you need uniqueness for the elements.
– Use tuples when your data cannot change.

حامد عسکریان

برنامه نویس و عاشق تکنولوژی

دیدگاهتان را بنویسید

دکمه بازگشت به بالا
بستن
بستن