පයිතන් හි ගොල්ෆ් ක්රීඩා කිරීම සඳහා ඔබට ඇති පොදු උපදෙස් මොනවාද? මම සොයන්නේ කේත-ගොල්ෆ් ගැටලුවලට අදාළ කළ හැකි සහ අවම වශයෙන් පයිතන්ට විශේෂිත වූ අදහස් (උදා: "අදහස් ඉවත් කිරීම" පිළිතුරක් නොවේ).
කරුණාකර පිළිතුරකට එක් ඉඟියක් පළ කරන්න.
පයිතන් හි ගොල්ෆ් ක්රීඩා කිරීම සඳහා ඔබට ඇති පොදු උපදෙස් මොනවාද? මම සොයන්නේ කේත-ගොල්ෆ් ගැටලුවලට අදාළ කළ හැකි සහ අවම වශයෙන් පයිතන්ට විශේෂිත වූ අදහස් (උදා: "අදහස් ඉවත් කිරීම" පිළිතුරක් නොවේ).
කරුණාකර පිළිතුරකට එක් ඉඟියක් පළ කරන්න.
Answers:
a=b=c=0
වෙනුවට භාවිතා කරන්න a,b,c=0,0,0
.
a,b,c='123'
වෙනුවට භාවිතා කරන්න a,b,c='1','2','3'
.
කොන්දේසි දිගු විය හැකිය. සමහර අවස්ථාවලදී ඔබට සරල කොන්දේසියක් ආදේශ කළ හැකිය (a,b)[condition]
. condition
සත්ය නම් , b
ආපසු ලබා දෙනු ලැබේ.
සසඳන්න
if a<b:return a
else:return b
මේ සඳහා
return(b,a)[a<b]
a if a<b else b
සහa<b and a or b
(lambda(): b, lambda(): a)[a < b]()
ලැම්බඩාස් සමඟ ඔබේම කෙටි පරිපථයක් සාදන්න
P and A or B
ලබා දෙන ඕනෑම A සඳහා සලකා බලන්න bool(A)=False
. නමුත් (P and [A] or [B])[0]
එම කාර්යය කරනු ඇත. යොමු කිරීම සඳහා diveintopython.net/power_of_introspect/and_or.html බලන්න .
මම වරක් කළ විශාල දෙයක් නම්:
if 3 > a > 1 < b < 5: foo()
වෙනුවට:
if a > 1 and b > 1 and 3 > a and 5 > b: foo()
පයිතන්ගේ සංසන්දනාත්මක ක්රියාකරුවන් රොක් වේ.
පයිතන් 2 හි සෑම දෙයක්ම සැසඳිය හැකි බව භාවිතා කිරීමෙන් ඔබට and
ක්රියාකරුට මේ ආකාරයෙන් වැළකී සිටිය හැකිය . උදාහරණයක් ලෙස, නම් a
, b
, c
හා d
පූර්ණ සංඛ්යා වන අතර,
if a<b and c>d:foo()
එක් අක්ෂරයකින් කෙටි කළ හැකිය:
if a<b<[]>c>d:foo()
මෙය භාවිතා කරන්නේ සෑම ලැයිස්තුවක්ම ඕනෑම නිඛිලයකට වඩා විශාල බවයි.
ලැයිස්තු නම් c
සහ d
මෙය වඩාත් හොඳ වේ:
if a<b<c>d:foo()
3>a>1<b<5
[$a => $b]->[$b <= $a]
:)
if(a<b)+(c>d):foo()
*
. ක or
වනු ඇත+
foo()if 3>a>1<b<5
ඔබ නැවත නැවත සාදන ලද ශ්රිතයක් භාවිතා කරන්නේ නම්, විවිධ තර්ක භාවිතා කරන්නේ නම් එයට නව නමක් ලබා දීම සඳහා එය වඩා අභ්යවකාශ කාර්යක්ෂම විය හැකිය:
r=range
for x in r(10):
for y in r(100):print x,y
සමහර විට ඔබේ පයිතන් කේතයට ඔබට මට්ටම් 2 ක් අවශ්ය වේ. කළ යුතු පැහැදිලි දෙය නම් එක් එක් ඉන්ඩෙන්ටේෂන් මට්ටම සඳහා අවකාශයන් එකක් සහ දෙකක් භාවිතා කිරීමයි.
කෙසේ වෙතත්, පයිතන් 2 ටැබ් සහ අභ්යවකාශ අක්ෂර විවිධ ඉන්ඩෙන්ටින් මට්ටම් ලෙස සලකයි.
මෙයින් අදහස් කරන්නේ පළමු ඉන්ඩෙන්ටේෂන් මට්ටම එක් ඉඩක් විය හැකි අතර දෙවැන්න එක් ටැබ් අක්ෂරයක් විය හැකිය.
උදාහරණයක් වශයෙන්:
if 1:
if 1:
\tpass
\t
ටැබ් අක්ෂරය කොහිද?
TabError: inconsistent use of tabs and spaces in indentation.
නූල් ආදේශනය භාවිතා කරන්න සහ ඔබේ කේතයේ බොහෝ විට පුනරාවර්තනය වන exec
දිගු වචන සමඟ කටයුතු කිරීමට lambda
.
a=lambda b:lambda c:lambda d:lambda e:lambda f:0 # 48 bytes (plain)
exec"a=`b:`c:`d:`e:`f:0".replace('`','lambda ') # 47 bytes (replace)
exec"a=%sb:%sc:%sd:%se:%sf:0"%(('lambda ',)*5) # 46 bytes (%)
ඉලක්කගත නූල බොහෝ විට 'lambda '
වන අතර එය බයිට් 7 ක් දිග වේ. ඔබේ කේත ස්නිපටයේ සිදුවීම් අඩංගු n
වන 'lambda '
අතර එය s
බයිට් දිගු වේ යැයි සිතමු . ඉන්පසු:
plain
විකල්පය වන්නේ s
දිගු බයිට්.replace
විකල්පය වන්නේ s - 6n + 29
දිගු බයිට්.%
විකල්පය වන්නේ s - 5n + 22 + len(str(n))
දිගු බයිට්.සිට බිම් කැබැල්ලක් පුරා ගැලවීම බයිට්plain
: මෙම විකල්ප තුනක් සඳහා, බව අපට පෙනෙනවා
exec"..."%(('lambda ',)*5)
2 බයිට් ගලවයි, සහ ඔබේ හොඳම විකල්පය වේ.exec"...".replace('`','lambda ')
ඔබේ හොඳම විකල්පය වේ.වෙනත් අවස්ථා සඳහා, ඔබට පහත වගුව සුචිගත කළ හැකිය:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 (occurences)
+---------------------------------------------------------
3 | - - - - - - - - - - - - - - r r r r r
4 | - - - - - - - - - r r r r r r r r r r
5 | - - - - - - - r r r r r r r r r r r r
6 | - - - - - r r r r r r r r r r r r r r
7 | - - - - % r r r r r r r r r r r r r r
8 | - - - % % r r r r r r r r r r r r r r
9 | - - - % % r r r r r r r r r r r r r r
10 | - - % % % r r r r r r r r r r r r r r
11 | - - % % % r r r r r r r r r r r r r r
12 | - - % % % r r r r r r r r r r r r r r r = replace
13 | - - % % % r r r r r r r r r r r r r r % = string %
14 | - % % % % r r r r r r r r r r r r r r - = do nothing
15 | - % % % % r r r r r r r r r r r r r r
(length)
නිදසුනක් ලෙස, lambda x,y:
ඔබේ කේතයේ 3 වතාවක් නූල් (දිග 11) සිදුවුවහොත් , ඔබ ලිවීමට වඩා හොඳය exec"..."%(('lambda x,y:',)*3)
.
replace
අති විශාලයි.
.replace("R",'.replace("')
බයිට් සුරැකීමට ඔබ මෙය බොහෝ විට භාවිතා කරන්නේ නම් , වෙනත් බොහෝ ආදේශන ලාභදායී වේ. (එය ඔබගේ කේතය මුළුමනින්ම කියවිය නොහැකි තත්වයට පත් කරයි.)
බොහෝ අයගෙන් එක් නූලක් තෝරා ගැනීමට දීර් s පෙති භාවිතා කරන්න
>>> for x in 0,1,2:print"fbboaaorz"[x::3]
...
foo
bar
baz
එදිරිව
>>> for x in 0,1,2:print["foo","bar","baz"][x]
...
foo
bar
baz
මෙම බූලියන් දෙකේ නඩුවේදී කෙනෙකුට ලිවිය හැකිය
b*"string"or"other_string"
සදහා
["other_string","string"][b]
අන්තර් සම්බන්ධතාව මෙන් නොව, මෙය ඕනෑම දිගකින් යුත් නූල් සඳහා ක්රියා කරයි, නමුත් b
ප්රකාශනයක් නම් ක්රියාකරුගේ ප්රමුඛතා ගැටළු තිබිය හැකිය .
for x in ("foo","bar","baz"): print x
x
. ගොල්ෆ් කළ කොටස "fbboaaorz"[x::3]
එදිරිව එදිරිව ["foo","bar","baz"][x]
. x
වටිනාකම ලබා ගන්නේ කෙසේද යන්න ඔබගේ ගොල්ෆ් විසඳුමේ තවත් කොටසක් වනු ඇත.
පළමු ඉංග්රීසි අංක දොළහෙන් එකක් අඩංගු වන බූලියන් බැලීමේ වගුවක් දෘඩ කේත කිරීමට ඔබට අවශ්ය යැයි පවසන්න n
.
0: False
1: True
2: False
3: False
4: False
5: False
6: False
7: True
8: False
9: True
10:True
11:True
12:False
එවිට, ඔබට මෙම විමසුම් වගුව සංක්ෂිප්තව ක්රියාත්මක කළ හැකිය:
3714>>i&1
එහි ප්රති ing ලයක් ලෙස 0
හෝ 1
සමාන False
වීම True
.
අදහස නම්, මැජික් අංකය වගුව bitstring bin(3714)
= ලෙස ගබඩා කර 0b111010000010
ඇති අතර, n
-වන ඉලක්කම් (අවසානයේ සිට) අනුරූපව n
th වන වගුවට ඇතුළත් වේ. n
අංක n
අවකාශය දකුණට හරවා අවසන් ඉලක්කම් මගින් අපි තුන්වන පිවිසුමට පිවිසෙමු &1
.
මෙම ගබඩා ක්රමය ඉතා කාර්යක්ෂම වේ. විකල්ප සමඟ සසඳන්න
n in[1,7,9,10,11]
'0111010000010'[n]>'0'
ඔබේ විමසුම් වගු ගබඩාවේ බහුකාර්ය ඇතුළත් කිරීම් ලබා ගත හැකිය
340954054>>4*n&15
අදාළ බිටු හතරේ කොටස ලබා ගැනීමට.
භාවිතා `n`
කිරීම වෙනුවට පූර්ණ සංඛ්යාවක් නූලකට පරිවර්තනය කිරීමට භාවිතා කරන්න str(n)
:
>>> n=123
>>> `n`
'123'
ඔබ ජාලකයක සෛල හරහා ගමන් කරන බව පවසන්න m*n
. කැදැලි for
ලූප දෙකක් වෙනුවට , පේළියකට සහ තීරු වලින් එකක් වෙනුවට, ජාලකයේ m*n
සෛල හරහා නැවත ගමන් කිරීම සඳහා තනි පුඩුවක් භාවිතා කිරීම සාමාන්යයෙන් කෙටි වේ . ඔබට ලූපය තුළ කොටුවේ පේළිය සහ තීරුව උකහා ගත හැකිය.
මුල් කේතය:
for i in range(m):
for j in range(n):
do_stuff(i,j)
ගොල්ෆ් කේතය:
for k in range(m*n):
do_stuff(k/n,k%n)
ඇත්ත වශයෙන්ම, ඔබ දෙදෙනා සංකේතවත් වන පරාස දෙකක් ලක්ෂයේ කාටිසීය නිෂ්පාදන වැඩි එල්ලාවල මහතා කරන්නේ (i,j)
ලෙස x=i*n+j
. ඔබ range
ලූපය තුළ මිල අධික ඇමතුමක් සහ ඉන්ඩෙන්ටේෂන් මට්ටමක් ඉතිරි කර ඇත. පුනරාවර්තනයේ අනුපිළිවෙල වෙනස් නොවේ.
භාවිතය //
වෙනුවට /
Python 3. ඔබ වෙත යොමු නම් i
සහ j
බොහෝ අවස්ථාවල, තම තමන්ගේ වටිනාකම් අනුයුක්ත කිරීමට වේගවත් විය හැක i=k/n
, j=k%n
කම්බියක් ඇතුළත.
for i in range(m*n*o): do_stuff(i/n/o,i%(n*o)/o,i%o)
n
: වළළු repl.it/EHwa
itertools.product
කැටයම් ලූපවලට වඩා සංක්ෂිප්ත විය හැකිය, විශේෂයෙන් කාටේෂියානු නිෂ්පාදන උත්පාදනය කිරීමේදී. සහa1, a2, b1, b2
'ab'
'12'
නිඛිල සඳහා n
, ඔබට ලිවිය හැකිය
n+1
පරිදි -~n
n-1
පරිදි ~-n
මොකද බිට් ෆ්ලිප් ~x
එක සමානයි -1-x
. මෙය එකම අක්ෂර සංඛ්යාවක් භාවිතා කරයි, නමුත් ක්රියාකරුගේ ප්රමුඛතාවය සඳහා වක්රව අවකාශ හෝ වර්ග කපා ගත හැකිය.
සසඳන්න:
while n-1: #Same as while n!=1
while~-n:
c/(n-1)
c/~-n
or f(n)+1
or-~f(n)
(n-1)/10+(n-1)%10
~-n/10+~-n%10
මෙම ක්රියාකරුවන් ~
හා ඒකජ -
වඩා ඉහළ තැනක්ද වේ *
, /
, %
, මෙන් නොව ද්විමය +
.
-~-x
එදිරිව එක් බයිට් එකක් ඉතිරි (1-x)
කරයි.
a+b+1
එය වඩාත් සංක්ෂිප්තව ලිවිය හැකිය a-~b
.
n-i-1
සාධාරණයි n+~i
.
පහත දැක්වෙන ටෝකනය ආරම්භ වන්නේ e
නැතිනම් හෝ E
. අංකයක් අනුගමනය කිරීමෙන් ඔබට අවකාශය ඉවත් කළ හැකිය.
උදාහරණයක් වශයෙන්:
if i==4 and j==4:
pass
බවට පත්වේ:
if i==4and j==4:
pass
මෙය සංකීර්ණ එක් පේළි ප්රකාශයකින් භාවිතා කිරීමෙන් අක්ෂර කිහිපයක් ඉතිරි කර ගත හැකිය.
සංස්කරණය කරන්න: @marcog පෙන්වා දුන් පරිදි, ක්රියා 4or a
කරනු ඇත, නමුත් a or4
මෙය විචල්ය නාමයක් සමඟ පටලවා ගන්නා පරිදි නොවේ .
if(i,j)==(4,4):
ඊටත් වඩා කෙටි වන අතර මෙම විශේෂ අවස්ථාවෙහිදීif i==j==4:
4or a
ක්රියා, නමුත් නොවේa or4
0or
එසේම ක්රියා නොකරයි ( 0o
අෂ්ටක සංඛ්යා සඳහා උපසර්ගයකි).
0 or x
සෑම විටම නැවත පැමිණෙන බැවින් එය කෙසේ හෝ වැදගත් නොවේ x
. කපන්නත් පුළුවන් 0 or
.
0or
දිගු සංඛ්යාවක කොටසක් ලෙස හොඳයි. 10 or x
සමාන වේ 10or x
.
පයිතන් 3 හි ලැයිස්තුගත කිරීම සඳහා පුනරාවර්තනයක් පරිවර්තනය කිරීමට හොඳ ක්රමයක් :
ඔබට යම්කිසි ක්රියාකාරීත්වයක් ඇති බව සිතන්න
i = (1,2,3,4)
i = range(4)
i = (x**2 for x in range(5))
නමුත් ඔබට ලැයිස්තුවක් අවශ්යයි:
x=list(i) #the default way
*x,=i #using starred assignment -> 4 char fewer
නූලකින් අක්ෂර ලැයිස්තුවක් සෑදීම ඉතා ප්රයෝජනවත් වේ
s=['a','b','c','d','e']
s=list('abcde')
*s,='abcde'
*s,='abcde'
කර s
මගේ අන්තර්ක්රියාකාරී පයිතන් 3 සෙග්ෆෝල්ට් එකකින් බිඳ දමයි :(
[*'abcde']
.
අනුපිළිවෙල ආපසු හැරවීමට ඔබට හොඳ පැරණි පිටසක්වල සිනහමුසු මුහුණ භාවිතා කළ හැකිය:
[1, 2, 3, 4][::-1] # => [4, 3, 2, 1]
ඒ වෙනුවට range(x)
, ඔබට *
ඇත්ත වශයෙන්ම එහි වටිනාකම භාවිතා කිරීමට අවශ්ය නොවන්නේ නම්, ඔබට ඕනෑම දෙයක් ලැයිස්තුවක් මත ක්රියාකරු භාවිතා කළ හැකිය i
:
for i in[1]*8:pass
විරුද්ධ ලෙස
for i in range(8):pass
ඔබට මෙය දෙවරකට වඩා කිරීමට අවශ්ය නම්, ඔබට ඕනෑම විචල්යයකට විචල්යයක් පැවරිය හැකි අතර එම විචල්යය ඔබට අවශ්ය පරාසය අනුව ගුණ කරන්න:
r=1,
for i in r*8:pass
for i in r*1000:pass
සටහන : මෙය බොහෝ විට වඩා දිගු වේ exec"pass;"*8
, එබැවින් මෙම උපක්රමය භාවිතා කළ යුත්තේ එය විකල්පයක් නොවන විට පමණි.
[1]*8
වලට වඩා කෙටි නිසා range(8)
, ඔබට අවකාශයක් ඉතිරි කර ගත හැකි for i in[...
වන්නේ නීත්යානුකූල නොවන අතර ඉඩක් නොමැති නිසාය for i in range...
" යන්නයි.
exec"pass;"*8
සැලකිය යුතු ලෙස කෙටි වේ.
r=1
, r*8
8 නම් , ඔබට සංඛ්යාවක් හරහා නැවත යෙදිය නොහැක. මම හිතන්නේ ඔබ අදහස් කළේr=[1]
මෙය පැහැදිලි කිරීමට හොඳම ක්රමය උදාහරණයකි:
>>> a,*b,c=range(5)
>>> a
0
>>> b
[1, 2, 3]
>>> c
4
මේ සඳහා භාවිතයක් අපි දැනටමත් දැක ඇත්තෙමු - පයිතන් 3 හි නැවත සැකසිය හැකි ලැයිස්තුවක් බවට පත් කිරීම :
a=list(range(10))
*a,=range(10)
මෙන්න තවත් භාවිතයන් කිහිපයක්.
a=L[-1]
*_,a=L
සමහර අවස්ථාවන්හිදී, පරපෝෂිතයන් මත ඉතිරි කිරීම සඳහා පළමු අංගය ලබා ගැනීම සඳහා මෙය භාවිතා කළ හැකිය:
a=(L+[1])[0]
a,*_=L+[1]
a=1;b=2;c=[]
a,b,*c=1,2
_,*L=L
*L,_=L
මේවා විකල්පයන්ට වඩා කෙටි වන L=L[1:]
අතර L.pop()
. ප්රති result ලය වෙනත් ලැයිස්තුවකට සුරැකිය හැක.
ඉඟි අනුග්රහය @grc
a=1;L=[]
බොහෝ වාර ගණනක් ලියා ඇත. මේ තරම් සරල දෙයකට අක්ෂර සුරැකීමට හැකිවීම පුදුම සහගතය.
a,*L=1,
), නමුත් එය තවමත් එක් වර්ගයක් ඉතිරි කරයි :)
a,*_,b=L
ඔබට මෙවැනි කට්ටල ලිවිය හැකිය. S={1,2,3}
මෙයින් අදහස් කරන්නේ එක් අක්ෂරයක් ඉතිරි කරන {e}&S
වෙනුවට සාමාජිකත්වය පරික්ෂා කළ හැකි e in S
බවයි.
if
හිඩැස් නැති (පවතින බැවින් ගේ if{e}&S:
)
not in
මඟින් ඔබට ප්රතිස්ථාපනය කළ හැකි බව සලකන්න{e}-S
මුළු හෝඩියම ලබා ගැනීමට කෙටි ක්රමයක් ගැන සිතීමට මට නොහැකි වීම අවුරුදු ගණනාවක් තිස්සේ මට කරදරයක් විය. ඔබේ වැඩසටහන තුළ තිබිය යුතු range
තරම් ප්රමාණයක් ඔබ භාවිතා කරන්නේ R=range
නම්, එසේ නම්
[chr(i+97)for i in R(26)]
බොළඳට වඩා කෙටි ය
'abcdefghijklmnopqrstuvwxyz'
, නමුත් වෙනත් ආකාරයකින් එය තනි අක්ෂරයකින් දිගු වේ. ඇස්කි සාරධර්ම පිළිබඳ යම් දැනුමක් අවශ්ය වූ බුද්ධිමත් තැනැත්තා සියලු අක්ෂර ටයිප් කරනවාට වඩා වාචික බව මට හොල්මන් කළේය.
මගේ දියණියගේ හෝඩිය සඳහා මෙම පිළිතුර දකින තුරු . මෙම බුද්ධිය OP හි කාර්යයක් ද නැතිනම් එය විචාරකයෙකුගේ යෝජනාවක් ද යන්න සොයා ගැනීමට තරම් සංස්කරණ ඉතිහාසය මට අනුගමනය කළ නොහැක, නමුත් මෙය (මම විශ්වාස කරමි) අකුරු 26 න් නැවත සැකසිය හැකි කෙටිම ක්රමය මෙයයි. රෝම හෝඩියෙහි.
map(chr,range(97,123))
නඩුව වැදගත් නොවේ නම්, ඔබට ලොකු අකුරක් භාවිතා කර වෙනත් අක්ෂරයක් ඉවත් කළ හැකිය:
map(chr,range(65,91))
මම map
ඕනෑවට වඩා මාර්ගය භාවිතා කරමි , මෙය මට කිසිදා සිදු නොවූයේ කෙසේදැයි මම නොදනිමි.
string.lowercase
- එය එහි ඇත්තේ එයයි.
ord('z')
) වෙනුවට 256 ඇයි ? එය එකම දිගක් හැරුණු විට ... එසේම, ඔබට අක්ෂරාංක අවශ්ය නම්, str.isalpha
@ ක්වින්ටෝපියා අනුවාදය සමඟ ආදේශ කරන්න str.isalnum
. (නමුත් ඔබට අවශ්ය වන්නේ එක් නඩුවක් පමණක් නම්, අක්ෂර 36 කින් යුත් නූල් තවදුරටත් නොවේ filter(str.isalnum,map(chr,range(90)))
.)
R
, මගේ අනුවාදය ඔබේ මුල් පිටපතට වඩා කෙටි ය: '%c'*26%tuple(R(97,123))
(අක්ෂර 24 ක් පමණි) ඔබ අක්ෂර වින්යාසය කළහොත් range
එය හෝඩිය තරම් ඉහළ ය - ලොකු අකුරු කෙටි වේ
පයිතන්ට ස්විච් ප්රකාශ නොමැති වුවද, ඔබට ඒවා ශබ්ද කෝෂවලින් අනුකරණය කළ හැකිය. උදාහරණයක් ලෙස, ඔබට මේ වගේ ස්විචයක් අවශ්ය නම්:
switch (a):
case 1:
runThisCode()
break
case 2:
runThisOtherCode()
break
case 3:
runThisOtherOtherCode()
break
ඔබට if
ප්රකාශ භාවිතා කළ හැකිය , නැතහොත් ඔබට මෙය භාවිතා කළ හැකිය:
exec{1:"runThisCode()",2:"runThisOtherCode()",3:"runThisOtherOtherCode()"}[a]
හෝ මෙය:
{1:runThisCode,2:runThisOtherCode,3:runThisOtherOtherCode}[a]()
සියලුම කේත මාර්ග එකම පරාමිතීන් සහිත ශ්රිත නම් එය වඩා හොඳය.
පෙරනිමි අගයකට සහය දැක්වීම සඳහා මෙය කරන්න:
exec{1:"runThisCode()"}.get(a,"defaultCode()")
(හෝ මේ :)
{1:runThisCode}.get(a,defaultCode)()
මෙහි ඇති තවත් වාසියක් නම්, ඔබට අතිරික්තයක් ඇත්නම්, ශබ්දකෝෂයේ අවසානයෙන් පසුව ඔබට ඒවා එකතු කළ හැකිය:
exec{'key1':'code','key2':'code'}[key]+';codeThatWillAlwaysExecute'
ඔබට වටිනාකමක් ලබා දීම සඳහා ස්විචයක් භාවිතා කිරීමට අවශ්ය නම්:
def getValue(key):
if key=='blah':return 1
if key=='foo':return 2
if key=='bar':return 3
return 4
ඔබට මෙය කළ හැකිය:
getValue=lambda key:{'blah':1,'foo':2,'bar',3}.get(key,4)
dict(s1=v1,s2=v2,...,sn=vn)
වෙනුවට භාවිතා {'s1':v1,'s2':v2,...,'sn':vn}
කිරීම වඩා හොඳ නම් n> = 3
වීජ වටිනාකම් දෙකක් ඇති විට a
සහ b
, ඔබ මේ දෙකම නම් සොයා ගැනීමට අවශ්ය නම්, a
හා b
සැබෑ වන අතර, භාවිතය *
වෙනුවට and
:
if a and b: #7 chars
එදිරිව
if a*b: #3 chars
එක්කෝ අගය අසත්ය නම්, එය 0
එම ප්රකාශයේ දී මෙන් ඇගයීමට ලක් කරනු ඇති අතර පූර්ණ සංඛ්යාවක් සත්ය වන්නේ එය අස්ථිර නම් පමණි.
&
: a=b=False
,a&b
+
සඳහා or
ඔබ සහතික කළ හැකි නම්a != -b
|
සෑම අවස්ථාවකම ක්රියා කරයි.
*
බොහෝ භාෂාවලින් බයිට් කිහිපයක් and
/ සුරකිනවා වෙනුවට &&
.
ලැම්බඩා සමඟ එක් පේළියේ කාර්යයක් කළ හැකිය:
def c(a):
if a < 3: return a+10
else: return a-5
බවට පරිවර්තනය කළ හැකිය (සටහන නැතිවූ ඉඩ 3and
සහ 10or
)
c=lambda a:a<3and a+10or a-5
c=lambda a:a+[-5,10][a<3]
. ඔබ
else:
බැවින් අතහැර දැමිය හැකිය return
, එබැවින් පහත සඳහන් සියල්ල ක්රියාත්මක වන්නේ if
කොන්දේසිය අසමත් වුවහොත් පමණි else
. මේ අනුව else
ආරක්ෂිතව අතහැර දැමිය හැකිය. (එහි ඇති
c=lambda a:a-5+15*(a<3)
x
අක්ෂර `x`
2 ක වියදමින් වස්තුවක් එහි නූල් නිරූපණයට පරිවර්තනය කිරීමට පයිතන් 2 ඔබට ඉඩ දෙයි . වස්තුවට වඩා වස්තුවේ නූලෙන් පහසුවෙන් කළ හැකි කාර්යයන් සඳහා මෙය භාවිතා කරන්න.
අක්ෂර හා සම්බන්ධ වන්න
අක්ෂර ලැයිස්තුවක් ලබා දී l=['a','b','c']
, කෙනෙකුට නිපදවිය ''.join(l)
හැකි `l`[2::5]
අතර එය බයිට් එකක් ඉතිරි කරයි.
හේතුව බව ය `l`
යනු "['a', 'b', 'c']"
එක්, ලැයිස්තුවක් පෙත්තක් සමග ලිපි උපුටා හැකි දෙවන ශුන්ය-සුචිගත චරිතය බව ආරම්භ එසේ (හිස් අවකාශයක්), a
අතර, එහි සිට සෑම පස්වන චරිතය ගනිමින්. බහු-අක්ෂර නූල් හෝ සම්බන්ධ වන අක්ෂර වලින් සම්බන්ධ වීමට මෙය ක්රියා නොකරයි '\n'
.
සංක්ෂිප්ත ඉලක්කම්
ඒ හා සමානව, සමාන අකුරු, හිස්-නොවන ලැයිස්තුව ලබා l=[0,3,5]
, එක් කෙනෙක් වත් string එකකට concatenate හැකි '035'
ලෙස `l`[1::3]
.
මෙය වැනි දෙයක් කිරීමෙන් ඉතිරි map(str,l)
වේ. ඒවා තනි ඉලක්කම් විය යුතු බවත්, 1.0
මිශ්ර කළ පාවෙන ඒවා තිබිය නොහැකි බවත් සලකන්න . එසේම මෙය හිස් ලැයිස්තුවේ අසමත් වන අතර නිෂ්පාදනය ]
කරයි.
නිෂේධනීය දේ සඳහා පරීක්ෂා කරන්න
දැන්, නූල් නොවන කාර්යයක් සඳහා. ඔබ සතුව l
තාත්වික සංඛ්යා ලැයිස්තුවක් ඇති අතර එහි කිසියම් negative ණ සංඛ්යාවක් තිබේදැයි පරීක්ෂා කිරීමට අවශ්ය යැයි සිතමු .
ඔබට කළ හැකිය
'-'in`l`
එය නූල් රෙප් එකේ negative ණ ලකුණක් පරික්ෂා කරයි. මෙය දෙකටම වඩා කෙටි ය
any(x<0for x in l)
min(l+[0])<0
දෙවැන්න සඳහා, min(l)<0
හිස් ලැයිස්තුවේ අසමත් වනු ඇත, එබැවින් ඔබට ආරක්ෂිත විය යුතුය.
str(l)[2::5]
බයිට් 12 ක් වන අතර 19 ට එදිරිව ''.join(map(str,l))
. මෙය පැමිණි සත්ය තත්වයක් ( l
ජනක යන්ත්ර ප්රකාශයක්, ලැයිස්තුවක් නොව) මට එක් බයිට් එකක් පමණක් ඉතිරි කළේය ... එය තවමත් වටී!
ඔබට කවදා හෝ බෙදීමක් සඳහා වටකුරු ප්රති result ලයක් ලබා ගැනීමට අවශ්ය නම් //
, ඔබ බිම සඳහා කළ ආකාරයටම , ඔබට math.ceil(3/2)
15 ක් හෝ ඊට වඩා කෙටි -(-3//2)
බයිට් 8 ක් භාවිතා කළ හැකිය .
math.floor(n) : 13 bytes+12 for import
n//1 : 4 bytes
math.ceil(n) : 12 bytes+12 for import
-(-n//1) : 8 bytes
n//1+1
සිවිලිම වෙනුවට පැන යා හැකි නමුත් එයින් අදහස් කරන්නේ සිවිලිම (n) = n + 1 නමුත් එය සියලු පූර්ණ නොවන අගයන් සඳහා ක්රියා කළ යුතුය
round(x)
යනු (x+.5)//1
+1 බයිට් වන නමුත් දෙවැන්න ආරම්භ වන්නේ a සමඟ වන අතර නියතයකින් සමන්විත එකතුවක් (
නම් x
එය ප්රයෝජනවත් වේ.
කොන්දේසියක් මත පදනම්ව අංක දෙකෙන් එකක් තෝරා ගැනීම
තෘතීය ප්රකාශනය සඳහා බූලියන් සමඟ ලැයිස්තු තේරීම භාවිතා කිරීමට ඔබ දැනටමත් දන්නවා . විචල්යයන් , සහ ද යන දෙකම බවයි සටහන් වුවද, ප්රකාශන විය හැකි සහ තෝරා ගෙන නොමැති විට පවා ඇගයීමට ලක් කර ඇත.[x,y][b]
b
y if b else x
x
y
b
x
y
ඉලක්කම් ඇති විට x
සහ විය හැකි විභව ප්රශස්තිකරණ කිහිපයක් මෙන්න y
.
[0,y][b] -> y*b
[1,y][b] -> y**b
[x,1][b] -> b or x
[x,x+1][b] -> x+b
[x,x-1][b] -> x-b
[1,-1][b] -> 1|-b
[x,~x][b] -> x^-b
[x,y][b] -> x+z*b
(හෝ y-z*b
), එහිදී z = yx.ඔබ ද මාරු කළ හැකිය x
සහ y
ඔබ සකස්කල හැකි නම් b
ඒ වෙනුවට එහි නිශේධනය විය.
මුදා හැරීමත් සමඟ පයිතන් 3.5 , ලැයිස්තු, ටුපල්, කට්ටල සහ අණපනත් හැසිරවීම ගොල්ෆ් ක්රීඩකයෙකු බවට පත්විය.
යුගල සසඳා බලන්න:
set(T)
{*T}
list(T)
[*T]
tuple(T)
(*T,)
වඩා කෙටි! කෙසේ වෙතත්, ඔබට යමක් ලැයිස්තුවකට පරිවර්තනය කර විචල්යයකට පැවරීමට අවශ්ය නම්, සාමාන්ය විස්තාරණය කළ හැකි ඉවත් කිරීම කෙටි වේ:
L=[*T]
*L,=T
ඒ හා සමාන සින්ටැක්ස් ටුපල් සඳහා ක්රියා කරයි:
T=*L,
එය දිගු කළ හැකි නැවත මුදා හැරීම වැනි ය, නමුත් අනෙක් පැත්තෙන් තරු හා කොමාව සමඟ.
දෙපැත්තටම ලැයිස්තුවක් / ටුපල් එකක් එකතු කිරීමට අවශ්ය නම්, ඇසුරුම් කිරීම සංයුක්තතාවයට වඩා මඳක් කෙටි ය:
[1]+T+[2]
[1,*T,2]
(1,)+T+(2,)
(1,*T,2)
මෙය සීමා නොවේ print
, නමුත් එය සැතපුම් ගණනක් පැමිණෙන්නේ නියත වශයෙන්ම ය. PEP448 දැන් බහුවිධ ඇසුරුම් කිරීමට ඉඩ දෙයි, වැනි:
>>> T = (1, 2, 3)
>>> L = [4, 5, 6]
>>> print(*T,*L)
1 2 3 4 5 6
මෙය බොහෝ විට සිදු නොවනු ඇත, නමුත් ඔබ අවම වශයෙන් අයිතම තුනක් වත් යාවත්කාලීන කරන්නේ නම් ශබ්දකෝෂ යාවත්කාලීන කිරීමේදී ඉතිරි කිරීමට සින්ටැක්ස් භාවිතා කළ හැකිය:
d[0]=1;d[1]=3;d[2]=5
d={**d,0:1,1:3,2:5}
මෙය මූලික වශයෙන් ඕනෑම අවශ්යතාවයක් ප්රතික්ෂේප කරයි dict.update
.
+=
වෙනුවට භාවිතා කරන්නappend
extend
A.append(B)
කෙටි කළ හැක්කේ:
A+=B,
B,
මෙහි දීර්ඝ කිරීමට භාවිතා කළ හැකි එක් අංගයක් tuple නිර්මාණය A
වගේ [B]
තුළ A+=[B]
.
A.extend(B)
කෙටි කළ හැක්කේ:
A+=B
return 0
හෝ return 1
සමාන return False
හෝ return True
.
-x
වෙනුවට x*-1
. --8.32
වෙනුවට -8.32*-1
. නැත්නම් 8.32
...
A+=B
B
a බව සලකන්න tuple
.
දේවල් කිරීමේ පොදු විකල්ප ක්රම සඳහා චරිත ගණනය කිරීමේ වෙනස්කම් සඳහා යොමු කිරීමක් ප්රයෝජනවත් වනු ඇතැයි මම සිතමි, එවිට ඒවා භාවිතා කළ යුත්තේ කවදාදැයි මට දැනගත හැකිය. _
ප්රකාශනයක් හෝ කේතයක් දැක්වීමට මම භාවිතා කරමි .
විචල්යයකට අනුයුක්ත කරන්න: +4
x=_;x
_
ඉතින්, ඔබ පවා මෙය කැඩී යයි
_
දෙවන වරට භාවිතා කරන්න :_
දිග 5 ඇත_
තෙවන වර භාවිතා කරන්න : _
දිග 3 ඇතවිචල්යයන් වෙන වෙනම පවරන්න: 0
x,y=a,b
x=a;y=b
a
සමාන වන විටb
x=y=a
lambda
ක්රියාකාරීත්වයට පුළුල් කරන්න def
: +7
lambda x:_
def f(x):return _
_
වමට ස්පර්ශ කළ හැකිprint
නැවත පැමිණීමට වඩා*x
සාමාන්යයෙන්, ඔබ def
ප්රකාශනයක් දෙවරක් භාවිතා කරන විචල්යයකට සුරැකීමට නම්, ප්රකාශනය දිග 12 ක් වුවද මෙය කැඩී යයි.
lambda x:g(123456789012,123456789012)
def f(x):s=123456789012;return g(s,s)
ක්රියාකාරීත්වයට වඩා STDIN: +1
def f(x):_;print s
x=input();_;print s
_
තනි පේළියක් නොවන්නේ නම් අවශ්ය වන කේත රේඛාව සඳහා -1raw_input
පයිතන් 2 හි අවශ්ය නම් +4return
ට වඩා ශ්රිතය අවශ්ය නම් +1 කරන්නprint
පෙරළීමට exec
වඩා භාවිතා කරන්න range(n)
: +0
for i in range(n):_
i=0;exec"_;i+=1;"*n
exec()
range(c,c+n)
තනි වරහන සඳහා පරාසය මාරු කළහොත්c
n
කිරීමට 1
හරහාrange(n,0,-1)
map
පුඩුවක් තුළ අතින් යොදන්න : +0
for x in l:y=f(x);_
for y in map(f,l):_
map
ලැයිස්තු අවබෝධය තුළ අතින් යොදන්න : +8
map(f,l)
[f(x)for x in l]
f
ලිවිය යුතු අතර එමඟින් සමස්ත වර්ග 4 ක් අහිමි වේ.map
lambda
lambda x:f(x)
filter
ලැයිස්තු අවබෝධය තුළ අතින් යොදන්න : +11
filter(f,l)
[x for x in l if f(x)]
f(x)
ප්රකාශනයට වම් පැත්තට ස්පර්ශ කළ හැකි නම්f
ලිවිය යුතු අතර එය සමස්ත වර්ග 1 ක් අහිමි වේ.filter
lambda
lambda x:f(x)
ආනයනය * එදිරිව ආනයන තනි භාවිතයට: +4
import _;_.f
from _ import*;f
_
5 දිග ඇති විට පවා කැඩී යයිimport _ as x;x.f
බහු ආනයන හැර සෑම විටම නරක ය__import__('_').f
එය වඩාත් නරක යයෝජනා සහ නිවැරදි කිරීම් සඳහා @ Sp3000 ට ස්තූතියි.