Page 31 - Python Simple
P. 31
4. Bàn thêm về luồng điều khiển http://www.vithon.org/tutorial/2.5/node6.html
Sẽ in ra
[1]
[1, 2]
[1, 2, 3]
Nếu bạn không muốn mặc định được dùng chung trong các lời gọi sau, bạn có thể viết một hàm như thế
này:
def f(a, L=None):
if L is None:
L = []
L.append(a)
return L
4.7.2 Thông số từ khóa
Các hàm cũng có thể được gọi theo thông số từ khóa (keyword argument) theo dạng "keyword = value".
Ví dụ, hàm sau:
def parrot(voltage, state='a stiff', action='voom', type='Norwegian Blue'):
print "-- This parrot wouldn't", action,
print "if you put", voltage, "volts through it."
print "-- Lovely plumage, the", type
print "-- It's", state, "!"
có thể được gọi theo bất kỳ cách nào:
parrot(1000)
parrot(action = 'VOOOOOM', voltage = 1000000)
parrot('a thousand', state = 'pushing up the daisies')
parrot('a million', 'bereft of life', 'jump')
nhưng những lời gọi sau đều không hợp lệ:
parrot() # required argument missing
parrot(voltage=5.0, 'dead') # non-keyword argument following keyword
parrot(110, voltage=220) # duplicate value for argument
parrot(actor='John Cleese') # unknown keyword
Nói chung, một danh sách thông số phải có bất kỳ thông số vị trí (positional argument) theo sau bởi bất
kỳ thông số từ khóa, các từ khóa phải được chọn từ tên thông số chính quy. Các thông số chính quy
không nhất thiết phải có giá trị mặc định. Không thông số nào có thể nhận một giá trị nhiều hơn một lần
-- tên thông số chính quy tương ứng với thông số vị trí không thể được dùng làm từ khóa trong cùng một
lời gọi. Sau đây là một ví dụ sai vì giới hạn này:
>>> def function(a):
... pass
...
>>> function(0, a=0)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: function() got multiple values for keyword argument 'a'
Khi thông số chính quy cuối có dạng **name , nó nhận một từ điển (dictionary) chứa tất cả các thông số
từ khóa trừ những từ khóa tương ứng với thông số chính quy. Điểm này có thể được dùng chung với một
thông số chính quy ở dạng *name (bàn đến trong mục con sau) và nhận một bộ (tuple) chứa các thông
số vị trí sau danh sách thông số chính quy. (*name bắt buộc phải xuất hiện trước **name.) Ví dụ, nếu ta
định nghĩa một hàm như sau:
def cheeseshop(kind, *arguments, **keywords):
print "-- Do you have any", kind, '?'
print "-- I'm sorry, we're all out of", kind
for arg in arguments: print arg
print '-'*40
keys = keywords.keys()
5 of 7 08/31/2011 07:39 AM