آموزش

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

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

تاریخ انتشار:
15 شهریور 1405
پایتون
14 دقیقه
کاربرهای فینکا در چه شرکت‌هایی مشغول به کار هستند؟

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

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

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

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

  • type(): نوع یه متغیر رو برمی‌گردونه.
  • isinstance(): بررسی می‌کنه که یه متغیر متعلق به یه نوع خاصه یا نه.

تبدیل ضمنی و صریح نوع داده در پایتون

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

تبدیل ضمنی نوع داده در پایتون

تبدیل ضمنی زمانی اتفاق می‌افته که تغییر نوع داده در زمان کامپایل یا اجرا انجام بشه و پایتون خودش این تبدیل رو مدیریت کنه. بیا یه مثال ببینیم:

خروجی
 2.0
<class 'float'>

نکته: برای بررسی نوع داده یه شیء در پایتون می‌تونی از تابع type() استفاده کنی.

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

چرا مقدار اعشاری به یه عدد صحیح تبدیل نشد؟

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

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

تبدیل صریح نوع داده در پایتون

تبدیل صریح نوع داده (که بهش type casting هم می‌گن) زمانی اتفاق می‌افته که خودت عمداً یه مقدار رو از یه نوع به نوع دیگه تبدیل می‌کنی. اینطوری کنترل مستقیمی روی تبدیل داری، چون نوع داده مقصد رو تو کدت دقیق مشخص می‌کنی. معمولاً وقتی از این روش استفاده می‌شه که تبدیل خودکار پایتون کارت رو راه نمی‌ندازه.

سینتکس تبدیل صریح به این شکله:

مثلاً اگه بخوای یه عدد اعشاری رو به عدد صحیح تبدیل کنی، این‌طوری می‌نویسی:

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

بیا چند تا از تبدیل‌های صریح رایج رو با هم ببینیم.

ساختار داده‌های اولیه در برابر غیر اولیه در پایتون

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

  • اعداد صحیح
  • اعداد اعشاری
  • رشته‌ها
  • بولین‌ها

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

  • لیست‌ها
  • تاپل‌ها
  • دیکشنری‌ها
  • مجموعه‌ها

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

تبدیل ساختار داده‌های اولیه

تبدیل اعداد صحیح و اعشاری در پایتون

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

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

خروجی
5.0
خروجی
5
5.3

مشکلات دقت اعشاری و ماژول Decimal

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

خروجی
0.30000000000000004

برای جلوگیری از این مشکل، می‌تونی از ماژول Decimal استفاده کنی:

خروجی
0.3

تبدیل نوع داده حقیقی به مختلط در پایتون

با استفاده از complex(real, imag) می‌تونی اعداد صحیح رو به اعداد مختلط تبدیل کنی. این تابع دو تا مقدار می‌گیره: بخش حقیقی (real) و بخش موهومی (imag) و در خروجی یه عدد مختلط بهت می‌ده.

خروجی
(2+5j)

تبدیل نوع داده در پایتون با رشته‌ها

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

خروجی
Traceback (most recent call last):
  File "C:\Users\Finca\Desktop\test.py", line 4, in <module>
    print("The total is: " + total + "$")
TypeError: Can't convert 'int' object to str implicitly

مثال بالا خطای TypeError می‌ده که یعنی مفسر نمی‌تونه یه عدد صحیح رو به‌طور ضمنی به رشته تبدیل کنه.

شاید برای تو واضح باشه که برنامه باید چیکار کنه، ولی مفسر همیشه نمی‌تونه منظورت رو حدس بزنه. به همین خاطر مکانیزمی به اسم تبدیل صریح وجود داره تا دقیقاً مشخص کنی چه تبدیلی باید انجام بشه.

مثلاً با استفاده از تابع str() می‌تونی یه عدد صحیح رو به رشته تبدیل کنی:

خروجی
The total is: 21$

برای مقادیر اعشاری هم دقیقاً به همین شکل عمل می‌شه.

همچنین در پایتون می‌تونی رشته‌ها رو به اعداد صحیح و اعشاری (البته اگه ممکن باشه) تبدیل کنی. بیا ببینیم یعنی چی:

خروجی
The total is: 156$
The total is: 21$

بیا کد رو بررسی کنیم.

متغیرهای price_cake و price_cookie اولش رشته هستن. بعد می‌خوایم جمع‌شون کنیم، پس باید اول به عدد صحیح تبدیل بشن. وگرنه مفسر فکر می‌کنه می‌خوای دو تا رشته رو به هم بچسبونی، نه اینکه جمع ریاضی انجام بدی. بعدش باید این مقدار رو در متن نهایی قرار بدی، پس باید نتیجه جمع دوباره به رشته تبدیل بشه تا با بقیه پیام متنی ترکیب بشه.

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

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

خروجی
Traceback (most recent call last):
  File "C:\Users\Finca\Desktop\test.py", line 3, in <module>
    total = int(price_cake) + int(price_cookie)
ValueError: invalid literal for int() with base 10: 'fifteen'

خلاصه: تبدیل انواع داده اولیه در پایتون

تبدیل تابع مثال خروجی
صحیح به اعشاری float() float(3) 3.0
اعشاری به صحیح int() int(3.9) 3
رشته به صحیح int() int('123') 123
صحیح به رشته str() str(123) '123'

 

تبدیل ساختار داده‌های غیر اولیه

تبدیل نوع به تاپل‌ها و لیست‌ها در پایتون

درست مثل اعداد، می‌تونی لیست‌ها رو به تاپل و تاپل‌ها رو به لیست تبدیل کنی.

یادت میاد تاپل‌ها و لیست‌ها چی بودن؟ لیست‌ها و تاپل‌ها در پایتون برای ذخیره مجموعه‌ای از آیتم‌ها استفاده می‌شن. فرقشون اینه که تاپل‌ها تغییرناپذیرن (immutable)، یعنی وقتی تعریف شدن، نمی‌تونی آیتمی رو حذف کنی، اضافه کنی یا تغییر بدی.

حالا چرا باید لیست‌ها رو به تاپل تبدیل کنیم؟

چون تاپل‌ها بهینه‌ترن و باعث می‌شن برنامه‌هات سریع‌تر اجرا بشن.

چرا باید تاپل‌ها رو به لیست تبدیل کنیم؟

شاید بخوای تغییری در تاپل بدی. پس می‌تونی اون رو به لیست تبدیل کنی، تغییراتت رو بدی و دوباره برش گردونی به تاپل.

با تابع tuple() می‌تونی یه نسخه تاپل از مقداری که دادی بگیری، و با تابع list() هم تاپل رو به لیست تبدیل کنی:

خروجی
(1, 2, 3, 4, 5)
[('a', 1), ('f', 2), ('g', 3)]

همین‌طور در اینجا می‌بینی که چطور در پایتون می‌شه یه رشته رو به لیست یا تاپل تبدیل کرد:

خروجی
('C', 'a', 'k', 'e')
['C', 'a', 'k', 'e', 's']

تبدیل نوع به دیکشنری‌ها و مجموعه‌ها در پایتون

می‌تونی از تابع dict() برای تبدیل تاپل به دیکشنری و از set() برای تبدیل لیست به مجموعه استفاده کنی.

خروجی
{'a': 1, 'f': 2, 'g': 3}
{1, 2, 3, 4, 5}

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

استفاده از dataclass برای داده‌های ساختاریافته

برای مدیریت داده‌های ساختاریافته، استفاده از dataclass روش خیلی بهتری نسبت به دیکشنری‌ها یا تاپل‌هاست.

خروجی
Product(name='Laptop', price=799.99, in_stock=True)

خلاصه: تبدیل ساختار داده‌های غیر اولیه در پایتون

تبدیل تابع مثال خروجی
لیست به تاپل tuple() tuple([1, 2, 3]) (1, 2, 3)
تاپل به لیست list() list(('a', 1)) ['a', 1]
رشته به لیست list() list('Cake') ['C', 'a', 'k', 'e']
رشته به تاپل tuple() tuple('Cake') ('C', 'a', 'k', 'e')
تاپل به دیکشنری dict() dict((('a', 1), ('b', 2))) {'a': 1, 'b': 2}
لیست به مجموعه set() set([1, 2, 3, 4, 5]) {1, 2, 3, 4, 5}

 

اعداد صحیح یونیکد، باینری، اکتال و هگزادسیمال در پایتون

بیا در بخش‌های بعدی بعضی از سیستم‌های عددی رو بیشتر بررسی کنیم.

سیستم‌های عددی به تعداد نمادهایی می‌گن که برای نمایش مقادیر عددی استفاده می‌شن. سیستمی که ما روزمره ازش استفاده می‌کنیم، سیستم ده‌دهی (دسیمال) هست که از ده تا نماد (۰ تا ۹) استفاده می‌کنه. با همین ده نماد هر عددی رو می‌سازیم. باینری (دودویی)، اکتال (هشت‌هشتی) و هگزادسیمال (شانزده‌شانزدهی) هم سیستم‌های عددی دیگه‌ای هستن. (یونیکد در واقع استاندارد کدگذاری کاراکترهاست، نه یه سیستم عددی.)

وقتی نمادهای یه سیستم تموم می‌شه، می‌ریم سراغ مرتبه بعدی. مثلاً در سیستم دسیمال بعد از ۹ می‌شه ۱۰. ولی تو سیستم‌های دیگه این اتفاق جور دیگه‌ای می‌افته.

مثلاً تو باینری که فقط ۰ و ۱ داره، زودتر نمادها تموم می‌شن و شمارش اینطوری پیش می‌ره:

0, 1, 10, 11, 100, 101, ...

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

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

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

0 و 1 و ؟؟؟

بعد از 1 دیگه نمادی نیست و به 2 نمی‌رسیم. پس باید از ترکیب 0 و 1 استفاده کنیم.

مثلاً تو سیستم باینری، عدد 1000 معادل 8 تو سیستم دسیماله. دلیلش اینه که تو مبنای دو، هر رقم یه توانی از عدد 2 هست:

(1 × 2³) + (0 × 2²) + (0 × 2¹) + (0 × 2⁰) = 8

در واقع جایگاه هر 0 یا 1 نشون می‌ده که اون توان از 2 تو مقدار نهایی حساب می‌شه یا نه.

بیا یه مثال پیچیده‌تر رو با هم ببینیم:

Binary Number = 1001111
Decimal value = (1*(2^6)) + (0*(2^5)) + (0*(2^4)) + (1*(2^3)) + (1*(2^2)) + (1*(2^1)) + (1*(2^0))
              = 79

در پایتون با تابع bin() می‌تونی به‌راحتی یه عدد دسیمال رو به معادل باینریش تبدیل کنی.

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

خروجی
0b1001111
79

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

اکتال یه سیستم عددی دیگه است که بر پایه ۸ ساخته شده، یعنی کلاً هشت تا نماد داره:

0, 1, 2, 3, 4, 5, 6, 7

بعد از 7 می‌شه 10، چون رقم 8 تو این سیستم نداریم.

دقیقاً مثل باینری که از توان‌های 2 استفاده می‌کردیم، اینجا برای محاسبه مقدار اعداد از توان‌های 8 استفاده می‌کنیم.

مثلاً تو اکتال، عدد 10 همون 8 دسیمال ماست:

(1 × 8¹) + (0 × 8⁰) = 8

حالا یه مثال پیچیده‌تر:

Octal Number = 117
Decimal value = (1*(8^2)) + (1*(8^1)) + (7*(8^0))
              = 79

در پایتون برای تبدیل دسیمال به اکتال می‌تونی از تابع oct() استفاده کنی. برعکسش هم با تابع int() و دادن مبنای 8 انجام می‌شه.

خروجی
0o117
79

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

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

حالا بعد از 9 چی میاد؟

وقتی نمادهای عددی کم میاد، از حروف استفاده می‌شه. پس نمادهای هگزادسیمال اینا هستن: 0 تا 9 و A, B, C, D, E, F.

اگه همون مثال قبلی رو در نظر بگیریم:

Hexadecimal Number = 4F
Decimal value = (4*(16^1)) + (F*(16^0))
              = 79

در پایتون برای تبدیل دسیمال به هگزادسیمال از تابع hex() استفاده کن. برای برعکسش هم می‌تونی از همون int() با مبنای 16 کمک بگیری.

خروجی
0x4f
79

تبدیل یونیکد به کاراکتر

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

تو مثال پایین به تابع chr() اعداد یونیکد مختلفی دادیم تا کلمه "FINCA" رو بسازیم. با تابع ord() هم می‌تونی یه کاراکتر رو به عدد یونیکدش تبدیل کنی.

خروجی
F I N C A

خلاصه: تبدیل سیستم‌های عددی در پایتون

تبدیل تابع مثال خروجی
دسیمال به باینری bin() bin(79) 0b1001111
باینری به دسیمال int() int('1001111', 2) 79
دسیمال به اکتال oct() oct(79) 0o117
اکتال به دسیمال int() int('117', 8) 79
دسیمال به هگز hex() hex(79) 0x4f
هگز به دسیمال int() int('4F', 16) 79
یونیکد به کاراکتر chr() chr(68) 'D'
کاراکتر به یونیکد ord() ord('D') 68

 

موفق شدی!

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

ما یه دوره عالی به اسم پایتون تکمیلی برای علم داده داریم که تو اون یاد می‌گیری چطور با matplotlib نمودار بکشی و با دیکشنری‌ها و دیتافریم معروف pandas کار کنی. همچنین یاد می‌گیری چطور با حلقه‌ها کنترل برنامه‌ت رو در دست بگیری. آخر دوره هم یه پروژه عملی هست تا هر چی یاد گرفتی رو پیاده‌سازی کنی!

اشتراک‌گذاری
فهرست مطالب
  • بررسی انواع داده در پایتون
  • تبدیل ضمنی و صریح نوع داده در پایتون
  • ساختار داده‌های اولیه در برابر غیر اولیه در پایتون
  • تبدیل ساختار داده‌های اولیه
  • خلاصه: تبدیل انواع داده اولیه در پایتون
  • تبدیل ساختار داده‌های غیر اولیه
  • خلاصه: تبدیل ساختار داده‌های غیر اولیه در پایتون
  • اعداد صحیح یونیکد، باینری، اکتال و هگزادسیمال در پایتون
  • خلاصه: تبدیل سیستم‌های عددی در پایتون
  • موفق شدی!

سوالات متداول

می‌تونی متد join() رو با map() ترکیب کنی تا هر عدد صحیح به رشته تبدیل بشه و بعد به هم بچسبن.

int_list = [1, 2, 3, 4]
result = ''.join(map(str, int_list))
print(result)  # Output: '1234'

خطای ValueError می‌ده که نشون می‌ده این رشته عدد صحیح معتبری نیست.

int('abc')  # Raises ValueError: invalid literal for int() with base 10: 'abc'

آره، با استفاده از تابع list() می‌تونی یه مجموعه رو به لیست تبدیل کنی.

a_set = {1, 2, 3}
a_list = list(a_set)
print(a_list)  # Output: [1, 2, 3]

از متد split() برای جدا کردن رشته و از map() برای تبدیل هر قسمت به عدد صحیح استفاده کن.

numbers = "1 2 3 4"
int_list = list(map(int, numbers.split()))
print(int_list)  # Output: [1, 2, 3, 4]

برای این کار می‌تونی از تابع type() استفاده کنی.

x = 5
print(type(x))  # Output: <class 'int'>

دریافت اپلیکیشن فینکا

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