ఆపరేటర్లు & ఎక్స్‌ప్రెషన్స్

🐍 Modern Python (Python 3.12+) 🎯 Chapter 5 of 25 🚀 Phase 01: పైథాన్ ఫండమెంటల్స్ & బేసిక్స్ 📅 2026 Edition
📌 Covered in this chapter: ఆపరేటర్ల వర్గీకరణ · అర్థమెటిక్ (+, -, *, /, //, %, **) · చైన్డ్ కంపారిజన్స్ · లాజికల్ షార్ట్-సర్క్యూటింగ్ (and, or, not) · కాంపౌండ్ అసైన్‌మెంట్ & Walrus (:=) · ఐడెంటిటీ (is vs ==) · మెంబర్‌షిప్ (in, not in) · బిట్‌వైజ్ ఆపరేషన్లు & బిట్-మాస్కింగ్ · ఆపరేటర్ ప్రెసిడెన్స్ & అసోసియేటివిటీ · E-Commerce Pricing & Loyalty Engine ప్రాజెక్ట్!
ప్రోగ్రామింగ్ భాషలో డేటాను నిల్వ చేయడం ఒక ఎత్తైతే, ఆ డేటాపై గణిత లెక్కలు చేయడం, లాజిక్‌ను సరిపోల్చడం మరియు సరైన నిర్ణయాలు తీసుకోవడం అసలైన ఇంజిన్ లాంటిది. పైథాన్‌లో ఆపరేటర్లు కేవలం సాధారణ + లేదా - మాత్రమే కావు; గణితంలో రాసినట్లే సహజంగా రాసే చైన్డ్ కంపారిజన్స్ (Chained Comparisons), పెర్ఫార్మెన్స్‌ను పెంచే లాజికల్ షార్ట్-సర్క్యూటింగ్, మరియు పైథాన్ 3.8 లో వచ్చిన అధునాతన వాల్రస్ ఆపరేటర్ (:=) వంటి ఎన్నో అద్భుతమైన ఫీచర్లు పైథాన్‌ను ఇతర భాషల కంటే మరింత సొగసైనదిగా చేస్తాయి. ఈ ఐదవ అధ్యాయంతో మనం Phase 01: పైథాన్ ఫండమెంటల్స్ & బేసిక్స్ ను విజయవంతంగా పూర్తి చేయబోతున్నాం! 7 రకాల ఆపరేటర్ల లోతైన ఆర్కిటెక్చర్, మెమరీ పోలికలు, బిట్‌వైజ్ మాస్కింగ్, మరియు ఒక పూర్తి స్థాయి E-Commerce Dynamic Discount, Loyalty & Tax Pricing Engine ద్వారా ఆపరేటర్లపై తిరుగులేని పట్టు సాధిద్దాం!

1 పైథాన్ ఆపరేటర్లు అంటే ఏమిటి? (Operators & Expressions Architecture)

ఒకటి లేదా అంతకంటే ఎక్కువ విలువలపై (Operands) ఒక నిర్దిష్ట గణిత లేదా లాజికల్ పనిని చేయడానికి ఉపయోగించే ప్రత్యేక చిహ్నాలను ఆపరేటర్లు (Operators) అంటారు. ఆపరేటర్లు మరియు ఆపరాండ్స్ కలయికతో ఏర్పడే ఫార్ములాను ఎక్స్‌ప్రెషన్ (Expression) అంటారు (ఉదా: total = subtotal + (tax * 0.18)).

ఆపరేటర్ కేటగిరీ చిహ్నాలు (Symbols) ప్రయోజనం & వివరణ
1. అర్థమెటిక్ (Arithmetic) +, -, *, /, //, %, ** కూడికలు, తీసివేతలు, భాగాహారాలు, శేషాలు మరియు ఘాతాలు (Powers).
2. కంపారిజన్ (Relational) ==, !=, >, <, >=, <= విలువలను సరిపోల్చి బూలియన్ (True లేదా False) ఇస్తుంది.
3. లాజికల్ (Logical) and, or, not బహుళ షరతులను కలపడానికి (Short-circuit evaluation).
4. అసైన్‌మెంట్ (Assignment) =, +=, -=, *=, /=, := (Walrus) వేరియబుల్స్‌కు విలువలని కేటాయించడం మరియు అక్కడికక్కడే అప్‌డేట్ చేయడం.
5. ఐడెంటిటీ (Identity) is, is not రెండు వేరియబుల్స్ మెమరీలో ఒకే ఆబ్జెక్ట్‌ను పాయింట్ చేస్తున్నాయా లేదా అని తనిఖీ చేస్తుంది.
6. మెంబర్‌షిప్ (Membership) in, not in స్ట్రింగ్, లిస్ట్ లేదా డిక్షనరీ వంటి సీక్వెన్స్‌లో ఎలిమెంట్ ఉందో లేదో వెతుకుతుంది.
7. బిట్‌వైజ్ (Bitwise) &, |, ^, ~, <<, >> డేటాను బైనరీ బిట్స్ (0s and 1s) స్థాయిలో ప్రాసెస్ చేస్తుంది.

2 అర్థమెటిక్ ఆపరేటర్లు (Arithmetic Operators — +, -, *, /, //, %, **)

పైథాన్‌లో అర్థమెటిక్ ఆపరేటర్లు అత్యంత సహజంగా ఉంటాయి. అయితే డివిజన్ విషయంలో పైథాన్ ప్రత్యేక నియమాలను కలిగి ఉంటుంది:

3 కోడ్ డెమో 1: అర్థమెటిక్ ఆపరేటర్లు & మ్యాథమెటికల్ ప్రిసిషన్

ట్రూ డివిజన్, నెగటివ్ ఫ్లోర్ డివిజన్ మరియు భారీ ఎక్స్‌పోనెన్షియల్ లెక్కలను క్రింది కోడ్‌లో పరీక్షించండి:

01_arithmetic_deep_dive.py
# పైథాన్ 3 అర్థమెటిక్ ఆపరేటర్ల లోతైన డెమో

a, b = 17, 5

print(f"సంఖ్యలు: a = {a}, b = {b}\n")
print(f"కూడిక (Addition)         : a + b  = {a + b}")
print(f"తీసివేత (Subtraction)     : a - b  = {a - b}")
print(f"గుణకారం (Multiplication) : a * b  = {a * b}")
print(f"ట్రూ డివిజన్ (True Div)  : a / b  = {a / b} (Type: {type(a / b).__name__})")
print(f"ఫ్లోర్ డివిజన్ (Floor Div): a // b = {a // b} (Type: {type(a // b).__name__})")
print(f"శేషం (Modulo Remainder)  : a % b  = {a % b}")
print(f"పవర్ (Exponentiation)    : a ** b = {a ** b}")

# నెగటివ్ ఫ్లోర్ డివిజన్ ప్రవర్తన
neg_num, div = -17, 5
print(f"\nనెగటివ్ ఫ్లోర్ డివిజన్ (-17 // 5): {neg_num // div}")  # Output: -4
print(f"నెగటివ్ మాడ్యులో (-17 % 5)       : {neg_num % div}")   # Output: 3

# భారీ ఘాతాంకాలు (2 పవర్ 64)
ram_bytes = 2 ** 64
print(f"\n64-bit అడ్రస్ స్పేస్ గరిష్ట సైజు: {ram_bytes:,} బైట్స్")

4 కంపారిజన్ ఆపరేటర్లు & చైన్డ్ కంపారిజన్స్ (Chained Comparisons)

రెండు విలువల మధ్య సంబంధాన్ని పోల్చడానికి కంపారిజన్ (రిలేషనల్) ఆపరేటర్లను వాడతాము: ==, !=, >, <, >=, <=. ఫలితం ఎల్లప్పుడూ True లేదా False గా ఉంటుంది.

🌟 పైథాన్ సూపర్-పవర్: చైన్డ్ కంపారిజన్స్ (Chained Comparisons)

సాధారణంగా C++ లేదా Java లో ఒక విద్యార్థి వయస్సు 18 నుండి 25 మధ్య ఉందో లేదో చూడాలంటే ఇలా రాయాలి:
if (age >= 18 && age <= 25)

కానీ పైథాన్‌లో గణిత పుస్తకాల్లో రాసినట్లే నేరుగా ఇలా రాయవచ్చు:
if 18 <= age <= 25:
పైథాన్ అంతర్గతంగా దీన్ని (18 <= age) and (age <= 25) లాగా మారుస్తుంది. ఇది కోడ్ రీడబిలిటీని అద్భుతంగా పెంచుతుంది!

5 లాజికల్ ఆపరేటర్లు & షార్ట్-సర్క్యూట్ ఇవాల్యుయేషన్ (and, or, not)

ఇతర భాషల్లో లాగా &&, ||, ! కాకుండా, పైథాన్‌లో ఇంగ్లీష్ పదాలు and, or, not లను వాడతాము:

⚡ షార్ట్-సర్క్యూట్ ఇవాల్యుయేషన్ (Short-Circuit Evaluation):

పైథాన్ సమయాన్ని ఆదా చేయడానికి మొత్తం ఎక్స్‌ప్రెషన్‌ను లెక్కించదు:

  • A and B లో: A కనుక False అయితే, B ని అస్సలు రన్ చేయదు (ఎందుకంటే ఫలితం ఎలాగూ False కాబట్టి!).
  • A or B లో: A కనుక True అయితే, B ని అస్సలు పరీక్షించదు (ఎందుకంటే ఫలితం ఎలాగూ True కాబట్టి!).
  • డిఫాల్ట్ ఫాల్‌బ్యాక్ ట్రిక్: user_display_name = input_name or "Guest User" (యూజర్ పేరు ఇవ్వకపోతే Falsy అవుతుంది కాబట్టి "Guest User" అసైన్ అవుతుంది!).

6 అసైన్‌మెంట్ & కాంపౌండ్ ఆపరేటర్లు + వాల్రస్ ఆపరేటర్ (:=)

ఒక వేరియబుల్ విలువను అప్‌డేట్ చేయడానికి కాంపౌండ్ (Augmented) అసైన్‌మెంట్ ఆపరేటర్లను ఉపయోగిస్తాము: +=, -=, *=, /=, //=, %=, **=. ఉదాహరణకు count += 1 అనేది count = count + 1 తో సమానం.

🦭 ది వాల్రస్ ఆపరేటర్ (Walrus Operator := — Python 3.8+ PEP 572):

ఈ ఆపరేటర్ చూడటానికి వాల్రస్ జంతువు కళ్లు మరియు దంతాలలా (:=) ఉండటం వల్ల దీనికి ఆ పేరు వచ్చింది. దీని ప్రత్యేకత ఏమిటంటే: ఒక కండిషన్ లేదా ఎక్స్‌ప్రెషన్ లోపలే వేరియబుల్‌కు విలువను అసైన్ చేయడం మరియు వెంటనే పరీక్షించడం!

# పాత విధానం (2 లైన్లు):
msg = input("మెసేజ్ రాయండి: ")
if len(msg) > 10: print("చాలా పొడవైన మెసేజ్!")

# ఆధునిక వాల్రస్ విధానం (1 లైన్):
if (n := len(msg := input("మెసేజ్ రాయండి: "))) > 10:
    print(f"మెసేజ్ పొడవు {n} అక్షరాలు, ఇది అనుమతించబడదు!")

7 కోడ్ డెమో 2: చైన్డ్ కంపారిజన్స్, షార్ట్-సర్క్యూట్ & వాల్రస్ ఆపరేటర్

ఈ ఆధునిక పైథాన్ ఫీచర్లు నిజమైన ప్రొడక్షన్ కోడ్‌లో ఎలా సమయాన్ని ఆదా చేస్తాయో క్రింది ఉదాహరణలో చూడండి:

02_chained_shortcircuit_walrus.py
# చైన్డ్ కంపారిజన్స్, షార్ట్-సర్క్యూటింగ్ & వాల్రస్ ఆపరేటర్ డెమో

# 1. చైన్డ్ కంపారిజన్స్ (Chained Comparisons)
exam_score = 88
if 80 <= exam_score <= 100:
    print("✅ అభినందనలు! మీరు 'Distinction A+' గ్రేడ్ పొందారు!")

# 2. లాజికల్ షార్ట్-సర్క్యూట్ ద్వారా జీరో డివిజన్ నివారణ
denominator = 0
# denominator != 0 ఫాల్స్ అవ్వగానే తర్వాతి భాగాన్ని పైథాన్ రన్ చేయదు!
if denominator != 0 and (100 / denominator > 5):
    print("విభజన విజయవంతం!")
else:
    print("⚠️ సేఫ్ షార్ట్-సర్క్యూట్: ZeroDivisionError రాకుండా రక్షించబడింది!")

# 3. 'or' ఆపరేటర్‌తో డిఫాల్ట్ విలువలు (Fallback pattern)
entered_theme = "" # యూజర్ ఖాళీగా వదిలాడు (Falsy)
active_theme = entered_theme or "dark-mode-default"
print(f"ప్రస్తుత థీమ్: {active_theme}")

# 4. వాల్రస్ ఆపరేటర్ (:=) డెమో
product_catalog = ["ఐఫోన్ 16", "మ్యాక్‌బుక్ ప్రో", "ఐప్యాడ్ ఎయిర్", "ఆపిల్ వాచ్"]

if (total_items := len(product_catalog)) >= 4:
    print(f"స్టాక్ నిండుగా ఉంది! మొత్తం వస్తువులు: {total_items}")

8 ఐడెంటిటీ ఆపరేటర్లు: is vs == (Memory Identity vs Value Equality)

ఇంటర్వ్యూలలో మరియు ప్రొడక్షన్ డీబగ్గింగ్‌లో అత్యంత సాధారణమైన ప్రశ్న: == కి మరియు is కి తేడా ఏమిటి?

ఫీచర్ == (Equality Operator) is (Identity Operator)
ఏమి తనిఖీ చేస్తుంది? రెండు ఆబ్జెక్టుల లోపలి విలువలు (Values) సమానమా కాదా. రెండు వేరియబుల్స్ మెమరీలో ఒకే ఆబ్జెక్ట్‌ను (Same Memory Address via id()) పాయింట్ చేస్తున్నాయా లేదా.
ఓవర్‌లోడింగ్ మెథడ్ __eq__() డండర్ మెథడ్‌ను పిలుస్తుంది. మెథడ్ ఉండదు; నేరుగా పాయింటర్ అడ్రస్‌లను పోలుస్తుంది.
ఉపయోగించే సందర్భం సంఖ్యలు, టెక్స్ట్, లిస్ట్‌ల విలువలను పోల్చడానికి. None, సింగిల్టన్ ఆబ్జెక్టులు, లేదా ఆబ్జెక్ట్ ఐడెంటిటీని నిర్ధారించడానికి.
list1 = [1, 2, 3]
list2 = [1, 2, 3]

print(list1 == list2) # True (ఎందుకంటే విలువలు రెండూ ఒకటే)
print(list1 is list2) # False ❌ (ఎందుకంటే హీప్‌లో రెండు వేర్వేరు లిస్ట్‌లు తయారయ్యాయి!)
print(id(list1) != id(list2)) # True (వేర్వేరు మెమరీ అడ్రస్‌లు)

PEP 8 అధికారిక నియమం: None ను తనిఖీ చేసేటప్పుడు ఎప్పుడూ if val == None: అని రాయకూడదు ❌; ఎల్లప్పుడూ if val is None: లేదా if val is not None: అని మాత్రమే రాయాలి ✅.

9 మెంబర్‌షిప్ ఆపరేటర్లు (in & not in)

ఒక విలువ ఇచ్చిన సీక్వెన్స్ (స్ట్రింగ్, లిస్ట్, టపుల్, సెట్ లేదా డిక్షనరీ) లో ఉందో లేదో తనిఖీ చేయడానికి in మరియు not in ఆపరేటర్లను ఉపయోగిస్తాము:

10 బిట్‌వైజ్ ఆపరేటర్లు (Bitwise Operators — &, |, ^, ~, <<, >>)

కంప్యూటర్ మెమరీలో డేటా 0 మరియు 1 ల రూపంలో ఉంటుంది. ఈ బైనరీ బిట్స్ పై నేరుగా పనిచేసే ఆపరేటర్లను బిట్‌వైజ్ ఆపరేటర్లు అంటారు. సైబర్ సెక్యూరిటీ, నెట్‌వర్కింగ్, గేమింగ్ మరియు పర్మిషన్ సిస్టమ్స్ (Bitmasking) లో ఇవి అత్యంత కీలకం:

ఆపరేటర్ పేరు వివరణ ఉదాహరణ (5 = 101, 3 = 011)
& Bitwise AND రెండు బిట్స్ 1 అయితేనే 1 5 & 3 => 1 (001)
| Bitwise OR ఏ ఒక్క బిట్ 1 అయినా 1 5 | 3 => 7 (111)
^ Bitwise XOR బిట్స్ వేర్వేరుగా ఉంటే 1, ఒకేలా ఉంటే 0 5 ^ 3 => 6 (110)
~ Bitwise NOT బిట్స్‌ను తిరగరాయడం (Invert: -(x + 1)) ~5 => -6
<< Left Shift బిట్స్‌ను ఎడమకు జరపడం ($x imes 2^n$) 5 << 1 => 10
>> Right Shift బిట్స్‌ను కుడికి జరపడం ($x // 2^n$) 5 >> 1 => 2
03_bitwise_permission_masking.py
# రియల్-వరల్డ్ బిట్‌వైజ్ పర్మిషన్ సిస్టమ్ (Linux/Cloud Style Bitmasking)

# పర్మిషన్ ఫ్లాగ్స్ (Powers of 2)
READ    = 0b001  # 1
WRITE   = 0b010  # 2
EXECUTE = 0b100  # 4

# 1. యూజర్‌కు READ మరియు WRITE పర్మిషన్లు ఇవ్వడం (Bitwise OR |)
user_permissions = READ | WRITE
print(f"యూజర్ పర్మిషన్ బిట్స్: {bin(user_permissions)} (Decimal: {user_permissions})")

# 2. పర్మిషన్ ఉందో లేదో తనిఖీ చేయడం (Bitwise AND &)
can_read = (user_permissions & READ) != 0
can_write = (user_permissions & WRITE) != 0
can_execute = (user_permissions & EXECUTE) != 0

print(f"చదవగలరా (Can Read)?     : {can_read}")
print(f"రాయగలరా (Can Write)?    : {can_write}")
print(f"రన్ చేయగలరా (Can Exec)? : {can_execute}")

# 3. లెఫ్ట్ షిఫ్ట్ ద్వారా 2తో వేగవంతమైన గుణకారం
val = 8
print(f"\n8 << 2 (8 * 4): {val << 2}")
print(f"8 >> 2 (8 // 4): {val >> 2}")

11 ఆపరేటర్ ప్రెసిడెన్స్ & అసోసియేటివిటీ (Precedence Table & PEMDAS)

ఒకే ఎక్స్‌ప్రెషన్‌లో బహుళ ఆపరేటర్లు ఉన్నప్పుడు ఏది ముందుగా ఎగ్జిక్యూట్ అవ్వాలో నిర్ణయించే నియమాలను ఆపరేటర్ ప్రెసిడెన్స్ (Operator Precedence) అంటారు. గణితంలోని BODMAS / PEMDAS నియమాలతో పాటు పైథాన్‌లో పూర్తి ప్రెసిడెన్స్ క్రమం ఇలా ఉంటుంది (పైనుండి క్రిందికి ప్రాధాన్యత తగ్గుతుంది):

ప్రాధాన్యత (Rank) ఆపరేటర్ వివరణ అసోసియేటివిటీ (దిశ)
1 (అత్యున్నత) () పారాంథసిస్ / బ్రాకెట్లు లోపలి నుండి బయటకు
2 ** ఘాతాంకం (Exponentiation) కుడి నుండి ఎడమకు (Right-to-Left)
3 +x, -x, ~x యూనరీ ప్లస్, మైనస్, బిట్‌వైజ్ నాట్ కుడి నుండి ఎడమకు
4 *, /, //, % గుణకారాలు, భాగాహారాలు, శేషాలు ఎడమ నుండి కుడికి (Left-to-Right)
5 +, - సాధారణ కూడిక, తీసివేత ఎడమ నుండి కుడికి
6 <<, >> బిట్‌వైజ్ షిఫ్ట్‌లు ఎడమ నుండి కుడికి
7 &, ^, | బిట్‌వైజ్ AND, XOR, OR ఎడమ నుండి కుడికి
8 ==, !=, <, >, is, in కంపారిజన్స్, ఐడెంటిటీ & మెంబర్‌షిప్ ఎడమ నుండి కుడికి
9 not లాజికల్ నాట్ కుడి నుండి ఎడమకు
10 and లాజికల్ అండ్ ఎడమ నుండి కుడికి
11 or లాజికల్ ఆర్ ఎడమ నుండి కుడికి
12 (అత్యల్ప) :=, =, += ... వాల్రస్ & అసైన్‌మెంట్స్ కుడి నుండి ఎడమకు
💡 ప్రొడక్షన్ గోల్డెన్ రూల్: బ్రాకెట్స్ వాడండి!

ప్రెసిడెన్స్ టేబుల్ ఎంత పెద్దదైనా, ప్రొడక్షన్ కోడ్‌లో ఇతరులకు సులభంగా అర్థం కావడానికి ఎల్లప్పుడూ బ్రాకెట్లు () వాడటం శ్రేయస్కరం. ఉదాహరణకు x = a + b * c కంటే x = a + (b * c) అని రాస్తే ఉద్దేశం స్పష్టంగా ఉంటుంది.

12 కామన్ బిగినర్స్ మిస్టేక్స్ & ప్రొడక్షన్ బెస్ట్ ప్రాక్టీసెస్

13 రియల్-వరల్డ్ ప్రాజెక్ట్: "Enterprise E-Commerce Discount, Loyalty & Tax Pricing Engine"

ఈ ఐదవ అధ్యాయంలో నేర్చుకున్న అన్ని అంశాలను (అర్థమెటిక్, చైన్డ్ కంపారిజన్స్, లాజికల్ షార్ట్-సర్క్యూటింగ్, వాల్రస్ ఆపరేటర్, ఐడెంటిటీ, మెంబర్‌షిప్ మరియు బిట్‌వైజ్ పర్మిషన్స్) కలగలిపి — ఒక పూర్తి స్థాయి Enterprise Dynamic Pricing & Loyalty Engine ను నిర్మిద్దాం!

04_ecommerce_pricing_loyalty_engine.py
# =====================================================================
# చాప్టర్ 05 మినీ ప్రాజెక్ట్: E-Commerce Dynamic Pricing & Loyalty Engine
# కాన్సెప్ట్స్: Arithmetic, Chained Comparisons, Walrus Operator (:=),
#             Membership (in), Identity (is), Bitwise Flags & Short-circuit
# =====================================================================

# యూజర్ రోల్ బిట్ ఫ్లాగ్స్
ROLE_STANDARD = 0b001
ROLE_AFFILIATE = 0b010
ROLE_STAFF     = 0b100

VALID_COUPONS = {"FESTIVE20": 0.20, "FLASH10": 0.10, "WELCOME50": 0.50}

def calculate_dynamic_cart_bill(
    customer_name: str,
    raw_subtotal: float,
    coupon_code: str | None,
    loyalty_points: int,
    user_roles: int
):
    print("=" * 68)
    print(f"{'🛒 E-COMMERCE DYNAMIC PRICING ENGINE 2026':^68}")
    print("=" * 68)

    subtotal = raw_subtotal
    print(f"కస్టమర్ పేరు        : {customer_name}")
    print(f"ప్రారంభ కార్ట్ విలువ : ₹ {subtotal:>15,.2f}")

    # 1. వాల్రస్ ఆపరేటర్ & మెంబర్‌షిప్ ద్వారా కూపన్ డిస్కౌంట్
    discount_amount = 0.0
    if coupon_code is not None and (clean_code := coupon_code.strip().upper()) in VALID_COUPONS:
        rate = VALID_COUPONS[clean_code]
        discount_amount = subtotal * rate
        print(f"కూపన్ అప్లై అయ్యింది : [{clean_code}] -₹ {discount_amount:>11,.2f} ({rate:.0%})")
    else:
        print("కూపన్ కోడ్          : వర్తించలేదు లేదా చెల్లనిది")

    # 2. చైన్డ్ కంపారిజన్ ద్వారా లాయల్టీ బోనస్ పాయింట్లు
    loyalty_cashback = 0.0
    if 500 <= loyalty_points <= 5000:
        loyalty_cashback = min(loyalty_points * 0.5, 500.0)
        print(f"లాయల్టీ క్యాష్‌బ్యాక్ : {loyalty_points} పాయింట్లు = -₹ {loyalty_cashback:>9,.2f}")

    # 3. బిట్‌వైజ్ ఆపరేటర్ ద్వారా స్టాఫ్ డిస్కౌంట్
    is_staff = (user_roles & ROLE_STAFF) != 0
    staff_discount = (subtotal * 0.05) if is_staff else 0.0
    if is_staff:
        print(f"సిబ్బంది డిస్కౌంట్  : 5% అదనపు తగ్గింపు = -₹ {staff_discount:>9,.2f}")

    # 4. నెట్ మొత్తం & GST పన్ను (అర్థమెటిక్ & రౌండింగ్)
    taxable_amount = max(0.0, subtotal - discount_amount - loyalty_cashback - staff_discount)
    gst_tax = taxable_amount * 0.18 # 18% GST
    final_total = taxable_amount + gst_tax

    print("-" * 68)
    print(f"{'పన్ను విధించదగిన మొత్తం:':<38} ₹ {taxable_amount:>15,.2f}")
    print(f"{'GST పన్ను (18%):':<38} ₹ {gst_tax:>15,.2f}")
    print("=" * 68)
    print(f"{'తుది చెల్లింపు మొత్తం (Net Total):':<38} ₹ {final_total:>15,.2f}")
    print("=" * 68)

# లైవ్ టెస్టింగ్
calculate_dynamic_cart_bill(
    customer_name="బాలాజీ రావు",
    raw_subtotal=14999.00,
    coupon_code="FESTIVE20",
    loyalty_points=1200,
    user_roles=ROLE_STANDARD | ROLE_STAFF
)

★ ఈ అధ్యాయంపై ప్రాక్టీస్ క్విజ్ (Knowledge Check)

1. పైథాన్‌లో 10 / 2 మరియు 10 // 2 ల ఫలితాల మధ్య తేడా ఏమిటి?
సమాధానం: 10 / 2 అనేది ట్రూ డివిజన్, దీని ఫలితం ఎల్లప్పుడూ ఫ్లోట్ 5.0 అవుతుంది. కానీ 10 // 2 అనేది ఫ్లోర్ డివిజన్, దీని ఫలితం పూర్ణాంకం 5 అవుతుంది.
2. పైథాన్‌లో 'is' ఆపరేటర్‌కు మరియు '==' ఆపరేటర్‌కు మధ్య తేడా ఏమిటి?
సమాధానం: == ఆపరేటర్ రెండు వేరియబుల్స్ లోపల ఉన్న విలువలను (Values) సమానమా కాదా అని పోలుస్తుంది. కానీ is ఆపరేటర్ రెండు వేరియబుల్స్ మెమరీలో ఒకే ఆబ్జెక్ట్ చిరునామాను (Memory Address via id()) పాయింట్ చేస్తున్నాయా లేదా అని తనిఖీ చేస్తుంది.
3. చైన్డ్ కంపారిజన్ (10 < x < 20) అంతర్గతంగా ఎలా ఎగ్జిక్యూట్ అవుతుంది?
సమాధానం: పైథాన్ దీనిని అంతర్గతంగా (10 < x) and (x < 20) లాగా ఎగ్జిక్యూట్ చేస్తుంది. x యొక్క విలువ ఒకే ఒక్కసారి మాత్రమే ఎవాల్యుయేట్ చేయబడుతుంది.
4. లాజికల్ షార్ట్-సర్క్యూటింగ్ అంటే ఏమిటి? ఒక ఉదాహరణ ఇవ్వండి.
సమాధానం: మొత్తం ఎక్స్‌ప్రెషన్ ఫలితం మొదటి భాగంలోనే తేలిపోయినప్పుడు రెండవ భాగాన్ని పైథాన్ అసలు ఎగ్జిక్యూట్ చేయకపోవడాన్ని షార్ట్-సర్క్యూటింగ్ అంటారు. ఉదాహరణకు False and func() లో func() అస్సలు రన్ అవ్వదు; True or func() లో కూడా func() రన్ అవ్వదు.
5. పైథాన్ 3.8 వాల్రస్ ఆపరేటర్ (:=) వల్ల కలిగే ముఖ్య ప్రయోజనం ఏమిటి?
సమాధానం: ఇది ఒకే ఎక్స్‌ప్రెషన్ లోపల ఒక వేరియబుల్‌కు విలువను అసైన్ చేయడం మరియు వెంటనే ఆ విలువను షరతులో పరీక్షించడం రెండింటినీ అనుమతిస్తుంది. దీనివల్ల డూప్లికేట్ ఫంక్షన్ కాల్స్ తగ్గడంతో పాటు కోడ్ లైన్లు ఆదా అవుతాయి.
← మునుపటి అధ్యాయం: 4. ఇన్‌పుట్ & అవుట్‌పుట్ తర్వాతి అధ్యాయం: 6. డెసిషన్ మేకింగ్ (if-else) →

ఈ Pricing & Loyalty Engine ప్రాజెక్ట్‌ను లైవ్‌గా మన కంపైలర్‌లో రన్ చేయండి!

ఎటువంటి లోకల్ సెటప్ లేకుండా, బ్రౌజర్‌లోనే Modern Python 3 కంపైలర్‌లో ఈ కోడ్‌ను ఎగ్జిక్యూట్ చేసి అవుట్‌పుట్ చూడండి.