පයිතන්ට ත්‍රිමාණ කොන්දේසි සහිත ක්‍රියාකරුවෙකු සිටීද?


6053

පයිතන්ට ත්‍රිමාණ කොන්දේසි සහිත ක්‍රියාකරුවෙකු නොමැති නම්, වෙනත් භාෂා ව්‍යුහයන් භාවිතා කරමින් එකක් අනුකරණය කළ හැකිද?


149
ඉහත විවරණයක සඳහන් කර ඇති පයිතන් 3.0 නිල ලියකියවිලි වල මෙය "කොන්දේසි සහිත_ ප්‍රකාශන" ලෙස හඳුන්වනු ලබන අතර එය ඉතා ගුප්ත ලෙස අර්ථ දක්වා ඇත. එම ලියකියවිලි වල "තෘතීය" යන පදය පවා ඇතුළත් නොවේ, එබැවින් ඔබ සෙවිය යුතු දේ හරියටම නොදැන සිටියහොත් එය ගූගල් හරහා සොයා ගැනීමට ඔබට අපහසු වනු ඇත. මෙම අනුවාදය 2 ප්රලේඛනය වැඩි තරමක් ප්රයෝජනවත් වන අතර, කිරීමට සබැඳියක් ඇතුළත් "පී 308" , මෙම ප්රශ්නය හා සම්බන්ධ රසවත් ඓතිහාසික සන්දර්භය ගොඩක් ඇතුළත් වන.
නොබාර්

26
“ත්‍රිකෝණය” (යෙදවුම් තුනක් තිබීම) මෙම ආවේගයේ ප්‍රති consequ ලදායක දේපලක් මිස සංකල්පයේ නිර්වචන දේපලක් නොවේ. උදා: SQL case [...] { when ... then ...} [ else ... ] endසමාන බලපෑමක් ඇති නමුත් කිසිසේත් ත්‍රිත්ව නොවේ.
user313114

10
ISO / IEC 9899 (C ක්‍රමලේඛන භාෂා ප්‍රමිතිය) 6.5.15 වගන්තිය එය “කොන්දේසි සහිත ක්‍රියාකරු” ලෙස
හඳුන්වයි

9
විකිපීඩියාව මෙය " ?: " ලිපියේ තරයේ ආවරණය කරයි .
HelloGoodbye

9
නොබාර්ගේ අදහස් දැක්වීමේ සිට ගත වූ වසර කිහිපය තුළ කොන්දේසි සහිත ප්‍රකාශන (සමහර විට “ත්‍රික ක්‍රියාකරු” ලෙසද හැඳින්වේ) යැයි
ස්කොට් මාටින්

Answers:


7050

ඔව්, එය 2.5 අනුවාදයේ එකතු කරන ලදි . ප්‍රකාශන වාක්‍ය ඛණ්ඩය:

a if condition else b

පළමුව conditionඇගයීමට ලක් කරනු ලැබේ, පසුව හරියටම එකක් aහෝ bතක්සේරු කර ආපසු ලබා දෙනුයේ බූලියන් අගය මත පදනම්වය condition. conditionඇගයීමට ලක් කරන්නේ නම් True, පසුව aඇගයීමට ලක් කර ආපසු ලබා දෙනු bලැබේ, නමුත් නොසලකා හරිනු ලැබේ, නැතහොත් bඇගයීමට ලක් කර ආපසු ලබා දෙන විට aනොසලකා හරිනු ලැබේ.

මෙය කෙටි පරිපථයකට ඉඩ සලසයි, මන්ද conditionසත්‍යය විටදී පමණක් aඇගයීමට ලක් කෙරෙන අතර bඑය කිසිසේත් ඇගයීමට ලක් නොකෙරේ, නමුත් conditionඅසත්‍ය වූ විට පමණක් bඇගයීමට ලක් කෙරෙන අතර aකිසිසේත් ඇගයීමට ලක් නොකෙරේ.

උදාහරණයක් වශයෙන්:

>>> 'true' if True else 'false'
'true'
>>> 'true' if False else 'false'
'false'

කොන්දේසි ක බව සටහන ප්රකාශනය නොව, එය ප්රකාශය . මෙයින් අදහස් කරන්නේ ඔබට කොන්දේසි සහිත ප්‍රකාශනයක් තුළ පැවරුම් ප්‍රකාශ passහෝ වෙනත් ප්‍රකාශ භාවිතා කළ නොහැකි බවයි :

>>> pass if False else x = 3
  File "<stdin>", line 1
    pass if False else x = 3
          ^
SyntaxError: invalid syntax

කෙසේ වෙතත්, ඔබට එවැනි විචල්‍යයක් පැවරීම සඳහා කොන්දේසි සහිත ප්‍රකාශන භාවිතා කළ හැකිය:

x = a if True else b

කොන්දේසි සහිත ප්‍රකාශනය අගයන් දෙකක් අතර මාරුවීමක් ලෙස සිතන්න. ඔබ 'එක් වටිනාකමක් හෝ වෙනත්' තත්වයක සිටින විට එය ඉතා ප්‍රයෝජනවත් වේ, නමුත් එය වෙනත් බොහෝ දේ නොකරයි.

ඔබට ප්‍රකාශ භාවිතා කිරීමට අවශ්‍ය නම්, කොන්දේසි සහිත ප්‍රකාශනයක් වෙනුවට සාමාන්‍ය if ප්‍රකාශයක් භාවිතා කළ යුතුය .


හේතු කිහිපයක් නිසා සමහර පයිතොනිස්ටා විසින් එය කෝපයට පත් කර ඇති බව මතක තබා ගන්න:

  • තර්ක වල අනුපිළිවෙල condition ? a : bවෙනත් බොහෝ භාෂාවලින් (සී, සී ++, ගෝ, පර්ල්, රූබි, ජාවා, ජාවාස්ක්‍රිප්ට් වැනි) සම්භාව්‍ය ත්‍රික ක්‍රියාකරුගේ ක්‍රමයට වඩා වෙනස් වන අතර එමඟින් පයිතන්ගේ නුහුරු පුද්ගලයින් දෝෂ ඇති විය හැක. පුදුම සහගත "හැසිරීම එය භාවිතා කරයි (ඔවුන් තර්ක අනුපිළිවෙල ආපසු හැරවිය හැක).
  • සමහරු එය සාමාන්‍ය චින්තනයේ ප්‍රවාහයට පටහැනි බැවින් එය “නොසැලකිලිමත්” ලෙස සලකති (පළමුව තත්වය ගැන සිතීම හා පසුව ඇතිවන බලපෑම්).
  • ශෛලීය හේතු. ('පේළිය if' සැබවින්ම ප්‍රයෝජනවත් විය හැකි අතර , ඔබේ ස්ක්‍රිප්ට් වඩාත් සංක්ෂිප්ත කළද , එය ඇත්ත වශයෙන්ම ඔබේ කේතය සංකීර්ණ කරයි)

ඔබට ඇණවුම මතක තබා ගැනීමේ අපහසුතාවයක් තිබේ නම්, ශබ්ද නඟා කියවන විට ඔබ (පාහේ) ඔබ අදහස් කරන දේ පවසන බව මතක තබා ගන්න. උදාහරණයක් ලෙස, x = 4 if b > 8 else 9ශබ්ද නඟා කියවනු ලැබේ x will be 4 if b is greater than 8 otherwise 9.

නිල ලියකියවිලි:


270
f(x) = |x| = x if x > 0 else -xගණිත ians යන්ට මෙය ස්වාභාවික යැයි හැඟෙන නමුත් කේත රචකයන්ට මෙම ඇණවුම අමුතු යැයි පෙනේ . බොහෝ විට A මෙන් ඔබටත් එය තේරුම් ගත හැකිය, C විට හැර ඔබ ඒ වෙනුවට B කළ යුතුය ...
yota

122
මෙය භාවිතා කරන විට මෙහෙයුම් අනුපිළිවෙල ගැන සැලකිලිමත් වන්න. උදාහරණයක් ලෙස, රේඛාව z = 3 + x if x < y else y. නම් x=2සහ y=1, ඔබට එම 4 යටත් කිරීමට බලාපොරොත්තු විය හැකිය, එහෙත් එය ඇත්තටම 1. යටත් වනු ඇත z = 3 + (x if x > y else y)නිවැරදි භාවිතය වේ.
කල් සෙක්ඩෝර්

11
කාරණය වූයේ කොන්දේසිගත ඇගයීමෙන් පසු අමතර ඇගයීම් සිදු කිරීමට ඔබට අවශ්‍ය නම් z = 3 + x if x < y else 3 + y, z = 3 + (x if x < y else y)z = (x if x < y else y) + 3
ප්‍රති result ලයට

4
RMrGeek, ඔබ අදහස් කරන දේ මට පෙනේ, එබැවින් ඔබ මූලික වශයෙන් මෙහෙයුම් කැදැල්ල කරනු ඇත: `" foo "නම් Bool (" bar "නම් Bool else" foobar ")`
Dimesio

3
ගණිත ian යාට වඩා ක්‍රමලේඛකයන්ට නිවැරදි නිවැරදි සූත්‍රගත කිරීමක් අවශ්‍ය වේ, මන්ද ගණිතයේ සෑම විටම යටින් පවතින සංකල්ප වෙත යොමුවීමකි. ඒත්තු ගැන්වෙන තර්කයක් නම්% ක්‍රියාකරු, ගණිතයේ “මෝඩ්” භාවිතා කරන ආකාරය අනුකරණය කිරීම ව්‍යසනයක් වනු ඇත. ඉතින් නැහැ, මම ඔබේ තර්කය පිළිගන්නේ නැහැ. එය අධිරාජ්‍ය ඒකකවලට අනුගත වීම වැනිය. ග්‍රොට්ජස් ඇල්බට්
ඇල්බට් වැන් ඩර් හෝස්ට්

801

ඔබට ටුපල් එකකට සුචිගත කළ හැකිය:

(falseValue, trueValue)[test]

testසත්‍ය හෝ අසත්‍යය ආපසු ලබා දිය යුතුය .
සෑම විටම එය ක්‍රියාත්මක කිරීම ආරක්ෂිත විය හැකිය:

(falseValue, trueValue)[test == True]

හෝ ඔබට බූලියන් අගයක් bool()සහතික කිරීම සඳහා සාදන ලද භාවිතා කළ හැකිය :

(falseValue, trueValue)[bool(<expression>)]

591
මෙය සැමවිටම සෑම දෙයක්ම ඇගයීමට ලක් කරන බව සලකන්න.
සිල්වර්බැක්නෙට්

117
(lambda: print("a"), lambda: print("b"))[test==true]()
ඩස්ටින් ගෙට්ස්

15
[]S තුළ ඇති දේ අත්තනෝමතික ප්‍රකාශනයක් විය හැකි බව සැලකිල්ලට ගත යුතුය. එසේම, ආරක්ෂාව සඳහා ඔබට ලිවීමෙන් සත්‍යතාව සඳහා පැහැදිලිව පරීක්ෂා කළ හැකිය [bool(<expression>)]. මෙම bool()v2.2.1 සිට උත්සවය වටා වී ඇත.
මාර්ටිනෝ

12
සමග ශක විසින් ශබ්දකෝෂය තුළට - මම සමාන උපක්රමය කරලා තියෙන්නෙ - එකම එක් වරක් හෝ දෙවරක්, නමුත් එය සිදු Trueහා False: යතුරු ලෙස {True:trueValue, False:falseValue}[test] මම මේ කිසිම අඩු කාර්යක්ෂම ද මම දන්නේ නෑ, නමුත් එය මුළු අවම වශයෙන් වැලැක්විමට දී කරන්නේ "අලංකාර" එදිරිව "කැත" විවාදය. ඔබ ඉන්ටර්නෙට් එකකට වඩා බූලියන් සමඟ ගනුදෙනු කරන බවට කිසිදු අවිනිශ්චිතතාවයක් නොමැත.
JDM


339

2.5 ට පෙර අනුවාද සඳහා, උපක්‍රමය තිබේ:

[expression] and [on_true] or [on_false]

on_true ව්‍යාජ බූලියන් අගයක් ඇති විට එය වැරදි ප්‍රති results ල ලබා දිය හැකිය . 1
ප්‍රකාශන වමේ සිට දකුණට තක්සේරු කිරීමේ වාසිය එයට තිබුණද, එය මගේ මතය අනුව පැහැදිලි ය.

1. සී ගේ “?” ට සමානද?


67
පිළියම වන්නේ මෙම උගුල මඟහරවා ගැනීම (පරීක්ෂා කිරීම සහ [සත්‍ය_ අගය] හෝ [සාවද්‍ය_ අගය]) [0] භාවිතා කිරීමයි.
තෝමස් එච්

6
තෘතීය ක්‍රියාකරු සාමාන්‍යයෙන් වේගයෙන් ක්‍රියාත්මක කරයි (සමහර විට 10-25% කින්).
ගිනි කන්ද

7
olvolcano ඔබට මා සඳහා ප්‍රභවයක් තිබේද?
OrangeTux

4
RangeOrangeTux මෙන්න විසුරුවා හරින ලද කේතය . තෝමස් එච් යෝජනා කළ ක්‍රමය භාවිතා කිරීම ඊටත් වඩා මන්දගාමී වනු ඇත.
mbomb007

266

<expression 1> if <condition> else <expression 2>

a = 1
b = 2

1 if a > b else -1 
# Output is -1

1 if a > b else -1 if a < b else 0
# Output is -1

83
මෙය ත්‍රිමාණ ක්‍රියාකරුගේ මූලික අභිප්‍රාය අවධාරණය කරයි: අගය තේරීම. එක් ප්‍රකාශනයකට එක් ත්‍රිකෝණයකට වඩා දම්වැල් බැඳ තැබිය හැකි බව ද එය පෙන්වයි.
රෝයි ටින්කර්

6
Ra ක්‍රේග්, මම එකඟ වෙමි, නමුත් වරහන් නොමැති විට කුමක් සිදුවේදැයි දැන ගැනීමද ප්‍රයෝජනවත් වේ. තාත්වික කේතයේ දී, මම ද පැහැදිලි වර්‍ග ඇතුළත් කිරීමට නැඹුරු වෙමි.
ජෝන් කුම්බ්ස්

160

සිට ලේඛගතකිරීම :

සියලුම පයිතන් මෙහෙයුම් වල අවම ප්‍රමුඛතාවය කොන්දේසි සහිත ප්‍රකාශන (සමහර විට “ත්‍රික ක්‍රියාකරු” ලෙස හැඳින්වේ) ඇත.

ප්‍රකාශනය x if C else yමුලින්ම තත්වය තක්සේරු කරයි, සී ( x නොවේ ); නම් සී සැබෑ වන අතර, x ඇගයීමට ලක් වන අතර එහි වටිනාකම ආපසු ඇත; එසේ නොමැතිනම්, y ඇගයීමට ලක් කර එහි වටිනාකම ආපසු ලබා දෙනු ලැබේ.

කොන්දේසි සහිත ප්‍රකාශන පිළිබඳ වැඩි විස්තර සඳහා PEP 308 බලන්න .

2.5 අනුවාදයේ සිට නව.


121

පයිතන්හි කොන්දේසි සහිත ප්‍රකාශනයක් සඳහා ක්‍රියාකරුවෙකු 2006 දී පයිතන් වැඩිදියුණු කිරීමේ යෝජනාව 308 හි කොටසක් ලෙස එකතු කරන ලදී . එහි ස්වරූපය පොදු ?:ක්‍රියාකරුට වඩා වෙනස් වන අතර එය:

<expression1> if <condition> else <expression2>

එය සමාන වේ:

if <condition>: <expression1> else: <expression2>

මෙන්න උදාහරණයක්:

result = x if a > b else y

භාවිතා කළ හැකි තවත් වාක්‍ය ඛණ්ඩයක් (2.5 ට පෙර අනුවාද සමඟ අනුකූල වේ):

result = (lambda:y, lambda:x)[a > b]()

එහිදී ඔපෙරන්ඩ් කම්මැලි ලෙස ඇගයීමට ලක් කෙරේ .

තවත් ක්‍රමයක් නම්, ටුපල් එකක් සුචිගත කිරීමයි (එය වෙනත් බොහෝ භාෂාවල කොන්දේසි සහිත ක්‍රියාකරුට අනුකූල නොවේ):

result = (y, x)[a > b]

හෝ පැහැදිලිවම ඉදිකරන ලද ශබ්දකෝෂය:

result = {True: x, False: y}[a > b]

තවත් (අඩු විශ්වසනීය), නමුත් සරල ක්‍රමයක් වන්නේ භාවිතා කිරීම andසහ orක්‍රියාකරුවන්:

result = (a > b) and x or y

කෙසේ වෙතත් මෙම නම් වැඩ නැහැ xවනු ඇත False.

ඒ හැකි වක් බවට පත් කිරීම xහා yපහත සඳහන් පරිදි ලැයිස්තු හෝ tuples:

result = ((a > b) and [x] or [y])[0]

හෝ:

result = ((a > b) and (x,) or (y,))[0]

ඔබ ශබ්ද කෝෂ සමඟ වැඩ කරන්නේ නම්, ත්‍රිමාණ කොන්දේසියක් භාවිතා කරනවා වෙනුවට, ඔබට එයින් ප්‍රයෝජන ගත හැකිය get(key, default), උදාහරණයක් ලෙස:

shell = os.environ.get('SHELL', "/bin/sh")

මූලාශ්‍රය: ?: විකිපීඩියාවේ පයිතන් හි


1
result = {1: x, 0: y}[a > b]විය හැකි තවත් ප්රභේදයකි ( Trueහා Falseඇත්තටම අගයන් නිඛිල 1සහ 0)
වෝල්ටර් Tross

99

අවාසනාවකට මෙන්

(falseValue, trueValue)[test]

විසඳුමට කෙටි පරිපථ හැසිරීම් නොමැත; මේ අනුව දෙකම falseValueසහ trueValueතත්වය නොසලකා ඇගයීමට ලක් කෙරේ. මෙම වියලි හෝ සපිරි විය හැකි (එනම් දෙකම trueValueහා falseValueක්රම විය යුතු අතර අතුරු බලපෑම් ඇති විය හැකි).

මේ සඳහා එක් විසඳුමක් වනු ඇත

(lambda: falseValue, lambda: trueValue)[test]()

(ජයග්‍රාහකයා දැන ගන්නා තෙක් ක්‍රියාත්මක කිරීම ප්‍රමාද වේ;)), නමුත් එය කැඳවිය හැකි සහ කැඳවිය නොහැකි වස්තූන් අතර නොගැලපීමක් හඳුන්වා දෙයි. ඊට අමතරව, දේපල භාවිතා කිරීමේදී එය නඩුව විසඳන්නේ නැත.

කතාව ඉදිරියට යයි - සඳහන් කළ විසඳුම් 3 ක් අතරින් තෝරා ගැනීම කෙටි පරිපථ අංගයක් තිබීම, අවම වශයෙන් අයිතන් 2.5 (IMHO තවදුරටත් ගැටළුවක් නොවේ) භාවිතා කිරීම සහ " trueValue-අවස්ථා-සිට-අසත්‍ය" දෝෂ වලට ගොදුරු නොවීම අතර හුවමාරුවකි. .


2
ලැම්බඩස් උපක්‍රමය ක්‍රියාත්මක වන අතර, ත්‍රික ක්‍රියාකරුට දළ වශයෙන් 3x ක් ගතවේ. එය දිගු දාමයක් ප්‍රතිස්ථාපනය කළ හැකි නම් එය සාධාරණ අදහසක් වනු ඇත if else if.
පර්කින්ස්

72

විවිධ ක්‍රමලේඛන භාෂාවල තෘතීය ක්‍රියාකරු

මෙන්න මම ternary operatorක්‍රමලේඛන භාෂා කිහිපයක් අතර වැදගත් වෙනසක් පෙන්වීමට උත්සාහ කරමි .

ජාවාස්ක්‍රිප්ට් හි තෘතීය ක්‍රියාකරු

var a = true ? 1 : 0;
# 1
var b = false ? 1 : 0;
# 0

රූබි හි තෘතීය ක්‍රියාකරු

a = true ? 1 : 0
# 1
b = false ? 1 : 0
# 0

ස්කාලා හි තෘතීය ක්‍රියාකරු

val a = true ? 1 | 0
# 1
val b = false ? 1 | 0
# 0

ආර් ක්‍රමලේඛනයේ තෘතීය ක්‍රියාකරු

a <- if (TRUE) 1 else 0
# 1
b <- if (FALSE) 1 else 0
# 0

පයිතන් හි තෘතීය ක්‍රියාකරු

a = 1 if True else 0
# 1
b = 1 if False else 0
# 0


5
එය මතයක් ඇති බවක් පෙනෙන්නට තිබේ; නමුත් එහි මූලික වශයෙන් කියැවෙන්නේ එය පයිතන් වාක්‍ය ඛණ්ඩය කිසි විටෙකත් ත්‍රිමාණ ක්‍රියාකරුවෙකු දැක නැති පුද්ගලයෙකුට තේරුම් ගත හැකි වන අතර, එහි අර්ථය කුමක්දැයි මුලින් පවසා නොමැති නම් ඉතා සුළු පිරිසකට වඩාත් සුපුරුදු වාක්‍ය ඛණ්ඩය අවබෝධ වනු ඇත.
fralau

1
ඇල්ගොල් 68: a = .if. .සැබෑ. .එවිට. 1 .එසේම. 0 .fi. මෙයද ප්‍රකාශ කළ හැකිය a = (. සත්‍ය. | 1 | 0) සුපුරුදු පරිදි ඇල්ගොල් 68 යනු එහි අනුප්‍රාප්තිකයන්ට වඩා වැඩිදියුණු කිරීමකි.
ඇල්බට් වැන් ඩර් හෝස්ට්

63

පයිතන් 2.5 සහ නව සඳහා විශේෂිත වාක්‍ය ඛණ්ඩයක් ඇත:

[on_true] if [cond] else [on_false]

පැරණි පයිතන් වල ත්‍රික ක්‍රියාකරු ක්‍රියාත්මක නොවන නමුත් එය අනුකරණය කළ හැකිය.

cond and on_true or on_false

නමුත්, එය නම් හැකි, ගැටළුව, පවතින condඇගයීමට කිරීමට Trueහා on_trueකිරීමට ඇගයීමට Falseපසුව on_falseවෙනුවට ආපසු on_true. ඔබට මෙම හැසිරීම අවශ්‍ය නම් ක්‍රමය හරි, එසේ නොමැතිනම් මෙය භාවිතා කරන්න:

{True: on_true, False: on_false}[cond is True] # is True, not == True

ඔතා තැබිය හැකි:

def q(cond, on_true, on_false)
    return {True: on_true, False: on_false}[cond is True]

සහ මේ ආකාරයෙන් භාවිතා කර ඇත:

q(cond, on_true, on_false)

එය සියලුම පයිතන් අනුවාද සමඟ අනුකූල වේ.


2
හැසිරීම සමාන නොවේ - q("blob", on_true, on_false)ප්‍රතිලාභ on_false, නමුත් on_true if cond else on_falseප්‍රතිලාභ on_true. මෙම දුෂ්කරතාවය මගහැර ප්රතිස්ථාපනය කිරීමයි condසමග cond is not Noneබව පරිපූර්ණ විසඳුමක් නොවේ වුවත්, මෙම නඩු.

5
bool(cond)ඒ වෙනුවට නොවන්නේ ඇයි cond is True? පළමුවැන්නා සත්‍යය පරීක්ෂා කරයි cond, දෙවැන්න Trueවස්තුව සමඟ දර්ශක-සමානාත්මතාවය පරීක්ෂා කරයි . Nd ඇන්ඩ rew සීසිල් විසින් ඉස්මතු කර ඇති පරිදි "blob"එය සත්‍යවාදී නමුත් එය ය is not True.
ජොනස් කොල්කර්

ඇවැත්නි. :) තාක්ෂණික වශයෙන්, ඔබට ලිවීමට පවා [on_false, on_True][cond is True]හැකි වන පරිදි ප්‍රකාශනය කෙටි වේ.
ආර්සෙනී

මෙම පිළිතුරෙහි කෙටි පරිපථයක් නොමැත. On_true සහ on_false ඇමතීමට මිල අධික නම් මෙය නරක පිළිතුරකි.
හකර්

44

ඔබට බොහෝ විට සොයාගත හැකිය

cond and on_true or on_false

නමුත් මෙය on_true == 0 වන විට ගැටළුවට තුඩු දෙයි

>>> x = 0
>>> print x == 0 and 0 or 1 
1
>>> x = 1
>>> print x == 0 and 0 or 1 
1

මෙම ප්‍රති result ලය සාමාන්‍ය ත්‍රිමාණ ක්‍රියාකරුවෙකු සඳහා ඔබ අපේක්ෂා කරනු ඇත

>>> x = 0
>>> print 0 if x == 0 else 1 
0
>>> x = 1
>>> print 0 if x == 0 else 1 
1

38

පයිතන්ට ත්‍රිමාණ කොන්දේසි සහිත ක්‍රියාකරුවෙකු සිටීද?

ඔව්. සිට ව්යාකරණ ගොනුව :

test: or_test ['if' or_test 'else' test] | lambdef

උනන්දුවේ කොටස නම්:

or_test ['if' or_test 'else' test]

එබැවින්, ත්‍රිමාණ කොන්දේසි සහිත මෙහෙයුමක් පහත පරිදි වේ:

expression1 if expression2 else expression3

expression3කම්මැලි ලෙස ඇගයීමට ලක් කරනු ඇත (එනම්, තක්සේරු කරනු ලබන්නේ expression2බූලියන් සන්දර්භයක් තුළ අසත්‍ය නම් පමණි ). පුනරාවර්තන අර්ථ දැක්වීම නිසා, ඔබට ඒවා දින නියමයක් නොමැතිව දම්වැල් කළ හැකිය (එය නරක ශෛලියක් ලෙස සැලකිය හැකි වුවද)

expression1 if expression2 else expression3 if expression4 else expression5 # and so on

භාවිතය පිළිබඳ සටහනක්:

සෑම දෙයක්ම ifඅනුගමනය කළ යුතු බව සලකන්න else. ලැයිස්තු අවබෝධය සහ උත්පාදක ප්‍රකාශන ඉගෙන ගන්නා පුද්ගලයින්ට මෙය ඉගෙන ගැනීමට අපහසු පාඩමක් විය හැකිය - පයිතන් වෙනත් ප්‍රකාශයක් සඳහා තුන්වන ප්‍රකාශනයක් අපේක්ෂා කරන බැවින් පහත සඳහන් දෑ ක්‍රියා නොකරනු ඇත:

[expression1 if expression2 for element in iterable]
#                          ^-- need an else here

එය මතු කරයි a SyntaxError: invalid syntax. එබැවින් ඉහත දැක්වෙන්නේ එක්කෝ අසම්පූර්ණ තර්කනයකි (සමහර විට පරිශීලකයා ව්‍යාජ තත්ත්වයේ කිසිදු විකල්පයක් අපේක්ෂා නොකරයි) හෝ අදහස් 2 විය හැක්කේ ප්‍රකාශන 2 පෙරණයක් ලෙස භාවිතා කිරීමයි - පහත දැක්වෙන්නේ නීත්‍යානුකූල පයිතන් බව සටහන් කරයි:

[expression1 for element in iterable if expression2]

expression2ලැයිස්තුව අවබෝධය සඳහා පෙරහන් ලෙස ක්රියා කරයි, සහ මෙය නොවේ එය මිශ්ර කොන්දේසි ක්රියාකරු.

වඩාත් පටු නඩුවක් සඳහා විකල්ප වාක්‍ය ඛණ්ඩය:

පහත සඳහන් දේ ලිවීම ඔබට තරමක් වේදනාකාරී විය හැකිය:

expression1 if expression1 else expression2

expression1ඉහත භාවිතය සමඟ දෙවරක් ඇගයීමට ලක් කළ යුතුය. එය හුදෙක් දේශීය විචල්‍යයක් නම් අතිරික්තය සීමා කළ හැකිය. කෙසේ වෙතත්, මෙම භාවිතය සඳහා පොදු සහ ක්‍රියාකාරී පයිතොනික් මෝඩකමක් වන්නේ orකෙටිමං හැසිරීම භාවිතා කිරීමයි :

expression1 or expression2

එය අර්ථ නිරූපණයට සමාන වේ. සමහර ශෛලීය මාර්ගෝපදේශකයින් මෙම භාවිතය පැහැදිලි බව මත සීමා කළ හැකි බව සලකන්න - එය බොහෝ අර්ථයන් ඉතා සුළු වාක්‍ය ඛණ්ඩයකට ඇසුරුම් කරයි.


1
expression1 or expression2expression1 || expression2ජාවාස්ක්‍රිප්ට් හි ඇති අඩුපාඩු /
ධනාත්මකතාවයන්

1
ස්තූතියි, @selurvedu - ඔබ එය කෙළින්ම ලබා ගන්නා තෙක් එය ව්‍යාකූල විය හැකිය. මම අමාරුවෙන් ඉගෙන ගත්තා, ඒ නිසා ඔබේ මාර්ගය එතරම් අපහසු නොවනු ඇත. ;) වෙනත් එකක් නොමැතිව නම්, උත්පාදක ප්‍රකාශනයක් හෝ ලැයිස්තු අවබෝධයක් අවසානයේ දී භාවිතා කළ හැකි දේ පෙරහන් කරනු ඇත. ඉදිරිපස, එය ත්‍රිමාණ කොන්දේසි සහිත මෙහෙයුමක් වන අතර, අනෙක් දේ අවශ්‍ය වේ. චියර්ස් !!
ආරොන් හෝල්

Ar ආරොන්හෝල් ඔබ expressionNසියලු අවස්ථාවන් සඳහා පරිවෘත්තීය භාවිතය අනුකූල වුවද, ප්‍රති result ල ප්‍රකාශන දෙකෙන් කොන්දේසි සහිත පරීක්ෂණ ප්‍රකාශනය වෙන්කර හඳුනාගත් නම් කිරීම සමඟ තේරුම් ගැනීම පහසු විය හැකිය; උදා result1 if condition else result2. , . කැදැල්ල (අකා දම්වැල) කිරීමේදී මෙය විශේෂයෙන් පෙනේ : result1 if condition1 else result2 if condition2 else result3. මේ ආකාරයෙන් කියවන තරම කොතරම් හොඳදැයි බලන්න?
tchrist

සමාලෝචනයට ස්තූතියි - ඔබ සංශෝධන ඉතිහාසය දෙස බැලුවහොත්, මෙම තනතුරට දැනට සංශෝධන දෙකක් තිබේ. මගේ අනෙක් පිළිතුරු බොහොමයක්, විශේෂයෙන් ඉහළම පිළිතුරු නැවත නැවත සලකා බැලීය. මෙම පිළිතුර කිසි විටෙකත් මගේ අවධානයට ලක් නොවන්නේ ප්‍රජා විකී තත්ත්වය මට අන්තර්ගතය සඳහා කිසිදු ගෞරවයක් ලබා නොදෙන නිසා මම කිසි විටෙකත් එහි කිසිදු ඡන්දයක් නොදකින බැවිනි. මට මේ මොහොතේ සංස්කරණයක් කිරීමට ඇත්ත වශයෙන්ම කාලය නොමැති බැවින්, අනාගතයේදී එය නැවත මගේ අවධානයට යොමු වන්නේ කවදාදැයි ගෙම්බා දනී. ඔබ ඉහළම පිළිතුර සංස්කරණය කර ඇති බව මට පෙනේ, එම නිසා මෙම ලිපියෙන් මගේ තොරතුරු ණයට ගැනීමට / උපුටා දැක්වීමට නිදහස් වන්න (සහ ඇප්‍රොපොස් නම් මට උපුටා දක්වන්න!)
ආරොන් හෝල්

23

පයිතන් තෘතීය ක්‍රියාකරු අනුකරණය කිරීම.

උදාහරණයක් වශයෙන්

a, b, x, y = 1, 2, 'a greather than b', 'b greater than a'
result = (lambda:y, lambda:x)[a > b]()

ප්‍රතිදානය:

'b greater than a'

සරලවම result = (y, x)[a < b]නොවන්නේ ඇයි ඔබ lambdaශ්‍රිතය භාවිතා කරන්නේ ?
ග්‍රිජේෂ් චෞහාන්

5
Ri ග්‍රිජේෂ් චෞහාන් “සංයුක්ත” ප්‍රකාශන මත, උදා: ශ්‍රිත ඇමතුමක් ආදිය සම්බන්ධ බැවින්, මෙය අවස්ථා දෙකේදීම ක්‍රියාත්මක වේ. මෙය අවශ්‍ය නොවනු ඇත.
glglgl

20

ත්‍රිමාණ කොන්දේසි සහිත ක්‍රියාකරු හුදෙක් කේතය සංයුක්ත කරමින් බහු රේඛාව වෙනුවට තනි පේළියක කොන්දේසියක් පරීක්ෂා කිරීමට ඉඩ දෙයි.

වාක්‍ය ඛණ්ඩය:

[on_true] [ප්‍රකාශනය] වෙනත් [on_false] නම්

1- තෘතීය ක්‍රියාකරු භාවිතා කිරීමට සරල ක්‍රමය:

# Program to demonstrate conditional operator
a, b = 10, 20
# Copy value of a in min if a < b else copy b
min = a if a < b else b
print(min)  # Output: 10

2- ටුපල්, ශබ්ද කෝෂය සහ ලැම්බඩා භාවිතා කිරීමේ සෘජු ක්‍රමය:

# Python program to demonstrate ternary operator
a, b = 10, 20
# Use tuple for selecting an item
print( (b, a) [a < b] )
# Use Dictionary for selecting an item
print({True: a, False: b} [a < b])
# lamda is more efficient than above two methods
# because in lambda  we are assure that
# only one expression will be evaluated unlike in
# tuple and Dictionary
print((lambda: b, lambda: a)[a < b]()) # in output you should see three 10

3- තෘතීය ක්‍රියාකරු කැදැල්ල ලෙස ලිවිය හැකි නම්:

# Python program to demonstrate nested ternary operator
a, b = 10, 20
print ("Both a and b are equal" if a == b else "a is greater than b"
        if a > b else "b is greater than a")

ඉහත ප්‍රවේශය මෙසේ ලිවිය හැකිය:

# Python program to demonstrate nested ternary operator
a, b = 10, 20
if a != b:
    if a > b:
        print("a is greater than b")
    else:
        print("b is greater than a")
else:
    print("Both a and b are equal") 
# Output: b is greater than a

1
තෘතීය ක්‍රියාකරු කුඩා (මතකයේ) ඇති අතර කැදැල්ලට වඩා වේගවත් බව සලකන්න. එසේම, ඔබේ කැදැල්ල if-elseඇත්ත වශයෙන්ම තෘතීය ක්‍රියාකරුගේ නැවත ලිවීමක් නොවන අතර, a සහ b හි තෝරාගත් අගයන් සඳහා විවිධ ප්‍රතිදානයන් නිපදවනු ඇත (විශේෂයෙන් එකක් අමුතු __ne__ක්‍රමයක් ක්‍රියාත්මක කරන වර්ගයක් නම් ).
පර්කින්ස්

19

ඔබට මේක කරන්න පුළුවන් :-

[condition] and [expression_1] or [expression_2] ;

උදාහරණයක්:-

print(number%2 and "odd" or "even")

අංකය අමුතු නම් මෙය "අමුතු" හෝ අංකය ඉරට්ටේ නම් "ඉරට්ටේ" ලෙස මුද්‍රණය වේ.


ප්‍රති result ලය : - කොන්දේසිය සත්‍ය නම් exp_1 ක්‍රියාත්මක වේ නම් exp_2 ක්‍රියාත්මක වේ.

සටහන: - 0, කිසිවක් නැත, අසත්‍ය, හිස් ලැයිස්තු, හිස් ස්ට්‍රිං වැරදි ලෙස තක්සේරු කරයි. 0 හැර වෙනත් ඕනෑම දත්ත සත්‍ය ලෙස තක්සේරු කරයි.

එය ක්‍රියාත්මක වන ආකාරය මෙන්න:

තත්වය [තත්වය] “සත්‍ය” බවට පත් වුවහොත්, ප්‍රකාශන_1 ඇගයීමට ලක් කෙරෙන නමුත් ප්‍රකාශන_2 නොවේ. අපි 0 (බිංදුව) සමඟ යමක් "සහ" කළහොත්, ප්‍රති result ලය සැමවිටම ව්‍යාකූල වනු ඇත .ඉතින් පහත ප්‍රකාශයේ,

0 and exp

0 සමඟ "සහ" සැමවිටම ශුන්‍යයට තක්සේරු කරන බැවින් ප්‍රකාශනය එක්ස්ප්රස් කිසිසේත් ඇගයීමට ලක් නොකරන අතර ප්රකාශනය ඇගයීමට අවශ්ය නොවේ. සියලු භාෂාවලින් සම්පාදකයා ක්‍රියා කරන ආකාරය මෙයයි.

තුළ

1 or exp

1 සමඟ "හෝ" සැමවිටම 1 වන බැවින් එක්ස්ප්‍රස් එක්ස්ප්‍රස් එක කිසිසේත් ඇගයීමට ලක් නොකෙරේ. (සම්පාදක ප්‍රශස්තිකරණ ක්‍රම).

නමුත් එසේ නම්

True and exp1 or exp2

දෙවන ප්‍රකාශනය exp2 තක්සේරු නොකෙරේ, මන්ද True and exp1exp1 අසත්‍ය නොවන විට එය සත්‍ය වේ.

ඒ හා සමානව

False and exp1 or exp2

Exp1 ප්‍රකාශනය තක්සේරු නොකෙරේ, අසත්‍යය 0 ලිවීමට සමාන වන අතර "සහ" 0 කිරීම 0 ම වේ. නමුත් exp1 පසු "හෝ" භාවිතා කිරීමෙන් පසුව එය exp2 ප්‍රකාශනය ඇගයීමට ලක් කරනු ඇත.


සටහන: - "හෝ" සහ "සහ" යන අතු බෙදීම් භාවිතා කළ හැක්කේ ප්‍රකාශනය_1 ට සත්‍යයේ සත්‍ය අගයක් නොමැති විට පමණි (හෝ 0 හෝ කිසිවක් නැත, හෝ හිස් වාදකය [] හෝ හිස් නූල් ''.) අසත්‍යය, එවිට exp_1 සහ exp_2 අතර "හෝ" තිබීම නිසා ප්‍රකාශන_2 ඇගයීමට ලක් කෙරේ.

Exp_1 සහ exp_2 සත්‍ය අගයන් කුමක් වුවත්, සියලු අවස්ථාවන් සඳහා එය තවමත් ක්‍රියාත්මක කිරීමට ඔබට අවශ්‍ය නම්, මෙය කරන්න: -

[condition] and ([expression_1] or 1) or [expression_2] ;


ඔබට එය සන්දර්භය තුළ භාවිතා කිරීමට අවශ්‍ය නම් x = [condition] and ([expression_1] or 1) or [expression_2]සහ expression_1අසත්‍යය ඇගයීමට ලක් කරන්නේ xනම් 1, එසේ නොවේ expression_1. පිළිගත් පිළිතුර භාවිතා කරන්න.
moi

18

පිළිතුරකට වඩා ඉඟියක් (හන්ඩ්‍රෙට් වේලාව සඳහා පැහැදිලිව පුනරාවර්තනය කිරීමට අවශ්‍ය නැත), නමුත් සමහර විට මම එවැනි ඉදිකිරීම් වලදී එය ඔනෙලිනර් කෙටිමඟක් ලෙස භාවිතා කරමි:

if conditionX:
    print('yes')
else:
    print('nah')

, බවට පත්වේ:

print('yes') if conditionX else print('nah')

සමහර (බොහෝ :) එය අශෝභන ලෙස (රුබී-ඊෂ් :) යැයි සිතිය හැක, නමුත් මම පෞද්ගලිකව එය වඩාත් ස්වාභාවික යැයි සිතමි - එනම් ඔබ සාමාන්‍යයෙන් එය ප්‍රකාශ කරන්නේ කෙසේද යන්නත්, විශාල කේත සමූහයක් තුළ දෘශ්‍යමය වශයෙන් වැඩි කැමැත්තක් දක්වයි.


5
මම print( 'yes' if conditionX else 'nah' )ඔබේ පිළිතුරට වඩා කැමතියි . :-)
frederick99

එය ඔබට print()අවස්ථා දෙකේදීම අවශ්‍ය නම් - එය තව ටිකක් පයිතොනික් ලෙස පෙනේ, මම පිළිගත යුතුය :) නමුත් ප්‍රකාශන / කාර්යයන් එක හා සමාන නොවේ නම් - සත්‍යය print('yes') if conditionX else Trueලබා ගැනීමට නම්print()conditionX
ටෝඩර් මිනකොව්

ෆ්‍රෙඩ්රික් print('yes') if conditionX else print('nah')99 ගේ ප්‍රකාශයට එකතු කිරීම සඳහා, වළක්වා ගත හැකි තවත් හේතුවක් වන්නේ එය පයිතන් 2 හි සින්ටැක්ස් දෝෂයක් ලබා දීමයි.
තියරි ලතුයිල්

එය සින්ටැක්ස් දෝෂයක් ලබා දීමට ඇති එකම හේතුව පයිතන් 2 මුද්‍රණයේ ප්‍රකාශයක් print "yes"වන අතර, පයිතන් 3 හි එය ශ්‍රිතයක් වන print("yes")බැවිනි. එය ප්‍රකාශයක් ලෙස භාවිතා කිරීමෙන් හෝ වඩා හොඳ - මගින් විසඳිය හැකිය from future import print_function.
ටෝඩර් මිනකොව්

18
a if condition else b

ඔබට මතක තබා ගැනීමට අපහසු නම් මෙම පිරමීඩය කටපාඩම් කරන්න:

     condition
  if           else
a                   b 

14

පයිතන්ගේ කොන්දේසි සහිත ප්‍රකාශනයට විකල්පයක්

"yes" if boolean else "no"

පහත දැක්වෙන්නේ:

{True:"yes", False:"no"}[boolean]

එහි පහත ලස්සන දිගුවක් ඇත:

{True:"yes", False:"no", None:"maybe"}[boolean_or_none]

කෙටිම විකල්පය ඉතිරිව ඇත:

("no", "yes")[boolean]

නමුත් ඒ සඳහා විකල්පයක් නැත

yes() if boolean else no()

ඔබ ඇගයීම වළක්වා ගැනීමට අවශ්ය නම් yes() හා no() දී නිසා,

(no(), yes())[boolean]  # bad

දෙකම no()සහ yes()ඇගයීමට ලක් කෙරේ.


10

බොහෝ ව්‍යුත්පන්න භාෂාවලින් Cසාමාන්‍යයෙන් ත්‍රිමාණ කොන්දේසි සහිත ක්‍රියාකරුගේ සින්ටැක්ස් ඇත:

<condition> ? <expression1> : <expression2>

මුලදී, Python B enevolent D ictator F හෝ L ife (මම අදහස් කළේ ගයිඩෝ වැන් රොසුම්, ඇත්ත වශයෙන්ම) එය ප්‍රතික්ෂේප කර ඇත (පයිතොනික් නොවන විලාසිතාවක් ලෙස), Cභාෂාවට හුරු නැති අයට තේරුම් ගැනීම තරමක් අපහසු බැවින් . එසේම, මහා බඩවැලේ ලකුණට :දැනටමත් බොහෝ භාවිතයන් ඇත Python. PEP 308 අනුමත කිරීමෙන් පසුව , Pythonඅවසානයේදී එහි කෙටිමං කොන්දේසි සහිත ප්‍රකාශනයක් ලැබුණි (අප දැන් භාවිතා කරන්නේ):

<expression1> if <condition> else <expression2>

ඉතින්, පළමුව එය තත්වය ඇගයීමට ලක් කරයි. එය නැවත පැමිණේ නම් True, ප්‍රති result ලය ලබා දීම සඳහා ප්‍රකාශන 1 ඇගයීමට ලක් කෙරේ , එසේ නොමැතිනම් ප්‍රකාශන 2 ඇගයීමට ලක් කෙරේ. කම්මැලි ඇගයීම් යාන්ත්‍ර විද්‍යාව හේතුවෙන් - ක්‍රියාත්මක වන්නේ එක් ප්‍රකාශනයක් පමණි.

මෙන්න උදාහරණ කිහිපයක් (කොන්දේසි වමේ සිට දකුණට ඇගයීමට ලක් කෙරේ):

pressure = 10
print('High' if pressure < 20 else 'Critical')

# Result is 'High'

තෘතීය ක්‍රියාකරුවන් ශ්‍රේණිගතව දම්වැල් දැමිය හැකිය:

pressure = 5
print('Normal' if pressure < 10 else 'High' if pressure < 20 else 'Critical')

# Result is 'Normal'

පහත දැක්වෙන්නේ පෙර පැවති ආකාරයටම ය:

pressure = 5

if pressure < 20:
    if pressure < 10:
        print('Normal')
    else:
        print('High')
else:
    print('Critical')

# Result is 'Normal'

මෙය උපකාරී වේ යැයි සිතමි.


10

දැනටමත් පිළිතුරු දී ඇති පරිදි, ඔව්, පයිතන්හි ත්‍රිමාණ ක්‍රියාකරු සිටී:

<expression 1> if <condition> else <expression 2>

අමතර තොරතුරු:

<expression 1>ඔබට කෙටි පරිපථ ඇගයීම භාවිතා කළ හැකි කොන්දේසිය නම් :

a = True
b = False

# Instead of this:
x = a if a else b

# You could use Short-cirquit evaluation:
x = a or b

PS: ඇත්ත වශයෙන්ම, කෙටි පරිපථ ඇගයීමක් ත්‍රික ක්‍රියාකරු නොවන නමුත් බොහෝ විට ත්‍රිකෝණය භාවිතා කරනුයේ කෙටි පරිපථය ප්‍රමාණවත් වන අවස්ථාවන්හිදී ය.


1
එම short-circuitඇගයීම සඳහා උසස් කරන්න.
CodeIt

7

ඔව්, පයිතන්ට ත්‍රික ක්‍රියාකරු ඇත, මෙන්න එය පෙන්වීමට වාක්‍ය ඛණ්ඩය සහ උදාහරණ කේතය :)

#[On true] if [expression] else[On false]
# if the expression evaluates to true then it will pass On true otherwise On false


a= input("Enter the First Number ")
b= input("Enter the Second Number ")

print("A is Bigger") if a>b else print("B is Bigger")

තව දුරටත් විස්තාරණය කිරීම සඳහා කුමන අංකය
විශාලදැයි

1
printමෙය ඇත්ත වශයෙන්ම හොඳ තේරීමක් නොවේ, මෙය පයිතන් 2 හි සින්ටැක්ස් දෝෂයක් ලබා දෙනු ඇත.
තියරි ලතුයිල්

H තියරි ලැතුයිල් මෙහි මම භාවිතා කළේ මුද්‍රණ () ශ්‍රිතය මුද්‍රණ ප්‍රකාශය නොවේ, මුද්‍රණ කාර්යය පයිතන් 3 සඳහා වන අතර මුද්‍රණ ප්‍රකාශය පයිතන් 2 සඳහා වේ
පයිතන්ලොවර්

SO හි ප්‍රශ්නය දැනටමත් විමසා ඇත, පයිතන් 2 සමඟ එය උත්සාහ කරන්න, එවිට ඔබ විසින්ම දකිනු ඇත. 'මුද්‍රණය (' හෙලෝ ') යනු පයිතන් 2.7 හි පරිපූර්ණ වලංගු වාක්‍ය ඛණ්ඩයකි, නමුත් එය විග්‍රහ කර ඇති ආකාරය නිසා ඔබේ කේතය ඉහත සින්ටැක්ස් දෝෂයක් විසි කරයි.
තියරි ලතුයිල්

2

පැවරුම් සඳහා පයිතන්ට ත්‍රිමාණ ආකාරයක් ඇත; කෙසේ වෙතත් මිනිසුන් දැන සිටිය යුතු කෙටි ආකාරයක් පවා තිබිය හැකිය.

කොන්දේසියක් මත පදනම්ව විචල්‍ය එක් අගයකට හෝ වෙනත් අගයකට පැවරීම අවශ්‍ය වේ.

>>> li1 = None
>>> li2 = [1, 2, 3]
>>> 
>>> if li1:
...     a = li1
... else:
...     a = li2
...     
>>> a
[1, 2, 3]

Ass එවැනි පැවරුම් සිදු කිරීම සඳහා වන දිගු ස්වරූපය මෙයයි.

පහත දැක්වෙන්නේ තෘතීය ස්වරූපයයි. නමුත් මෙය වඩාත් සංක්ෂිප්ත ක්‍රමයක් නොවේ - අවසාන උදාහරණය බලන්න.

>>> a = li1 if li1 else li2
>>> 
>>> a
[1, 2, 3]
>>> 

පයිතන් සමඟ, ඔබට orවිකල්ප පැවරුම් සඳහා සරලව භාවිතා කළ හැකිය .

>>> a = li1 or li2
>>> 
>>> a
[1, 2, 3]
>>> 

ඉහත සිට li1ක්‍රියාත්මක වන Noneඅතර තාර්කික ප්‍රකාශනවල අසත්‍යය ලෙස අන්තර්වාරය සලකයි. එවිට අන්තර් ප්‍රකාශනය දෙවන ප්‍රකාශනය ඉදිරියට ගෙන ගොස් ඇගයීමට ලක් කරයිNone අතර එය හිස් ලැයිස්තුවක් නොවේ - එබැවින් එය a වෙත පවරනු ලැබේ.

මෙය හිස් ලැයිස්තු සමඟ ද ක්‍රියා කරයි. උදාහරණයක් ලෙස, ඔබට aකුමන ලැයිස්තුවක් අයිතම තිබේද යන්න පැවරීමට අවශ්‍ය නම් .

>>> li1 = []
>>> li2 = [1, 2, 3]
>>> 
>>> a = li1 or li2
>>> 
>>> a
[1, 2, 3]
>>> 

මෙය දැන ගැනීමෙන්, ඔබට එවැනි පැවරුම් හමු වූ සෑම විටම ඔබට කළ හැකිය. මෙය නූල් සහ වෙනත් පුනරාවර්තන සමඟ ද ක්‍රියා කරයි. aහිස් නැති ඕනෑම නූලක් ඔබට පැවරිය හැකිය .

>>> s1 = ''
>>> s2 = 'hello world'
>>> 
>>> a = s1 or s2
>>> 
>>> a
'hello world'
>>> 

මම නිතරම සී ටර්නරි සින්ටැක්ස් වලට කැමතියි, නමුත් පයිතන් එය තවත් පියවරක් ඉදිරියට තබයි!

සමහරු මෙය හොඳ ශෛලීය තේරීමක් නොවන බව පැවසිය හැකි බැවින් එය සියලු සංවර්ධකයින්ට ක්ෂණිකව නොපෙනෙන යාන්ත්‍ර විද්‍යාව මත රඳා පවතී. මම පෞද්ගලිකව එම මතයට එකඟ නොවෙමි. පයිතන් යනු වාක්‍ය ඛණ්ඩයට ක්ෂණිකව නොපෙනෙන බොහෝ මෝඩ උපක්‍රම සහිත සින්ටැක්ස් පොහොසත් භාෂාවකි. නමුත් යටින් පවතින පද්ධතියේ යාන්ත්‍ර විද්‍යාව ඔබ වැඩි වැඩියෙන් ඉගෙන ගෙන තේරුම් ගන්නා තරමට ඔබ එය අගය කරයි.


1

වෙනත් පිළිතුරු නිවැරදිව කතා කරන්නේ පයිතන් තෘතීය ක්‍රියාකරු ගැන ය. තෘතීය ක්‍රියාකරු බොහෝ විට භාවිතා කරන නමුත් වඩා හොඳ මෝඩකමක් ඇති අවස්ථාවක් සඳහන් කිරීමෙන් මම අනුපූරක වීමට කැමැත්තෙමි. පෙරනිමි අගයක් භාවිතා කිරීමේ අවස්ථාව මෙයයි.

option_valueඑය සකසා නොමැති නම් පෙරනිමි අගයක් සමඟ භාවිතා කිරීමට අපට අවශ්‍ය යැයි සිතමු :

run_algorithm(option_value if option_value is not None else 10)

හෝ සරලව

run_algorithm(option_value if option_value else 10)

කෙසේ වෙතත්, වඩා හොඳ විසඳුමක් වන්නේ සරලව ලිවීමයි

run_algorithm(option_value or 10)

-2

විචල්‍යය අර්ථ දක්වා ඇත්නම් සහ ඔබට එය කළ හැකි අගයක් තිබේදැයි පරීක්ෂා කිරීමට අවශ්‍ය නම් a or b

def test(myvar=None):
    # shorter than: print myvar if myvar else "no Input"
    print myvar or "no Input"

test()
test([])
test(False)
test('hello')
test(['Hello'])
test(True)

ප්‍රතිදානය කරයි

no Input
no Input
no Input
hello
['Hello']
True

1
සමාන ගැටළු සඳහා ප්‍රයෝජනවත් වන අතර, මෙය ත්‍රිමාණ කොන්දේසියක් නොවේ. එය ප්රතිස්ථාපනය කිරීමට ක්රියා කරයි x if x else y, නමුත් නොවේ x if z else y.
පර්කින්ස්

-2

බහු ක්‍රියාකරුවන් දාමයට පිළිවෙලක්:

f = lambda x,y: 'greater' if x > y else 'less' if y > x else 'equal'

array = [(0,0),(0,1),(1,0),(1,1)]

for a in array:
  x, y = a[0], a[1]
  print(f(x,y))

# Output is:
#   equal,
#   less,
#   greater,
#   equal

-2

පෙරනිමි පයිතන් සින්ටැක්ස් අවුල් සහගත බව මට පෙනේ val = a if cond else b, එබැවින් සමහර විට මම මෙය කරමි:

iif = lambda (cond, a, b): a if cond else b
# so I can then use it like:
val = iif(cond, a, b)

ඇත්ත වශයෙන්ම, සෑම විටම දෙපැත්තෙන්ම (a සහ b) තක්සේරු කිරීමේ අවාසිය එයට ඇත, නමුත් වාක්‍ය ඛණ්ඩය එය මට වඩා පැහැදිලි ය


මෙය සරල val = a if cond else bප්‍රකාශයට වඩා දෙගුණයක් වැඩ, RAM භාවිතය සහ අපැහැදිලි බව පෙනේ.
eatsfood

-3
is_spacial=True if gender = "Female" else (True if age >= 65 else False)

**

එය ඔබේ අවශ්‍යතාවය ලෙස කැදැල්ල කළ හැකිය. සුභ පැතුම්

**

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.