سلام به همه دوستان عزیز
چند وقت پیش داشتم شیمی می خوندم که به قسمت اصل آفبا رسیدم و بعد از چند بار خوندن تقریبا متوجه موضوعش شدم( تقریبااااا)
زد به سرم که این اصل رو با پایتون بنویسم تا هم یه تمرینی کرده باشم و هم اینکه متوجه خود اصل آفبا شده باشم.
اول تو اینترنت شروع به تحقیق درباره خود اصل آفبا کردم و بعد که یکسری اطلاعات دستگیرم شد شروع به کد نویسی کردم.
ابتدا پیشنهاد میکنم که یک توضیح کلی درباره اصل آفبا رو در سایت فرادرس مطالعه کنید:
خب اول کتابخونه مورد نیازمون رو وارد میکنیم (ولی شما اول باید نصبش کنید):
import unicodeit
با این کتابخونه قرار تعداد الکترون هر اوربیتال رو به صورت توان در بالاش بنویسیم. مثال: 1s²
بعد متغیر هام رو نوشتم:
capacity = [('s', 2), ('p', 6), ('d', 10), ('f', 14), ('g', 18)] orbitals = [ '1s', '2s', '2p', '3s', '3p', '4s', '3d', '4p', '5s', '4d', '5p', '6s', '4f', '5d', '6p', '7s', '5f', '6d', '7p', '8s', '5g', '6f', '7d', '8p' ] output = [] atomic_number = int(input('Please enter the atomic number : '))
خب همون طور که میدونید هر اتم دارای زیر لایه هایی است که با الکترون ها پر میشن و تعداد این الکترون ها هم در حالت خنثی اتم با تعداد پروتون های همون اتم برابر میکنه. و از طرفی این لایه ها هم ظرفیت مشخصی دارن که در صورت پر شدن شون، لایه بعد شروع به پر شدن میشه تا زمانی که الکترون ها تموم بشن.
بریم که کد بالا رو توضیح بدم : تو خط اول ما متغیر capacity یا ظرفیت رو داریم که ظرفیت هر لایه رو مشخص میکنه( برای مثال ظرفیت اوربیتال s برابر 2 هست و وقتی پر بشه میره سراغ اوربیتال بعدی)
تو خط بعدی هم متغیر orbitals رو تعریف کردیم که داخلش تعداد اوربیتال ها رو به ترتیب بصورت یک لیست ذخیره کردیم.
متغیر بعدی هم به نام output هست که آرایش الکترونی نهایی ما رو تو خودش ذخیره میکنه.
و در آخر هم متغیر atomic_number یا عدد اتمی رو داریم که مقدارش برابر یک ورودی هست که از کاربر میگیره( ورودی هم همون عدد اتمی هستش)
بعد میریم سراغ بقیه کد:
for orbital in orbitals: for x, y in capacity: if orbital[1] == x and atomic_number > 0: if atomic_number >= y: atomic_number = atomic_number - y output.append(unicodeit.replace(f'{orbital}^{y}')) elif atomic_number < y: output.append(unicodeit.replace(f'{orbital}^{atomic_number}')) atomic_number = 0 print(' '.join(output))
تو خط اول ما اومدیم و یه حلقه for نوشتیم که وظیفش بررسی تک تک اعضای متغیر orbitals هستش، هدف از این کار این بود که وقتی مثلا اوربیتال 1s پر شد بره سراغ اوربیتال بعدی یعنی 2s و همینطور ادامه بده تا زمانی که عدد اتمی ما صفر بشه( که تو ادامه توضیح میدم چه شکلی این اتفاق میفته)
تو خط بعدی هم مثل خط قبلی دوباره ما از حلقه for برای متغیر capacity استفاده کردیم با این تفاوت که تو این متغیر هر عضوش دو تا متغیر دیگه به ما میده که یکیش اوربیتال هستش(x) و متغیر بعدی(y) هم ظرفیت اون لایه اوربیتال هستش.( برای مثال ظرفیت اوربیتال s برابر 2 هستش (x = s، y = 2))
بعد اومدیم و تو خط بعدی یه if نوشتیم که بررسی میکنه اگر حرف دوم متغیر orbital برابر x شد و عدد اتمی بزرگتر از 0 بود بره سراغ کد بعدی...
و در خط بعدی دوباره یه if نوشتیم که اگر atomic_number بزرگتر یا مساوی y ( ظرفیت ) بود، بیاد و atomic_number از y کم کنه و مقدارش رو بریز تو خودش یعنی atomic_number ،و تو خط بعدی میایم در متغیر output با استفاده از کتابخونه unicodeit، اوربیتال ساخته شده رو همراه با تعداد الکترون های جا شدش رو ذخیره میکنیم.
تو باقی کد هم اومدیم و یه elif قرار دادم که اگر atomic_number کوچکتر از y شد بیاد و به متغیر output، اوربیتال همراه با تعداد الکترون باقی مانده رو اضافه کنه و تو خط بعدی هم با استفاده از دستور پرینت، آرایش الکترونی مورد نظرمون رو چاپ کردیم.
روند کار این شکلی هستش که اگر عدد اتمی بزرگتر از ظرفیت اوربیتال شد بیاد و مقدار کامل همون ظرفیت رو تو همون لایه قرار بده و بعد از خود عدد اتمی کم کنه و بعد دوباره این کار رو انقدر تکرار کنه که شرط elif شروع به کار کنه و اون هم بجای اینکه ظرفیت لایه رو برای خودش بزاره میاد و تعداد الکترون باقی مانده رو برای خودش قرار میده.
شرمنده اگه طرز بیانم خوب نبود تو نشون دادن الگوریتمش🙏
خروجی:
یه نکته رو بگم که بعضی از آرایش های الکترونی که این کد نشون میده درست نیست زیاد، مثلا آرایش الکترونی عنصر کروم بصورت صحیح این هستش:
۱s² 2s² 2p⁶ 3s² 3p⁶ 3d⁵ 4s¹
ولی آرایش الکترونی که کد نشون میده این هستش:
1s² 2s² 2p⁶ 3s² 3p⁶ 4s² 3d⁴
خوشحال میشم اگه پیشنهاد یا انتقادی دارید رو برام کامنت کنید.
توییتر : https://twitter.com/AlirezaBor92578
لینکدین: www.linkedin.com/in/alireza-borzouei