Hướng dẫn dùng evaluate def python
Show
Ví dụ về hàm eval trong Python Về mặt kỹ thuật, hàm eval là một hàm tích hợp sẵn trong Python và cho phép lập trình viên chạy code Python (được truyền dưới dạng tham số) ngay trong chương trình. Hàm eval phù hợp để sử dụng khi lập trình viên muốn đánh giá biểu thức toán học hoặc đánh giá chuỗi. Cú pháp của hàm eval trong Python như sau: eval(bieuthuc, global=None, local=None) Hàm eval() có ba tham số: - bieuthuc: có thể là bất kỳ biểu thức hợp lệ nào của Python - global: một dictionary chỉ định các phương thức và biến global có sẵn. - local: một dictionary chỉ định các phương thức và biến local có sẵn. >>> Xem thêm: Regex trong Python-Tìm hiểu về biểu thức chính quy trong Python Ví dụ về hàm eval trong Pythondef drivingage(age): if age>18: print("yes") else: print("no") age=int(input("age")) drivingage(age) Output age 6 no Đối số và tham số hàm eval trong PythonCác đối số hoặc tham số của hàm eval là STRING (tham số toàn cục và cục bộ có thể được sử dụng làm đối số bên trong hàm eval), nhưng toàn cục phải được biểu diễn dưới dạng từ điển và cục bộ dưới dạng đối tượng được ánh xạ (mapping). Giá trị trả về từ hàm eval trong PythonPhương thức eval () trả về kết quả được đánh giá từ expression. Giá trị kết quả / trả về chủ yếu sẽ là số nguyên. Ví dụ: Ví dụ 1: Cách eval () hoạt động trong Python x = 1 print(eval('x + 1')) Đầu ra 2 Ở đây, eval()hàm đánh giá biểu thức x + 1 và print được sử dụng để hiển thị giá trị này. >>> Tham khảo: Khóa học lập trình Python Khai thác Eval bằng PythonCó một hàm trong code hỗ trợ lập trình viên lấy lại các loại mật khẩu hoặc dữ liệu quan trọng khác có thể nghiêm trọng. Người dùng có thể gọi các hàm này thông qua eval trong Python và truy cập các dữ liệu quan trọng mà họ cần. Hạn chế việc sử dụng các phương thức và biến có sẵn trong eval ()Tất cả các phương pháp và biến có sẵn được sử dụng trong expression (tham số đầu tiên đến eval()) có thể không cần thiết, hoặc thậm chí có thể có lỗ hổng bảo mật. Bạn có thể cần phải hạn chế việc sử dụng các phương thức và biến này cho eval(). Bạn có thể làm như vậy bằng cách chuyển tùy chọn global và local cũng như tham số (từ điển) cho hàm eval(). 1. Khi bỏ qua cả tham số global và localNếu cả hai tham số bị bỏ qua, biểu hiện được thực thi trong phạm vi hiện tại. Bạn có thể kiểm tra các biến và phương pháp có sẵn bằng cách sử dụng mã sau: print(eval('dir()') 2. Truyền tham số global; tham số local bị bỏ quaCác tham số global, local (từ điển) được sử dụng cho các biến toàn cục và cục bộ tương ứng. Nếu biến local bị bỏ qua, nó sẽ tự động chuyển qua biến global. Có nghĩa là biến globals sẽ được sử dụng cho cả biến local và global. Lưu ý: Bạn có thể kiểm tra tham số cục bộ và toàn cục hiện tại trong Python bằng cách sử dụng các phương thức tích hợp sẵn tương ứng là global () và local () . Kết luận: Trên đây là một số kiến thức về hàm eval trong Python cùng các ví dụ cụ thể. Hy vọng bạn có thể tận dụng các thông tin mà bài viết mang lại trong quá trình làm việc với Python. Tìm hiểu thêm là Python và các ngôn ngữ lập trình khác qua các khóa học lập trình tại T3H Nguồn tham khảo: techvidvan, programiz Mục lục bài viết:
Python Mặc dù Python Trong hướng dẫn này, bạn sẽ học:
Ngoài ra, bạn sẽ học cách sử dụng Hiểu về eval()Bạn có thể sử dụng Python tích hợp eval() để đánh giá động các biểu thức từ đầu vào dựa trên chuỗi hoặc dựa trên mã đã biên dịch. Nếu bạn chuyển một chuỗi vào Cú pháp của eval(expression[, globals[, locals]]) Hàm nhận một đối số đầu tiên là
Trong ba phần tiếp theo, bạn sẽ tìm hiểu những đối số này là gì và cách
Đối số đầu tiên: expressionĐây là đối số bắt buộc chứa đầu vào dựa trên chuỗi hoặc mã đã biên dịch cho hàm. Khi bạn gọi
Khi bạn gọi Để đánh giá một chuỗi dựa trên
Tên
Mặt khác, một câu lệnh Python có định nghĩa sau:
Nếu bạn cố gắng chuyển một câu lệnh ghép vào
Nếu bạn cố gắng để đánh giá một câu lệnh ghép sử dụng Python
Hoạt động chuyển nhượng không được phép với
Nếu bạn cố gắng chuyển một thao tác gán làm đối số cho Python Bạn
cũng sẽ nhận được
Bạn không thể truyền một biểu thức Bạn cũng có thể truyền các đối tượng mã đã biên dịch sang Chi tiết về cách sử dụng
Bạn có thể sử dụng
Nếu bạn sử dụng
Nếu bạn gọi Nếu bạn biên dịch trước biểu thức đầu vào, thì các lệnh gọi liên tiếp tới Đối sô thứ hai: globalsĐối số thứ hai của Tên chung là tất cả những tên có sẵn trong phạm vi toàn cầu hoặc không gian tên hiện tại của bạn. Bạn có thể truy cập chúng từ bất kỳ đâu trong mã của mình. Tất cả các tên được chuyển đến
Nếu bạn cung cấp một từ
điển tùy chỉnh cho đối số Bạn
có thể chèn tên vào
Vì bạn thêm Bạn cũng có thể cung cấp các tên không tồn tại trong phạm vi toàn cục hiện tại của bạn. Để điều này hoạt động, bạn cần cung cấp một giá trị cụ thể cho mỗi một tên.
Mặc dù Cơ chế đằng sau Một điểm quan trọng liên quan đến Các ví dụ sau đây cho thấy rằng ngay cả khi bạn cung cấp một từ điển trống
Trong đoạn mã trên, bạn cung cấp một từ điển trống ( Nếu bạn gọi
Khi bạn gọi Đối số thứ ba: locals
Tên cục bộ là những tên (biến, hàm, lớp, v.v.) mà bạn tạo bên trong một hàm nhất định. Tên cục bộ chỉ hiển thị từ bên trong hàm bao quanh. Bạn tạo những loại tên này khi bạn viết một hàm. Vì
Từ điển thứ hai trong lần gọi đầu tiên để cho Bạn có thể
sử dụng Giống như với Lưu ý rằng để cung cấp từ điển cho
Nếu bạn cố gắng sử dụng các đối số từ khóa khi gọi Nếu bạn không chuyển một từ điển đến
Giả sử rằng bạn không cung cấp từ điển tùy
chỉnh Sự khác biệt thực tế chính giữa Đánh giá biểu thức bằng eval()Bạn có thể sử dụng
Biểu thức BooleanBiểu thức Boolean là các biểu thức Python trả về giá trị chân lý (
Bạn có thể sử dụng
Trong mọi trường hợp, hàm sẽ đều trả về giá trị chân lý của biểu thức mà bạn đang đánh giá. Bây giờ, bạn có thể đang nghĩ, tại sao tôi nên sử dụng
Thì bên trong Bây giờ hãy tưởng tượng bạn sẽ triển khai thứ gì đó như thế này mà không cần sử dụng Biểu thức toán họcMột trường hợp sử dụng phổ biến nữa của Các ví dụ sau đây cho thấy cách bạn có thể sử dụng
Khi bạn sử dụng Biểu thức Mục đích ChungĐến đây
thì bạn đã học cách sử dụng Ví dụ: bạn có thể gọi một hàm tích hợp sẵn hoặc một hàm mà bạn đã nhập bằng mô-đun chuẩn hoặc bên thứ ba:
Trong ví dụ này, bạn sử dụng Trong phần tiếp theo, bạn sẽ xem xét các cách để giải quyết một số rủi ro bảo mật liên quan đến eval(). Giảm thiểu các vấn đề bảo mật của eval()Mặc dù nó có số lượng sử dụng gần như không giới hạn, nhưng Đây được coi là thực tế lập trình tồi vì mã bạn đang đọc (hoặc viết) không phải là mã bạn sẽ thực thi. Nếu bạn định sử dụng Vì lý do này, các phương pháp lập trình tốt thường khuyên bạn không nên sử dụng Ví dụ về
cách sử dụng Ứng dụng này sẽ chạy trên máy chủ cá nhân của bạn, nơi bạn có tất cả các tệp có giá trị đó. Nếu bạn đang chạy một
box Linux và quy trình của ứng dụng có quyền phù hợp, thì người dùng độc hại có thể đưa ra một chuỗi nguy hiểm như sau:
Đoạn mã trên sẽ xóa tất cả các tệp trong thư mục hiện tại của ứng dụng. Điều đó sẽ thật kinh khủng, phải không?
Khi đầu vào không đáng tin cậy, không có cách nào hoàn toàn hiệu quả để tránh các rủi ro bảo mật liên quan đến Hạn chế của globals và localsBạn có thể hạn chế môi trường thực thi
Nếu bạn truyền từ điển trống ( Thật không may, việc hạn chế các đối số Hạn chế sử dụng tên có sẵnNhư bạn đã thấy trước đó, Các ví dụ sau cho thấy rằng bạn có thể sử dụng bất kỳ hàm tích hợp nào và bất kỳ mô-đun tiêu chuẩn nào như
Mặc dù bạn hạn chế Bạn có thể sử dụng Để giảm thiểu rủi ro này, bạn có thể hạn chế quyền truy cập vào các chức năng tích hợp của Python bằng cách ghi đè khóa
Nếu bạn truyền một từ điển có chứa cặp khóa-giá trị Hạn chế tên khi input dữ liệuMặc dù bạn có thể hạn chế môi trường thực thi của Python
Khi bạn có quyền truy cập
Mã này sẽ in một danh sách lớn các lớp ra màn hình của bạn. Một số lớp này khá mạnh và có thể cực kỳ nguy hiểm khi rơi vào tay kẻ
xấu. Điều này mở ra một lỗ hổng bảo mật quan trọng khác mà bạn không thể đóng bằng cách hạn chế môi trường thực thi của
Sự hiểu danh sách trong đoạn mã trên lọc các lớp kế thừa Trong ví dụ này, bạn sử dụng Một giải pháp khả thi cho lỗ hổng này là hạn chế việc sử dụng tên trong đầu vào, với một loạt các tên an toàn hoặc không có tên nào cả. Để thực hiện kỹ thuật này, bạn cần trải qua các bước sau:
Hãy xem hàm sau đây:
Trong Các ví dụ sau đây cho thấy cách
Nếu bạn gọi Nếu bạn muốn hoàn toàn không cho phép sử dụng tên, bạn có thể viết lại
Bây giờ hàm của bạn sẽ không cho phép bất kỳ tên nào trong chuỗi đầu vào. Để thực hiện điều này, bạn kiểm tra tên trong Bạn có thể sử dụng kỹ thuật này để giảm thiểu các vấn đề bảo mật Hạn chế input dữ liệu là các hằngMột trường hợp sử dụng phổ biến cho Thư viện tiêu chuẩn cung cấp một hàm được gọi là literal_eval() có thể giúp đạt được mục tiêu này. Hàm không hỗ trợ toán tử, nhưng nó hỗ trợ list, tuple, số, chuỗi, v.v.
Lưu ý rằng Sử dụng eval() với input()Trong Python 3.x có tích hợp sẵn input() dùng để đọc dữ
liệu đầu vào của người dùng tại dòng lệnh, chuyển đổi nó thành một chuỗi, tách dòng mới ở cuối và trả về kết quả cho người gọi. Vì kết quả của
Bạn có thể đặt Hành vi này của Xây dựng một trình đánh giá biểu thức toán họcĐến đây thì bạn đã biết cách Trong phần này, bạn sẽ viết mã một ứng dụng để đánh giá nhanh các biểu thức toán học. Nếu bạn muốn giải quyết vấn đề này mà không cần sử dụng
Đó sẽ là rất nhiều công việc xem xét nhiều loại biểu thức có thể có mà Python có thể xử lý và đánh
giá. May mắn thay, bạn có thể sử dụng Đầu tiên bạn tạo một file tên
Trong đoạn mã trên, trước tiên bạn import mô-đun Bạn cũng tạo thêm ba hằng số chuỗi. Bạn sẽ sử dụng chúng làm giao diện người dùng cho tập lệnh của mình và bạn sẽ in chúng ra màn hình nếu cần. Bây giờ bạn đã sẵn sàng để viết mã chức năng cốt lõi của ứng dụng của mình. Trong trường hợp này, bạn muốn viết mã một hàm nhận các biểu thức toán học làm đầu vào và trả về kết quả của chúng. Để làm điều
này, bạn viết một hàm có tên
Đây là cách hoạt động của hàm:
Việc sử dụng các giá trị tùy chỉnh cho các tham số Trình đánh giá biểu thức toán học của bạn sẽ hoàn thành khi bạn viết mã khách hàng của nó vào main(). Trong hàm này, bạn sẽ tạo vòng lặp chính của chương trình và đóng chu kỳ đọc và đánh giá các biểu thức mà người dùng của bạn nhập vào dòng lệnh. Đối với ví dụ này, ứng dụng sẽ:
Kiểm tra việc triển khai sau đây của
Bên trong Nếu người dùng nhập tùy chọn Cuối cùng, bạn sử dụng
Lưu ý rằng trong Như vậy đến đây bạn đã
xây dựng xong một trình đánh giá biểu thức toán học trong khoảng bảy mươi dòng mã bằng cách sử dụng import math __version__ = "1.0" ALLOWED_NAMES = { k: v for k, v in math.__dict__.items() if not k.startswith("__") } PS1 = "mr>>" WELCOME = f""" MathREPL {__version__}, trình đánh giá biểu thức toán học Python! Nhập vào một biểu thức toán học sau dòng nhắc "{PS1}". Soạn "help" rồi Enter để biết thêm thông tin. Soạn "quit" hoặc "exit" để thoát. """ USAGE = f""" Usage: Xây dựng biểu thức toán học sử dụng các phép toán và các con số. Sử dụng bất kỳ hằng và hàm nào dưới đây: {', '.join(ALLOWED_NAMES.keys())} """ def evaluate(expression): """Đánh giá biểu thức toán học.""" # Biên dịch biểu thức code = compile(expression, " Bạn chạy chương trình sẽ hiện ra kết quả thế này: MathREPL 1.0, trình đánh giá biểu thức toán học Python! mr>> Bạn thực hiện một số ví dụ như sau xem sao: mr>> 9*5 Phần kết luậnBạn có thể sử dụng Trong hướng dẫn này, bạn đã tìm hiểu cách Bây giờ bạn có thể:
Copied !!! |