Danh sách gợi ý kiểu python

Một trong những vấn đề quan trọng hàng đầu khi xây dựng và sử dụng hàm là tham số. Tham số cho hàm trong Python bao gồm tham số bắt buộc, tham số mặc định và tham số biến động

NỘI DUNG CỦA BẢNG

Tham số cho hàm

Tham số bắt buộc là loại tham số mặc định của hàm trong Python. Please view ví dụ sau

def equation(a, b, c): '''solving quadratic equation parameters: a, b, c are float return: a tuple (float, float) ''' from math import sqrt d = b * b - 4 * a * c if d >= 0: x1 = (- b + sqrt(d)) / (2 * a) x2 = (- b - sqrt(d)) / (2 * a) return (x1, x2)

Đây là ví dụ về giải phương trình viết ở dạng hàm với 3 tham số kiểu (int hoặc float) a, b, c. Kết quả trả về là một tuple chứa hai kiểu float

Trong phương trình hàm, a, b, c là 3 tham số bắt buộc. Tham số sử dụng trong quá trình khai báo hàm được gọi là tham số hình thức (tham số hình thức). Sở dĩ gọi là tham số hình thức là vì chúng chỉ có tên, không có giá trị. Giá trị của các tham số này chỉ xuất hiện trong lời gọi hàm

Khi gọi (sử dụng) phương trình hàm, bạn bắt buộc phải truyền đủ 3 giá trị tương ứng với 3 tham số a, b, c. Khi các giá trị truyền cho hàm này được gọi là tham số thực tế, bởi vì giờ nó có giá trị cụ thể

Bạn có thể trực tiếp truyền giá trị hoặc truyền biến làm tham số thực cho lời gọi hàm

(x1, x2) = equation(1, 2, 1) # truyền trực tiếp giá trị làm tham số (thực) print('real solutions:') print(f'x1 = {x1}') print(f'x2 = {x2}') aa, bb, cc = 1, 2, 1 (x1, x2) = equation(aa, bb, cc) # truyền biến làm tham số print(f'x1 = {x1}') print(f'x2 = {x2}')

based on header we don't know a, b, c thuộc kiểu dữ liệu nào. Từ tính toán ở thân hàm cho thấy a, b, c phải thuộc kiểu số

Do Python không yêu cầu kiểu định dạng duy nhất khi viết tham số, bạn phải căn cứ vào tài liệu sử dụng hàm để biết cách sử dụng đúng. Để hỗ trợ người sử dụng hàm, Python cũng khuyến nghị khi xây dựng hàm nên viết chuỗi tài liệu đầy đủ mô tả cho hàm. Bạn sẽ học kỹ hơn về docstring ở phần sau của bài học

Khi sử dụng hàm, bạn viết tên hàm và cung cấp danh sách tham số theo yêu cầu. Đặc biệt lưu ý, value tham số (gọi là tham số thực) phải viết đúng thứ tự (về kiểu) như hàm yêu cầu. Ví dụ, hàm yêu cầu kiểu theo thứ tự (int, string, list) thì bạn phải viết giá trị theo đúng trật tự đó

Đối số từ khóa

Python cho phép sử dụng một cách truyền tham số khác có tên gọi là đối số từ khóa. Trong cách truyền tham số này, bạn phải biết tên của tham số (tên sử dụng trong khai báo hàm)

Please view ví dụ

(x1, x2) = equation(b = 3, c = 2, a = 1)

Đây là một cách khác để gọi phương trình hàm

Please give up the way write the number of arrays (x1, x2) = equation(1, 2, 1) # truyền trực tiếp giá trị làm tham số (thực) print('real solutions:') print(f'x1 = {x1}') print(f'x2 = {x2}') aa, bb, cc = 1, 2, 1 (x1, x2) = equation(aa, bb, cc) # truyền biến làm tham số print(f'x1 = {x1}') print(f'x2 = {x2}')2. Chúng ta sử dụng tên tham số (a, b, c) và gán cho nó giá trị tương ứng

Với cách truyền tham số này, chúng ta không cần quan tâm đến tham số thứ tự. Python có thể phân biệt giá trị truyền cho tham số bất kỳ thông qua tên gọi

Nếu bạn đã học lập trình C# sẽ thấy cách truyền tham số này rất quen thuộc

Để sử dụng cách gọi này, bạn phải biết tên chính xác của tham số sử dụng trong lời khai báo hàm. Các IDE đều hỗ trợ hiển thị các thông tin này nếu bạn trỏ chuột lên tên hàm

Hiển thị hàm hỗ trợ trong Visual Studio
Hiển thị hàm hỗ trợ trong PyCharm

default number

Khi xây dựng hàm, trong một số trường hợp bạn muốn đơn giản hóa lời gọi hàm bằng cách cung cấp giá trị có sẵn của một vài tham số. Nếu người dùng không cung cấp giá trị cho tham số đó thì sẽ sử dụng giá trị được cung cấp sẵn

Lấy ví dụ, hàm print() quen thuộc có tham số mặc định end, sep, file, flush. Tham số cuối chỉ các ký tự cần thiết khi kết thúc xuất dữ liệu. Các ký tự sep chỉ cần ra khi kết thúc trong mỗi biến (trong trường hợp ra nhiều giá trị)

Default end has value '\n', mean is the end of the output data, then will transfer down the new line, and sep have value ' ' (dấu cách), có nghĩa là if in ra many value, the values

Tuy nhiên, trong lời gọi hàm print(), bạn không cần phải truyền giá trị cho các biến này. Khi đó, kết thúc và tháng chín đều sử dụng giá trị mặc định. Đó cũng là cách chúng ta sử dụng hàm print() đánh lâu nay

Khi xây dựng hàm, bạn cũng có thể chỉ định một vài tham số làm tham số mặc định như vậy

Please view ví dụ sau

def equation(a, b=0, c=0): from math import sqrt d = b * b - 4 * a * c if d >= 0: x1 = (- b + sqrt(d)) / (2 * a) x2 = (- b - sqrt(d)) / (2 * a) return (x1, x2)

Ở đây chúng ta xây dựng lại phương trình nhưng giờ b và c trở thành hai tham số mặc định

Trong phương trình bậc hai ax2 + bx + c = 0, ngoại trừ bắt buộc khác 0, b và c đều có thể nhận giá trị 0. Vì vậy chúng ta đặt giá trị mặc định cho b và c bằng 0. Trong lời gọi phương trình hàm, nếu không truyền giá trị cho b và c thì sẽ sử dụng giá trị mặc định

With function method as on them ta time could call as after

equation(10) # chỉ cung cấp a = 10 (bắt buộc) bỏ qua b và c equation(10, 5) # cung cấp a = 10, b = 5, bỏ qua c equation(10, 5, -10) # cung cấp đủ a, b, c equation(10, c = -1) # cung cấp a và c (thông qua keyword argument) equation(a = 10, c = -9) # cung cấp a và c sử dụng keyword argument

Tham số biến động, *args

Khi đọc mã trong tài liệu Python, bạn có thể sẽ gặp cách viết tham số (x1, x2) = equation(1, 2, 1) # truyền trực tiếp giá trị làm tham số (thực) print('real solutions:') print(f'x1 = {x1}') print(f'x2 = {x2}') aa, bb, cc = 1, 2, 1 (x1, x2) = equation(aa, bb, cc) # truyền biến làm tham số print(f'x1 = {x1}') print(f'x2 = {x2}')3 và (x1, x2) = equation(1, 2, 1) # truyền trực tiếp giá trị làm tham số (thực) print('real solutions:') print(f'x1 = {x1}') print(f'x2 = {x2}') aa, bb, cc = 1, 2, 1 (x1, x2) = equation(aa, bb, cc) # truyền biến làm tham số print(f'x1 = {x1}') print(f'x2 = {x2}')4. Cách viết này được sử dụng phổ biến như một quy tắc để chỉ định một loại tham số đặc biệt. tham số biến động (đối số có độ dài thay đổi). Nói theo cách khác, đây là loại tham số mà số lượng không xác định

*args và **kwargs được sử dụng cho hai tình huống khác nhau

Lấy ví dụ, khi sử dụng hàm in, bạn có thể để ý thấy một điểm đặc biệt. bạn có thể truyền rất nhiều biến cho bản in. Số lượng biến truyền vào để in không bị giới hạn

________số 8

Đây là một tính năng của hàm trong Python gọi là tham số biến động. Tính năng này cho phép một hàm Python tiếp nhận không giới hạn số lượng biến

Vui lòng xem ví dụ sau đây

def sum(start, *numbers): for n in numbers: start += n return start sum(0, 1, 2) # = 3 sum(1, 2, 3) # = 6 sum(0, 1, 2, 3, 4, 5, 6) # = 21

Trong ví dụ này, chúng tôi xây dựng một hàm cho phép cộng một số lượng giá trị bất kỳ vào một giá trị cho trước. In sum function, start is a tham số bắt buộc

Please for the way write tham số thứ hai (x1, x2) = equation(1, 2, 1) # truyền trực tiếp giá trị làm tham số (thực) print('real solutions:') print(f'x1 = {x1}') print(f'x2 = {x2}') aa, bb, cc = 1, 2, 1 (x1, x2) = equation(aa, bb, cc) # truyền biến làm tham số print(f'x1 = {x1}') print(f'x2 = {x2}')5. This is the rule of Python. nếu một tham số bắt đầu bằng các ký tự *, Python sẽ coi nó như một tuple. Theo đó, trong thân hàm bạn có thể sử dụng các giá trị trong tuple này

Trong ví dụ về việc chúng ta giả định rằng trong các số chỉ chứa giá trị số và chúng ta liên kết cộng gộp nó vào biến start

Từ khía cạnh sử dụng hàm, bạn có thể viết bất kỳ số lượng biến nào trong lời gọi hàm. With the function sum at on, all các biến từ vị trí số 2 trở đi sẽ được đóng vào một tuple để truyền vào hàm

Vậy chúng ta có thể viết hàng loạt lời gọi hàm với lượng tham số khác nhau

(x1, x2) = equation(1, 2, 1) # truyền trực tiếp giá trị làm tham số (thực) print('real solutions:') print(f'x1 = {x1}') print(f'x2 = {x2}') aa, bb, cc = 1, 2, 1 (x1, x2) = equation(aa, bb, cc) # truyền biến làm tham số print(f'x1 = {x1}') print(f'x2 = {x2}')1

Khi sử dụng tham số biến động cần lưu ý rằng, loại tham số này nên để ở cuối danh sách. Nếu bạn để loại tham số này ở đầu danh sách, bạn sẽ không bao giờ truyền giá trị cho các tham số khác nữa. Không tin bạn cứ thử mà xem

Như một quy tắc ngừng, lập trình viên Python thường ký kiệu tham số biến động là (x1, x2) = equation(1, 2, 1) # truyền trực tiếp giá trị làm tham số (thực) print('real solutions:') print(f'x1 = {x1}') print(f'x2 = {x2}') aa, bb, cc = 1, 2, 1 (x1, x2) = equation(aa, bb, cc) # truyền biến làm tham số print(f'x1 = {x1}') print(f'x2 = {x2}')3

Tham số biến động với đối số từ khóa, **kwargs

Một tình huống khác xảy ra với tham số biến động là khi bạn muốn sử dụng đối số từ khóa cho phần biến động

Như ở trên bạn đã hiểu thế nào là đối số từ khóa. Vì thế làm thế này để có thể truyền không giới hạn tham số nhưng theo kiểu đối số từ khóa?

Please view ví dụ sau

(x1, x2) = equation(1, 2, 1) # truyền trực tiếp giá trị làm tham số (thực) print('real solutions:') print(f'x1 = {x1}') print(f'x2 = {x2}') aa, bb, cc = 1, 2, 1 (x1, x2) = equation(aa, bb, cc) # truyền biến làm tham số print(f'x1 = {x1}') print(f'x2 = {x2}')3

Qua ví dụ nhỏ này, bạn đã thấy hiệu quả của cú pháp **kwargs

  • You can't transfer the integer tham số không giới hạn;
  • Mỗi tham số đều có thể truyền ở dạng đối số từ khóa tên_biến = giá_trị;

Để sử dụng **kwargs trong hàm, bạn cần duyệt nó trong vòng để lấy cặp từ khoá (key) và giá trị (value). (x1, x2) = equation(1, 2, 1) # truyền trực tiếp giá trị làm tham số (thực) print('real solutions:') print(f'x1 = {x1}') print(f'x2 = {x2}') aa, bb, cc = 1, 2, 1 (x1, x2) = equation(aa, bb, cc) # truyền biến làm tham số print(f'x1 = {x1}') print(f'x2 = {x2}')7

Tùy vào từng hàm, bạn có thể sử dụng key và value theo những cách khác nhau

Giả sử nếu bạn cần tính tổng, bạn có thể xây dựng lại hàm tổng như sau

(x1, x2) = equation(1, 2, 1) # truyền trực tiếp giá trị làm tham số (thực) print('real solutions:') print(f'x1 = {x1}') print(f'x2 = {x2}') aa, bb, cc = 1, 2, 1 (x1, x2) = equation(aa, bb, cc) # truyền biến làm tham số print(f'x1 = {x1}') print(f'x2 = {x2}')5

Tương tự như *args, **kwargs (viết tắt của đối số từ khóa) cũng là một tên gọi quy ước được sử dụng nhiều lần. Bạn có thể sử dụng tùy chọn tên gì nhưng nhớ đặt hai dấu ** phía trước

Khi có nhiều loại tham số trong một lời khai báo hàm, bạn nên để chúng theo thứ tự như sau. (1) tham số bắt buộc, (2) tham số mặc định, (3) *args, (4) **kwargs

Chỉ báo kiểu cho tham số hàm và kết quả

Một trong những vấn đề quan trọng đầu tiên khi xây dựng hàm hỗ trợ sử dụng là cung cấp thông tin về kiểu dữ liệu của tham số. Với các ngôn ngữ định dạng kiểu tĩnh như C/C++ thì đây không phải là vấn đề

Trong Python, nếu bạn không hỗ trợ cung cấp thông tin về kiểu dữ liệu của tham số, người sử dụng hàm sẽ gặp rất nhiều khó khăn

Trong bài học về hàm trong Python bạn đã biết khái niệm và vai trò của docstring. Trong Python, mặc dù docstring không bắt buộc nhưng bạn nên sử dụng bất kỳ khi nào có thể

Tuy nhiên, tài liệu hỗ trợ của hàm hoàn toàn dựa trên chuỗi tài liệu có những nhược điểm nhất định. Vấn đề dễ thấy nhất là ở đặc tính tự do của docstring. Không có quy định nào về cách viết chuỗi tài liệu

Thông thường người ta viết docstring theo quy ước như sau

(x1, x2) = equation(1, 2, 1) # truyền trực tiếp giá trị làm tham số (thực) print('real solutions:') print(f'x1 = {x1}') print(f'x2 = {x2}') aa, bb, cc = 1, 2, 1 (x1, x2) = equation(aa, bb, cc) # truyền biến làm tham số print(f'x1 = {x1}') print(f'x2 = {x2}')0

Tuy nhiên, bạn có thể viết bất kỳ loại nào mình thích

Điều này gây khó khăn cho các công cụ khi cần xử lý docstring

Bắt đầu từ Python 3. 5 bạn có thể kết hợp thêm kiểu báo cáo (gõ gợi ý) khi khai báo danh sách tham số của hàm

Vui lòng xem cách viết hàm sau

(x1, x2) = equation(1, 2, 1) # truyền trực tiếp giá trị làm tham số (thực) print('real solutions:') print(f'x1 = {x1}') print(f'x2 = {x2}') aa, bb, cc = 1, 2, 1 (x1, x2) = equation(aa, bb, cc) # truyền biến làm tham số print(f'x1 = {x1}') print(f'x2 = {x2}')1

Lối viết này khác biệt ở chỗ sau mỗi tham số sẽ chỉ dẫn kiểu của tham số đó ((x1, x2) = equation(1, 2, 1) # truyền trực tiếp giá trị làm tham số (thực) print('real solutions:') print(f'x1 = {x1}') print(f'x2 = {x2}') aa, bb, cc = 1, 2, 1 (x1, x2) = equation(aa, bb, cc) # truyền biến làm tham số print(f'x1 = {x1}') print(f'x2 = {x2}')8), và cả hai chỉ dẫn kiểu kết quả ((x1, x2) = equation(1, 2, 1) # truyền trực tiếp giá trị làm tham số (thực) print('real solutions:') print(f'x1 = {x1}') print(f'x2 = {x2}') aa, bb, cc = 1, 2, 1 (x1, x2) = equation(aa, bb, cc) # truyền biến làm tham số print(f'x1 = {x1}') print(f'x2 = {x2}')9)

Với cách khai báo này, các công cụ có thể giúp tốt hơn cho người dùng hàm cũng như khi xây dựng hàm

Dưới đây là ví dụ trong Visual Studio

Docstring và gõ gợi ý trong Visual Studio

Bạn nên kết hợp cả chuỗi doc và gõ gợi ý để đạt hiệu quả tốt nhất

Lưu ý, gõ gợi ý trong Python chỉ có nghĩa trợ giúp, nó không phải chỉ là định dạng tham số, và cũng không biến Python thành ngôn ngữ định dạng tĩnh như C

Kết luận

Trong bài học này chúng ta đã xem xét chi tiết một số vấn đề liên quan đến sử dụng tham số cho hàm, bao gồm tham số bắt buộc, tham số mặc định, tham số biến động. Đây là những tính năng của Python giúp xây dựng và sử dụng hàm linh hoạt và đơn giản hơn

Chủ đề