Khái niệm về hàm trong Python

<p style="text-align: justify;">Ch&uacute;c mừng bạn!!! Nếu bạn đ&atilde; đi đến đ&acirc;y tức l&agrave; bạn đ&atilde; nắm được những kh&aacute;i niệm cơ bản nhất trong Python rồi đấy! Bắt đầu từ b&agrave;i n&agrave;y, ch&uacute;ng ta sẽ đi v&agrave;o những kiến thức chuy&ecirc;n s&acirc;u v&agrave; c&oacute; thể l&agrave; kh&oacute; nhằn hơn đ&ocirc;i ch&uacute;t. Tuy nhi&ecirc;n, đừng lo, n&oacute; cũng sẽ kh&ocirc;ng qu&aacute; kh&oacute; đ&acirc;u. Trong b&agrave;i viết n&agrave;y, ch&uacute;ng ta sẽ bắt đầu với kh&aacute;i niệm h&agrave;m trong Python. Thực chất, ch&uacute;ng ta đ&atilde; sử dụng rất nhiều h&agrave;m trong c&aacute;c b&agrave;i trước rồi v&iacute; dụ như h&agrave;m print, h&agrave;m input, h&agrave;m ord (),..., nhưng đến đ&acirc;y ch&uacute;ng ta mới thực sự quay lại kh&aacute;i niệm chi tiết về h&agrave;m.&nbsp;</p> <h2 style="text-align: justify;">Tại sao lại cần h&agrave;m?</h2> <p style="text-align: justify;">Nếu ch&uacute;ng ta quay lại c&aacute;c b&agrave;i trước, ch&uacute;ng ta sẽ thấy ngay gi&aacute; trị của việc d&ugrave;ng h&agrave;m trong lập tr&igrave;nh. Chẳng hạn ch&uacute;ng ta c&oacute; thể dễ d&agrave;ng gọi một h&agrave;m thực hiện việc in ra m&agrave;n h&igrave;nh, t&iacute;nh độ d&agrave;i của k&yacute; tự một c&aacute;ch rất đơn giản m&agrave; kh&ocirc;ng cần phải viết lại to&agrave;n bộ c&aacute;c đoạn m&atilde; cho c&aacute;c chức năng n&agrave;y. R&otilde; r&agrave;ng, n&oacute; tiết kiệm cho ch&uacute;ng ta kh&aacute; nhiều c&ocirc;ng sức.</p> <p style="text-align: justify;">Về cơ bản, kh&ocirc;ng c&oacute; chương tr&igrave;nh n&agrave;o l&agrave; bắt buộc phải d&ugrave;ng h&agrave;m mới giải quyết được, nhưng việc kh&ocirc;ng d&ugrave;ng h&agrave;m sẽ l&agrave;m cho chương tr&igrave;nh tương đối lộn xộn v&agrave; kh&oacute; bảo tr&igrave;, kh&oacute; đọc, cũng như kh&oacute; hiểu. Điều n&agrave;y cũng giống như, thay v&igrave; t&aacute;ch một vấn đề ra th&agrave;nh nhiều b&agrave;i to&aacute;n nhỏ hơn để giải th&igrave; ta phải giải gộp to&agrave;n bộ b&agrave;i to&aacute;n phức tạp v&agrave; do đ&oacute; sinh ra rất nhiều trường hợp kh&ocirc;ng thể kiểm so&aacute;t được, v&agrave; cũng rất kh&oacute; để người kh&aacute;c cũng c&oacute; thể l&agrave;m việc c&ugrave;ng ch&uacute;ng ta. R&otilde; r&agrave;ng ch&uacute;ng ta kh&ocirc;ng thể n&agrave;o tự lập trinh một hệ điều h&agrave;nh, một website phức tạp như Facebook,....Ch&uacute;ng ta cần li&ecirc;n kết với những lập tr&igrave;nh vi&ecirc;n kh&aacute;c. V&agrave; do đ&oacute;, ch&uacute;ng ta cần t&aacute;ch nhỏ v&agrave; ph&acirc;n chia được vấn đề!!!</p> <p style="text-align: justify;">Trong Python, một h&agrave;m l&agrave; một nh&oacute;m c&aacute;c c&acirc;u lệnh li&ecirc;n quan thực hiện một t&aacute;c vụ cụ thể. C&aacute;c h&agrave;m gi&uacute;p chia nhỏ chương tr&igrave;nh của ch&uacute;ng ta th&agrave;nh c&aacute;c phần nhỏ hơn v&agrave; c&oacute; dạng theo m&ocirc;-đun. Khi chương tr&igrave;nh ph&aacute;t triển ng&agrave;y c&agrave;ng lớn, c&aacute;c h&agrave;m sẽ gi&uacute;p cho chương tr&igrave;nh được sắp xếp theo một thứ tự r&otilde; r&agrave;ng v&agrave; dễ quản l&yacute; hơn. Hơn nữa, n&oacute; tr&aacute;nh việc lặp lại c&aacute;c đoạn m&atilde; c&oacute; nhiệm vụ thực thi l&agrave; giống nhau bị lặp đi lặp lại trong chương tr&igrave;nh v&agrave; l&agrave;m cho c&aacute;c đoạn m&atilde; c&oacute; thể được sử dụng lại.</p> <h2 style="text-align: justify;">C&aacute;c loại h&agrave;m trong Python</h2> <p style="text-align: justify;">Về cơ bản, ch&uacute;ng ta c&oacute; thể chia c&aacute;c h&agrave;m trong Python (cũng như hầu hết c&aacute;c ng&ocirc;n ngữ lập tr&igrave;nh kh&aacute;c) th&agrave;nh hai loại sau:</p> <ul style="text-align: justify;"> <li style="text-align: justify;">C&aacute;c h&agrave;m được t&iacute;ch hợp sẵn: L&agrave; c&aacute;c h&agrave;m được t&iacute;ch hợp c&oacute; sẵn trong Python. Tức l&agrave; ch&uacute;ng ta c&oacute; thể gọi v&agrave; d&ugrave;ng ngay m&agrave; chẳng cần phải viết th&ecirc;m g&igrave; cả. Chẳng hạn c&aacute;c h&agrave;m print, input, ord, chr, len...đ&atilde; học ở c&aacute;c b&agrave;i trước.</li> <li style="text-align: justify;">C&aacute;c h&agrave;m do người d&ugrave;ng từ định nghĩa. Đ&acirc;y l&agrave; c&aacute;c h&agrave;m m&agrave; người d&ugrave;ng tự viết v&agrave; tự định nghĩa, tự x&acirc;y dựng l&ecirc;n theo đ&uacute;ng logic v&agrave; thiết kế của người lập tr&igrave;nh.</li> </ul> <p style="text-align: justify;">Ngo&agrave;i ra, c&oacute; nhiều h&agrave;m m&agrave; ch&uacute;ng ta sử dụng do người kh&aacute;c viết dưới dạng thư viện, n&oacute; được gọi l&agrave; c&aacute;c h&agrave;m thư viện. Để sử dụng c&aacute;c h&agrave;m thư viện, ch&uacute;ng ta cần phải gọi thư viện tương ứng để sử dụng th&ocirc;ng qua c&acirc;u lệnh import (sẽ được học trong c&aacute;c b&agrave;i tiếp theo).</p> <p style="text-align: justify;">Trong b&agrave;i viết n&agrave;y, ta sẽ tập trung v&agrave;o c&aacute;c h&agrave;m do người d&ugrave;ng tự định nghĩa.</p> <p style="text-align: justify;"><strong><em>C&uacute; ph&aacute;p định nghĩa h&agrave;m trong Python:</em></strong></p> <pre class="language-python"><code>def name_func(danh s&aacute;ch tham số của h&agrave;m): &lt;Nội dung của h&agrave;m&gt;</code></pre> <p style="text-align: justify;">C&uacute; ph&aacute;p b&ecirc;n tr&ecirc;n l&agrave; định nghĩa h&agrave;m bao gồm c&aacute;c th&agrave;nh phần sau.</p> <ul style="text-align: justify;"> <li style="text-align: justify;">Từ kh&oacute;a <span class="lang:default decode:true crayon-inline ">def</span>&nbsp;sẽ đ&aacute;nh dấu phần bắt đầu của h&agrave;m.</li> <li style="text-align: justify;">T&ecirc;n h&agrave;m được sử dụng để x&aacute;c định duy nhất một h&agrave;m. Việc đặt t&ecirc;n h&agrave;m tu&acirc;n theo c&aacute;c quy tắc đặt t&ecirc;n trong Python chẳng hạn như t&ecirc;n chỉ được chứa c&aacute;c k&yacute; tự hoa thường v&agrave; số, số kh&ocirc;ng đứng đầu v&agrave; t&ecirc;n kh&ocirc;ng được tr&ugrave;ng với từ kh&oacute;a.</li> <li style="text-align: justify;">C&aacute;c tham số của h&agrave;m l&agrave; c&aacute;c gi&aacute; trị m&agrave; ch&uacute;ng ta muốn truyền h&agrave;m để n&oacute; c&oacute; thể lấy dữ liệu v&agrave; thực thi dựa tr&ecirc;n c&aacute;c gi&aacute; trị của c&aacute;c tham số n&agrave;y. C&aacute;c tham số n&agrave;y l&agrave; t&ugrave;y chọn, c&oacute; thể c&oacute; hoặc kh&ocirc;ng, nhiều hoặc &iacute;t. tuy nhi&ecirc;n cặp dấu (ngoặc tr&ograve;n) l&agrave; bắt buộc, d&ugrave; h&agrave;m c&oacute; tham số n&agrave;o hay kh&ocirc;ng !!!</li> <li style="text-align: justify;">Dấu hai chấm (:) để đ&aacute;nh dấu kết th&uacute;c ti&ecirc;u đề h&agrave;m.</li> <li style="text-align: justify;">Một hoặc nhiều c&acirc;u lệnh trong python hợp lệ tạo n&ecirc;n th&acirc;n h&agrave;m. C&aacute;c c&acirc;u lệnh phải c&oacute; c&ugrave;ng khoảng trắng l&ugrave;i v&agrave;o đầu d&ograve;ng. H&agrave;m cũng được coi l&agrave; một khối lệnh do đ&oacute; ch&uacute;ng ta cũng cần tu&acirc;n thủ nguy&ecirc;n tắc khoảng trắng trong khối lệnh như c&aacute;c cấu tr&uacute;c điều khiển đ&atilde; học trong c&aacute;c b&agrave;i trước.</li> <li style="text-align: justify;">Một c&acirc;u lệnh <span class="lang:default decode:true crayon-inline ">return</span> l&agrave; t&ugrave;y chọn (tức l&agrave; c&oacute; thể th&ecirc;m hoặc kh&ocirc;ng), được sử dụng để trả về một gi&aacute; trị cho h&agrave;m.</li> </ul> <p style="text-align: justify;">V&iacute; dụ 1:</p> <pre class="language-python"><code>def vi_du(a): print("Lập tr&igrave;nh",a)</code></pre> <p style="text-align: justify;">Ở đ&acirc;y, ch&uacute;ng ta đang định nghĩa một h&agrave;m c&oacute; t&ecirc;n l&agrave; vi_du, với tham số của h&agrave;m l&agrave; một đối tượng a n&agrave;o đ&oacute; trong dấu ngoặc (a). Nội dung của h&agrave;m l&agrave; in ra chuỗi "Lập tr&igrave;nh" + một chuỗi a n&agrave;o đ&oacute;, với a nhận từ đầu v&agrave;o tham số của h&agrave;m. Chẳng hạn nếu ta gọi h&agrave;m vi_du("Python") th&igrave; chuỗi in ra l&agrave; "Lập tr&igrave;nh Python", nếu gọi vi_du("Java") th&igrave; chuỗi in ra sẽ l&agrave;: "Lập&nbsp; tr&igrave;nh Java",... Tức l&agrave; kết quả thực hiện của h&agrave;m sẽ phụ thuộc v&agrave; tham số được truyền v&agrave;o cho h&agrave;m.</p> <p style="text-align: justify;">V&iacute; dụ 2:</p> <pre class="language-python"><code>def phep_chia(a, b): return a / b c = 300 d = 100 print("Kết quả của ph&eacute;p chia l&agrave;:",phep_chia(c, d))</code></pre> <p style="text-align: justify;">Kết quả:</p> <pre class="language-markup"><code>Kết quả của ph&eacute;p chia l&agrave;: 3.0</code></pre> <p style="text-align: justify;">Ở đ&acirc;y, ch&uacute;ng ta đ&atilde; định nghĩa h&agrave;m phep_chia() để thực hiện chia hai số v&agrave; trả về kết quả. Đ&acirc;y l&agrave; h&agrave;m do người d&ugrave;ng định nghĩa.</p> <p style="text-align: justify;"><strong>Ch&uacute; &yacute;: Ta n&ecirc;n đặt t&ecirc;n c&aacute;c h&agrave;m đ&uacute;ng theo nhiệm vụ m&agrave; ch&uacute;ng thực hiện. V&iacute; dụ như h&agrave;m phep_chia() để thực hiện ph&eacute;p to&aacute;n chia cho hai số. Điều n&agrave;y sẽ gi&uacute;p dễ đọc lại để hiểu chương tr&igrave;nh hơn sau n&agrave;y!<br /></strong></p> <h2 style="text-align: justify;">Gọi h&agrave;m trong Python</h2> <p style="text-align: justify;">Khi ch&uacute;ng ta đ&atilde; định nghĩa một h&agrave;m, ch&uacute;ng ta c&oacute; thể gọi n&oacute; từ chương tr&igrave;nh kh&aacute;c hoặc ngay b&ecirc;n trong chương tr&igrave;nh của m&igrave;nh. Để gọi một h&agrave;m, ch&uacute;ng ta chỉ cần nhập t&ecirc;n h&agrave;m với c&aacute;c tham số th&iacute;ch hợp.</p> <p style="text-align: justify;">V&iacute; dụ 3:</p> <pre class="language-python"><code>def vi_du(a): """ V&iacute; dụ về h&agrave;m """ print("Lập tr&igrave;nh",a) vi_du("Python")</code></pre> <p style="text-align: justify;">Kết quả:</p> <pre class="language-markup"><code>Lập tr&igrave;nh Python</code></pre> <h2 style="text-align: justify;">C&acirc;u lệnh return trong h&agrave;m</h2> <p style="text-align: justify;">C&acirc;u lệnh <span class="lang:default decode:true crayon-inline ">return</span> được sử dụng để tho&aacute;t một h&agrave;m v&agrave; trả về gi&aacute; trị cho h&agrave;m.</p> <p style="text-align: justify;"><strong><em>C&uacute; ph&aacute;p:</em></strong></p> <pre class="language-python"><code>return [exp]</code></pre> <p style="text-align: justify;">C&acirc;u lệnh n&agrave;y c&oacute; thể chứa một biểu thức (exp) được đ&aacute;nh gi&aacute; v&agrave; gi&aacute; trị được trả về. Nếu kh&ocirc;ng c&oacute; biểu thức n&agrave;o trong c&acirc;u lệnh hoặc bản th&acirc;n c&acirc;u lệnh return kh&ocirc;ng c&oacute; b&ecirc;n trong một h&agrave;m, th&igrave; h&agrave;m sẽ trả về đối tượng <span class="lang:default decode:true crayon-inline">None</span>.</p> <p style="text-align: justify;">V&iacute; dụ 4:</p> <pre class="language-python"><code>def vi_du(a): return a print(vi_du(100)) print(vi_du(-230))</code></pre> <p style="text-align: justify;">Kết quả:</p> <pre class="language-markup"><code>100 -230</code></pre> <h2 style="text-align: justify;">Docstrings trong h&agrave;m</h2> <p style="text-align: justify;">Chuỗi k&yacute; tự đầu ti&ecirc;n sau ti&ecirc;u đề kh&ocirc;ng được g&aacute;n cho bất cứ biến n&agrave;o trong h&agrave;m được gọi l&agrave; docstring, viết tắt của documentation string. N&oacute; được sử dụng để giải th&iacute;ch về chức năng của h&agrave;m. Mặc d&ugrave; kh&ocirc;ng bắt buộc, nhưng đ&acirc;y l&agrave; một c&aacute;ch n&ecirc;n l&agrave;m trong qu&aacute; tr&igrave;nh lập tr&igrave;nh. Trong v&iacute; dụ tr&ecirc;n, ch&uacute;ng ta c&oacute; một chuỗi docstring ở ngay b&ecirc;n dưới ti&ecirc;u đề h&agrave;m. Ch&uacute;ng ta thường sử dụng dấu nh&aacute;y k&eacute;p ba để docstring c&oacute; thể mở rộng đến nhiều d&ograve;ng. Docstrings n&agrave;y c&oacute; thể được sử dụng bởi người lập tr&igrave;nh nhờ thuộc t&iacute;nh <span class="lang:default decode:true crayon-inline ">__doc__</span>&nbsp;của h&agrave;m.</p> <p style="text-align: justify;">V&iacute; dụ:</p> <pre class="language-python"><code>def vi_du(a): """v&iacute; dụ về định nghĩa h&agrave;m""" print("Lập tr&igrave;nh",a) vi_du("Python") print(vi_du.__doc__)</code></pre> <p style="text-align: justify;">Kết quả:</p> <pre class="language-markup"><code>Lập tr&igrave;nh Python v&iacute; dụ về định nghĩa h&agrave;m</code></pre> <p style="text-align: justify;">C&aacute;ch viết docstring n&agrave;y giống hệt với kiểu ch&uacute; th&iacute;ch trong nhiều d&ograve;ng m&agrave; ch&uacute;ng ta đ&atilde; học trước đ&acirc;y. Ch&uacute;ng ta sử dụng c&aacute;c chuỗi k&yacute; tự kh&ocirc;ng được g&aacute;n cho biến n&agrave;o để l&agrave;m c&aacute;c ch&uacute; th&iacute;ch. Tuy nhi&ecirc;n, điều kh&aacute;c biệt duy nhất của docstring đ&oacute; l&agrave; n&oacute; vẫn được dịch thay v&igrave; bị bỏ qua như c&aacute;c ch&uacute; th&iacute;ch, v&agrave; ta c&oacute; thể truy cập v&agrave; đọc n&oacute; th&ocirc;ng qua phương thức __doc__ như v&iacute; dụ tr&ecirc;n. Đối với c&aacute;c ch&uacute; th&iacute;ch th&ocirc;ng thường th&igrave; ra kh&ocirc;ng c&oacute; điều n&agrave;y.</p> <p style="text-align: justify;"><em><strong>Lưu &yacute;: Chuỗi docstring phải được đặt ngay sau khai b&aacute;o h&agrave;m.</strong></em></p> <h2 style="text-align: justify;">Ưu điểm của c&aacute;c h&agrave;m do người d&ugrave;ng tự định nghĩa</h2> <ul style="text-align: justify;"> <li style="text-align: justify;">C&aacute;c h&agrave;m do người d&ugrave;ng tự định nghĩa gi&uacute;p ph&acirc;n t&aacute;ch một chương tr&igrave;nh lớn th&agrave;nh c&aacute;c ph&acirc;n đoạn nhỏ gi&uacute;p chương tr&igrave;nh dễ hiểu, dễ quản l&yacute; v&agrave; gỡ lỗi.</li> <li style="text-align: justify;">Nếu đoạn m&atilde; lặp lại xảy ra trong một chương tr&igrave;nh. H&agrave;m c&oacute; thể được sử dụng để bao gồm c&aacute;c đoạn m&atilde; đ&oacute; v&agrave; thực thi khi cần bằng c&aacute;ch gọi h&agrave;m đ&oacute;.</li> <li style="text-align: justify;">C&aacute;c lập tr&igrave;nh vi&ecirc;n l&agrave;m việc trong dự &aacute;n lớn c&oacute; thể ph&acirc;n chia khối lượng c&ocirc;ng việc bằng c&aacute;ch thực hiện c&aacute;c h&agrave;m kh&aacute;c nhau.</li> </ul> <p style="text-align: justify;">Về cơ bản, trong b&agrave;i n&agrave;y, ch&uacute;ng ta đ&atilde; t&igrave;m hiểu sơ bộ những kh&aacute;i niệm về h&agrave;m trong Python, &yacute; nghĩa của h&agrave;m, c&aacute;ch định nghĩa h&agrave;m trong Python, sử dụng h&agrave;m v&agrave; c&acirc;u lệnh return. Để nắm vững hơn c&aacute;c kiến thức n&agrave;y. Ch&uacute;ng ta h&atilde;y c&ugrave;ng xem x&eacute;t một v&iacute; dụ đơn giản trong b&agrave;i tiếp theo.</p>