-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.html
1224 lines (798 loc) · 210 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge" >
<link rel="dns-prefetch" href="http://yoursite.com">
<title>老阳的技术博客</title>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<meta name="keywords" content="Python、爬虫、Web开发、数据分析、人工智能">
<meta property="og:type" content="website">
<meta property="og:title" content="老阳的技术博客">
<meta property="og:url" content="http://yoursite.com/index.html">
<meta property="og:site_name" content="老阳的技术博客">
<meta property="og:locale" content="default">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="老阳的技术博客">
<link rel="alternative" href="/atom.xml" title="老阳的技术博客" type="application/atom+xml">
<link rel="icon" href="/favicon.png">
<link rel="stylesheet" type="text/css" href="/./main.0cf68a.css">
<style type="text/css">
#container.show {
background: linear-gradient(200deg,#a0cfe4,#e8c37e);
}
</style>
</head>
<script async src="//dn-lbstatics.qbox.me/busuanzi/2.3/busuanzi.pure.mini.js"> </script>
<span id="busuanzi_container_site_pv">
本站总访问量<span id="busuanzi_value_site_pv"></span>次
</span>
<body>
<div id="container" q-class="show:isCtnShow">
<canvas id="anm-canvas" class="anm-canvas"></canvas>
<div class="left-col" q-class="show:isShow">
<div class="overlay" style="background: #4d4d4d"></div>
<div class="intrude-less">
<header id="header" class="inner">
<a href="/" class="profilepic">
<img src="https://avatars1.githubusercontent.com/u/40999593?s=400&u=703db439a96744befc109e25516083a7d654feea&v=4" class="js-avatar">
</a>
<hgroup>
<h1 class="header-author"><a href="/">ip520011</a></h1>
</hgroup>
<nav class="header-menu">
<ul>
<li><a href="/">主页</a></li>
<li><a href="/archives">所有文章</a></li>
</ul>
</nav>
<nav class="header-smart-menu">
<a q-on="click: openSlider(e, 'innerArchive')" href="javascript:void(0)">所有文章</a>
<a q-on="click: openSlider(e, 'friends')" href="javascript:void(0)">友链</a>
<a q-on="click: openSlider(e, 'aboutme')" href="javascript:void(0)">关于我</a>
</nav>
<nav class="header-nav">
<div class="social">
<a class="github" target="_blank" href="https://github.com/ip520011/ip520011.github.io" title="github"><i class="icon-github"></i></a>
<a class="weibo" target="_blank" href="#" title="weibo"><i class="icon-weibo"></i></a>
<a class="rss" target="_blank" href="#" title="rss"><i class="icon-rss"></i></a>
<a class="zhihu" target="_blank" href="#" title="zhihu"><i class="icon-zhihu"></i></a>
</div>
</nav>
</header>
</div>
</div>
<div class="mid-col" q-class="show:isShow,hide:isShow|isFalse">
<nav id="mobile-nav">
<div class="overlay js-overlay" style="background: #4d4d4d"></div>
<div class="btnctn js-mobile-btnctn">
<div class="slider-trigger list" q-on="click: openSlider(e)"><i class="icon icon-sort"></i></div>
</div>
<div class="intrude-less">
<header id="header" class="inner">
<div class="profilepic">
<img src="https://avatars1.githubusercontent.com/u/40999593?s=400&u=703db439a96744befc109e25516083a7d654feea&v=4" class="js-avatar">
</div>
<hgroup>
<h1 class="header-author js-header-author">ip520011</h1>
</hgroup>
<nav class="header-nav">
<div class="social">
<a class="github" target="_blank" href="https://github.com/ip520011/ip520011.github.io" title="github"><i class="icon-github"></i></a>
<a class="weibo" target="_blank" href="#" title="weibo"><i class="icon-weibo"></i></a>
<a class="rss" target="_blank" href="#" title="rss"><i class="icon-rss"></i></a>
<a class="zhihu" target="_blank" href="#" title="zhihu"><i class="icon-zhihu"></i></a>
</div>
</nav>
<nav class="header-menu js-header-menu">
<ul style="width: 50%">
<li style="width: 50%"><a href="/">主页</a></li>
<li style="width: 50%"><a href="/archives">所有文章</a></li>
</ul>
</nav>
</header>
</div>
<div class="mobile-mask" style="display:none" q-show="isShow"></div>
</nav>
<div id="wrapper" class="body-wrap">
<div class="menu-l">
<div class="canvas-wrap">
<canvas data-colors="#eaeaea" data-sectionHeight="100" data-contentId="js-content" id="myCanvas1" class="anm-canvas"></canvas>
</div>
<div id="js-content" class="content-ll">
<article id="post-py11_mysql03" class="article article-type-post article-index" itemscope itemprop="blogPost">
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2018/08/30/py11_mysql03/">MYSQL--查询</a>
</h1>
<a href="/2018/08/30/py11_mysql03/" class="archive-article-date">
<time datetime="2018-08-30T00:44:00.425Z" itemprop="datePublished"><i class="icon-calendar icon"></i>2018-08-30</time>
</a>
</header>
<div class="article-entry" itemprop="articleBody">
<h2 id="1)单表查询"><a href="#1)单表查询" class="headerlink" title="1)单表查询"></a>1)单表查询</h2><p>查询语句的格式</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">select 字段1,字段2,字段3,....,字段n 6</span><br><span class="line">from 表名 1</span><br><span class="line"><span class="built_in">where</span> 条件子句 2</span><br><span class="line">group by 分组子句 3</span><br><span class="line">having 条件子句 4</span><br><span class="line">order by 排序子句 5</span><br><span class="line"><span class="built_in">limit</span> 分页子句</span><br></pre></td></tr></table></figure>
<p>例如:select <em> from person<br>该语句中,</em>代表了表中所有的字段,但是我们日常开发中,不允许这样使用。一定要明确的标出需要查询的相关字段名。这有有利于在查询时减少数据库在查询表时不必要的字段检索。</p>
<p>关系运算与逻辑运算<br>逻辑与 and</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">select pno, pname, age, hire_date, salary from persons <span class="built_in">where</span> hire_date>=<span class="string">'2018-03-01'</span> and hire_date<=<span class="string">'2018-04-30'</span>;</span><br></pre></td></tr></table></figure>
<p>等价于</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">select pno, pname, age, hire_date, salary from persons <span class="built_in">where</span> hire_date between <span class="string">'2018-03-01'</span> and <span class="string">'2018-04-30'</span>;</span><br></pre></td></tr></table></figure>
<p>第二种写法的效率会更优。因为采用了关系表达式,使用一次比较实现条件。</p>
<p>逻辑或 or</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">select pno, pname, age, hire_date, salary from persons <span class="built_in">where</span> salary=3459 or salary = 3400;</span><br></pre></td></tr></table></figure>
<p>等价于</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">select pno, pname, age, hire_date, salary from persons <span class="built_in">where</span> salary <span class="keyword">in</span>(3459,3400);</span><br></pre></td></tr></table></figure>
<p>逻辑非 not</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">select pno, pname, age, hire_date, salary from persons <span class="built_in">where</span> hire_date NOT between <span class="string">'2018-03-01'</span> and <span class="string">'2018-04-30'</span>;</span><br></pre></td></tr></table></figure>
<p>排序子句:order by(排序子句一定要放在所有子句之后)<br>sql中排序分为升序与降序,默认情况下为升序,如果要使用降序采用desc关键字。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">select pno, pname, age, hire_date, salary from persons order by salary desc;</span><br></pre></td></tr></table></figure>
<p>注意,如果出现多个排序条件时,表示为先按照第一个排序条件进行排序,如果出现相同的排序字段内容时,再按照第二个排序条件进行排序,依次类推。多个排序条件之间,用,号隔开。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">select pno, pname, age, hire_date, salary from persons order by salary desc, hire_date;</span><br></pre></td></tr></table></figure>
<p>分组子句:group by<br>如果SQL中使用了分组子句,那么在select子句里面,只能使用分组字段或者是统计函数。例如:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">select age,count(age) from persons group by age;</span><br></pre></td></tr></table></figure>
<p>注意:通常情况下分组子句会结合统计函数一起使用。</p>
<p>having条件子句<br>having子句通常是配合group子句一起使用,having将统计函数作为其条件字段。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">select age,count(age) from persons group by age having count(age)>1;</span><br></pre></td></tr></table></figure>
<p>limit子句:分页子句<br>limit 开始的行号(第一行为0),显示几条记录</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">select * from persons <span class="built_in">limit</span> 0,1;</span><br></pre></td></tr></table></figure>
<p>distinct去重:<br>去除指定字段中的重复内容,只保留一个。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">select distinct salary from persons;</span><br></pre></td></tr></table></figure>
<p>列表名与表别名<br>列别名:给指定的列,起别名。可以使用as关键字。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">select 列名 [as] 别名 from 表名</span><br></pre></td></tr></table></figure>
<p>例如:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">select pno as <span class="string">'编号'</span> from persons;</span><br></pre></td></tr></table></figure>
<p>表别名:给指定的表,起别名。使用as关键字修饰。</p>
<p>统计函数:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">count():统计个数</span><br><span class="line">max():求最大值</span><br><span class="line">min():求最小值</span><br><span class="line">avg():求平均值</span><br><span class="line">sum():求和</span><br></pre></td></tr></table></figure>
<p>注意,在使用统计函数时,如果没有配合group by子句使用,那么在select中只能输出统计函数的值,不能输出其他字段。例如:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">select max(salary) from persons;</span><br></pre></td></tr></table></figure>
<p>其中,max、min、avg、sum只能统计数据类型是数值型的字段,如果该字段值为null,那么统计函数将忽略该内容。我们可以通过ifnull(字段,替换值),将null值转换为我们指定的值,进而参加相关的统计运算。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">select avg(ifnull(salary,0)) from persons;</span><br></pre></td></tr></table></figure>
<p>模糊查询:like<br>我们通常在查询时,如果条件内容不是非常明确的情况下,我们会使用like关键字进行模糊查询。通常会使用%、<em>来配合,其中%代表了0到n个字符,</em>代表了1个字符。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">select * from persons <span class="built_in">where</span> pname like <span class="string">'_i%'</span>;查找名字第二位是i的人员信息</span><br><span class="line">select * from persons <span class="built_in">where</span> pname like <span class="string">'%i%'</span>;查找名字中有i的人员信息</span><br></pre></td></tr></table></figure>
<h2 id="多表查询"><a href="#多表查询" class="headerlink" title="多表查询"></a>多表查询</h2><p>1、查询分类<br>内连接(等值连接)</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">inner join</span><br></pre></td></tr></table></figure>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">select e.empno,e.ename,e.sal,e.deptno,d.dname from emp e inner join dept d on e.deptno=d.deptno <span class="built_in">where</span> e.sal>2000;</span><br></pre></td></tr></table></figure>
<p>等价于</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">select e.empno,e.ename,e.sal,e.deptno,d.dname from emp e, dept d <span class="built_in">where</span> e.deptno=d.deptno and e.sal>2000;</span><br></pre></td></tr></table></figure>
<p>外连接<br>分为左外连接与右外连接</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">left join on</span><br><span class="line">right join on</span><br></pre></td></tr></table></figure>
<p>何时使用外连接?<br>当进行两个表连接查询时,其中一方有不匹配记录,如果进行等值连接这些记录将不会被查询检索,如果我们需要查询时将匹配记录以及不匹配记录都查询出来,就需要使用外连接。那么不匹配记录存在的表位于连接语句的左侧,就使用左外连接,如果出现在右侧就使用右外连接。<br>例如:其中dept表中有不匹配的记录,deptno=40的记录。<br>左外连接</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">select e.empno,e.ename,d.deptno,d.dname from dept d left join emp e on e.deptno=d.deptno;</span><br></pre></td></tr></table></figure>
<p>右外连接</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">select e.empno,e.ename,d.deptno,d.dname from emp e right join dept d on e.deptno=d.deptno;</span><br></pre></td></tr></table></figure>
<p>子查询<br>概念:将一个SQL查询语句的返回结果,作为另外一个查询语句的条件来使用。<br>分为单行子查询与多行子查询</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">单行子查询:作为条件返回的查询语句,其返回结果为一行记录。</span><br><span class="line">多行子查询:作为条件返回的查询语句,其返回结果为多行记录。</span><br></pre></td></tr></table></figure>
<h2 id="补充:"><a href="#补充:" class="headerlink" title="补充:"></a>补充:</h2><p>行变列</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">select name,max(<span class="keyword">case</span> course when <span class="string">'math'</span> <span class="keyword">then</span> score <span class="keyword">else</span> 0 end) <span class="string">'数学'</span>,max(<span class="keyword">case</span> course when <span class="string">'english'</span> <span class="keyword">then</span> score <span class="keyword">else</span> 0 end) <span class="string">'英语'</span>,max(<span class="keyword">case</span> course when <span class="string">'chinese'</span> <span class="keyword">then</span> score <span class="keyword">else</span> 0 end ) <span class="string">'语文'</span> from grade group by name;</span><br></pre></td></tr></table></figure>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"> Field | Type | Null | Key | Default | Extra |</span><br><span class="line">+--------+-------------+------+-----+---------+----------------+</span><br><span class="line">| id | int(11) | NO | PRI | NULL | auto_increment |</span><br><span class="line">| name | varchar(20) | YES | | NULL | |</span><br><span class="line">| course | varchar(10) | YES | | NULL | |</span><br><span class="line">| score | int(3) | YES | | NULL |</span><br></pre></td></tr></table></figure>
<p>列变行</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">select name,<span class="string">'math'</span> course,math_score as score from grade2 union select name,<span class="string">'english'</span> course,en_score as score from grade2 union select name,<span class="string">'chinese'</span> course,cn_score as score from grade2 order by name,course;</span><br></pre></td></tr></table></figure>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">------------+-------------+------+-----+---------+----------------+</span><br><span class="line">| Field | Type | Null | Key | Default | Extra |</span><br><span class="line">+------------+-------------+------+-----+---------+----------------+</span><br><span class="line">| id | int(11) | NO | PRI | NULL | auto_increment |</span><br><span class="line">| name | varchar(10) | YES | | NULL | |</span><br><span class="line">| math_score | int(3) | YES | | NULL | |</span><br><span class="line">| en_score | int(3) | YES | | NULL | |</span><br><span class="line">| cn_score | int(3) | YES | | NULL | |</span><br><span class="line">+------------+-------------+------+-----+---------+----------------+</span><br></pre></td></tr></table></figure>
</div>
<div class="article-info article-info-index">
<p class="article-more-link">
<a class="article-more-a" href="/2018/08/30/py11_mysql03/">展开全文 >></a>
</p>
<div class="clearfix"></div>
</div>
</div>
</article>
<aside class="wrap-side-operation">
<div class="mod-side-operation">
<div class="jump-container" id="js-jump-container" style="display:none;">
<a href="javascript:void(0)" class="mod-side-operation__jump-to-top">
<i class="icon-font icon-back"></i>
</a>
<div id="js-jump-plan-container" class="jump-plan-container" style="top: -11px;">
<i class="icon-font icon-plane jump-plane"></i>
</div>
</div>
</div>
</aside>
<article id="post-py11_mysql02" class="article article-type-post article-index" itemscope itemprop="blogPost">
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2018/08/30/py11_mysql02/">MYSQL--数据操作语言</a>
</h1>
<a href="/2018/08/30/py11_mysql02/" class="archive-article-date">
<time datetime="2018-08-30T00:39:51.780Z" itemprop="datePublished"><i class="icon-calendar icon"></i>2018-08-30</time>
</a>
</header>
<div class="article-entry" itemprop="articleBody">
<h2 id="1)数据类型间的默认转换"><a href="#1)数据类型间的默认转换" class="headerlink" title="1)数据类型间的默认转换"></a>1)数据类型间的默认转换</h2><p>字符串=>日期型<br>如果字段数据类型定义为日期型,例如:date(YYYY-MM-DD),如果我们队该字段插入数据时,采用’2018-08-23’的字符串格式进行数据插入,mysql会自动将字符串转为日期型。</p>
<p>字符串=>数值型<br>当字段数据类型为字符型时,但具体值为数值,我们使用该字段的值与数值进行运算,那么得到的结果为数值型。<br>同时,如果字段类型定义为数值型,我们可以将数值型字符串插入到指定的字段中。<br>如果,字段类型为字符型,其中由字符与数字混合组成(只要不是纯数字构成的字符串),此时与数值进行算数运算,那么该字段内容被转换为0来进行处理。</p>
<h2 id="2)运算符"><a href="#2)运算符" class="headerlink" title="2)运算符"></a>2)运算符</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">算数运算符</span><br><span class="line">比较运算符</span><br><span class="line">逻辑运算符</span><br><span class="line">位运算符</span><br></pre></td></tr></table></figure>
<h2 id="3)插入数据"><a href="#3)插入数据" class="headerlink" title="3)插入数据"></a>3)插入数据</h2><p>标准格式:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">insert into 表名(字段1,字段2,字段3,....) values(字段1值,字段2值,字段3值,...)</span><br><span class="line">insert into persons(pno,pname,age,hire_date,salary) values(<span class="string">'10001'</span>,<span class="string">'tom'</span>,21,<span class="string">'2018-03-12'</span>,3459);</span><br></pre></td></tr></table></figure>
<p>通常,我们在声明表名的时候将需要插入数据的字段名一起进行声明,有利于提高插入的效率。同时如果有些字段值为null,可以在实际插入的时候省略。另外,字段值只需要与字段名称对应即可,不需要按照表中实际字段的位置进行填写。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">insert into 表名 values(字段1值,字段2值,字段3值,...)</span><br></pre></td></tr></table></figure>
<p>这种写法,需要我们在values的后面,按照表中各个字段的实际顺序进行一一对应的填写。同时,如果某个字段的值为null,也必须将null值进行标明。</p>
<p>插入多条语句:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">insert into 表名(字段名) values(字段值1,...,字段值n),(字段值1,...,字段值n)</span><br></pre></td></tr></table></figure>
<p>一次性插入多条数据</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">insert into person_bak(pno,pname,age,hire_date,salary) select * from persons;</span><br></pre></td></tr></table></figure>
<p>将指定表的查询结果,作为要插入到目标表中的数据,进行插入。要求是目标表结构与指定表的结构相同。</p>
<h2 id="4)、更新数据"><a href="#4)、更新数据" class="headerlink" title="4)、更新数据"></a>4)、更新数据</h2><p>格式:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">update 表名 <span class="built_in">set</span> 字段1=新值,字段2=新值,...,字段n=新值 <span class="built_in">where</span> 条件</span><br></pre></td></tr></table></figure>
<p>进行更新操作时,一定要进行条件的约束,如果该语句没有条件子句的话,就表示对全表进行更新操作。</p>
<h2 id="5)、删除数据"><a href="#5)、删除数据" class="headerlink" title="5)、删除数据"></a>5)、删除数据</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">delete from 表名 <span class="built_in">where</span> 条件</span><br></pre></td></tr></table></figure>
<p>进行删除操作时,一定要添加条件,如果没有条件子句,就意味着删除全表内容。</p>
<h2 id="6)、数据操作的撤销和提交"><a href="#6)、数据操作的撤销和提交" class="headerlink" title="6)、数据操作的撤销和提交"></a>6)、数据操作的撤销和提交</h2><p>mysql数据库默认模式为自动提交:autocommit=on<br>我们如果需要对mysql进行撤销和提交操作,需要先将默认的自动提交模式取消,设置为off<br>即:set autocommit=off<br>当我们进行增删改操作时,如果执行rollback操作,那么该操作就会被撤销;<br>如果执行commit操作,那么该操作就会持久化到数据库中。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">commit</span><br><span class="line">rollback</span><br></pre></td></tr></table></figure>
</div>
<div class="article-info article-info-index">
<p class="article-more-link">
<a class="article-more-a" href="/2018/08/30/py11_mysql02/">展开全文 >></a>
</p>
<div class="clearfix"></div>
</div>
</div>
</article>
<aside class="wrap-side-operation">
<div class="mod-side-operation">
<div class="jump-container" id="js-jump-container" style="display:none;">
<a href="javascript:void(0)" class="mod-side-operation__jump-to-top">
<i class="icon-font icon-back"></i>
</a>
<div id="js-jump-plan-container" class="jump-plan-container" style="top: -11px;">
<i class="icon-font icon-plane jump-plane"></i>
</div>
</div>
</div>
</aside>
<article id="post-py11_mysql01" class="article article-type-post article-index" itemscope itemprop="blogPost">
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2018/08/27/py11_mysql01/">MYSQL--数据定义语言</a>
</h1>
<a href="/2018/08/27/py11_mysql01/" class="archive-article-date">
<time datetime="2018-08-27T13:31:26.140Z" itemprop="datePublished"><i class="icon-calendar icon"></i>2018-08-27</time>
</a>
</header>
<div class="article-entry" itemprop="articleBody">
<h2 id="一、数据库语言"><a href="#一、数据库语言" class="headerlink" title="一、数据库语言"></a>一、数据库语言</h2><h3 id="1、分类"><a href="#1、分类" class="headerlink" title="1、分类"></a>1、分类</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">数据库定义语言 DDL(create database/table,drop database/table,alter database/table)</span><br><span class="line">数据库操纵语言 DML(insert、delete、update、select)</span><br><span class="line">数据库控制语言 DCL(grant、revoke)</span><br></pre></td></tr></table></figure>
<p>注意,数据库定义语言和数据库控制语言都是不可撤销的。而数据库操作语言是可以撤销 。</p>
<h3 id="2、数据定义语言"><a href="#2、数据定义语言" class="headerlink" title="2、数据定义语言"></a>2、数据定义语言</h3><p>1)、创建数据库</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">create database 数据库名;</span><br></pre></td></tr></table></figure>
<p>2)、删除数据库</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">drop database 数据库名;</span><br></pre></td></tr></table></figure>
<p>3)、打开数据库</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">use 数据库名;</span><br></pre></td></tr></table></figure>
<p>4)创建数据表</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">create table 表名(列名 数据类型(长度),列名 数据类型(长度),......) default charset=utf8</span><br></pre></td></tr></table></figure>
<p>注意,如果创建表的时候,没有指定字符集,那么该表将默认采用其所在数据库的字符集。通常我们建议指定缺省的字符集。<br>5)、查看数据表的字符集情况</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">show variables like <span class="string">'character%'</span>;</span><br></pre></td></tr></table></figure>
<p>6)查看表结构</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">desc 表名</span><br></pre></td></tr></table></figure>
<p>7)、数据库字段类型<br>字符类型:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">char(长度):定长的字符类型,一旦声明了长度,即使定义的字段数据不能达到最大长度,也会按照最大长度进行所占字节的分配。取值范围:0-255</span><br><span class="line">varchar(长度): 变长的字符类型,声明长度后,如果字段数据的长度达不到最大长度,则会根据实际长度给出数据的长度。取值范围:0-2^16-1</span><br><span class="line">数值类型:</span><br><span class="line">int(长度):给出指定的字段数据长度。如果没有明确指定长度,则采用默认长度11。所占字节4个字节。</span><br></pre></td></tr></table></figure>
<p>日期类型:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">date:日期类型的字段,在定义时不需要指定长度。格式为YYYY-MM-DD</span><br><span class="line">time:日期类型的字段,格式HH:MM:SS</span><br><span class="line">datatime:日期类型的字段,格式YYYY-MM-DD HH:MM:SS</span><br></pre></td></tr></table></figure>
<p>布尔型:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">bool:布尔类型的字段,在定义时采用0代表假,1代表真。</span><br></pre></td></tr></table></figure>
<p>实际在mysql数据库中,bool类型等同于数值型的tinyint(1)</p>
<p>8)、修改表结构</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">alter table 表名 [add/modify/change/drop] 字段名 [数据类型]</span><br></pre></td></tr></table></figure>
<p>添加字段:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">alter table tablename add 字段名 数据类型;</span><br></pre></td></tr></table></figure>
<p>添加字段,位于表中的最后一列。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">alter table tablename drop 字段名</span><br></pre></td></tr></table></figure>
<p>删除一列,如果列中有数据,则全部被删除且不可恢复。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">alter talbe tablename modify 字段名 数据类型</span><br></pre></td></tr></table></figure>
<p>修改指定字段的数据类型及长度。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">alter table tablename change oldcolumn newcolumn 数据类型</span><br></pre></td></tr></table></figure>
<p>修改指定字段的名字</p>
</div>
<div class="article-info article-info-index">
<p class="article-more-link">
<a class="article-more-a" href="/2018/08/27/py11_mysql01/">展开全文 >></a>
</p>
<div class="clearfix"></div>
</div>
</div>
</article>
<aside class="wrap-side-operation">
<div class="mod-side-operation">
<div class="jump-container" id="js-jump-container" style="display:none;">
<a href="javascript:void(0)" class="mod-side-operation__jump-to-top">
<i class="icon-font icon-back"></i>
</a>
<div id="js-jump-plan-container" class="jump-plan-container" style="top: -11px;">
<i class="icon-font icon-plane jump-plane"></i>
</div>
</div>
</div>
</aside>
<article id="post-py10_re" class="article article-type-post article-index" itemscope itemprop="blogPost">
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2018/08/24/py10_re/">正则表达式</a>
</h1>
<a href="/2018/08/24/py10_re/" class="archive-article-date">
<time datetime="2018-08-24T00:34:01.594Z" itemprop="datePublished"><i class="icon-calendar icon"></i>2018-08-24</time>
</a>
</header>
<div class="article-entry" itemprop="articleBody">
<h2 id="1、正则表达式的概念"><a href="#1、正则表达式的概念" class="headerlink" title="1、正则表达式的概念"></a>1、正则表达式的概念</h2><p>正则表达式就是使用一些特定的表达式,来表示符合其规范的字符串。</p>
<h2 id="2、常用操作符"><a href="#2、常用操作符" class="headerlink" title="2、常用操作符"></a>2、常用操作符</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">^:^ab,代表着必须是ab开头,[^ab]代表不能是a或b开头</span><br><span class="line">$:表示字符串结尾,放在正则表达式的结尾</span><br><span class="line">[]:代表了值域的范围,例如:[0-9][a-z]</span><br><span class="line">{}:代表了字符出现的次数,例如:{n}代表了出现n次,{n,m}代表出现了n到m次</span><br><span class="line">*:代表了字符出现0-n次</span><br><span class="line">+:代表了字符出现1-n次</span><br><span class="line">?:代表了字符出现0-1次</span><br></pre></td></tr></table></figure>
<h2 id="3、常用方法"><a href="#3、常用方法" class="headerlink" title="3、常用方法"></a>3、常用方法</h2><p>1)search():会在指定的字符串中查找,是否有匹配正则表达式的内容</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">函数格式:search(pattern, str)</span><br><span class="line">参数说明:</span><br><span class="line">pattern:正则表达式</span><br><span class="line">str:字符串</span><br><span class="line">返回值:match对象,可以通过match.group(0)返回匹配正则表达式的内容</span><br></pre></td></tr></table></figure>
<p>2)match():会从字符串的开始进行匹配</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">函数格式:match(pattern, str) </span><br><span class="line">返回值:match对象</span><br></pre></td></tr></table></figure>
<p>3)findall():会从指定的字符串中,匹配所有满足正则表达式的内容</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">函数格式:findall(pattern,str)</span><br><span class="line">返回值:返回所有匹配的内容,以列表形式。</span><br></pre></td></tr></table></figure>
<p>4)split():根据字符串匹配正则表达式的情况来切分</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">函数格式:split(pattern, str, maxsplit)</span><br><span class="line">maxsplit:最大切分次数,剩余部分将作为一个整体输出</span><br><span class="line">返回值:将切分后的字符串,以列表形式返回</span><br></pre></td></tr></table></figure>
<p>5)finditer():根据字符串匹配正则表达式,返回一个迭代对象,其中的每一个对象都是match对象</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">函数格式:finditer(pattern,str)</span><br><span class="line">返回值:返回迭代对象,其中每个对象都是match类型</span><br></pre></td></tr></table></figure>
<p>6)sub():根据正则表达式,将指定的字符串内容替换</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">函数格式:sub(pattern, repl, string, count)</span><br><span class="line">参数说明:</span><br><span class="line">repl:替换匹配字符串的字符串</span><br><span class="line">count:匹配的最大次数</span><br><span class="line">返回值:返回替换后的字符串</span><br></pre></td></tr></table></figure>
<p>7)compile():生成正则表达式对象</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">函数格式:compile(pattern)</span><br><span class="line">返回值:返回一个正则表达式对象</span><br></pre></td></tr></table></figure>
<h2 id="4、match对象"><a href="#4、match对象" class="headerlink" title="4、match对象"></a>4、match对象</h2><p>1)match对象属性</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">string:待匹配的字符串</span><br><span class="line">pos:匹配文本的开始位置</span><br><span class="line">endpos:匹配文件的结束位置</span><br><span class="line">re:正则表达式</span><br></pre></td></tr></table></figure>
<p>2)match方法</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">group(0):获得匹配后的字符串</span><br><span class="line">start():返回文本开始的位置</span><br><span class="line">end():返回文本结束的位置</span><br><span class="line">span():返回文本开始,结束的位置,以元组的形式返回</span><br></pre></td></tr></table></figure>
</div>
<div class="article-info article-info-index">
<p class="article-more-link">
<a class="article-more-a" href="/2018/08/24/py10_re/">展开全文 >></a>
</p>
<div class="clearfix"></div>
</div>
</div>
</article>
<aside class="wrap-side-operation">
<div class="mod-side-operation">
<div class="jump-container" id="js-jump-container" style="display:none;">
<a href="javascript:void(0)" class="mod-side-operation__jump-to-top">
<i class="icon-font icon-back"></i>
</a>
<div id="js-jump-plan-container" class="jump-plan-container" style="top: -11px;">
<i class="icon-font icon-plane jump-plane"></i>
</div>
</div>
</div>
</aside>
<article id="post-py10_bs" class="article article-type-post article-index" itemscope itemprop="blogPost">
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2018/08/24/py10_bs/">beautiful soup库</a>
</h1>
<a href="/2018/08/24/py10_bs/" class="archive-article-date">
<time datetime="2018-08-24T00:31:14.081Z" itemprop="datePublished"><i class="icon-calendar icon"></i>2018-08-24</time>
</a>
</header>
<div class="article-entry" itemprop="articleBody">
<h2 id="1、常用格式"><a href="#1、常用格式" class="headerlink" title="1、常用格式"></a>1、常用格式</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">from bs4 import BeautifulSoup</span><br><span class="line"></span><br><span class="line">soup = BeautifulSoup(content, <span class="string">'html.parser'</span>)</span><br></pre></td></tr></table></figure>
<p>参数说明:<br>content:使用requests或其他方式,发出请求后获取到的服务器响应内容,通常应该为HTML格式。<br>html.parserHTML4格式解析器</p>
<h2 id="2、常用的属性"><a href="#2、常用的属性" class="headerlink" title="2、常用的属性"></a>2、常用的属性</h2><p>标签自身属性:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">tag:标签,例如soup.tag可以将指定的标签以及内部的内容返回</span><br><span class="line">name:标签名,例如:soup.tag.name返回指定标签的名字</span><br><span class="line">attrs:标签属性,在HTML中一个标签可以有0到N个标签,因此标签属性为字典类型,例如:soup.tag.attrs[<span class="string">'class'</span>]</span><br><span class="line">string:标签内的文本内容,例如:soup.tag.string</span><br><span class="line">标签树的属性:</span><br><span class="line">contents例如:soup.tag.contents,将指定的标签名内所有的标签都以列表形式返回。</span><br><span class="line">children:例如:soup.tag.children,将指定的标签中所有的子标签内容,都以迭代器形式返回,进行遍历查询。</span><br><span class="line">descendants:例如:soup.tag.descendants,将指定的标签中所有的子标签、孙标签都以迭代器形式返回,进行遍历查询。</span><br><span class="line">注意:BeautifulSoup对象,作为标签树的根节点,即HTML节点</span><br></pre></td></tr></table></figure>
<h2 id="3、常用方法"><a href="#3、常用方法" class="headerlink" title="3、常用方法"></a>3、常用方法</h2><p>1)函数格式:soup.find(name,attrs)<br>参数说明:<br>name:标签名<br>attrs:标签中的属性值(属性=‘值’)<br>返回值:返回查找到第一个符合条件的标签以及内部元素</p>
<p>2)函数格式:soup.find_all(name,attrs)<br>函数参数与上面find()相同<br>返回值:返回符合条件的所有的标签,以列表形式返回。</p>
<h2 id="4、bs4的遍历模式"><a href="#4、bs4的遍历模式" class="headerlink" title="4、bs4的遍历模式"></a>4、bs4的遍历模式</h2><p>在BeautifulSoup中,有三种遍历模式:<br>1)下行遍历</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">children、descendants、contents</span><br><span class="line">find()、find_all()</span><br></pre></td></tr></table></figure>
<p>2)上行遍历</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">parent、parents</span><br><span class="line">find_parent()、find_parents()</span><br></pre></td></tr></table></figure>
<p>3)平行遍历</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">next_sibling、next_siblings</span><br><span class="line">previous_sibling、previous_siblings</span><br><span class="line">find_next_sibling()、find_next_siblings()</span><br><span class="line">find_previous_siblings()、find_previous_sibling()</span><br></pre></td></tr></table></figure>
</div>
<div class="article-info article-info-index">
<p class="article-more-link">
<a class="article-more-a" href="/2018/08/24/py10_bs/">展开全文 >></a>
</p>
<div class="clearfix"></div>
</div>
</div>
</article>
<aside class="wrap-side-operation">
<div class="mod-side-operation">
<div class="jump-container" id="js-jump-container" style="display:none;">
<a href="javascript:void(0)" class="mod-side-operation__jump-to-top">
<i class="icon-font icon-back"></i>
</a>
<div id="js-jump-plan-container" class="jump-plan-container" style="top: -11px;">
<i class="icon-font icon-plane jump-plane"></i>
</div>
</div>
</div>
</aside>
<article id="post-py10_html" class="article article-type-post article-index" itemscope itemprop="blogPost">
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2018/08/20/py10_html/">网络爬虫--HTML网页结构</a>
</h1>
<a href="/2018/08/20/py10_html/" class="archive-article-date">
<time datetime="2018-08-20T03:45:07.266Z" itemprop="datePublished"><i class="icon-calendar icon"></i>2018-08-20</time>
</a>
</header>
<div class="article-entry" itemprop="articleBody">
<h2 id="1、HTML基本构成"><a href="#1、HTML基本构成" class="headerlink" title="1、HTML基本构成"></a>1、HTML基本构成</h2><p>HTML有三个标签来构成基本结构:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><html>:作为HTML文件的根标签,所有的页面中的标签和内容都要在HTML标签的范围内。</span><br><span class="line"><head>:作为HTML文件的头部标签,相关页面的信息、编码、引导外部的CSS文件和JS文件,都需要放置在head标签中。</span><br><span class="line"><body>:body标签中的内容,就是我们爬虫需要解析的主体。所有需要在页面上展现的内容,都会放置在该标签中。</span><br></pre></td></tr></table></figure>
<h2 id="2、常见的HTML标签"><a href="#2、常见的HTML标签" class="headerlink" title="2、常见的HTML标签"></a>2、常见的HTML标签</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br></pre></td><td class="code"><pre><span class="line">1)h1...h6:标题标签,用来显示标题,h1最大,h6最小。</span><br><span class="line"></span><br><span class="line">2)<p>:段落标签。用来对文本内容进行分段。</span><br><span class="line"></span><br><span class="line">3)<a>:链接标签。用来跳转到指定的网址。</span><br><span class="line"><a target=<span class="string">''</span> href=<span class="string">'URL'</span>>链接地址</a></span><br><span class="line">其中参数target,_self:在自身的窗口重新打开指定的网址</span><br><span class="line">_blank:在一个新窗口中打开指定的网址</span><br><span class="line"></span><br><span class="line">4)<img>:图片标签。用来载入指定位置的图片,通常可以接收的图片类型:JPG、png、gif、bmp</span><br><span class="line"><img src=<span class="string">""</span> alt=<span class="string">""</span>></span><br><span class="line">其中:src:指定图片的具体位置</span><br><span class="line"> alt:其中的内容,作为图片无法载入时,显示的内容。</span><br><span class="line"></span><br><span class="line">5)表格标签:table、tr、th、td</span><br><span class="line"><table>:表格标签,所有表格中的行和单元格内容都必须放置在内部。</span><br><span class="line"><tr>:表格行,代表表格一行</span><br><span class="line"><th>:表格头,代表表格的标题行</span><br><span class="line"><td>:表格单元格,代表表格中的每个单元内容</span><br><span class="line"></span><br><span class="line">6)列表</span><br><span class="line">有序列表:</span><br><span class="line"><ol></span><br><span class="line"> <li></li></span><br><span class="line"></ol></span><br><span class="line"></span><br><span class="line">无序列表:</span><br><span class="line"><ul></span><br><span class="line"> <li></li></span><br><span class="line"></ul></span><br><span class="line"></span><br><span class="line">自定义列表:</span><br><span class="line"><dl></span><br><span class="line"> <dt></span><br><span class="line"> <dd></dd></span><br><span class="line"> </dt></span><br><span class="line"></dl></span><br><span class="line"></span><br><span class="line">7)div与span</span><br><span class="line">div:块级元素,用来实现页面布局。自身没有任何效果</span><br><span class="line">span:内联元素,用做文本容器。</span><br><span class="line"></span><br><span class="line">8)表单</span><br><span class="line"><form name=<span class="string">"表单名"</span> action=<span class="string">"URL"</span> method=<span class="string">"get/post"</span>></span><br><span class="line">默认情况,如果没有声明method属性,缺省值为get</span><br><span class="line"><input <span class="built_in">type</span>=<span class="string">""</span>></span><br><span class="line">输入标签,<span class="built_in">type</span>属性:</span><br><span class="line">text:文本框</span><br><span class="line">password:密码框</span><br><span class="line">checkbox:复选框</span><br><span class="line">radio:单选框</span><br><span class="line">submit:提交按钮</span><br><span class="line">reset:重置按钮</span><br><span class="line">button:按钮</span><br><span class="line">file:文件上传</span><br><span class="line"><textarea cols=<span class="string">"列数"</span> rows=<span class="string">"行数"</span>>:文件区标签</span><br></pre></td></tr></table></figure>
</div>
<div class="article-info article-info-index">
<p class="article-more-link">
<a class="article-more-a" href="/2018/08/20/py10_html/">展开全文 >></a>
</p>
<div class="clearfix"></div>
</div>
</div>
</article>
<aside class="wrap-side-operation">
<div class="mod-side-operation">
<div class="jump-container" id="js-jump-container" style="display:none;">
<a href="javascript:void(0)" class="mod-side-operation__jump-to-top">
<i class="icon-font icon-back"></i>
</a>
<div id="js-jump-plan-container" class="jump-plan-container" style="top: -11px;">
<i class="icon-font icon-plane jump-plane"></i>
</div>
</div>
</div>
</aside>
<article id="post-py10_requests" class="article article-type-post article-index" itemscope itemprop="blogPost">
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2018/08/20/py10_requests/">网络爬虫--requests库</a>
</h1>
<a href="/2018/08/20/py10_requests/" class="archive-article-date">
<time datetime="2018-08-20T03:43:11.521Z" itemprop="datePublished"><i class="icon-calendar icon"></i>2018-08-20</time>
</a>
</header>
<div class="article-entry" itemprop="articleBody">
<h2 id="1、常用方法"><a href="#1、常用方法" class="headerlink" title="1、常用方法"></a>1、常用方法</h2><p>1)函数格式:requests.get(url,[param], **kvw)<br>参数说明:<br>url:指定爬取的网络地址<br>param:需要传递的参数,参数格式:字典或字节流<br>返回值:response对象<br>属性:<br>status_code:状态码<br>headers:头信息<br>text:抓取到的页面内容<br>encoding:页面的编码格式(从headers获取到)<br>apparent_encoding:页面的编码格式(从网页内容中获取到)<br>content:二进制形式的信息<br>注意:text属性返回的页面信息,是根据encoding来显示的。所以我们在使用requests抓取页面信息时,将encoding属性进行设置,通常设为utf-8。</p>
<p>get()函数代表了发出一个request请求,而requests.get()表示返回一个response对象</p>
<p>2)</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">requests.request(<span class="string">'GET'</span>,url, **kvw)</span><br><span class="line">requests.request(<span class="string">'HEAD'</span>,url, **kvw)</span><br><span class="line">requests.request(<span class="string">'POST'</span>,url, **kvw)</span><br><span class="line">requests.request(<span class="string">'PUT'</span>,url, **kvw)</span><br><span class="line">requests.request(<span class="string">'PATCH'</span>,url, **kvw)</span><br><span class="line">requests.request(<span class="string">'DELETE'</span>,url, **kvw)</span><br></pre></td></tr></table></figure>
<p>**kvw:控制访问的参数,为可选项<br>params:字典或字节流,作为参数添加到url中(get方法使用)<br>data:字典、字节流或文件对象(post方法使用)<br>json:JSON格式数据,作为request的内容<br>headers:字典,HTTP头信息<br>cookies:字典或cookie jar,存在于request的cookie中<br>auth:元组,支持HTTP认证<br>files:字典类型,传输文件<br>timeout:设定超时时间,秒为单位<br>stream:True/False,默认为True。获取内容立即下载。<br>cert:本地SSL整数路径<br>verfiy:True/False,默认为True。认证SSL开关<br>allow_redirects:True/False,默认为True,重定向开发</p>
</div>
<div class="article-info article-info-index">
<p class="article-more-link">
<a class="article-more-a" href="/2018/08/20/py10_requests/">展开全文 >></a>
</p>
<div class="clearfix"></div>
</div>
</div>
</article>
<aside class="wrap-side-operation">
<div class="mod-side-operation">
<div class="jump-container" id="js-jump-container" style="display:none;">
<a href="javascript:void(0)" class="mod-side-operation__jump-to-top">
<i class="icon-font icon-back"></i>
</a>
<div id="js-jump-plan-container" class="jump-plan-container" style="top: -11px;">
<i class="icon-font icon-plane jump-plane"></i>
</div>
</div>
</div>
</aside>
<article id="post-py10_urllib" class="article article-type-post article-index" itemscope itemprop="blogPost">
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2018/08/20/py10_urllib/">网络爬虫--urllib库</a>
</h1>
<a href="/2018/08/20/py10_urllib/" class="archive-article-date">
<time datetime="2018-08-20T03:40:10.524Z" itemprop="datePublished"><i class="icon-calendar icon"></i>2018-08-20</time>
</a>
</header>
<div class="article-entry" itemprop="articleBody">
<h2 id="1、urllib库的基本使用"><a href="#1、urllib库的基本使用" class="headerlink" title="1、urllib库的基本使用"></a>1、urllib库的基本使用</h2><p>import urllib.request<br>函数格式:urllib.request.openurl(url, data, timeout)<br>参数说明:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">url:指定的请求网址</span><br><span class="line">data:请求时提交给服务器端的数据,如果在openurl中使用了data参数,那么提交方式为post,默认情况下为get。</span><br><span class="line">timeout:指定连接url的超时时间,单位为秒。</span><br><span class="line">response = urllib.request.openurl()函数返回一个HTTPResponse对象</span><br><span class="line">我们可以使用response对象中的相关方法:</span><br><span class="line"><span class="built_in">read</span>()读取响应体中的内容</span><br><span class="line">status/getcode()返回响应码</span><br><span class="line">reason 返回响应信息的内容</span><br><span class="line">info()返回响应头信息</span><br><span class="line">geturl()返回请求的url地址</span><br></pre></td></tr></table></figure>
<h2 id="2、Request请求对象"><a href="#2、Request请求对象" class="headerlink" title="2、Request请求对象"></a>2、Request请求对象</h2><p>req = urllib.request.Request(url,data,headers,method)<br>参数说明:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">url:指定的请求网址</span><br><span class="line">data:请求时提交给服务器端的数据,如果在openurl中使用了data参数,那么提交方式为post,默认情况下为get。</span><br><span class="line">headers:请求对象的头信息,用来将一个爬虫伪装成一个普通的浏览器请求,主要设置user-agent</span><br><span class="line">method:请求的方式,默认为get,可以设置为get或post</span><br></pre></td></tr></table></figure>
<h2 id="3、urllib-error"><a href="#3、urllib-error" class="headerlink" title="3、urllib.error"></a>3、urllib.error</h2><p>在urllib库中有三个error对象<br>HTTPError:HTTP访问异常<br>URLError:url地址异常<br>ContentTooShortError:文件大小异常<br>注意,HTTPError是URLError的子类。<br>HTTPError,只有一个属性reason<br>URLError,有code,reason,headers三个属性。</p>
<h2 id="4、urllib-robotparser"><a href="#4、urllib-robotparser" class="headerlink" title="4、urllib.robotparser"></a>4、urllib.robotparser</h2><p>作用:用来解析指定网站的robots.txt文件。用来分析哪些内容是允许抓取,哪些内容是不允许的。</p>
</div>
<div class="article-info article-info-index">
<p class="article-more-link">
<a class="article-more-a" href="/2018/08/20/py10_urllib/">展开全文 >></a>
</p>
<div class="clearfix"></div>
</div>
</div>
</article>
<aside class="wrap-side-operation">
<div class="mod-side-operation">
<div class="jump-container" id="js-jump-container" style="display:none;">
<a href="javascript:void(0)" class="mod-side-operation__jump-to-top">
<i class="icon-font icon-back"></i>
</a>
<div id="js-jump-plan-container" class="jump-plan-container" style="top: -11px;">
<i class="icon-font icon-plane jump-plane"></i>
</div>
</div>
</div>
</aside>
<article id="post-py10_crawler" class="article article-type-post article-index" itemscope itemprop="blogPost">
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2018/08/15/py10_crawler/">网络爬虫--网络原理</a>
</h1>
<a href="/2018/08/15/py10_crawler/" class="archive-article-date">
<time datetime="2018-08-15T00:30:13.674Z" itemprop="datePublished"><i class="icon-calendar icon"></i>2018-08-15</time>
</a>
</header>
<div class="article-entry" itemprop="articleBody">
<h2 id="1、HTTP与HTTPS的区别"><a href="#1、HTTP与HTTPS的区别" class="headerlink" title="1、HTTP与HTTPS的区别"></a>1、HTTP与HTTPS的区别</h2><p>HTTP:我们称为超文本传输协议,主要用来实现从网络传输超文本到本地浏览器,实现高效且准确的超文本传送。目前HTTP的版本为1.1<br>HTTPS:我们认为就是以安全为目标的HTTP通道,即在HTTP协议的基础上加入了SSL层,简称HTTPS。<br>SSL的主要作用分为以下两部分:<br>第一、为HTTP传输文件提供安全的传输通道<br>第二、确认网站的真实性,通过HTTPS访问的网站都需要获取到CA认证。</p>
<h2 id="2、网络七层模型(了解)"><a href="#2、网络七层模型(了解)" class="headerlink" title="2、网络七层模型(了解)"></a>2、网络七层模型(了解)</h2><p>从下到上的顺序</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">物理层</span><br><span class="line">数据链路层</span><br><span class="line">网络层</span><br><span class="line">传输层(TCP、UDP)</span><br><span class="line">会话层</span><br><span class="line">表示层</span><br><span class="line">应用层(HTTP FTP TFTP SMTP SNMP DNS TELNET HTTPS POP3 DHCP)</span><br></pre></td></tr></table></figure>
<h2 id="3、HTTP的请求机制"><a href="#3、HTTP的请求机制" class="headerlink" title="3、HTTP的请求机制"></a>3、HTTP的请求机制</h2><p>第一,由客户端(浏览器)发出请求<br>第二,通过网络传输,到指定的服务器地址<br>第三,服务器接收相关请求,并进行解析<br>第四,服务器将最终的结果响应回客户端<br>第五,客户端接收到服务器响应后,通过浏览器解析,最终将内容进行展现</p>
<h2 id="4、客户端访问服务器,发出请求,有四部分构成"><a href="#4、客户端访问服务器,发出请求,有四部分构成" class="headerlink" title="4、客户端访问服务器,发出请求,有四部分构成"></a>4、客户端访问服务器,发出请求,有四部分构成</h2><p>第一,请求方法(request method),默认为get方式。只有在表单提交和文件上传时为post方法。<br>第二,请求网址(request url),即在浏览器中输入的网路地址。<br>第三,请求头(request header),用来标识为一个浏览器正常的访问<br>第四,请求体(request body),用来传输到服务器端的相关数据</p>
<h2 id="5、请求方法中get与post的区别"><a href="#5、请求方法中get与post的区别" class="headerlink" title="5、请求方法中get与post的区别"></a>5、请求方法中get与post的区别</h2><p>第一、使用get方式提交请求时,相关数据会作为url的参数被一起进行提交,我们可以直接在地址栏中观察到相关数据。而采用post方式请求的url不会包含这些数据,而是直接通过表单提交到服务器。<br>第二、get方式提交请求,对于提交的数据大小不能大于1024字节,而post方式提交数据,没有大小的限制。<br>总之,如果提交的信息比较敏感或者字节较大时,需要使用post方式;如果只是普通的请求使用get方式。</p>
</div>
<div class="article-info article-info-index">
<p class="article-more-link">
<a class="article-more-a" href="/2018/08/15/py10_crawler/">展开全文 >></a>
</p>
<div class="clearfix"></div>
</div>
</div>
</article>
<aside class="wrap-side-operation">
<div class="mod-side-operation">
<div class="jump-container" id="js-jump-container" style="display:none;">
<a href="javascript:void(0)" class="mod-side-operation__jump-to-top">
<i class="icon-font icon-back"></i>
</a>
<div id="js-jump-plan-container" class="jump-plan-container" style="top: -11px;">
<i class="icon-font icon-plane jump-plane"></i>
</div>
</div>
</div>
</aside>
<article id="post-py09_class" class="article article-type-post article-index" itemscope itemprop="blogPost">
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2018/08/07/py09_class/">面向对象</a>
</h1>
<a href="/2018/08/07/py09_class/" class="archive-article-date">
<time datetime="2018-08-07T00:42:38.035Z" itemprop="datePublished"><i class="icon-calendar icon"></i>2018-08-07</time>
</a>
</header>
<div class="article-entry" itemprop="articleBody">
<h2 id="15、面向对象"><a href="#15、面向对象" class="headerlink" title="15、面向对象"></a>15、面向对象</h2><h3 id="一、面向对象的概念"><a href="#一、面向对象的概念" class="headerlink" title="一、面向对象的概念"></a>一、面向对象的概念</h3><p>1、类:指具有相同属性或行为的一组事物。<br> 对象:是指类的具体化。<br>类与对象的关系<br>类是一组对象的抽象表示,而对象是类的具体化表现。<br>2、类的语法结构</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">class 类名:</span><br><span class="line"> 变量声明语句</span><br><span class="line"> 执行语句</span><br><span class="line"> def func(self):</span><br><span class="line"> 执行语句</span><br></pre></td></tr></table></figure>
<p>其中,类名首字母要求大写(约定俗成),遵守Python命名规则,不能以数字开头,通常我们都是字母开头。<br>注意:<br>1)如果类中声明了函数,其函数的参数,必须有一个默认的参数为self,self代表了该类的实例化对象。<br>2)如果在类中声明了变量,且该变量位于函数体之外,这个变量我们成为类变量,类变量是公共的。类变量的调用可以直接使用类名进行调用,比如:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">class Dog: <span class="comment"># 定义一个类,类名Animal</span></span><br><span class="line"> color = <span class="string">'灰色'</span></span><br><span class="line"> leg_num = 4</span><br><span class="line"> weight = 20</span><br><span class="line"> width = 150</span><br><span class="line"></span><br><span class="line"> def wangwang(self):</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'wangwangwangwang'</span>)</span><br><span class="line"></span><br><span class="line"> def eat(self):</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'一顿饭20块钱'</span>)</span><br><span class="line"></span><br><span class="line"> def run(self):</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'非常快'</span>)</span><br><span class="line"></span><br><span class="line">husky = Dog() <span class="comment"># 将类实例化成对象,对象为dog</span></span><br><span class="line">husky.run()</span><br><span class="line">Dog.color</span><br></pre></td></tr></table></figure>
<p>类变量,作为公共的变量,不管类实例化多少个对象,都只实例一份类变量。而且类变量会在对象实例化之前载入内容,一旦改变了类变量中的内容,所有对象中调用这个类变量的值都会随之改变。</p>
<p>3)在类实例化对象时,会将其定义的属性和行为,生成一份副本给具体的实例化对象。对象与对象之间,他们的属性和行为是不相互干扰的。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">class Dog: <span class="comment"># 定义一个类,类名Animal</span></span><br><span class="line"> color = <span class="string">'灰色'</span></span><br><span class="line"> def __init__(self, num):</span><br><span class="line"> self.num = num</span><br><span class="line"> def getNum(self):</span><br><span class="line"> <span class="built_in">print</span>(self.num)</span><br><span class="line"></span><br><span class="line">husky = Dog(5) <span class="comment"># 将类实例化成对象,对象为dog</span></span><br><span class="line">samoye = Dog(3)</span><br><span class="line">husky.getNum()</span><br><span class="line">samoye.getNum()</span><br></pre></td></tr></table></figure>
<p>我们在实例化Dog类时,生成两个对象husky、samoye,这两对象在实例化的过程中会生成两套成员变量和函数,他们的相互不干扰的。我们可以观察上面的代码,发现num变量属于成员变量,即husky和samoye各有持有相同的成员变量,但是修改num的值,husky为5,而samoye为3。结果表明他们的成员变量只能归各自的对象所拥有,并进行改变。对象与对象之间不会相互影响。<br>4)使用构造函数,来初始化成员变量</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">class Person:</span><br><span class="line"> def __init__(self): <span class="comment"># 构造函数,在实例化对象时被默认调用,用来给对象的成员变量赋值</span></span><br><span class="line"> self.name = <span class="string">'tom'</span></span><br><span class="line"> self.age = 21</span><br><span class="line"> self.tel = <span class="string">'1350000000'</span></span><br><span class="line"> self.address = <span class="string">'北京'</span></span><br><span class="line"> self.sex = <span class="string">'男'</span></span><br><span class="line"> </span><br><span class="line"> def setName(self, name):</span><br><span class="line"> self.name = name</span><br><span class="line"> </span><br><span class="line"> def getName(self):</span><br><span class="line"> <span class="built_in">return</span> self.name</span><br><span class="line">p1 = Person()</span><br><span class="line">p1.name</span><br></pre></td></tr></table></figure>
<p>使用<strong>init</strong>()函数,用来初始化成员变量。对象在实例化时,会默认的调用<strong>init</strong>()函数,同时将成员变量进行初始化。同时,在构造函数中,使用self.变量名进行初始化的成员变量,都是公有的。即在类外可以通过实例化的对象调用。</p>
<h2 id="类变量与成员变量的区别"><a href="#类变量与成员变量的区别" class="headerlink" title="类变量与成员变量的区别"></a>类变量与成员变量的区别</h2><p>1、类变量是声明在类中,位于函数之外声明的变量。这些变量时公共的,即在类外使用类名.类变量的方式进行调用。我们一旦修改类变量的值,所有调用类变量的内容均发生改变。<br>2、成员变量,是声明在类中的构造函数中,通过self.变量来进行声明赋值的。这些成员变量是公有的,即在类外可以通过对象名.成员变量的方式进行调用。所有的对象都有自己的成员变量,也就意味着每个对象的成员变量都是独立的,不会相互干扰。<br>3、类变量是该类所有实例化对象所公有的,它会早于对象实例化之前被载入内容中。<br>成员变量都是跟随对象实例化的过程中,被声明出来的。它是伴随着对象的产生而产生,消亡而消亡的。<br>4、成员变量和方法,默认情况下都是公有的。也就是说在类外可以直接使用对象进行调用。我们可以通过为成员变量设置双下划线,将其标识为私有的成员变量,例如:self.__name = ‘tom’。私有的成员变量只能在类内进行直接使用,类外必须通过相关方法进行间接调用。</p>
<h2 id="Python中对象创建的流程"><a href="#Python中对象创建的流程" class="headerlink" title="Python中对象创建的流程"></a>Python中对象创建的流程</h2><p>1、Python创建一个对象,首先要调用<strong>new</strong>方法,用来创建并返回一个对象。通常,Python中不需要我们直接显示调用,它会默认调用object.<strong>new</strong>()方法<br>2、然后,调用<strong>init</strong>方法,对该对象进行初始化。</p>
<h3 id="析构函数:"><a href="#析构函数:" class="headerlink" title="析构函数:"></a>析构函数:</h3><p>1、析构函数与构造函数一样,都是Python中特殊的函数。<br>2、析构函数如果用户没有定义的话,Python会提供一个默认的析构函数<br>3、析构函数<strong>del</strong>(self),作用用来释放掉对象所占用的内存空间,在Python回收对象空间之前自动被执行。<br>4、通常在析构函数中,主要是将对象中占用大量资源的变量进行手动的释放,便于后续Python解释器去回收这些内存空间。</p>
<h2 id="16、继承"><a href="#16、继承" class="headerlink" title="16、继承"></a>16、继承</h2><h3 id="1)Python中能够实现单继承与多继承。"><a href="#1)Python中能够实现单继承与多继承。" class="headerlink" title="1)Python中能够实现单继承与多继承。"></a>1)Python中能够实现单继承与多继承。</h3><p>单继承:就是子类只有一个直接父类。<br>多继承:子类有两个及两个以上的直接父类。</p>
<h3 id="2)子类继承父类,子类可以继承父类的相关特征。"><a href="#2)子类继承父类,子类可以继承父类的相关特征。" class="headerlink" title="2)子类继承父类,子类可以继承父类的相关特征。"></a>2)子类继承父类,子类可以继承父类的相关特征。</h3><p>子类继承了父类的方法,如果在多继承情况下,父类出现同名函数,那么子类继承该函数时,根据继承的顺序进行调用。</p>
<h3 id="3)super-函数,它指代了当前类的父类。"><a href="#3)super-函数,它指代了当前类的父类。" class="headerlink" title="3)super()函数,它指代了当前类的父类。"></a>3)super()函数,它指代了当前类的父类。</h3><p>我们可以在子类中调用super函数,用来初始化父类。但是使用super()调用父类的构造函数时,只能对多继承中的第一个父类生效。</p>
<h3 id="4-抽象与继承的区别与关系"><a href="#4-抽象与继承的区别与关系" class="headerlink" title="4)抽象与继承的区别与关系"></a>4)抽象与继承的区别与关系</h3><p>抽象:指对同一类别事物的相似部分进行抽取。抽象我们认为是对具体化对象的相关行为和属性的泛化过程。<br>继承:Python中我们通常认为类就是一个抽象的内容。类本身并不能直接执行,需要通过继承,进行对象的实例化,进而获得具体的对象本身,才能执行相关的功能。<br>也就是说继承其实是抽象的具体化过程。</p>
<h3 id="5)多继承中,当一个子类继承多个父类时,我们需要如下声明:"><a href="#5)多继承中,当一个子类继承多个父类时,我们需要如下声明:" class="headerlink" title="5)多继承中,当一个子类继承多个父类时,我们需要如下声明:"></a>5)多继承中,当一个子类继承多个父类时,我们需要如下声明:</h3><p>class SubClass(A,B):<br>其中,A、B是SubClass的父类。那么,如果我们分为两种个情况:<br>第一,子类中没有显式的定义<strong>init</strong>(),那么在实例化子类时调用其父类的构造函数。如果有多个类,都定义了<strong>init()函数,那么它会调用第一个具有</strong>init__()函数的父类。<br>第二,子类中显式的定义理论<strong>init_(),那么实例化子类时不再调用父类的构造函数。此时,如果我们要调用父类的构造函数,有两种方法。<br>1)在子类的构造函数中,显式的调用对应父类的构造函数,例如:<br>A.</strong>init__()<br>2)采用super()函数,super().<strong>init</strong>()或者super(子类,self).<strong>init</strong>()<br>但是如果遇到其多个父类,他们的构造函数同名时,我们根据他们在MRO中的顺序,分别调用他们,例如:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">class SubClass(B, A):</span><br><span class="line"> def __init__(self):</span><br><span class="line"> super().__init__() <span class="comment"># 此处调用了父类B</span></span><br><span class="line"> super(B, self).__init__() <span class="comment">#此处调用了父类C</span></span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'我是子类'</span>)</span><br></pre></td></tr></table></figure>
<p>注意,在这里不要看到super就认为是父类,但是在多继承时,实际上super指的是MRO中的下一个类。</p>
<h3 id="6)封装"><a href="#6)封装" class="headerlink" title="6)封装"></a>6)封装</h3><p>在Python中,我们针对其内部细节进行封装。通常我们将属性定义为私有类型,意味着在类外无法直接访问。可以通过相关的方法对其进行调用。<br>私有的成员变量和方法,都需要在类内进行定义。所有在类外实现的定义都是公有的,代码如下:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">class A:</span><br><span class="line"> __N = <span class="string">'hello'</span> <span class="comment"># 此处是一个私有的类变量</span></span><br><span class="line"></span><br><span class="line"> def __init__(self):</span><br><span class="line"> self.__name = <span class="string">'tom'</span></span><br><span class="line"></span><br><span class="line"> def __method(self):</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'我是私有函数'</span>)</span><br><span class="line"></span><br><span class="line"> def show(self):</span><br><span class="line"> self.__method()</span><br><span class="line"> <span class="built_in">print</span>(self.__name)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">a = A()</span><br><span class="line">A.__age = 10 <span class="comment"># 此处的__age是一个公有的类变量</span></span><br><span class="line"><span class="built_in">print</span>(A.__age)</span><br></pre></td></tr></table></figure>
<h3 id="8)property方法"><a href="#8)property方法" class="headerlink" title="8)property方法"></a>8)property方法</h3><p>在Python中,我们可以使用property来修饰指定的函数,被修饰后的函数,在类外可以通过对象调用(类似调用变量)</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">class Person:</span><br><span class="line"> def __init__(self, name, height, weight):</span><br><span class="line"> self.__name = name</span><br><span class="line"> self.__height = height</span><br><span class="line"> self.__weight = weight</span><br><span class="line"> </span><br><span class="line"> @property</span><br><span class="line"> def bmi(self):</span><br><span class="line"> <span class="built_in">return</span> self.__weight / self.__height**2</span><br><span class="line"></span><br><span class="line">p = Person()</span><br><span class="line"><span class="built_in">print</span>(p.bmi) <span class="comment"># 此处调用的bmi是Person类中的函数。</span></span><br></pre></td></tr></table></figure>
<h3 id="原理:"><a href="#原理:" class="headerlink" title="原理:"></a>原理:</h3><p>当类被载入时,首先会载入类的名称和被property修饰的名字到类的命名空间中;然后在类对象进行实例化时,Python解析器会查找是否存在property修饰的名字,如果存在,就不在实例化对象是为其分配内存空间。</p>
<h3 id="9)classmethod方法"><a href="#9)classmethod方法" class="headerlink" title="9)classmethod方法"></a>9)classmethod方法</h3><p>在Python中,我们通常使用classmethod用来修饰一个方法,这个方法就被称为类方法,类方法通常用来操作类变量。类方法和类变量一样,都需要通过类名来调用。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">class Goods:</span><br><span class="line"> __discount = 0.8</span><br><span class="line"></span><br><span class="line"> def __init__(self, name, price):</span><br><span class="line"> self.__name = name</span><br><span class="line"> self.__price = price</span><br><span class="line"></span><br><span class="line"> @classmethod</span><br><span class="line"> def change_discount(cls, new_discount): <span class="comment">#此处传递的默认参数不是对象参数self,而是类参数cls</span></span><br><span class="line"> cls.__discount = new_discount</span><br><span class="line"> </span><br><span class="line"> @classmethod</span><br><span class="line"> def get_discount(cls):</span><br><span class="line"> <span class="built_in">return</span> cls.__discount</span><br><span class="line"></span><br><span class="line">goods = Goods(<span class="string">'apple'</span>, 6)</span><br><span class="line"><span class="built_in">print</span>(Goods.get_discount())</span><br><span class="line">Goods.change_discount(0.9)</span><br><span class="line"><span class="built_in">print</span>(Goods.get_discount())</span><br></pre></td></tr></table></figure>
<h3 id="10-staticmethod方法"><a href="#10-staticmethod方法" class="headerlink" title="10)staticmethod方法"></a>10)staticmethod方法</h3><p>在Python中,我们使用staticmethod来修饰函数,该函数被称为静态方法,首先,静态方法不需要使用对象参数或类参数作为默认参数。其次,静态方法通常只能调用类变量,而不可以使用成员变量。最后,在类外进行调用时,可以使用类名来调用。</p>
<h3 id="实例方法、类方法与静态方法的区别"><a href="#实例方法、类方法与静态方法的区别" class="headerlink" title="实例方法、类方法与静态方法的区别"></a>实例方法、类方法与静态方法的区别</h3><p>实例方法:第一个参数必须是实例对象(self),通过它来传递实例的属性和方法,只能由实例对象来调用。<br>类方法:使用装饰器@classmethod,第一个参数必须是类对象(cls),通过它来传递类的属性和方法。可以通过实例对象或类对象来调用,通常使用类对象调用。<br>静态方法:使用装饰器@staticmethod,没有默认参数(self和cls),但是方法体中不能使用类或实例对象的任何属性和方法。可以通过实例对象或类对象进行调用。</p>
<p>1、类方法和静态方法都可以通过对象实例或者类名来调用。<br>2、类方法主要针对的是类,可以通过继承和重新定义<br>3、静态方法不能被继承,无法被重写,可以被认为是全局函数。静态方法在使用时完全不会用到对象实例本身。静态方法逻辑上属于类,但是不会涉及到类中的属性和方法的操作。</p>
<h3 id="11)方法重写"><a href="#11)方法重写" class="headerlink" title="11)方法重写"></a>11)方法重写</h3><p>概念:当子类继承父类时,子类会继承父类所有的公有方法。如果在子类中重写定义一个与父类中同名的方法,我们成为方法的重写(覆盖)。方法重写只需要名字相同即可,与方法的参数个数、顺序无关</p>
<h3 id="12)多态与鸭子类型"><a href="#12)多态与鸭子类型" class="headerlink" title="12)多态与鸭子类型"></a>12)多态与鸭子类型</h3><p>多态:多态一般都是通过继承来实现的,也就是根据不同的对象形态来进行区分。我们在Python中,使用多态时,意味着在编码时变量并不知道所引用的对象具体内容,只有在程序运行时相关对象被实例化后,才能够确定。<br>鸭子类型:在Python中,因为其自身特性并没有对多态进行明确的规定,可以创建一个功能相似,但与原对象无关的、全新对象,来实现程序的松耦合。<br>我们通常在开发中,采用接口的方式来实现。<br>我们认为在一组功能相似,但没有继承关系的对象中,采用接口方式。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">class Payment:</span><br><span class="line"> def payment(self, money):</span><br><span class="line"> pass</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">class Weixinpay(Payment):</span><br><span class="line"> def payment(self, money):</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'微信支付了{0}元'</span>.format(money))</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">class Alipay(Payment):</span><br><span class="line"> def payment(self, money):</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'支付宝支付了{0}元'</span>.format(money))</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">class My(Payment):</span><br><span class="line"> def payment(self, money):</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'支付了{0}元'</span>.format(money))</span><br></pre></td></tr></table></figure>
<p>此例,我们可以看到:<br>第一,通过继承,实现了多态,即三种支付方式不同的形态<br>第二,我们观察到,微信支付、支付宝、个人支付,三者之间没有任何继承关系,但是都具有相同的支付功能,我们可以认为这种形式就是鸭子类型<br>第三,因为三种支付方式,分别继承了接口类Payment,都重新了相关的支付方法payment()</p>
<h3 id="运算符重载"><a href="#运算符重载" class="headerlink" title="运算符重载"></a>运算符重载</h3><p>1、<strong>getitem</strong>:索引迭代<br>在Python,可迭代化对象在使用循环迭代时,都会默认的调用<strong>iter</strong>,如果没有next()方法,会调用<strong>getitem</strong>方法。</p>
</div>
<div class="article-info article-info-index">
<p class="article-more-link">
<a class="article-more-a" href="/2018/08/07/py09_class/">展开全文 >></a>
</p>
<div class="clearfix"></div>
</div>
</div>
</article>
<aside class="wrap-side-operation">
<div class="mod-side-operation">
<div class="jump-container" id="js-jump-container" style="display:none;">
<a href="javascript:void(0)" class="mod-side-operation__jump-to-top">
<i class="icon-font icon-back"></i>
</a>
<div id="js-jump-plan-container" class="jump-plan-container" style="top: -11px;">
<i class="icon-font icon-plane jump-plane"></i>
</div>
</div>
</div>
</aside>
<nav id="page-nav">
<span class="page-number current">1</span><a class="page-number" href="/page/2/">2</a><a class="page-number" href="/page/3/">3</a><a class="extend next" rel="next" href="/page/2/">Next »</a>
</nav>
</div>
</div>
</div>
<footer id="footer">
<div class="outer">
<div id="footer-info">
<div class="footer-left">
© 2018 ip520011
</div>
<div class="footer-right">
<a href="http://hexo.io/" target="_blank">Hexo</a> Theme <a href="https://github.com/litten/hexo-theme-yilia" target="_blank">Yilia</a> by Litten
</div>
</div>
</div>
</footer>
</div>
<script>
var yiliaConfig = {
mathjax: false,
isHome: true,
isPost: false,