Python là chức năng hay đối tượng
Lập trình hàm là một mô hình lập trình trong đó phương pháp tính toán chính là đánh giá các hàm. Trong hướng dẫn này, bạn sẽ khám phá lập trình chức năng trong Python Show
Lập trình chức năng thường đóng một vai trò khá nhỏ trong mã Python. Nhưng thật tốt khi làm quen với nó. Ít nhất, thỉnh thoảng bạn có thể gặp nó khi đọc mã do người khác viết. Bạn thậm chí có thể tìm thấy các tình huống thuận lợi khi sử dụng các khả năng lập trình chức năng của Python trong mã của riêng bạn Trong hướng dẫn này, bạn sẽ học
Tiền thưởng miễn phí. 5 Suy nghĩ về Làm chủ Python, một khóa học miễn phí dành cho các nhà phát triển Python cho bạn thấy lộ trình và tư duy mà bạn sẽ cần để đưa các kỹ năng Python của mình lên một tầm cao mới Lập trình chức năng là gì?Một hàm thuần túy là một hàm có giá trị đầu ra chỉ theo sau các giá trị đầu vào của nó mà không có bất kỳ tác dụng phụ nào có thể quan sát được. Trong lập trình chức năng, một chương trình hoàn toàn bao gồm việc đánh giá các chức năng thuần túy. Quá trình tính toán tiến hành bằng các lệnh gọi hàm lồng nhau hoặc tổng hợp, không thay đổi trạng thái hoặc dữ liệu có thể thay đổi Mô hình chức năng phổ biến vì nó mang lại một số lợi thế so với các mô hình lập trình khác. Mã chức năng là
Nhiều ngôn ngữ lập trình hỗ trợ một số mức độ lập trình chức năng. Trong một số ngôn ngữ, hầu như tất cả mã đều tuân theo mô hình chức năng. Haskell là một ví dụ như vậy. Ngược lại, Python không hỗ trợ lập trình chức năng nhưng cũng chứa các tính năng của các mô hình lập trình khác Mặc dù đúng là mô tả chuyên sâu về lập trình hàm hơi phức tạp, nhưng mục tiêu ở đây không phải là trình bày một định nghĩa chặt chẽ mà là để cho bạn thấy những gì bạn có thể làm bằng cách lập trình hàm trong Python Loại bỏ các quảng cáoPython hỗ trợ lập trình chức năng tốt như thế nào?Để hỗ trợ lập trình chức năng, sẽ rất hữu ích nếu một chức năng trong ngôn ngữ lập trình nhất định có hai khả năng
Python chơi độc đáo ở cả hai khía cạnh này. Như bạn đã học trước đây trong loạt bài này, mọi thứ trong chương trình Python đều là đối tượng. Tất cả các đối tượng trong Python đều có tầm vóc ít nhiều bằng nhau và các hàm cũng không ngoại lệ Trong Python, các hàm là công dân hạng nhất. Điều đó có nghĩa là các hàm có các đặc điểm giống như các giá trị như chuỗi và số. Bất cứ điều gì bạn mong muốn có thể thực hiện với một chuỗi hoặc số, bạn cũng có thể thực hiện với một hàm Ví dụ, bạn có thể gán một chức năng cho một biến. Sau đó, bạn có thể sử dụng biến đó giống như cách bạn sử dụng chính hàm đó >>>
Phép gán 7 trên dòng 8 tạo một tham chiếu mới tới 8 có tên là 9. Sau đó, bạn có thể gọi hàm bằng một trong hai tên, 0 hoặc 9, như được hiển thị trên dòng 5 và 9Bạn có thể hiển thị một chức năng cho bảng điều khiển với 2, bao gồm nó như một thành phần trong đối tượng dữ liệu tổng hợp như danh sách hoặc thậm chí sử dụng nó làm khóa từ điển>>> 1Trong ví dụ này, 8 xuất hiện trong tất cả các ngữ cảnh giống như các giá trị 4 và 5 và trình thông dịch xử lý nó tốtGhi chú. Những gì bạn có thể hoặc không thể làm với bất kỳ đối tượng nào trong Python phụ thuộc vào ngữ cảnh ở một mức độ nào đó. Ví dụ, có một số thao tác hoạt động đối với các loại đối tượng nhất định nhưng không hoạt động đối với các loại đối tượng khác Bạn có thể cộng hai đối tượng số nguyên hoặc nối hai đối tượng chuỗi bằng toán tử cộng ( 6). Nhưng toán tử cộng không được định nghĩa cho các đối tượng hàmĐối với các mục đích hiện tại, điều quan trọng là các hàm trong Python đáp ứng hai tiêu chí có lợi cho lập trình hàm được liệt kê ở trên. Bạn có thể chuyển một hàm cho một hàm khác làm đối số >>> 6Đây là những gì đang xảy ra trong ví dụ trên
Điều này được gọi là thành phần chức năng lưu ý kỹ thuật. Python cung cấp một ký hiệu tắt được gọi là trình trang trí để tạo điều kiện gói một chức năng bên trong một chức năng khác. Để biết thêm thông tin, hãy xem Primer on Python Decorators Khi bạn truyền một hàm cho một hàm khác, hàm được truyền vào đôi khi được gọi là hàm gọi lại vì một lệnh gọi lại hàm bên trong có thể sửa đổi hành vi của hàm bên ngoài Một ví dụ điển hình về điều này là hàm Python 15. Thông thường, nếu bạn chuyển một danh sách các giá trị chuỗi tới 15, thì nó sẽ sắp xếp chúng theo thứ tự từ vựng>>> 7Tuy nhiên, 15 lấy một đối số 18 tùy chọn chỉ định hàm gọi lại có thể đóng vai trò là khóa sắp xếp. Vì vậy, ví dụ: thay vào đó, bạn có thể sắp xếp theo độ dài chuỗi>>> 0 15 cũng có thể nhận một đối số tùy chọn chỉ định sắp xếp theo thứ tự đảo ngược. Nhưng bạn có thể quản lý điều tương tự bằng cách xác định chức năng gọi lại của riêng bạn để đảo ngược ý nghĩa của 20>>>
Bạn có thể xem Cách sử dụng 15 và 22 trong Python để biết thêm thông tin về cách sắp xếp dữ liệu trong PythonGiống như bạn có thể chuyển một hàm cho một hàm khác làm đối số, một hàm cũng có thể chỉ định một hàm khác làm giá trị trả về của nó >>>
Đây là những gì đang diễn ra trong ví dụ này
Sau đó, bạn có thể gọi gián tiếp 7 thông qua 11, như được hiển thị trên dòng 12. Bạn cũng có thể gọi nó một cách gián tiếp bằng cách sử dụng giá trị trả về từ 8 mà không cần chuyển nhượng trung gian, như trên dòng 15Như bạn có thể thấy, Python có sẵn các phần để hỗ trợ lập trình chức năng một cách độc đáo. Tuy nhiên, trước khi bạn chuyển sang mã chức năng, có một khái niệm nữa sẽ hữu ích để bạn khám phá. biểu thức 3Loại bỏ các quảng cáoĐịnh nghĩa một hàm ẩn danh với >>> animals = ["ferret", "vole", "dog", "gecko"] >>> sorted(animals, key=len, reverse=True) ['ferret', 'gecko', 'vole', 'dog'] >>> def reverse_len(s): .. return -len(s) ... >>> sorted(animals, key=reverse_len) ['ferret', 'gecko', 'vole', 'dog'] 3Lập trình hàm là tất cả về việc gọi các hàm và truyền chúng xung quanh, do đó, đương nhiên nó liên quan đến việc xác định rất nhiều hàm. Bạn luôn có thể định nghĩa một hàm theo cách thông thường, sử dụng từ khóa 84 như bạn đã thấy trong các hướng dẫn trước của loạt bài nàyTuy nhiên, đôi khi, thật thuận tiện khi có thể xác định một hàm ẩn danh một cách nhanh chóng mà không cần phải đặt tên cho nó. Trong Python, bạn có thể làm điều này với biểu thức 3lưu ý kỹ thuật. Thuật ngữ lambda xuất phát từ phép tính lambda, một hệ thống logic toán học chính thức để thể hiện phép tính dựa trên sự trừu tượng hóa hàm và ứng dụng Cú pháp của một biểu thức 3 như sau 1Bảng dưới đây tóm tắt các phần của biểu thức 3ComponentMeaning 3Từ khóa giới thiệu một biểu thức 3 100Một danh sách các tên tham số được phân tách bằng dấu phẩy tùy chọn 101Dấu chấm câu phân tách 100 khỏi 103 103Một biểu thức thường liên quan đến các tên trong 100Giá trị của một biểu thức 3 là một hàm có thể gọi được, giống như một hàm được xác định bằng từ khóa 84. Nó nhận các đối số, như được chỉ định bởi 100 và trả về một giá trị, như được chỉ định bởi 103Đây là một ví dụ nhanh đầu tiên >>> 2Câu lệnh trên dòng 1 chỉ là biểu thức 3 của chính nó. Ở dòng 2, Python hiển thị giá trị của biểu thức mà bạn có thể thấy là một hàmHàm Python tích hợp sẵn 111 trả về 112 nếu đối số được truyền cho nó dường như có thể gọi được và 113 nếu không. Dòng 4 và 5 cho thấy rằng giá trị được trả về bởi biểu thức 3 trên thực tế có thể gọi được, vì một hàm phải làTrong trường hợp này, danh sách tham số bao gồm tham số duy nhất 115. Biểu thức tiếp theo 116 là cú pháp cắt lát trả về các ký tự trong 115 theo thứ tự ngược lại. Vì vậy, biểu thức 3 này định nghĩa một hàm tạm thời, không tên, nhận một đối số chuỗi và trả về chuỗi đối số với các ký tự bị đảo ngượcĐối tượng được tạo bởi biểu thức 3 là công dân hạng nhất, giống như hàm tiêu chuẩn hoặc bất kỳ đối tượng nào khác trong Python. Bạn có thể gán nó cho một biến và sau đó gọi hàm bằng tên đó>>> 8Đây là chức năng — không có ý định chơi chữ — tương đương với việc xác định 120 với từ khóa 84>>> 10Các cuộc gọi trên dòng 4 và 8 ở trên hoạt động giống hệt nhau Tuy nhiên, không cần thiết phải gán biến cho biểu thức 3 trước khi gọi nó. Bạn cũng có thể gọi trực tiếp hàm được xác định bởi biểu thức 3>>> 11Đây là một ví dụ khác >>> 12Trong trường hợp này, các tham số là 124, 125 và 126 và biểu thức là 127. Đây là một hàm 3 ẩn danh để tính trung bình cộng của ba sốMột ví dụ khác, hãy nhớ lại ở trên khi bạn xác định một 129 để phục vụ như một chức năng gọi lại cho 15>>> 13Bạn cũng có thể sử dụng hàm 3 tại đây>>> 14Một biểu thức 3 thường sẽ có một danh sách tham số, nhưng nó không bắt buộc. Bạn có thể định nghĩa hàm 3 không có tham số. Giá trị trả về sau đó không phụ thuộc vào bất kỳ tham số đầu vào nào>>> 15Lưu ý rằng bạn chỉ có thể định nghĩa các hàm khá thô sơ với 3. Giá trị trả về từ một biểu thức 3 chỉ có thể là một biểu thức duy nhất. Biểu thức 3 không thể chứa các câu lệnh như phép gán hoặc 137, cũng như không thể chứa các cấu trúc điều khiển như 138, 139, 140, 141 hoặc 84Bạn đã học được trong hướng dẫn trước về cách xác định hàm Python rằng một hàm được xác định bằng 84 có thể trả về nhiều giá trị một cách hiệu quả. Nếu một câu lệnh 137 trong một hàm chứa một số giá trị được phân tách bằng dấu phẩy, thì Python sẽ đóng gói chúng và trả về chúng dưới dạng một bộ>>> 16Gói tuple ẩn này không hoạt động với hàm 3 ẩn danh>>> 17Nhưng bạn có thể trả về một bộ từ hàm 3. Bạn chỉ cần biểu thị bộ dữ liệu một cách rõ ràng bằng dấu ngoặc đơn. Bạn cũng có thể trả về danh sách hoặc từ điển từ hàm 3>>> 18Một biểu thức 3 có không gian tên cục bộ riêng của nó, vì vậy các tên tham số không xung đột với các tên giống hệt nhau trong không gian tên chung. Một biểu thức 3 có thể truy cập các biến trong không gian tên chung, nhưng nó không thể sửa đổi chúngCó một điều kỳ lạ cuối cùng cần lưu ý. Nếu bạn thấy cần bao gồm một biểu thức 3 trong một chuỗi ký tự được định dạng (chuỗi f), thì bạn sẽ cần đặt nó trong dấu ngoặc đơn rõ ràng>>> 19Bây giờ bạn đã biết cách định nghĩa một hàm ẩn danh với 3. Để đọc thêm về các hàm 3, hãy xem Cách sử dụng các hàm Lambda của PythonTiếp theo, đã đến lúc đi sâu vào lập trình chức năng trong Python. Bạn sẽ thấy các hàm 3 đặc biệt tiện lợi như thế nào khi viết mã chức năngPython cung cấp hai hàm dựng sẵn, 4 và 5, phù hợp với mô hình lập trình hàm. Thứ ba, 6, không còn là một phần của ngôn ngữ cốt lõi nhưng vẫn có sẵn từ một mô-đun có tên là 157. Mỗi hàm trong số ba hàm này lấy một hàm khác làm một trong các đối số của nóLoại bỏ các quảng cáoÁp dụng một hàm cho một Iterable với >>> animals = ["ferret", "vole", "dog", "gecko"] >>> sorted(animals, key=len, reverse=True) ['ferret', 'gecko', 'vole', 'dog'] >>> def reverse_len(s): .. return -len(s) ... >>> sorted(animals, key=reverse_len) ['ferret', 'gecko', 'vole', 'dog'] 4Hàm đầu tiên trên docket là 4, đây là hàm tích hợp sẵn của Python. Với 4, bạn có thể lần lượt áp dụng một hàm cho từng phần tử trong một iterable và 4 sẽ trả về một iterator mang lại kết quả. Điều này có thể cho phép một số mã rất ngắn gọn vì một câu lệnh 4 thường có thể thay thế một vòng lặp rõ ràngGọi >>> animals = ["ferret", "vole", "dog", "gecko"] >>> sorted(animals, key=len, reverse=True) ['ferret', 'gecko', 'vole', 'dog'] >>> def reverse_len(s): .. return -len(s) ... >>> sorted(animals, key=reverse_len) ['ferret', 'gecko', 'vole', 'dog'] 4 với một Iterable duy nhấtCú pháp gọi 4 trên một lần lặp duy nhất trông như thế này 60 165 trả về trong iterator mang lại kết quả của việc áp dụng hàm 166 cho từng phần tử của 167Đây là một ví dụ. Giả sử bạn đã định nghĩa 120, một hàm nhận một đối số chuỗi và trả về kết quả ngược lại, sử dụng cơ chế cắt chuỗi 169 của người bạn cũ của bạn>>> 61Nếu bạn có một danh sách các chuỗi, thì bạn có thể sử dụng 4 để áp dụng 120 cho từng phần tử của danh sách>>> 62Nhưng hãy nhớ rằng, 4 không trả về một danh sách. Nó trả về một iterator gọi là đối tượng bản đồ. Để có được các giá trị từ trình vòng lặp, bạn cần lặp lại nó hoặc sử dụng 173>>> 63Lặp lại trên 174 mang lại các mục từ danh sách ban đầu 175, với mỗi chuỗi được đảo ngược bởi 120Trong ví dụ này, 120 là một hàm khá ngắn, một hàm mà bạn có thể không cần đến ngoài mục đích sử dụng này với 4. Thay vì làm lộn xộn mã bằng một hàm bỏ đi, thay vào đó bạn có thể sử dụng một hàm 3 ẩn danh>>> 64Nếu iterable chứa các mục không phù hợp với chức năng đã chỉ định, thì Python sẽ đưa ra một ngoại lệ >>> 65Trong trường hợp này, hàm 3 mong đợi một đối số chuỗi mà nó sẽ cố gắng cắt. Phần tử thứ hai trong danh sách, 181, là một đối tượng 182, không thể cắt được. Vì vậy, một 183 xảy raĐây là một ví dụ thực tế hơn một chút. Trong phần hướng dẫn về các phương thức chuỗi tích hợp, bạn đã gặp phải 184, nối các chuỗi từ một lần lặp, được phân tách bằng chuỗi đã chỉ định>>> 66Điều này hoạt động tốt nếu các đối tượng trong danh sách là chuỗi. Nếu không, thì 184 sẽ đưa ra một ngoại lệ 183>>> 67Một cách để khắc phục điều này là với một vòng lặp. Sử dụng vòng lặp 138, bạn có thể tạo một danh sách mới chứa các biểu diễn chuỗi của các số trong danh sách ban đầu. Sau đó, bạn có thể chuyển danh sách mới tới 188>>> 68Tuy nhiên, vì 4 lần lượt áp dụng một hàm cho từng đối tượng của danh sách, nên nó thường có thể loại bỏ nhu cầu về một vòng lặp rõ ràng. Trong trường hợp này, bạn có thể sử dụng 4 để áp dụng 191 cho các đối tượng danh sách trước khi nối chúng>>> 69 192 trả về một trình vòng lặp mang lại danh sách các đối tượng chuỗi 193 và sau đó bạn có thể chuyển thành công danh sách đó tới 188Mặc dù 4 đạt được hiệu quả mong muốn trong ví dụ trên, nhưng sẽ hợp lý hơn nếu sử dụng cách hiểu danh sách để thay thế vòng lặp rõ ràng trong trường hợp như thế nàyLoại bỏ các quảng cáoGọi >>> animals = ["ferret", "vole", "dog", "gecko"] >>> sorted(animals, key=len, reverse=True) ['ferret', 'gecko', 'vole', 'dog'] >>> def reverse_len(s): .. return -len(s) ... >>> sorted(animals, key=reverse_len) ['ferret', 'gecko', 'vole', 'dog'] 4 với nhiều lần lặpCó một dạng khác của 4 có nhiều hơn một đối số có thể lặp lại 70 198 199 600 601 602 603 604 áp dụng song song 166 cho các phần tử trong mỗi 606 607 608 và trả về một trình vòng lặp mang lại kết quảSố lượng đối số 606____1607 608 được chỉ định cho 4 phải khớp với số lượng đối số mà 166 mong đợi. 166 hoạt động trên mục đầu tiên của mỗi 606 607 608 và kết quả đó trở thành mục đầu tiên mà trình lặp trả về mang lại. Sau đó, 166 tác động lên mục thứ hai trong mỗi 606 607 608, và mục đó trở thành mục mang lại thứ hai, v.v.Một ví dụ sẽ giúp làm rõ >>> 71Trong trường hợp này, 622 có ba đối số. Tương ứng, có ba đối số có thể lặp lại đối với 4. các danh sách 624, 625 và 626Mục đầu tiên được trả về là kết quả của việc áp dụng 622 cho phần tử đầu tiên trong mỗi danh sách. 628. Mục thứ hai được trả về là 629 và mục thứ ba là 630, như thể hiện trong sơ đồ sauGiá trị trả về từ 4 là một trình vòng lặp mang lại danh sách 632Một lần nữa trong trường hợp này, vì 622 quá ngắn, bạn có thể dễ dàng thay thế nó bằng hàm 3 để thay thế>>> 72Ví dụ này sử dụng dấu ngoặc đơn bổ sung xung quanh hàm 3 và tiếp tục dòng ẩn. Cả hai đều không cần thiết, nhưng chúng giúp mã dễ đọc hơnChọn các phần tử từ một Iterable với >>> animals = ["ferret", "vole", "dog", "gecko"] >>> sorted(animals, key=len, reverse=True) ['ferret', 'gecko', 'vole', 'dog'] >>> def reverse_len(s): .. return -len(s) ... >>> sorted(animals, key=reverse_len) ['ferret', 'gecko', 'vole', 'dog'] 5 5 cho phép bạn chọn hoặc lọc các mục từ một lần lặp dựa trên đánh giá của chức năng đã cho. Nó được gọi như sau 73 638 áp dụng hàm 166 cho từng phần tử của 167 và trả về một trình vòng lặp mang lại tất cả các mục mà 166 là trung thực. Ngược lại, nó lọc ra tất cả các mục mà 166 là giảTrong ví dụ sau, 643 là true nếu 644>>> 74Trong trường hợp này, 645 là trung thực đối với các mục 646, 647 và 648, vì vậy các mục này vẫn còn, trong khi 199, 601 và 651 bị loại bỏ. Như trong các ví dụ trước, 645 là một hàm ngắn và bạn có thể thay thế nó bằng biểu thức 3>>> 75Ví dụ tiếp theo có tính năng 654. 655 tạo ra một iterator mang lại các số nguyên từ 656 đến 657. Ví dụ sau sử dụng 5 để chỉ chọn các số chẵn từ danh sách và lọc ra các số lẻ>>> 76Đây là một ví dụ sử dụng phương thức chuỗi tích hợp >>> 77Hãy nhớ từ hướng dẫn trước về các phương thức chuỗi mà 659 trả về 112 nếu tất cả các ký tự chữ cái trong 115 là chữ hoa và 113 nếu ngược lạiLoại bỏ các quảng cáoGiảm một Iterable thành một giá trị duy nhất với >>> animals = ["ferret", "vole", "dog", "gecko"] >>> sorted(animals, key=len, reverse=True) ['ferret', 'gecko', 'vole', 'dog'] >>> def reverse_len(s): .. return -len(s) ... >>> sorted(animals, key=reverse_len) ['ferret', 'gecko', 'vole', 'dog'] 6 6 áp dụng một chức năng cho các mục trong hai mục có thể lặp lại cùng một lúc, dần dần kết hợp chúng để tạo ra một kết quả duy nhất 6 đã từng là một hàm tích hợp sẵn trong Python. Guido van Rossum dường như không thích 6 và ủng hộ việc loại bỏ hoàn toàn khỏi ngôn ngữ. Đây là những gì anh ấy đã nói về nó
Guido thực sự ủng hộ việc loại bỏ cả ba 6, 4 và 5 khỏi Python. Người ta chỉ có thể đoán tại lý do của mình. Khi nó xảy ra, việc hiểu danh sách đã đề cập trước đó bao gồm chức năng được cung cấp bởi tất cả các chức năng này và hơn thế nữa. Bạn có thể tìm hiểu thêm bằng cách đọc Khi nào nên sử dụng khả năng hiểu danh sách trong PythonNhư bạn đã thấy, 4 và 5 vẫn là các hàm tích hợp sẵn trong Python. 6 không còn là chức năng tích hợp sẵn, nhưng nó có sẵn để nhập từ mô-đun thư viện tiêu chuẩn, như bạn sẽ thấy tiếp theoĐể sử dụng 6, bạn cần nhập nó từ một mô-đun có tên là 157. Điều này có thể thực hiện theo nhiều cách, nhưng sau đây là cách đơn giản nhất 78Sau đó, trình thông dịch đặt 6 vào không gian tên chung và cung cấp nó để sử dụng. Các ví dụ bạn sẽ thấy bên dưới giả định rằng đây là trường hợpGọi >>> animals = ["ferret", "vole", "dog", "gecko"] >>> sorted(animals, key=len, reverse=True) ['ferret', 'gecko', 'vole', 'dog'] >>> def reverse_len(s): .. return -len(s) ... >>> sorted(animals, key=reverse_len) ['ferret', 'gecko', 'vole', 'dog'] 6 với hai đối sốCuộc gọi 6 đơn giản nhất có một chức năng và một lần lặp, như được hiển thị bên dưới 79 684 sử dụng 166, phải là một hàm nhận chính xác hai đối số, để kết hợp dần dần các phần tử trong 167. Để bắt đầu, 6 gọi 166 trên hai phần tử đầu tiên của 167. Kết quả đó sau đó được kết hợp với phần tử thứ ba, rồi kết quả đó với phần tử thứ tư, v.v. cho đến khi hết danh sách. Sau đó, 6 trả về kết quả cuối cùngGuido đã đúng khi nói rằng các ứng dụng đơn giản nhất của 6 là những ứng dụng sử dụng toán tử kết hợp. Hãy bắt đầu với toán tử cộng ( 6)>>> 00Cuộc gọi này đến 6 tạo ra kết quả 694 từ danh sách 695 như sauĐây là một cách khá vòng vo để tính tổng các số trong danh sách. Trong khi điều này hoạt động tốt, có một cách trực tiếp hơn. 696 tích hợp sẵn của Python trả về tổng các giá trị số trong một lần lặp>>> 01Hãy nhớ rằng toán tử cộng nhị phân cũng nối các chuỗi. Vì vậy, ví dụ tương tự này cũng sẽ dần dần nối các chuỗi trong một danh sách >>> 02Một lần nữa, có một cách để thực hiện điều này mà hầu hết sẽ xem xét Pythonic điển hình hơn. Đây chính xác là những gì 184 làm>>> 03Bây giờ hãy xem xét một ví dụ sử dụng toán tử nhân nhị phân (______1669). Giai thừa của một số nguyên dương 603 được định nghĩa như sauBạn có thể triển khai hàm giai thừa bằng cách sử dụng 6 và 654 như hình bên dưới>>> 04Một lần nữa, có một cách đơn giản hơn để làm điều này. Bạn có thể sử dụng 702 được cung cấp bởi mô-đun 703 tiêu chuẩn>>> 05Ví dụ cuối cùng, giả sử bạn cần tìm giá trị lớn nhất trong danh sách. Python cung cấp hàm có sẵn 704 để làm điều này, nhưng bạn cũng có thể sử dụng 6>>> 06Lưu ý rằng trong mỗi ví dụ trên, hàm được truyền cho 6 là hàm một dòng. Trong mỗi trường hợp, bạn có thể sử dụng hàm 3 để thay thế>>> 07Đây là một cách thuận tiện để tránh đặt một chức năng không cần thiết vào không gian tên. Mặt khác, người đọc mã có thể khó xác định ý định của bạn hơn một chút khi bạn sử dụng 3 thay vì xác định một chức năng riêng biệt. Như thường lệ, đó là sự cân bằng giữa khả năng đọc và sự tiện lợiLoại bỏ các quảng cáoGọi >>> animals = ["ferret", "vole", "dog", "gecko"] >>> sorted(animals, key=len, reverse=True) ['ferret', 'gecko', 'vole', 'dog'] >>> def reverse_len(s): .. return -len(s) ... >>> sorted(animals, key=reverse_len) ['ferret', 'gecko', 'vole', 'dog'] 6 với giá trị ban đầuCó một cách khác để gọi 6 chỉ định giá trị ban đầu cho chuỗi rút gọn 08Khi có mặt, 711 chỉ định giá trị ban đầu cho tổ hợp. Trong cuộc gọi đầu tiên tới 166, các đối số là 711 và phần tử đầu tiên của 167. Kết quả đó sau đó được kết hợp với phần tử thứ hai của 167, v.v.>>> 09Bây giờ chuỗi các cuộc gọi chức năng trông như thế này Bạn có thể dễ dàng đạt được kết quả tương tự mà không cần 6>>> 0Như bạn đã thấy trong các ví dụ trên, ngay cả trong trường hợp bạn có thể hoàn thành một nhiệm vụ bằng cách sử dụng 6, thì thường có thể tìm thấy một cách đơn giản và Pythonic hơn để hoàn thành cùng một nhiệm vụ mà không cần nó. Có lẽ không quá khó để tưởng tượng tại sao 6 lại bị xóa khỏi ngôn ngữ chínhĐiều đó nói rằng, 6 là một chức năng đáng chú ý. Mô tả ở đầu phần này nói rằng 6 kết hợp các phần tử để tạo ra một kết quả duy nhất. Nhưng kết quả đó có thể là một đối tượng tổng hợp như danh sách hoặc bộ dữ liệu. Vì lý do đó, 6 là một hàm bậc cao rất tổng quát mà từ đó có thể triển khai nhiều hàm khácVí dụ: bạn có thể triển khai 4 theo nghĩa của 6>>> 1Bạn cũng có thể triển khai 5 bằng cách sử dụng 6>>> 2Trong thực tế, bất kỳ thao tác nào trên một chuỗi các đối tượng đều có thể được biểu diễn dưới dạng phép rút gọn Phần kết luậnLập trình hàm là một mô hình lập trình trong đó phương pháp tính toán chính là đánh giá các hàm thuần túy. Mặc dù Python chủ yếu không phải là một ngôn ngữ chức năng, nhưng thật tốt khi làm quen với 3, 4, 5 và 6 vì chúng có thể giúp bạn viết mã ngắn gọn, cấp cao, có thể song song hóa. Bạn cũng sẽ thấy chúng trong mã mà những người khác đã viếtTrong hướng dẫn này, bạn đã học
Cùng với đó, bạn đã đi đến phần cuối của loạt bài giới thiệu này về các nguyên tắc cơ bản khi làm việc với Python. Xin chúc mừng. Bây giờ bạn đã có một nền tảng vững chắc để tạo các chương trình hữu ích theo phong cách Pythonic hiệu quả Nếu bạn quan tâm đến việc nâng cao kỹ năng Python của mình, thì bạn có thể xem một số hướng dẫn trung cấp và nâng cao hơn. Bạn cũng có thể xem một số ý tưởng dự án Python để bắt đầu thể hiện sức mạnh siêu nhiên của Python. Mã hóa vui vẻ « Không gian tên và Phạm vi trong Python Lập trình hàm trong Python Đánh dấu là đã hoàn thành 🐍 Thủ thuật Python 💌 Nhận một Thủ thuật Python ngắn và hấp dẫn được gửi đến hộp thư đến của bạn vài ngày một lần. Không có thư rác bao giờ. Hủy đăng ký bất cứ lúc nào. Được quản lý bởi nhóm Real Python Gửi cho tôi thủ thuật Python » Giới thiệu về John Sturtz John là một Pythonista cuồng nhiệt và là thành viên của nhóm hướng dẫn Real Python » Thông tin thêm về JohnMỗi hướng dẫn tại Real Python được tạo bởi một nhóm các nhà phát triển để nó đáp ứng các tiêu chuẩn chất lượng cao của chúng tôi. Các thành viên trong nhóm đã làm việc trong hướng dẫn này là Aldren Bartosz Geir Arne Joanna Gia-cốp Bậc thầy Kỹ năng Python trong thế giới thực Với quyền truy cập không giới hạn vào Python thực Tham gia với chúng tôi và có quyền truy cập vào hàng nghìn hướng dẫn, khóa học video thực hành và cộng đồng các Pythonistas chuyên gia Nâng cao kỹ năng Python của bạn » Bậc thầy Kỹ năng Python trong thế giới thực Tham gia với chúng tôi và có quyền truy cập vào hàng ngàn hướng dẫn, khóa học video thực hành và cộng đồng Pythonistas chuyên gia Nâng cao kỹ năng Python của bạn » Bạn nghĩ sao? Đánh giá bài viết này Tweet Chia sẻ Chia sẻ EmailBài học số 1 hoặc điều yêu thích mà bạn đã học được là gì? Mẹo bình luận. Những nhận xét hữu ích nhất là những nhận xét được viết với mục đích học hỏi hoặc giúp đỡ các sinh viên khác. Nhận các mẹo để đặt câu hỏi hay và nhận câu trả lời cho các câu hỏi phổ biến trong cổng thông tin hỗ trợ của chúng tôi Python có phải là một chức năng không?Mặc dù Python chủ yếu không phải là một ngôn ngữ chức năng , nhưng bạn nên làm quen với lambda , map() , filter() và reduce . Bạn cũng sẽ thấy chúng trong mã mà những người khác đã viết.
Python có định hướng chức năng không?Python không phải là ngôn ngữ lập trình chức năng nghiêm ngặt . Nhưng thật tầm thường khi viết Python theo phong cách chức năng. Có ba chức năng cơ bản trên iterables cho phép chúng ta viết một chương trình mạnh mẽ theo cách rất tầm thường. lọc, lập bản đồ và thu nhỏ.
Là đối tượng PythonVâng, Python có phải là ngôn ngữ lập trình hướng đối tượng không? .
Python có phải là một đối tượng không?Python là ngôn ngữ lập trình hướng đối tượng. Hầu hết mọi thứ trong Python đều là đối tượng , với các thuộc tính và phương thức của nó. Lớp giống như một hàm tạo đối tượng hoặc "bản thiết kế" để tạo đối tượng. |