آموزش پایتون - تبدیل نوع

تبدیل نوع در پایتون (Python Type Casting)

از دیدگاه برنامه‌نویسی، تبدیل نوع (Type Casting) به معنای تبدیل یک شیء از یک نوع به نوع دیگر است. در این‌جا، با تبدیل نوع در برنامه‌نویسی پایتون آشنا خواهیم شد.

تبدیل نوع در پایتون فرآیندی است که در آن مقدار یک نوع داده را به نوع داده دیگری تبدیل می‌کنیم. پایتون از دو نوع تبدیل پشتیبانی می‌کند − ضمنی (implicit) و صریح (explicit).

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

تبدیل نوع ضمنی در پایتون (Implicit Casting)

وقتی کامپایلر/مفسر هر زبانی به طور خودکار شیء از یک نوع را به نوع دیگر تبدیل می‌کند، به آن تبدیل خودکار یا تبدیل ضمنی می‌گویند. پایتون یک زبان با نوع‌دهی قوی (strongly typed) است. این زبان اجازه تبدیل نوع خودکار بین انواع داده‌های نامرتبط را نمی‌دهد. برای مثال، یک رشته را نمی‌توان به هیچ نوع عددی تبدیل کرد. با این حال، یک عدد صحیح (integer) می‌تواند به یک عدد اعشاری (float) تبدیل شود. زبان‌های دیگر مانند جاوااسکریپت، زبان‌هایی با نوع‌دهی ضعیف (weakly typed) هستند که در آن‌ها یک عدد صحیح برای الحاق (concatenation) به اجبار به یک رشته تبدیل می‌شود.

توجه داشته باشید که میزان حافظه مورد نیاز هر نوع داده متفاوت است. برای مثال، یک شیء integer در پایتون ۴ بایت از حافظه را اشغال می‌کند، در حالی که یک شیء float به دلیل بخش اعشاری خود به ۸ بایت نیاز دارد. بنابراین، مفسر پایتون به طور خودکار یک float را به int تبدیل نمی‌کند، زیرا منجر به از دست رفتن داده‌ها می‌شود. از سوی دیگر، int می‌تواند به راحتی با تنظیم بخش اعشاری خود روی ۰ به float تبدیل شود.

تبدیل ضمنی int به float زمانی رخ می‌دهد که هرگونه عملیات حسابداری روی عملوندهای int و float انجام شود.

فرض کنید یک متغیر int و یک متغیر float داریم

<<< a=10   # int object
<<< b=10.5 # float object

برای انجام جمع آن‌ها، ۱۰ − شیء عدد صحیح به ۱۰.۰ ارتقا می‌یابد. این یک float است، اما معادل مقدار عددی قبلی خود است. اکنون می‌توانیم جمع دو عدد اعشاری را انجام دهیم.

<<< c=a+b
<<< print (c)
20.5

در تبدیل نوع ضمنی، شیء پایتون با اندازه بایت کمتر ارتقا می‌یابد تا با اندازه بایت بزرگ‌تر شیء دیگر در عملیات مطابقت داشته باشد. برای مثال، یک شیء بولی (Boolean) قبل از جمع با یک شیء عدد اعشاری، ابتدا به int و سپس به float ارتقا می‌یابد. در مثال زیر، سعی می‌کنیم یک شیء بولی را با یک float جمع کنیم، لطفاً توجه داشته باشید که True برابر با ۱ و False برابر با ۰ است.

a=True;
b=10.5;
c=a+b;

print (c);

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

11.5

تبدیل نوع صریح در پایتون (Explicit Casting)

اگرچه تبدیل خودکار یا ضمنی به تبدیل int به float محدود می‌شود، می‌توانید از توابع داخلی پایتون یعنی ()int()، float و ()str برای انجام تبدیل‌های صریح مانند تبدیل رشته به عدد صحیح استفاده کنید.

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

تابع داخلی ()int در پایتون، یک مقدار عددی صحیح را به یک شیء integer، یک float را به integer، و یک رشته را به integer تبدیل می‌کند، به شرطی که خود رشته دارای نمایش مقدار عدد صحیح معتبری باشد.

استفاده از ()int با یک شیء int به عنوان آرگومان، معادل تعریف مستقیم یک شیء int است.

<<< a = int(10)
<<< a
10

برابر است با −

<<< a = 10
<<< a
10
<<< type(a)
<class 'int>

اگر آرگومان تابع ()int یک شیء float یا یک عبارت ممیز شناور باشد، یک شیء int برمی‌گرداند. برای مثال −

<<< a = int(10.5) #converts a float object to int
<<< a
10
<<< a = int(2*3.14) #expression results float, is converted to int
<<< a
6
<<< type(a)
<class 'int'>

تابع ()int همچنین اگر یک شیء بولی به عنوان آرگومان داده شود، عدد صحیح ۱ را برمی‌گرداند.

<<< a=int(True)
<<< a
1
<<< type(a)
<class 'int'>

رشته به عدد صحیح

تابع ()int تنها در صورتی یک عدد صحیح از یک شیء رشته‌ای برمی‌گرداند که شامل یک نمایش عدد صحیح معتبر باشد.

<<< a = int("100")
<<< a
100
<<< type(a)
<class 'int'>
<<< a = ("10"+"01")
<<< a = int("10"+"01")
<<< a
1001
<<< type(a)
<class 'int'>

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

<<< a = int("10.5")
Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '10.5'
<<< a = int("Hello World")
Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'Hello World'

تابع ()int همچنین عدد صحیح را از رشته‌های باینری (مبنای ۲)، هشت‌تایی (مبنای ۸) و شانزده‌تایی (مبنای ۱۶) برمی‌گرداند. برای این کار، تابع به یک پارامتر مبنا (base) نیاز دارد که باید به ترتیب ۲، ۸ یا ۱۶ باشد. رشته باید دارای یک نمایش معتبر باینری/هشت‌تایی/شانزده‌تایی باشد.

رشته باینری به عدد صحیح

رشته باید تنها از 1 و 0 تشکیل شده باشد و مبنا باید ۲ باشد.

<<< a = int("110011", 2)
<<< a
51

معادل دهدهی عدد باینری 110011 برابر با 51 است.

رشته هشت‌تایی به عدد صحیح

رشته باید فقط شامل ارقام 0 تا 7 باشد و مبنا باید ۸ باشد.

<<< a = int("20", 8)
<<< a
16

معادل دهدهی عدد هشت‌تایی 20 برابر با 16 است.

رشته شانزده‌تایی به عدد صحیح

رشته باید فقط شامل نمادهای شانزده‌تایی یعنی 0-9 و A, B, C, D, E یا F باشد. مبنا باید ۱۶ باشد.

<<< a = int("2A9", 16)
<<< a
681

معادل دهدهی عدد شانزده‌تایی 2A9 برابر با 681 است. شما می‌توانید به راحتی این تبدیل‌ها را با برنامه ماشین حساب در ویندوز، اوبونتو یا گوشی‌های هوشمند بررسی کنید.

در ادامه مثالی برای تبدیل عدد، float و رشته به نوع داده integer آمده است:

a = int(1)     # a will be 1
b = int(2.2)   # b will be 2
c = int("3")   # c will be 3

print (a)
print (b)
print (c)

این کد نتیجه زیر را تولید می‌کند −

1
2
3

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

تابع ()float یک تابع داخلی در پایتون است. اگر آرگومان یک مقدار float، عدد صحیح یا یک رشته با نمایش اعشاری معتبر باشد، یک شیء float برمی‌گرداند.

استفاده از ()float با یک شیء float به عنوان آرگومان، معادل تعریف مستقیم یک شیء float است

<<< a = float(9.99)
<<< a
9.99
<<< type(a)
<class 'float'>

برابر است با −

<<< a = 9.99
<<< a
9.99
<<< type(a)
<class 'float'>

اگر آرگومان تابع ()float یک عدد صحیح باشد، مقدار بازگردانده شده یک عدد اعشاری با بخش اعشاری تنظیم‌شده روی 0 است.

<<< a = float(100)
<<< a
100.0
<<< type(a)
<class 'float'>

تابع ()float اگر رشته حاوی یک عدد اعشاری معتبر باشد، شیء float را از یک رشته برمی‌گرداند، در غیر این صورت خطای ValueError ایجاد می‌شود.

<<< a = float("9.99")
<<< a
9.99
<<< type(a)
<class 'float'>
<<< a = float("1,234.50")
Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
ValueError: could not convert string to float: '1,234.50'

دلیل خطای ValueError در این‌جا، وجود کاما در رشته است.

به منظور تبدیل رشته به float، نماد علمی اعداد اعشاری نیز معتبر در نظر گرفته می‌شود.

<<< a = float("1.00E4")
<<< a
10000.0
<<< type(a)
<class 'float'>
<<< a = float("1.00E-4")
<<< a
0.0001
<<< type(a)
<class 'float'>

در ادامه مثالی برای تبدیل عدد، float و رشته به نوع داده float آمده است:

a = float(1)     # a will be 1.0
b = float(2.2)   # b will be 2.2
c = float("3.3") # c will be 3.3

print (a)
print (b)
print (c)

این کد نتیجه زیر را تولید می‌کند −

1.0
2.2
3.3

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

دیدیم که پایتون چگونه عدد صحیح یا اعشاری را از نمایش رشته‌ای مربوطه به دست می‌آورد. تابع ()str معکوس آن عمل می‌کند. این تابع یک شیء integer یا float را با نقل‌قول (') احاطه می‌کند تا یک شیء str برگرداند. تابع ()str نمایش رشته‌ای هر شیء پایتون را برمی‌گرداند. در این بخش، مثال‌های مختلفی از تابع ()str در پایتون را خواهیم دید.

تابع ()str دارای سه پارامتر است. اولین پارامتر الزامی (یا آرگومان)، شیئی است که می‌خواهیم نمایش رشته‌ای آن را داشته باشیم. دو پارامتر دیگر، یعنی encoding و errors، اختیاری هستند.

ما تابع ()str را در کنسول پایتون اجرا می‌کنیم تا به راحتی تایید کنیم که شیء بازگردانده شده یک رشته است، همراه با علائم نقل‌قول (') در اطراف آن.

عدد صحیح به رشته

شما می‌توانید هر عدد صحیح را به صورت زیر به یک رشته تبدیل کنید:

<<< a = str(10)
<<< a
'10'
<<< type(a)
<class 'str'>

عدد اعشاری به رشته

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

<<< a=str(11.10)
<<< a
'11.1'
<<< type(a)
<class 'str'>
<<< a = str(2/5)
<<< a
'0.4'
<<< type(a)
<class 'str'>

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

اعداد اعشاری در نمادگذاری‌های علمی با استفاده از E یا e و با توان مثبت یا منفی، با تابع ()str به رشته تبدیل می‌شوند.

<<< a=str(10E4)
<<< a
'100000.0'
<<< type(a)
<class 'str'>
<<< a=str(1.23e-4)
<<< a
'0.000123'
<<< type(a)
<class 'str'>

وقتی یک ثابت بولی به عنوان آرگومان وارد می‌شود، توسط (') احاطه می‌شود به‌طوری که True به 'True' تبدیل می‌شود. اشیاء لیست (List) و تاپل (Tuple) نیز می‌توانند به عنوان آرگومان به تابع ()str داده شوند. رشته حاصل، همان لیست/تاپل احاطه‌شده توسط (') است.

<<< a=str('True')
<<< a
'True'
<<< a=str([1,2,3])
<<< a
'[1, 2, 3]'
<<< a=str((1,2,3))
<<< a
'(1, 2, 3)'
<<< a=str({1:100, 2:200, 3:300})
<<< a
'{1: 100, 2: 200, 3: 300}'

در ادامه مثالی برای تبدیل عدد، float و رشته به نوع داده string آمده است:

a = str(1)     # a will be "1"
b = str(2.2)   # b will be "2.2"
c = str("3.3") # c will be "3.3"

print (a)
print (b)
print (c)

این کد نتیجه زیر را تولید می‌کند −

1
2.2
3.3

تبدیل انواع دنباله‌ها (Sequence Types)

لیست (List)، تاپل (Tuple) و رشته (String) انواع دنباله‌های پایتون هستند. آن‌ها مجموعه‌ای مرتب یا نمایه شده (indexed) از آیتم‌ها هستند.

یک رشته و تاپل را می‌توان با استفاده از تابع ()list به یک شیء لیست تبدیل کرد. به همین ترتیب، تابع ()tuple یک رشته یا لیست را به یک تاپل تبدیل می‌کند.

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

<<< a=[1,2,3,4,5]   # List Object
<<< b=(1,2,3,4,5)   # Tupple Object
<<< c="Hello"       # String Object

### list() separates each character in the string and builds the list
<<< obj=list(c)
<<< obj
['H', 'e', 'l', 'l', 'o']

### The parentheses of tuple are replaced by square brackets
<<< obj=list(b)
<<< obj
[1, 2, 3, 4, 5]

### tuple() separates each character from string and builds a tuple of characters
<<< obj=tuple(c)
<<< obj
('H', 'e', 'l', 'l', 'o')

### square brackets of list are replaced by parentheses.
<<< obj=tuple(a)
<<< obj
(1, 2, 3, 4, 5)

### str() function puts the list and tuple inside the quote symbols.
<<< obj=str(a)
<<< obj
'[1, 2, 3, 4, 5]'

<<< obj=str(b)
<<< obj
'(1, 2, 3, 4, 5)'

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

توابع تبدیل نوع داده

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

شماره تابع و توضیحات
1 تابع ()int در پایتون

مقدار x را به یک عدد صحیح تبدیل می‌کند. اگر x یک رشته باشد، base مبنا را مشخص می‌کند.

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

مقدار x را به یک عدد صحیح بزرگ (long) تبدیل می‌کند. اگر x یک رشته باشد، base مبنا را مشخص می‌کند.

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

مقدار x را به یک عدد اعشاری (floating-point) تبدیل می‌کند.

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

یک عدد مختلط ایجاد می‌کند.

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

شیء x را به یک نمایش رشته‌ای تبدیل می‌کند.

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

شیء x را به یک رشته عبارتی (expression string) تبدیل می‌کند.

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

یک رشته را ارزیابی کرده و یک شیء برمی‌گرداند.

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

مقدار s را به یک تاپل تبدیل می‌کند.

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

مقدار s را به یک لیست تبدیل می‌کند.

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

مقدار s را به یک مجموعه (set) تبدیل می‌کند.

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

یک دیکشنری ایجاد می‌کند. d باید دنباله‌ای از تاپل‌های (key,value) باشد.

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

مقدار s را به یک مجموعه ثابت (frozen set) تبدیل می‌کند.

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

یک عدد صحیح را به یک کاراکتر تبدیل می‌کند.

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

یک عدد صحیح را به یک کاراکتر یونیکد تبدیل می‌کند.

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

یک کاراکتر تکی را به مقدار عددی صحیح آن تبدیل می‌کند.

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

یک عدد صحیح را به یک رشته شانزده‌تایی (hexadecimal) تبدیل می‌کند.

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

یک عدد صحیح را به یک رشته هشت‌تایی (octal) تبدیل می‌کند.

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