आज maths छोड़कर code की तरफ आया। Kaggle के “Intro to Programming” module से — arithmetic, variables, functions, booleans, data types, सब एक ही बैठक में।
सच बताऊँ तो functions पर अटका। और float की एक बात ने ठीक-ठाक चौंका दिया।
Function क्या है
मैं इसे machine की तरह सोचता हूँ। एक बार बनाओ, फिर बार-बार चलाओ।
जैसे claims का TAT — intimation से decision तक कितने दिन लगे। एक बार बना दो:
def tat_days(intimation, decision):
return decision - intimation
बस इतना लिखने से कुछ नहीं होता। यह सिर्फ definition है, machine बनकर एक तरफ रखी है। चलती तब है जब आप उसे call करते हैं:
tat_days(10, 25) # 15 लौटाएगा tat_days(3, 40) # 37 लौटाएगा
एक बार बनाई, हज़ार claims पर चला दी। मुझे यह बात पसंद आई।
जहाँ मैं अटका
intimation और decision — definition में ये बस खाली डिब्बे हैं। नाम रख दिए, अंदर कुछ नहीं।
असली value तब भरती है जब आप call करते हैं। और Python भरता है position से, नाम से नहीं:
पहला डिब्बा ← पहली value: intimation = 10 दूसरा डिब्बा ← दूसरी value: decision = 25
यहीं मेरी उलझन थी। मुझे लगा नाम मायने रखता होगा। रखता नहीं। मान लीजिए मैंने गलती से tat_days(25, 10) लिख दिया — Python चुपचाप 25 को intimation मान लेगा, 10 को decision, और 10 − 25 = −15 थमा देगा। कोई error नहीं, कोई चेतावनी नहीं। उसे नहीं पता आपने उल्टा कर दिया।
नाम मेरे पढ़ने के लिए हैं। Python सिर्फ गिनता है — पहला, दूसरा। यह बात दिमाग में बैठने में थोड़ा वक्त लगा।
Boolean
सबसे सीधी चीज़। सिर्फ True या False, और कुछ नहीं। एक switch समझ लीजिए।
is_early = True is_metro = False
पर मज़े की बात यह है कि True/False आप खुद कम ही लिखते हैं। ये comparison से अपने आप निकलते हैं:
rcd_to_death = 400 rcd_to_death < 1095 # True — early claim rcd_to_death > 2000 # False
और if इन्हीं पर टिका है:
if rcd_to_death < 1095:
print("Early claim — investigate")
True तो अंदर वाला चलेगा, False तो छूट जाएगा।
जब मैंने and, or, not देखा तो एक बात क्लिक हुई। मेरे काम में जो fraud pattern है — young, unmarried, nominee माँ-बाप या भाई, और claim early — वो असल में यही है। बस चार booleans and से जुड़े हुए:
young and unmarried and parent_nominee and is_early
सब सच हों तभी flag उठे। बरसों से यह चीज़ मैं सिर पर करता आया हूँ, और अब दिख रहा है कि code में यह बस एक line है।
Float वाला धोखा
आज की सबसे मज़ेदार चीज़। मैंने यूँ ही यह चला दिया:
x = round(100/3, 100) print(x)
100 decimal places माँगे थे। मिला यह:
33.33333333333336
14 digit के आसपास, 100 कहीं नहीं। और गौर कीजिए आखिर में ...336 — जबकि 100/3 तो 33.333… अनंत तक जाता है।
बात यह है कि एक float सिर्फ 15-16 digit तक ही संभाल सकता है। उससे आगे कुछ है ही नहीं जिसे round करे। तो 100 माँगने का कोई मतलब नहीं — जो precision कभी store ही नहीं हुई, वो आएगी कहाँ से।
यही चीज़ इसके पीछे भी है:
0.1 + 0.2 # 0.30000000000000004
पहली बार देखो तो लगता है bug है। है नहीं। 0.1 को computer binary में पूरा-पूरा रख ही नहीं सकता, ठीक वैसे जैसे हम 1/3 को decimal में पूरा नहीं लिख सकते। छोटी सी गड़बड़ी बहुत पीछे 17वें digit पर बैठ जाती है।
मेरे काम के लिए सीख इतनी है — पैसा 2 decimal पर, ratio 2 से 4 पर, और float को कभी == से मत जाँचो। बाकी अभी सिर पर मत लो।
एक बात AI की
Colab में Gemini का panel खुला पड़ा था। मैं अभी अपना error खुद ढूँढ भी नहीं पाया था कि उसने “ठीक” कर दिया।
मैंने पैनल बंद कर दिया।
सीखते वक्त वो error ही तो असली चीज़ है। AI पहले ही सुधार दे तो मैं बस उसका जवाब पढ़ता रह जाऊँगा — दिमाग अपना नहीं लगेगा। खुद लिखो, खुद तोड़ो, खुद ठीक करो। तभी हाथ बैठता है।
पता है यह अजीब लगता है — एक AI सीखने वाला blog आपसे कह रहा है कि AI कम इस्तेमाल करो। पर शुरुआत में मुझे यही सही लगता है।
आगे
अगली बार Kaggle का Pandas। असली मज़ा वहीं है — यही सब claims data पर लगेगा। CSV पढ़ना, filter, group। जो अब तक theory थी वो वहाँ काम बनेगी।
