Skip to content
This page has been auto-translated and may contain errors.View in English

फ़ंक्शन्स

जैसे-जैसे आपके प्रोग्राम बढ़ते हैं, आप एक ही लॉजिक को एक से अधिक स्थानों पर लिखेंगे। फ़ंक्शन्स आपको लॉजिक को एक बार लिखने, उसका नाम देने, और हर जगह उपयोग करने की अनुमति देते हैं। इसे एक जगह ठीक करें और हर कॉल को सुधार स्वचालित रूप से मिलेगा।

फ़ंक्शन्स कोड पुन: उपयोग और अमूर्तता की प्राथमिक इकाई हैं। वे एक व्यवहार को समाहित करते हैं, उसे एक नाम देते हैं, एक स्पष्ट इंटरफ़ेस (पैरामीटर्स और रिटर्न वैल्यू) परिभाषित करते हैं, और इसे कहीं से भी कॉल करने योग्य बनाते हैं। अच्छी तरह से नामित फ़ंक्शन्स दस्तावेज़ीकरण के रूप में भी काम करते हैं: validate_email() आपको बताता है कि कोड का एक ब्लॉक क्या करता है बिना इसे पढ़े।

Python में, def एक फ़ंक्शन ऑब्जेक्ट बनाता है और इसे वर्तमान स्कोप में एक नाम से बाइंड करता है। फ़ंक्शन्स प्रथम-श्रेणी के ऑब्जेक्ट हैं: इन्हें वेरिएबल्स को असाइन किया जा सकता है, कलेक्शन्स में संग्रहीत किया जा सकता है, आर्ग्युमेंट्स के रूप में पास किया जा सकता है, और अन्य फ़ंक्शन्स से रिटर्न किया जा सकता है। क्लोज़र्स बाहरी स्कोप से फ्री वेरिएबल्स को कैप्चर करते हैं। इसे समझने से हायर-ऑर्डर प्रोग्रामिंग स्वाभाविक हो जाती है।

python
def greet(name):
    return f"Hello, {name}!"

print(greet("आरव"))   # "Hello, आरव!"
print(greet("प्रिया"))     # "Hello, प्रिया!"

एक बार लिखें, हर जगह उपयोग करें, एक जगह ठीक करें।

एक फ़ंक्शन को परिभाषित करना

def कीवर्ड एक फ़ंक्शन की परिभाषा शुरू करता है, उसके बाद नाम, कोष्ठक, एक कोलन, और एक इंडेंटेड बॉडी आता है। एक फ़ंक्शन तब तक कुछ नहीं करता जब तक आप उसे कॉल नहीं करते। इसे def के साथ परिभाषित करें, फिर इसे () के साथ नाम से कॉल करें।

def एक स्टेटमेंट है जो एक फ़ंक्शन ऑब्जेक्ट बनाता है और इसे वर्तमान स्कोप में दिए गए नाम से बाइंड करता है। बॉडी परिभाषा के समय निष्पादित नहीं होती; यह केवल तब चलती है जब फ़ंक्शन कॉल किया जाता है। return स्टेटमेंट के बिना फ़ंक्शन्स अप्रत्यक्ष रूप से None लौटाते हैं।

def एक यौगिक स्टेटमेंट है जो फ़ंक्शन बॉडी को एक कोड ऑब्जेक्ट में संकलित करता है और वर्तमान नेमस्पेस में नाम के लिए एक नया फ़ंक्शन ऑब्जेक्ट बाइंड करता है। फ़ंक्शन ऑब्जेक्ट अपने कोड ऑब्जेक्ट का संदर्भ, अपने डिफ़ॉल्ट आर्ग्युमेंट वैल्यूज़, और बाहरी स्कोप का संदर्भ (क्लोज़र्स के लिए) संग्रहीत करता है। बॉडी केवल आह्वान पर निष्पादित होती है।

python
def say_hello():
    print("Hello!")

say_hello()   # फ़ंक्शन को कॉल करें

पैरामीटर्स और आर्ग्युमेंट्स

पैरामीटर्स वे इनपुट हैं जिनकी आपका फ़ंक्शन अपेक्षा करता है। उन्हें कोष्ठक के अंदर सूचीबद्ध करें। जब आप फ़ंक्शन को कॉल करते हैं, तो आप जो मान पास करते हैं वे क्रम में पैरामीटर्स से मिलाए जाते हैं।

पैरामीटर्स एक फ़ंक्शन के इंटरफ़ेस को परिभाषित करते हैं। आर्ग्युमेंट्स कॉल के समय पास किए गए ठोस मान हैं। पोज़िशनल आर्ग्युमेंट्स स्थिति से मिलाए जाते हैं; कीवर्ड आर्ग्युमेंट्स नाम से मिलाए जाते हैं। डिफ़ॉल्ट वैल्यूज़ पैरामीटर्स को वैकल्पिक बनाते हैं।

Python में चार पैरामीटर प्रकार हैं: positional-or-keyword (डिफ़ॉल्ट), keyword-only (* के बाद), positional-only (/ से पहले, Python 3.8+), और variadic (*args, **kwargs)। कॉल के समय, पोज़िशनल आर्ग्युमेंट्स बाएं से दाएं बाइंड होते हैं; कीवर्ड आर्ग्युमेंट्स नाम से बाइंड होते हैं। संघर्ष TypeError उठाते हैं। डिफ़ॉल्ट वैल्यूज़ का मूल्यांकन फ़ंक्शन परिभाषा समय पर एक बार होता है, प्रत्येक कॉल पर नहीं।

python
def greet(name, greeting):
    print(f"{greeting}, {name}!")

greet("आरव", "Hello")    # "Hello, आरव!"
greet("प्रिया", "Hi")         # "Hi, प्रिया!"

पैरामीटर्स बनाम आर्ग्युमेंट्स

पैरामीटर फ़ंक्शन परिभाषा में नाम है। आर्ग्युमेंट वह वास्तविक मान है जो आप फ़ंक्शन को कॉल करते समय पास करते हैं। व्यवहार में, लोग इन शब्दों का परस्पर उपयोग करते हैं। बस दस्तावेज़ पढ़ते समय अंतर के बारे में जागरूक रहें।

डिफ़ॉल्ट वैल्यूज़

आप पैरामीटर्स को एक डिफ़ॉल्ट वैल्यू दे सकते हैं। यदि कॉलर वह आर्ग्युमेंट प्रदान नहीं करता है, तो डिफ़ॉल्ट का उपयोग किया जाता है। डिफ़ॉल्ट वाले पैरामीटर्स बिना डिफ़ॉल्ट वाले पैरामीटर्स के बाद आने चाहिए।

डिफ़ॉल्ट वैल्यूज़ पैरामीटर्स को वैकल्पिक बनाते हैं। उनका मूल्यांकन परिभाषा समय पर एक बार होता है, प्रत्येक कॉल पर नहीं। यह म्यूटेबल डिफ़ॉल्ट्स के लिए महत्वपूर्ण है: def f(items=[]) सभी कॉल्स में एक ही लिस्ट साझा करता है। इसका हल None को डिफ़ॉल्ट के रूप में उपयोग करना और फ़ंक्शन बॉडी के अंदर लिस्ट बनाना है।

डिफ़ॉल्ट वैल्यूज़ फ़ंक्शन ऑब्जेक्ट पर f.__defaults__ (पोज़िशनल) और f.__kwdefaults__ (कीवर्ड-ओनली) के रूप में संग्रहीत होते हैं। def निष्पादित होने पर उनका एक बार मूल्यांकन किया जाता है, प्रति कॉल नहीं। म्यूटेबल डिफ़ॉल्ट ट्रैप (def f(x=[])) एक क्लासिक Python गोचा है: लिस्ट एक बार बनाई जाती है और कॉल्स में इन-प्लेस म्यूटेट होती है। मुहावरेदार हल: def f(x=None): if x is None: x = []

python
def greet(name, greeting="Hello"):
    print(f"{greeting}, {name}!")

greet("आरव")           # "Hello, आरव!"
greet("आरव", "Hi")     # "Hi, आरव!"

डिफ़ॉल्ट वाले पैरामीटर्स बिना डिफ़ॉल्ट वाले पैरामीटर्स के बाद आने चाहिए।

कीवर्ड आर्ग्युमेंट्स

किसी फ़ंक्शन को कॉल करते समय, आप आर्ग्युमेंट्स को नाम दे सकते हैं। यह कॉल्स को पढ़ने योग्य बनाता है, विशेष रूप से कई पैरामीटर्स वाले फ़ंक्शन्स के लिए, और आपको उन्हें किसी भी क्रम में पास करने की अनुमति देता है।

कीवर्ड आर्ग्युमेंट्स फ़ंक्शन कॉल्स को स्व-दस्तावेज़ीकृत बनाते हैं। आप पोज़िशनल और कीवर्ड को मिला सकते हैं: पोज़िशनल आर्ग्युमेंट्स पहले आने चाहिए। बूलियन फ़्लैग्स या समान प्रकार के कई पैरामीटर्स वाले फ़ंक्शन्स के लिए, कीवर्ड आर्ग्युमेंट्स गलत क्रम में आर्ग्युमेंट्स पास करने से होने वाली मौन गलतियों को रोकते हैं।

कीवर्ड आर्ग्युमेंट्स नाम से बाइंड होते हैं, स्थिति से नहीं। कॉल के समय पोज़िशनल आर्ग्युमेंट्स को कीवर्ड आर्ग्युमेंट्स से पहले आना चाहिए। एक ही आर्ग्युमेंट को पोज़िशनली और नाम दोनों से पास करना TypeError उठाता है। कीवर्ड-ओनली आर्ग्युमेंट्स को लागू करने के लिए, उन्हें पैरामीटर सूची में एक नंगे * के बाद रखें: def f(a, *, b) b को कीवर्ड-ओनली बनाता है।

python
def describe_player(name, score, level):
    print(f"{name} | Score: {score} | Level: {level}")

describe_player("आरव", 87, 5)                        # पोज़िशनल
describe_player(name="आरव", level=5, score=87)       # कीवर्ड, कोई भी क्रम
describe_player("आरव", level=5, score=87)            # मिक्स: पोज़िशनल पहले

रिटर्न वैल्यूज़

return कॉलर को एक मान वापस भेजता है। return के बिना, एक फ़ंक्शन None वापस देता है। एक बार return चलता है, फ़ंक्शन तुरंत बाहर निकल जाता है। उस ब्लॉक में इसके बाद का कोई भी कोड छोड़ दिया जाता है।

return फ़ंक्शन से बाहर निकलता है और कॉलर को एक मान पास करता है। बिना स्पष्ट return वाला फ़ंक्शन अप्रत्यक्ष रूप से None लौटाता है। return फ़ंक्शन बॉडी में कहीं भी प्रकट हो सकता है और कई बार उपयोग किया जा सकता है; पहला जो पहुंचा वह फ़ंक्शन को समाप्त करता है। यह गार्ड क्लॉज़ के लिए जल्दी रिटर्न को उपयोगी बनाता है।

return एक RETURN_VALUE बाइटकोड उत्सर्जित करता है जो स्टैक के शीर्ष को पॉप करता है और इसे कॉलर के फ़्रेम में सौंपता है। एक फ़ंक्शन जो अंत में गिर जाता है, अप्रत्यक्ष रूप से None लौटाता है। कई return स्टेटमेंट्स ठीक हैं और अक्सर जटिल शर्तों के साथ एकल रिटर्न से साफ़ होते हैं ("जल्दी रिटर्न" पैटर्न)। try ब्लॉक के अंदर return अभी भी किसी भी संबद्ध finally क्लॉज़ को निष्पादित करता है।

python
def add(a, b):
    return a + b

result = add(3, 4)   # result = 7
print(result)

return फ़ंक्शन से तुरंत बाहर भी निकलता है। उस ब्लॉक में इसके बाद का कोई भी कोड नहीं चलता।

कई मान लौटाना

Python आपको कॉमा द्वारा अलग करके कई मान लौटाने की अनुमति देता है। कॉलर उन्हें एक टपल के रूप में प्राप्त करता है और उन्हें एक पंक्ति में अलग-अलग नामों में अनपैक कर सकता है।

कॉमा के साथ कई मान लौटाना उन्हें एक टपल में पैक करता है। कॉलर मिलते-जुलते नामों के साथ अनपैक करता है। यह Python में उन फ़ंक्शन्स के लिए मुहावरेदार है जो स्वाभाविक रूप से एक से अधिक परिणाम उत्पन्न करते हैं। यह एक विशेष सुविधा नहीं है; यह टपल पैकिंग और अनपैकिंग है।

return a, b मानों को निहित पैकिंग के माध्यम से एक टपल में पैक करता है। कॉलर x, y = f() के साथ अनपैक करता है, जो लौटाए गए टपल पर __iter__ को कॉल करता है। टाइप हिंट्स में स्पष्टता के लिए, रिटर्न प्रकार को tuple[int, str] के रूप में एनोटेट करें या एक नामित टपल का उपयोग करें। छोटी संख्या के लिए एक सादा टपल लौटाना ठीक है; दो या तीन से अधिक मानों के लिए, एक नामित टपल या डेटाक्लास पर विचार करें।

python
def min_max(numbers):
    return min(numbers), max(numbers)

low, high = min_max([3, 7, 1, 9, 4])
print(low, high)   # 1 9

low, high = ... सिंटैक्स अनपैकिंग है: Python प्रत्येक लौटाए गए मान को संबंधित नाम को असाइन करता है।

स्कोप

एक फ़ंक्शन के अंदर बनाए गए वेरिएबल्स केवल उस फ़ंक्शन के अंदर मौजूद होते हैं। आप उन्हें बाहर से नहीं देख सकते। सभी फ़ंक्शन्स के बाहर परिभाषित वेरिएबल्स हर जगह दिखाई देते हैं, लेकिन आप उन्हें एक स्पष्ट घोषणा के बिना एक फ़ंक्शन के अंदर से नहीं बदल सकते।

Python में लोकल स्कोप (एक फ़ंक्शन के अंदर), एनक्लोज़िंग स्कोप (नेस्टेड फ़ंक्शन्स के लिए एक बाहरी फ़ंक्शन में), ग्लोबल स्कोप (मॉड्यूल स्तर), और बिल्ट-इन स्कोप होता है। नाम लुकअप उस क्रम में LEGB नियम का पालन करता है। लोकल वेरिएबल्स समान नाम वाले बाहरी वेरिएबल्स को छाया देते हैं। global घोषित करता है कि एक नाम मॉड्यूल-स्तरीय बाइंडिंग को संदर्भित करता है।

Python का LEGB नाम समाधान: Local, Enclosing (closure), Global (module), Built-in। प्रत्येक def एक नया लोकल नेमस्पेस बनाता है। एक ग्लोबल वेरिएबल को पढ़ना स्वचालित रूप से काम करता है; इसे लिखने के लिए लोकल छाया बनाने से बचने के लिए global x की आवश्यकता होती है। nonlocal x निकटतम एनक्लोज़िंग (नॉन-ग्लोबल) स्कोप तक पहुँचता है, जिससे क्लोज़र्स कैप्चर किए गए वेरिएबल्स को म्यूटेट करने में सक्षम होते हैं। global का अति प्रयोग कोड को समझना कठिन बनाता है; पैरामीटर्स और रिटर्न वैल्यूज़ को प्राथमिकता दें।

python
def calculate():
    result = 42   # इस फ़ंक्शन के लिए लोकल
    return result

calculate()
print(result)   # NameError, result यहाँ बाहर मौजूद नहीं है
python
count = 0

def increment():
    global count    # घोषित करें कि आप ग्लोबल को संशोधित करना चाहते हैं
    count += 1

increment()
print(count)   # 1

global का उपयोग अंतिम उपाय होना चाहिए। यह कोड को समझना कठिन बनाता है। मानों को अंदर पास करना और बाहर लौटाना पसंद करें।

*args और **kwargs

कभी-कभी आप नहीं जानते कि एक फ़ंक्शन कितने आर्ग्युमेंट्स प्राप्त करेगा। *args किसी भी संख्या में पोज़िशनल आर्ग्युमेंट्स को एक टपल में एकत्र करता है। **kwargs किसी भी संख्या में कीवर्ड आर्ग्युमेंट्स को एक डिक्शनरी में एकत्र करता है। नाम args और kwargs परंपराएँ हैं; सितारे ही मायने रखते हैं।

*args अतिरिक्त पोज़िशनल आर्ग्युमेंट्स को एक टपल में एकत्र करता है। **kwargs अतिरिक्त कीवर्ड आर्ग्युमेंट्स को एक डिक्ट में एकत्र करता है। दोनों को नियमित पैरामीटर्स के साथ जोड़ा जा सकता है। नियमित पैरामीटर्स पहले आते हैं, फिर *args, फिर कीवर्ड-ओनली पैरामीटर्स, फिर **kwargs। वे रैपर फ़ंक्शन्स के लिए उपयोगी हैं जो आर्ग्युमेंट्स को दूसरे फ़ंक्शन में पास करते हैं।

*args शेष पोज़िशनल आर्ग्युमेंट्स से एक tuple बनाता है। **kwargs शेष कीवर्ड आर्ग्युमेंट्स से एक dict बनाता है। पैरामीटर क्रम: positional-or-keyword, *args, keyword-only, **kwargs। कॉल साइट्स पर, *iterable पोज़िशनल आर्ग्युमेंट्स को अनपैक करता है और **mapping कीवर्ड आर्ग्युमेंट्स को अनपैक करता है। ये सममित हैं: सिग्नेचर में * एकत्र करता है; कॉल साइट पर * अनपैक करता है।

python
def total(*args):
    return sum(args)

total(1, 2, 3)          # 6
total(1, 2, 3, 4, 5)   # 15
python
def display(**kwargs):
    for key, value in kwargs.items():
        print(f"{key}: {value}")

display(name="आरव", score=87, level=5)

आप उन्हें नियमित पैरामीटर्स के साथ मिला सकते हैं। नियमित पैरामीटर्स पहले आते हैं:

python
def describe(title, *tags, **metadata):
    print(f"{title} | tags: {tags} | meta: {metadata}")

describe("Python intro", "beginner", "python", author="आरव", year=2024)

डॉकस्ट्रिंग्स

एक डॉकस्ट्रिंग एक फ़ंक्शन के शीर्ष पर एक स्ट्रिंग है जो वर्णन करती है कि यह क्या करता है। Python संपादक और टूल्स इसका उपयोग तब सहायता दिखाने के लिए करते हैं जब आप किसी फ़ंक्शन कॉल पर होवर करते हैं। ट्रिपल कोट्स का उपयोग करें, और सरल फ़ंक्शन्स के लिए एक पंक्ति लिखें।

डॉकस्ट्रिंग्स f.__doc__ के रूप में संग्रहीत होते हैं और help() द्वारा प्रदर्शित होते हैं। परंपरा एक सारांश पंक्ति है, वैकल्पिक रूप से उसके बाद एक खाली पंक्ति और अधिक विवरण। सार्वजनिक-सामना करने वाले फ़ंक्शन्स के लिए, एक डॉकस्ट्रिंग दस्तावेज़ीकरण है जिसे टूल्स सतह पर ला सकते हैं; यह कई स्थानों से कॉल किए जाने वाली किसी भी चीज़ पर वैकल्पिक नहीं है।

डॉकस्ट्रिंग्स स्ट्रिंग लिटरल हैं जिन्हें किसी फ़ंक्शन, क्लास, या मॉड्यूल बॉडी के पहले स्टेटमेंट के रूप में रखा जाता है। वे ऑब्जेक्ट पर __doc__ के रूप में संग्रहीत होते हैं। PEP 257 परंपराओं को परिभाषित करता है। Sphinx, pydoc, और IDEs जैसे टूल्स सभी __doc__ पर निर्भर करते हैं। डॉकस्ट्रिंग्स में टाइप जानकारी के लिए, Google, NumPy, या Sphinx शैली का उपयोग करें; आधुनिक कोड के लिए डॉकस्ट्रिंग में टाइप एनोटेशन की तुलना में सिग्नेचर में टाइप हिंट्स को प्राथमिकता दी जाती है।

python
def normalise(value, min_val, max_val):
    """Scale a value to the 0-1 range given the known min and max."""
    return (value - min_val) / (max_val - min_val)
python
def build_url(base, version, resource, *, secure=True):
    """
    Build an API endpoint URL.

    Returns a fully-qualified URL string. If secure is False,
    the URL will use http instead of https.
    """
    scheme = "https" if secure else "http"
    base   = base.replace("https://", "").replace("http://", "")
    return f"{scheme}://{base}/{version}/{resource}"

किसी भी ऐसे फ़ंक्शन के लिए डॉकस्ट्रिंग लिखें जो अपने नाम और सिग्नेचर से स्पष्ट रूप से स्व-व्याख्यात्मक नहीं है।

टाइप हिंट्स

टाइप हिंट्स आपको यह एनोटेट करने देते हैं कि एक फ़ंक्शन किन प्रकारों की अपेक्षा करता है और लौटाता है। Python उन्हें रनटाइम पर लागू नहीं करता है, लेकिन संपादक उनका उपयोग कुछ भी चलाने से पहले गलतियों को पकड़ने के लिए करते हैं। कोलन से पहले -> रिटर्न प्रकार निर्दिष्ट करता है।

टाइप हिंट्स दस्तावेज़ीकरण हैं जिन्हें टूल्स सत्यापित करते हैं। संपादक और टाइप चेकर्स (mypy, pyright) रनटाइम से पहले टाइप बेमेल को पकड़ने के लिए उनका उपयोग करते हैं। मानक Python में उनका कोई रनटाइम प्रभाव नहीं है। बिना रिटर्न वैल्यू वाले फ़ंक्शन्स के लिए -> None सही एनोटेशन है। जेनेरिक कंटेनरों के लिए, list[int], dict[str, int] (Python 3.9+) का उपयोग करें।

टाइप हिंट्स को रनटाइम पर typing.get_type_hints() द्वारा प्रसंस्कृत किया जाता है लेकिन निष्पादन पर सीधा प्रभाव नहीं डालता है। स्थैतिक टाइप चेकर्स रनटाइम से पहले उनका विश्लेषण करते हैं। PEP 484 ने एनोटेशन सिस्टम पेश किया; PEP 585 ने Python 3.9+ में typing आयात के बिना list[int] जैसे बिल्ट-इन जेनेरिक्स की अनुमति दी। फ़ंक्शन सिग्नेचर पर -> None दोनों संकेत देता है "कुछ नहीं लौटाता" और "अभिव्यक्ति संदर्भ में उपयोग नहीं किया जाना चाहिए"। जटिल प्रकारों के लिए, typing.Protocol, typing.TypeVar, और typing.overload पूर्ण स्थैतिक टाइपिंग शक्ति देते हैं।

python
def greet(name: str, score: int) -> str:
    return f"{name} scored {score}"
python
def log(message: str) -> None:
    print(f"[LOG] {message}")
python
def top_scores(scores: list[int], n: int) -> list[int]:
    return sorted(scores, reverse=True)[:n]

टाइप हिंट्स वैकल्पिक हैं लेकिन किसी भी फ़ंक्शन पर मूल्यवान हैं जिसे कई स्थानों से कॉल किया जाएगा। वे दस्तावेज़ीकरण हैं जिन्हें टूल्स सत्यापित कर सकते हैं।

मानों के रूप में फ़ंक्शन्स

Python में फ़ंक्शन्स मान हैं, बिल्कुल स्ट्रिंग्स या संख्याओं की तरह। आप उन्हें वेरिएबल्स को असाइन कर सकते हैं और उन्हें अन्य फ़ंक्शन्स को पास कर सकते हैं। इसी तरह sorted() एक key= फ़ंक्शन को स्वीकार करता है।

फ़ंक्शन्स प्रथम-श्रेणी के ऑब्जेक्ट हैं: उनके पास एक प्रकार (function) होता है, उन्हें वेरिएबल्स और कलेक्शन्स में संग्रहीत किया जा सकता है, और आर्ग्युमेंट्स के रूप में पास या मानों के रूप में लौटाया जा सकता है। यह sorted(key=...), map(), और filter() जैसे हायर-ऑर्डर फ़ंक्शन्स का आधार है।

फ़ंक्शन्स function प्रकार के ऑब्जेक्ट हैं जिनमें विशेषताएँ हैं: __name__, __doc__, __annotations__, __defaults__, __code__, और __closure__। वे संदर्भ द्वारा पास किए जाते हैं, कॉपी नहीं किए जाते। एक फ़ंक्शन से एक फ़ंक्शन लौटाना एक क्लोज़र बनाता है यदि आंतरिक फ़ंक्शन बाहरी स्कोप से वेरिएबल्स का संदर्भ देता है: वे वेरिएबल्स f.__closure__ में संग्रहीत होते हैं।

python
def double(x):
    return x * 2

def apply(func, value):
    return func(value)

apply(double, 5)   # 10

आर्ग्युमेंट्स के रूप में फ़ंक्शन्स पास करना sorted(), map(), और filter() के साथ लगातार दिखाई देता है। आप इसे Lambda, comprehensions, and zip अध्याय में भी देखेंगे।

व्यवहार में

दो फ़ंक्शन्स जो एक साथ काम करते हैं: letter_grade एक स्कोर को एक अक्षर में परिवर्तित करता है, और summarise इसे एक सूची में प्रत्येक स्कोर के लिए कॉल करता है:

python
def letter_grade(score: int) -> str:
    if score >= 90:
        return "A"
    elif score >= 80:
        return "B"
    elif score >= 70:
        return "C"
    else:
        return "F"

def summarise(scores: list[int]) -> None:
    total  = sum(scores)
    avg    = total / len(scores)
    grades = [letter_grade(s) for s in scores]
    print(f"Average: {avg:.1f}")
    print(f"Grades: {', '.join(grades)}")

summarise([87, 92, 74, 65, 91])

एक लॉग फ़ॉर्मेटर और एक फ़ाइल प्रोसेसर जो इसका उपयोग करता है, एक dry_run डिफ़ॉल्ट पैरामीटर के साथ जो स्पष्ट रूप से अक्षम होने तक साइड इफ़ेक्ट्स को रोकता है:

python
def format_log(level: str, message: str) -> str:
    return f"[{level.upper():5}] {message}"

def process_file(path: str, dry_run: bool = True) -> bool:
    print(format_log("info", f"Processing {path}"))
    if dry_run:
        print(format_log("info", "Dry run, no changes made"))
        return True
    return True

process_file("report.csv")
process_file("report.csv", dry_run=False)

एक एकल-मान नॉर्मलाइज़र और उसके ऊपर बना एक कॉलम नॉर्मलाइज़र, टाइप हिंट्स और एक डॉकस्ट्रिंग के साथ। कॉलम फ़ंक्शन रेंज की एक बार गणना करता है और प्रत्येक आइटम के लिए स्केलर फ़ंक्शन का पुन: उपयोग करता है:

python
def normalise(value: float, min_val: float, max_val: float) -> float:
    """Scale value to the 0-1 range given known min and max."""
    if max_val == min_val:
        return 0.0
    return (value - min_val) / (max_val - min_val)

def normalise_column(values: list[float]) -> list[float]:
    """Normalise an entire column of values."""
    lo, hi = min(values), max(values)
    return [normalise(v, lo, hi) for v in values]

raw = [10.0, 25.0, 5.0, 40.0, 15.0]
print(normalise_column(raw))

यहाँ टाइप हिंट्स दो उद्देश्यों की पूर्ति करते हैं: वे दस्तावेज़ीकरण करते हैं कि फ़ंक्शन क्या अपेक्षा करता है, और वे एक टाइप चेकर को उन कॉलर्स को पकड़ने देते हैं जो गलती से स्ट्रिंग्स की एक सूची पास करते हैं।