แตกรายการใน Python หรือไม่?


222

ฉันคิดว่า 'แกะ' อาจเป็นคำศัพท์ที่ผิดที่นี่ - ขอโทษเพราะฉันแน่ใจว่านี่เป็นคำถามที่ซ้ำกัน

คำถามของฉันค่อนข้างง่าย: ในฟังก์ชันที่คาดว่าจะมีรายการฉันจะส่งรายการ Python โดยไม่ได้รับข้อผิดพลาดได้อย่างไร

my_list = ['red', 'blue', 'orange']
function_that_needs_strings('red', 'blue', 'orange') # works!
function_that_needs_strings(my_list) # breaks!

แน่นอนต้องมีวิธีที่จะขยายรายการและผ่านฟังก์ชั่น'red','blue','orange'บนกีบ?

คำตอบ:



32

ใช่คุณสามารถใช้*args(splat) ไวยากรณ์:

function_that_needs_strings(*my_list)

ที่my_listสามารถทำซ้ำใด ๆ ; Python จะวนลูปมากกว่าวัตถุที่กำหนดและใช้แต่ละองค์ประกอบเป็นอาร์กิวเมนต์ที่แยกต่างหากกับฟังก์ชัน

ดูเอกสารการแสดงออกโทร

มีการเทียบเท่าพารามิเตอร์คำหลักเช่นกันโดยใช้สองดาว:

kwargs = {'foo': 'bar', 'spam': 'ham'}
f(**kwargs)

และมีไวยากรณ์ที่เทียบเท่ากันสำหรับการระบุอาร์กิวเมนต์ catch-all ในลายเซ็นฟังก์ชั่น:

def func(*args, **kw):
    # args now holds positional arguments, kw keyword arguments

14

ตั้งแต่ Python 3.5 คุณสามารถแกะไม่ จำกัด จำนวนlists

PEP 448 - การถอดภาพรวมทั่วไปเพิ่มเติม

ดังนั้นจะใช้งานได้:

a = ['1', '2', '3', '4']
b = ['5', '6']
function_that_needs_strings(*a, *b)

1
ฉันจะทำเช่นเดียวกันกับ python 2.7 หรือ 3.4 ได้อย่างไร
answerSeeker

1
@answerSeeker ไม่มีประสิทธิภาพ แต่function_that_needs_strings(*(a+b))
azalea
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.