% ~* n8 E% Q k+ S在python中,可通过if...else构成三元表达式,上式可等价为响应的C语言a = a==2 ? 0 : 1。 n5 y, q" f. ]4 J; K0 f$ C
) c* }! p9 Q% N" d% j( @>>> a = False if a==2 else True* Q' C, Z2 Z; t
>>> a5 p6 c, @( q' l( C! O$ }2 R5 j
False 2 V6 N' A* \+ t2 R1 . _# G4 j3 k2 b1 @+ K& E5 \2 / j& p# f& ~0 p. [$ w" L3 8 P( V5 z2 d0 [+ j @ i9 R# m25 x = [i for i in range(10)]7 w$ j8 ]0 ~6 [. d Y
2 C1 S0 O- }3 j5 u7 {# X+ u$ w& w0 \在python中,可通过for循环来创建元组、列表以及字典。 1 }6 K% J; L, H$ Q8 a9 v $ ?7 [( c7 r# M5 L/ J>>> x = [i for i in range(10)] 3 E3 b8 |# X' l>>> x8 E0 f+ f& M- S7 y
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]- q1 F$ ?% f4 N, |# `0 o) r
1 2 _! n7 ^9 k( o! g0 X2 ' I. e* q* @4 B) W3 ! `) U- ~0 H) E7 }/ r; d7 o26-30 函数封装 $ H1 Y9 @: ?* z1 S" j ' s# O8 q+ Z9 _9 H6 ~# d+ P8 Q* } xdef fac(n):2 g& R) R/ u' P7 `% Z
if n == 0:1 | L. B7 K0 p4 m0 l; H! W
return 1* d( z1 j1 y* ~, n% u6 B
else: * A: Q" k! h0 z* s; V$ b8 | return n*fac(n-1) 2 U: E3 Y* h& Z# R
1 / V4 c* M5 h9 i b3 b+ [$ Y2% O$ T. `+ ?" i
35 ?8 Y2 @: V8 q2 ?+ a! O( P
4 2 c% `. B: T; ]# x$ ~5 / {: R5 m3 A' O3 [2 f这是一个阶乘函数。在pyhton中,代码块以空格的形式存在。 ! R# J+ @. G# g+ q+ O" [5 c! x$ s* \$ b
高手之路 D7 V6 }% Y* Q) S& H
31 fac = lambda n : 1 if n==0 else n*fac(n-1)6 g6 u8 \8 t3 M9 i: h3 h' ?& ^; o# P
F5 A' D2 n% m q这同样是一个阶乘算法,与26-30表示的是同一个函数。此即lambda表达式,可以更加方便地创建函数。4 [. ^: p* O6 e$ s0 K
' P$ \9 z- C$ s, Y3 `$ z
32 op = {"add":lambda a,b:a+b, "minus":lambda a,b:a-b} 8 q* L4 K7 F# S H0 T! @, @, b0 O. \: Y
Python中没有switch..case表达式,而字典+lambda表达式可以弥补这一点。上式中,op["add"]表示调用函数lambda a,b:a+b,即加法;op["minus"]表示调用函数lambda a,b:a-b,即减法。 7 I1 Y6 Y* H2 b. O ] d2 S( z! n$ k
正因lambda表达式并不需要命名,所以也称匿名函数。: M [: f* F6 a' v8 D
* Z, W5 h3 ]0 ~5 F4 z>>> op = {"add":lambda a,b:a+b, "minus":lambda a,b:a-b} 8 W* P. R3 q& i% v7 [9 e! Q>>> op["add"](3,4) 3 Z% s) X5 Q; B1 }7# ^' g E( |+ |' @( @- Q6 n: w! c
>>> op["minus"](3,4). \2 B! F$ e: }0 R# W
-1/ l' T. l, b. V3 ?3 F2 P) n1 R" C
1 , l7 ~- B7 k3 s: ~2: \5 r. q1 {% T; g
3) d% [9 m# b* C
44 z0 x, Y3 i1 {
5 - q1 y+ O1 ~7 G- h* F( O# h8 V33-34 5 ^" e" \1 {2 p$ \ . w B1 b* g2 d3 k. _, U. rwhile a<5:a+=1/ j- K* Y4 G. }2 J
else: print(f"a={a}")# O$ ]* Z: y& {- t
1; y4 k2 g4 A+ d9 {4 ?
2 0 e4 u- F8 n# w# gwhile循环大家都十分了解,即当a<5时执行a+=1的程序。else表示当a<5不满足时执行的代码。 8 f1 |; S( G9 r9 b7 U; [ ) u0 D9 m( B" `0 p& J$ N>>> while a<5:a+=13 h8 |+ M/ P) c$ s( Z
... else: print(f"a={a}") 8 r5 r2 A& X& Z) [" W+ g... $ U8 J. x7 [3 h5 @) l% ]) za=5 2 [& s0 T* s2 t% G: o% I1 5 t# |, x# g5 v4 G" y! p; u. q2* `, p- S4 C7 x; }! ?& j! K
3. R8 ?0 X2 J: I# G4 P
4 - s N, e" U9 ?8 ]0 u( ^, z) E h35-376 T4 X4 P7 h$ r! u0 m4 d$ m. I+ f% g( B
( R2 T9 z" ~7 t! l. C
xs = []3 \1 y: N& U, ]5 p% w7 Q' y7 g
for x in range(10): xs.append(x) , C5 E& F( C" n0 r- Pelse : print(xs)2 m3 O7 t( q: J0 {
19 q0 h* i" G' G! Z& h5 V( E
2 ; L1 {- j' e; w( R% f& Z35 w5 E/ a" Y* G) M9 y7 z* t
和while..else相似,for也有和else的组合,其语义也很雷同,表示当执行完for循环之后执行else的语句。 : B9 q7 i: Y0 ^3 s( j 7 b) c, z' Y" V>>> xs = []8 F; }3 T" C, v1 S% Z8 A* o- d
>>> for x in range(10): xs.append(x)2 O4 O, M/ D% W5 s7 E
... else : print(xs) \* i0 k5 Y$ _8 h; i
... ' W" T7 W8 W2 {[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]# t6 ~$ x) L8 U/ L6 m) I
1" O1 V: e/ @7 r4 l: d
2: [; w. z# z/ Z8 j3 k2 c7 [3 c
3 , v3 @5 F2 i3 | e# X4 ( |( A6 d( c; K54 _3 N0 G9 p% W0 u% D. l
38-40 # b8 Y! z7 L& M8 a 7 O& U" u) O& y Z9 `3 kfrom matplotlib import pyplot as plt' x3 `% s, ]( f5 |! O
plt.plot(np.random.rand(10)) S0 i. q5 d; U+ z+ y3 Q
plt.show(). ]% J. n8 O/ o5 h2 I. X( }
1 ' L: I, N! ]$ T# `" ?2 $ v! I( p* {% e8 d* L( z3' [7 @7 K& g( q/ h+ n
from...import表示从matplotlib中导入pyplot。matplotlib是python中最常用的画图包,功能非常强大。 - {8 x1 O1 _5 t. Q 3 a( |. w1 Q& t4 jplt.plot是最常用的绘图函数。python在执行绘图函数之后,会将图片放入内存,当使用plt.show()之后,才会将其显示到屏幕上。 0 s: W" i( }* D/ H# F& ~$ g# z! j2 x# J7 K
>>> from matplotlib import pyplot as plt, G$ q, Q% A8 `; U' V6 p" B( b
>>> plt.plot(np.random.rand(10))4 \+ w1 U* S) u9 o4 E$ B( D
[<matplotlib.lines.Line2D object at 0x00000232FA511B10>] $ j$ c& C, p5 R c1 E1 Q" o>>> plt.show() ; x+ A8 U* p$ v/ n+ H, _1 9 D& ]" S. C6 B/ C2 / J- A. [" ?' e; L1 F" |3 g! r3 8 I/ S9 b6 x& I+ O4/ v3 C- m J/ m8 x/ `/ k
41-48 % o8 [* K1 W' j3 @3 O' ?; F; U% z# h: j' x9 y1 u+ | d
class person:+ _) @; [3 O0 o. }$ m' ?$ S
def __init__(self,name): ) W3 X# Z* f5 l' M3 l( i self.name = name ' x/ A( C; J! y# m$ ^ def selfIntro(self): % e0 D5 v/ E5 C6 Q
print(f"my Name is {self.name}") ; W% w+ r% K) E @staticmethod9 y. V9 k$ S( ~, F5 Q
def say(string): 6 C, r- m: c) H* m8 s8 Z print(string)' k9 g* [: ^" w+ [' z
1; b7 }; A; F% ^4 v' @
2) e* `1 ?/ k4 w
34 [# }6 _& {6 \7 R* C m
4/ U8 w1 [$ H( a" W* e
5 + t' f' }7 V. }$ j6. N# J- m* b: M( f6 L
7 & h& C- |" W6 @1 t82 z8 a+ v9 T9 G, w4 B+ o
尽管python主打函数式,但在python中,一切皆对象。而class则可以声明一个类。5 u- e# t' `5 T8 R0 h* F
6 u. x$ E# q( c: m- i' V
在类中,通过self来声明类成员,类似有些语言中的this.。 ! s7 q" G+ k& l, W* ]% f; t: D* W" V" \
__init__为python内置的初始化函数,在类实例化之后,会首先运行这个函数。8 ~) K0 a2 F& W( W, F
+ r1 t. i9 \7 |, S@staticmethod为静态类标识,静态类可以不经实例而使用。 * u0 F1 ~* ^! ?; e0 U& V4 t3 ]" F- a; u& E7 @2 W
>>> person.say("hello") : u- p7 |$ a9 s i3 S1 Y% ~hello2 O, L4 b5 z1 |" h: d
>>> person.selfIntro()' S. L0 a6 @9 M `
Traceback (most recent call last):8 I3 e/ c; S9 \* y: T; ]
File "<stdin>", line 1, in <module> o6 O! U& K$ v1 X# t5 B0 x9 j- z- W! sTypeError: person.selfIntro() missing 1 required positional argument: 'self': M( _# _8 ~$ D9 d
>>> Li = person("Li")" o6 `0 U6 f- t8 M
>>> Li.selfIntro() X* b) _8 Y) c' A& x7 }& d% A
my Name is Li8 E8 r* o3 n* j, j- o: V5 p+ \5 P
>>>) j! t, t! x& M: G, u% G8 P
1- U% _- S! u( `4 m/ B" T8 A' ~
28 v2 K, O2 ^6 N0 J/ p% X
3 # i* U; T$ P& {# m% R! K& L4 3 ~4 {% C. b, V' x, d8 R! p5, h; }: H" X, I: X- S7 {
6* i' `" Y/ r% @
7 & Q7 N8 D; i4 I+ p5 q- H8; q3 p2 V6 B' Y5 F5 r
9 1 J. ?; z, y: e Q10 9 e5 D- b( N7 n$ p% @3 ?- O+ r8 D3 e# C49 xs=[i for i in range(10) if i%2==0]! G4 P3 ~; A/ c. d5 C
2 ^# c8 W+ v# V通过推导式来快速通过筛选来创建列表。 2 b6 D) F; r( w5 v6 o0 x0 s6 q2 L2 V8 U: h9 g
>>> xs=[i for i in range(10) if i%2==0]% p& R; ?6 z$ |
>>> xs ; D' Y# F2 D, N; c+ Q' d[0, 2, 4, 6, 8]! B: O) a b2 p, J1 F0 R# g
1$ o6 {/ B7 w; Z$ @, M- S
2 2 d% C/ z Z$ `8 ~/ T; G7 `. E3- P, F3 s* A% `6 R
50 d = dict([[1,2],[4,5],[6,7]]): S7 D7 p) e# y
8 J7 [# C, L$ v2 u) K5 J
dict可将列表转为字典,前提是列表中的元素必须为二元组。( A5 U% R, c5 o8 {- a5 _
8 }" W: x+ D& Y/ M! q( x6 n>>> d = dict([[1,2],[4,5],[6,7]]) & p; A) ^2 K( t. S>>> d+ ]' m9 K- }0 c* B
{1: 2, 4: 5, 6: 7}; T& a- f6 K3 s* ?' x) h
12 f. a8 U6 Y0 p4 `, H% [
2/ H2 [' c. {4 J7 \3 }
3 ) V" L% N d0 t. b内置包库 : O9 Y/ [6 x9 @$ I) k' I51 time.time() * E, b& |/ n" }- K0 i: @3 Z6 r/ y$ V" |$ h0 h& ^3 x
当然前提是要导入import time,这其实是个很常用的函数,以时间戳的形式返回当前的时间。 # }' b+ F9 Q4 Q1 M& ]+ o1 z5 E' ?0 ]3 a% J0 M3 r5 G9 j) Q
>>> import time 6 l' [6 x- g! _ m# P: N>>> time.time()+ {; o! m* X. d' e, A1 D9 J; Z
1634558595.5172253) j5 I8 {1 A7 F5 }1 j* w1 V) x
1 ( ^9 J2 L( m7 B% n& M2 * x0 J8 i% F! v0 g( H3 ' s- n* T2 [/ `2 _, a& V52 calendar.prmonth(2021,10) 8 b$ x# k" C' h3 p7 Z" h/ h3 c3 G& j7 c `
可打印日历。。。 - c# X: e, M A7 g! s% N/ Z, K9 m9 b
>>> import calendar) \5 v$ `* R7 U4 `: `
>>> calendar.prmonth(2021,10) 0 y7 ^0 n( O( ^/ j' o3 X+ { October 2021 3 W/ [9 _; u1 Y" `4 `$ B2 XMo Tu We Th Fr Sa Su 3 J3 _0 }; u/ u 1 2 3 , D' x" n n, X6 y 4 5 6 7 8 9 10 % K6 m$ S5 L" }9 b- n11 12 13 14 15 16 17 $ s `- r( h4 l2 g18 19 20 21 22 23 24" w/ r* N- l6 D( _& c; s, K' X5 v
25 26 27 28 29 30 31 4 T1 O) G. r2 @; a>>>* H- Z8 t: R, _
1 5 ]1 N4 m3 y$ \. c# d, u4 [2& C0 a- f: v" p8 G' H
3 ( N: x Q1 B& r4 5 q+ `: t' y+ W+ D0 j1 g57 X5 w k; Z3 ]' H: |6 L9 M3 T- @
6 0 X! K8 @& n; p2 r( n6 X8 `7 9 T8 L9 T$ ?) M% h4 Y4 g8. Y# B1 ^; K: v4 G5 v: ^+ c% T
9 7 ?4 w, j/ L+ v* K3 V. o1 q10- N4 ]( a1 s$ O/ S( Y# Y5 V
53 os.listdir(r"c:\Windows") ; Y! F! i2 h' L9 g' \- e8 } 5 E& P8 K4 F! F7 P6 A% j, T返回文件列表,其中r字符串中的\不用于转义。 1 H1 K( @8 w( J. O+ _) [2 v& ]( t4 r6 V, I: v5 W7 g
>>> import os 8 R) C0 B1 k3 K' R4 v7 Z a>>> os.listdir(r"c:\Windows") ' R" ^7 ?9 K. p. |) _9 k6 I& `['addins``appcompat``apppatch``AppReadiness``assembly``bcastdvr``bfsvc.exe', ... 8 w2 \0 }+ f+ y" u( f& A1! w, Y" l, G' M) L& ~: I0 e4 h
22 ]) v L O, t* `
3 4 E' Y9 A8 {" k9 f- Y54 os.path.join(r"C:\Windows", "python.exe")% I/ O1 s. y- Q! W; h3 Q; I* U h
8 j; S+ f# D) V) u! [$ s合并路径,自动处理\\。. _9 \1 ?8 D9 |* R, F, E! q
" G8 W6 v( q: O9 n; W% O2 A
>>> os.path.join(r"C:\Windows", "python.exe") ; }. P% I8 X+ @0 I0 ^8 I. o, n' ^0 O" P7 |'C:\\Windows\\python.exe', U, P3 u r2 m
1% l2 L( ~5 j% d) B" L" `1 i* D
2: C$ c. k d# x: G5 @+ o
55 glob.glob(r"c:\Windows\*.ini")2 h7 V" K' Z2 r! ]% N6 i, h* E$ W0 u
4 \0 K: E: G1 U n1 b
可通过通配符返回文件列表。) q6 _+ ~0 {/ ?* P3 w
% B; V$ N) b0 Q>>> import glob * C8 [) |$ @$ {( F8 w& Q; c# X>>> glob.glob(r"c:\Windows\*.exe")+ C7 @$ K' R. l( R8 T
['c:\\Windows\\bfsvc.exe``c:\\Windows\\explorer.exe``c:\\Windows\\HelpPane.exe``c:\\Windows\\hh.exe``c:\\Windows\\notepad.exe``c:\\Windows\\py.exe``c:\\Windows\\pyw.exe``c:\\Windows\\regedit.exe``c:\\Windows\\splwow64.exe``c:\\Windows\\Wiainst64.exe``c:\\Windows\\winhlp32.exe``c:\\Windows\\write.exe']# }+ h `# B, |5 E! Q. G& K p
>>>9 Y( y0 d6 S! H! k
13 n0 j- A, S9 k, T, w0 s
2 4 q2 g8 x9 P& N' c* K36 L: A8 Q* k- N: Z* d5 ?. {6 N, Y) E' X
4! |4 h; |; |: C
56-57 urllib# D! J" Q6 o: p) A, N7 ?
4 B( u! L7 m0 \2 y" \) j5 ?
response = urllib.request.urlopen('https://blog.csdn.net/')7 |0 ]$ E: l& D( T' \6 G
html = response.read(), I ^6 D/ L* P2 C* W) Q$ c
13 b z. z% r3 Q" O$ \1 f; A& I
2 6 r% Y7 O! B4 c* @& k4 k$ H) jurllib是python内置的http解析请求库,是大多数爬虫学习者接触的第一个工具。 ; E6 ]# k* e1 h4 `8 R' z+ s- j5 @ U6 w) `, q7 ^
其中,read()用于读取网页数据,当然,得到的网页数据是未解码数据。 6 o& j9 z9 v- O- H/ f% G" `3 u# y3 G$ T, h9 R9 j/ b
import urllib.request 6 @- h+ z; N, v. Hresponse = urllib.request.urlopen('https://blog.csdn.net/')1 |3 i4 p5 l+ ?) @# q6 e, r
html = response.read() , y* L& L! j1 Q) v1 6 T7 @( z( O" S" H+ i6 `3 l0 u2( U$ Q' u$ w% f4 Z6 V
3 2 y, P/ `! ]( d9 X/ `" J58-59 正则表达式re/ U4 O: {( S9 ?5 |" Q
/ h1 |( ^8 F* e
content = html.decode('utf-8')0 M' b2 s. {( n* f* Z- S
cn = re.findall(r"[\u4e00-\u9fa5]+", content)% \3 y6 D2 m9 G! g
1 ' c M; A9 x2 n; W! |! D$ N9 ?2 6 V# h5 |" G% E. E' p9 y此为正则表达式的简单应用,re.findall表示从字符串content中筛选出符合r"[\u4e00-\u9fa5]+"要求的值。所以第一步,是通过utf-8对content进行解码。 0 { d% Z- B! G" ?* q, W6 v- a( S' c) S
而在utf-8中,汉字的序号为\u4e00-\u9fa5;在正则表达式中,[]表示符合条件的集合,+表示出现任意多个符合条件的字符。 % ?( M* ~# s" M3 }7 K. w7 X ( L3 G+ U3 b& T9 Q- ]1 A. y>>> import re , E! e# p" `( g>>> content = html.decode('utf-8'): i- n" l) d9 ^% s# O
>>> cn = re.findall(r"[\u4e00-\u9fa5]+", content) 3 d$ }9 w0 Z+ J, X+ P( I2 w>>> cn[:20] ( M2 ?) j5 Q& s0 i5 S$ R4 u['博客``专业``技术发表平台``博客为中国软件开发者``从业人员``初学者打造交流的专业``技术发表平台``全心致力于帮助开发者通过互联网分享知识``让更多开发者从中受益``一同和``开发者用代码改变未来``头部``广告``频道首页右侧``打底``头部``广告``题目征集``你出我答``做'] 1 U" m! M* [* F9 V>>>9 o# W0 h- e$ X1 w0 G8 e5 G0 X( }
1. r! u& h' _% V
22 f, i( X7 U: d, Z5 J9 R
3 7 b9 \) p. u+ E: ~44 v v. i4 _1 b
5 % D+ T; o( o- q( m" r6 3 m( K0 B0 o, h7 I1 a60 Thread(target=print,args=["hello thread"]).start() + P, w& m" ?3 l/ n0 U w8 `8 R# X) v$ d/ e1 b8 l! G& V
这是最简单的多线程程序,target是将要调用的函数,args为参数列表。! x) ]$ S5 a& V5 ]0 b) m: G* c
3 y3 n7 m6 }$ J) n/ v
>>> from threading import Thread5 @5 {5 t. G" w. G* `
>>> Thread(target=print,args=["hello thread"]).start()- s6 B9 v0 C: k+ e5 {* Q
hello thread/ g1 e0 Y, K5 Q! w
1- _- N/ K7 t" |$ J6 b
2/ c! b) T9 D& a" j; U: G. k, F
3- `3 R2 a% I3 |4 n n0 e0 R
61-63 线程池3 n+ O2 n9 {/ z+ z* R) W
" _" F1 Z) R, G, p; ~concurrent.futures中的ThreadPoolExecutor可快速创建线程池,其输入参数为线程池中可以容纳的最多线程数, ) H2 X+ `7 S9 Q) [9 Q4 z- b. r( E `0 g
from concurrent.futures import ThreadPoolExecutor. B+ U4 n ^2 x! _- `& q
with ThreadPoolExecutor(max_workers=5) as ex:& {$ y# K' d, j/ v( B" y8 P
for i in range(15): & b2 d3 s3 ^% d, E% p* ^( S ex.submit(print,f"{i}")8 y$ J$ f$ F u8 n4 l
1 ; ^& _; Q# P( a2 " H$ B, T/ n5 e) {) M& Y3 8 z1 f2 ^2 r! z, {) ]- v A2 W4. }* s4 n5 e0 w: \
64-66 进程池 6 t4 P0 Q- I2 k$ ~% X 8 [9 l3 B, H! Z* J1 R! G0 v6 h创建单个进程的方法和创建多个线程的方法并无区别,只是把threading中的Thread换成multiprocessing中的Process而已,故不赘言了。0 ?$ C3 x" f% n' L, U
$ i" O/ u) U: W9 B; A
from multiprocessing import Pool 9 M" X3 ^/ p, D" L9 a% u' G* W2 A W / _) P: Q* q6 _1 N8 t7 Kdef over(cb): ( M u* Z4 u [, _/ V print("完成")8 q5 h' f0 p( U/ F& E& W
, @$ P& \; C& t, F. W! P
p = Pool(5)" N- G) D. O6 @& V* t$ s1 y
for i in range(15):6 W1 t# Z3 a P' Z- T2 ?+ i
p.apply_async(func=print,args = [f"{i}"], callback=over) - @# h" B$ E) u& m1 ; q8 ]9 l. E: X8 L, C1 y' f( m2 $ U: V! o/ D& |8 D- U4 {2 C3 : s9 F- ?7 l0 v1 |! a m' Y( j2 d; {6 ~47 N6 e/ L! E: ~& [& [
5 ' |* _) j6 W6 r$ w4 }! G6 8 _5 f6 D, J# E0 K+ K7 @7 0 Q. |2 C I4 F8; s) m" z2 W; n) U& x
67-68 创建窗口程序tkinter6 c' {, C8 Z" D) l0 V' Q+ W1 u
' L! p1 X9 N" m; g8 M! U
frame = tkinter.Tk() 5 p8 C) d& o" G9 F* rframe.mainloop()+ q& u# o4 o$ v0 g, R
1 4 K; t D: t+ f O" }2 - z" F9 u7 \7 q" {! Y! L5 W- `1 f其中frame即为tkinter创建的窗口,而mainloop表示进入窗口的消息循环。9 q# ?7 O; w" K+ y
. ]$ X# p7 m! L8 _( v9 P
>>> import tkinter 6 G% F2 R2 }' m& \8 L, I* J. B>>> frame = tkinter.Tk() ' L) m5 {1 w8 p9 j: f; i8 M>>> frame.mainloop(): i/ g7 W" r) n7 j
1 - H$ z9 u& T5 Z I; W6 p( e& d2 7 z$ r; g7 l& a3: r( C, G. P; T& S
69-70 通过ctypes调用C语言动态链接库 * g0 s& A4 I7 c! G; i+ B* ?# l) P f, b' ^* o
>>> import ctypes& @( T9 L% Q, J( k
>>> libc = ctypes.CDLL("msvcrt") 3 f5 a. V6 c, L" y) J; @6 H$ O7 C1 S) ^0 l>>> libc.printf("%s".encode(), "Hello ctypes\n".encode()) " I: U# ~ P$ X! Q" {" T: w4 jHello ctypes % I: z5 U+ e4 O13 #此为该函数的返回值 3 ?7 x4 N' Z4 v1 q# |: I1 , i; v" N0 t: I' [. K4 T7 B, i2 ! z: g- E7 z) T35 ^5 d% m! k q4 ^' l: W7 I @
4. G3 }3 E" d! T+ T4 A
5 ' ]( x! o2 l: v8 X z4 o奇技淫巧 - N: `2 o% ]& w" X71 judge = lambda a,b,f1,f2 : (f1 if a>b else f2)(a,b)3 L! A7 H! ~/ ^' P. \1 W1 ]
* A h3 ^6 B3 I' V
表示,如果a>b则执行f1(a,b),否则执行f2(a,b) 3 t' A3 c( w3 L/ Q* `% R* r" A* d4 r5 v' p. r- ` G+ f U6 z/ N
72 eval('[a,b,c]') o# q2 s4 Z- f6 @
; w9 _0 X! B7 h4 l. R3 m
eval函数会把字符串转为可执行的表达式。 0 h, d- _% [- p( V, H1 C " w) z- m6 z7 Q1 T73 list(zip(*lst)) 0 ]% W. U1 w' H4 M$ D: d + o, U; k4 n* T* `' X2 izip可以像拉链一样将数组中对应的值缝合起来,以元组的形式重新存储。根据这个特性,可完成列表的"转置"。 ; P! Q- p& z- V; Y& ~9 b; o+ c' {4 V2 `2 h5 f* T
>>> lst = [[1,2], [3,4], [5,6]]% K& h# r8 `7 p: X8 J) C
>>> list(zip(*lst)) x" L9 t+ S c' r8 s, ^9 T[(1, 3, 5), (2, 4, 6)] 0 z" d5 U K6 b5 _! T) S1 6 l+ Z @, T" h2 ]2 ( D* }! w) ]5 O+ u0 a5 z3% B/ G; e% k2 e/ p
74 max(set(lst),key=lst.count) % g B* J. n" \0 x5 ]" Z. {3 M3 A! y8 Z# F, F
其中lst为列表,count(i)是列表的内置函数,表示统计i出现的个数。set表示将lst转为集合,从而剩排除重复值。 : L5 |" \) r' Z# R& T& T# |& r+ ^. J! \& I& H+ u2 u$ f
max(set(lst),key=lst.count)表示通过lst.count这个指标来得到set(lst)中出现次数最多的那个值——即求众数。. `8 |7 W8 C A& y$ ^$ o1 q5 p' w* Q
. G( t' g# s1 r6 x z75 dict(zip(myDict.values(),myDict.keys())) " p6 }0 A% j5 x* i1 ? R8 Z+ C! n8 T& R' B) M' V, Y K
通过zip实现字典的字符串互换操作。 / |6 X9 U. b+ H+ W* n4 p$ `7 Q) ?1 ~/ N: b1 z* g
76 [*a,*b]+ n% e/ k# @: f+ \4 V2 o