ల్యాంబ్డా, రికర్షన్ & ఫంక్షనల్ ప్రోగ్రామింగ్
def అని పేరు పెట్టి, నాలుగైదు లైన్ల కోడ్ రాయడం కాస్త భారంగా అనిపించిందా? లేదా లక్షల రికార్డులు ఉన్న డేటాసెట్పై లూప్లు రాయకుండా, అత్యంత క్లీన్గా ఒక ఫంక్షనల్ పైప్లైన్ ద్వారా డేటాను ఫిల్టర్ చేసి, మార్పిడి చేసి, సారాంశాన్ని బయటకు తీయాలనుకుంటున్నారా?
ఇక్కడే మనకు ఫంక్షనల్ ప్రోగ్రామింగ్ (Functional Programming) పారడైమ్ పరిచయం అవుతుంది! పైథాన్లో పేర్లు లేని అజ్ఞాత ఫంక్షన్లను రెప్పపాటులో సృష్టించే
lambda ఎక్స్ప్రెషన్లు, డేటా స్ట్రీమ్లను ప్రాసెస్ చేసే పవిత్ర త్రిమూర్తులు map(), filter(), reduce(), మరియు ఒక పెద్ద సమస్యను తనంతట తానే పిలుచుకుంటూ పరిష్కరించే కళాత్మక విధానం రికర్శన్ (Recursion) ప్రోగ్రామర్కు అపరిమితమైన ఆలోచనా స్వేచ్ఛను ఇస్తాయి. ఈ అధ్యాయంలో మనం ఈ ఫంక్షనల్ ఆయుధాలన్నింటినీ అన్వేషిస్తూ, బ్యాంకింగ్ లావాదేవీలలో మోసాలను గుర్తించే పూర్తి స్థాయి ఫ్రాడ్ డిటెక్షన్ పైప్లైన్ ప్రాజెక్ట్ను నిర్మిద్దాం!
1 ఫంక్షనల్ ప్రోగ్రామింగ్ అంటే ఏమిటి? (Functional Programming Paradigm)
పైథాన్ అనేది ఒక మల్టీ-పారడైమ్ (Multi-paradigm) ప్రోగ్రామింగ్ లాంగ్వేజ్. అంటే ఇందులో ఆబ్జెక్ట్ ఓరియెంటెడ్ కోడింగ్ చేయవచ్చు, అలాగే గణిత ఆధారిత ఫంక్షనల్ ప్రోగ్రామింగ్ (FP) శైలిని కూడా పూర్తి స్థాయిలో అనుసరించవచ్చు.
ఫంక్షనల్ ప్రోగ్రామింగ్ యొక్క ముఖ్య స్తంభాలు:
- First-Class Functions: పైథాన్లో ఫంక్షన్స్ అనేవి సాధారణ వేరియబుల్స్ లాంటివే. ఒక ఫంక్షన్ను వేరియబుల్కు అసైన్ చేయవచ్చు, మరొక ఫంక్షన్కు ఆర్గ్యుమెంట్గా పంపవచ్చు, లేదా ఫంక్షన్ నుండి రిటర్న్ చేయవచ్చు.
- Pure Functions (స్వచ్ఛమైన ఫంక్షన్లు): ఒకే ఇన్పుట్ ఇస్తే ఎల్లప్పుడూ ఒకే ఔట్పుట్ ఇచ్చే ఫంక్షన్లు. ఇవి బయటి గ్లోబల్ వేరియబుల్స్ను మార్చవు (No Side-Effects). ఇది టెస్టింగ్ మరియు మల్టీ-కోర్ కాన్కరెన్సీని ఎంతో సులభతరం చేస్తుంది.
- ఇమ్మ్యుటబిలిటీ (Immutability): డేటాను అక్కడికక్కడే మార్చడానికి బదులుగా, పాత డేటా ఆధారంగా సరికొత్త డేటా కలెక్షన్ను రూపొందించడం.
def add_tax(price, tax_rate=0.18):
return price + (price * tax_rate)
# అపవిత్రమైన ఫంక్షన్ (Impure): బయటి గ్లోబల్ స్టేట్ను మారుస్తుంది!
cart_total = 0
def impure_add(price):
global cart_total
cart_total += price # Side effect!
2 ల్యాంబ్డా ఫంక్షన్స్ అంటే ఏమిటి? (Anonymous Functions)
పైథాన్లో def కీవర్డ్ లేకుండా, పేరు లేకుండా ఒకే ఒక్క లైన్లో రాసే చిన్న ఫంక్షన్లను ల్యాంబ్డా ఫంక్షన్స్ (Lambda Functions / Anonymous Functions) అంటారు.
ప్రాథమిక సింటాక్స్:
lambda arguments: expression
- ల్యాంబ్డా ఎన్ని ఆర్గ్యుమెంట్లనైనా స్వీకరించగలదు (కామాలతో వేరుచేసి).
- కానీ అందులో కేవలం ఒకే ఒక్క ఎక్స్ప్రెషన్ మాత్రమే ఉండాలి! ఇందులో లూప్లు (for, while), మల్టీ-లైన్ స్టేట్మెంట్లు, లేదా
returnకీవర్డ్ రాయకూడదు. ఎక్స్ప్రెషన్ యొక్క ఫలితం స్వయంచాలకంగా రిటర్న్ అవుతుంది. - టర్నరీ ఆపరేటర్ సపోర్ట్ (Conditional Expressions): ల్యాంబ్డాలో if-else వాడటానికి సింగిల్ లైన్ టర్నరీ సింటాక్స్ వాడాలి:
classify_age = lambda age: 'మేజర్' if age >= 18 else 'మైనర్'
3 lambda ఎప్పుడు వాడాలి? PEP 8 గోల్డెన్ రూల్స్
పైథాన్ అధికారిక స్టైల్ గైడ్ PEP 8 ప్రకారం, ల్యాంబ్డా ఫంక్షన్లను వేరియబుల్స్కు బైండ్ చేయడానికి వాడకూడదు (ఉదా: f = lambda x: x*2 అని రాయడానికి బదులుగా def f(x): return x*2 రాయాలి).
ల్యాంబ్డా వాడటానికి సరైన సందర్భాలు:
sorted(),min(),max()లలోkey=ఫంక్షన్గా:sorted(users, key=lambda u: u["age"])map()మరియుfilter()లలో ఒకేసారి క్విక్గా ఆపరేషన్ చేయడానికి.- GUI లేదా ఈవెంట్ డ్రైవెన్ ప్రోగ్రామింగ్లో చిన్న కాల్బ్యాక్స్ (Callbacks) రూపంలో.
4 map() ఫంక్షన్ — లేజీ ఎవాల్యుయేషన్ & డేటా ట్రాన్స్ఫార్మేషన్
map(func, iterable, ...) అనేది ఒక కలెక్షన్లోని ప్రతి ఒక్క ఎలిమెంట్పై పేర్కొన్న ఫంక్షన్ను అప్లై చేసి ఫలితాలను అందిస్తుంది.
- లేజీ ఎవాల్యుయేషన్ (Lazy Evaluation) మ్యాజిక్:
map()తక్షణమే మొత్తం లిస్ట్ను మెమరీలో క్రియేట్ చేయదు! అది పైథాన్ ఇటరేటర్ (Iterator) ను రిటర్న్ చేస్తుంది. మనంnext()అని అడిగినప్పుడు లేదాforలూప్లో తిరిగినప్పుడు మాత్రమే ఒక్కొక్క ఎలిమెంట్ను ఆన్-డిమాండ్ (Run-time on the fly) కాలిక్యులేట్ చేస్తుంది. ఫలితంగా 10 కోట్ల రికార్డులను ప్రాసెస్ చేస్తున్నప్పుడు కూడా రామ్ (RAM) మెమరీ ఏమాత్రం నిండదు! - మల్టిపుల్ ఇటరబుల్స్ సపోర్ట్:
map()లోకి ఒకేసారి రెండు వేర్వేరు లిస్ట్లను పాస్ చేయవచ్చు:prices = [100, 200, 300]
taxes = [18, 36, 54]
totals = list(map(lambda p, t: p + t, prices, taxes)) # [118, 236, 354]
5 filter() ఫంక్షన్ — ప్రిడికేట్-బేస్డ్ షరతులతో కూడిన వడపోత
filter(predicate_func, iterable) అనేది ఇచ్చిన షరతును (Boolean Predicate) సంతృప్తిపరిచే ఎలిమెంట్లను మాత్రమే వడపోసి కొత్త ఇటరేటర్గా అందిస్తుంది. ఫంక్షన్ ఏ ఎలిమెంట్లకు అయితే True ఇస్తుందో వాటిని మాత్రమే ఉంచి, False లేదా ఫాల్సీ విలువలను తుడిచిపెడుతుంది.
raw_inputs = ["హైదరాబాద్", "", None, "విజయవాడ", False, "తిరుపతి"]
clean_cities = list(filter(None, raw_inputs)) # ఫంక్షన్ స్థానంలో None పెడితే ట్రూతీ విలువలు మాత్రమే వస్తాయి!
print("క్లీన్ సిటీస్ :", clean_cities) # ['హైదరాబాద్', 'విజయవాడ', 'తిరుపతి']
6 functools.reduce() — డేటా అక్యుములేషన్ & రోలింగ్ కంప్యూటేషన్
reduce(func, iterable, [initializer]) అనేది కలెక్షన్లోని అంశాలను వరుసగా రెండేసి చొప్పున తీసుకుని ఫంక్షన్ అప్లై చేస్తూ, చివరికి మొత్తం డేటాను ఒకే ఒక్క విలువగా (సింగిల్ అక్యుములేటెడ్ వాల్యూ) కుదిస్తుంది.
అక్యుములేషన్ ఎలా పనిచేస్తుందో చూపే డయాగ్రమ్:
దశ 1: func(1, 2) ──▶ 3
దశ 2: func(3, 3) ──▶ 6
దశ 3: func(6, 4) ──▶ 10 (చివరి ఫలితం!)
⚠️ Initializer ఎందుకు ముఖ్యం: ఖాళీ లిస్ట్పై reduce వాడితే TypeError రాకుండా
reduce(func, [], 0) అని ఇనిషియలైజర్ ఇవ్వడం ప్రొడక్షన్ బెస్ట్ ప్రాక్టీస్!
7 కోడ్ డెమో 1: map(), filter(), reduce() తో డేటా పైప్లైన్
ఉద్యోగుల శాలరీ డేటా నుండి పన్ను మినహాయింపులు చేసి, అర్హులైన వారి మొత్తం వ్యయాన్ని లెక్కించే పైప్లైన్ డెమో:
# =====================================================================
# చాప్టర్ 18 డెమో 1: map(), filter(), reduce() ఫంక్షనల్ పైప్లైన్
# =====================================================================
from functools import reduce
salaries = [45000, 72000, 38000, 110000, 95000, 28000]
# 1. FILTER: ₹50,000 కంటే ఎక్కువ జీతం ఉన్నవారిని మాత్రమే ఎంపిక చేయడం
high_earners = list(filter(lambda s: s >= 50000, salaries))
print("1. అర్హులైన జీతాలు (>= 50k) :", high_earners)
# 2. MAP: 10% కార్పొరేట్ హైక్ ఇవ్వడం (1.10 తో గుణించడం)
hiked_salaries = list(map(lambda s: round(s * 1.10), high_earners))
print("2. 10% హైక్ తర్వాత జీతాలు :", hiked_salaries)
# 3. REDUCE: మొత్తం కంపెనీ చెల్లించాల్సిన బడ్జెట్ అక్యుములేషన్
total_payroll = reduce(lambda acc, s: acc + s, hiked_salaries, 0)
print(f"3. మొత్తం బడ్జెట్ వ్యయం : ₹{total_payroll:,.2f}")
8 రికర్షన్ అంటే ఏమిటి? (What is Recursion in Python?)
ఒక ఫంక్షన్ తన పనిని పూర్తి చేయడానికి తనను తానే పిలుచుకునే (Self-Referential) ప్రోగ్రామింగ్ పద్ధతిని రికర్శన్ (Recursion) అంటారు.
ప్రతి రికర్సివ్ ఫంక్షన్లో రెండు విభాగాలు తప్పనిసరి:
- 1. బేస్ కేస్ (Base Case): రికర్షన్ ఎక్కడ ఆగిపోవాలో నిర్ణయించే అత్యంత కీలకమైన నిష్క్రమణ షరతు (Exit Condition). ఇది లేకపోతే ఫంక్షన్ అనంతంగా తనను తాను పిలుచుకుంటూ వెళ్లిపోతుంది.
- 2. రికర్సివ్ కేస్ (Recursive Case): సమస్యను ఒక చిన్న ఉప-సమస్యగా (Sub-problem) తగ్గించి, తిరిగి అదే ఫంక్షన్ను కాల్ చేసే విభాగం.
9 రికర్షన్ & కాల్ స్టాక్ ఆర్కిటెక్చర్ (sys.getrecursionlimit())
ప్రతి రికర్సివ్ కాల్కూ ఒక సరికొత్త స్టాక్ ఫ్రేమ్ మెమరీలో స్టోర్ అవుతుంది. బేస్ కేస్ తగిలేంతవరకు ఆ ఫ్రేమ్లు ఏవీ క్లియర్ కావు.
- పైథాన్ సేఫ్టీ లిమిట్: స్టాక్ ఓవర్ఫ్లో జరిగి ఆపరేటింగ్ సిస్టమ్ క్రాష్ అవ్వకుండా పైథాన్ డిఫాల్ట్గా గరిష్టంగా 1,000 రికర్సివ్ కాల్స్ మాత్రమే అనుమతిస్తుంది.
- దీనిని
sys.getrecursionlimit()ద్వారా చూడవచ్చు. అవసరమైతేsys.setrecursionlimit(5000)ద్వారా పెంచవచ్చు, కానీ ఇది సి-స్టాక్ ఓవర్ఫ్లో ప్రమాదాన్ని తెస్తుంది. - పైథాన్లో Tail Call Optimization (TCO) ఎందుకు లేదు? ఇతర ఫంక్షనల్ భాషలైన Haskell లేదా Scheme లో టైల్ రికర్షన్ను లూప్గా ఆప్టిమైజ్ చేస్తాయి. కానీ పైథాన్ సృష్టికర్త గైడో వాన్ రోసమ్ (Guido van Rossum) ఉద్దేశపూర్వకంగా TCO ను తిరస్కరించారు! ఎందుకంటే ఎర్రర్ వచ్చినప్పుడు డీబగ్గింగ్ కోసం పూర్తి స్టాక్ ట్రేస్ (Full Traceback) ఉండటం అత్యంత విలువైందని ఆయన భావించారు.
- ప్రొడక్షన్ రికమెండేషన్: డీప్ రికర్షన్ అవసరమైనప్పుడు రికర్షన్కు బదులుగా సాధారణ
whileలూప్ మరియు పైథాన్ లిస్ట్ను ఒక స్పష్టమైన స్టాక్ (Explicit Stack) గా వాడటం సురక్షితమైన మార్గం.
10 కోడ్ డెమో 2: ఫ్యాక్టోరియల్, నెస్టెడ్ డేటా ట్రావర్సల్ రికర్షన్
నెస్టెడ్ డైరెక్టరీలు లేదా కేటగిరీ ట్రీలను రికర్షన్ ద్వారా ఎంత సరళంగా ట్రావర్స్ చేయవచ్చో పరిశీలిద్దాం:
# రికర్సివ్ డేటా స్ట్రక్చర్ ట్రావర్సల్
nested_categories = {
"ఎలక్ట్రానిక్స్": {
"మొబైల్స్": ["ఆండ్రాయిడ్", "ఐఫోన్"],
"ల్యాప్టాప్స్": ["గేమింగ్", "అల్ట్రాబుక్స్"]
},
"దుస్తులు": {
"పురుషులు": ["షర్టులు", "జీన్స్"],
"మహిళలు": ["చీరలు", "కుర్తీలు"]
}
}
def print_category_tree(tree, indent_level=0):
"""నెస్టెడ్ డిక్షనరీ ట్రీని రికర్సివ్గా ప్రింట్ చేస్తుంది."""
indent = " " * indent_level
if isinstance(tree, dict):
for key, value in tree.items():
print(f"{indent}📁 [{key}]")
print_category_tree(value, indent_level + 1) # Recursive Call
elif isinstance(tree, list):
for item in tree:
print(f"{indent} 📄 {item}") # Base Case Leaf
print("=== రిటైల్ స్టోర్ కేటగిరీ ట్రీ (Recursive Walk) ===")
print_category_tree(nested_categories)
11 ఫంక్షనల్ మెమోయిజేషన్ & functools.partial (Currying)
ఫిబోనాకి వంటి సమస్యలలో సాధారణ రికర్షన్ $O(2^N)$ ఘాతాంక సమయం తీసుకుంటుంది (ఒకే లెక్కను లక్షల సార్లు పునరావృతం చేస్తుంది).
పైథాన్లోని @functools.lru_cache డెకరేటర్ గతంలో లెక్కించిన ఫలితాలను మెమరీలో క్యాష్ చేసి, రికర్షన్ వేగాన్ని O(N) లీనియర్ టైమ్కు పెంచుతుంది!
@lru_cache(maxsize=128)
def fib(n):
if n <= 1: return n
return fib(n - 1) + fib(n - 2) # మెమోయిజేషన్ వల్ల మైక్రోసెకన్లలో రన్ అవుతుంది!
functools.partial ద్వారా ఫంక్షన్ కరియింగ్ (Function Currying):
ఒక ఫంక్షన్లోని కొన్ని ఆర్గ్యుమెంట్లను ముందుగానే ఫిక్స్ చేసి, తక్కువ ఆర్గ్యుమెంట్లు తీసుకునే ఒక సరికొత్త ప్రత్యేక ఫంక్షన్ను రూపొందించడాన్ని Partial Application అంటారు:
def multiply(x, y): return x * y
double = partial(multiply, 2) # x=2 గా ఫిక్స్ చేయబడింది!
triple = partial(multiply, 3)
print("డబుల్ :", double(25)) # 50
print("ట్రిపుల్ :", triple(25)) # 75
12 కామన్ బిగినర్స్ మిస్టేక్స్ & The Closure Late-Binding Trap
- The Closure Late-Binding Loop Trap (ప్రమాదకరమైన బగ్!):
funcs = [lambda: i for i in range(4)]కారణం & పరిష్కారం: ల్యాంబ్డాలు వేరియబుల్ను డిఫైన్ అయినప్పుడు కాకుండా, కాల్ అయినప్పుడు మాత్రమే చూస్తాయి (Late Binding). లూప్ ముగిసేసరికి
print([f() for f in funcs]) # [3, 3, 3, 3] వస్తుంది! [0, 1, 2, 3] రాదు!i = 3ఉంటుంది కాబట్టి అన్నీ 3 ని ఇస్తాయి. దీనికి పరిష్కారం డీఫాల్ట్ ఆర్గ్యుమెంట్ బైండింగ్ వాడటం:funcs = [lambda i=i: i for i in range(4)]. - Mistake 2: రికర్శన్లో Base Case మర్చిపోవడం: బేస్ కేస్ లేకపోతే
RecursionError: maximum recursion depth exceededవస్తుంది. ఎల్లప్పుడూ మొదటి రెండు లైన్లలో నిష్క్రమణ షరతును రాయండి. - Mistake 3: map() ఫలితాన్ని ప్రింట్ చేయడం:
print(map(f, nums))అని రాస్తే<map object at 0x...>వస్తుంది. అది ఇటరేటర్ కాబట్టిlist(map(...))అని మార్చి చూడాలి. - Mistake 4: కాంప్లెక్స్ ల్యాంబ్డాలు రాయడం: ల్యాంబ్డాలో బహుళ if-else లు రాయడం వల్ల కోడ్ రీడబిలిటీ దెబ్బతింటుంది. రెండు లైన్ల కంటే ఎక్కువ ఉంటే సాధారణ
defవాడండి. - Best Practice: లిస్ట్ కాంప్రహెన్షన్ vs map/filter: సాధారణ ట్రాన్స్ఫార్మేషన్లకు పైథాన్లో
map/filterకంటే లిస్ట్ కాంప్రహెన్షన్స్ ఎంతో రీడబుల్గా ఉంటాయి. కానీ లెక్కలు పెద్దవిగా ఉండి లేజీ ఎవాల్యుయేషన్ కావాలనుకున్నప్పుడుmapఅద్భుతమైనది.
13 రియల్-వరల్డ్ ప్రాజెక్ట్: "Enterprise Financial Ledger & Fraud Detection Pipeline"
ఈ పద్దెనిమిదవ అధ్యాయంలో నేర్చుకున్న అన్ని అంశాలను (ల్యాంబ్డా, map, filter, functools.reduce, ప్యూర్ ఫంక్షన్లు, రికర్సివ్ ఆడిట్) అనుసంధానిస్తూ — అనుమానాస్పద లావాదేవీలను గుర్తించి, కరెన్సీ కన్వర్షన్ చేసి, బ్యాలెన్స్ లెడ్జర్ను ఆడిట్ చేసే పూర్తి స్థాయి Enterprise Fraud Detection Pipeline Engine ను నిర్మిద్దాం!
# =====================================================================
# చాప్టర్ 18 మినీ ప్రాజెక్ట్: Financial Ledger & Fraud Detection Pipeline
# కాన్సెప్ట్స్: Anonymous Lambdas, map(), filter(), functools.reduce(),
# Pure Functions, Recursive Account Reconciliation
# =====================================================================
from functools import reduce
from datetime import datetime
# బ్యాంకింగ్ లావాదేవీల డేటాసెట్
RAW_TRANSACTIONS = [
{"id": "TXN-101", "user": "విజయ్", "amount_usd": 120.0, "status": "APPROVED", "is_international": False},
{"id": "TXN-102", "user": "ఆనంద్", "amount_usd": 4500.0, "status": "APPROVED", "is_international": True}, # Suspicious High Value!
{"id": "TXN-103", "user": "శ్రీధర్", "amount_usd": 15.0, "status": "REJECTED", "is_international": False},
{"id": "TXN-104", "user": "హరిత", "amount_usd": 850.0, "status": "APPROVED", "is_international": False},
{"id": "TXN-105", "user": "ఆనంద్", "amount_usd": 9200.0, "status": "APPROVED", "is_international": True}, # Fraud Alert!
{"id": "TXN-106", "user": "దివ్య", "amount_usd": 340.0, "status": "APPROVED", "is_international": False}
]
USD_TO_INR = 83.50
def run_fraud_and_ledger_pipeline():
print("\n" + "=" * 74)
print(f"{'🏦 మన బ్యాంకింగ్ — ఫైనాన్షియల్ లెడ్జర్ & ఫ్రాడ్ డిటెక్షన్ 2026':^74}")
print("=" * 74)
# 1. FILTER: ఆమోదించబడిన (APPROVED) లావాదేవీలను మాత్రమే వడపోయడం
approved_txns = list(filter(lambda t: t["status"] == "APPROVED", RAW_TRANSACTIONS))
print(f"మొత్తం లావాదేవీలు: {len(RAW_TRANSACTIONS)} | ఆమోదించబడినవి: {len(approved_txns)}")
# 2. MAP: USD నుండి INR కరెన్సీ కన్వర్షన్ చేసి నూతన లెడ్జర్ రికార్డులను సృష్టించడం (Pure Function)
inr_ledger = list(map(
lambda t: {
"id": t["id"],
"user": t["user"],
"amount_inr": round(t["amount_usd"] * USD_TO_INR, 2),
"is_intl": t["is_international"],
"risk_score": "HIGH" if (t["amount_usd"] > 3000 and t["is_international"]) else "NORMAL"
},
approved_txns
))
# 3. FILTER: ఫ్రాడ్ అలర్ట్స్ (అంతర్జాతీయ హై-వాల్యూ రిస్క్ ట్రాన్సాక్షన్స్)
fraud_alerts = list(filter(lambda r: r["risk_score"] == "HIGH", inr_ledger))
# 4. REDUCE: మొత్తం సెటిల్ అయిన నికర లావాదేవీల విలువ (INR)
total_turnover_inr = reduce(lambda acc, item: acc + item["amount_inr"], inr_ledger, 0.0)
# ఆడిట్ నివేదిక ప్రింట్ చేయడం
print("-" * 74)
print(f"{'TXN ID':<10} {'వినియోగదారుడు':<16} {'మొత్తం (₹)':>14} {'రకం':<14} {'రిస్క్ స్థాయి':^14}")
print("-" * 74)
for record in inr_ledger:
intl_badge = "అంతర్జాతీయ" if record["is_intl"] else "దేశీయ"
risk_badge = "🚨 హై రిస్క్!" if record["risk_score"] == "HIGH" else "✅ క్లీన్"
print(f"{record['id']:<10} {record['user']:<16} ₹{record['amount_inr']:>12,.2f} {intl_badge:<14} {risk_badge:^14}")
print("=" * 74)
print(f"మొత్తం టర్నోవర్ క్లియరెన్స్ : ₹{total_turnover_inr:,.2f}")
print("-" * 74)
print("\n🚨 అత్యవసర సెక్యూరిటీ సమీక్షకు పంపబడిన అనుమానాస్పద లావాదేవీలు:")
for alert in fraud_alerts:
print(f" • [{alert['id']}] ఖాతాదారు: {alert['user']:<12} మొత్తం: ₹{alert['amount_inr']:,.2f} (అంతర్జాతీయ బదిలీ)")
print("=" * 74)
print(f"{'✅ ఫైనాన్షియల్ లెడ్జర్ ఆడిట్ విజయవంతంగా పూర్తయింది!':^74}")
print("=" * 74 + "\n")
run_fraud_and_ledger_pipeline()
★ ఈ అధ్యాయంపై ప్రాక్టీస్ క్విజ్ (Knowledge Check)
1. ల్యాంబ్డా ఫంక్షన్లో return స్టేట్మెంట్ను ఎందుకు రాయకూడదు?
return అని రాస్తే పైథాన్ SyntaxError విసురుతుంది.
2. map() ఫంక్షన్ యొక్క లేజీ ఎవాల్యుయేషన్ (Lazy Evaluation) ప్రయోజనం ఏమిటి?
map() అన్ని అంశాలను ఒకేసారి మెమరీలోకి లోడ్ చేసి లిస్ట్గా మార్చదు; అడిగినప్పుడు మాత్రమే ఒక్కొక్క ఎలిమెంట్ను ఉత్పత్తి చేసే ఇటరేటర్ను ఇస్తుంది. దీనివల్ల జీబీ పరిమాణంలో ఉన్న భారీ డేటాసెట్లను తక్కువ రామ్ (RAM) మెమరీతో సమర్థవంతంగా ప్రాసెస్ చేయవచ్చు.
3. రికర్సివ్ ఫంక్షన్లో బేస్ కేస్ (Base Case) లేకపోతే ఏం జరుగుతుంది?
RecursionError: maximum recursion depth exceeded విసిరి ప్రోగ్రామ్ను ఆపేస్తుంది.
4. functools.reduce() ఫంక్షన్ ఏం చేస్తుంది?
5. @functools.lru_cache రికర్సివ్ ఫంక్షన్లను ఎలా వేగవంతం చేస్తుంది?
ఈ Financial Fraud Detection Engine ని లైవ్గా మన కంపైలర్లో రన్ చేయండి!
ఎటువంటి లోకల్ సెటప్ లేకుండా, బ్రౌజర్లోనే Modern Python 3 కంపైలర్లో ఈ కోడ్ను ఎగ్జిక్యూట్ చేసి అవుట్పుట్ తనిఖీ చేయండి.