ఆపరేటర్లు & ఎక్స్ప్రెషన్స్
+ లేదా - మాత్రమే కావు; గణితంలో రాసినట్లే సహజంగా రాసే చైన్డ్ కంపారిజన్స్ (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 — +, -, *, /, //, %, **)
పైథాన్లో అర్థమెటిక్ ఆపరేటర్లు అత్యంత సహజంగా ఉంటాయి. అయితే డివిజన్ విషయంలో పైథాన్ ప్రత్యేక నియమాలను కలిగి ఉంటుంది:
- 1. ట్రూ డివిజన్ (
/): సాధారణ భాగాహారం. సంఖ్యలు నిశ్శేషంగా భాగించబడినప్పటికీ, పైథాన్ 3 లో ఇది ఎల్లప్పుడూfloatఇస్తుంది!
ఉదాహరణ:10 / 2అనేది5.0అవుతుంది (5 కాదు!). - 2. ఫ్లోర్ డివిజన్ (
//- Integer Division): ఫలితంలోని దశాంశాలను తొలగించి, పూర్ణాంక భాగాన్ని మాత్రమే ఇస్తుంది (Floor value).
ఉదాహరణ:10 // 3విలువ3.
జాగ్రత్త: నెగటివ్ నంబర్లకు ఫ్లోరింగ్ ఎల్లప్పుడూ చిన్న సంఖ్య వైపు వెళ్తుంది:-7 // 2విలువ-4(ఎందుకంటే-3.5కంటే చిన్న పూర్ణాంకం-4). - 3. మాడ్యులో (
%- Remainder): భాగాహారం చేయగా మిగిలిన శేషాన్ని ఇస్తుంది.
ఉదాహరణ:14 % 4విలువ2. సరి/బేసి సంఖ్యలను కనుగొనడానికి ఇది ఉపయోగపడుతుంది (n % 2 == 0). - 4. ఎక్స్పోనెన్షియేషన్ (
**- Power): ఘాతాంకాలను లెక్కించడానికి ప్రత్యేక సింబల్.
ఉదాహరణ:2 ** 10విలువ1024. C/C++ లో దీని కోసంpow()ఫంక్షన్ వాడాలి, కానీ పైథాన్లో ఇన్-బిల్ట్ ఆపరేటర్ ఉంది!
3 కోడ్ డెమో 1: అర్థమెటిక్ ఆపరేటర్లు & మ్యాథమెటికల్ ప్రిసిషన్
ట్రూ డివిజన్, నెగటివ్ ఫ్లోర్ డివిజన్ మరియు భారీ ఎక్స్పోనెన్షియల్ లెక్కలను క్రింది కోడ్లో పరీక్షించండి:
# పైథాన్ 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 గా ఉంటుంది.
సాధారణంగా 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 లను వాడతాము:
and: ఇచ్చిన అన్ని షరతులు True అయితేనే మొత్తం ఫలితం True. ఏదైనా ఒక్కటి False అయినా ఫలితం False.or: ఇచ్చిన షరతులలో ఏ ఒక్కటి True అయినా ఫలితం True. అన్నీ False అయితేనే False.not: ఫలితాన్ని తిరగరాస్తుంది (Negation:not True -> False,not False -> True).
పైథాన్ సమయాన్ని ఆదా చేయడానికి మొత్తం ఎక్స్ప్రెషన్ను లెక్కించదు:
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 తో సమానం.
:= — Python 3.8+ PEP 572):
ఈ ఆపరేటర్ చూడటానికి వాల్రస్ జంతువు కళ్లు మరియు దంతాలలా (:=) ఉండటం వల్ల దీనికి ఆ పేరు వచ్చింది.
దీని ప్రత్యేకత ఏమిటంటే: ఒక కండిషన్ లేదా ఎక్స్ప్రెషన్ లోపలే వేరియబుల్కు విలువను అసైన్ చేయడం మరియు వెంటనే పరీక్షించడం!
msg = input("మెసేజ్ రాయండి: ")
if len(msg) > 10: print("చాలా పొడవైన మెసేజ్!")
# ఆధునిక వాల్రస్ విధానం (1 లైన్):
if (n := len(msg := input("మెసేజ్ రాయండి: "))) > 10:
print(f"మెసేజ్ పొడవు {n} అక్షరాలు, ఇది అనుమతించబడదు!")
7 కోడ్ డెమో 2: చైన్డ్ కంపారిజన్స్, షార్ట్-సర్క్యూట్ & వాల్రస్ ఆపరేటర్
ఈ ఆధునిక పైథాన్ ఫీచర్లు నిజమైన ప్రొడక్షన్ కోడ్లో ఎలా సమయాన్ని ఆదా చేస్తాయో క్రింది ఉదాహరణలో చూడండి:
# చైన్డ్ కంపారిజన్స్, షార్ట్-సర్క్యూటింగ్ & వాల్రస్ ఆపరేటర్ డెమో
# 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, సింగిల్టన్ ఆబ్జెక్టులు, లేదా ఆబ్జెక్ట్ ఐడెంటిటీని నిర్ధారించడానికి. |
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 ఆపరేటర్లను ఉపయోగిస్తాము:
- స్ట్రింగ్స్ లో సబ్స్ట్రింగ్ సెర్చ్:
"python" in "learn python in telugu"=>True. - లిస్ట్లలో ఎలిమెంట్ ఉనికి:
404 in [200, 301, 404, 500]=>True. - డిక్షనరీలలో కీ సెర్చ్: డిక్షనరీపై
inవాడినప్పుడు అది కీలను (Keys) మాత్రమే వెతుకుతుంది:user = {"id": 101, "role": "admin"}"role" in user=>True;"admin" in user=>False(విలువలను వెతకాలంటే"admin" in user.values()వాడాలి). - పెర్ఫార్మెన్స్ గమనిక: లిస్ట్ లేదా టపుల్లో
inవెతకడం $O(N)$ లీనియర్ టైమ్ పడుతుంది; కానీ సెట్స్ (Set) లేదా డిక్షనరీలలో హాష్ టేబుల్ ఉండటం వల్ల $O(1)$ కాన్స్టాంట్ టైమ్ లో తక్షణమే వెతుకుతుంది!
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 |
# రియల్-వరల్డ్ బిట్వైజ్ పర్మిషన్ సిస్టమ్ (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 కామన్ బిగినర్స్ మిస్టేక్స్ & ప్రొడక్షన్ బెస్ట్ ప్రాక్టీసెస్
- Mistake 1: అసైన్మెంట్ (
=) మరియు ఈక్వాలిటీ (==) గందరగోళం:if x = 5:అని రాస్తే సింటాక్స్ ఎర్రర్ వస్తుంది. పోల్చడానికి ఎల్లప్పుడూ రెండు ఈక్వల్స్==వాడాలి. - Mistake 2: ఫ్లోట్స్ను
==తో నేరుగా పోల్చడం: బైనరీ ఫ్లోటింగ్ పాయింట్ ప్రెసిషన్ వల్ల0.1 + 0.2 == 0.3ఫాల్స్ అవుతుంది! ఫ్లోటింగ్ పాయింట్ సంఖ్యలను పోల్చడానికిmath.isclose(a, b)వాడాలి. - Mistake 3: పెద్ద సంఖ్యలకు
isవాడటం: పైథాన్-5నుండి256వరకు మాత్రమే క్యాష్ చేస్తుంది.x = 1000; y = 1000; x is yఅనేదిFalseరావచ్చు! కాబట్టి విలువల కోసం ఎల్లప్పుడూ==వాడండి. - Mistake 4: ఎక్స్పోనెన్షియేషన్ అసోసియేటివిటీ:
2 ** 3 ** 2విలువ 64 కాదు; కుడి నుండి ఎడమకు లెక్కించడం వల్ల2 ** (3 ** 2) = 2 ** 9 = 512అవుతుంది!
13 రియల్-వరల్డ్ ప్రాజెక్ట్: "Enterprise E-Commerce Discount, Loyalty & Tax Pricing Engine"
ఈ ఐదవ అధ్యాయంలో నేర్చుకున్న అన్ని అంశాలను (అర్థమెటిక్, చైన్డ్ కంపారిజన్స్, లాజికల్ షార్ట్-సర్క్యూటింగ్, వాల్రస్ ఆపరేటర్, ఐడెంటిటీ, మెంబర్షిప్ మరియు బిట్వైజ్ పర్మిషన్స్) కలగలిపి — ఒక పూర్తి స్థాయి Enterprise Dynamic Pricing & Loyalty Engine ను నిర్మిద్దాం!
# =====================================================================
# చాప్టర్ 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 వాల్రస్ ఆపరేటర్ (:=) వల్ల కలిగే ముఖ్య ప్రయోజనం ఏమిటి?
ఈ Pricing & Loyalty Engine ప్రాజెక్ట్ను లైవ్గా మన కంపైలర్లో రన్ చేయండి!
ఎటువంటి లోకల్ సెటప్ లేకుండా, బ్రౌజర్లోనే Modern Python 3 కంపైలర్లో ఈ కోడ్ను ఎగ్జిక్యూట్ చేసి అవుట్పుట్ చూడండి.