การขยายและส่งรายการ ทูเพิล และพจนานุกรมเป็นอาร์กิวเมนต์ของฟังก์ชันใน Python

ธุรกิจ

ใน Python รายการ (อาร์เรย์) ทูเพิล และพจนานุกรมสามารถขยาย (แตกไฟล์) และองค์ประกอบที่เกี่ยวข้องสามารถส่งผ่านร่วมกันเป็นอาร์กิวเมนต์ของฟังก์ชันได้

เมื่อเรียกใช้ฟังก์ชัน ให้ระบุอาร์กิวเมนต์ด้วย * สำหรับรายการและ tuples และ ** สำหรับพจนานุกรม สังเกตจำนวนดอกจัน *

รายละเอียดต่อไปนี้อธิบายไว้ที่นี่

  • ขยาย (แกะ) รายการหรือทูเพิลด้วย * (เครื่องหมายดอกจันหนึ่งอัน)
    • สำหรับฟังก์ชันที่มีอาร์กิวเมนต์เริ่มต้น
    • สำหรับฟังก์ชันที่มีอาร์กิวเมนต์ความยาวผันแปรได้
  • ขยาย (แกะ) พจนานุกรมด้วย ** (เครื่องหมายดอกจันสองอัน)
    • สำหรับฟังก์ชันที่มีอาร์กิวเมนต์เริ่มต้น
    • สำหรับฟังก์ชันที่มีอาร์กิวเมนต์ความยาวผันแปรได้

ดูบทความต่อไปนี้สำหรับการใช้งานพื้นฐานของฟังก์ชัน Python อาร์กิวเมนต์เริ่มต้น และอาร์กิวเมนต์ความยาวผันแปรด้วย *,** เมื่อกำหนดฟังก์ชัน

ขยาย (แกะ) รายการหรือทูเพิลด้วย * (เครื่องหมายดอกจันหนึ่งอัน)

เมื่อรายการหรือทูเพิลถูกระบุเป็นอาร์กิวเมนต์ด้วย * รายการนั้นจะถูกขยายและแต่ละองค์ประกอบจะถูกส่งผ่านเป็นอาร์กิวเมนต์แยกกัน

def func(arg1, arg2, arg3):
    print('arg1 =', arg1)
    print('arg2 =', arg2)
    print('arg3 =', arg3)

l = ['one', 'two', 'three']

func(*l)
# arg1 = one
# arg2 = two
# arg3 = three

func(*['one', 'two', 'three'])
# arg1 = one
# arg2 = two
# arg3 = three

t = ('one', 'two', 'three')

func(*t)
# arg1 = one
# arg2 = two
# arg3 = three

func(*('one', 'two', 'three'))
# arg1 = one
# arg2 = two
# arg3 = three

คำอธิบายต่อไปนี้มีไว้สำหรับรายการ แต่จะมีผลเช่นเดียวกันกับทูเพิล

หากจำนวนขององค์ประกอบไม่ตรงกับจำนวนของอาร์กิวเมนต์ จะเกิดข้อผิดพลาด TypeError

# func(*['one', 'two'])
# TypeError: func() missing 1 required positional argument: 'arg3'

# func(*['one', 'two', 'three', 'four'])
# TypeError: func() takes 3 positional arguments but 4 were given

สำหรับฟังก์ชันที่มีอาร์กิวเมนต์เริ่มต้น

หากมีการตั้งค่าอาร์กิวเมนต์เริ่มต้น อาร์กิวเมนต์เริ่มต้นจะถูกใช้หากจำนวนองค์ประกอบไม่เพียงพอ หากองค์ประกอบมีจำนวนมากเกินไป จะเกิดข้อผิดพลาด TypeError

def func_default(arg1=1, arg2=2, arg3=3):
    print('arg1 =', arg1)
    print('arg2 =', arg2)
    print('arg3 =', arg3)

func_default(*['one', 'two'])
# arg1 = one
# arg2 = two
# arg3 = 3

func_default(*['one'])
# arg1 = one
# arg2 = 2
# arg3 = 3

# func_default(*['one', 'two', 'three', 'four'])
# TypeError: func_default() takes from 0 to 3 positional arguments but 4 were given

สำหรับฟังก์ชันที่มีอาร์กิวเมนต์ความยาวผันแปรได้

หากมีการตั้งค่าอาร์กิวเมนต์ความยาวผันแปร องค์ประกอบทั้งหมดหลังจากองค์ประกอบสำหรับอาร์กิวเมนต์ตำแหน่งจะถูกส่งไปยังอาร์กิวเมนต์ความยาวผันแปร

def func_args(arg1, *args):
    print('arg1 =', arg1)
    print('args =', args)

func_args(*['one', 'two'])
# arg1 = one
# args = ('two',)

func_args(*['one', 'two', 'three'])
# arg1 = one
# args = ('two', 'three')

func_args(*['one', 'two', 'three', 'four'])
# arg1 = one
# args = ('two', 'three', 'four')

ขยาย (แกะ) พจนานุกรมด้วย ** (เครื่องหมายดอกจันสองอัน)

เมื่อมีการระบุพจนานุกรม dict เป็นอาร์กิวเมนต์ด้วย ** คีย์องค์ประกอบจะถูกขยายเป็นชื่ออาร์กิวเมนต์และค่าเป็นค่าอาร์กิวเมนต์ และแต่ละรายการจะถูกส่งผ่านเป็นอาร์กิวเมนต์แยกกัน

def func(arg1, arg2, arg3):
    print('arg1 =', arg1)
    print('arg2 =', arg2)
    print('arg3 =', arg3)

d = {'arg1': 'one', 'arg2': 'two', 'arg3': 'three'}

func(**d)
# arg1 = one
# arg2 = two
# arg3 = three

func(**{'arg1': 'one', 'arg2': 'two', 'arg3': 'three'})
# arg1 = one
# arg2 = two
# arg3 = three

หากไม่มีคีย์ที่ตรงกับชื่ออาร์กิวเมนต์ หรือมีคีย์ที่ไม่ตรงกัน จะเกิดข้อผิดพลาด TypeError

# func(**{'arg1': 'one', 'arg2': 'two'})
# TypeError: func() missing 1 required positional argument: 'arg3'

# func(**{'arg1': 'one', 'arg2': 'two', 'arg3': 'three', 'arg4': 'four'})
# TypeError: func() got an unexpected keyword argument 'arg4'

สำหรับฟังก์ชันที่มีอาร์กิวเมนต์เริ่มต้น

ภาพที่อัปเดตเฉพาะค่าของชื่ออาร์กิวเมนต์ที่ตรงกับคีย์ในพจนานุกรม

คีย์ที่ไม่ตรงกับชื่ออาร์กิวเมนต์จะส่งผลให้เกิดข้อผิดพลาด TypeError

def func_default(arg1=1, arg2=2, arg3=3):
    print('arg1 =', arg1)
    print('arg2 =', arg2)
    print('arg3 =', arg3)

func_default(**{'arg1': 'one'})
# arg1 = one
# arg2 = 2
# arg3 = 3

func_default(**{'arg2': 'two', 'arg3': 'three'})
# arg1 = 1
# arg2 = two
# arg3 = three

# func_default(**{'arg1': 'one', 'arg4': 'four'})
# TypeError: func_default() got an unexpected keyword argument 'arg4'

สำหรับฟังก์ชันที่มีอาร์กิวเมนต์ความยาวผันแปรได้

หากมีการตั้งค่าอาร์กิวเมนต์ความยาวผันแปร องค์ประกอบใดๆ ที่มีคีย์อื่นที่ไม่ใช่ชื่ออาร์กิวเมนต์ที่ระบุเป็นอาร์กิวเมนต์จะถูกส่งไปยังอาร์กิวเมนต์ความยาวผันแปร

def func_kwargs(arg1, **kwargs):
    print('arg1 =', arg1)
    print('kwargs =', kwargs)

func_kwargs(**{'arg1': 'one', 'arg2': 'two', 'arg3': 'three'})
# arg1 = one
# kwargs = {'arg2': 'two', 'arg3': 'three'}

func_kwargs(**{'arg1': 'one', 'arg2': 'two', 'arg3': 'three', 'arg4': 'four'})
# arg1 = one
# kwargs = {'arg2': 'two', 'arg3': 'three', 'arg4': 'four'}

func_kwargs(**{'arg1': 'one', 'arg3': 'three'})
# arg1 = one
# kwargs = {'arg3': 'three'}