Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

วิธี eval ใน Python?


วิธี Python eval() ใช้เพื่อแยกสตริงนิพจน์เป็นนิพจน์หลาม จากนั้นรันนิพจน์หลามภายในโปรแกรม

ไวยากรณ์

ไวยากรณ์ของเมธอด python eval() ทั่วไปคือ

eval(expression, globals=None, locals=None)

ที่ไหน:

  • การแสดงออก :พารามิเตอร์สตริงที่จำเป็น นี่คือสตริงนิพจน์ที่กำลังแยกวิเคราะห์และดำเนินการเป็นนิพจน์หลาม

  • ทั่วโลก :พารามิเตอร์ทางเลือกคือพจนานุกรมที่ใช้ระบุนิพจน์ที่พร้อมใช้งาน หากไม่ระบุไว้อย่างชัดเจน มีเมธอดในตัวมาตรฐานเช่น '__builtins__':ไม่มีองค์ประกอบ

  • ชาวบ้าน :พารามิเตอร์ทางเลือก ใช้เพื่อระบุตัวแปรท้องถิ่นและเมธอดที่ใช้ได้กับฟังก์ชัน eval()

ตอนนี้เพื่อให้เข้าใจวิธีการ eval() ได้ดีขึ้น เรามาทำความเข้าใจกับตัวอย่างต่างๆ กัน

เมธอด eval() อย่างง่าย

str1 = 'Hello'
print(eval('str1 =="Hello"'))
print(eval('str1 + ", Python"'))

ผลลัพธ์

True
Hello, Python

เมธอด Python eval() พร้อมอินพุตของผู้ใช้

from math import *
for l in range(1,3):
   func = input("Enter Math Function to Evaluate:\n")
   try:
      print(eval(func))
      except Exception as ex:
      print(ex)
      break
print('Done')

ผลลัพธ์

Enter Math Function to Evaluate:
abs(-42)
42
Enter Math Function to Evaluate:
max(12, 3, 4 , 2, 17)
17
Done

Python eval() globals และ locals

ก่อนทำความเข้าใจว่าเราต้องส่งฟังก์ชันใดไปยังเมธอด eval() มาดูรายการฟังก์ชันและตัวแปรทั้งหมดที่มีอยู่ในขอบเขตส่วนกลางและในเครื่อง

from math import *
def square_root(n):
   return sqrt(n)
# Print current global symbol table as a dictionary
print('List of Global symbols:\n',globals())
#Print current local symbol table as a dictionary
print('\nList of Local symbols:\n',locals())
#print list of names in the current local scope
print('\nList of names in current local scope:\n',dir())

ผลลัพธ์

List of Global symbols:
{'__name__': '__main__',
'__doc__': None,
'__package__': None,
'__loader__': <class '_frozen_importlib.BuiltinImporter'>,
'__spec__': None, '__annotations__': {},
'__builtins__': <module 'builtins' (built-in)>,
'__file__': 'C:/Python/Python361/eval_example1.py',
'acos': <built-in function acos>,
'acosh': <built-in function acosh>,
'asin': <built-in function asin>,
'asinh': <built-in function asinh>,
'atan': <built-in function atan>,
'atan2': <built-in function atan2>,
'atanh': <built-in function atanh>,
'ceil': <built-in function ceil>,
'copysign': <built-in function copysign>,
'cos': <built-in function cos>,
'cosh': <built-in function cosh>,
'degrees': <built-in function degrees>,
'erf': <built-in function erf>,
'erfc': <built-in function erfc>,
'exp': <built-in function exp>,
'expm1': <built-in function expm1>,
'fabs': <built-in function fabs>,
'factorial': <built-in function factorial>,
'floor': <built-in function floor>,
'fmod': <built-in function fmod>,
'frexp': <built-in function frexp>,
'fsum': <built-in function fsum>,
'gamma': <built-in function gamma>,
'gcd': <built-in function gcd>,
'hypot': <built-in function hypot>,
'isclose': <built-in function isclose>,
'isfinite': <built-in function isfinite>,
'isinf': <built-in function isinf>,
'isnan': <built-in function isnan>,
'ldexp': <built-in function ldexp>,
'lgamma': <built-in function lgamma>,
'log': <built-in function log>,
'log1p': <built-in function log1p>,
'log10': <built-in function log10>,
'log2': <built-in function log2>,
'modf': <built-in function modf>,
'pow': <built-in function pow>,
'radians': <built-in function radians>,
'sin': <built-in function sin>,
'sinh': <built-in function sinh>,
'sqrt': <built-in function sqrt>,
'tan': <built-in function tan>,
'tanh': <built-in function tanh>,
'trunc': <built-in function trunc>,
'pi': 3.141592653589793,
'e': 2.718281828459045,
'tau': 6.283185307179586,
'inf': inf,
'nan': nan,
'square_root': <function square_root at 0x055246F0>
}

List of Local symbols:
{'__name__': '__main__', '__doc__': None,
'__package__': None,
'__loader__': <class '_frozen_importlib.BuiltinImporter'>,
'__spec__': None, '__annotations__': {},
'__builtins__': <module 'builtins' (built-in)>,
'__file__': 'C:/Python/Python361/eval_example1.py',
'acos': <built-in function acos>,
'acosh': <built-in function acosh>,
'asin': <built-in function asin>,
'asinh': <built-in function asinh>,
'atan': <built-in function atan>,
'atan2': <built-in function atan2>,
'atanh': <built-in function atanh>,
'ceil': <built-in function ceil>,
'copysign': <built-in function copysign>,
'cos': <built-in function cos>,
'cosh': <built-in function cosh>,
'degrees': <built-in function degrees>,
'erf': <built-in function erf>,
'erfc': <built-in function erfc>,
'exp': <built-in function exp>,
'expm1': <built-in function expm1>,
'fabs': <built-in function fabs>,
'factorial': <built-in function factorial>,
'floor': <built-in function floor>,
'fmod': <built-in function fmod>,
'frexp': <built-in function frexp>,
'fsum': <built-in function fsum>,
'gamma': <built-in function gamma>,
'gcd': <built-in function gcd>,
'hypot': <built-in function hypot>,
'isclose': <built-in function isclose>,
'isfinite': <built-in function isfinite>,
'isinf': <built-in function isinf>,
'isnan': <built-in function isnan>,
'ldexp': <built-in function ldexp>,
'lgamma': <built-in function lgamma>,
'log': <built-in function log>,
'log1p': <built-in function log1p>,
'log10': <built-in function log10>,
'log2': <built-in function log2>,
'modf': <built-in function modf>,
'pow': <built-in function pow>,
'radians': <built-in function radians>,
'sin': <built-in function sin>,
'sinh': <built-in function sinh>,
'sqrt': <built-in function sqrt>,
'tan': <built-in function tan>,
'tanh': <built-in function tanh>,
'trunc': <built-in function trunc>,
'pi': 3.141592653589793,
'e': 2.718281828459045,
'tau': 6.283185307179586,
'inf': inf,
'nan': nan,
'square_root': <function square_root at 0x055246F0>
}

List of names in current local scope:
['__annotations__',
'__builtins__',
'__doc__',
'__file__',
'__loader__',
'__name__',
'__package__',
'__spec__',
'acos', 'acosh',
'asin', 'asinh',
'atan', 'atan2', 'atanh',
'ceil', 'copysign', 'cos',
'cosh', 'degrees', 'e',
'erf', 'erfc', 'exp',
'expm1', 'fabs',
'factorial', 'floor',
'fmod', 'frexp', 'fsum',
'gamma', 'gcd', 'hypot',
'inf', 'isclose', 'isfinite',
'isinf', 'isnan', 'ldexp',
'lgamma', 'log', 'log10',
'log1p', 'log2', 'modf', 'nan',
'pi', 'pow', 'radians', 'sin',
'sinh', 'sqrt', 'square_root',
'tan', 'tanh', 'tau', 'trunc'
]

ด้านล่างเราจะเห็นว่าเราสามารถระบุค่า globals เป็นพจนานุกรมว่างในฟังก์ชัน eval:

>>> print(eval('dir()', {}))
['__builtins__']

มาดูตัวอย่างอื่นที่เราอนุญาตให้เข้าถึงวิธีการบางส่วนจากโมดูลคณิตศาสตร์เท่านั้น

from math import *
for l in range(1, 4):
   func = input("Enter Math Function to Evaluate.\nAllowed Functions are: abs(x) and pow(x,y):\n")
   try:
      print(eval(func, {'absolute': abs, 'pow': pow}))
      except Exception as ex:
      print(ex)
      break
print('Done')

ผลลัพธ์

Enter Math Function to Evaluate.
Allowed Functions are: abs(x) and pow(x,y):
abs(-74)
74
Enter Math Function to Evaluate.
Allowed Functions are: abs(x) and pow(x,y):
pow(2,7)
128.0
Enter Math Function to Evaluate.
Allowed Functions are: abs(x) and pow(x,y):
sqrt(47)
name 'sqrt' is not defined
Done