تابع eval در پایتون – به زبان ساده + مثال و تمرین

۲۵۶
۱۴۰۴/۰۷/۱۶
۱۰ دقیقه
PDF
آموزش متنی جامع
امکان دانلود نسخه PDF

تابع eval در پایتون، کدهایی را اجرا می‌کند که به شکل رشته نوشته شده‌اند. فرض کنیم عبارت '2+3' را به صورت رشته نوشته‌ایم. روش کار تابع eval()  به این صورت است که ابتدا این رشته را به عنوان پارامتر ورودی دریافت می‌کند. سپس با آن مانند عبارت پایتون، رفتار می‌کند. یعنی ابتدا آن را از حالت رشته خارج کرده و سپس کد بدست آمده را مطابق با قوانین پایتون اجرا می‌کند. در نتیجه، جواب این عبارت - که برابر با 5 است - را به عنوان خروجی برمی‌گرداند. این تابع به برنامه نویسان کمک می‌کند دستوراتی را اجرا کنند که درون کدهای برنامه‌شان نوشته نشده است. در واقع با کمک تابع eval()  می‌توانیم کدها را به شکل پویا اجرا کنیم.

آنچه در این مطلب می‌آموزید:
  • روش‌های مختلف استفاده از تابع eval را در پایتون یاد می‌گیرید.
  • با کمک مثال‌های ساده‌ای روش حل عبارت‌های ریاضی را با کمک تابع eval در پایتون می‌آموزید.
  • یاد می‌گیرید که چگونه از تابع eval در پایتون برای اجرای کدهای پویا کمک بگیرید.
  • روش استفاده از پارامتر‌های اختیاری globals و locals  را یاد می‌گیرید.
  • متوجه می‌شوید که استفاده از تابع eval چه خطراتی دارد و ممکن است چه مشکلاتی به وجود بیایند.
  • ‍در نهایت هم با بررسی مثال‌های مختلف در کار با تابع eval، تجربه پیدا می‌کنید.
تابع eval در پایتون – به زبان ساده + مثال و تمرینتابع eval در پایتون – به زبان ساده + مثال و تمرین
997696

در این مطلب از مجله فرادرس، با تابع eval در پایتون آشنا می‌شویم. این تابع با اینکه کاربر‌د‌های جالب و زیادی دارد، اما می‌تواند خطراتی هم به وجود بیاورد. به همین دلیل لازم است که روش کار با آن را بلد باشیم. ابتدا تابع eval()  و سینتکس آن را تعریف می‌کنیم. سپس انواع روش‌های استفاده از آن را توضیح می‌دهیم. بعد از آن مشکلات احتمالی در زمان کار با eval()  را بررسی می‌کنیم. در آخر هم با کمک چند مثال مختلف روش عملی کار با این تابع را نشان می‌دهیم.

تابع eval در پایتون چیست؟

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

نمودار ساده‌ای از روش کار تابع eval در پایتون
مثال ساده‌ای برای نمایش روش کار تابع eval در پایتون

نکته: البته لازم است، رشته داده شده به تابع eval()  تمام قوانین مربوط به سینتکس پایتون را رعایت کند. برای کسب مهارت در نوشتن سینتکس مفاهیم مختلف پایتون می‌توانید فیلم آموزش برنامه نویسی پایتون Python – مقدماتی + گواهینامه را در فرادرس مشاهده کنید. لینک مربوط به این فیلم در پایین نیز قرار داده شده است.

سینتکس تابع eval در پایتون

قبل از بررسی مثال‌ها و محل کاربرد تابع eval()، باید با سینتکس آن آشنا شویم. در کادر پایین، سینتکس استفاده از تابع eval()  را نوشته‌ایم.

همین‌طور که مشاهده می‌کنید، تابع eval()  سه پارامتر مختلف دریافت می‌کند. این پارامتر‌ها را در فهرست پایین معرفی کرده‌ایم.

  • expression: این پارامتر همان کدهای پایتونی است که باید به شکل رشته نوشته شده باشد. وجود این پارامتر الزامی است.
  • globals: این پارامتر باید به شکل دیکشنری باشد. در داخل آن متغیر‌های سراسری را تعریف می‌کنیم. وجود این پارامتر اختیاری است. بنابراین اگر پارامتر globals  تعریف نشود، تابع eval()  از فضای نام سراسری محیطی استفاده می‌کند که در آن فراخوانی شده است.
  • locals: این پارامتر هم از نوع دیکشنری است. در داخل آن متغیرهای محلی نگهداری می‌شوند. وجود این پارامتر اختیاری است. اگر هیچ مقداری برای آن تعریف نشود، از فضای نام محلی محیط اجرای تابع استفاده می‌شود.

نکته: در خروجی تابعeval()  نتیجه حاصل از اجرای دستوری برگشت داده می‌شود که به صورت رشته به آن ارسال شده است.

روش‌های استفاده از تابع eval در پایتون

تابع eval()  می‌تواند از کدهای ساده تا پیچیده را اجرا کند. در کل، سه روش مختلف برای استفاده از تابع eval()  وجود دارد. این روش‌ها را در فهرست پایین معرفی کرده‌ایم.

  • اجرای عبارت‌های ریاضی: اجرای محاسبات نوشته شده به شکل رشته
  • اجرای کدهای پویا: اجرای عبارت‌های ساده پایتون
  • کار با محدوده متغیر‌ها: مدیریت متغیر‌های در دسترس برای تابع eval()
روش‌های استفاده از تابع eval در پایتون
سه روش رایج برای استفاده از تابع eval در پایتون

در ادامه مطلب هر کدام از روش‌های بالا را با کمک مثال ساده‌ای نمایش داده‌ایم.

اجرای عبارت‌های ریاضی

رایج‌ترین کاربرد تابع eval()  مربوط به حل عبارت‌های ریاضی است. باید عبارت‌های ریاضی را به صورت اعداد و عملگر به شکل رشته بنویسیم. فقط کافی است که این رشته به تابع eval()  داده شود. در خروجی، نتیجه عبارت را محاسبه کرده و برمی‌گرداند.

در کادر زیر، مثال ساده‌ای را درباره اجرای عبارت‌های ریاضی، بررسی کرده‌ایم.

بعد از اجرای کد بالا خروجی به شکل زیر، نوشته می‌‌شود.

15
2.0

در کدهای بالا عبارت ریاضی نوشته شده به شکل رشته را به تابع eval()  ارسال کرده‌ایم. این تابع عبارت را دریافت می‌کند. سپس آن را به کد پایتون تبدیل کرده و نتیجه را محاسبه می‌کند. در نهایت هم نتیجه بدست آمده را به خروجی ارسال می‌کند. این کاربرد تابع eval()  در زمان اجرای پروژه‌هایی مانند ساخت ماشین حساب یا پردازش فرمول‌های استخراج شده از متن مفید است.

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

بعد از اجرای کد بالا، خروجی برابر با عدد 205 در کنسول پایتون نوشته می‌‌شود. تابع eval()  در فضای نام محلی خود به متغیرهای x  و y  دسترسی دارد. بنابراین به راحتی از مقدار آن‌ها استفاده می‌کند. در بخش‌های بعدی مطلب، مثال‌های بیشتر و حرفه‌ای‌تری درباره متغیر‌های محلی و سراسری تابع eval()  نوشته شده‌اند.

یادگیری پایتون با کمک فیلم‌ های آموزشی

زبان برنامه نویسی پایتون به دلیل سادگی و قدرت زیاد کاربرد بسیار خوبی در حوزه‌های مختلف پیدا کرده است. به طور معمول شروع یادگیری این زبان ساده است. افراد علاقه‌مند به برنامه نویسی خیلی زود موارد ابتدایی و سینتکس پایتون را یاد می‌گیرند. اما آموختن مفاهیم پیشرفته آن نیاز به تمرین و تلاش بیشتری دارد. استفاده از منابع آموزشی حرفه‌ای مانند فیلم‌های آموزشی کمک زیادی به یادگیری مطالب پیشرفته می‌کند. فیلم‌های آموزشی نسبت به کلاس‌های حضوری از امتیازات بیشتری برخوردار هستند. یکی از این امتیازات هزینه کمتر این محصولات است.

مجموعه فیلم‌های آموزش برنامه نویسی پایتون Python – مقدماتی تا پیشرفته فرادرس
با کلیک بر روی تصویر بالا می‌توانید به صفحه اصلی مجموعه فیلم‌های آموزش برنامه نویسی پایتون Python از مقدماتی تا پیشرفته هدایت شوید.

در همین زمینه هم فرادرس شروع به تولید فیلم‌های آموزشی بسیار مناسبی برای پایتون کرده است. فیلم‌های فرادرس با کمک گرفتن از اساتید باتجربه و تکنیک‌های پیشرفته تولید شده‌اند. در نتیجه کیفیت بالا و محتوای ارزشمندی دارند. این فیلم‌ها از نکات ساده تا بخش‌های بسیار پیشرفته‌‌ای مانند شبکه‌های عصبی و یادگیری ماشین را پوشش می‌دهند. استفاده از فیلم‌های فرادرس نسبت به سایر روش‌ها سریع‌تر و بهتر به نتیجه می‌رسد. در پایین، چند مورد از فیلم‌های آموزشی مربوط به زبان پایتون را معرفی کرده‌ایم.

اجرای کدهای پویا

تابع eval()  فقط برای محاسبات ریاضی نیست. با کمک این تابع می‌توان تمام عبارت‌های معتبر پایتون را اجرا کرد. برای نمونه می‌توانیم به فراخوانی توابع یا ایجاد ساختمان‌های داده، اشاره کنیم.

در مثال پایین، روش ساخت لیست از روی رشته، را بررسی می‌کنیم.

بعد از اجرای کد بالا خروجی به شکل زیر در کنسول پایتون، نوشته می‌‌شود.

[1, 2, 3, 4, 5]
<class 'list'>
در مثال بالا ابتدا - در خط ۲ - رشته‌ای به شکل لیست نوشته شده است. تابع eval()  این رشته را دریافت می‌کند. سپس آن را به لیست واقعی پایتون تبدیل کرده و در خروجی برمی‌گرداند. این تکنیک مناسب زمان‌هایی است که می‌خواهیم داده‌های رشته‌ای را به اشیاء پایتونی تبدیل کنیم.

تابع eval()  حتی می‌تواند سایر توابع تعریف شده توسط کاربر یا توابع درونی پایتون را هم فراخوانی کرده و اجرا کند.

بعد از اجرای کد بالا خروجی به شکل زیر در کنسول پایتون، نمایش داده می‌‌شود.

Hello, Alice!
در مثال بالا، تابع eval()  تابع greet()  را به صورت رشته دریافت کرده است. اما به راحتی آن را فراخوانی می‌کند. این عملیات، قدرت تابع eval()  را در اجرای کدهای پویا با کمک مقادیر رشته‌ای نشان می‌دهد.

کار با محدوده متغیر‌ها

تابع eval()  به برنامه نویس اجازه می‌دهد تا محیط اجرای عبارت‌ها را هم مدیریت بکند. برای انجام این کار باید از دیکشنری‌های اختیاری globals  و locals  استفاده کنید. با کمک این دیکشنری‌ها مشخص می‌کنیم که تابع eval()  به کدام متغیر‌ها و توابع دسترسی داشته باشد.

  • globals: وظیفه این دیکشنری فراهم کردن متغیر‌های سراسری برای اجرای عملیات است.
  • locals: وظیفه این دیکشنری هم فراهم کردن متغیر‌های محلی برای اجرای عملیات است.

اگر پارامتر‌های globals و locals  را مشخص نکنیم، تابع eval()  از متغیر‌های محلی استفاده می‌کند. هر متغیر در پایتون به فضای نام اختصاصی خودش مربوط است. شناخت فضای نام پایتون و روش استفاده از آن برای بهینه‌سازی کدها، برنامه‌های نوشته شده را حرفه‌ای تر می‌کند. برای آشنایی با این مفهوم می‌توانید مطلب مربوط به آن را در مجله فرادرس مطالعه کنید.

دانش‌آموزی در حال فکر کردن درباره اینکه چطور با تابع eval در پایتون کار بکند.

در مثال پایین، روش استفاده از دیکشنری globals  را برای محدود کردن دسترسی، بررسی کرده‌ایم.

بعد از اجرای کد بالا خروجی به شکل پایین در کنسول پایتون، نمایش داده می‌‌شود.

Result with restricted globals: 150
Error when accessing unauthorized variable: name 'local_var' is not defined

با تعریف دیکشنری restricted_globals، می‌توانیم متغیرهای قابل دسترسی تابع eval()  را کنترل کنیم. این کار به امن‌تر شدن برنامه کمک می‌کند.

البته برای دسترسی به متغیر‌های خاص می‌توانیم از آرگومان locals  استفاده کنیم.

بعد از اجرای کد بالا خروجی برابر با عدد 200 در کنسول پایتون، نمایش داده می‌‌شود.

نکته: برای اینکه exec_locals به عنوان متغیر محلی شناخته شود، باید نشان دهیم که متغیر سراسری نداریم یا اینکه پارامتر دوم را مشخص کنیم. در نتیجه از دیکشنری خالی {} به عنوان پارامتر دوم تابع، استفاده کرده‌ایم.

این کد، توانایی ایزوله کردن محیط اجرای تابع eval()  را نشان می‌دهد. زیرا حفظ امنیت در زمان اجرای کدهای پویا اهمیت بسیار زیادی دارد.

خطرات استفاده از تابع eval در پایتون

قدرت زیاد تابع eval()  باعث شده که استفاده از آن خطراتی هم به همراه داشته باشد. بنابرین هیچ وقت نباید از تابع eval()  همراه با مقادیر ورودی نامطمئن استفاده کنیم.

اگر به کاربران اجازه استفاده از eval()  را بدهیم ممکن است آن‌ها کدهای مخربی را به این تابع ارسال کنند. این کد می‌تواند شامل دستورات زیر باشد.

  • حذف بعضی از فایل‌ها از سیستم
  • دسترسی به داده‌های حساس
  • اجرای دستورات مضر
رایج‌ترین خطرات استفاده از تابع eval در پایتون
بیشترین خطر‌های استفاده از تابع eval در پایتون

برای مثال، در کد پایین تابع eval()  را با دستور مخربی اجرا می‌کنیم.

مثال بالا شامل دستوری برای حذف تمام فایل‌های موجود در سیستم است. اجرای این کد می‌تواند آسیب جدی به سیستم بزند. همیشه داده‌های ورودی کاربران را مانند دستوری خطرناک در نظر بگیرید. بنابراین فقط وقتی از eval()  استفاده کنید که کنترل کاملی بر عبارت وارد شده توسط کابران داشته باشید.

علامت خط با رنگ قرمز بر روی کدهای نوشته شده پایتون

برای عبارت‌های ریاضی ساده، استفاده از کد ast.literal_eval() گزینه بهتری نسبت به تابع معمولی eval() است. این دستور امنیت بیشتری دارد، زیرا فقط ساختار‌های پایه‌ای مانند رشته‌ها، اعداد، تاپل، لیست، دیکشنری، بولین و None  را بررسی می‌کند. در نتیجه از اجرا شدن کدهای ناشناس و ناایمن جلوگیری می‌شود.

چگونه با کمک فیلم‌های پروژه محور فرادرس پایتون یاد بگیریم؟

یادگیری برنامه نویسی همراه با اجرای پروژه‌های واقعی باعث افزایش هرچه بیشتر بهره‌وری می‌شود. مجموعه‌ کاملی از فیلم‌های پروژه‌محور پایتون، توسط فرادرس، تولید و منتشر شده‌اند. در این دوره‌ها علاوه بر تمرکز بر پروژه‌های عملی، مفاهیم پایه و مهارت‌های پیشرفته برنامه نویسی نیز آموزش داده می‌‌شوند. مشاهده این فیلم‌های آموزشی به ما کمک می‌کند که هم با روش استفاده صحیح از دستورات پایتون آشنا شویم و هم کاربرد عملی این دستورات را در کنار پیاده‌سازی الگوریتم‌های عملیاتی یاد بگیریم.

در پایین، چند مورد از فیلم‌‌های آموزش پروژه‌محور زبان پایتون را معرفی کرده‌ایم.

با کلیک بر روی تصویر زیر می‌توانید به صفحه اصلی این مجموعه آموزشی، هدایت شده و فیلم‌های پروژه‌محور بیشتری را مشاهده کنید.

مجموعه آموزش پروژه محور برنامه نویسی پایتون (Python)
با کلیک بر روی تصویر بالا می‌توانید به صفحه اصلی مجموعه فیلم‌های آموزش پروژه محور برنامه نویسی پایتون هدایت شوید.

چند مثال درباره استفاده از تابع eval در پایتون

در این بخش از مطلب، چند مثال مختلف را درباره کار با تابع eval()  نوشته‌ایم. با بررسی این مثال‌ها بهتر می‌توانید عملکرد این تابع را درک کنید.

مثال اول: اجرای فرمول درجه دوم

در این مثال می‌خواهیم تابع درجه دوم x2 + 3x + 5 را زمانی که x  برابر با 2 است، حل کنیم. برای حل این مسئله از تابع eval()  استفاده کرده‌ایم.

بعد از اجرای کد بالا خروجی به شکل پایین در کنسول پایتون، نمایش داده می‌‌شود.

The evaluated expression obtained is: 15

مثال دوم: دسترسی به متغیر‌های سراسر و محلی

از تابع eval()  می‌توان برای دسترسی همزمان به متغیر‌های محلی و سراسری هم استفاده کرد. در این مسئله می‌خواهیم حاصل جمع متغیر سراسری global_var و متغیر محلی local_var را بدست بیاوریم.

در کادر پایین، روش حل این مسئله را با کمک تابع eval()  نوشته‌ایم.

بعد از اجرای کد بالا خروجی به شکل پایین در کنسول پایتون، نمایش داده می‌‌شود.

The evaluated expression obtained is: 15

مثال سوم: List Comprehension

در مثال پایین از تکنیک «List Comprehension» برای تعریف لیست استفاده کرده‌ایم. هدف آن است که لیستی از مربع اعداد ۰ تا ۴ ساخته و نتیجه را در خروجی چاپ کنیم.

  1. ابتدا - در خط اول - دستور «List Comprehension» را به صورت رشته نوشته‌ایم.
  2. در خط دوم، این دستور را به تابع eval()  می‌دهیم.
  3. در خط سوم، خروجی تابع eval()  را با کمک تابع print()  چاپ می‌کنیم.

بعد از اجرای کد بالا خروجی به شکل پایین در کنسول پایتون، نمایش داده می‌‌شود.

The evaluated expression obtained is: [0, 1, 4, 9, 16]

مثال چهارم:‌ فراخوانی تابع

در این مثال، تابعی به نام custom_function()  می‌سازیم. این تابع پارامتر x  را دریافت می‌کند. وظیفه تابع custom_function()  محاسبه نتیجه فرمول درجه دوم x**2 + 2*x + 1 با متغیر x  است. سپس رشته‌ای با نام expression  ایجاد می‌کنیم. این رشته، تابع custom_function()  را با پارامتر 3  فراخوانی می‌کند. برای اجرای این رشته از تابع eval()  استفاده می‌کنیم. در زمان فراخوانی تابع eval()  دو پارامتر به آن ارسال می‌کنیم. در پارامتر اول، متغیر‌های سراسری را با استفاده از globals()  قرار می‌دهیم. در پارامتر دوم هم دیکشنری را ارسال می‌کنیم که شامل تابع custom_function()  است.

بعد از اجرای کد بالا خروجی به شکل پایین در کنسول پایتون، نمایش داده می‌‌شود.

The evaluated expression obtained is: 16

جمع‌بندی

در این مطلب از مجله فرادرس با تابع eval()  آشنا شده‌ایم. تابع eval در پایتون برای اجرای کدهایی استفاده می‌شود که به صورت رشته نوشته شده‌اند. این تابع می‌تواند عبارت‌های ریاضی، ساختارهای داده و حتی توابع تعریف شده را اجرا کند. با استفاده از پارامترهای globals  و locals، می‌توان محدوده‌ی دسترسی eval()  را کنترل کرد تا فقط به متغیرها یا توابع مشخصی دسترسی داشته باشد. همین ویژگی باعث انعطاف بالای آن در اجرای کدهای پویا می‌شود.

با این حال، استفاده از eval()  خطرناک است، زیرا اگر ورودی نامطمئن به آن داده شود، امکان اجرای کدهای مخرب مانند حذف فایل‌ها وجود دارد. به همین دلیل توصیه می‌شود فقط در شرایط کنترل شده از آن استفاده کنیم. برای پردازش امن‌تر داده‌های ساده، می‌توان از ast.literal_eval() به جای eval()  استفاده کرد. به هر حال گاهی اوقات در بعضی از برنامه‌ها لازم است قسمتی از کارها را برعهده کاربران بگذاریم. برای مثال، در برنامه ماشین حساب اجرای عبارت نوشته شده توسط کاربر با تابع eval()  ساده‌تر از تجزیه رشته و تبدیل آن به عبارت پایتون است. بنابراین به عنوان توسعه‌دهنده پایتون باید روش کار با این تابع را هم بلد باشیم.

بر اساس رای ۱ نفر
آیا این مطلب برای شما مفید بود؟
اگر پرسشی درباره این مطلب دارید، آن را با ما مطرح کنید.
منابع:
Great Learningtutorialspoint
PDF
مطالب مرتبط
نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *