มีวิธีใน Python หรือไม่ในการส่งผ่านพารามิเตอร์ที่เป็นทางเลือกไปยังฟังก์ชันในขณะที่เรียกใช้และในนิยามฟังก์ชันจะมีโค้ดบางส่วนตาม "เฉพาะในกรณีที่ส่งผ่านพารามิเตอร์ที่เป็นทางเลือก"
มีวิธีใน Python หรือไม่ในการส่งผ่านพารามิเตอร์ที่เป็นทางเลือกไปยังฟังก์ชันในขณะที่เรียกใช้และในนิยามฟังก์ชันจะมีโค้ดบางส่วนตาม "เฉพาะในกรณีที่ส่งผ่านพารามิเตอร์ที่เป็นทางเลือก"
คำตอบ:
งูหลาม 2 เอกสาร7.6 คำจำกัดความของฟังก์ชันช่วยให้คุณสามารถตรวจสอบได้ว่าผู้เรียกใช้พารามิเตอร์เสริมหรือไม่
*ครั้งแรกที่คุณสามารถใช้ไวยากรณ์พิเศษพารามิเตอร์อย่างเป็นทางการ หากนิยามฟังก์ชันมีพารามิเตอร์ที่เป็นทางการนำหน้าด้วยค่าเดียว*Python จะเติมพารามิเตอร์นั้นด้วยพารามิเตอร์ตำแหน่งใด ๆ ที่ไม่ได้จับคู่โดยนำหน้าพารามิเตอร์ที่เป็นทางการ (เป็นทูเพิล) หากนิยามฟังก์ชันมีพารามิเตอร์ที่เป็นทางการนำหน้าด้วย**Python จะเติมพารามิเตอร์นั้นด้วยพารามิเตอร์คีย์เวิร์ดใด ๆ ที่ไม่ได้จับคู่โดยนำหน้าพารามิเตอร์ที่เป็นทางการ (เป็นคำสั่ง) การใช้งานฟังก์ชันสามารถตรวจสอบเนื้อหาของพารามิเตอร์เหล่านี้สำหรับ "พารามิเตอร์ที่เป็นทางเลือก" ของการเรียงลำดับที่คุณต้องการ
ยกตัวอย่างเช่นนี่คือฟังก์ชั่นopt_funซึ่งจะใช้เวลาสองพารามิเตอร์ตำแหน่งx1และx2และรูปลักษณ์สำหรับพารามิเตอร์คำหลักอีกคนหนึ่งชื่อ "ตัวเลือก"
>>> def opt_fun(x1, x2, *positional_parameters, **keyword_parameters):
... if ('optional' in keyword_parameters):
... print 'optional parameter found, it is ', keyword_parameters['optional']
... else:
... print 'no optional parameter, sorry'
...
>>> opt_fun(1, 2)
no optional parameter, sorry
>>> opt_fun(1,2, optional="yes")
optional parameter found, it is yes
>>> opt_fun(1,2, another="yes")
no optional parameter, sorry
ประการที่สองคุณสามารถระบุค่าพารามิเตอร์เริ่มต้นของค่าบางค่าNoneที่ผู้โทรจะไม่ใช้ หากพารามิเตอร์มีค่าเริ่มต้นนี้คุณจะทราบว่าผู้เรียกไม่ได้ระบุพารามิเตอร์ หากพารามิเตอร์มีค่าที่ไม่ใช่ค่าเริ่มต้นแสดงว่ามาจากตัวเรียกใช้
formal parameters preceded by * (เรียกว่าอะไร?) จาก a keyword parameter? ตามที่ฉันเข้าใจแล้วพารามิเตอร์คำหลักจะถูกระบุโดยใช้ตัว=ดำเนินการในการเรียกฟังก์ชัน (ดังนั้นopt_fun(1,2, optional="yes")ให้อาร์กิวเมนต์คำหลัก "ใช่" สำหรับฟังก์ชันที่คาดการณ์ไว้ แต่ไม่จำเป็นต้องใช้พารามิเตอร์option)
formal parameters preceded by * ว่าเป็นเพียง "อาร์กิวเมนต์ที่ระบุโดยผู้โทรซึ่งไม่สอดคล้องกับอาร์กิวเมนต์ตำแหน่งที่อยู่ก่อนอาร์กิวเมนต์คำหลักใด ๆ " ยกตัวอย่างเช่นในopt_fun(1,2, "blah", 3.14, mykey="yes", myyear="2018"), "blah"และ3.14เป็นforma arguments preceded by *เพราะมันอยู่ในระหว่างทั้งสองมีปากเสียงและตำแหน่งอาร์กิวเมนต์ที่ใช้ในการ=เข้าสู่ระบบ tuple ที่ส่งผลให้positional_parameterจะ duple ("blah", 3.14)นี้: ถูกต้องหรือไม่
parameter" not " parameters" for " preceded by *" ภาษาอนุญาตให้ใช้ภาษาเดียว*identifierในรายการพารามิเตอร์ ข) อ่านdocs.python.org/2/reference/...ค) อ่านdocs.python.org/2/reference/expressions.html#calls ขออภัยไม่มีอักขระที่อนุญาตในความคิดเห็นนี้
def my_func(mandatory_arg, optional_arg=100):
print(mandatory_arg, optional_arg)
http://docs.python.org/2/tutorial/controlflow.html#default-argument-values
**kwargsฉันพบนี้อ่านได้มากขึ้นกว่าการใช้
ในการพิจารณาว่ามีการส่งอาร์กิวเมนต์หรือไม่ฉันใช้อ็อบเจ็กต์ยูทิลิตี้ที่กำหนดเองเป็นค่าเริ่มต้น:
MISSING = object()
def func(arg=MISSING):
if arg is MISSING:
...
default_value=100; def my_func(mandatory_argument, optional_argument_with_default_value=default_value): ...
def op(a=4,b=6):
add = a+b
print add
i)op() [o/p: will be (4+6)=10]
ii)op(99) [o/p: will be (99+6)=105]
iii)op(1,1) [o/p: will be (1+1)=2]
Note:
If none or one parameter is passed the default passed parameter will be considered for the function.
op(b=2)
หากคุณต้องการกำหนดค่าเริ่มต้นให้กับพารามิเตอร์กำหนดค่าใน () เช่น (x = 10) แต่สิ่งสำคัญอันดับแรกควรเป็นอาร์กิวเมนต์บังคับตามด้วยค่าเริ่มต้น
เช่น.
(y, x = 10)
แต่
(x = 10, y) ผิด
*arg **kargเป็นอาร์กิวเมนต์ของฟังก์ชัน ค้นหาใน Google
คุณสามารถระบุค่าเริ่มต้นสำหรับอาร์กิวเมนต์ที่เป็นทางเลือกด้วยสิ่งที่จะไม่ส่งผ่านไปยังฟังก์ชันและตรวจสอบด้วยตัวisดำเนินการ:
class _NO_DEFAULT:
def __repr__(self):return "<no default>"
_NO_DEFAULT = _NO_DEFAULT()
def func(optional= _NO_DEFAULT):
if optional is _NO_DEFAULT:
print("the optional argument was not passed")
else:
print("the optional argument was:",optional)
ตราบใดที่คุณไม่func(_NO_DEFAULT)สามารถตรวจสอบได้อย่างแม่นยำว่ามีการส่งผ่านข้อโต้แย้งหรือไม่และไม่เหมือนกับคำตอบที่ยอมรับคุณไม่ต้องกังวลเกี่ยวกับผลข้างเคียงของสัญกรณ์ **:
# these two work the same as using **
func()
func(optional=1)
# the optional argument can be positional or keyword unlike using **
func(1)
#this correctly raises an error where as it would need to be explicitly checked when using **
func(invalid_arg=7)
_NO_DEFAULT = object()เพียงแค่ทำ
help(func)คุณจะได้รับความคิดที่ชัดเจนขึ้นว่าอาร์กิวเมนต์ถูกตีความอย่างไรหากไม่ผ่านอย่างชัดเจน
positional_parametersคือทูเพิลและkeyword_parametersพจนานุกรม