Python - ฟังก์ชั่น

ฟังก์ชันคือบล็อกของโค้ดที่จัดระเบียบและใช้ซ้ำได้ซึ่งใช้ในการดำเนินการเดียวที่เกี่ยวข้อง ฟังก์ชั่นให้ความเป็นโมดูลาร์ที่ดีขึ้นสำหรับแอปพลิเคชันของคุณและการนำโค้ดกลับมาใช้ใหม่ในระดับสูง

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

การกำหนดฟังก์ชัน

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

  • บล็อกฟังก์ชันเริ่มต้นด้วยคำสำคัญ def ตามด้วยชื่อฟังก์ชันและวงเล็บ (())

  • พารามิเตอร์อินพุตหรืออาร์กิวเมนต์ใด ๆ ควรอยู่ในวงเล็บเหล่านี้ คุณยังสามารถกำหนดพารามิเตอร์ภายในวงเล็บเหล่านี้

  • คำสั่งแรกของการทำงานอาจเป็นคำสั่งตัวเลือก - สตริงเอกสารของฟังก์ชั่นหรือdocstring

  • บล็อกโค้ดภายในทุกฟังก์ชันเริ่มต้นด้วยเครื่องหมายจุดคู่ (:) และเยื้อง

  • คำสั่งส่งคืน [นิพจน์] ออกจากฟังก์ชันซึ่งเป็นทางเลือกที่จะส่งผ่านนิพจน์กลับไปยังผู้เรียก คำสั่ง return ที่ไม่มีอาร์กิวเมนต์เหมือนกับ return None

ไวยากรณ์

def functionname( parameters ):
   "function_docstring"
   function_suite
   return [expression]

ตามค่าเริ่มต้นพารามิเตอร์จะมีลักษณะการทำงานตามตำแหน่งและคุณต้องแจ้งให้ทราบตามลำดับเดียวกันกับที่กำหนดไว้

ตัวอย่าง

ฟังก์ชันต่อไปนี้รับสตริงเป็นพารามิเตอร์อินพุตและพิมพ์บนหน้าจอมาตรฐาน

def printme( str ):
   "This prints a passed string into this function"
   print str
   return

เรียกใช้ฟังก์ชัน

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

เมื่อสรุปโครงสร้างพื้นฐานของฟังก์ชันแล้วคุณสามารถดำเนินการได้โดยเรียกใช้จากฟังก์ชันอื่นหรือจากพรอมต์ Python โดยตรง ต่อไปนี้เป็นตัวอย่างการเรียกใช้ฟังก์ชัน printme () -

#!/usr/bin/python

# Function definition is here
def printme( str ):
   "This prints a passed string into this function"
   print str
   return;

# Now you can call printme function
printme("I'm first call to user defined function!")
printme("Again second call to the same function")

เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -

I'm first call to user defined function!
Again second call to the same function

ผ่านการอ้างอิงเทียบกับมูลค่า

พารามิเตอร์ทั้งหมด (อาร์กิวเมนต์) ในภาษา Python จะถูกส่งผ่านโดยการอ้างอิง หมายความว่าถ้าคุณเปลี่ยนสิ่งที่พารามิเตอร์อ้างถึงภายในฟังก์ชันการเปลี่ยนแปลงจะสะท้อนกลับในฟังก์ชันการโทรด้วย ตัวอย่างเช่น -

#!/usr/bin/python

# Function definition is here
def changeme( mylist ):
   "This changes a passed list into this function"
   mylist.append([1,2,3,4]);
   print "Values inside the function: ", mylist
   return

# Now you can call changeme function
mylist = [10,20,30];
changeme( mylist );
print "Values outside the function: ", mylist

ที่นี่เรากำลังรักษาการอ้างอิงของวัตถุที่ส่งผ่านและต่อท้ายค่าในวัตถุเดียวกัน ดังนั้นสิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้ -

Values inside the function:  [10, 20, 30, [1, 2, 3, 4]]
Values outside the function:  [10, 20, 30, [1, 2, 3, 4]]

มีอีกหนึ่งตัวอย่างที่อาร์กิวเมนต์ถูกส่งผ่านโดยการอ้างอิงและการอ้างอิงถูกเขียนทับภายในฟังก์ชันที่เรียกว่า

#!/usr/bin/python

# Function definition is here
def changeme( mylist ):
   "This changes a passed list into this function"
   mylist = [1,2,3,4]; # This would assig new reference in mylist
   print "Values inside the function: ", mylist
   return

# Now you can call changeme function
mylist = [10,20,30];
changeme( mylist );
print "Values outside the function: ", mylist

mylistพารามิเตอร์เป็นแบบโลคัลสำหรับการเปลี่ยนแปลงฟังก์ชัน การเปลี่ยนรายการของฉันภายในฟังก์ชันจะไม่มีผลกับรายการของฉัน ฟังก์ชั่นนี้ไม่ทำอะไรเลยและในที่สุดสิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้ -

Values inside the function:  [1, 2, 3, 4]
Values outside the function:  [10, 20, 30]

อาร์กิวเมนต์ของฟังก์ชัน

คุณสามารถเรียกใช้ฟังก์ชันโดยใช้อาร์กิวเมนต์ที่เป็นทางการประเภทต่อไปนี้ -

  • อาร์กิวเมนต์ที่จำเป็น
  • อาร์กิวเมนต์คำหลัก
  • อาร์กิวเมนต์เริ่มต้น
  • อาร์กิวเมนต์ที่มีความยาวตัวแปร

อาร์กิวเมนต์ที่จำเป็น

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

ในการเรียกใช้ฟังก์ชันprintme ()คุณต้องส่งอาร์กิวเมนต์เดียวมิฉะนั้นจะทำให้เกิดข้อผิดพลาดทางไวยากรณ์ดังนี้ -

#!/usr/bin/python

# Function definition is here
def printme( str ):
   "This prints a passed string into this function"
   print str
   return;

# Now you can call printme function
printme()

เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -

Traceback (most recent call last):
   File "test.py", line 11, in <module>
      printme();
TypeError: printme() takes exactly 1 argument (0 given)

อาร์กิวเมนต์คำหลัก

อาร์กิวเมนต์คำหลักเกี่ยวข้องกับการเรียกใช้ฟังก์ชัน เมื่อคุณใช้อาร์กิวเมนต์คำสำคัญในการเรียกใช้ฟังก์ชันผู้เรียกจะระบุอาร์กิวเมนต์ด้วยชื่อพารามิเตอร์

สิ่งนี้ช่วยให้คุณสามารถข้ามอาร์กิวเมนต์หรือไม่เรียงลำดับได้เนื่องจากตัวแปล Python สามารถใช้คีย์เวิร์ดที่ให้มาเพื่อจับคู่ค่ากับพารามิเตอร์ คุณยังสามารถเรียกคีย์เวิร์ดไปยังฟังก์ชัน printme () ได้ด้วยวิธีต่อไปนี้ -

#!/usr/bin/python

# Function definition is here
def printme( str ):
   "This prints a passed string into this function"
   print str
   return;

# Now you can call printme function
printme( str = "My string")

เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -

My string

ตัวอย่างต่อไปนี้ให้ภาพที่ชัดเจนยิ่งขึ้น โปรดทราบว่าลำดับของพารามิเตอร์ไม่สำคัญ

#!/usr/bin/python

# Function definition is here
def printinfo( name, age ):
   "This prints a passed info into this function"
   print "Name: ", name
   print "Age ", age
   return;

# Now you can call printinfo function
printinfo( age=50, name="miki" )

เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -

Name:  miki
Age  50

อาร์กิวเมนต์เริ่มต้น

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

#!/usr/bin/python

# Function definition is here
def printinfo( name, age = 35 ):
   "This prints a passed info into this function"
   print "Name: ", name
   print "Age ", age
   return;

# Now you can call printinfo function
printinfo( age=50, name="miki" )
printinfo( name="miki" )

เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -

Name:  miki
Age  50
Name:  miki
Age  35

อาร์กิวเมนต์ที่มีความยาวตัวแปร

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

ไวยากรณ์สำหรับฟังก์ชันที่มีอาร์กิวเมนต์ตัวแปรที่ไม่ใช่คำสำคัญคือ -

def functionname([formal_args,] *var_args_tuple ):
   "function_docstring"
   function_suite
   return [expression]

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

#!/usr/bin/python

# Function definition is here
def printinfo( arg1, *vartuple ):
   "This prints a variable passed arguments"
   print "Output is: "
   print arg1
   for var in vartuple:
      print var
   return;

# Now you can call printinfo function
printinfo( 10 )
printinfo( 70, 60, 50 )

เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -

Output is:
10
Output is:
70
60
50

ที่ไม่เปิดเผยตัวฟังก์ชั่น

ฟังก์ชันเหล่านี้เรียกว่า anonymous เนื่องจากไม่ได้ประกาศในลักษณะมาตรฐานโดยใช้คำสำคัญdef คุณสามารถใช้คีย์เวิร์ดแลมบ์ดาเพื่อสร้างฟังก์ชันที่ไม่ระบุตัวตนขนาดเล็ก

  • รูปแบบแลมบ์ดาสามารถรับอาร์กิวเมนต์จำนวนเท่าใดก็ได้ แต่ส่งคืนค่าเพียงค่าเดียวในรูปแบบของนิพจน์ ไม่สามารถมีคำสั่งหรือหลายนิพจน์

  • ฟังก์ชันที่ไม่ระบุชื่อไม่สามารถเรียกโดยตรงเพื่อพิมพ์ได้เนื่องจากแลมบ์ดาต้องการนิพจน์

  • ฟังก์ชันแลมบ์ดามีเนมสเปซโลคัลของตนเองและไม่สามารถเข้าถึงตัวแปรอื่นนอกเหนือจากที่อยู่ในรายการพารามิเตอร์และในเนมสเปซส่วนกลาง

  • แม้ว่าแลมบ์ดาจะเป็นฟังก์ชันเวอร์ชันบรรทัดเดียว แต่ก็ไม่เทียบเท่ากับคำสั่งแบบอินไลน์ใน C หรือ C ++ ซึ่งมีจุดประสงค์โดยการส่งผ่านการจัดสรรฟังก์ชันสแต็กระหว่างการเรียกใช้เพื่อเหตุผลด้านประสิทธิภาพ

ไวยากรณ์

ไวยากรณ์ของฟังก์ชันแลมบ์ดามีเพียงคำสั่งเดียวซึ่งมีดังต่อไปนี้ -

lambda [arg1 [,arg2,.....argn]]:expression

ต่อไปนี้เป็นตัวอย่างเพื่อแสดงให้เห็นว่ารูปแบบของฟังก์ชันแลมด้าทำงานอย่างไร -

#!/usr/bin/python

# Function definition is here
sum = lambda arg1, arg2: arg1 + arg2;

# Now you can call sum as a function
print "Value of total : ", sum( 10, 20 )
print "Value of total : ", sum( 20, 20 )

เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -

Value of total :  30
Value of total :  40

ผลตอบแทนงบ

คำสั่งส่งคืน [นิพจน์] ออกจากฟังก์ชันซึ่งเป็นทางเลือกที่จะส่งผ่านนิพจน์กลับไปยังผู้เรียก คำสั่ง return ที่ไม่มีอาร์กิวเมนต์เหมือนกับ return None

ตัวอย่างทั้งหมดข้างต้นไม่ส่งคืนค่าใด ๆ คุณสามารถคืนค่าจากฟังก์ชันได้ดังนี้ -

#!/usr/bin/python

# Function definition is here
def sum( arg1, arg2 ):
   # Add both the parameters and return them."
   total = arg1 + arg2
   print "Inside the function : ", total
   return total;

# Now you can call sum function
total = sum( 10, 20 );
print "Outside the function : ", total

เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -

Inside the function :  30
Outside the function :  30

ขอบเขตของตัวแปร

ตัวแปรทั้งหมดในโปรแกรมอาจไม่สามารถเข้าถึงได้จากทุกตำแหน่งในโปรแกรมนั้น ขึ้นอยู่กับตำแหน่งที่คุณประกาศตัวแปร

ขอบเขตของตัวแปรจะกำหนดส่วนของโปรแกรมที่คุณสามารถเข้าถึงตัวระบุเฉพาะได้ มีขอบเขตพื้นฐานสองประการของตัวแปรใน Python -

  • ตัวแปรส่วนกลาง
  • ตัวแปรท้องถิ่น

ตัวแปรส่วนกลางเทียบกับท้องถิ่น

ตัวแปรที่กำหนดไว้ภายในเนื้อความของฟังก์ชันมีขอบเขตภายในและตัวแปรที่กำหนดไว้ภายนอกมีขอบเขตส่วนกลาง

ซึ่งหมายความว่าตัวแปรโลคัลสามารถเข้าถึงได้เฉพาะภายในฟังก์ชันที่มีการประกาศเท่านั้นในขณะที่ตัวแปรส่วนกลางสามารถเข้าถึงได้ทั่วทั้งเนื้อหาของโปรแกรมโดยฟังก์ชันทั้งหมด เมื่อคุณเรียกใช้ฟังก์ชันตัวแปรที่ประกาศภายในจะถูกนำเข้าสู่ขอบเขต ต่อไปนี้เป็นตัวอย่างง่ายๆ -

#!/usr/bin/python

total = 0; # This is global variable.
# Function definition is here
def sum( arg1, arg2 ):
   # Add both the parameters and return them."
   total = arg1 + arg2; # Here total is local variable.
   print "Inside the function local total : ", total
   return total;

# Now you can call sum function
sum( 10, 20 );
print "Outside the function global total : ", total

เมื่อดำเนินการโค้ดด้านบนจะให้ผลลัพธ์ดังนี้ -

Inside the function local total :  30
Outside the function global total :  0