อะไรคือวิธีที่ดีที่สุดในการออกจากฟังก์ชั่น (ซึ่งไม่มีค่าตอบแทน) ในไพ ธ อนก่อนที่ฟังก์ชั่นจะสิ้นสุดลง (เช่นการตรวจสอบล้มเหลว)?


164

สมมติว่ามีการวนซ้ำซึ่งเราเรียกใช้ฟังก์ชันโดยไม่มีค่าส่งคืน วิธีที่ฉันคิดว่าโปรแกรมของฉันควรมีการอธิบายในรหัสเทียมนี้:

for element in some_list:
    foo(element)

def foo(element):
    do something
    if check is true:
        do more (because check was succesful)
    else:
        return None
    do much much more...

Noneถ้าผมดำเนินการนี้ในหลามมันรบกวนจิตใจผมว่าฟังก์ชั่นส่งกลับ มีวิธีที่ดีกว่าสำหรับ "ออกจากฟังก์ชันที่ไม่มีค่าส่งคืนหรือไม่หากการตรวจสอบล้มเหลวในเนื้อความของฟังก์ชัน"


6
Python จะคืนค่า None ถ้าคุณไม่ได้คืนค่าอะไร แต่คุณสามารถปล่อย None off ได้
Keith

2
นอกจากนี้คุณยังอาจได้raiseรับการยกเว้น (หรือน้อยมากที่ทำให้ฟังก์ชันส่งคืนจริง / เท็จ) ทั้งนี้ขึ้นอยู่กับว่าเช็คเป็นอย่างไร
Rosh Oxymoron

คำตอบ:


279

คุณสามารถใช้

return

ซึ่งทำเช่นเดียวกันกับ

return None

ฟังก์ชั่นของคุณยังจะกลับมาNoneหากการดำเนินการถึงจุดสิ้นสุดของร่างกายทำงานได้โดยไม่ต้องกดปุ่มreturnคำสั่ง การส่งคืนไม่มีอะไรเหมือนกับการกลับมาNoneใน Python


returnไม่ทำงานหากฉันตั้งa = method()ไว้วิธีการภายในที่ฉันใช้returnก็ยังคงใช้งานโค้ดที่อยู่เบื้องหลัง exit ควรเป็น php exit () มันจะหยุดโปรแกรมทันที
TomSawyer

2
@TomSawyer จะหยุดโปรแกรมหลามต้นทำimport sysครั้งแรกแล้วsys.exit()ถ้าคุณต้องการที่จะออกจาก sys.exit("some error message to print to stderr")แต่รายงานความสำเร็จหรือ
Boris

@ Boris นี่คือสิ่งที่ฉันกำลังมองหาและมันก็ใช้ได้กับฉัน
mikey


13

คุณสามารถใช้returnคำสั่งโดยไม่มีพารามิเตอร์ใด ๆ เพื่อออกจากฟังก์ชั่น

def foo(element):
    do something
    if check is true:
        do more (because check was succesful)
    else:
        return
    do much much more...

หรือเพิ่มข้อยกเว้นหากคุณต้องการได้รับแจ้งปัญหา

def foo(element):
    do something
    if check is true:
        do more (because check was succesful)
    else:
        raise Exception("cause of the problem")
    do much much more...
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.