تبدیل مبنا در پایتون---بخش دوم
بسم الله الرحمن الرحیم
سلام!
در ،تبدیل مبنا در پایتون---بخش اول، دیدیم که چگونه با تابع int میشود کار های ساده ای کرد.
امروز تقریبا تبدیل مبنا رو به طور کامل انجام میدیم!
تبدیل مبنا واقعا پر کاربرده به خصوص که من میخوام یه پروژه رمزنگاری باهاش انجام بدم انشاءالله!
( دارم همه چی رو لو میدم که!)
خب بریم سر اصل مطلب
مثال:
به کد زیر دقت بکنین:
def base10tobase(number,base): result = [] while number != 0: result.append(str( number%base )) number = number // base return ":".join(result[::-1]) print(base10tobase(17,16)) #1:1
خب حالا بریم برای توضیح کد:
تو خط اول تابع رو تعریف کردم و تو خط دوم یه لیست برای ذخیره نتیجه ساختم.
بعدش گفتم تا خارج قسمت مساوی صفر نیست حلقه رو ادامه بده. تو حلقه گفتم باقی مانده عدد بر مبنا رو تو لیست بریزه. بعدشم عدد رو مساوی خارج قسمت کنه.
آخرم به عنوان خروجی لیست برعکس شده رو دادم و قبلش به رشته تبدیلش کردم و با : از هم جداش کردم که از مبنای ده تشخیص داده بشن.
خب الان میتونید چه کاری انجام بدین؟ زمانو به ثانیه بگیرین و به ساعت و دقیقه و ... خروجی بگیرین فقط باید عدد رو به مبنای ۶۰ بیارین!!!
base10tobase(40000,60) #11:6:40
قدر ثانیه های عمرتونو بدونین!
یه مشکلی هست!
مشکل ما اینه که اگه عدد صفر باشه تابع کار نمیکنه، پس کافیه اینو به اول تابعمون اضافه کنیم:
if number == 0: return "0"
کارکردش کاملا مشخصه. اگه ورودی صفر بود، بلافاصله خارج بشو و صفر رو به عنوان خروجی بده.
حالا بریم یکم حرفه ای تر:
ما میدونیم که از مبنای ده به بالا، ارقام بعد از ۹ رو با حروف بزرگ نشون میدن! مثلا به جای ۱۰ میذارن A و ...
حالا من میخوام اینو به کد اضافه کنم، باید چیکار کنم؟
باید تابع رو اینطوری تغییر بدین:
def base10tobase(number,base): if number == 0: return "0" nums = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" result = [] while number != 0: result.append( nums[number%base] ) number = number // base return "".join(result[::-1]) print(base10tobase(15,16)) #F
و بله! الحمدالله درست کار کرد!
میاد جای خود باقی مانده، شمارش رو تو فهرست nums پیدا میکنه و جاش میذاره.
چطور برعکسشو تبدیل کنیم؟ یکی از راه هاش تابع int هست همونطور که در اول مطلب گفتم و در مطلب قبلی نوشته بودم.
اما اینطور اگه بخوایم جای پیش فرض یه ارقام دیگه داشته باشیم به مشکل می خوریم.
پس باید چیکار کنیم؟
برعکسشو انجام میدیم!
حالا چطور باید اینکارو کرد؟
ما باید یه تابع دیگه ای هم بنویسیم که از مبنا های دیگه به مبنای ده تبدیل بکنه:
def basetobase10(number,base): if number=="0" or base == 10: return int(number) nums = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" result = 0 ind = len(number)-1 for num in number: result += nums.index(num) * (base**ind) ind -=1 return str(result)
الحمدالله! اینم درست کار کرد!
داخل این چیکار کردم؟ ۴ خط اول تقریبا مشابه تابع قبله. تو خط پنجم اومدم نتیجه رو ۰ فرض کردم.
من از روش پیدا کردن ارزش عددی برای تبدیل مبنا استفاده کردم.( اطلاعات بیشتر و منبع : اینجا )
هر رقم یه ارزشی داره. ارزش رقم یکان صفره. ارزش دهگان یکه و همینطور تا به آخر...
اومدم متغیر ind رو برای همین در نظر گرفتم، تا که از بیشترین رقم شروع کنیم. منهای یک کردم تا ارزش رو به درستی ذخیره کنه.
حالا با حلقه for در عدد ما( که یک رشته هست) پیمایش کردم. نتیجه رو بعلاوه شماره اون رقم کردم در فهرست nums ضرب در مبنا به توان ارزش رقم.
بعدم ارزش رقم رو یکی کم کردم
و در آخر result رو رشته کردم و به عنوان خروجی دادمش!
کد کامل:
def base10tobase(number,base): number = int(number) if number == 0: return "0" nums = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" result = [] while number != 0: result.append( nums[number%base] ) number = number // base return "".join(result[::-1]) def basetobase10(number,base): if number=="0" or base == 10: return int(number) nums = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" result = 0 ind = len(number)-1 for num in number: result += nums.index(num) * (base**ind) ind -=1 return str(result) print(base10tobase(15,16)) #F print(basetobase10("F",16)) #15
جمع بندی:
همونطور که گفتم قراره انشاء الله یه کاری با این انجام بدیم، یه کار نسبتا بزرگ...
فعلا خدانگهدار!