کلاس int و تبدیل متغیر‌ها به عدد صحیح در پایتون

اشتراک‌گذاری
help(int)

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

می‌توانید از یکی از فرم‌های زیر برای ساخت عدد صحیح با استفاده از کلاس int استفاده کنید:

int()
int(x)
int(s)
int(s, base=16)

فرم اولی که هیچ آرگامونی نمی‌گیرد عدد صحیح ۰ را بر میگرداند. فرم دوم یک عدد دیگر مثلا عدد اعشاری را به عنوان ورودی دریافت کرده و با قطع کردن عدد، جز صحیح آن‌را برمیگرداند. فرم سوم یک رشته(string) یا bytes یا bytearray می‌گیرد و با فرض اینکه رشته حاوی عددی صحیح در مبنای ده است، آن را به عدد صحیح تبدیل کرده و برمی‌گرداند. نهایتا آخرین فرم نیز مانند فرم سوم عمل می‌کند با این تفاوت که می‌توانید اعداد از مبنا های دیگر را به عدد صحیح تبدیل کنید. مبنا بایست از ۲ تا ۳۶ باشد و یا ۰ که در این صورت باید در خود رشته مبنا مشخص شود.

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

Python 3.8.10 (default, Sep 28 2021, 16:10:42) 
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> zero = int()
>>> zero
0
>>> ten_point_one = 10.1
>>> type(ten_point_one)
<class 'float'>
>>> ten_point_one_int_part = int(ten_point_one)
>>> ten_point_one_int_part
10
>>> type(ten_point_one_int_part)
<class 'int'>
>>> from_str_base_10 = int(input("Enter some number: "))
Enter some number: 42142142
>>> from_str_base_10
42142142
>>> from_str_base_2 = int("10", base=2)
>>> from_str_base_2
2
>>> from_str_base_3 = int("21", base=3)
>>> from_str_base_3
7
>>> from_base_35 = int("hello", base=35)
>>> from_base_35
26137359
>>> int("hello") # base defaults to 10
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'hello'

همانطور که می‌بینید در صورتی که به int رشته‌ای بدهید که شامل نویسه‌ای(character) غیرمجاز باشد، یک استثنا ValueError اتفاق می‌افتد.

محدودیت‌ها در اندازه عدد صحیح در پایتون

در زبان پایتون برای اندازه عدد صحیح محدودیتی وجود ندارد و یک متغیر صحیح با بزرگ‌تر شدن یا کوچک‌تر شدن و نیاز داشتن به حافظه رم بیشتر برای ذخیره‌سازی خودش رشد می‌کند(یا بهتر: پایتون آن‌را رشد می‌دهد) و تنها محدودیت، محدودیت حافظه دسترسی تصادفی(RAM) دستگاهیست که برنامه شما روی آن اجرا می‌شود.

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

یک رویکرد برای فهمیدن اینکه رشته‌ای که دارید، برای مثال از کاربر گرفتید، عدد صحیح در مبنای دلخواه شما،معمولا ۱۰، هست یا نه دادن رشته به int و منتظر بودن برای رخ دادن استثنا هست. می‌توانید با try-except استثنای ValueError را بگیرید و پیغام خطایی مناسب برای کاربر نمایش دهید. برنامه زیر از کاربر یک عدد صحیح دریافت کرده و مربع آن‌را به کاربر نمایش می‌دهد و در صورتی که ورودی کاربر عدد صحیح(در مبنای ۱۰) نباشد پیغام خطایی مناسب به کاربر نمایش می‌دهد:

try:
    number = int(input("Enter an integer to compute its square: "))
    print(number**2)
except ValueError:
    print("What you've entered is not a valid integer")

این رویکرد با اینکه کار می‌کند اما بنظر بنده به دلیل اینکه استثنا‌ها و مدیریتشان در پایتون «گران» هستند، رویکرد خیلی خوبی نیست و می‌تواند با راهی بهتر جایگزین شود. می‌توانید قبل از اینکه int سر شما داد بزند که رشته‌ای که دادید را نمی‌توان به عدد صحیح تبدیل کرد، خودتان رشته را برای نویسه‌های غیر مجاز بررسی کنید. در صورتی که ورودی کاربر در مبنای ۱۰ است که معمولا نیز همینطور می‌باشد، به سادگی می‌توانید از متد isdigit مربوط به رشته‌ها استفاده کنید. این متد تنها در صورتی True برمی‌گرداند که تمام نویسه‌های رشته رقم ۰ تا ۹ باشند و البته رشته دستکم یک نویسه داشته باشد. این کد کار همان کد قبلی را انجام می‌دهد اما با رویکرد جدید:

number = input("...")
if number.isdigit():
    print(int(number)**2)
else:
    print("What you have entered is not a valid integer")

در صورتی که با مبنایی جز ۱۰ کار می‌کنید نیز راه های مختلفی برای این وجود دارد که مطمئن باشید نویسه‌ای غیر مجاز در رشته نیست. یک راه استفاده از ماژول re و عبارات منظم(Regular Expressions) می‌باشد. یک راه دیگر هم استفاده از map و تابع any یا all هست:

valid_characaters = "0123456789abcdef"
number = input("...")
if all(map(lambda ch: ch in valid_characters, number)):
    print(int(number, base=16)**2)
else:
    print("What you have entered is not a valid hexadecimal integer")

مطالعه بیشتر

اشتراک‌گذاری