پایتون ترفند

بسم الله الرحمن الرحیم

پایتون ترفند

بسم الله الرحمن الرحیم

سلام خوش آمدید

تبدیل مبنا در پایتون---بخش دوم

پنجشنبه, ۶ مهر ۱۴۰۲، ۰۷:۵۷ ق.ظ

بسم الله الرحمن الرحیم

سلام!

در ،تبدیل مبنا در پایتون---بخش اول، دیدیم که چگونه با تابع 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

 

جمع بندی:

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

فعلا خدانگهدار!

نظرات (۰)

هیچ نظری هنوز ثبت نشده است

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی

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

آخرین نظرات