অধ্যায় 2 · Python-এর মৌলিক বিষয়
ফাংশন
- পৃষ্ঠা 7 / 20
- 4 মিনিট পড়া
প্রোগ্রাম বড় হতে থাকলে দেখবেন একই কয়েকটা লাইন বারবার লিখছেন। ফাংশন সেই লাইনগুলোকে একটা নাম দেয়, যাতে এক ডাকেই যেকোনো জায়গায় ব্যবহার করা যায়। ফাংশন দিয়েই বড় একটা সমস্যা — "ডকুমেন্ট থেকে প্রশ্নোত্তরের টুল বানাও" — ছোট ছোট অংশে ভাগ করা হয়, যেগুলো একটা একটা করে বোঝা আর পরীক্ষা করা যায়।
ফাংশন বানানো আর ডাকা
def count_words(text):
"""Return the number of words in text."""
return len(text.split())
print(count_words("Python makes AI work easier"))
print(count_words("Hello"))5
1defদিয়ে সংজ্ঞা শুরু হয়, তারপর নাম আর বন্ধনীর ভেতরে প্যারামিটার।- ইনডেন্ট করা অংশটা হলো বডি। ফাংশন ডাকলেই কেবল এটা চলে।
returnযে ফাংশনটা ডেকেছে, তার কাছে একটা মান ফেরত পাঠায়।def-এর ঠিক নিচে তিন উদ্ধৃতির ভেতরের লেখাটা ডকস্ট্রিং: ডকুমেন্টেশন, যা ফাংশনের ওপর মাউস রাখলে এডিটর দেখায়। অন্যকে দেবেন এমন প্রতিটা ফাংশনে একটা লিখুন।
প্যারামিটার, ডিফল্ট মান আর কিওয়ার্ড আর্গুমেন্ট
প্যারামিটারের ডিফল্ট মান থাকতে পারে, যা ব্যবহার হয় যখন ডাকার সময় কেউ মান দেয় না। আর্গুমেন্ট দেওয়া যায় অবস্থান অনুযায়ী অথবা নাম ধরে (কিওয়ার্ড আর্গুমেন্ট)। নাম দিয়ে দিলে কলটা নিজেই নিজেকে ব্যাখ্যা করে — প্রতিটা AI SDK এটা প্রচুর ব্যবহার করে:
def build_prompt(task, text, language="English", max_words=50):
return f"{task} the text below. Answer in {language}, in at most {max_words} words.\n{text}"
print(build_prompt("Summarise", "Python is a programming language..."))
print()
print(build_prompt("Translate", "Good morning", language="Bangla", max_words=10))Summarise the text below. Answer in English, in at most 50 words.
Python is a programming language...
Translate the text below. Answer in Bangla, in at most 10 words.
Good morning(স্ট্রিংয়ের ভেতরে \n মানে "নতুন লাইন"।)
একাধিক মান ফেরত দেওয়া
একটা ফাংশন একসাথে কয়েকটা মান ফেরত দিতে পারে — Python সেগুলোকে একটা টাপলে ভরে দেয়, আর অন্য পাশে আপনি আনপ্যাক করে নেন:
def stats(numbers):
total = sum(numbers)
return min(numbers), max(numbers), total / len(numbers)
low, high, mean = stats([4, 8, 15, 16, 23, 42])
print(low, high, round(mean, 2))4 42 18.0print আর return এক নয়
নতুনদের খুব সাধারণ একটা গোলমাল। print স্ক্রিনে কিছু দেখায়; return কোডের কাছে একটা মান ফেরত দেয়। return না থাকলে ফাংশন ফেরত দেয় None, Python-এর "কিছুই না" মান:
def greet(name):
print("Hi", name) # প্রিন্ট করে, কিন্তু কিছু ফেরত দেয় না
result = greet("Mina")
print(result)Hi Mina
Noneফাংশনের ফলাফল পরে ব্যবহার করতে চাইলে — রাখা, তুলনা করা, API-তে পাঠানো — ফাংশনকে সেটা return করতেই হবে।
স্কোপ: ভেরিয়েবল কোথায় থাকে
ফাংশনের ভেতরে বানানো ভেরিয়েবল লোকাল: ফাংশন চলার সময়টুকুই তার অস্তিত্ব। ফাংশন বাইরের (গ্লোবাল) ভেরিয়েবল পড়তে পারে, কিন্তু বাইরে থেকে তার লোকাল ভেরিয়েবল দেখা যায় না:
limit = 100 # একটা গ্লোবাল ভেরিয়েবল
def check(tokens):
remaining = limit - tokens # remaining শুধু ফাংশনের ভেতরেই আছে
return remaining
print(check(30))
print(remaining)70
Traceback (most recent call last):
File "main.py", line 8, in <module>
print(remaining)
^^^^^^^^^
NameError: name 'remaining' is not definedভালো ফাংশন যা দরকার সব প্যারামিটার দিয়ে পায় আর ফলাফল return দিয়ে ফেরত দেয়, গ্লোবাল পড়া-বদলানোর বদলে। এমন ফাংশন পরীক্ষা করা আর আবার ব্যবহার করা সহজ।
*args আর **kwargs
*name লেখা প্যারামিটার বাড়তি অবস্থানভিত্তিক আর্গুমেন্টগুলো একটা টাপলে জড়ো করে; **name বাড়তি কিওয়ার্ড আর্গুমেন্টগুলো একটা dict-এ। লাইব্রেরির কোডে এই প্যাটার্ন দেখবেন:
def log(level, *messages, **details):
print(level, "|", " ".join(messages), "|", details)
log("INFO", "Request", "sent")
log("ERROR", "Timeout", model="gpt-5.5", seconds=30)INFO | Request sent | {}
ERROR | Timeout | {'model': 'gpt-5.5', 'seconds': 30}lambda: নামহীন ছোট্ট ফাংশন
lambda arguments: expression এক লাইনে একটা ছোট ফাংশন বানায়। এর সবচেয়ে সাধারণ ব্যবহার হলো sorted(), max() বা min()-কে কী তুলনা করতে হবে তা বলে দেওয়ার key হিসেবে — এখানে সার্চের ফলাফল স্কোর অনুযায়ী সাজানো:
results = [("doc-a", 0.62), ("doc-b", 0.91), ("doc-c", 0.75)]
best_first = sorted(results, key=lambda pair: pair[1], reverse=True)
print(best_first)
names = sorted(["Mina", "abir", "Zara"], key=str.lower)
print(names)[('doc-b', 0.91), ('doc-c', 0.75), ('doc-a', 0.62)]
['abir', 'Mina', 'Zara']একটা ক্লাসিক বাগ: পরিবর্তনযোগ্য ডিফল্ট মান
ডিফল্ট মান তৈরি হয় একবারই, ফাংশন সংজ্ঞায়িত করার সময় — প্রতিবার ডাকার সময় নয়। তাই ডিফল্ট হিসেবে দেওয়া লিস্ট সব কলের মধ্যে ভাগাভাগি হয়ে যায়:
def add_tag(tag, tags=[]): # ভবিষ্যতের একটা বাগ
tags.append(tag)
return tags
print(add_tag("ai"))
print(add_tag("python")) # চমক: "ai" এখনো আছে
def add_tag_fixed(tag, tags=None):
if tags is None:
tags = []
tags.append(tag)
return tags
print(add_tag_fixed("ai"))
print(add_tag_fixed("python"))['ai']
['ai', 'python']
['ai']
['python']নিয়ম: লিস্ট বা dict কখনো ডিফল্ট মান হিসেবে দেবেন না। None দিন, আর ফাংশনের ভেতরে লিস্টটা বানান।
নিজে চেষ্টা করুন
estimate_tokens(text)লিখুন, যা মোটামুটিlen(text) / 4ফেরত দেয়, ওপরের দিকে রাউন্ড করে (ইংরেজির জন্য OpenAI-এর হিসাব মোটামুটি প্রতি টোকেনে ৪টা অক্ষর)।make_message(role, content)লিখুন, যা একটা মেসেজ dict ফেরত দেয়, আর সেটা দিয়ে একটা কথোপকথনের লিস্ট বানান।- (name, score) টাপলের একটা লিস্ট থেকে lambda সহ
max()দিয়ে সবচেয়ে ভালোটা বের করুন।