اعداد حقیقی
سپهر که از ریاضیات متنفر است، بهتازگی شروع به برنامهنویسی کردهاست. چند ساعت دیگر، او امتحان ریاضی از مبحث اعداد حقیقی دارد. اما چون علاقهای به ریاضیات ندارد، تصمیم گرفته تابعی بنویسد که لیستی از اعداد را به آن بدهد و تابع بررسی کند که آیا هرکدام از اعداد این لیست، عدد حقیقی صحیحی هستند یا خیر.
در بسیاری از کاربردها، نیاز داریم بررسی کنیم که آیا یک رشتهی ورودی، فرمت صحیحی برای نمایش یک عدد حقیقی (شناور) دارد یا خیر. هدف این تمرین، پیادهسازی تابعی است که این اعتبارسنجی را انجام دهد.
📋 قوانین اعتبارسنجی عدد حقیقی
یک رشته، نمایش معتبری از یک عدد حقیقی است اگر تمام شرایط زیر را داشته باشد:
رشته میتواند با یک علامت
+یا-شروع شود.مثالهای معتبر: +123، -45.6
- باید شامل حداقل یک رقم باشد.
- ممکن است شامل یک نقطهی اعشار (.) باشد. اگر نقطهی اعشار وجود دارد، حتماً باید قبل و بعد از آن حداقل یک رقم وجود داشته باشد (مثلاً 1.5 معتبر است، اما .5 یا 5. معتبر نیستند).
مثالهای معتبر: 123، 45.67 مثالهای نامعتبر: .5، 5.، 1.2.3
- میتواند شامل بخش توان باشد که با
eیاEشروع میشود.- بعد از
eیاE، میتواند یک علامت+یا-اختیاری وجود داشته باشد.- بعد از علامت توان (یا
e/Eاگر علامتی وجود ندارد)، حتماً باید حداقل یک رقم بیاید.- بخش توان نباید شامل نقطهی اعشار باشد.
مثالهای معتبر: 1.5e+2، 10E-5 مثالهای نامعتبر: 5e، 5e1.0
- فضای خالی فقط در ابتدا یا انتهای کل رشته مجاز است.
- هیچ فضای خالیای نباید بین اجزای عدد (علامت، ارقام، نقطه،
e/E، توان) وجود داشته باشد.مثالهای معتبر: -123.45 (فضا در ابتدا و انتها) مثالهای نامعتبر: 1 23، 1.5 e+2
تابع real_numbers
تابعی به نام real_numbers بنویسید که یک ورودی numbers (لیستی از رشتهها) را دریافت میکند. این تابع باید لیستی به همان طول لیست ورودی برگرداند. برای هر رشته در numbers:
- اگر آن رشته فرمت معتبری برای نمایش یک عدد حقیقی (طبق قواعد بالا) داشته باشد، عنصر متناظر در لیست خروجی باید رشتهی
'LEGAL'باشد. - در غیر این صورت، عنصر متناظر باید رشتهی
'ILLEGAL'باشد.
💡 راهنمایی
الگوی RegEx برای بررسی اعداد حقیقی:
^\s*[+-]?(\d+(\.\d+)?)([eE][+-]?\d+)?\s*$
^← شروع رشته\s*← صفر یا چند فضای خالی در ابتدا[+-]?← علامت + یا - اختیاری\d+(\.\d+)?← یک یا چند رقم، به همراه نقطه و ارقام اعشار (اختیاری)([eE][+-]?\d+)?← بخش توان با e/E، علامت اختیاری و ارقام (اختیاری)\s*← صفر یا چند فضای خالی در انتها$← پایان رشته
دقت کنید که الگو باید فضاهای خالی ابتدا و انتها را نیز پشتیبانی کند. همچنین، عدد باید حداقل یک رقم داشته باشد و نقطهی اعشار بهتنهایی مجاز نیست.
🎯 نمونه
>>> real_numbers(['1.5e+2', '3.', '1.1.1', '1+e5', ' -123.45 ', '0', '+10E-5', 'abc', '1. ', '.5', '5e', '5e1.0'])
['LEGAL', 'ILLEGAL', 'ILLEGAL', 'ILLEGAL', 'LEGAL', 'LEGAL', 'LEGAL', 'ILLEGAL', 'ILLEGAL', 'ILLEGAL', 'ILLEGAL', 'ILLEGAL']
'1.5e+2'✅ LEGAL (عدد اعشاری با توان)'3.'❌ ILLEGAL (نقطه بدون رقم بعد از آن)'1.1.1'❌ ILLEGAL (دو نقطه)'1+e5'❌ ILLEGAL (e بدون عدد قبلش؟ در این الگو نیاز به عدد قبل از e دارد)' -123.45 '✅ LEGAL (فضاهای ابتدا و انتها مجاز است)'0'✅ LEGAL'+10E-5'✅ LEGAL (علامت + و E بزرگ)'abc'❌ ILLEGAL (حروف)'1. '❌ ILLEGAL (نقطه بدون رقم بعد)'.5'❌ ILLEGAL (نقطه بدون رقم قبل)'5e'❌ ILLEGAL (بدون رقم بعد از e)'5e1.0'❌ ILLEGAL (نقطه در بخش توان)
💡 راهنمایی نهایی
ساختار کلی تابع به این شکل است:
import re
def real_numbers(numbers):
pattern = r'^\s*[+-]?(\d+(\.\d+)?)([eE][+-]?\d+)?\s*$'
result = []
for num in numbers:
if re.match(pattern, num):
result.append('LEGAL')
else:
result.append('ILLEGAL')
return result
میتوانید از List Comprehension برای کوتاهتر کردن کد استفاده کنید:
def real_numbers(numbers):
pattern = r'^\s*[+-]?(\d+(\.\d+)?)([eE][+-]?\d+)?\s*$'
return ['LEGAL' if re.match(pattern, num) else 'ILLEGAL' for num in numbers]
- در این تمرین، نیازی به دریافت ورودی از کاربر یا چاپ خروجی در کنسول ندارید.
- شما فقط باید تابع
real_numbersرا پیادهسازی کنید.- ورودی تابع از طریق آرگومان آن دریافت میشود و خروجی تابع باید از طریق دستور
returnبرگردانده شود.- از کتابخانهی
reبرای تطابق با الگوی RegEx استفاده کنید.
✅ این تمرین را در ویرایشگر خود پیادهسازی کنید. به یاد داشته باشید که تابع باید یک لیست از رشتههای 'LEGAL' و 'ILLEGAL' برگرداند.
نمونهها
real_numbers(['1.5e+2', '3.', '1.1.1', '1+e5', ' -123.45 ', '0', '+10E-5', 'abc', '1. ', '.5', '5e', '5e1.0'])
['LEGAL', 'ILLEGAL', 'ILLEGAL', 'ILLEGAL', 'LEGAL', 'LEGAL', 'LEGAL', 'ILLEGAL', 'ILLEGAL', 'ILLEGAL', 'ILLEGAL', 'ILLEGAL']
برای نوشتن پاسخ و دریافت امتیاز، ابتدا وارد حساب شوید.
ورود