Có thể cho một hàm có tham số vô hạn Python không?

Các đối số được chỉ định sau tên hàm, bên trong dấu ngoặc đơn. Bạn có thể thêm bao nhiêu đối số tùy thích, chỉ cần phân tách chúng bằng dấu phẩy

Ví dụ sau có một hàm với một đối số [fname]. Khi hàm được gọi, chúng ta truyền vào tên đầu tiên, tên này được sử dụng bên trong hàm để in ra tên đầy đủ

Thí dụ

def my_function[fname]
in [tên + " Refsnes"]

my_function["Emil"]
my_function["Tobias"]
my_function["Linus"]

Tự mình thử »

Các đối số thường được rút ngắn thành args trong tài liệu Python

Tham số hoặc Đối số?

Tham số thuật ngữ và đối số có thể được sử dụng cho cùng một thứ. thông tin được truyền vào một chức năng

Từ quan điểm của một chức năng

Tham số là biến được liệt kê bên trong dấu ngoặc đơn trong định nghĩa hàm

Đối số là giá trị được gửi đến hàm khi nó được gọi

Số đối số

Theo mặc định, một hàm phải được gọi với số đối số chính xác. Có nghĩa là nếu hàm của bạn yêu cầu 2 đối số, bạn phải gọi hàm với 2 đối số, không nhiều hơn và không ít hơn

def findvolume[chiều dài=1, chiều rộng=1, chiều sâu=1]

print["Chiều dài = " + str[chiều dài]]

in["Chiều rộng = " + str[chiều rộng]]

in["Độ sâu = " + str[độ sâu]]

trả về chiều dài * chiều rộng * chiều sâu;

findvolume[chiều dài=5, chiều sâu=2, chiều rộng=4]

findvolume[2, depth=3, width=4]

Đôi khi bạn viết một hàm, không thể biết trước bạn sẽ cung cấp bao nhiêu đối số cho hàm. Giả sử chúng ta muốn viết một hàm sẽ kiểm tra một số chuỗi tùy ý và trả về độ dài của chuỗi dài nhất. [Một cách khác là viết một hàm chấp nhận một danh sách các giá trị thay vì các đối số riêng lẻ, nhưng chúng ta sẽ tiếp tục phương pháp này để minh họa ý tưởng về một hàm với số lượng đối số tùy ý. ] Bằng cách cung cấp một đối số hàm có tên bắt đầu bằng dấu hoa thị, Python sẽ thu thập bất kỳ đối số không tên nào được truyền cho hàm trong một bộ, có thể được truy cập bằng tên của đối số. Để viết một hàm trả về độ dài dài nhất của một số biến đối số, chúng ta có thể sử dụng tính năng này bằng cách đưa vào một đối số có tên bắt đầu bằng dấu hoa thị [trong trường hợp này, chúng ta sẽ sử dụng tên *strings], điều này sẽ

def longlen[*strings]:
   max = 0
   for s in strings:
     if len[s] > max:
        max = len[s]

   return max
Lưu ý rằng bên trong hàm, các chuỗi chỉ là một bộ thông thường; . Nếu chúng ta gọi hàm với một tập hợp các chuỗi làm đối số, nó sẽ kiểm tra tất cả chúng và trả về độ dài tối đa của bất kỳ chuỗi nào.
>>> longlen['apple','banana','cantaloupe','cherry']
10

Một kỹ thuật tương tự có thể được sử dụng để tạo các hàm có thể xử lý số lượng không giới hạn các cặp từ khóa/đối số. Nếu một đối số của một hàm được đặt trước hai dấu hoa thị, thì bên trong hàm, Python sẽ thu thập tất cả các cặp từ khóa/đối số không được khai báo rõ ràng dưới dạng đối số trong từ điển. Khi một đối số như vậy được sử dụng, nó phải là đối số cuối cùng trong định nghĩa của hàm. Bằng cách này, bạn có thể viết một hàm để chấp nhận bất kỳ tham số được đặt tên nào, ngay cả khi tên của nó không được biết khi bạn viết hàm

Để minh họa, hãy xem xét một hàm tầm thường chỉ đơn giản là tập hợp tất cả các cặp từ khóa/giá trị không được khai báo rõ ràng trong định nghĩa hàm vào một từ điển gọi là dict, sau đó in giá trị của từng đối số đã khai báo. Hai đối số được đặt tên được cung cấp trước đối số cuối cùng để chỉ ra cách Python xử lý các đối số được đặt tên khi có đối số có hai dấu hoa thị

def printargs[a,b,**dict]:
    print 'a=%s' % a
    print 'b=%s
    for k in dict.keys[]:
        print '%s=%s' % [k,dict[k]]
Chúng ta có thể kiểm tra chức năng như sau.
>>> printargs[x='seven',a='six',b='five',next='four',last='three']
a=six
b=five
next=four
x=seven
last=three
Lưu ý rằng các đối số a và b không được đặt trong từ điển, vì chúng đã được chỉ định rõ ràng như một phần của định nghĩa hàm

Trong các tình huống phức tạp hơn, cả hai loại đối số đặc biệt [dấu hoa thị đơn và dấu hoa thị kép] đều có thể được sử dụng trong cùng một hàm. Một lần nữa, một chương trình tầm thường sẽ minh họa cách thức hoạt động của nó

Các ngôn ngữ lập trình khác nhau có cú pháp khác nhau, nhưng hàm là một trong những khái niệm mà chúng không bao giờ có thể tránh khỏi. Khi chúng ta đề cập đến các hàm hoặc phương thức, trong hầu hết các trường hợp, chúng ta sẽ truyền đối số cho các hàm này

Là một trong những ngôn ngữ lập trình linh hoạt và năng động nhất, Python có một số quy tắc đặc biệt về việc truyền đối số hàm. Điều này là để cho phép các nhà phát triển thực hiện công việc của họ với sự linh hoạt tối đa. Tuy nhiên, người mới có thể không dễ dàng nắm vững tất cả các tiêu chuẩn này

Trong bài viết này, tôi sẽ sử dụng các ví dụ để trình bày tất cả các quy tắc này bao gồm các tham số độ dài biến bắt buộc, tùy chọn, từ khóa và không phải từ khóa, đối số vị trí và từ khóa

0. Định nghĩa các tham số và đối số

Hình ảnh được cung cấp bởi Gerd Altmann từ Pixabay

Tôi không phải là người thích ghi nhớ các khái niệm hay định nghĩa. Tuy nhiên, cần làm rõ một số từ khóa mà chúng ta sẽ sử dụng nhiều trong bài viết này để tiện theo dõi.

Có thể gây nhầm lẫn khi chúng ta nói tham số và đối số. Một số có thể nghĩ rằng họ giống nhau. Tuy nhiên, người ta thường chấp nhận rằng chúng khác nhau như sau

  • Tham số là các biến trong định nghĩa của hàm. Nói cách khác, chúng tồn tại trong chữ ký hàm và sẽ được sử dụng làm biến trong thân hàm
  • Đối số là các giá trị thực được truyền cho hàm khi chúng ta gọi nó. Nói cách khác, một đối số có thể là một số nguyên, một chuỗi hoặc bất kỳ đối tượng nào
1. Thông số bắt buộc và tùy chọn

Hình ảnh được cung cấp bởi Pexels từ Pixabay

Trong Python, chúng ta có thể dễ dàng định nghĩa một hàm với các tham số bắt buộc và tùy chọn. Tức là khi chúng ta khởi tạo một tham số với giá trị mặc định, nó sẽ trở thành tùy chọn. Nếu không, tham số sẽ là bắt buộc

def my_func[man1, man2, opt1=0, opt2='']:
print['man1:', man1]
print['man2:', man2]
print['opt1:', opt1]
print['opt2:', opt2]

Trong ví dụ trên,

def my_func[opt1=0, man1, man2, opt2='']:
print['man1:', man1]
print['man2:', man2]
print['opt1:', opt1]
print['opt2:', opt2]
1 và
def my_func[opt1=0, man1, man2, opt2='']:
print['man1:', man1]
print['man2:', man2]
print['opt1:', opt1]
print['opt2:', opt2]
2 là bắt buộc vì chúng không được khởi tạo trong định nghĩa hàm. Vì vậy, nếu chúng ta gọi hàm mà không truyền đối số cho chúng, nó sẽ báo lỗi

Đối với các tham số tùy chọn, chúng tôi không phải truyền bất kỳ đối số nào. Nếu không, giá trị mặc định sẽ được sử dụng

my_func[man1='a', man2='b']

1. 1 Tất cả các tham số bắt buộc phải ở phía trước

Khi chúng ta muốn xác định một hàm có cả tham số bắt buộc và tùy chọn, tất cả tham số bắt buộc phải ở trước tất cả tham số tùy chọn

def my_func[opt1=0, man1, man2, opt2='']:
print['man1:', man1]
print['man2:', man2]
print['opt1:', opt1]
print['opt2:', opt2]

Điều này là do Python cho phép các đối số vị trí sẽ được giới thiệu trong phần tiếp theo. Nếu được phép định nghĩa một hàm như trên thì khi ta truyền đối số vị trí

def my_func[opt1=0, man1, man2, opt2='']:
print['man1:', man1]
print['man2:', man2]
print['opt1:', opt1]
print['opt2:', opt2]
3 thì sẽ khá khó hiểu là cho tham số tùy chọn
def my_func[opt1=0, man1, man2, opt2='']:
print['man1:', man1]
print['man2:', man2]
print['opt1:', opt1]
print['opt2:', opt2]
4 hay tham số bắt buộc
def my_func[opt1=0, man1, man2, opt2='']:
print['man1:', man1]
print['man2:', man2]
print['opt1:', opt1]
print['opt2:', opt2]
1. Quá không đáng tin cậy để quyết định điều này dựa trên số lượng đối số

2. Đối số vị trí và Đối số từ khóa

Hình ảnh được cung cấp bởi Gino Crescoli từ Pixabay

2. 1 Đối số vị trí là gì?

Khi chúng ta truyền đối số cho một hàm. Chúng tôi không phải đặt tên tham số, miễn là chúng tôi sẽ chuyển các đối số về vị trí ban đầu của chúng. Đó là lập luận lập trường

# my_func[man1, man2, opt1=0, opt2='']my_func['a', 'b']

2. 1 Đối số từ khóa không phân biệt vị trí

Khi một đối số không phải là vị trí, nó phải là một đối số từ khóa. Khi chúng ta đề cập rõ ràng tên tham số của một đối số, nó sẽ trở thành một đối số từ khóa

Mặc dù chúng ta cần gõ nhiều từ hơn nhưng sẽ thuận tiện hơn khi chúng ta sử dụng đối số từ khóa, vì vị trí sẽ không nhạy nên chúng ta không cần quan tâm đến vị trí

# my_func[man1, man2, opt1=0, opt2='']my_func[man2='a', man1='b']

Trong ví dụ trên, chúng tôi vượt qua

def my_func[opt1=0, man1, man2, opt2='']:
print['man1:', man1]
print['man2:', man2]
print['opt1:', opt1]
print['opt2:', opt2]
2 trước
def my_func[opt1=0, man1, man2, opt2='']:
print['man1:', man1]
print['man2:', man2]
print['opt1:', opt1]
print['opt2:', opt2]
1

2. 2 Đối số Vị trí cho cả Tham số Bắt buộc và Tùy chọn

Đối số vị trí không chỉ dành cho các tham số bắt buộc. Miễn là chúng ta theo dõi vị trí, nó cũng có thể được chuyển đến các tham số tùy chọn

# my_func[man1, man2, opt1=0, opt2='']my_func['a', 'b', 10, 'c']

2. 3 Kết hợp Đối số Vị trí và Từ khoá

Chúng ta cũng có thể kết hợp hai loại lập luận này. Điều này thường hiệu quả khi chúng ta muốn sử dụng một hàm có một vài tham số bắt buộc nhưng lại có nhiều tham số tùy chọn

Ví dụ: chúng ta có thể chuyển hai đối số vị trí cho hai tham số bắt buộc tương ứng, sau đó bỏ qua tham số tùy chọn đầu tiên bằng cách sử dụng đối số từ khóa cho tham số tùy chọn thứ hai

# my_func[man1, man2, opt1=0, opt2='']my_func['a', 'b', opt2='c']

2. 4 Đối số vị trí phải ở phía trước

Cho đến nay nó rất linh hoạt, phải không? . Nghĩa là, tất cả các đối số vị trí phải ở trước tất cả các đối số từ khóa

# my_func[man1, man2, opt1=0, opt2='']my_func[man1='a', 'b', 10, opt2='c']
my_func[man1='a', man2='b', opt1=10, 'c']

Hai lệnh gọi hàm trên không hợp lệ

Có lý do tại sao Python không chấp nhận điều này. Giả sử chúng ta có bốn tham số

def my_func[opt1=0, man1, man2, opt2='']:
print['man1:', man1]
print['man2:', man2]
print['opt1:', opt1]
print['opt2:', opt2]
8,
def my_func[opt1=0, man1, man2, opt2='']:
print['man1:', man1]
print['man2:', man2]
print['opt1:', opt1]
print['opt2:', opt2]
9,
# my_func[man1, man2, opt1=0, opt2='']my_func['a', 'b']
0 và
# my_func[man1, man2, opt1=0, opt2='']my_func['a', 'b']
1

  • Nếu chúng ta có các đối số
    def my_func[opt1=0, man1, man2, opt2='']:
    print['man1:', man1]
    print['man2:', man2]
    print['opt1:', opt1]
    print['opt2:', opt2]
    3,
    # my_func[man1, man2, opt1=0, opt2='']my_func['a', 'b']
    3 và
    # my_func[man1, man2, opt1=0, opt2='']my_func['a', 'b']
    4, thì rõ ràng là
    # my_func[man1, man2, opt1=0, opt2='']my_func['a', 'b']
    5,
    # my_func[man1, man2, opt1=0, opt2='']my_func['a', 'b']
    6 và
    # my_func[man1, man2, opt1=0, opt2='']my_func['a', 'b']
    4
  • Nếu chúng ta có các đối số
    # my_func[man1, man2, opt1=0, opt2='']my_func['a', 'b']
    6 và
    # my_func[man1, man2, opt1=0, opt2='']my_func['a', 'b']
    9, thì sẽ rất khó hiểu đối số ____12_______9 nên được chuyển cho
    def my_func[opt1=0, man1, man2, opt2='']:
    print['man1:', man1]
    print['man2:', man2]
    print['opt1:', opt1]
    print['opt2:', opt2]
    8 hoặc
    # my_func[man1, man2, opt1=0, opt2='']my_func['a', 'b']
    0. Nó cần nhiều quy tắc nhân tạo hơn để khắc phục điều này và các nhà phát triển cần ghi nhớ nó

2. 5 Thực thi các đối số từ khóa

Có một mẹo trong Python để thực thi lệnh gọi hàm sử dụng đối số từ khóa thay vì vị trí. Chúng ta có thể thêm dấu hoa thị vào danh sách tham số chức năng và bất kỳ tham số nào ở bên phải chỉ có thể được chuyển bằng đối số từ khóa

def my_func[man1, *, man2]:
print[man1]
print[man2]

Nếu chúng ta cố gắng sử dụng các đối số vị trí cho cả hai, sẽ xảy ra lỗi

my_func['a', 'b']

Tuy nhiên, nếu chúng ta sử dụng đối số từ khóa cho

def my_func[opt1=0, man1, man2, opt2='']:
print['man1:', man1]
print['man2:', man2]
print['opt1:', opt1]
print['opt2:', opt2]
2, sẽ không có vấn đề gì

my_func[man1='a', man2='b']
0

3. Thông số độ dài thay đổi

Hình ảnh được cung cấp bởi Rudy và Peter Skitterians từ Pixabay

Trong Python, chúng ta có thể định nghĩa hai loại tham số có độ dài thay đổi. Chúng có thể được coi là các loại tham số tùy chọn đặc biệt. Nói cách khác, không có giới hạn về số lượng đối số được truyền cho tham số khi chúng ta gọi hàm này

3. 1 Tham số có độ dài thay đổi — *args

Tham số

# my_func[man1, man2, opt1=0, opt2='']my_func[man2='a', man1='b']
4 là một cú pháp như vậy khi chúng ta muốn định nghĩa một tham số có độ dài thay đổi

my_func[man1='a', man2='b']
1

Khi chúng ta gọi hàm này, chúng ta có thể truyền bao nhiêu đối số tùy thích. Chúng sẽ có thể truy cập được trong hàm dưới dạng Tuple

3. 2 Tham số độ dài biến đổi của từ khóa — **kwargs

Loại tham số có độ dài thay đổi khác là với từ khóa. Tên

# my_func[man1, man2, opt1=0, opt2='']my_func[man2='a', man1='b']
5 là viết tắt của KeyWord ARGumentS

my_func[man1='a', man2='b']
2

Khi chúng ta gọi hàm và muốn truyền các đối số cho tham số

# my_func[man1, man2, opt1=0, opt2='']my_func[man2='a', man1='b']
5, chúng ta cần chỉ định khóa và giá trị cho từng đối số

Như trong ví dụ, các đối số sẽ được nhận dưới dạng từ điển

Ngoài ra còn có một hạn chế là chúng ta không thể sử dụng bất kỳ phím nào có tham số đặc biệt. Về cơ bản, các khóa phải tuân theo cú pháp của tên biến Python

3. 3 Kết hợp các tham số độ dài biến của từ khóa và không phải từ khóa

Chúng ta có thể sử dụng cả tham số độ dài biến từ khóa và không phải từ khóa trong một hàm. Tuy nhiên, không được phép đặt từ khóa một trước từ khóa không phải từ khóa

my_func[man1='a', man2='b']
3

Cách khác xung quanh sẽ làm việc

my_func[man1='a', man2='b']
4

Điều này khá giống với quy tắc mà chúng ta không thể có đối số từ khóa trước bất kỳ đối số vị trí nào

3. 4 Có thể đổi tên “*args” và “**kwargs”

Mình thấy một số bạn học không biết là mình có thể đổi tên 2 tham số có độ dài thay đổi này. Họ nghĩ rằng đây là những từ khóa dành riêng trong Python và được thực thi theo cú pháp

Trên thực tế, điều đó không chắc chắn. Chúng ta có thể sử dụng bất kỳ tên nào trong số chúng. Điều quan trọng duy nhất là sử dụng dấu sao đơn cho các tham số có độ dài thay đổi và dấu hoa thị kép cho các từ khóa

my_func[man1='a', man2='b']
5

4. Kết hợp tất cả các loại tham số

Hình ảnh được cung cấp bởi Gundula Vogel từ Pixabay

4. 1 Tham số độ dài biến của từ khóa phải là tham số cuối cùng

Chúng ta có thể sử dụng cả 4 loại tham số trong một hàm. Tất nhiên, có một số quy tắc bắt buộc

Vì tham số độ dài biến của từ khóa yêu cầu chúng ta chuyển các đối số bằng từ khóa nên nó phải ở cuối hàng đợi tham số

my_func[man1='a', man2='b']
6

4. 2 A Trap khi sử dụng cả 4 loại

Khi chúng tôi đang sử dụng tất cả bốn loại tham số trong một chức năng, có một cái bẫy cần được quan tâm nhiều hơn

Giả sử chúng ta định nghĩa hàm như sau

my_func[man1='a', man2='b']
7

Khi chúng ta gọi hàm này, tham số tùy chọn và tham số độ dài thay đổi có thể dễ bị nhầm lẫn. Xét lời gọi hàm sau

my_func[man1='a', man2='b']
8

Giá trị

def my_func[opt1=0, man1, man2, opt2='']:
print['man1:', man1]
print['man2:', man2]
print['opt1:', opt1]
print['opt2:', opt2]
3 được coi là giá trị cho tham số tùy chọn. Trong trường hợp này, tham số tùy chọn không còn là tùy chọn nữa. Lệnh gọi hàm sau đây là hợp lệ nếu chúng ta muốn cả
def my_func[opt1=0, man1, man2, opt2='']:
print['man1:', man1]
print['man2:', man2]
print['opt1:', opt1]
print['opt2:', opt2]
3,
# my_func[man1, man2, opt1=0, opt2='']my_func['a', 'b']
3 và
# my_func[man1, man2, opt1=0, opt2='']my_func['a', 'b']
9 đều được chuyển đến
# my_func[man1, man2, opt1=0, opt2='']my_func['a', 'b', 10, 'c']
1

Vấn đề này có thể được giải quyết bằng cách điều chỉnh vị trí của các tham số khi chúng ta xác định chức năng

my_func[man1='a', man2='b']
9

Nếu đổi vị trí của

# my_func[man1, man2, opt1=0, opt2='']my_func['a', 'b', 10, 'c']
1 và
# my_func[man1, man2, opt1=0, opt2='']my_func['a', 'b', 10, 'c']
3 thì có thể gọi hàm như sau để tham số tùy chọn vẫn là tùy chọn

my_func[man1='a', man2='b']
8

Tóm lược

Hình ảnh được cung cấp bởi Tibor Lezsófi từ Pixabay

Trong bài này mình đã giới thiệu cả 4 loại tham số và 2 loại đối số trong Python. Các tham số là các biến trong một hàm, trong khi các đối số là các giá trị được truyền cho các tham số khi gọi hàm

Các tham số có thể là bắt buộc hoặc tùy chọn. Đối với các tham số tùy chọn, chúng có thể có độ dài thay đổi có hoặc không có từ khóa. Các đối số có thể là vị trí dựa vào vị trí để quyết định với giá trị là tham số nào. Hoặc, chúng ta có thể chuyển giá trị một cách rõ ràng bằng từ khóa, đó là đối số từ khóa

Tham gia Medium với liên kết giới thiệu của tôi - Christopher Tao

Là thành viên Phương tiện, một phần phí thành viên của bạn sẽ được chuyển đến các tác giả mà bạn đã đọc và bạn có toàn quyền truy cập vào mọi câu chuyện…

trung bình. com

Nếu bạn cảm thấy bài viết của tôi hữu ích, hãy cân nhắc tham gia Medium Membership để ủng hộ tôi và hàng ngàn người viết khác. [Nhấp vào liên kết ở trên]

Hàm Python có thể có đối số không giới hạn không?

Có. Bạn có thể sử dụng *args làm đối số không phải từ khóa. Sau đó, bạn sẽ có thể chuyển bất kỳ số lượng đối số nào .

Số tham số tối đa trong một hàm trong Python là bao nhiêu?

Trong Python 3. 7 trở lên, không có không giới hạn .

Một hàm có thể nhận số lượng đối số không giới hạn không?

Sê-ri. Chức năng . functions can be written to accept any number of arguments.

Một hàm có thể có nhiều hơn một tham số trong Python không?

May mắn thay, bạn có thể viết các hàm nhận nhiều hơn một tham số bằng cách xác định bao nhiêu tham số tùy thích , chẳng hạn. def function_name[dữ liệu_1, dữ liệu_2].

Chủ Đề