Đối số của hàm trong Python

<p style="text-align: justify;">Với c&aacute;c h&agrave;m th&ocirc;ng thường v&iacute; dụ $f(x)=5x^2+2$...ch&uacute;ng ta c&oacute; thể thay đổi gi&aacute; trị của h&agrave;m th&ocirc;ng qua c&aacute;c đối số. Trong c&aacute;c ng&ocirc;n ngữ lập tr&igrave;nh n&oacute;i chung v&agrave; Python cũng vậy, ngo&agrave;i việc l&agrave;m việc với c&aacute;c biến cục bộ, biến to&agrave;n cục để thay đổi gi&aacute; trị của h&agrave;m th&igrave; ch&uacute;ng ta cũng c&oacute; thể cung cấp c&aacute;c đối số cho h&agrave;m để việc gọi h&agrave;m trở l&ecirc;n mềm dẻo v&agrave; hữu &iacute;ch hơn. Trong b&agrave;i trước ch&uacute;ng ta cũng đ&atilde; thấy được c&aacute;ch thức sử dụng v&agrave; định nghĩa n&oacute;. Trong b&agrave;i n&agrave;y, ch&uacute;ng ta sẽ c&ugrave;ng t&igrave;m hiểu s&acirc;u hơn về một số c&aacute;ch sử dụng đối số của h&agrave;m trong Python.</p> <p style="text-align: justify;">Trong b&agrave;i n&agrave;y ch&uacute;ng ta sẽ t&igrave;m hiểu một số c&aacute;ch sử dụng c&aacute;c đối số n&agrave;y, bao gồm:</p> <ol style="text-align: justify;"> <li style="text-align: justify;">G&aacute;n c&aacute;c gi&aacute; trị mặc định cho c&aacute;c đối số của h&agrave;m trong Python.</li> <li style="text-align: justify;">Cung cấp số lượng đối số t&ugrave;y &yacute; cho một h&agrave;m.</li> <li style="text-align: justify;">Sử dụng c&aacute;c t&ecirc;n của c&aacute;c đối số để truyền gi&aacute; trị.</li> </ol> <h2 style="text-align: justify;">Gi&aacute; gi&aacute; trị mặc định cho c&aacute;c đối số của h&agrave;m trong Python</h2> <p style="text-align: justify;">Trong c&aacute;c b&agrave;i ở ngay Chủ đề đầu ti&ecirc;n của kh&oacute;a học, ch&uacute;ng ta đ&atilde; thấy rằng, ta sử dụng h&agrave;m print v&agrave; input một c&aacute;ch kh&aacute; dễ d&agrave;ng v&agrave; theo nhiều c&aacute;ch kh&aacute;c nhau. Ch&uacute;ng ta c&oacute; thể d&ugrave;ng c&aacute;c tham số sep hoặc end trong print hoặc kh&ocirc;ng m&agrave; kh&ocirc;ng l&agrave;m chương tr&igrave;nh b&aacute;o lỗi.</p> <p>Nhưng, quay lại v&iacute; dụ với h&agrave;m người d&ugrave;ng tự định nghĩa, ch&uacute;ng ta sẽ thấy một vấn đề</p> <p style="text-align: justify;">V&iacute; dụ 1:</p> <pre class="language-python"><code>def vi_du(a, b): print(a, b) vi_du("Lập tr&igrave;nh", "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> <p style="text-align: justify;">Ở đ&acirc;y, h&agrave;m vi_du() c&oacute; hai tham số. V&igrave; ch&uacute;ng ta đ&atilde; gọi h&agrave;m n&agrave;y v&agrave; truyền hai đối số n&ecirc;n n&oacute; sẽ hoạt động b&igrave;nh thường v&agrave; ch&uacute;ng ta sẽ kh&ocirc;ng gặp bất kỳ lỗi n&agrave;o. Nhưng, nếu ch&uacute;ng ta gọi n&oacute; với một số lượng c&aacute;c đối số kh&aacute;c, tr&igrave;nh th&ocirc;ng dịch sẽ hiển thị th&ocirc;ng b&aacute;o lỗi.</p> <pre class="language-python"><code>def vi_du(a, b): print(a, b) vi_du("Lập tr&igrave;nh")</code></pre> <p style="text-align: justify;">Kết quả nhận được l&agrave; một th&ocirc;ng b&aacute;o lỗi được đưa ra. Bởi đoạn m&atilde; tr&ecirc;n, ta chỉ truyền c&oacute; 1 đối số, trong khi h&agrave;m ta định nghĩa chứa 2 đối số.</p> <pre class="language-markup"><code>Traceback (most recent call last): File "C:/Users/tek4.vn/Documents/ex3.py", line 4, in &lt;module&gt; vi_du("Lập tr&igrave;nh") TypeError: vi_du() missing 1 required positional argument: 'b'</code></pre> <p style="text-align: justify;">Vậy, phải chăng c&aacute;c h&agrave;m tự định nghĩa lại kh&ocirc;ng l&agrave;m được như c&aacute;c h&agrave;m được cung cấp sẵn??</p> <p style="text-align: justify;">Kh&ocirc;ng, kh&ocirc;ng c&oacute; chuyện như vậy, ch&uacute;ng ta c&oacute; thể thực hiện được bỏ qua c&aacute;c tham số trong h&agrave;m khi gọi bằng c&aacute;ch sử dụng c&aacute;c tham số được g&aacute;n gi&aacute; trị mặc định ngay khi định nghĩa h&agrave;m.</p> <p style="text-align: justify;">V&iacute; dụ 2:</p> <pre class="language-python"><code>def vi_du(a, b = "Python"): print(a, b) vi_du("Lập tr&igrave;nh") vi_du("Lập tr&igrave;nh", "Java")</code></pre> <p style="text-align: justify;">Kết quả:</p> <pre class="language-markup"><code>Lập tr&igrave;nh Python Lập tr&igrave;nh Java</code></pre> <p style="text-align: justify;">Trong h&agrave;m b&ecirc;n tr&ecirc;n, tham số đầu ti&ecirc;n kh&ocirc;ng c&oacute; gi&aacute; trị mặc định v&agrave; do đ&oacute;, ta sẽ phải bắt buộc truyền gi&aacute; trị cho tham số n&agrave;y trong khi gọi h&agrave;m.</p> <p style="text-align: justify;">Mặt kh&aacute;c, tham số thứ hai c&oacute; gi&aacute; trị mặc định l&agrave; "Python". V&igrave; vậy, ta c&oacute; thể truyền hoặc kh&ocirc;ng truyền gi&aacute; trị cho tham số n&agrave;y. Nếu một gi&aacute; trị kh&aacute;c được truyền, gi&aacute; trị n&agrave;y sẽ ghi đ&egrave; l&ecirc;n gi&aacute; trị mặc định.</p> <p style="text-align: justify;">Bất kỳ số lượng đối số n&agrave;o trong một h&agrave;m đều c&oacute; thể c&oacute; gi&aacute; trị mặc định. Nhưng một khi ch&uacute;ng ta c&oacute; một đối số được g&aacute;n gi&aacute; trị mặc định, th&igrave; tất cả c&aacute;c đối số b&ecirc;n phải c&ograve;n lại của n&oacute; cũng phải c&oacute; gi&aacute; trị mặc định.</p> <p style="text-align: justify;">V&iacute; dụ 3:</p> <pre class="language-python"><code>def vi_du(b = "Python", a): print(a, b)</code></pre> <p style="text-align: justify;">Kết quả sẽ l&agrave; th&ocirc;ng b&aacute;o lỗi. Bởi trong đoạn m&atilde; tr&ecirc;n, ta đ&atilde; g&aacute;n gi&aacute; trị mặc định cho tham số đầu ti&ecirc;n, do đ&oacute;, ta sẽ phải bắt buộc truyền gi&aacute; trị mặc định cho c&aacute;c tham số đằng sau tham số đầu ti&ecirc;n n&agrave;y (Ở đ&acirc;y l&agrave; tham số thứ 2 bắt buộc phải được g&aacute;n gi&aacute; trị mặc định)</p> <pre class="language-markup"><code> File "e:/Learning/IT/Python/Bai2.py", line 1 def vi_du(b = "Python", a): ^ SyntaxError: non-default argument follows default argument</code></pre> <p style="text-align: justify;">Tức l&agrave;, c&aacute;c đối số được g&aacute;n gi&aacute; trị mặc định th&igrave; phải nằm ở b&ecirc;n ph&iacute;a phải ngo&agrave;i c&ugrave;ng. Điều n&agrave;y sẽ gi&uacute;p chương tr&igrave;nh dịch hiểu được cần bỏ qua đối số n&agrave;o nếu lời gọm h&agrave;m cung cấp thiếu đối số so với khai b&aacute;o.</p> <h2 style="text-align: justify;">Sử dụng số lượng đối số t&ugrave;y &yacute; trong Python</h2> <p style="text-align: justify;">Đ&ocirc;i khi, ch&uacute;ng ta kh&ocirc;ng biết trước số lượng đối số sẽ được truyền v&agrave;o một h&agrave;m. Python cho ph&eacute;p ch&uacute;ng ta xử l&yacute; kiểu t&igrave;nh huống n&agrave;y th&ocirc;ng qua c&aacute;c lệnh gọi h&agrave;m với số lượng đối số t&ugrave;y &yacute;. Trong định nghĩa h&agrave;m, ch&uacute;ng ta sử dụng dấu hoa thị (*) trước t&ecirc;n tham số để biểu thị loại đối số n&agrave;y.</p> <p style="text-align: justify;">V&iacute; dụ 4:</p> <pre class="language-python"><code>def vi_du(*a): for i in a: print(i) vi_du("Python", "Java", "C++", "Javascript") vi_du("C#", "PHP")</code></pre> <p style="text-align: justify;">Kết quả:</p> <pre class="language-markup"><code>Python Java C++ Javascript C# PHP</code></pre> <p style="text-align: justify;">Ở đ&acirc;y, ch&uacute;ng ta đ&atilde; gọi h&agrave;m với nhiều đối số kh&aacute;c nhau. C&aacute;c đối số n&agrave;y được g&oacute;i lại th&agrave;nh một bộ gi&aacute; trị trước khi được truyền v&agrave;o h&agrave;m. B&ecirc;n trong h&agrave;m, ch&uacute;ng ta sử dụng v&ograve;ng lặp <span class="lang:default decode:true crayon-inline ">for</span>&nbsp;để lấy ra tất cả c&aacute;c đối số đ&atilde; được truyền.</p> <h2 style="text-align: justify;">C&aacute;c tham số được sử dụng với từ kh&oacute;a</h2> <p style="text-align: justify;">Khi ch&uacute;ng ta gọi một h&agrave;m với một số gi&aacute; trị, c&aacute;c gi&aacute; trị n&agrave;y sẽ được g&aacute;n cho c&aacute;c đối số theo đ&uacute;ng thứ tự vị tr&iacute; của ch&uacute;ng trong khai b&aacute;o h&agrave;m.</p> <p style="text-align: justify;">V&iacute; dụ 5:</p> <pre class="language-python"><code>def vi_du(a, b): print(a, b) vi_du("Lập tr&igrave;nh", "Python")</code></pre> <p style="text-align: justify;">V&iacute; dụ, trong h&agrave;m vi_du() ở tr&ecirc;n, khi ch&uacute;ng ta thực hiện lời gọi h&agrave;m l&agrave; vi_du("Lập tr&igrave;nh", "Python"), gi&aacute; trị "Lập tr&igrave;nh" được g&aacute;n cho đối số đầu ti&ecirc;n l&agrave; a v&agrave; tương tự l&agrave; "Python" được g&aacute;n cho biến b.</p> <p style="text-align: justify;">Tuy nhi&ecirc;n, Python cũng cho ph&eacute;p c&aacute;c h&agrave;m được gọi bằng c&aacute;ch sử dụng c&aacute;c đối số với t&ecirc;n của ch&uacute;ng. Khi ch&uacute;ng ta gọi c&aacute;c h&agrave;m theo c&aacute;ch n&agrave;y, thứ tự (vị tr&iacute;) của c&aacute;c đối số c&oacute; thể bị thay đổi.</p> <p style="text-align: justify;">V&iacute; dụ 6:</p> <pre class="language-python"><code>def vi_du(a, b): print(a, b) vi_du(a = "Lập tr&igrave;nh",b = "Python") vi_du(b = "Lập tr&igrave;nh",a = "Python") vi_du("Lập tr&igrave;nh", b = "Python")</code></pre> <p style="text-align: justify;">Kết quả:</p> <pre class="language-markup"><code>Lập tr&igrave;nh Python Python Lập tr&igrave;nh Lập tr&igrave;nh Python</code></pre> <p style="text-align: justify;">Như c&oacute; thể thấy, ch&uacute;ng ta c&oacute; thể trộn c&aacute;c vị tr&iacute; của c&aacute;c đối số với t&ecirc;n của c&aacute;c đối số trong khi gọi h&agrave;m. Tuy nhi&ecirc;n, ch&uacute;ng ta kh&ocirc;ng n&ecirc;n thay đổi thứ tự l&agrave;m g&igrave; cả!!!!</p>