ในทำนองเดียวกันกับการใช้ varargs ใน C หรือ C ++:
fn(a, b)
fn(a, b, c, d, ...)
ในทำนองเดียวกันกับการใช้ varargs ใน C หรือ C ++:
fn(a, b)
fn(a, b, c, d, ...)
คำตอบ:
ใช่. คุณสามารถใช้*args
เป็นอาร์กิวเมนต์ที่ไม่ใช่คำหลัก จากนั้นคุณจะสามารถผ่านการโต้แย้งจำนวนเท่าใดก็ได้
def manyArgs(*arg):
print "I was called with", len(arg), "arguments:", arg
>>> manyArgs(1)
I was called with 1 arguments: (1,)
>>> manyArgs(1, 2, 3)
I was called with 3 arguments: (1, 2, 3)
อย่างที่คุณเห็น Python จะคลายข้อโต้แย้งเป็น tuple เดียวพร้อมกับอาร์กิวเมนต์ทั้งหมด
สำหรับข้อโต้แย้งคำหลักที่คุณต้องยอมรับที่เป็นข้อโต้แย้งที่เกิดขึ้นจริงที่แยกจากกันตามที่ปรากฏในคำตอบของ Skurmedel
manyArgs(x = 3)
TypeError
คำตอบของ Skumedel แสดงวิธีแก้ปัญหานี้ จุดสำคัญคือว่าลายเซ็นทั่วไปของฟังก์ชั่นคือf(*list_args, **keyword_args)
(ไม่f(*list_args)
)
args
หมายถึงคำหลัก args ประเภทของการมี tuple
kwargs
kwargs
dictionary
for arg in args:
สำหรับวนผ่าน args ผ่าน
การเพิ่มไปยังโพสต์ผ่อนคลาย:
คุณสามารถส่งค่าคีย์หลายค่าได้เช่นกัน
def myfunc(**kwargs):
# kwargs is a dictionary.
for k,v in kwargs.iteritems():
print "%s = %s" % (k, v)
myfunc(abc=123, efh=456)
# abc = 123
# efh = 456
และคุณสามารถผสมสองอย่างนี้:
def myfunc2(*args, **kwargs):
for a in args:
print a
for k,v in kwargs.iteritems():
print "%s = %s" % (k, v)
myfunc2(1, 2, 3, banan=123)
# 1
# 2
# 3
# banan = 123
พวกเขาจะต้องประกาศและเรียกตามลำดับนั่นคือลายเซ็นของฟังก์ชันจะต้องเป็น * args, ** kwargs และเรียกตามลำดับนั้น
print a
ด้วยprint(a)
และมีkwargs.iteritems():
kwargs.items()
ถ้าฉันทำได้รหัสของ Skurmedel สำหรับ python 2; เพื่อปรับให้หลาม 3 การเปลี่ยนแปลงiteritems
ไปและเพิ่มวงเล็บไปitems
print
สิ่งนี้อาจป้องกันไม่ให้ผู้เริ่มต้นอย่างฉันกระแทก
AttributeError: 'dict' object has no attribute 'iteritems'
และค้นหาที่อื่น (เช่นข้อผิดพลาด“ วัตถุ 'dict' ไม่มีแอตทริบิวต์ 'iteritems' "เมื่อพยายามใช้ write_shp () ของ NetworkXเหตุใดสิ่งนี้จึงเกิดขึ้น
def myfunc(**kwargs):
for k,v in kwargs.items():
print("%s = %s" % (k, v))
myfunc(abc=123, efh=456)
# abc = 123
# efh = 456
และ:
def myfunc2(*args, **kwargs):
for a in args:
print(a)
for k,v in kwargs.items():
print("%s = %s" % (k, v))
myfunc2(1, 2, 3, banan=123)
# 1
# 2
# 3
# banan = 123
เพิ่มไปยังโพสต์ที่ยอดเยี่ยมอื่น ๆ
บางครั้งคุณไม่ต้องการระบุจำนวนอาร์กิวเมนต์และต้องการใช้คีย์สำหรับพวกเขา (คอมไพเลอร์จะบ่นถ้าอาร์กิวเมนต์หนึ่งผ่านในพจนานุกรมไม่ได้ใช้ในวิธีการ)
def manyArgs1(args):
print args.a, args.b #note args.c is not used here
def manyArgs2(args):
print args.c #note args.b and .c are not used here
class Args: pass
args = Args()
args.a = 1
args.b = 2
args.c = 3
manyArgs1(args) #outputs 1 2
manyArgs2(args) #outputs 3
จากนั้นคุณสามารถทำสิ่งต่าง ๆ เช่น
myfuns = [manyArgs1, manyArgs2]
for fun in myfuns:
fun(args)
def f(dic):
if 'a' in dic:
print dic['a'],
pass
else: print 'None',
if 'b' in dic:
print dic['b'],
pass
else: print 'None',
if 'c' in dic:
print dic['c'],
pass
else: print 'None',
print
pass
f({})
f({'a':20,
'c':30})
f({'a':20,
'c':30,
'b':'red'})
____________
รหัสข้างต้นจะส่งออก
None None None
20 None 30
20 red 30
นี่เป็นสิ่งที่ดีเท่ากับการผ่านการขัดแย้งตัวแปรโดยใช้พจนานุกรม
f = lambda **dic: ' '.join(dic.get(key, 'None') for key in 'abc')
อีกวิธีที่จะไปเกี่ยวกับเรื่องนี้นอกเหนือจากคำตอบที่ดีที่กล่าวถึงแล้วขึ้นอยู่กับความจริงที่ว่าคุณสามารถส่งต่อข้อโต้แย้งชื่อตัวเลือกตามตำแหน่ง ตัวอย่างเช่น,
def f(x,y=None):
print(x)
if y is not None:
print(y)
อัตราผลตอบแทน
In [11]: f(1,2)
1
2
In [12]: f(1)
1