# _*_ coding: utf-8 _*_
"""ç±»ååè¿ç®----ç±»ååè¿ç®----ç±»ååè¿ç®----ç±»ååè¿ç®----ç±»ååè¿ç®----ç±»ååè¿ç®----ç±»ååè¿ç®----ç±»ååè¿ç®----ç±»ååè¿ç®----ç±»ååè¿ç®----ç±»ååè¿ç®"""
#-- 寻æ±å¸®å©:
dir(obj) # ç®åçååºå¯¹è±¡objæå
å«çæ¹æ³åç§°ï¼è¿åä¸ä¸ªå符串å表
help(obj.func) # æ¥è¯¢obj.funcçå
·ä½ä»ç»åç¨æ³
#-- æµè¯ç±»åçä¸ç§æ¹æ³ï¼æ¨è第ä¸ç§
if type(L) == type([]):
print("L is list")
if type(L) == list:
print("L is list")
if isinstance(L, list):
print("L is list")
#-- Pythonæ°æ®ç±»åï¼åå¸ç±»åãä¸å¯åå¸ç±»å
# åå¸ç±»åï¼å³å¨åå°ä¸è½æ¹åçåéç±»åï¼ä¸å¯åç±»åãå¯å©ç¨hash彿°æ¥çå
¶hashå¼ï¼ä¹å¯ä»¥ä½ä¸ºåå
¸çkey
"æ°åç±»åï¼int, float, decimal.Decimal, fractions.Fraction, complex"
"å符串类åï¼str, bytes"
"å
ç»ï¼tuple"
"å»ç»éåï¼frozenset"
"å¸å°ç±»åï¼True, False"
"None"
# ä¸å¯hashç±»åï¼åå°å¯åç±»åï¼listãdictåsetãå®ä»¬ä¸å¯ä»¥ä½ä¸ºåå
¸çkeyã
#-- æ°å常é
1234, -1234, 0, 999999999 # æ´æ°
1.23, 1., 3.14e-10, 4E210, 4.0e+210 # æµ®ç¹æ°
0o177, 0x9ff, 0X9FF, 0b101010 # å
«è¿å¶ãåå
è¿å¶ãäºè¿å¶æ°å
3+4j, 3.0+4.0j, 3J # 夿°å¸¸éï¼ä¹å¯ä»¥ç¨complex(real, image)æ¥å建
hex(I), oct(I), bin(I) # å°åè¿å¶æ°è½¬å为åå
è¿å¶ãå
«è¿å¶ãäºè¿å¶è¡¨ç¤ºçâå符串â
int(string, base) # å°å符串转åä¸ºæ´æ°ï¼base为è¿å¶æ°
# 2.xä¸ï¼æä¸¤ç§æ´æ°ç±»åï¼ä¸è¬æ´æ°ï¼32ä½ï¼åé¿æ´æ°ï¼æ 穷精度ï¼ãå¯ä»¥ç¨læLç»å°¾ï¼è¿«ä½¿ä¸è¬æ´æ°æä¸ºé¿æ´æ°
float('inf'), float('-inf'), float('nan') # æ 穷大, æ ç©·å°, éæ°
#-- æ°åçè¡¨è¾¾å¼æä½ç¬¦
yield x # çæå¨å½æ°åéåè®®
lambda args: expression # çæå¿å彿°
x if y else z # ä¸å
éæ©è¡¨è¾¾å¼
x and y, x or y, not x # é»è¾ä¸ãé»è¾æãé»è¾é
x in y, x not in y # æå对象æµè¯
x is y, x is not y # 对象å®ä½æµè¯
xy, x>=y, x==y, x!=y # 大尿¯è¾ï¼éååéæè¶
éå¼ç¸çæ§æä½ç¬¦
1 >y # 使ä½ï¼x左移ãå³ç§»yä½
+, -, *, /, //, %, ** # ç餿³ãfloor餿³ï¼è¿åä¸å¤§äºç餿³ç»æçæ´æ°å¼ãåä½ãå¹è¿ç®
-x, +x, ~x # ä¸å
åæ³ãè¯å«ãæä½æ±è¡¥ï¼ååï¼
x[i], x[i:j:k] # ç´¢å¼ãåç
int(3.14), float(3) # 强å¶ç±»å转æ¢
#-- æ´æ°å¯ä»¥å©ç¨bit_length彿°æµè¯æå ç使°
a = 1; a.bit_length() # 1
a = 1024; a.bit_length() # 11
#-- repråstræ¾ç¤ºæ ¼å¼çåºå«
"""
repræ ¼å¼ï¼é»è®¤çäº¤äºæ¨¡å¼åæ¾ï¼äº§ççç»æçèµ·æ¥å®ä»¬å°±åæ¯ä»£ç ã
stræ ¼å¼ï¼æå°è¯å¥ï¼è½¬åæä¸ç§å¯¹ç¨æ·æ´å åå¥½çæ ¼å¼ã
"""
#-- æ°åç¸å
³ç模å
# math模å
# Decimal模åï¼å°æ°æ¨¡å
import decimal
from decimal import Decimal
Decimal("0.01") + Decimal("0.02") # è¿åDecimal("0.03")
decimal.getcontext().prec = 4 # 设置å
¨å±ç²¾åº¦ä¸º4 å³å°æ°ç¹åè¾¹4ä½
# Fraction模åï¼åæ°æ¨¡å
from fractions import Fraction
x = Fraction(4, 6) # åæ°ç±»å 4/6
x = Fraction("0.25") # åæ°ç±»å 1/4 æ¥æ¶å符串类åçåæ°
#-- éåset
"""
setæ¯ä¸ä¸ªæ åºä¸éå¤å
ç´ é, åºæ¬åè½å
æ¬å
³ç³»æµè¯åæ¶é¤éå¤å
ç´ ã
setæ¯æunion(èå), intersection(交), difference(å·®)åsymmetric difference(对称差é)çæ°å¦è¿ç®ã
setæ¯æx in set, len(set), for x in setã
setä¸è®°å½å
ç´ ä½ç½®æè
æå
¥ç¹, å æ¤ä¸æ¯æindexing, slicing, æå
¶å®ç±»åºåçæä½
"""
s = set([3,5,9,10]) # å建ä¸ä¸ªæ°å¼éåï¼è¿å{3, 5, 9, 10}
t = set("Hello") # å建ä¸ä¸ªå符çéåï¼è¿å{'l', 'H', 'e', 'o'}
a = t | s; t.union(s) # t å sçå¹¶é
b = t & s; t.intersection(s) # t å sç交é
c = t â s; t.difference(s) # æ±å·®éï¼é¡¹å¨tä¸, ä½ä¸å¨sä¸ï¼
d = t ^ s; t.symmetric_difference(s) # 对称差éï¼é¡¹å¨tæsä¸, ä½ä¸ä¼åæ¶åºç°å¨äºè
ä¸ï¼
t.add('x'); t.remove('H') # å¢å /å é¤ä¸ä¸ªitem
s.update([10,37,42]) # å©ç¨[......]æ´æ°séå
x in s, x not in s # éå䏿¯å¦åå¨æä¸ªå¼
s.issubset(t); s = t # æµè¯æ¯å¦ t ä¸çæ¯ä¸ä¸ªå
ç´ é½å¨ s ä¸
s.copy();
s.discard(x); # å é¤sä¸x
s.clear() # æ¸
空s
{x**2 for x in [1, 2, 3, 4]} # éåè§£æï¼ç»æï¼{16, 1, 4, 9}
{x for x in 'spam'} # éåè§£æï¼ç»æï¼{'a', 'p', 's', 'm'}
#-- éåfrozensetï¼ä¸å¯å对象
"""
setæ¯å¯å对象ï¼å³ä¸åå¨hashå¼ï¼ä¸è½ä½ä¸ºåå
¸çé®å¼ãåæ ·çè¿ælistç(tupleæ¯å¯ä»¥ä½ä¸ºåå
¸keyç)
frozensetæ¯ä¸å¯å对象ï¼å³åå¨hashå¼ï¼å¯ä½ä¸ºåå
¸çé®å¼
frozenset对象没æaddãremoveçæ¹æ³ï¼ä½æunion/intersection/differenceçæ¹æ³
"""
a = set([1, 2, 3])
b = set()
b.add(a) # error: setæ¯ä¸å¯åå¸ç±»å
b.add(frozenset(a)) # okï¼å°setå为frozensetï¼å¯åå¸
#-- å¸å°ç±»åbool
type(True) # è¿å
isinstance(False, int) # boolç±»åå±äºæ´åï¼æä»¥è¿åTrue
True == 1; True is 1 # è¾åº(True, False)
#-- å¨æç±»åç®ä»
"""
åéåéè¿å¼ç¨ï¼æå对象ã
Pythonä¸çâç±»åâå±äºå¯¹è±¡ï¼è䏿¯åéï¼æ¯ä¸ªå¯¹è±¡é½å
嫿头é¨ä¿¡æ¯ï¼æ¯å¦"ç±»åæ ç¤ºç¬¦" "å¼ç¨è®¡æ°å¨"ç
"""
#å
±äº«å¼ç¨åå¨åå¤ä¿®æ¹ï¼å¯¹äºå¯å对象ï¼è¦æ³¨æå°½éä¸è¦å
±äº«å¼ç¨ï¼
#å
±äº«å¼ç¨åç¸çæµè¯ï¼
L = [1], M = [1], L is M # è¿åFalse
L = M = [1, 2, 3], L is M # è¿åTrueï¼å
±äº«å¼ç¨
#å¢å¼ºèµå¼åå
±äº«å¼ç¨ï¼æ®é+å·ä¼çææ°ç对象ï¼èå¢å¼ºèµå¼+=ä¼å¨åå¤ä¿®æ¹
L = M = [1, 2]
L = L + [3, 4] # L = [1, 2, 3, 4], M = [1, 2]
L += [3, 4] # L = [1, 2, 3, 4], M = [1, 2, 3, 4]
#-- 常è§å符串常éå表达å¼
S = '' # 空å符串
S = "spamâs" # åå¼å·ååå¼å·ç¸å
S = "s\np\ta\x00m" # 转ä¹å符
S = """spam""" # ä¸éå¼å·å符串ï¼ä¸è¬ç¨äºå½æ°è¯´æ
S = r'\temp' # Rawå符串ï¼ä¸ä¼è¿è¡è½¬ä¹ï¼æå¶è½¬ä¹
S = b'Spam' # Python3ä¸çåèå符串
S = u'spam' # Python2.6ä¸çUnicodeå符串
s1+s2, s1*3, s[i], s[i:j], len(s) # å符串æä½
'a %s parrot' % 'kind' # åç¬¦ä¸²æ ¼å¼å表达å¼
'a {1} {0} parrot'.format('kind', 'red')# åç¬¦ä¸²æ ¼å¼åæ¹æ³
for x in s: print(x) # å符串è¿ä»£ï¼æåå
³ç³»
[x*2 for x in s] # å符串å表解æ
','.join(['a', 'b', 'c']) # å符串è¾åºï¼ç»æï¼a,b,c
#-- å
ç½®strå¤ç彿°ï¼
str1 = "stringobject"
str1.upper(); str1.lower(); str1.swapcase(); str1.capitalize(); str1.title() # å
¨é¨å¤§åï¼å
¨é¨å°åã大å°å转æ¢ï¼é¦åæ¯å¤§åï¼æ¯ä¸ªåè¯çé¦åæ¯é½å¤§å
str1.ljust(width) # è·ååºå®é¿åº¦ï¼å·¦å¯¹é½ï¼å³è¾¹ä¸å¤ç¨ç©ºæ ¼è¡¥é½
str1.rjust(width) # è·ååºå®é¿åº¦ï¼å³å¯¹é½ï¼å·¦è¾¹ä¸å¤ç¨ç©ºæ ¼è¡¥é½
str1.center(width) # è·ååºå®é¿åº¦ï¼ä¸é´å¯¹é½ï¼ä¸¤è¾¹ä¸å¤ç¨ç©ºæ ¼è¡¥é½
str1.zfill(width) # è·ååºå®é¿åº¦ï¼å³å¯¹é½ï¼å·¦è¾¹ä¸è¶³ç¨0è¡¥é½
str1.find('t',start,end) # æ¥æ¾å符串ï¼å¯ä»¥æå®èµ·å§åç»æä½ç½®æç´¢
str1.rfind('t') # ä»å³è¾¹å¼å§æ¥æ¾å符串
str1.count('t') # æ¥æ¾å符串åºç°ç次æ°
#ä¸é¢æææ¹æ³é½å¯ç¨index代æ¿ï¼ä¸åçæ¯ä½¿ç¨indexæ¥æ¾ä¸å°ä¼æå¼å¸¸ï¼èfindè¿å-1
str1.replace('old','new') # æ¿æ¢å½æ°ï¼æ¿æ¢old为newï¼åæ°ä¸å¯ä»¥æå®maxReplaceTimesï¼å³æ¿æ¢æå®æ¬¡æ°çold为new
str1.strip(); # é»è®¤å é¤ç©ºç½ç¬¦
str1.strip('d'); # å é¤str1å符串ä¸å¼å¤´ãç»å°¾å¤ï¼ä½äº d å é¤åºåçå符
str1.lstrip();
str1.lstrip('d'); # å é¤str1å符串ä¸å¼å¤´å¤ï¼ä½äº d å é¤åºåçå符
str1.rstrip();
str1.rstrip('d') # å é¤str1å符串ä¸ç»å°¾å¤ï¼ä½äº d å é¤åºåçå符
str1.startswith('start') # æ¯å¦ä»¥startå¼å¤´
str1.endswith('end') # æ¯å¦ä»¥endç»å°¾
str1.isalnum(); str1.isalpha(); str1.isdigit(); str1.islower(); str1.isupper() # 夿å符串æ¯å¦å
¨ä¸ºåç¬¦ãæ°åãå°åã大å
#-- ä¸éå¼å·ç¼åå¤è¡å符串åï¼å¹¶ä¸å¨ä»£ç æè¡å¤åµå
¥æ¢è¡å符\n
mantra = """hello world
hello python
hello my friend"""
# mantra为"""hello world \n hello python \n hello my friend"""
#-- ç´¢å¼ååçï¼
S[0], S[len(S)â1], S[-1] # ç´¢å¼
S[1:3], S[1:], S[:-1], S[1:10:2] # åçï¼ç¬¬ä¸ä¸ªåæ°æå®æ¥é¿ï¼å¦`S[1:10:2]`æ¯ä»1ä½å°10使²¡é2ä½è·åä¸ä¸ªå符ã
#-- å符串转æ¢å·¥å
·ï¼
int('42'), str(42) # è¿å(42, '42')
float('4.13'), str(4.13) # è¿å(4.13, '4.13')
ord('s'), chr(115) # è¿å(115, 's')
int('1001', 2) # å°å符串ä½ä¸ºäºè¿å¶æ°åï¼è½¬å为æ°åï¼è¿å9
bin(13), oct(13), hex(13) # å°æ´æ°è½¬å为äºè¿å¶/å
«è¿å¶/åå
è¿å¶å符串ï¼è¿å('0b1101', '015', '0xd')
#-- å¦ç±»åç¬¦ä¸²è¿æ¥
name = "wang" "hong" # åè¡ï¼name = "wanghong"
name = "wang" \
"hong" # å¤è¡ï¼name = "wanghong"
#-- Pythonä¸çåç¬¦ä¸²æ ¼å¼åå®ç°1--åç¬¦ä¸²æ ¼å¼å表达å¼
"""
åºäºCè¯è¨ç'print'模åï¼å¹¶ä¸å¨å¤§å¤æ°çç°æçè¯è¨ä¸ä½¿ç¨ã
éç¨ç»æï¼%[(name)][flag][width].[precision]typecode
"""
"this is %d %s bird" % (1, 'dead') # ä¸è¬çæ ¼å¼å表达å¼
"%s---%s---%s" % (42, 3.14, [1, 2, 3]) # å符串è¾åºï¼'42---3.14---[1, 2, 3]'
"%d...%6d...%-6d...%06d" % (1234, 1234, 1234, 1234) # 坹齿¹å¼åå¡«å
ï¼"1234... 1234...1234 ...001234"
x = 1.23456789
"%e | %f | %g" % (x, x, x) # 坹齿¹å¼ï¼"1.234568e+00 | 1.234568 | 1.23457"
"%6.2f*%-6.2f*%06.2f*%+6.2f" % (x, x, x, x) # 坹齿¹å¼ï¼' 1.23*1.23 *001.23* +1.23'
"%(name1)d---%(name2)s" % {"name1":23, "name2":"value2"} # åºäºåå
¸çæ ¼å¼å表达å¼
"%(name)s is %(age)d" % vars() # vars()彿°è°ç¨è¿åä¸ä¸ªåå
¸ï¼å
å«äºæææ¬å½æ°è°ç¨æ¶åå¨çåé
#-- Pythonä¸çåç¬¦ä¸²æ ¼å¼åå®ç°2--åç¬¦ä¸²æ ¼å¼åè°ç¨æ¹æ³
# æ®éè°ç¨
"{0}, {1} and {2}".format('spam', 'ham', 'eggs') # åºäºä½ç½®çè°ç¨
"{motto} and {pork}".format(motto = 'spam', pork = 'ham') # åºäºKeyçè°ç¨
"{motto} and {0}".format('ham', motto = 'spam') # æ··åè°ç¨
# æ·»å é® å±æ§ åç§»é (import sys)
"my {1[spam]} runs {0.platform}".format(sys, {'spam':'laptop'}) # åºäºä½ç½®çé®å屿§
"{config[spam]} {sys.platform}".format(sys = sys, config = {'spam':'laptop'}) # åºäºKeyçé®å屿§
"first = {0[0]}, second = {0[1]}".format(['A', 'B', 'C']) # åºäºä½ç½®çåç§»é
# å
·ä½æ ¼å¼å
"{0:e}, {1:.3e}, {2:g}".format(3.14159, 3.14159, 3.14159) # è¾åº'3.141590e+00, 3.142e+00, 3.14159'
"{fieldname:format_spec}".format(......)
# 说æ:
"""
fieldnameæ¯æå®åæ°çä¸ä¸ªæ°åæå
³é®å, åè¾¹å¯è·å¯éç".name"æ"[index]"æåå¼ç¨
format_spec ::= [[fill]align][sign][#][0][width][,][.precision][type]
fill ::= #å¡«å
å符
align ::= "" | "=" | "^" #坹齿¹å¼
sign ::= "+" | "-" | " " #符å·è¯´æ
width ::= integer #å符串宽度
precision ::= integer #æµ®ç¹æ°ç²¾åº¦
type ::= "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"
"""
# ä¾å:
'={0:10} = {1:10}'.format('spam', 123.456) # è¾åº'=spam = 123.456'
'={0:>10}='.format('test') # è¾åº'= test='
'={0: 20 and "big than 20" or a > 10 and "big than 10" or a > 5 and "big than 5") # è¿å"big than 5"
#-- Pythonçwhileè¯å¥æè
forè¯å¥å¯ä»¥å¸¦elseè¯å¥ å½ç¶ä¹å¯ä»¥å¸¦continue/break/passè¯å¥
while a > 1:
anything
else:
anything
# elseè¯å¥ä¼å¨å¾ªç¯ç»æåæ§è¡ï¼é¤éå¨å¾ªç¯ä¸æ§è¡äºbreakï¼åæ ·çè¿æforè¯å¥
for i in range(5):
anything
else:
anything
#-- for循ç¯çå
ç»èµå¼
for (a, b) in [(1, 2), (3, 4)]: # æç®åçèµå¼
for ((a, b), c) in [((1, 2), 3), ((4, 5), 6)]: # èªå¨è§£å
èµå¼
for ((a, b), c) in [((1, 2), 3), ("XY", 6)]: # èªå¨è§£å
a = X, b = Y, c = 6
for (a, *b) in [(1, 2, 3), (4, 5, 6)]: # èªå¨è§£å
èµå¼
#-- å表解æè¯æ³
M = [[1,2,3], [4,5,6], [7,8,9]]
res = [sum(row) for row in M] # G = [6, 15, 24] ä¸è¬çå表解æ çæä¸ä¸ªå表
res = [c * 2 for c in 'spam'] # ['ss', 'pp', 'aa', 'mm']
res = [a * b for a in [1, 2] for b in [4, 5]] # å¤è§£æè¿ç¨ è¿å[4, 5, 8, 10]
res = [a for a in [1, 2, 3] if a 0 else 0 for a in [-1, 0, 1]] # 另夿æ¡ä»¶çé«çº§è§£æè¿ç¨
# 两个åè¡¨åæ¶è§£æï¼ä½¿ç¨zip彿°
for teama, teamb in zip(["Packers", "49ers"], ["Ravens", "Patriots"]):
print(teama + " vs. " + teamb)
# 带索å¼çå表解æï¼ä½¿ç¨enumerate彿°
for index, team in enumerate(["Packers", "49ers", "Ravens", "Patriots"]):
print(index, team) # è¾åº0, Packers \n 1, 49ers \n ......
#-- çæå¨è¡¨è¾¾å¼
G = (sum(row) for row in M) # 使ç¨å°æ¬å·å¯ä»¥å建æéç»æççæå¨generator object
next(G), next(G), next(G) # è¾åº(6, 15, 24)
G = {sum(row) for row in M} # G = {6, 15, 24} è§£æè¯æ³è¿å¯ä»¥çæéåååå
¸
G = {i:sum(M[i]) for i in range(3)} # G = {0: 6, 1: 15, 2: 24}
#-- ææ¡£å符串:åºç°å¨Moduleçå¼ç«¯ä»¥åå
¶ä¸å½æ°æç±»çå¼ç«¯ 使ç¨ä¸éå¼å·å符串
"""
module document
"""
def func():
"""
function document
"""
print()
class Employee(object):
"""
class document
"""
print()
print(func.__doc__) # è¾åºå½æ°ææ¡£å符串
print(Employee.__doc__) # è¾åºç±»çææ¡£å符串
#-- å½åæ¯ä¾:
"""
以åä¸ä¸å线å¼å¤´çåéå(_X)ä¸ä¼è¢«from module import*çè¯å¥å¯¼å
¥
ååæä¸¤ä¸ªä¸å线çåéå(__X__)æ¯ç³»ç»å®ä¹çåéåï¼å¯¹è§£éå¨æç¹æ®æä¹
以两个ä¸å线å¼å¤´ä½ä¸ä»¥ä¸å线ç»å°¾çåéå(__X)æ¯ç±»çæ¬å°(ç§æ)åé
"""
#-- å表解æ inæåå
³ç³»æµè¯ map sorted zip enumerateå
ç½®å½æ°çé½ä½¿ç¨äºè¿ä»£åè®®
'first line' in open('test.txt') # inæµè¯ è¿åTrueæFalse
list(map(str.upper, open('t'))) # mapå
ç½®å½æ°
sorted(iter([2, 5, 8, 3, 1])) # sortedå
ç½®å½æ°
list(zip([1, 2], [3, 4])) # zipå
ç½®å½æ° [(1, 3), (2, 4)]
#-- delè¯å¥: æå¨å é¤æä¸ªåé
del X
#-- è·åå表çåè¡¨çæ¹æ³:
x = [1,2,3,4,5,6]
x[:3] # å3个[1,2,3]
x[1:5] # ä¸é´4个[2,3,4,5]
x[-3:] # æå3个[4,5,6]
x[::2] # 奿°é¡¹[1,3,5]
x[1::2] # å¶æ°é¡¹[2,4,6]
#-- æå¨è¿ä»£ï¼iterånext
L = [1, 2]
I = iter(L) # I为Lçè¿ä»£å¨
I.next() # è¿å1
I.next() # è¿å2
I.next() # Error:StopIteration
#-- Pythonä¸çå¯è¿ä»£å¯¹è±¡
"""
1.rangeè¿ä»£å¨
2.mapãzipåfilterè¿ä»£å¨
3.åå
¸è§å¾è¿ä»£å¨ï¼D.keys()), D.items()ç
4.æä»¶ç±»å
"""
"""彿°è¯æ³è§å----彿°è¯æ³è§å----彿°è¯æ³è§å----彿°è¯æ³è§å----彿°è¯æ³è§å----彿°è¯æ³è§å----彿°è¯æ³è§å----彿°è¯æ³è§å----彿°è¯æ³è§å----彿°è¯æ³è§å"""
#-- 彿°ç¸å
³çè¯å¥å表达å¼
myfunc('spam') # 彿°è°ç¨
def myfunc(): # 彿°å®ä¹
return None # 彿°è¿åå¼
global a # å
¨å±åé
nonlocal x # å¨å½æ°æå
¶ä»ä½ç¨åä¸ä½¿ç¨å¤å±ï¼éå
¨å±ï¼åé
yield x # çæå¨å½æ°è¿å
lambda # å¿å彿°
#-- Python彿°åéåè§£æ:LEGBååï¼å³:
"""
local(functin) --> encloseing function locals --> global(module) --> build-in(python)
说æ:以ä¸è¾¹ç彿°makerä¸ºä¾ åç¸å¯¹äºactionèè¨ X为Local N为Encloseing
"""
#-- åµå¥å½æ°ä¸¾ä¾:å·¥å彿°
def maker(N):
def action(X):
return X ** N
return action
f = maker(2) # pass 2 to N
f(3) # 9, pass 3 to X
#-- åµå¥å½æ°ä¸¾ä¾:lambdaå®ä¾
def maker(N):
action = (lambda X: X**N)
return action
f = maker(2) # pass 2 to N
f(3) # 9, pass 3 to X
#-- nonlocalåglobalè¯å¥çåºå«
# nonlocalåºç¨äºä¸ä¸ªåµå¥ç彿°çä½ç¨åä¸çä¸ä¸ªåç§° ä¾å¦:
start = 100
def tester(start):
def nested(label):
nonlocal start # æå®start为tester彿°å
çlocalåé è䏿¯globalåéstart
print(label, start)
start += 3
return nested
# global为å
¨å±çåé å³defä¹å¤çåé
def tester(start):
def nested(label):
global start # æå®start为globalåéstart
print(label, start)
start += 3
return nested
#-- 彿°åæ°ï¼ä¸å¯ååæ°éè¿âå¼âä¼ éï¼å¯ååæ°éè¿âå¼ç¨âä¼ é
def f(a, b, c): print(a, b, c)
f(1, 2, 3) # åæ°ä½ç½®å¹é
f(1, c = 3, b = 2) # åæ°å
³é®åå¹é
def f(a, b=1, c=2): print(a, b, c)
f(1) # é»è®¤åæ°å¹é
f(1, 2) # é»è®¤åæ°å¹é
f(a = 1, c = 3) # å
³é®ååæ°åé»è®¤åæ°çæ··å
# Keyword-Onlyåæ°:åºç°å¨*argsä¹å å¿
é¡»ç¨å
³é®åè¿è¡å¹é
def keyOnly(a, *b, c): print('') # c就为keyword-onlyå¹é
å¿
须使ç¨å
³é®åc = valueå¹é
def keyOnly(a, *, b, c): ...... # b c为keyword-onlyå¹é
å¿
须使ç¨å
³é®åå¹é
def keyOnly(a, *, b = 1): ...... # bæé»è®¤å¼ æè
çç¥ æè
使ç¨å
³é®ååæ°b = value
#-- å¯ååæ°å¹é
: * å **
def f(*args): print(args) # å¨å
ç»ä¸æ¶éä¸å¹é
çä½ç½®åæ°
f(1, 2, 3) # è¾åº(1, 2, 3)
def f(**args): print(args) # å¨åå
¸ä¸æ¶éä¸å¹é
çå
³é®ååæ°
f(a = 1, b = 2) # è¾åº{'a':1, 'b':2}
def f(a, *b, **c): print(a, b, c) # 两è
æ··å使ç¨
f(1, 2, 3, x=4, y=5) # è¾åº1, (2, 3), {'x':4, 'y':5}
#-- 彿°è°ç¨æ¶çåæ°è§£å
: * å ** åå«è§£å
å
ç»ååå
¸
func(1, *(2, 3)) func(1, 2, 3)
func(1, **{'c':3, 'b':2}) func(1, b = 2, c = 3)
func(1, *(2, 3), **{'c':3, 'b':2}) func(1, 2, 3, b = 2, c = 3)
#-- 彿°å±æ§:(èªå·±å®ä¹ç)彿°å¯ä»¥æ·»å 屿§
def func():.....
func.count = 1 # èªå®ä¹å½æ°æ·»å 屿§
print.count = 1 # Error å
ç½®å½æ°ä¸å¯ä»¥æ·»å 屿§
#-- 彿°æ³¨è§£: ç¼åå¨def头é¨è¡ 主è¦ç¨äºè¯´æåæ°èå´ãåæ°ç±»åãè¿åå¼ç±»åç
def func(a:'spam', b:(1, 10), c:float) -> int :
print(a, b, c)
func.__annotations__ # {'c':, 'b':(1, 10), 'a':'spam', 'return':}
# ç¼å注解çåæ¶ è¿æ¯å¯ä»¥ä½¿ç¨å½æ°é»è®¤å¼ 并䏿³¨è§£çä½ç½®ä½äº=å·çåè¾¹
def func(a:'spam'='a', b:(1, 10)=2, c:float=3) -> int :
print(a, b, c)
#-- å¿å彿°:lambda
f = lambda x, y, z : x + y + z # æ®éå¿å彿°ï¼ä½¿ç¨æ¹æ³f(1, 2, 3)
f = lambda x = 1, y = 1: x + y # 带é»è®¤åæ°çlambda彿°
def action(x): # åµå¥lambda彿°
return (lambda y : x + y)
f = lambda: a if xxx() else b # æ åæ°çlambda彿°ï¼ä½¿ç¨æ¹æ³f()
#-- lambda彿°ä¸map filter reduce彿°çç»å
list(map((lambda x: x + 1), [1, 2, 3])) # [2, 3, 4]
list(filter((lambda x: x > 0), range(-4, 5))) # [1, 2, 3, 4]
functools.reduce((lambda x, y: x + y), [1, 2, 3]) # 6
functools.reduce((lambda x, y: x * y), [2, 3, 4]) # 24
#-- çæå¨å½æ°:yield VS return
def gensquare(N):
for i in range(N):
yield i** 2 # ç¶ææèµ· å¯ä»¥æ¢å¤å°æ¤æ¶çç¶æ
for i in gensquare(5): # ä½¿ç¨æ¹æ³
print(i, end = ' ') # [0, 1, 4, 9, 16]
x = gensquare(2) # xæ¯ä¸ä¸ªçæå¯¹è±¡
next(x) # çåäºx.__next__() è¿å0
next(x) # çåäºx.__next__() è¿å1
next(x) # çåäºx.__next__() æåºå¼å¸¸StopIteration
#-- çæå¨è¡¨è¾¾å¼:å°æ¬å·è¿è¡å表解æ
G = (x ** 2 for x in range(3)) # 使ç¨å°æ¬å·å¯ä»¥å建æéç»æççæå¨generator object
next(G), next(G), next(G) # åä¸è¿°ä¸ççæå¨å½æ°çè¿åå¼ä¸è´
#ï¼1ï¼çæå¨(çæå¨å½æ°/çæå¨è¡¨è¾¾å¼)æ¯å个è¿ä»£å¯¹è±¡
G = (x ** 2 for x in range(4))
I1 = iter(G) # è¿éå®é
ä¸iter(G) = G
next(I1) # è¾åº0
next(G) # è¾åº1
next(I1) # è¾åº4
#ï¼2ï¼çæå¨ä¸ä¿çè¿ä»£åçç»æ
gen = (i for i in range(4))
2 in gen # è¿åTrue
3 in gen # è¿åTrue
1 in gen # è¿åFalseï¼å
¶å®æ£æµ2çæ¶åï¼1å·²ç»å°±ä¸å¨çæå¨ä¸äºï¼å³1å·²ç»è¢«è¿ä»£è¿äºï¼åç2ã3ä¹ä¸å¨äº
#-- æ¬å°å鿝鿿£æµç
X = 22 # å
¨å±åéXç声æåå®ä¹
def test():
print(X) # å¦ææ²¡æä¸ä¸è¯å¥ å该å¥åæ³ æå°å
¨å±åéX
X = 88 # è¿ä¸è¯å¥ä½¿å¾ä¸ä¸è¯å¥éæ³ å 为å®ä½¿å¾Xåæäºæ¬å°åé ä¸ä¸å¥åæäºæå°ä¸ä¸ªæªå®ä¹çæ¬å°åé(å±é¨åé)
if False: # å³ä½¿è¿æ ·çè¯å¥ ä¹ä¼æprintè¯å¥è§ä¸ºéæ³è¯å¥ å 为:
X = 88 # Python伿 è§ifè¯å¥èä»ç¶å£°æäºå±é¨åéX
def test(): # æ¹è¿
global X # 声æåéX为å
¨å±åé
print(X) # æå°å
¨å±åéX
X = 88 # æ¹åå
¨å±åéX
#-- 彿°çé»è®¤å¼æ¯å¨å½æ°å®ä¹çæ¶åå®ä¾åç è䏿¯å¨è°ç¨çæ¶å ä¾å:
def foo(numbers=[]): # è¿éç[]æ¯å¯åç
numbers.append(9)
print(numbers)
foo() # first time, like before, [9]
foo() # second time, not like before, [9, 9]
foo() # third time, not like before too, [9, 9, 9]
# æ¹è¿:
def foo(numbers=None):
if numbers is None: numbers = []
numbers.append(9)
print(numbers)
# å¦å¤ä¸ä¸ªä¾å åæ°çé»è®¤å¼ä¸ºä¸å¯åç:
def foo(count=0): # è¿éç0æ¯æ°å, æ¯ä¸å¯åç
count += 1
print(count)
foo() # è¾åº1
foo() # è¿æ¯è¾åº1
foo(3) # è¾åº4
foo() # è¿æ¯è¾åº1
"""彿°ä¾å----彿°ä¾å----彿°ä¾å----彿°ä¾å----彿°ä¾å----彿°ä¾å----彿°ä¾å----彿°ä¾å----彿°ä¾å----彿°ä¾å----彿°ä¾å----彿°ä¾å----彿°ä¾å"""
"""æ°å¦è¿ç®ç±»"""
abs(x) # æ±ç»å¯¹å¼ï¼åæ°å¯ä»¥æ¯æ´åï¼ä¹å¯ä»¥æ¯å¤æ°ï¼è¥åæ°æ¯å¤æ°ï¼åè¿å夿°ç模
complex([real[, imag]]) # å建ä¸ä¸ªå¤æ°
divmod(a, b) # åå«ååå使°ï¼æ³¨æï¼æ´åãæµ®ç¹åé½å¯ä»¥
float([x]) # å°ä¸ä¸ªåç¬¦ä¸²ææ°è½¬æ¢ä¸ºæµ®ç¹æ°ã妿æ åæ°å°è¿å0.0
int([x[, base]]) # å°ä¸ä¸ªåç¬¦ä¸²ææµ®ç¹æ°è½¬æ¢ä¸ºintç±»åï¼base表示è¿å¶
long([x[, base]]) # å°ä¸ä¸ªåç¬¦ä¸²ææµ®ç¹æ°è½¬æ¢ä¸ºlongç±»å
pow(x, y) # è¿åxçy次å¹
range([start], stop[, step]) # 产çä¸ä¸ªåºåï¼é»è®¤ä»0å¼å§
round(x[, n]) # åèäºå
¥
sum(iterable[, start]) # 对éåæ±å
oct(x) # å°ä¸ä¸ªæ°å转å为8è¿å¶å符串
hex(x) # å°ä¸ä¸ªæ°å转æ¢ä¸º16è¿å¶å符串
chr(i) # è¿åç»å®intç±»å对åºçASCIIå符
unichr(i) # è¿åç»å®intç±»åçunicode
ord(c) # è¿åASCIIå符对åºçæ´æ°
bin(x) # å°æ´æ°x转æ¢ä¸ºäºè¿å¶å符串
bool([x]) # å°x转æ¢ä¸ºBooleanç±»å
"""éåç±»æä½"""
basestring() # stråunicodeçè¶
ç±»ï¼ä¸è½ç´æ¥è°ç¨ï¼å¯ä»¥ç¨ä½isinstance夿
format(value [, format_spec]) # æ ¼å¼åè¾åºåç¬¦ä¸²ï¼æ ¼å¼åçåæ°é¡ºåºä»0å¼å§ï¼å¦âI am {0},I like {1}â
enumerate(sequence[, start=0]) # è¿åä¸ä¸ªå¯æä¸¾çå¯¹è±¡ï¼æ³¨æå®æç¬¬äºä¸ªåæ°
iter(obj[, sentinel]) # çæä¸ä¸ªå¯¹è±¡çè¿ä»£å¨ï¼ç¬¬äºä¸ªåæ°è¡¨ç¤ºåé符
max(iterable[, args...][key]) # è¿åéåä¸çæå¤§å¼
min(iterable[, args...][key]) # è¿åéåä¸çæå°å¼
dict([arg]) # åå»ºæ°æ®åå
¸
list([iterable]) # å°ä¸ä¸ªéå类转æ¢ä¸ºå¦å¤ä¸ä¸ªéåç±»
set() # set对象å®ä¾å
frozenset([iterable]) # 产çä¸ä¸ªä¸å¯åçset
tuple([iterable]) # çæä¸ä¸ªtupleç±»å
str([object]) # 转æ¢ä¸ºstringç±»å
sorted(iterable[, cmp[, key[, reverse]]]) # éåæåº
L = [('b',2),('a',1),('c',3),('d',4)]
sorted(L, key=lambda x: x[1], reverse=True) # 使ç¨Keyåæ°åreverseåæ°
sorted(L, key=lambda x: (x[0], x[1])) # 使ç¨keyåæ°è¿è¡å¤æ¡ä»¶æåºï¼å³å¦æx[0]ç¸åï¼åæ¯è¾x[1]
"""é»è¾å¤æ"""
all(iterable) # éåä¸çå
ç´ é½ä¸ºççæ¶å为çï¼ç¹å«çï¼è¥ä¸ºç©ºä¸²è¿å为True
any(iterable) # éåä¸çå
ç´ æä¸ä¸ªä¸ºççæ¶å为çï¼ç¹å«çï¼è¥ä¸ºç©ºä¸²è¿å为False
cmp(x, y) # 妿x y,è¿åæ£æ°
"""IOæä½"""
file(filename [, mode [, bufsize]]) # fileç±»åçæé 彿°ã
input([prompt]) # è·åç¨æ·è¾å
¥ï¼æ¨è使ç¨raw_inputï¼å ä¸ºè¯¥å½æ°å°ä¸ä¼æè·ç¨æ·çé误è¾å
¥ï¼æææ¯èªè¡å¤æç±»å
# å¨ Built-in Functions éæä¸å¥è¯æ¯è¿æ ·åçï¼Consider using the raw_input() function for general input from users.
raw_input([prompt]) # 设置è¾å
¥ï¼è¾å
¥é½æ¯ä½ä¸ºå符串å¤ç
open(name[, mode[, buffering]]) # æå¼æä»¶ï¼ä¸fileæä»ä¹ä¸åï¼æ¨è使ç¨open
"""å
¶ä»"""
callable(object) # æ£æ¥å¯¹è±¡objectæ¯å¦å¯è°ç¨
classmethod(func) # ç¨æ¥è¯´æè¿ä¸ªfuncæ¯ä¸ªç±»æ¹æ³
staticmethod(func) # ç¨æ¥è¯´æè¿ä¸ªfuncä¸ºéææ¹æ³
dir([object]) # ä¸å¸¦åæ°æ¶ï¼è¿åå½åèå´å
çåéãæ¹æ³åå®ä¹çç±»åå表ï¼å¸¦åæ°æ¶ï¼è¿ååæ°ç屿§ãæ¹æ³å表ã
help(obj) # è¿åobjç帮å©ä¿¡æ¯
eval(expression) # 计ç®è¡¨è¾¾å¼expressionçå¼ï¼å¹¶è¿å
exec(str) # å°strä½ä¸ºPythonè¯å¥æ§è¡
execfile(filename) # ç¨æ³ç±»ä¼¼exec()ï¼ä¸åçæ¯execfileçåæ°filename为æä»¶åï¼èexecçåæ°ä¸ºå符串ã
filter(function, iterable) # æé ä¸ä¸ªåºåï¼çä»·äº[item for item in iterable if function(item)]ï¼functionè¿åå¼ä¸ºTrueæFalseç彿°
list(filter(bool, range(-3, 4)))# è¿å[-3, -2, -1, 1, 2, 3], 没æ0
hasattr(object, name) # å¤æå¯¹è±¡objectæ¯å¦å
å«å为nameçç¹æ§
getattr(object, name [, defalut]) # è·åä¸ä¸ªç±»ç屿§
setattr(object, name, value) # è®¾ç½®å±æ§å¼
delattr(object, name) # å é¤object对象å为nameç屿§
globals() # è¿åä¸ä¸ªæè¿°å½åå
¨å±ç¬¦å·è¡¨çåå
¸
hash(object) # å¦æå¯¹è±¡object为åå¸è¡¨ç±»åï¼è¿å对象objectçåå¸å¼
id(object) # è¿å对象çå¯ä¸æ è¯ï¼ä¸ä¸²æ°å
isinstance(object, classinfo) # 夿objectæ¯å¦æ¯classçå®ä¾
isinstance(1, int) # 夿æ¯ä¸æ¯intç±»å
isinstance(1, (int, float)) # isinstanceç第äºä¸ªåæ°æ¥åä¸ä¸ªå
ç»ç±»å
issubclass(class, classinfo) # 夿classæ¯å¦ä¸ºclassinfoçåç±»
locals() # è¿åå½åçåéå表
map(function, iterable, ...) # éåæ¯ä¸ªå
ç´ ï¼æ§è¡functionæä½
list(map(abs, range(-3, 4))) # è¿å[3, 2, 1, 0, 1, 2, 3]
next(iterator[, default]) # 类似äºiterator.next()
property([fget[, fset[, fdel[, doc]]]]) # 屿§è®¿é®çå
è£
ç±»ï¼è®¾ç½®åå¯ä»¥éè¿c.x=valueçæ¥è®¿é®setterågetter
reduce(function, iterable[, initializer]) # åå¹¶æä½ï¼ä»ç¬¬ä¸ä¸ªå¼å§æ¯åä¸¤ä¸ªåæ°ï¼ç¶åæ¯å两个çç»æä¸ç¬¬ä¸ä¸ªåå¹¶è¿è¡å¤çï¼ä»¥æ¤ç±»æ¨
def add(x,y):return x + y
reduce(add, range(1, 11)) # è¿å55 (注:1+2+3+4+5+6+7+8+9+10 = 55)
reduce(add, range(1, 11), 20) # è¿å75
reload(module) # éæ°å 载模å
repr(object) # å°ä¸ä¸ªå¯¹è±¡åå¹»ä¸ºå¯æå°çæ ¼å¼
slice(start, stop[, step]) # 产çåç对象
type(object) # è¿å该objectçç±»å
vars([object]) # è¿å对象çåéåãåéå¼çåå
¸
a = Class(); # Class为ä¸ä¸ªç©ºç±»
a.name = 'qi', a.age = 9
vars(a) # {'name':'qi', 'age':9}
zip([iterable, ...]) # è¿åå¯¹åºæ°ç»
list(zip([1, 2, 3], [4, 5, 6])) # [(1, 4), (2, 5), (3, 6)]
a = [1, 2, 3], b = ["a", "b", "c"]
z = zip(a, b) # å缩ï¼[(1, "a"), (2, "b"), (3, "c")]
zip(*z) # è§£å缩ï¼[(1, 2, 3), ("a", "b", "c")]
unicode(string, encoding, errors) # å°å符串string转å为unicodeå½¢å¼ï¼string为encoded stringã
"""模åMoudle----模åMoudle----模åMoudle----模åMoudle----模åMoudle----模åMoudle----模åMoudle----模åMoudle----模åMoudle----模åMoudle----模åMoudle"""
#-- Python模åæç´¢è·¯å¾:
"""
(1)ç¨åºç主ç®å½ (2)PYTHONPATHç®å½ (3)æ å龿¥åºç®å½ (4)ä»»ä½.pthæä»¶çå
容
"""
#-- æ¥çå
¨é¨ç模åæç´¢è·¯å¾
import sys
sys.path
sys.argv # è·å¾èæ¬çåæ°
sys.builtin_module_names # æ¥æ¾å
建模å
sys.platform # è¿åå½åå¹³å° åºç°å¦ï¼ "win32" "linux" "darwin"ç
sys.modules # æ¥æ¾å·²å¯¼å
¥ç模å
sys.modules.keys()
sys.stdout # stdout å stderr 齿¯ç±»æä»¶å¯¹è±¡ï¼ä½æ¯å®ä»¬é½æ¯åªåçãå®ä»¬é½æ²¡æ read æ¹æ³ï¼åªæ write æ¹æ³
sys.stdout.write("hello")
sys.stderr
sys.stdin
#-- 模åç使ç¨ä»£ç
import module1, module2 # 导å
¥module1 使ç¨module1.printer()
from module1 import printer # 导å
¥module1ä¸çprinteråé 使ç¨printer()
from module1 import * # 导å
¥module1ä¸çå
¨é¨åé 使ç¨ä¸å¿
æ·»å module1åç¼
#-- é载模åreload: è¿æ¯ä¸ä¸ªå
ç½®å½æ° è䏿¯ä¸æ¡è¯å¥
from imp import reload
reload(module)
#-- 模åçå
导å
¥:使ç¨ç¹å·(.)è䏿¯è·¯å¾(dir1\dir2)è¿è¡å¯¼å
¥
import dir1.dir2.mod # d导å
¥å
(ç®å½)dir1ä¸çå
dir2ä¸çmodæ¨¡å æ¤æ¶dir1å¿
é¡»å¨Pythonå¯æç´¢è·¯å¾ä¸
from dir1.dir2.mod import * # fromè¯æ³çå
导å
¥
#-- __init__.pyå
æä»¶:æ¯ä¸ªå¯¼å
¥çå
ä¸é½åºè¯¥å
å«è¿ä¹ä¸ä¸ªæä»¶
"""
该æä»¶å¯ä»¥ä¸ºç©º
馿¬¡è¿è¡å
导å
¥æ¶ 该æä»¶ä¼èªå¨æ§è¡
é«çº§åè½:å¨è¯¥æä»¶ä¸ä½¿ç¨__all__å表æ¥å®ä¹å
(ç®å½)以from*çå½¢å¼å¯¼å
¥æ¶ éè¦å¯¼å
¥ä»ä¹
"""
#-- å
ç¸å¯¹å¯¼å
¥:使ç¨ç¹å·(.) åªè½ä½¿ç¨fromè¯å¥
from . import spam # 导å
¥å½åç®å½ä¸çspam模åï¼Python2: å½åç®å½ä¸ç模å, ç´æ¥å¯¼å
¥å³å¯ï¼
from .spam import name # 导å
¥å½åç®å½ä¸çspam模åçname屿§ï¼Python2: å½åç®å½ä¸ç模å, ç´æ¥å¯¼å
¥å³å¯ï¼ä¸ç¨å .ï¼
from .. import spam # 导å
¥å½åç®å½çç¶ç®å½ä¸çspam模å
#-- å
ç¸å¯¹å¯¼å
¥ä¸æ®é导å
¥çåºå«
from string import * # è¿é导å
¥çstring模å为sys.pathè·¯å¾ä¸ç è䏿¯æ¬ç®å½ä¸çstring模å(妿åå¨ä¹ä¸æ¯)
from .string import * # è¿é导å
¥çstring模å为æ¬ç®å½ä¸ç(ä¸åå¨å导å
¥å¤±è´¥) è䏿¯sys.pathè·¯å¾ä¸ç
#-- æ¨¡åæ°æ®éè:æå°åfrom*çç ´å
_X # åéååå ä¸å线å¯ä»¥é²æ¢from*导å
¥æ¶è¯¥åéå被å¤å¶åºå»
__all__ = ['x', 'x1', 'x2'] # 使ç¨__all__å表æå®from*æ¶å¤å¶åºå»çåéå(åéåå¨å表ä¸ä¸ºå符串形å¼)
#-- å¯ä»¥ä½¿ç¨__name__è¿è¡æ¨¡åçåå
æµè¯:彿¨¡åä¸ºé¡¶å±æ§è¡æä»¶æ¶å¼ä¸º'__main__' 彿¨¡å被导å
¥æ¶ä¸ºæ¨¡åå
if __name__ == '__main__':
doSomething
# 模å屿§ä¸è¿æå
¶ä»å±æ§ï¼ä¾å¦ï¼
__doc__ # 模åçè¯´æææ¡£
__file__ # 模åæä»¶çæä»¶åï¼å
æ¬å
¨è·¯å¾
__name__ # 主æä»¶æè
被导å
¥æä»¶
__package__ # 模åæå¨çå
#-- importè¯å¥fromè¯å¥çasæ©å±
import modulename as name
from modulename import attrname as name
#-- å¾å°æ¨¡å屿§çå ç§æ¹æ³ å设为äºå¾å°name屿§çå¼
M.name
M.__dict__['name']
sys.modules['M'].name
getattr(M, 'name')
"""ç±»ä¸é¢å对象----ç±»ä¸é¢å对象----ç±»ä¸é¢å对象----ç±»ä¸é¢å对象----ç±»ä¸é¢å对象----ç±»ä¸é¢å对象----ç±»ä¸é¢å对象----ç±»ä¸é¢å对象----ç±»ä¸é¢å对象----ç±»ä¸é¢å对象"""
#-- ææ®éçç±»
class C1(C2, C3):
spam = 42 # æ°æ®å±æ§
def __init__(self, name): # 彿°å±æ§:æé 彿°
self.name = name
def __del__(self): # 彿°å±æ§:ææå½æ°
print("goodbey ", self.name)
I1 = C1('bob')
#-- Pythonç类没æåºäºåæ°ç彿°éè½½
class FirstClass(object):
def test(self, string):
print(string)
def test(self): # æ¤æ¶ç±»ä¸åªæä¸ä¸ªtest彿° å³åè
test(self) å®è¦çæåè
另忰çtest彿°
print("hello world")
#-- åç±»æ©å±è¶
ç±»: å°½éè°ç¨è¶
ç±»çæ¹æ³
class Manager(Person):
def giveRaise(self, percent, bonus = .10):
self.pay = int(self.pay*(1 + percent + bonus)) # ä¸å¥½çæ¹å¼ å¤å¶ç²è´´è¶
类代ç
Person.giveRaise(self, percent + bonus) # å¥½çæ¹å¼ å°½éè°ç¨è¶
ç±»æ¹æ³
#-- ç±»å
çå·¥å
·
bob = Person('bob')
bob.__class__ #
bob.__class__.__name__ # 'Person'
bob.__dict__ # {'pay':0, 'name':'bob', 'job':'Manager'}
#-- è¿å1ä¸ æ°æ®å±æ§spamæ¯å±äºç±» è䏿¯å¯¹è±¡
I1 = C1('bob'); I2 = C2('tom') # æ¤æ¶I1åI2çspamé½ä¸º42 使¯é½æ¯è¿åçC1çspam屿§
C1.spam = 24 # æ¤æ¶I1åI2çspamé½ä¸º24
I1.spam = 3 # æ¤æ¶I1æ°å¢èªæå±æ§spam å¼ä¸º3 I2åC1çspamè¿é½ä¸º24
#-- ç±»æ¹æ³è°ç¨çä¸¤ç§æ¹å¼
instance.method(arg...)
class.method(instance, arg...)
#-- æ½è±¡è¶
ç±»çå®ç°æ¹æ³
# (1)æä¸ªå½æ°ä¸è°ç¨æªå®ä¹ç彿° åç±»ä¸å®ä¹è¯¥å½æ°
def delegate(self):
self.action() # æ¬ç±»ä¸ä¸å®ä¹action彿° æä»¥ä½¿ç¨delegate彿°æ¶å°±ä¼åºé
# (2)å®ä¹action彿° 使¯è¿åå¼å¸¸
def action(self):
raise NotImplementedError("action must be defined")
# (3)ä¸è¿°çä¸¤ç§æ¹æ³è¿é½å¯ä»¥å®ä¹å®ä¾å¯¹è±¡ å®é
ä¸å¯ä»¥å©ç¨@è£
饰å¨è¯æ³çæä¸è½å®ä¹çæ½è±¡è¶
ç±»
from abc import ABCMeta, abstractmethod
class Super(metaclass = ABCMeta):
@abstractmethod
def action(self): pass
x = Super() # è¿å TypeError: Can't instantiate abstract class Super with abstract methods action
#-- # OOPåç»§æ¿: "is-a"çå
³ç³»
class A(B):
pass
a = A()
isinstance(a, B) # è¿åTrue, Aæ¯Bçåç±» a乿¯Bçä¸ç§
# OOPåç»å: "has-a"çå
³ç³»
pass
# OOPåå§æ: "å
è£
"对象 å¨Pythonä¸å§æé常æ¯ä»¥"__getattr__"é©åæ¹æ³å®ç°ç, è¿ä¸ªæ¹æ³ä¼æ¦æªå¯¹ä¸åå¨å±æ§ç读å
# å
è£
ç±»(æè
称为代çç±»)å¯ä»¥ä½¿ç¨__getattr__æä»»æè¯»å转åç»è¢«å
è£
ç对象
class wrapper(object):
def __init__(self, object):
self.wrapped = object
def __getattr(self, attrname):
print('Trace: ', attrname)
return getattr(self.wrapped, attrname)
# 注:è¿é使ç¨getattr(X, N)å
ç½®å½æ°ä»¥åéåå符串Nä»å
è£
对象Xä¸ååºå±æ§ 类似äºX.__dict__[N]
x = wrapper([1, 2, 3])
x.append(4) # è¿å "Trace: append" [1, 2, 3, 4]
x = wrapper({'a':1, 'b':2})
list(x.keys()) # è¿å "Trace: keys" ['a', 'b']
#-- ç±»çä¼ªç§æå±æ§:使ç¨__attr
class C1(object):
def __init__(self, name):
self.__name = name # æ¤æ¶ç±»ç__name屿§ä¸ºä¼ªç§æå±æ§ åç å®ä¼èªå¨åæself._C1__name = name
def __str__(self):
return 'self.name = %s' % self.__name
I = C1('tom')
print(I) # è¿å self.name = tom
I.__name = 'jeey' # è¿éæ æ³è®¿é® __nameä¸ºä¼ªç§æå±æ§
I._C1__name = 'jeey' # è¿éå¯ä»¥ä¿®æ¹æå self.name = jeey
#-- ç±»æ¹æ³æ¯å¯¹è±¡:æ ç»å®ç±»æ¹æ³å¯¹è±¡ / ç»å®å®ä¾æ¹æ³å¯¹è±¡
class Spam(object):
def doit(self, message):
print(message)
def selfless(message)
print(message)
obj = Spam()
x = obj.doit # ç±»çç»å®æ¹æ³å¯¹è±¡ å®ä¾ + 彿°
x('hello world')
x = Spam.doit # ç±»çæ ç»å®æ¹æ³å¯¹è±¡ ç±»å + 彿°
x(obj, 'hello world')
x = Spam.selfless # ç±»çæ ç»å®æ¹æ³å½æ° å¨3.0ä¹åæ æ
x('hello world')
#-- è·å对象信æ¯: 屿§åæ¹æ³
a = MyObject()
dir(a) # 使ç¨dir彿°
hasattr(a, 'x') # æµè¯æ¯å¦æx屿§ææ¹æ³ å³a.xæ¯å¦å·²ç»åå¨
setattr(a, 'y', 19) # è®¾ç½®å±æ§ææ¹æ³ çåäºa.y = 19
getattr(a, 'z', 0) # è·å屿§ææ¹æ³ 妿屿§ä¸åå¨ åè¿åé»è®¤å¼0
#è¿éæä¸ªå°æå·§ï¼setattrå¯ä»¥è®¾ç½®ä¸ä¸ªä¸è½è®¿é®å°ç屿§ï¼å³åªè½ç¨getattrè·å
setattr(a, "can't touch", 100) # è¿éç屿§å带æç©ºæ ¼ï¼ä¸è½ç´æ¥è®¿é®
getattr(a, "can't touch", 0) # 使¯å¯ä»¥ç¨getattrè·å
#-- ä¸ºç±»å¨æç»å®å±æ§ææ¹æ³: MethodTypeæ¹æ³
# ä¸è¬å建äºä¸ä¸ªclassçå®ä¾å, å¯ä»¥ç»è¯¥å®ä¾ç»å®ä»»ä½å±æ§åæ¹æ³, è¿å°±æ¯å¨æè¯è¨ççµæ´»æ§
class Student(object):
pass
s = Student()
s.name = 'Michael' # 卿ç»å®ä¾ç»å®ä¸ä¸ªå±æ§
def set_age(self, age): # å®ä¹ä¸ä¸ªå½æ°ä½ä¸ºå®ä¾æ¹æ³
self.age = age
from types import MethodType
s.set_age = MethodType(set_age, s) # ç»å®ä¾ç»å®ä¸ä¸ªæ¹æ³ ç±»çå
¶ä»å®ä¾ä¸åæ¤å½±å
s.set_age(25) # è°ç¨å®ä¾æ¹æ³
Student.set_age = MethodType(set_age, Student) # 为类ç»å®ä¸ä¸ªæ¹æ³ ç±»çææå®ä¾é½æ¥æè¯¥æ¹æ³
"""ç±»çé«çº§è¯é¢----ç±»çé«çº§è¯é¢----ç±»çé«çº§è¯é¢----ç±»çé«çº§è¯é¢----ç±»çé«çº§è¯é¢----ç±»çé«çº§è¯é¢----ç±»çé«çº§è¯é¢----ç±»çé«çº§è¯é¢----ç±»çé«çº§è¯é¢----ç±»çé«çº§è¯é¢"""
#-- å¤éç»§æ¿: "æ··åç±»", æç´¢æ¹å¼"ä»ä¸å°ä¸ ä»å·¦å°å³ 广度ä¼å
"
class A(B, C):
pass
#-- ç±»çç»§æ¿ååç±»çåå§å
# 1.åç±»å®ä¹äº__init__æ¹æ³æ¶ï¼è¥æªæ¾ç¤ºè°ç¨åºç±»__init__æ¹æ³ï¼pythonä¸ä¼å¸®ä½ è°ç¨ã
# 2.åç±»æªå®ä¹__init__æ¹æ³æ¶ï¼pythonä¼èªå¨å¸®ä½ è°ç¨é¦ä¸ªåºç±»ç__init__æ¹æ³ï¼æ³¨ææ¯é¦ä¸ªã
# 3.åç±»æ¾ç¤ºè°ç¨åºç±»çåå§å彿°ï¼
class FooParent(object):
def __init__(self, a):
self.parent = 'I\'m the Parent.'
print('Parent:a=' + str(a))
def bar(self, message):
print(message + ' from Parent')
class FooChild(FooParent):
def __init__(self, a):
FooParent.__init__(self, a)
print('Child:a=' + str(a))
def bar(self, message):
FooParent.bar(self, message)
print(message + ' from Child')
fooChild = FooChild(10)
fooChild.bar('HelloWorld')
#-- #å®ä¾æ¹æ³ / éææ¹æ³ / ç±»æ¹æ³
class Methods(object):
def imeth(self, x): print(self, x) # å®ä¾æ¹æ³ï¼ä¼ å
¥çæ¯å®ä¾åæ°æ®ï¼æä½çæ¯å®ä¾ç屿§
def smeth(x): print(x) # éææ¹æ³ï¼åªä¼ å
¥æ°æ® ä¸ä¼ å
¥å®ä¾ï¼æä½çæ¯ç±»ç屿§è䏿¯å®ä¾ç屿§
def cmeth(cls, x): print(cls, x) # ç±»æ¹æ³ï¼ä¼ å
¥çæ¯ç±»å¯¹è±¡åæ°æ®
smeth = staticmethod(smeth) # è°ç¨å
ç½®å½æ°ï¼ä¹å¯ä»¥ä½¿ç¨@staticmethod
cmeth = classmethod(cmeth) # è°ç¨å
ç½®å½æ°ï¼ä¹å¯ä»¥ä½¿ç¨@classmethod
obj = Methods()
obj.imeth(1) # å®ä¾æ¹æ³è°ç¨ <__main__.methods object...> 1
Methods.imeth(obj, 2) # <__main__.methods object...> 2
Methods.smeth(3) # éææ¹æ³è°ç¨ 3
obj.smeth(4) # è¿éå¯ä»¥ä½¿ç¨å®ä¾è¿è¡è°ç¨
Methods.cmeth(5) # ç±»æ¹æ³è°ç¨ 5
obj.cmeth(6) # 6
#-- 彿°è£
饰å¨:æ¯å®åè¾¹ç彿°çè¿è¡æ¶ç声æ ç±@符å·ä»¥åå边紧è·ç"å
彿°"(metafunction)ç»æ
@staticmethod
def smeth(x): print(x)
# çåäº:
def smeth(x): print(x)
smeth = staticmethod(smeth)
# åç
@classmethod
def cmeth(cls, x): print(x)
# çåäº
def cmeth(cls, x): print(x)
cmeth = classmethod(cmeth)
#-- 类修饰å¨:æ¯å®åè¾¹çç±»çè¿è¡æ¶ç声æ ç±@符å·ä»¥åå边紧è·ç"å
彿°"(metafunction)ç»æ
def decorator(aClass):.....
@decorator
class C(object):....
# çåäº:
class C(object):....
C = decorator(C)
#-- éå¶class屿§: __slots__屿§
class Student(object):
__slots__ = ('name', 'age') # éå¶Studentåå
¶å®ä¾åªè½æ¥ænameåage屿§
# __slots__屿§åªå¯¹å½å类起ä½ç¨, 对å
¶åç±»ä¸èµ·ä½ç¨
# __slots__屿§è½å¤èçå
å
# __slots__屿§å¯ä»¥ä¸ºå表listï¼æè
å
ç»tuple
#-- ç±»å±æ§é«çº§è¯é¢: @property
# å设å®ä¹äºä¸ä¸ªç±»:Cï¼è¯¥ç±»å¿
须继æ¿èªobjectç±»ï¼æä¸ç§æåé_x
class C(object):
def __init__(self):
self.__x = None
# 第ä¸ç§ä½¿ç¨å±æ§çæ¹æ³
def getx(self):
return self.__x
def setx(self, value):
self.__x = value
def delx(self):
del self.__x
x = property(getx, setx, delx, '')
# property彿°åå为property(fget=None,fset=None,fdel=None,doc=None)
# 使ç¨
c = C()
c.x = 100 # èªå¨è°ç¨setxæ¹æ³
y = c.x # èªå¨è°ç¨getxæ¹æ³
del c.x # èªå¨è°ç¨delxæ¹æ³
# 第äºç§æ¹æ³ä½¿ç¨å±æ§çæ¹æ³
@property
def x(self):
return self.__x
@x.setter
def x(self, value):
self.__x = value
@x.deleter
def x(self):
del self.__x
# 使ç¨
c = C()
c.x = 100 # èªå¨è°ç¨setteræ¹æ³
y = c.x # èªå¨è°ç¨xæ¹æ³
del c.x # èªå¨è°ç¨deleteræ¹æ³
#-- å®å¶ç±»: éåç±»çæ¹æ³
# (1)__str__æ¹æ³ã__repr__æ¹æ³: å®å¶ç±»çè¾åºå符串
# (2)__iter__æ¹æ³ãnextæ¹æ³: å®å¶ç±»çå¯è¿ä»£æ§
class Fib(object):
def __init__(self):
self.a, self.b = 0, 1 # åå§å两个计æ°å¨aï¼b
def __iter__(self):
return self # å®ä¾æ¬èº«å°±æ¯è¿ä»£å¯¹è±¡ï¼æ
è¿åèªå·±
def next(self):
self.a, self.b = self.b, self.a + self.b
if self.a > 100000: # éåºå¾ªç¯çæ¡ä»¶
raise StopIteration()
return self.a # è¿åä¸ä¸ä¸ªå¼
for n in Fib():
print(n) # 使ç¨
# (3)__getitem__æ¹æ³ã__setitem__æ¹æ³: å®å¶ç±»ç䏿 æä½[] æè
åçæä½slice
class Indexer(object):
def __init__(self):
self.data = {}
def __getitem__(self, n): # å®ä¹getitemæ¹æ³
print('getitem:', n)
return self.data[n]
def __setitem__(self, key, value): # å®ä¹setitemæ¹æ³
print('setitem:key = {0}, value = {1}'.format(key, value))
self.data[key] = value
test = Indexer()
test[0] = 1; test[3] = '3' # è°ç¨setitemæ¹æ³
print(test[0]) # è°ç¨getitemæ¹æ³
# (4)__getattr__æ¹æ³: å®å¶ç±»ç屿§æä½
class Student(object):
def __getattr__(self, attr): # å®ä¹å½è·åç±»ç屿§æ¶çè¿åå¼
if attr=='age':
return 25 # å½è·åage屿§æ¶è¿å25
raise AttributeError('object has no attribute: %s' % attr)
# 注æ: åªæå½å±æ§ä¸å卿¶ æä¼è°ç¨è¯¥æ¹æ³ ä¸è¯¥æ¹æ³é»è®¤è¿åNone éè¦å¨å½æ°æåå¼åå¼å¸¸
s = Student()
s.age # sä¸age屿§ä¸åå¨ æ
è°ç¨__getattr__æ¹æ³ è¿å25
# (5)__call__æ¹æ³: å®å¶ç±»ç'å¯è°ç¨'æ§
class Student(object):
def __call__(self): # ä¹å¯ä»¥å¸¦åæ°
print('Calling......')
s = Student()
s() # såæäºå¯è°ç¨ç ä¹å¯ä»¥å¸¦åæ°
callable(s) # æµè¯sçå¯è°ç¨æ§ è¿åTrue
# (6)__len__æ¹æ³ï¼æ±ç±»çé¿åº¦
def __len__(self):
return len(self.data)
#-- 卿å建类type()
# ä¸è¬å建类 éè¦å¨ä»£ç 䏿åå®ä¹
class Hello(object):
def hello(self, name='world'):
print('Hello, %s.' % name)
h = Hello()
h.hello() # Hello, world
type(Hello) # Helloæ¯ä¸ä¸ªtypeç±»å è¿å
type(h) # hæ¯ä¸ä¸ªHelloç±»å è¿å
# å¨æç±»åè¯è¨ä¸ ç±»å¯ä»¥å¨æå建 type彿°å¯ç¨äºå建æ°ç±»å
def fn(self, name='world'): # å
å®ä¹å½æ°
print('Hello, %s.' % name)
Hello = type('Hello', (object,), dict(hello=fn)) # å建Helloç±» typeåå: type(name, bases, dict)
h = Hello() # æ¤æ¶çhåä¸è¾¹çhä¸è´
"""å¼å¸¸ç¸å
³----å¼å¸¸ç¸å
³----å¼å¸¸ç¸å
³----å¼å¸¸ç¸å
³----å¼å¸¸ç¸å
³----å¼å¸¸ç¸å
³----å¼å¸¸ç¸å
³----å¼å¸¸ç¸å
³----å¼å¸¸ç¸å
³----å¼å¸¸ç¸å
³----å¼å¸¸ç¸å
³----å¼å¸¸ç¸å
³----å¼å¸¸ç¸å
³"""
#-- #æè·å¼å¸¸:
try:
except: # æè·ææçå¼å¸¸ çåäºexcept Exception:
except name: # æè·æå®çå¼å¸¸
except name, value: # æè·æå®çå¼å¸¸åé¢å¤çæ°æ®(å®ä¾)
except (name1, name2):
except (name1, name2), value:
except name4 as X:
else: # å¦ææ²¡æåçå¼å¸¸
finally: # æ»ä¼æ§è¡çé¨å
# å¼åå¼å¸¸: raiseåå¥(raise IndexError)
raise # raise instance of a class, raise IndexError()
raise # make and raise instance of a class, raise IndexError
raise # reraise the most recent exception
#-- Python3.xä¸çå¼å¸¸é¾: raise exception from otherException
except Exception as X:
raise IndexError('Bad') from X
#-- assertåå¥: assert ,
assert x åå§åè #è§£ç : åå§åè --> å符串
#-- Python3.xä¸çå符串åºç¨
s = '...' # æå»ºä¸ä¸ªstr对象ï¼ä¸å¯å对象
b = b'...' # æå»ºä¸ä¸ªbytes对象ï¼ä¸å¯å对象
s[0], b[0] # è¿å('.', 113)
s[1:], b[1:] # è¿å('..', b'..')
B = B"""
xxxx
yyyy
"""
# B = b'\nxxxx\nyyyy\n'
# ç¼ç ï¼å°strå符串转å为å
¶raw byteså½¢å¼ï¼
str.encode(encoding = 'utf-8', errors = 'strict')
bytes(str, encoding)
# ç¼ç ä¾åï¼
S = 'egg'
S.encode() # b'egg'
bytes(S, encoding = 'ascii') # b'egg'
# è§£ç ï¼å°raw byteså符串转å为strå½¢å¼ï¼
bytes.decode(encoding = 'utf-8', errors = 'strict')
str(bytes_or_buffer[, encoding[, errors]])
# è§£ç ä¾åï¼
B = b'spam'
B.decode() # 'spam'
str(B) # "b'spam'"ï¼ä¸å¸¦ç¼ç çstrè°ç¨ï¼ç»æä¸ºæå°è¯¥bytes对象
str(B, encoding = 'ascii')# 'spam'ï¼å¸¦ç¼ç çstrè°ç¨ï¼ç»æä¸ºè½¬å该bytes对象
#-- Python2.xçç¼ç é®é¢
u = u'æ±'
print repr(u) # u'\xba\xba'
s = u.encode('UTF-8')
print repr(s) # '\xc2\xba\xc2\xba'
u2 = s.decode('UTF-8')
print repr(u2) # u'\xba\xba'
# 对unicodeè¿è¡è§£ç æ¯é误ç
s2 = u.decode('UTF-8') # UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
# åæ ·ï¼å¯¹strè¿è¡ç¼ç 乿¯é误ç
u2 = s.encode('UTF-8') # UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 0: ordinal not in range(128)
#-- bytes对象
B = b'abc'
B = bytes('abc', 'ascii')
B = bytes([97, 98, 99])
B = 'abc'.encode()
# byteså¯¹è±¡çæ¹æ³è°ç¨åºæ¬åstrç±»åä¸è´ ä½:B[0]è¿åçæ¯ASCIIç å¼97, è䏿¯b'a'
#-- #ææ¬æä»¶: æ ¹æ®Unicodeç¼ç æ¥è§£éæä»¶å
容ï¼è¦ä¹æ¯å¹³å°çé»è®¤ç¼ç ï¼è¦ä¹æ¯æå®çç¼ç ç±»å
# äºè¿å¶æä»¶ï¼è¡¨ç¤ºåèå¼çæ´æ°çä¸ä¸ªåºå open('bin.txt', 'rb')
#-- Unicodeæä»¶
s = 'A\xc4B\xe8C' # s = 'A?BèC' len(s) = 5
#æå¨ç¼ç
l = s.encode('latin-1') # l = b'A\xc4B\xe8C' len(l) = 5
u = s.encode('utf-8') # u = b'A\xc3\x84B\xc3\xa8C' len(u) = 7
#æä»¶è¾åºç¼ç
open('latindata', 'w', encoding = 'latin-1').write(s)
l = open('latindata', 'rb').read() # l = b'A\xc4B\xe8C' len(l) = 5
open('uft8data', 'w', encoding = 'utf-8').write(s)
u = open('uft8data', 'rb').read() # u = b'A\xc3\x84B\xc3\xa8C' len(u) = 7
#æä»¶è¾å
¥ç¼ç
s = open('latindata', 'r', encoding = 'latin-1').read() # s = 'A?BèC' len(s) = 5
s = open('latindata', 'rb').read().decode('latin-1') # s = 'A?BèC' len(s) = 5
s = open('utf8data', 'r', encoding = 'utf-8').read() # s = 'A?BèC' len(s) = 5
s = open('utf8data', 'rb').read().decode('utf-8') # s = 'A?BèC' len(s) = 5
"""å
¶ä»----å
¶ä»----å
¶ä»----å
¶ä»----å
¶ä»----å
¶ä»----å
¶ä»----å
¶ä»----å
¶ä»----å
¶ä»----å
¶ä»----å
¶ä»----å
¶ä»----å
¶ä»----å
¶ä»----å
¶ä»----å
¶ä»----å
¶ä»----å
¶ä»"""
#-- Pythonå®ç°ä»»ææ·±åº¦çèµå¼ ä¾å¦a[0] = 'value1'; a[1][2] = 'value2'; a[3][4][5] = 'value3'
class MyDict(dict):
def __setitem__(self, key, value): # è¯¥å½æ°ä¸å任使¹å¨ è¿éåªæ¯ä¸ºäºè¾åº
print('setitem:', key, value, self)
super().__setitem__(key, value)
def __getitem__(self, item): # ä¸»è¦æå·§å¨è¯¥å½æ°
print('getitem:', item, self) # è¾åºä¿¡æ¯
# åºæ¬æè·¯: a[1][2]èµå¼æ¶ éè¦å
ååºa[1] ç¶åç»a[1]ç[2]èµå¼
if item not in self: # 妿a[1]ä¸åå¨ åéè¦æ°å»ºä¸ä¸ªdict 并使å¾a[1] = dict
temp = MyDict() # æ°å»ºçdict: temp
super().__setitem__(item, temp) # èµå¼a[1] = temp
return temp # è¿åtemp 使å¾temp[2] = valueææ
return super().__getitem__(item) # 妿a[1]åå¨ åç´æ¥è¿åa[1]
# ä¾å:
test = MyDict()
test[0] = 'test'
print(test[0])
test[1][2] = 'test1'
print(test[1][2])
test[1][3] = 'test2'
print(test[1][3])
#-- Pythonä¸çå¤ç»´æ°ç»
lists = [0] * 3 # æ©å±listï¼ç»æä¸º[0, 0, 0]
lists = [[]] * 3 # å¤ç»´æ°ç»ï¼ç»æä¸º[[], [], []]ï¼ä½æé®é¢ï¼å¾ä¸ç
lists[0].append(3) # ææçå°çç»æ[[3], [], []]ï¼å®é
ç»æ[[3], [3], [3]]ï¼åå ï¼list*næä½ï¼æ¯æµ
æ·è´ï¼å¦ä½é¿å
ï¼å¾ä¸ç
lists = [[] for i in range(3)] # å¤ç»´æ°ç»ï¼ç»æä¸º[[], [], []]
lists[0].append(3) # ç»æä¸º[[3], [], []]
lists[1].append(6) # ç»æä¸º[[3], [6], []]
lists[2].append(9) # ç»æä¸º[[3], [6], [9]]
lists = [[[] for j in range(4)] for i in range(3)] # 3è¡4åï¼ä¸æ¯ä¸ä¸ªå
ç´ ä¸º[]