A simple practical example might be sorting a list based on custom criteria. For example, let's say you want to sort a list of strings alphabetically, as opposed to the usual default "ASCIIbetical" order (putting all uppercase letters above all lowercase ones). Under an imperative approach, you would have to use or define a separate sort function that uses a case-insensitive comparison. In a functional language, on the other hand, the sort function can simply accept an optional custom comparison function. Python (which has functional aspects) takes a similar approach, with `sorted()` accepting a "key" function that is called once per element, returning a new value that will be used for comparisons. Here's how we could write our case-insensitive sorting function:
```python
sorted(["Python", "is", "pretty", "COOL"], key=str.lower)
# ["COOL", "is", "pretty", "Python"]
```
Compare that to the default behavior:
```python
sorted(["Python", "is", "pretty", "COOL"])
# ["COOL", "Python", "is", "pretty"]
```
Functions can also be defined dynamically. An example in Python is decorators, which are functions that modify other functions as they're being defined. Here's an example of a decorator that logs function calls:
```python
def autolog(func):
    def wrapper(*args, **kwargs):
        print(f"Function {func.__name__} called")
        ret = func(*args, **kwargs)
        print(f"Returned: {ret}")
        return ret
    return wrapper

@autolog
def say_hi(name):
    print(f"Hi, {name}!")
    return "I just greeted someone!"

say_hi("Greta")
# Function say_hi called
# Hi, Greta!
# Returned: I just greeted someone!
```
Note that the `@` symbol is syntactic sugar for calling the decorator. The following code does the same thing:
```python
def say_hi_unwrapped(name):
    print(f"Hi, {name}!")
    return "I just greeted someone!"

say_hi = autolog(say_hi_unwrapped)
```
ตัวอย่างเชิงปฏิบัติง่ายๆ อาจเป็นการเรียงลำดับรายการตามเกณฑ์ที่กำหนดเอง ตัวอย่างเช่น สมมติว่าคุณต้องการเรียงลำดับรายการสตริงตามตัวอักษร ซึ่งตรงข้ามกับลำดับเริ่มต้น "ASCIIbetical" ตามปกติ (วางอักษรตัวพิมพ์ใหญ่ทั้งหมดไว้เหนือตัวพิมพ์เล็กทั้งหมด) ภายใต้แนวทางที่จำเป็น คุณจะต้องใช้หรือกำหนดฟังก์ชันการเรียงลำดับแยกต่างหากซึ่งใช้การเปรียบเทียบที่ไม่คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ ในทางกลับกัน ในภาษาเชิงฟังก์ชัน ฟังก์ชันการเรียงลำดับสามารถยอมรับฟังก์ชันการเปรียบเทียบแบบกำหนดเองที่เป็นทางเลือกได้ Python (ซึ่งมีแง่มุมด้านการทำงาน) ใช้วิธีการที่คล้ายกัน โดยที่ `sorted()` ยอมรับฟังก์ชัน "key" ที่ถูกเรียกหนึ่งครั้งต่อองค์ประกอบ โดยส่งคืนค่าใหม่ที่จะใช้สำหรับการเปรียบเทียบ ต่อไปนี้คือวิธีที่เราสามารถเขียนฟังก์ชันการเรียงลำดับแบบคำนึงถึงขนาดตัวพิมพ์: ```python sorted(["Python", "is", "pretty", "COOL"], key=str.lower) # ["COOL", "is" ``` เปรียบเทียบสิ่งนั้นกับพฤติกรรมเริ่มต้น: ``` python sorted(["Python", "is", "pretty", "COOL"]) # ["COOL", "Python", "is", "pretty"] ``` ฟังก์ชั่นสามารถกำหนดแบบไดนามิกได้เช่นกัน ตัวอย่างใน Python คือมัณฑนากร ซึ่งเป็นฟังก์ชันที่ปรับเปลี่ยนฟังก์ชันอื่นๆ ตามที่ถูกกำหนดไว้ นี่คือตัวอย่างของมัณฑนากรที่บันทึกการเรียกใช้ฟังก์ชัน: ```python def autolog(func): def wrapper(*args, **kwargs): print(f"Function {func.__name__} called") ret = func(* args, **kwargs) print(f"Returned: {ret}") return ret return wrapper @autolog def say_hi(name): print(f"Hi, {name}!") return "ฉันเพิ่งทักทายใครสักคน!" say_hi("Greta") # ฟังก์ชัน say_hi เรียกว่า # สวัสดีเกรตา! # กลับมาแล้ว: เพิ่งทักทายใครสักคน! ``` โปรดทราบว่าสัญลักษณ์ `@` นั้นเป็นวากยสัมพันธ์ที่ใช้เรียกมัณฑนากร โค้ดต่อไปนี้ทำสิ่งเดียวกัน: ```python def say_hi_unwrapped(name): print(f"Hi, {name}!") return "I just waited someone!" say_hi = autolog(say_hi_unwrapped) ```
spam