-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsearch.xml
More file actions
3826 lines (3529 loc) · 463 KB
/
search.xml
File metadata and controls
3826 lines (3529 loc) · 463 KB
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
<?xml version="1.0" encoding="utf-8"?>
<search>
<entry>
<title>python中if-name-main-作用</title>
<url>/2021/06/02/python%E4%B8%ADif-name-main-%E4%BD%9C%E7%94%A8/</url>
<content><![CDATA[<figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">func</span><span class="params">()</span>:</span></span><br><span class="line"> print(<span class="string">'ok'</span>)</span><br><span class="line"> </span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">'__main__'</span>:</span><br><span class="line"> func()</span><br></pre></td></tr></table></figure>
<p>这种形式的代码,相信你已经见过很多,在脚本的末尾,出现一个if条件判断,这个if条件判断的作用是什么呢,<code>__name__</code>事先并没有定义,为什么可以直接使用呢,它从哪里来? 回答这些问题,必须先了解<strong>模块属性</strong></p>
<h3 id="1-模块属性"><a href="#1-模块属性" class="headerlink" title="1.模块属性"></a>1.<strong>模块属性</strong></h3><p>一个python脚本(以.py 结尾的文件)就是一个模块,模块自身有若干属性,其中比较常用的是如下两个</p>
<ol>
<li><code>__name__</code> 模块的名称</li>
<li><code>__file__</code> 脚本的完整文件路径</li>
</ol>
<p>在任意一个python脚本里,你都可以输出这两个属性(注意Jupyter notebook等交互式IDE可能会报__file__错,直接在终端或vscode运行就好了)</p>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line">print(__name__)</span><br><span class="line">print(__file__)</span><br></pre></td></tr></table></figure>
<p>得到结果</p>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line">/Users/wangyaowei/Desktop/test.py</span><br><span class="line">__main__</span><br></pre></td></tr></table></figure>
<p><code>__name__</code>的值是<code>__main__</code> ,这表示模块的名称是<code>__main__</code><br><code>__file__</code>是文件的完整路径</p>
<p>虽然弄清楚了<code>__name__</code>是怎么一回事,但也带来了新的疑问,明明<code>__name__</code>就等于<code>__main__</code>,为何还要做if条件判断呢?显然是存在<code>__name__</code>不等于<code>__main__</code>的情况。</p>
<h3 id="2-直接执行与其他模块引入"><a href="#2-直接执行与其他模块引入" class="headerlink" title="2.直接执行与其他模块引入"></a>2.<strong>直接执行与其他模块引入</strong></h3><p>简单的功能,我们可以在一个python脚本里完成,但复杂的功能,我们会写多个python 脚本,比如下面的例子里,有两个脚本,一个是main.py ,做为整个程序的启动脚本,utils.py 提供一些辅助函数,供main.py使用</p>
<p>(1) utils.py</p>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">safe_division</span><span class="params">(a, b)</span>:</span></span><br><span class="line"> <span class="keyword">if</span> b == <span class="number">0</span>:</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">None</span></span><br><span class="line"> <span class="keyword">return</span> a/b</span><br><span class="line"></span><br><span class="line">print(<span class="string">"utils 模块里的__name__ 值为:"</span>, __name__)</span><br></pre></td></tr></table></figure>
<p>(2) main.py</p>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">from</span> utils <span class="keyword">import</span> safe_division</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">func</span><span class="params">()</span>:</span></span><br><span class="line"> value = input(<span class="string">"输入两个整数,中间用空格分开:"</span>)</span><br><span class="line"> arrs = value.split()</span><br><span class="line"> a = int(arrs[<span class="number">0</span>])</span><br><span class="line"> b = int(arrs[<span class="number">1</span>])</span><br><span class="line"></span><br><span class="line"> result = safe_division(a, b)</span><br><span class="line"> print(result)</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">'__main__'</span>:</span><br><span class="line"> func()</span><br></pre></td></tr></table></figure>
<p>接下来,通过两步实验,来理解<code>__name__</code>在不同场景下的取值情况。</p>
<p>第一步,先来执行utils.py文件</p>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line">python utils.py</span><br><span class="line"><span class="meta">>>> </span>utils 模块里的__name__ 值为: __main__</span><br></pre></td></tr></table></figure>
<p>第二步,执行main.py</p>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line">python main.py</span><br><span class="line">>>>utils 模块里的__name__ 值为: utils</span><br><span class="line">>>>输入两个整数,中间用空格分开:<span class="number">5</span> <span class="number">2</span></span><br><span class="line">>>><span class="number">2.5</span></span><br></pre></td></tr></table></figure>
<p>这里有一个现象,你必须理解其背后的原因,我们明明执行的main.py脚本,但是utils.py脚本里的代码也被执行了,这是因为在main.py脚本里引入了utils.py 这个模块,被引入的脚本里的代码会在引入时执行。</p>
<p>当utils.py 被其他脚本引入时,它的<code>__name__</code>就不等于<code>__main__</code>, 而是等于utils,恰好是文件名称去掉.py 剩余的部分。</p>
<p>经过上面的实验,我们可以得出两个结论</p>
<ol>
<li>当脚本被直接执行时,模块属性<code>__name__</code>等于<code>__main__</code></li>
<li>当脚本被其他模块引入时,模块属性<code>__name__</code>等于脚本名称去掉.py 后剩余的部分</li>
</ol>
<h3 id="3-终极目的—测试模块里函数"><a href="#3-终极目的—测试模块里函数" class="headerlink" title="3.终极目的—测试模块里函数"></a>3.<strong>终极目的—测试模块里函数</strong></h3><p>由于一个脚本被引入时,自身的代码会被执行,因此我们在每个脚本里都写上一段<code>if __name__ == '__main__'</code>如果你希望一些代码只有在脚本被直接执行时才执行,那么就把这些代码放入到if 语句块中,最常见的情形就是测试代码,下面我对utils.py 进行修改</p>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">safe_division</span><span class="params">(a, b)</span>:</span></span><br><span class="line"> <span class="keyword">if</span> b == <span class="number">0</span>:</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">None</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> a/b</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">'__main__'</span>:</span><br><span class="line"> print(safe_division(<span class="number">10</span>, <span class="number">5</span>) == <span class="number">2</span>)</span><br><span class="line"> print(safe_division(<span class="number">10</span>, <span class="number">0</span>) == <span class="literal">None</span>)</span><br></pre></td></tr></table></figure>
<p>我们写完一个函数后,不免要写一些测试的代码,而这些测试的代码我们不希望他们在utils.py被引入时执行,只有当我们主动执行utils.py 进行测试才执行这些测试代码</p>
]]></content>
<categories>
<category>Python语法</category>
</categories>
</entry>
<entry>
<title>Python编程从入门到实践</title>
<url>/2020/11/26/Python%E7%BC%96%E7%A8%8B%E4%BB%8E%E5%85%A5%E9%97%A8%E5%88%B0%E5%AE%9E%E8%B7%B5/</url>
<content><![CDATA[<p>书籍笔记</p>
<a id="more"></a>
<h1 id="第一章:积累"><a href="#第一章:积累" class="headerlink" title="第一章:积累"></a>第一章:积累</h1><ul>
<li>int(a),float(a),eval(a)将字符串a编程数字格式</li>
<li>python会将非空的字符串理解为True</li>
<li>break跳出整个循环,continue跳出当前循环继续下一次循环</li>
</ul>
<h1 id="第二章:变量和简单数据类型"><a href="#第二章:变量和简单数据类型" class="headerlink" title="第二章:变量和简单数据类型"></a>第二章:变量和简单数据类型</h1><ul>
<li><p>变量能以字母和下划线开头,但<strong>不能以数字开头</strong>。</p>
</li>
<li><p>大写字符串首字母用.title()</p>
</li>
</ul>
<blockquote>
<p>笔记中”>>>”代表程序输出,以后不再赘述</p>
</blockquote>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line">name = <span class="string">'yaowei wang'</span></span><br><span class="line">name.title()</span><br><span class="line"><span class="meta">>>> </span><span class="string">'Yaowei Wang'</span></span><br></pre></td></tr></table></figure>
<ul>
<li>字符串中写入变量</li>
</ul>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line">name = <span class="string">'yaowei wang'</span></span><br><span class="line">print(<span class="string">f'Hello, <span class="subst">{name.title()}</span>'</span>)</span><br><span class="line"><span class="meta">>>> </span>Hello, Yaowei Wang</span><br></pre></td></tr></table></figure>
<ul>
<li>去除字符串开头或者结尾的空白</li>
</ul>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line">favorite_language = <span class="string">' python '</span></span><br><span class="line">favorite_language.strip()</span><br><span class="line"><span class="meta">>>> </span><span class="string">'python'</span></span><br><span class="line">favorite_language.lstrip()</span><br><span class="line"><span class="meta">>>> </span><span class="string">'python '</span></span><br><span class="line">favorite_language.rstrip()</span><br><span class="line"><span class="meta">>>> </span><span class="string">' python'</span></span><br><span class="line">favorite_language</span><br><span class="line"><span class="meta">>>> </span><span class="string">' python '</span> <span class="comment">#此操作不会改变原始字符串</span></span><br></pre></td></tr></table></figure>
<ul>
<li>同时给多个变量赋值</li>
</ul>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line">a,b,c = <span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span></span><br></pre></td></tr></table></figure>
<h1 id="第三章:列表"><a href="#第三章:列表" class="headerlink" title="第三章:列表"></a>第三章:列表</h1><ul>
<li>列表中的索引从0开始</li>
</ul>
<h2 id="修改,添加,删除列表中的元素"><a href="#修改,添加,删除列表中的元素" class="headerlink" title="修改,添加,删除列表中的元素"></a>修改,添加,删除列表中的元素</h2><h3 id="修改列表元素"><a href="#修改列表元素" class="headerlink" title="修改列表元素"></a>修改列表元素</h3><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">motor = [<span class="string">'honda'</span>,<span class="string">'yamaha'</span>,<span class="string">'suzuki'</span>]</span><br><span class="line">motor[<span class="number">0</span>] = <span class="string">'wulinghongguang'</span></span><br><span class="line">motor</span><br><span class="line"><span class="meta">>>> </span>[<span class="string">'wulinghongguang'</span>, <span class="string">'yamaha'</span>, <span class="string">'suzuki'</span>]</span><br></pre></td></tr></table></figure>
<h3 id="添加元素"><a href="#添加元素" class="headerlink" title="添加元素"></a>添加元素</h3><ul>
<li>append在列表最结尾添加元素</li>
</ul>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line">motor = [<span class="string">'honda'</span>,<span class="string">'yamaha'</span>,<span class="string">'suzuki'</span>]</span><br><span class="line">motor.insert(<span class="number">0</span>,<span class="string">'wuling'</span>) <span class="comment">#必须添加插入的位置</span></span><br><span class="line">motor</span><br></pre></td></tr></table></figure>
<h3 id="删除列表中的元素"><a href="#删除列表中的元素" class="headerlink" title="删除列表中的元素"></a>删除列表中的元素</h3><ul>
<li>del语句</li>
</ul>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line">motor = [<span class="string">'honda'</span>,<span class="string">'yamaha'</span>,<span class="string">'suzuki'</span>]</span><br><span class="line"><span class="keyword">del</span> motor[<span class="number">0</span>:<span class="number">2</span>] <span class="comment">#切片和索引删除都可以</span></span><br><span class="line">motor </span><br><span class="line"><span class="meta">>>> </span>[<span class="string">'suzuki'</span>]</span><br></pre></td></tr></table></figure>
<ul>
<li>.pop()弹出</li>
</ul>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line">motor = [<span class="string">'honda'</span>,<span class="string">'yamaha'</span>,<span class="string">'suzuki'</span>]</span><br><span class="line"><span class="keyword">while</span> motor:</span><br><span class="line"> print(motor.pop())</span><br><span class="line"><span class="meta">>>> </span>suzuki</span><br><span class="line">yamaha</span><br><span class="line">honda</span><br><span class="line">---------------</span><br><span class="line">motor = [<span class="string">'honda'</span>,<span class="string">'yamaha'</span>,<span class="string">'suzuki'</span>]</span><br><span class="line">a = motor.pop(<span class="number">1</span>) <span class="comment">#弹出特定位置的元素</span></span><br><span class="line">print(a)</span><br><span class="line"><span class="meta">>>> </span>yamaha</span><br></pre></td></tr></table></figure>
<ul>
<li>.remove()根据元素的值删除</li>
</ul>
<h2 id="组织列表"><a href="#组织列表" class="headerlink" title="组织列表"></a>组织列表</h2><ul>
<li>.sort()永久排序,sorted临时排序</li>
</ul>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line">alpha = [<span class="string">'a'</span>,<span class="string">'c'</span>,<span class="string">'b'</span>,<span class="string">'d'</span>]</span><br><span class="line">sorted(alpha)</span><br><span class="line"><span class="meta">>>> </span>[<span class="string">'a'</span>, <span class="string">'b'</span>, <span class="string">'c'</span>, <span class="string">'d'</span>]</span><br><span class="line">alpha</span><br><span class="line"><span class="meta">>>> </span>[<span class="string">'a'</span>,<span class="string">'c'</span>,<span class="string">'b'</span>,<span class="string">'d'</span>]</span><br><span class="line">alpha.sort() <span class="comment">#永久变了</span></span><br></pre></td></tr></table></figure>
<ul>
<li><p>.reverse()永久反转列表</p>
</li>
<li><p>list(range(1,5)) #左闭右开区间,数字列表</p>
</li>
</ul>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line">num = list(range(<span class="number">1</span>,<span class="number">9</span>,<span class="number">2</span>))</span><br><span class="line">sum(num)</span><br><span class="line">min(num)</span><br><span class="line">max(num)</span><br><span class="line">squares = [values**<span class="number">2</span> <span class="keyword">for</span> value <span class="keyword">in</span> range(<span class="number">1</span>,<span class="number">11</span>)]</span><br><span class="line"><span class="meta">>>> </span>[<span class="number">1</span>, <span class="number">4</span>, <span class="number">9</span>, <span class="number">16</span>, <span class="number">25</span>, <span class="number">36</span>, <span class="number">49</span>, <span class="number">64</span>, <span class="number">81</span>, <span class="number">100</span>]</span><br></pre></td></tr></table></figure>
<ul>
<li>列表复制</li>
</ul>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line">my_food = [<span class="string">'carote'</span>,<span class="string">'tomato'</span>,<span class="string">'humberger'</span>]</span><br><span class="line">friend_food = my_food[:] <span class="comment">#复制成一个新的列表,不会改变原列表的值</span></span><br><span class="line">my_food.append(<span class="string">'apple'</span>)</span><br><span class="line">friend_food.append(<span class="string">'banana'</span>)</span><br><span class="line">my_food</span><br><span class="line"><span class="meta">>>> </span>[<span class="string">'carote'</span>, <span class="string">'tomato'</span>, <span class="string">'humberger'</span>, <span class="string">'apple'</span>]</span><br><span class="line">friend_food</span><br><span class="line"><span class="meta">>>> </span>[<span class="string">'carote'</span>, <span class="string">'tomato'</span>, <span class="string">'humberger'</span>, <span class="string">'banana'</span>]</span><br></pre></td></tr></table></figure>
<ul>
<li>元祖中的元素不可以更改</li>
</ul>
<h1 id="第五章:if语句"><a href="#第五章:if语句" class="headerlink" title="第五章:if语句"></a>第五章:if语句</h1><ul>
<li>.upper()将字符串所有的字母都大写 .lower()所有小写</li>
</ul>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line">age = <span class="number">12</span></span><br><span class="line"><span class="keyword">if</span> age < <span class="number">4</span>:</span><br><span class="line"> price = <span class="number">0</span></span><br><span class="line"><span class="keyword">elif</span> age < <span class="number">18</span>:</span><br><span class="line"> price = <span class="number">25</span></span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line"> price = <span class="number">40</span></span><br><span class="line">print(<span class="string">f'Your ad,ission cost is <span class="subst">{price}</span>'</span>)</span><br><span class="line"><span class="comment"># 如果有一个条件符合,就跳过其他条件</span></span><br></pre></td></tr></table></figure>
<h1 id="第六章:字典"><a href="#第六章:字典" class="headerlink" title="第六章:字典"></a>第六章:字典</h1><p>{}中的键值对</p>
<ul>
<li>添加//修改/删除键值对</li>
</ul>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line">alien = {<span class="string">'color'</span>:<span class="string">'green'</span>, <span class="string">'points'</span>:<span class="number">5</span>}</span><br><span class="line">alien[<span class="string">'x_position'</span>] = <span class="number">3.0</span></span><br><span class="line">alien</span><br><span class="line"><span class="meta">>>> </span>{<span class="string">'color'</span>: <span class="string">'green'</span>, <span class="string">'points'</span>: <span class="number">5</span>, <span class="string">'x_position'</span>: <span class="number">3.0</span>}</span><br><span class="line">alien[<span class="string">'points'</span>] = <span class="number">4</span></span><br><span class="line">alien</span><br><span class="line"><span class="meta">>>> </span>{<span class="string">'color'</span>: <span class="string">'green'</span>, <span class="string">'points'</span>: <span class="number">4</span>, <span class="string">'x_position'</span>: <span class="number">3.0</span>}</span><br><span class="line"><span class="keyword">del</span> alien[<span class="string">'points'</span>]</span><br><span class="line">alien</span><br><span class="line"><span class="meta">>>> </span>{<span class="string">'color'</span>: <span class="string">'green'</span>, <span class="string">'x_position'</span>: <span class="number">3.0</span>}</span><br></pre></td></tr></table></figure>
<ul>
<li>访问字典中的值 .get()</li>
</ul>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line">alien.get(<span class="string">'color'</span>)</span><br><span class="line"><span class="meta">>>> </span><span class="string">'green'</span></span><br></pre></td></tr></table></figure>
<ul>
<li><p>分别打印键值对/键/值 alien.items()/ alien.keys()/ alien.values()</p>
</li>
<li><p>set(列表名),用来去除重复元素</p>
</li>
</ul>
<h1 id="第七章:用户输入和while循环"><a href="#第七章:用户输入和while循环" class="headerlink" title="第七章:用户输入和while循环"></a>第七章:用户输入和while循环</h1><ul>
<li><p>age = input(‘How old are you?’)</p>
</li>
<li><p>int(age),将字符型的变量改成数字类型</p>
</li>
<li><p>如果后面的条件满足while,循环就会一直进行下去</p>
</li>
<li><p>break永久退出循环,continue退出当前循环</p>
</li>
</ul>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">while</span> <span class="literal">True</span>:</span><br><span class="line"> city = input(<span class="string">'Please input city name:'</span>)</span><br><span class="line"> <span class="keyword">if</span> city == <span class="string">'quit'</span>:</span><br><span class="line"> <span class="keyword">break</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> print(<span class="string">f'I would like to go <span class="subst">{city}</span>'</span>)</span><br><span class="line"> </span><br><span class="line">current_number = <span class="number">0</span></span><br><span class="line"><span class="keyword">while</span> current_number <= <span class="number">10</span>:</span><br><span class="line"> <span class="keyword">if</span> current_number % <span class="number">2</span> == <span class="number">0</span>:</span><br><span class="line"> <span class="keyword">continue</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> print(current_number)</span><br><span class="line"> current_number += <span class="number">1</span></span><br></pre></td></tr></table></figure>
<h1 id="第八章:函数"><a href="#第八章:函数" class="headerlink" title="第八章:函数"></a>第八章:函数</h1><ul>
<li>有默认参数的形参一定要放在函数定义的最后面</li>
</ul>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 这样修改函数不会影响原来的列表</span></span><br><span class="line">name = [<span class="string">'Tom'</span>,<span class="string">'Bob'</span>]</span><br><span class="line">a = name[:]</span><br><span class="line"></span><br><span class="line"><span class="comment"># 调用函数时若不给形参指定参数则会使用默认值,注意有默认值的参数一定要放在后面</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">my_pet</span><span class="params">(pet_name,animal_type=<span class="string">'dog'</span>)</span>:</span></span><br><span class="line"> print(<span class="string">f'I have a <span class="subst">{animal_type.title()}</span>'</span>)</span><br><span class="line"> print(<span class="string">f'<span class="subst">{animal_type.title()}</span>\'s name is <span class="subst">{pet_name}</span>'</span>)</span><br><span class="line">my_pet(pet_name=<span class="string">'Wangcai'</span>)</span><br><span class="line">print(<span class="string">'-'</span>*<span class="number">20</span>)</span><br><span class="line">my_pet(animal_type=<span class="string">'cat'</span>,pet_name=<span class="string">'Wangcai'</span>)</span><br><span class="line"><span class="comment"># 按照顺序赋予变量可以省略形参数的名字</span></span><br><span class="line">print(<span class="string">'-'</span>*<span class="number">20</span>)</span><br><span class="line">my_pet(<span class="string">'wangcai'</span>,<span class="string">'pig'</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 让参数变成可选的,用None作为占位符号</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">get_formatted_name</span><span class="params">(first_name,last_name,middle_name=None)</span>:</span></span><br><span class="line"> <span class="keyword">if</span> middle_name:</span><br><span class="line"> full_name = <span class="string">f"<span class="subst">{first_name}</span> <span class="subst">{middle_name}</span> <span class="subst">{last_name}</span>"</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> full_name = <span class="string">f"<span class="subst">{first_name}</span> <span class="subst">{last_name}</span>"</span></span><br><span class="line"> <span class="keyword">return</span> full_name.title()</span><br><span class="line"></span><br><span class="line">student = get_formatted_name(<span class="string">'yaowei'</span>,<span class="string">'wang'</span>)</span><br><span class="line">print(student)</span><br><span class="line">print(<span class="string">'-'</span>*<span class="number">20</span>)</span><br><span class="line">s = get_formatted_name(<span class="string">'yaowei'</span>,<span class="string">'wang'</span>,<span class="string">'ss'</span>)</span><br><span class="line">print(s)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 传入任意数量的实参数,*args,*让python创建了一个名为args的空元组,所有接收到的变量都会被封存到里面。</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">make_pizza</span><span class="params">(*args)</span>:</span></span><br><span class="line"> print(<span class="string">'The following toppings are required in a pizza'</span>)</span><br><span class="line"> <span class="keyword">for</span> topping <span class="keyword">in</span> toppings:</span><br><span class="line"> print(<span class="string">f"- <span class="subst">{topping}</span>"</span>)</span><br><span class="line">components = [<span class="string">'mushroom'</span>,<span class="string">'tomato'</span>,<span class="string">'cheese'</span>]</span><br><span class="line">make_pizza(components)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 传入任意数量的实参数,还有实参在一起;*arg表示任意数量的实际参数</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">make_pizza</span><span class="params">(size,*args)</span>:</span></span><br><span class="line"> print(<span class="string">f'The pizza is <span class="subst">{size}</span> inches'</span>)</span><br><span class="line"> print(<span class="string">'The following toppings are required in a pizza'</span>)</span><br><span class="line"> <span class="keyword">for</span> topping <span class="keyword">in</span> args:</span><br><span class="line"> print(<span class="string">f"- <span class="subst">{topping}</span>"</span>)</span><br><span class="line">components = [<span class="string">'mushroom'</span>,<span class="string">'tomato'</span>,<span class="string">'cheese'</span>]</span><br><span class="line">make_pizza(<span class="string">'7'</span>,components)</span><br><span class="line"></span><br><span class="line"><span class="comment"># **一个星号是字符串,两个星号是字典;</span></span><br><span class="line"><span class="comment"># **user_info表示新建了一个空字典,注意字典的赋值方法</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">make_profile</span><span class="params">(first_name,last_name,**user_info)</span>:</span></span><br><span class="line"> user_info[<span class="string">'first_name'</span>]=first_name.title()</span><br><span class="line"> user_info[<span class="string">'last_name'</span>]=last_name.title()</span><br><span class="line"> <span class="keyword">return</span> user_info</span><br><span class="line">my_infomation = make_profile(<span class="string">'yaowei'</span>,<span class="string">'wang'</span>,Location=<span class="string">'shanghai'</span>,School=<span class="string">'SJTU'</span>)</span><br><span class="line">print(my_infomation)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 自己封装模块的方法</span></span><br><span class="line"><span class="comment"># user是python的文件名,make_profile是自己写的函数,可以把.py看成module?</span></span><br><span class="line"><span class="keyword">import</span> user <span class="keyword">as</span> u</span><br><span class="line">u.make_profile(<span class="string">'yaowei'</span>,<span class="string">'wang'</span>,Location=<span class="string">'shanghai'</span>,School=<span class="string">'SJTU'</span>)</span><br></pre></td></tr></table></figure>
<h1 id="第九章:类"><a href="#第九章:类" class="headerlink" title="第九章:类"></a>第九章:类</h1><ul>
<li>面向对象编程-</li>
</ul>
<h4 id="一、什么是面向过程?"><a href="#一、什么是面向过程?" class="headerlink" title="一、什么是面向过程?"></a>一、什么是面向过程?</h4><p>面向过程是一种以<strong>过程</strong>为中心的编程思想,其原理就是将问题分解成一个一个详细的步骤,然后通过函数实现每一个步骤,并依次调用。<br>面向过程我们所关心的是解决一个问题的步骤,举个例子,汽车发动、汽车熄火,这是两个不同的事件,对于面向过程而言,我们关心的是事件本身,因此我们会使用两个函数完成以上两个动作,然后依次调用即可。</p>
<h4 id="二、什么是面向对象?"><a href="#二、什么是面向对象?" class="headerlink" title="二、什么是面向对象?"></a>二、什么是面向对象?</h4><p>面向对象则是一种以<strong>对象</strong>为中心的编程思想,就是通过分析问题,分解出一个一个的对象,然后通过不同对象之间的调用来组合解决问题。建立对象的目的不是为了完成某个步骤,而是为了描述某个事物在解决整个问题的过程中的行为。<br>如上面的例子,汽车发动、汽车熄火,对于面向对象而言,我们则关心的是汽车这类对象,两个事件只是这类对象所具备的行为。</p>
<h4 id="三、面向对象的三大基本特征是什么?"><a href="#三、面向对象的三大基本特征是什么?" class="headerlink" title="三、面向对象的三大基本特征是什么?"></a>三、面向对象的三大基本特征是什么?</h4><h5 id="1、封装"><a href="#1、封装" class="headerlink" title="1、封装"></a>1、封装</h5><p>封装就是将一个类的某些信息隐藏在类的内部,不允许外界直接访问,而是提供某些方法实现对隐藏信息的访问和操作。<br>封装的好处就是<strong>增强了数据安全性</strong>以及<strong>隐藏了类的实现细节</strong>,使用者无需了解具体实现细节,只需通过特定的接口进行访问,这样也方便类自身的实现和修改。</p>
<h5 id="2、继承"><a href="#2、继承" class="headerlink" title="2、继承"></a>2、继承</h5><p>继承是<strong>类与类之间的一种关系</strong>,即子类继承父类的特征和行为,使得子类具有和父类相同的属性和行为。<br>继承的好处在于子类继承了父类的属性和方法从而<strong>实现了代码的复用</strong>。</p>
<h5 id="3、多态"><a href="#3、多态" class="headerlink" title="3、多态"></a>3、多态</h5><p>多态是指一个类对象的相同方法在不同情形下有不同的表现形式。<br>多态使得具有不同内部结构的对象可以共享相同的外部接口。</p>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 类的首字母要大写,切后面没有括号,类要采用驼峰命名法</span></span><br><span class="line"><span class="comment"># 类中的函数成为方法,__init__是一种特殊方法</span></span><br><span class="line"><span class="comment"># self.name可以被类中的所用方法访问,其被称为属性</span></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Dog</span>:</span></span><br><span class="line"> <span class="string">'''我第一次写的小狗的类'''</span></span><br><span class="line"> </span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__init__</span><span class="params">(self,name,age)</span>:</span></span><br><span class="line"> self.name = name</span><br><span class="line"> self.age = age</span><br><span class="line"> </span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">sit</span><span class="params">(self)</span>:</span></span><br><span class="line"> print(<span class="string">f'<span class="subst">{self.name}</span> is sitting!'</span>)</span><br><span class="line"> </span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">rolling</span><span class="params">(self)</span>:</span></span><br><span class="line"> print(<span class="string">f'<span class="subst">{self.name}</span> is rolling over!'</span>)</span><br><span class="line">my_dog = Dog(name=<span class="string">'Wangcai'</span>,age=<span class="string">'6'</span>)</span><br><span class="line"><span class="comment"># 上面等价于my_dog = Dog('Wangcai','6')</span></span><br><span class="line">my_dog.sit()</span><br><span class="line"></span><br><span class="line"><span class="comment"># 一个经典的汽车类例子</span></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Car</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__init__</span><span class="params">(self,make,model,year)</span>:</span></span><br><span class="line"> self.make = make</span><br><span class="line"> self.model = model</span><br><span class="line"> self.year = year</span><br><span class="line"> self.odometer = <span class="number">0</span></span><br><span class="line"> </span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">get_name</span><span class="params">(self)</span>:</span></span><br><span class="line"> print(<span class="string">f'<span class="subst">{self.make}</span> <span class="subst">{self.model}</span> <span class="subst">{self.year}</span>'</span>)</span><br><span class="line"> </span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">read_odometer</span><span class="params">(self)</span>:</span></span><br><span class="line"> print(<span class="string">f'This car is <span class="subst">{self.odometer}</span> miles on it'</span>)</span><br><span class="line"> </span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">update_odometer</span><span class="params">(self,mileage)</span>:</span></span><br><span class="line"> <span class="keyword">if</span> mileage > self.odometer:</span><br><span class="line"> self.odometer = mileage</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> print(<span class="string">'You can not roll back the odometer!'</span>)</span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">increase_odometer</span><span class="params">(self,miles)</span>:</span></span><br><span class="line"> <span class="keyword">if</span> miles > <span class="number">0</span>:</span><br><span class="line"> self.odometer += miles</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> print(<span class="string">'You can not roll back the odometer!'</span>)</span><br><span class="line"> </span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Electriccar</span><span class="params">(Car)</span>:</span> <span class="comment">#括号中要写父类的名字,下面有super</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__init__</span><span class="params">(self,make,model,year)</span>:</span></span><br><span class="line"> super().__init__(make,model,year)</span><br><span class="line"> self.battery = Battery()</span><br><span class="line"> </span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Battery</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__init__</span><span class="params">(self,battery_size=<span class="number">75</span>)</span>:</span></span><br><span class="line"> self.battery_size=battery_size</span><br><span class="line"> </span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">describ_battery</span><span class="params">(self)</span>:</span></span><br><span class="line"> print(<span class="string">f'The battery size is <span class="subst">{self.battery_size}</span> inches'</span>)</span><br><span class="line"> </span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">get_range</span><span class="params">(self)</span>:</span></span><br><span class="line"> <span class="keyword">if</span> self.battery_size == <span class="number">75</span>:</span><br><span class="line"> range = <span class="number">100</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> range = <span class="literal">None</span></span><br><span class="line"> print(<span class="string">f'The car will run <span class="subst">{range}</span> miles'</span>)</span><br><span class="line"> </span><br><span class="line">my_car = Car(<span class="string">'benz'</span>,<span class="string">'A6'</span>,<span class="string">'2020'</span>)</span><br><span class="line">my_car.get_name()</span><br><span class="line">my_car.read_odometer()</span><br><span class="line"><span class="comment"># 可以直接访问属性的类</span></span><br><span class="line">print(my_car.odometer)</span><br></pre></td></tr></table></figure>
<h1 id="第十章:文件和异常"><a href="#第十章:文件和异常" class="headerlink" title="第十章:文件和异常"></a>第十章:文件和异常</h1><h2 id="读取文件"><a href="#读取文件" class="headerlink" title="读取文件"></a>读取文件</h2><p>with关键词之后不需要关闭文件;</p>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">with</span> open(<span class="string">'pi.txt'</span>) <span class="keyword">as</span> f:</span><br><span class="line"> contents = f.read()</span><br><span class="line">print(contents)</span><br><span class="line"><span class="comment"># 一行行的读取</span></span><br><span class="line"><span class="keyword">with</span> open(<span class="string">'pi.txt'</span>) <span class="keyword">as</span> f:</span><br><span class="line"> contents = f.readlines()</span><br><span class="line">print(contents)</span><br></pre></td></tr></table></figure>
<h2 id="写入文件"><a href="#写入文件" class="headerlink" title="写入文件"></a>写入文件</h2><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="string">'r'</span> 可读模式,默认打开模式</span><br><span class="line"><span class="string">'w'</span> 写入模式,清空原始数据</span><br><span class="line"><span class="string">'a'</span> 附加模式,在原有的文本上继续写</span><br><span class="line"><span class="string">'r+'</span> 读写模式</span><br><span class="line"></span><br><span class="line"><span class="keyword">with</span> open(<span class="string">'program.txt'</span>,<span class="string">'w'</span>) <span class="keyword">as</span> f:</span><br><span class="line"> f.write(<span class="string">'I love program!\n'</span>)</span><br><span class="line"> f.write(<span class="string">'That must be a joke!\n'</span>)</span><br></pre></td></tr></table></figure>
<h2 id="异常"><a href="#异常" class="headerlink" title="异常"></a>异常</h2><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">try</span>:</span><br><span class="line"> print(<span class="number">5</span>/<span class="number">0</span>)</span><br><span class="line"><span class="keyword">except</span> ZeroDivisionError:</span><br><span class="line"> print(<span class="string">"You can not divede zero"</span>)</span><br><span class="line"> <span class="comment"># except后面可以指定特定的错误类型也可以不指定</span></span><br><span class="line"> </span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">division</span><span class="params">(i)</span>:</span></span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> print(<span class="number">5</span>/i)</span><br><span class="line"> <span class="keyword">except</span> :</span><br><span class="line"><span class="comment"># print(f"{i} can not divede")</span></span><br><span class="line"> <span class="keyword">pass</span></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> [<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>,<span class="number">0</span>,<span class="number">5</span>]:</span><br><span class="line"> division(i)</span><br><span class="line"><span class="comment"># 可以用pass直接跳过错误</span></span><br><span class="line">>>></span><br><span class="line"><span class="number">5.0</span></span><br><span class="line"><span class="number">2.5</span></span><br><span class="line"><span class="number">1.6666666666666667</span></span><br><span class="line"><span class="number">1.0</span></span><br></pre></td></tr></table></figure>
<h2 id="存储数据"><a href="#存储数据" class="headerlink" title="存储数据"></a>存储数据</h2><p>JSON(Javascript Object Notation)最开始被java所用,后来被众多语言所共用;</p>
<p>json.dump存数据,json.load取数据</p>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> json</span><br><span class="line">numbers = list(range(<span class="number">11</span>))</span><br><span class="line">filename = <span class="string">"numbers.json"</span></span><br><span class="line"><span class="keyword">with</span> open(filename,<span class="string">'w'</span>) <span class="keyword">as</span> f:</span><br><span class="line"> json.dump(numbers,f)</span><br><span class="line"> </span><br><span class="line"><span class="keyword">with</span> open(filename,<span class="string">'r'</span>) <span class="keyword">as</span> f:</span><br><span class="line"> content = json.load(f)</span><br><span class="line">print(content)</span><br></pre></td></tr></table></figure>
<h1 id="第十五章:生成数据"><a href="#第十五章:生成数据" class="headerlink" title="第十五章:生成数据"></a>第十五章:生成数据</h1><ul>
<li>matplotlib画图</li>
</ul>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> matplotlib.pyplot <span class="keyword">as</span> plt</span><br><span class="line"></span><br><span class="line">s = [i**<span class="number">2</span> <span class="keyword">for</span> i <span class="keyword">in</span> list(range(<span class="number">1</span>,<span class="number">6</span>))]</span><br><span class="line">x = list(range(<span class="number">1</span>,<span class="number">6</span>))</span><br><span class="line"></span><br><span class="line"><span class="comment"># 注释掉的两行是查看python内置画图格式</span></span><br><span class="line"><span class="comment"># seaborn-darkgrid </span></span><br><span class="line"><span class="comment"># plt.style.use('seaborn-darkgrid')</span></span><br><span class="line">fig, ax = plt.subplots()</span><br><span class="line"><span class="comment"># 设置图名称和坐标轴标注</span></span><br><span class="line">ax.set_title(<span class="string">'Sum of squares'</span>,fontsize=<span class="number">24</span>)</span><br><span class="line">ax.set_xlabel(<span class="string">'value'</span>,fontsize=<span class="number">24</span>)</span><br><span class="line">ax.set_ylabel(<span class="string">'Sum of value'</span>,fontsize=<span class="number">24</span>)</span><br><span class="line"><span class="comment"># 设置坐标轴数字的大小</span></span><br><span class="line">ax.tick_params(axis=<span class="string">'both'</span>,which =<span class="string">'major'</span>,labelsize=<span class="number">20</span>)</span><br><span class="line"></span><br><span class="line">ax.plot(x,s,lw=<span class="number">3</span>)</span><br><span class="line"><span class="comment"># 注意是如何使用color map功能的</span></span><br><span class="line">ax.tick_params(axis=<span class="string">'both'</span>,which =<span class="string">'major'</span>,labelsize=<span class="number">20</span>)</span><br><span class="line">plt.savefig(<span class="string">'test.pdf'</span>,dpi=<span class="number">500</span>,bbox_inches=<span class="string">'tight'</span>)</span><br><span class="line">plt.show()</span><br></pre></td></tr></table></figure>
<ul>
<li>一个随机漫步的类(定义类中的方法时要加self)</li>
</ul>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">from</span> random <span class="keyword">import</span> choice</span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">RandomWalk</span>:</span></span><br><span class="line"> </span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__init__</span><span class="params">(self, num_points=<span class="number">5000</span>)</span>:</span></span><br><span class="line"> self.num_points = num_points</span><br><span class="line"> </span><br><span class="line"> self.x_values = [<span class="number">0</span>]</span><br><span class="line"> self.y_values = [<span class="number">0</span>]</span><br><span class="line"> </span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">fill_walk</span><span class="params">(self)</span>:</span></span><br><span class="line"> <span class="keyword">while</span> len(self.x_values) <= self.num_points:</span><br><span class="line"> x_direction = choice([<span class="number">-1</span>,<span class="number">1</span>])</span><br><span class="line"> x_distance = choice([<span class="number">0</span>,<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>,<span class="number">4</span>,<span class="number">5</span>])</span><br><span class="line"> x_step = x_direction*x_distance</span><br><span class="line"> y_direction = choice([<span class="number">-1</span>,<span class="number">1</span>])</span><br><span class="line"> y_distance = choice([<span class="number">0</span>,<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>,<span class="number">4</span>,<span class="number">5</span>])</span><br><span class="line"> y_step = y_direction*y_distance</span><br><span class="line"><span class="comment"># Do not stay at original point</span></span><br><span class="line"> <span class="keyword">if</span> x_distance == <span class="number">0</span> <span class="keyword">and</span> x_distance == <span class="number">0</span>:</span><br><span class="line"> <span class="keyword">continue</span></span><br><span class="line"> x_position = self.x_values[<span class="number">-1</span>]+x_step</span><br><span class="line"> y_position = self.y_values[<span class="number">-1</span>]+y_step</span><br><span class="line"> </span><br><span class="line"> self.x_values.append(x_position)</span><br><span class="line"> self.y_values.append(y_position)</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> matplotlib.pyplot <span class="keyword">as</span> plt</span><br><span class="line">num = range(rw.num_points+<span class="number">1</span>)</span><br><span class="line">rw = RandomWalk(num_points=<span class="number">1000</span>)</span><br><span class="line">rw.fill_walk()</span><br><span class="line">fig, ax = plt.subplots()</span><br><span class="line"></span><br><span class="line">ax.scatter(rw.x_values,rw.y_values,c = num,cmap=plt.cm.Blues)</span><br><span class="line">ax.scatter(rw.x_values[<span class="number">0</span>],rw.y_values[<span class="number">0</span>],c =<span class="string">'red'</span>)</span><br></pre></td></tr></table></figure>
<h1 id="第十六章:下载数据"><a href="#第十六章:下载数据" class="headerlink" title="第十六章:下载数据"></a>第十六章:下载数据</h1><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="comment">#给指定区域着色</span></span><br><span class="line">ax.fill_between(x,y_high,y_low,facecolor=<span class="string">'blue'</span>,alpha=<span class="number">0.1</span>)</span><br></pre></td></tr></table></figure>
]]></content>
<categories>
<category>Python学习</category>
</categories>
</entry>
<entry>
<title>Jupyter notebook</title>
<url>/2020/11/24/Jupyter-notebook/</url>
<content><![CDATA[<p>jupyter lab及python3安装方法</p>
<a id="more"></a>
<h3 id="Jupyter-notebook和Jupyter-lab"><a href="#Jupyter-notebook和Jupyter-lab" class="headerlink" title="Jupyter notebook和Jupyter lab"></a>Jupyter notebook和Jupyter lab</h3><p>Jupyter Notebook 是一个款以网页为基础的交互计算环境,可以创建Jupyter的文档,支持多种语言,包括Python, Julia, R等等。广泛用于数据分析,数据可视化和其他的交互和探索性计算中。</p>
<p>JupyterLab 是<strong>包括了Notebook</strong>的<strong>下一代</strong>用户界面。有模块化的界面,可以在同一个窗口同时打开好几个notebook或文件(HTML, TXT, Markdown等等),都以标签的形式展示,于是就更像是一个IDE。</p>
<p>本次在Surface Pro7(Win10系统下)安装Jupyter lab。</p>
<h3 id="安装流程"><a href="#安装流程" class="headerlink" title="安装流程"></a>安装流程</h3><h4 id="安装python"><a href="#安装python" class="headerlink" title="安装python"></a>安装python</h4><p><a href="https://www.python.org/downloads/" target="_blank" rel="noopener">进入官方网站下载python安装包</a></p>
<p>下载好64bit 3.9.0安装包,安装过程点击<code>Add Python to PATH</code></p>
<h4 id="CMD键入安装命令"><a href="#CMD键入安装命令" class="headerlink" title="CMD键入安装命令"></a>CMD键入安装命令</h4><p>用cmd打开windows系统下命令提示符,输入<code>python --version</code>即可查看python的版本,输入<code>pip --version</code>即可查看pip的版本(pip以后安装python的包会用到)</p>
<p>在cmd中输入:</p>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line">pip install jupyterlab</span><br></pre></td></tr></table></figure>
<p>完成对jupyter lab的安装,安装后在cmd窗口中通过<code>jupyter lab</code>打开</p>
<h4 id="设置Jupyterlab保存目录和端口"><a href="#设置Jupyterlab保存目录和端口" class="headerlink" title="设置Jupyterlab保存目录和端口"></a>设置Jupyterlab保存目录和端口</h4><p>CMD 中输入 <code>jupyter lab --generate-config</code>,写默认配置文件。如果之前安装过jupyter的会提示是否覆盖之前的文件。</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment">#默认打开和文件保存路径</span></span><br><span class="line">c.NotebookApp.notebook_dir = <span class="string">'C:\jupyter'</span></span><br><span class="line"><span class="comment">#端口号</span></span><br><span class="line">c.NotebookApp.port = 8889</span><br></pre></td></tr></table></figure>
<h3 id="安装Jupyter插件"><a href="#安装Jupyter插件" class="headerlink" title="安装Jupyter插件"></a>安装Jupyter插件</h3><h4 id="开启拓展功能"><a href="#开启拓展功能" class="headerlink" title="开启拓展功能"></a>开启拓展功能</h4><p>Settings-Advanced Setting Editor-Extension Manager。将左边”enabled”:false粘贴到右边的花括号里。</p>
<img src="/2020/11/24/Jupyter-notebook/tuozhan.png" style="zoom:50%;">
<h4 id="常见的好用插件介绍"><a href="#常见的好用插件介绍" class="headerlink" title="常见的好用插件介绍"></a>常见的好用插件介绍</h4><p><code>debugger</code>debug神器</p>
<p><code>jupyter-matplotlib</code>,绘图前加入魔法命令<code>%matplotlib widget</code>即可交互拖拽式画图</p>
<p><code>jupyterlab-drawio</code>,在Jupyter里面画思维导图</p>
<p><code>jupyterlab-spreadsheet</code>查看excel</p>
<p><code>jupyterlab-kite</code>代码不全神器</p>
]]></content>
<categories>
<category>环境及软件安装</category>
</categories>
</entry>
<entry>
<title>python绘制元素周期表</title>
<url>/2020/11/09/python%E7%BB%98%E5%88%B6%E5%85%83%E7%B4%A0%E5%91%A8%E6%9C%9F%E8%A1%A8/</url>
<content><![CDATA[<p>python脚本绘制元素周期表并且放在文章中</p>
<a id="more"></a>
<p>待提升:1.给每个元素加上原子序数</p>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> re</span><br><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np</span><br><span class="line"><span class="keyword">import</span> matplotlib.pyplot <span class="keyword">as</span> plt</span><br><span class="line"><span class="keyword">import</span> matplotlib.patches <span class="keyword">as</span> mpatches</span><br><span class="line"><span class="keyword">from</span> matplotlib.collections <span class="keyword">import</span> PatchCollection</span><br><span class="line"><span class="comment"># import seaborn as sns</span></span><br><span class="line"><span class="keyword">from</span> pymatgen.core.periodic_table <span class="keyword">import</span> Element</span><br><span class="line"><span class="comment"># sns.set(color_codes=True)</span></span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">periodic_table</span><span class="params">(object)</span>:</span></span><br><span class="line"> <span class="string">"""</span></span><br><span class="line"><span class="string"> frame: str or dict, describe shapes of element cells.</span></span><br><span class="line"><span class="string"> str: patch class name under matplotlib.patches.</span></span><br><span class="line"><span class="string"> dict: {</span></span><br><span class="line"><span class="string"> "shape": patch class name,</span></span><br><span class="line"><span class="string"> "parms": width, height and other parms, needed for "shape",</span></span><br><span class="line"><span class="string"> "kparms": kparms, supported by "shape"</span></span><br><span class="line"><span class="string"> }</span></span><br><span class="line"><span class="string"> colors: dict, custom frame and background colors for elements.</span></span><br><span class="line"><span class="string"> {</span></span><br><span class="line"><span class="string"> "frame": str, list</span></span><br><span class="line"><span class="string"> "background": str, list, {"depend_on": data_key [, "cmp": color map, "cbar": True]}</span></span><br><span class="line"><span class="string"> }</span></span><br><span class="line"><span class="string"> if you use a gradient, color will based on the data from Element().data or you provide.</span></span><br><span class="line"><span class="string"> depend_on specify which data you want to use.</span></span><br><span class="line"><span class="string"> label: dict or function(not supported yet).</span></span><br><span class="line"><span class="string"> dict: {</span></span><br><span class="line"><span class="string"> "label1": [element symbols or atomic indexes],</span></span><br><span class="line"><span class="string"> ...</span></span><br><span class="line"><span class="string"> }</span></span><br><span class="line"><span class="string"> or more detail:</span></span><br><span class="line"><span class="string"> dict: {</span></span><br><span class="line"><span class="string"> "label1": {</span></span><br><span class="line"><span class="string"> "elements": [element symbols or atomic indexes],</span></span><br><span class="line"><span class="string"> "color": not necessary</span></span><br><span class="line"><span class="string"> }</span></span><br><span class="line"><span class="string"> ...</span></span><br><span class="line"><span class="string"> }</span></span><br><span class="line"><span class="string"> function: func(element symbol or atomic index) returns color and label</span></span><br><span class="line"><span class="string"> text: text content and format within element cells (not supported yet).</span></span><br><span class="line"><span class="string"> data: data beside pymatgen or you want overide for pymatgen</span></span><br><span class="line"><span class="string"> {symbol: {k1: v1, k2:v2}, ...}</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__init__</span><span class="params">(self,</span></span></span><br><span class="line"><span class="function"><span class="params"> frame=None,</span></span></span><br><span class="line"><span class="function"><span class="params"> colors=None,</span></span></span><br><span class="line"><span class="function"><span class="params"> labels=None,</span></span></span><br><span class="line"><span class="function"><span class="params"> text=None,</span></span></span><br><span class="line"><span class="function"><span class="params"> data=None)</span>:</span></span><br><span class="line"> self.frame = frame <span class="keyword">or</span> {}</span><br><span class="line"> <span class="keyword">if</span> isinstance(self.frame, str):</span><br><span class="line"> self.frame = {<span class="string">"shape"</span>: self.frame <span class="keyword">or</span> <span class="literal">None</span>}</span><br><span class="line"> self.frame.setdefault(<span class="string">"shape"</span>, <span class="string">"Rectangle"</span>)</span><br><span class="line"> self.frame.setdefault(<span class="string">"parms_orig"</span>, self.frame.get(<span class="string">"parms"</span>, [<span class="number">1.0</span>, <span class="number">1.0</span>]))</span><br><span class="line"> self.frame.setdefault(<span class="string">"kparms"</span>, {})</span><br><span class="line"> self.colors = colors <span class="keyword">or</span> {}</span><br><span class="line"> self.colors.setdefault(<span class="string">"frame"</span>, <span class="string">"black"</span>)</span><br><span class="line"> self.colors.setdefault(<span class="string">"background"</span>, <span class="string">"none"</span>)</span><br><span class="line"> <span class="keyword">if</span> (<span class="keyword">not</span> labels) <span class="keyword">or</span> <span class="string">"background"</span> <span class="keyword">in</span> labels <span class="keyword">or</span> <span class="string">"frame"</span> <span class="keyword">in</span> labels:</span><br><span class="line"> self.labels = labels <span class="keyword">or</span> {}</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> self.labels = {<span class="string">"background"</span>: labels}</span><br><span class="line"> self._text = text <span class="keyword">or</span> <span class="literal">None</span></span><br><span class="line"> self._data = {</span><br><span class="line"> Element.from_Z(i).symbol: {<span class="string">"Symbol"</span>: Element.from_Z(i).symbol, **Element.from_Z(i).data}</span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> range(<span class="number">1</span>, <span class="number">104</span>)</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> data:</span><br><span class="line"> [self._data[k].update(data[k]) <span class="keyword">for</span> k <span class="keyword">in</span> data]</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">get_frame</span><span class="params">(self)</span>:</span></span><br><span class="line"> self.frame[<span class="string">"parms"</span>] = list(self.frame[<span class="string">"parms_orig"</span>])</span><br><span class="line"> <span class="keyword">if</span> self.frame[<span class="string">"shape"</span>] == <span class="string">"FancyBboxPatch"</span>:</span><br><span class="line"> self.frame[<span class="string">"kparms"</span>].setdefault(<span class="string">"boxstyle"</span>, <span class="string">"round, pad=0.1"</span>)</span><br><span class="line"> pad = float([*re.findall(<span class="string">"pad=(\d+[.]\d+)"</span>, self.frame[<span class="string">"kparms"</span>][<span class="string">'boxstyle'</span>]), <span class="number">0.3</span>][<span class="number">0</span>])</span><br><span class="line"> self.frame[<span class="string">"parms"</span>][<span class="number">0</span>:<span class="number">2</span>] = list(np.array(self.frame[<span class="string">"parms_orig"</span>][<span class="number">0</span>:<span class="number">2</span>]) - <span class="number">2</span>*pad)</span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> <span class="keyword">return</span> getattr(mpatches, self.frame[<span class="string">"shape"</span>])</span><br><span class="line"> <span class="keyword">except</span> AttributeError:</span><br><span class="line"> <span class="keyword">raise</span> ValueError(<span class="string">"Unsupported shape error"</span>)</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">get_xys</span><span class="params">(self)</span>:</span></span><br><span class="line"> width_and_height = np.array(self.frame[<span class="string">"parms_orig"</span>][<span class="number">0</span>:<span class="number">2</span>])</span><br><span class="line"> text_shift = self.frame.get(<span class="string">"text_shift"</span>,</span><br><span class="line"> np.array([<span class="number">0.5</span>, <span class="number">0.5</span>]) * width_and_height)</span><br><span class="line"> <span class="keyword">if</span> self.frame[<span class="string">"shape"</span>] == <span class="string">"FancyBboxPatch"</span>:</span><br><span class="line"> text_shift -= <span class="number">0.10</span> * width_and_height</span><br><span class="line"></span><br><span class="line"> elements = [Element.from_Z(i) <span class="keyword">for</span> i <span class="keyword">in</span> range(<span class="number">1</span>, <span class="number">104</span>)]</span><br><span class="line"> group_and_rows = [np.array([el.group, el.row]) <span class="keyword">for</span> el <span class="keyword">in</span> elements]</span><br><span class="line"> frame_xys = [</span><br><span class="line"> np.array([<span class="number">1</span>, <span class="number">-1</span>]) * gr * width_and_height <span class="keyword">for</span> gr <span class="keyword">in</span> group_and_rows</span><br><span class="line"> ]</span><br><span class="line"> text_xys = [text_shift + fxy <span class="keyword">for</span> fxy <span class="keyword">in</span> frame_xys]</span><br><span class="line"> <span class="keyword">return</span> frame_xys, text_xys</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">get_colors_and_legend</span><span class="params">(self)</span>:</span></span><br><span class="line"> <span class="keyword">for</span> v <span class="keyword">in</span> self.colors.values():</span><br><span class="line"> <span class="keyword">if</span> isinstance(v, list) <span class="keyword">and</span> len(v) != len(self._data):</span><br><span class="line"> <span class="keyword">raise</span> ValueError(</span><br><span class="line"> <span class="string">"Length of color list should be compatible with Elements."</span>)</span><br><span class="line"> default_color_cycle = plt.rcParams[<span class="string">'axes.prop_cycle'</span>].by_key()[<span class="string">'color'</span>]</span><br><span class="line"> default_edgecolor = [<span class="string">"black"</span>, self.colors[<span class="string">"frame"</span>]</span><br><span class="line"> ][isinstance(self.colors[<span class="string">"frame"</span>], str)]</span><br><span class="line"> default_facecolor = [<span class="string">"none"</span>, self.colors[<span class="string">"background"</span>]</span><br><span class="line"> ][isinstance(self.colors[<span class="string">"background"</span>], str)]</span><br><span class="line"></span><br><span class="line"> colors = {</span><br><span class="line"> <span class="string">"edgecolors"</span>:</span><br><span class="line"> self.colors.get(<span class="string">"frame"</span>, default_edgecolor),</span><br><span class="line"> <span class="string">"facecolors"</span>:</span><br><span class="line"> [self.colors.get(<span class="string">"background"</span>, default_facecolor),</span><br><span class="line"> <span class="literal">None</span>][isinstance(self.colors[<span class="string">"background"</span>], dict)]</span><br><span class="line"> }</span><br><span class="line"> legend_handles = []</span><br><span class="line"></span><br><span class="line"> <span class="keyword">for</span> k, v <span class="keyword">in</span> colors.items():</span><br><span class="line"> labels = self.labels.get({</span><br><span class="line"> <span class="string">"edgecolors"</span>: <span class="string">"frame"</span>,</span><br><span class="line"> <span class="string">"facecolors"</span>: <span class="string">"background"</span></span><br><span class="line"> }[k], <span class="literal">None</span>)</span><br><span class="line"> <span class="keyword">if</span> labels:</span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> v:</span><br><span class="line"> <span class="keyword">raise</span> ValueError(</span><br><span class="line"> <span class="string">"Gradient mapped background can't be labelled."</span>)</span><br><span class="line"> <span class="keyword">if</span> isinstance(colors[k], str):</span><br><span class="line"> colors[k] = [colors[k]] * len(self._data)</span><br><span class="line"> <span class="keyword">if</span> isinstance(list(labels.values())[<span class="number">0</span>], list):</span><br><span class="line"> labels = {</span><br><span class="line"> lk: {</span><br><span class="line"> <span class="string">"elements"</span>: lv</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">for</span> lk, lv <span class="keyword">in</span> labels.items()</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">for</span> i, l <span class="keyword">in</span> enumerate(labels):</span><br><span class="line"> label = labels[l]</span><br><span class="line"> label.setdefault(<span class="string">"label"</span>, l)</span><br><span class="line"> indexes = [Element(s).Z - <span class="number">1</span> <span class="keyword">for</span> s <span class="keyword">in</span> label[<span class="string">"elements"</span>]]</span><br><span class="line"> label.setdefault(<span class="string">"color"</span>, default_color_cycle[i])</span><br><span class="line"> <span class="keyword">for</span> j <span class="keyword">in</span> indexes:</span><br><span class="line"> colors[k][j] = label[<span class="string">"color"</span>]</span><br><span class="line"> label.setdefault(<span class="string">"frame_kparms"</span>, {})</span><br><span class="line"> <span class="keyword">for</span> lkk <span class="keyword">in</span> [<span class="string">"edgecolor"</span>, <span class="string">"facecolor"</span>]:</span><br><span class="line"> label[<span class="string">"frame_kparms"</span>].setdefault(lkk, <span class="string">"none"</span>)</span><br><span class="line"> label[<span class="string">"frame_kparms"</span>][k[<span class="number">0</span>:<span class="number">-1</span>]] = label[<span class="string">"color"</span>]</span><br><span class="line"></span><br><span class="line"> patch_legend = mpatches.Patch(</span><br><span class="line"> label=label[<span class="string">"label"</span>], **label[<span class="string">"frame_kparms"</span>])</span><br><span class="line"> legend_handles.append(patch_legend)</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> colors, legend_handles</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">get_plot</span><span class="params">(self, title=None, figsize=None, legend_kparms={})</span>:</span></span><br><span class="line"> fig, ax = plt.subplots(figsize=figsize)</span><br><span class="line"></span><br><span class="line"> frame_xys, text_xys = self.get_xys()</span><br><span class="line"> colors, legend_handles = self.get_colors_and_legend()</span><br><span class="line"></span><br><span class="line"> frame = self.get_frame()</span><br><span class="line"> frames = [</span><br><span class="line"> frame(xy, *self.frame[<span class="string">"parms"</span>], **self.frame[<span class="string">"kparms"</span>])</span><br><span class="line"> <span class="keyword">for</span> xy <span class="keyword">in</span> frame_xys</span><br><span class="line"> ]</span><br><span class="line"> collection = PatchCollection(frames, **colors)</span><br><span class="line"> ax.add_collection(collection)</span><br><span class="line"> [</span><br><span class="line"> ax.text(</span><br><span class="line"> *text_xys[i],</span><br><span class="line"> Element.from_Z(i + <span class="number">1</span>).symbol,</span><br><span class="line"> horizontalalignment=<span class="string">"center"</span>,</span><br><span class="line"> verticalalignment=<span class="string">"center"</span>,</span><br><span class="line"> family=<span class="string">"Times New Roman"</span>,</span><br><span class="line"> size=<span class="string">"x-large"</span></span><br><span class="line"> ) <span class="keyword">for</span> i <span class="keyword">in</span> range(len(self._data))</span><br><span class="line"> ]</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> legend_handles:</span><br><span class="line"> legend_kparms.update({<span class="string">"handles"</span>: legend_handles})</span><br><span class="line"> legend_kparms.setdefault(<span class="string">"loc"</span>, <span class="string">"upper center"</span>)</span><br><span class="line"> legend_kparms.setdefault(<span class="string">"bbox_to_anchor"</span>, (<span class="number">0.41</span>, <span class="number">1.0</span>))</span><br><span class="line"> legend_kparms.setdefault(<span class="string">"fontsize"</span>, <span class="string">"x-large"</span>)</span><br><span class="line"> ax.legend(**legend_kparms)</span><br><span class="line"> <span class="keyword">if</span> title:</span><br><span class="line"> plt.title(title, fontsize=<span class="number">28</span>)</span><br><span class="line"> plt.axis(<span class="string">'equal'</span>)</span><br><span class="line"> plt.axis(<span class="string">'off'</span>)</span><br><span class="line"> plt.tight_layout()</span><br><span class="line"> <span class="keyword">return</span> plt</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">show</span><span class="params">(self, title=None, figsize=None)</span>:</span></span><br><span class="line"> plt = self.get_plot(title=title, figsize=figsize)</span><br><span class="line"> plt.show()</span><br><span class="line"><span class="comment">#使用例子1</span></span><br><span class="line">p = periodic_table(</span><br><span class="line"> frame={</span><br><span class="line"> <span class="string">"shape"</span>: <span class="string">"Rectangle"</span>,</span><br><span class="line"> <span class="string">"parms"</span>: [<span class="number">1.0</span>, <span class="number">1.25</span>]</span><br><span class="line"> },</span><br><span class="line"> labels={</span><br><span class="line"> <span class="string">"background"</span>: {</span><br><span class="line"> <span class="string">"+1 Elements"</span>: [<span class="string">'Na'</span>, <span class="string">'K'</span>, <span class="string">'Rb'</span>, <span class="string">'Ag'</span>, <span class="string">'Cs'</span>, <span class="string">'Tl'</span>, <span class="string">'Cu'</span>],</span><br><span class="line"> <span class="string">"+3 Elements"</span>: [</span><br><span class="line"> <span class="string">'Al'</span>, <span class="string">'Sc'</span>, <span class="string">'Cr'</span>, <span class="string">'Fe'</span>, <span class="string">'Co'</span>, <span class="string">'Ga'</span>, <span class="string">'Y'</span>, <span class="string">'Ru'</span>, <span class="string">'Rh'</span>, <span class="string">'In'</span>,</span><br><span class="line"> <span class="string">'Sb'</span>, <span class="string">'La'</span>, <span class="string">'Ce'</span>, <span class="string">'Gd'</span>, <span class="string">'Ir'</span>, <span class="string">'Bi'</span></span><br><span class="line"> ],</span><br><span class="line"> <span class="string">"-2 Elements"</span>: [<span class="string">'O'</span>, <span class="string">'S'</span>, <span class="string">'Se'</span>, <span class="string">'Te'</span>]</span><br><span class="line"> }</span><br><span class="line"> })</span><br><span class="line">pplt = p.get_plot(figsize=(<span class="number">9</span>, <span class="number">5</span>))</span><br><span class="line">pplt.show()</span><br><span class="line"></span><br><span class="line"><span class="comment">#使用例子2 </span></span><br><span class="line">plt.close()</span><br><span class="line">p = periodic_table(</span><br><span class="line"> frame={</span><br><span class="line"> <span class="string">"shape"</span>: <span class="string">"FancyBboxPatch"</span>,</span><br><span class="line"> <span class="string">"parms"</span>: [<span class="number">1.0</span>, <span class="number">1.25</span>]</span><br><span class="line"> },</span><br><span class="line"> labels={</span><br><span class="line"> <span class="string">"background"</span>: {</span><br><span class="line"> <span class="string">"+1 Elements"</span>: [<span class="string">'Na'</span>, <span class="string">'K'</span>, <span class="string">'Rb'</span>, <span class="string">'Ag'</span>, <span class="string">'Cs'</span>, <span class="string">'Tl'</span>, <span class="string">'Cu'</span>],</span><br><span class="line"> <span class="string">"+3 Elements"</span>: [</span><br><span class="line"> <span class="string">'Al'</span>, <span class="string">'Sc'</span>, <span class="string">'Cr'</span>, <span class="string">'Fe'</span>, <span class="string">'Co'</span>, <span class="string">'Ga'</span>, <span class="string">'Y'</span>, <span class="string">'Ru'</span>, <span class="string">'Rh'</span>, <span class="string">'In'</span>,</span><br><span class="line"> <span class="string">'Sb'</span>, <span class="string">'La'</span>, <span class="string">'Ce'</span>, <span class="string">'Gd'</span>, <span class="string">'Ir'</span>, <span class="string">'Bi'</span></span><br><span class="line"> ],</span><br><span class="line"> <span class="string">"-2 Elements"</span>: [<span class="string">'O'</span>, <span class="string">'S'</span>, <span class="string">'Se'</span>, <span class="string">'Te'</span>]</span><br><span class="line"> }</span><br><span class="line"> })</span><br><span class="line">pplt = p.get_plot(figsize=(<span class="number">9</span>, <span class="number">5</span>))</span><br><span class="line">pplt.savefig(<span class="string">"periodic_table.pdf"</span>, transparent=<span class="literal">True</span>)</span><br><span class="line">pplt.show()</span><br></pre></td></tr></table></figure>
<p><img src="/2020/11/09/python%E7%BB%98%E5%88%B6%E5%85%83%E7%B4%A0%E5%91%A8%E6%9C%9F%E8%A1%A8/p1.png" alt></p>
<p><img src="/2020/11/09/python%E7%BB%98%E5%88%B6%E5%85%83%E7%B4%A0%E5%91%A8%E6%9C%9F%E8%A1%A8/p2.png" alt></p>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">from</span> bokeh.io <span class="keyword">import</span> output_notebook, show</span><br><span class="line"><span class="keyword">from</span> bokeh.models <span class="keyword">import</span> ColumnDataSource</span><br><span class="line"><span class="keyword">from</span> bokeh.plotting <span class="keyword">import</span> figure</span><br><span class="line"><span class="keyword">from</span> bokeh.sampledata.periodic_table <span class="keyword">import</span> elements</span><br><span class="line"><span class="keyword">from</span> bokeh.transform <span class="keyword">import</span> dodge, factor_cmap</span><br><span class="line"><span class="keyword">from</span> bokeh.io <span class="keyword">import</span> export_png,export_svgs</span><br><span class="line"></span><br><span class="line">output_notebook()</span><br><span class="line"></span><br><span class="line">periods = [<span class="string">"I"</span>, <span class="string">"II"</span>, <span class="string">"III"</span>, <span class="string">"IV"</span>, <span class="string">"V"</span>, <span class="string">"VI"</span>, <span class="string">"VII"</span>]</span><br><span class="line">groups = [str(x) <span class="keyword">for</span> x <span class="keyword">in</span> range(<span class="number">1</span>, <span class="number">19</span>)]</span><br><span class="line"></span><br><span class="line">df = elements.copy()</span><br><span class="line">df[<span class="string">"atomic mass"</span>] = df[<span class="string">"atomic mass"</span>].astype(str)</span><br><span class="line">df[<span class="string">"group"</span>] = df[<span class="string">"group"</span>].astype(str)</span><br><span class="line">df[<span class="string">"period"</span>] = [periods[x<span class="number">-1</span>] <span class="keyword">for</span> x <span class="keyword">in</span> df.period]</span><br><span class="line">df = df[df.group != <span class="string">"-"</span>]</span><br><span class="line">df = df[df.symbol != <span class="string">"Lr"</span>]</span><br><span class="line">df = df[df.symbol != <span class="string">"Lu"</span>]</span><br><span class="line"></span><br><span class="line">cmap = {</span><br><span class="line"> <span class="string">"alkali metal"</span> : <span class="string">"#a6cee3"</span>,</span><br><span class="line"> <span class="string">"alkaline earth metal"</span> : <span class="string">"#1f78b4"</span>,</span><br><span class="line"> <span class="string">"metal"</span> : <span class="string">"#d93b43"</span>,</span><br><span class="line"> <span class="string">"halogen"</span> : <span class="string">"#999d9a"</span>,</span><br><span class="line"> <span class="string">"metalloid"</span> : <span class="string">"#e08d49"</span>,</span><br><span class="line"> <span class="string">"noble gas"</span> : <span class="string">"#eaeaea"</span>,</span><br><span class="line"> <span class="string">"nonmetal"</span> : <span class="string">"#f1d4Af"</span>,</span><br><span class="line"> <span class="string">"transition metal"</span> : <span class="string">"#599d7A"</span>,</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">source = ColumnDataSource(df)</span><br><span class="line"></span><br><span class="line">p = figure(plot_width=<span class="number">900</span>, plot_height=<span class="number">500</span>, title=<span class="string">"Periodic Table (omitting LA and AC Series)"</span>,</span><br><span class="line"> x_range=groups, y_range=list(reversed(periods)), toolbar_location=<span class="literal">None</span>, tools=<span class="string">"hover"</span>)</span><br><span class="line"></span><br><span class="line">p.rect(<span class="string">"group"</span>, <span class="string">"period"</span>, <span class="number">0.95</span>, <span class="number">0.95</span>, source=source, fill_alpha=<span class="number">0.5</span>, legend=<span class="string">"metal"</span>,</span><br><span class="line"> color=factor_cmap(<span class="string">'metal'</span>, palette=list(cmap.values()), factors=list(cmap.keys())))</span><br><span class="line"></span><br><span class="line">text_props = {<span class="string">"source"</span>: source, <span class="string">"text_align"</span>: <span class="string">"left"</span>, <span class="string">"text_baseline"</span>: <span class="string">"middle"</span>}</span><br><span class="line"></span><br><span class="line">x = dodge(<span class="string">"group"</span>, <span class="number">-0.4</span>, range=p.x_range)</span><br><span class="line"></span><br><span class="line">r = p.text(x=x, y=<span class="string">"period"</span>, text=<span class="string">"symbol"</span>, **text_props)</span><br><span class="line">r.glyph.text_font_style=<span class="string">"bold"</span></span><br><span class="line"></span><br><span class="line">r = p.text(x=x, y=dodge(<span class="string">"period"</span>, <span class="number">0.3</span>, range=p.y_range), text=<span class="string">"atomic number"</span>, **text_props)</span><br><span class="line">r.glyph.text_font_size=<span class="string">"11px"</span></span><br><span class="line"></span><br><span class="line">r = p.text(x=x, y=dodge(<span class="string">"period"</span>, <span class="number">-0.35</span>, range=p.y_range), text=<span class="string">"name"</span>, **text_props)</span><br><span class="line">r.glyph.text_font_size=<span class="string">"7px"</span></span><br><span class="line"></span><br><span class="line">r = p.text(x=x, y=dodge(<span class="string">"period"</span>, <span class="number">-0.2</span>, range=p.y_range), text=<span class="string">"atomic mass"</span>, **text_props)</span><br><span class="line">r.glyph.text_font_size=<span class="string">"7px"</span></span><br><span class="line"></span><br><span class="line">p.text(x=[<span class="string">"3"</span>, <span class="string">"3"</span>], y=[<span class="string">"VI"</span>, <span class="string">"VII"</span>], text=[<span class="string">"LA"</span>, <span class="string">"AC"</span>], text_align=<span class="string">"center"</span>, text_baseline=<span class="string">"middle"</span>)</span><br><span class="line"></span><br><span class="line">p.hover.tooltips = [</span><br><span class="line"> (<span class="string">"Name"</span>, <span class="string">"@name"</span>),</span><br><span class="line"> (<span class="string">"Atomic number"</span>, <span class="string">"@{atomic number}"</span>),</span><br><span class="line"> (<span class="string">"Atomic mass"</span>, <span class="string">"@{atomic mass}"</span>),</span><br><span class="line"> (<span class="string">"Type"</span>, <span class="string">"@metal"</span>),</span><br><span class="line"> (<span class="string">"CPK color"</span>, <span class="string">"$color[hex, swatch]:CPK"</span>),</span><br><span class="line"> (<span class="string">"Electronic configuration"</span>, <span class="string">"@{electronic configuration}"</span>),</span><br><span class="line">]</span><br><span class="line"></span><br><span class="line">p.outline_line_color = <span class="literal">None</span></span><br><span class="line">p.grid.grid_line_color = <span class="literal">None</span></span><br><span class="line">p.axis.axis_line_color = <span class="literal">None</span></span><br><span class="line">p.axis.major_tick_line_color = <span class="literal">None</span></span><br><span class="line">p.axis.major_label_standoff = <span class="number">0</span></span><br><span class="line">p.legend.orientation = <span class="string">"horizontal"</span></span><br><span class="line">p.legend.location =<span class="string">"top_center"</span></span><br><span class="line"></span><br><span class="line">show(p)</span><br><span class="line">p.output_backend = <span class="string">"svg"</span></span><br><span class="line">export_png(p, filename=<span class="string">"plot.png"</span>)</span><br></pre></td></tr></table></figure>
<img src="/2020/11/09/python%E7%BB%98%E5%88%B6%E5%85%83%E7%B4%A0%E5%91%A8%E6%9C%9F%E8%A1%A8/plot.png" style="zoom:80%;">
]]></content>
<categories>
<category>常用脚本</category>
</categories>
</entry>
<entry>
<title>VASP教学</title>
<url>/2020/11/09/VASP%E6%95%99%E5%AD%A6/</url>
<content><![CDATA[<p>2020年10月末北京科技大学学生</p>
<a id="more"></a>
<h4 id="大纲"><a href="#大纲" class="headerlink" title="大纲"></a>大纲</h4><ul>
<li><p>安装软件,登陆集群,熟悉常见的linux操作,熟悉vasp的提交格式,掌握slurm任务调度系统,成功提交计算并分析;</p>
<blockquote>
<p><strong>HW1</strong>:提交任务计算Mg,Cu晶格常数并与实验和其他计算值做比较</p>
</blockquote>
</li>
<li><p>纯金属和第二相表面能的计算;</p>
<blockquote>
<p><strong>HW2</strong>:分别计算Mg,Cu的(001)的slab能量及表面能,刘阳调节好MS,MS如何切表面。</p>
</blockquote>
</li>
<li><p>第二相表面吸附H原子,电子逸出功(功函数);</p>
<blockquote>
<p><strong>HW3</strong>:</p>
<p>(1)计算Al最稳定表面的H原子吸附能(要考虑到不同的代表性吸附位点),计算参杂Zn原子后的吸附能并且与纯Al吸附比较;</p>
<p>(2)提交Al不同表面(001),(110),(111)的功函数计算。</p>
</blockquote>
</li>
<li><p>表面析氢动力学;</p>
</li>
<li><p>基体、析出相电极电位差,金属第二相的表面能和吸附;</p>
</li>
<li><p>自由能计算(考虑熵的影响)</p>
</li>
</ul>
<h4 id="第一天"><a href="#第一天" class="headerlink" title="第一天"></a>第一天</h4><p>常用软件</p>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line">Atom: 文本编辑软件</span><br><span class="line">VESTA: 原子结构可视化软件</span><br><span class="line">FileZilla: 远程传输软件</span><br><span class="line">Putty: Windows登陆集群软件</span><br><span class="line">Material Studio: 原子建模软件</span><br><span class="line">P4 vasp:vasp结果后处理软件</span><br></pre></td></tr></table></figure>
<h5 id="SSH命令远程登陆集群"><a href="#SSH命令远程登陆集群" class="headerlink" title="SSH命令远程登陆集群"></a>SSH命令远程登陆集群</h5><h5 id="常用的linux命令"><a href="#常用的linux命令" class="headerlink" title="常用的linux命令"></a>常用的linux命令</h5><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">clear</span><br><span class="line">ls</span><br><span class="line"><span class="built_in">cd</span> <文件夹名></span><br><span class="line"><span class="built_in">cd</span> ..</span><br><span class="line">Tab 补全文件名称</span><br><span class="line"><span class="built_in">cd</span> ~</span><br><span class="line"><span class="built_in">pwd</span></span><br><span class="line">rm <文件名/文件夹名></span><br><span class="line">mkdir</span><br><span class="line">vim <文件名> - i进入编辑状态,esc退出编辑状态,:wq退出文本编辑</span><br><span class="line">cat POSCAR</span><br><span class="line">cp /lustre/home/acct-umjzhh/umjzhh-3/BJUT/wyw/get.py ./</span><br><span class="line">cp ../ly/get.py ./</span><br><span class="line">grep <span class="string">"text"</span> OUTCAR</span><br><span class="line">head/tail -n 5 <文件名></span><br><span class="line">mv <文件名> 文件地址。eg: mv <span class="built_in">test</span> .. mv ./* bulk</span><br><span class="line">cp ../../bulk/get.py ./</span><br></pre></td></tr></table></figure>
<h5 id="VASP计算的输入文件"><a href="#VASP计算的输入文件" class="headerlink" title="VASP计算的输入文件"></a>VASP计算的输入文件</h5><blockquote>
<p><strong>POSCAR:</strong>各个原子的位置信息,可以自己手动输入,也可以从MP库中下载</p>
<p><strong>INCAR:</strong>告诉VASP算什么,怎么算。各个标签的含义可以从vasp manuel中查找</p>
<p><strong>KPOINTS:</strong>包含计算的K点信息(晶胞的边长*k=25)</p>
<p><strong>POTCAR:</strong>对应的是计算过程中每个原子的平面波基组,描述原子中原子核和电子的相关信息。</p>
</blockquote>
<h5 id="VASP计算的输入文件-1"><a href="#VASP计算的输入文件-1" class="headerlink" title="VASP计算的输入文件"></a>VASP计算的输入文件</h5><blockquote>
<p>CONTCAR:弛豫后的结构,弛豫是物理学用语,指的是在某一个渐变物理过程中,从某一个状态逐渐地恢复到平衡态的过程。</p>
<p>WAVECAR:一般很大,存放波函数信息</p>
<p>CHGCAR:存放电荷信息</p>
<p>OSZICAR:存放能量信息</p>
<p>OUTCAR:比较综合的输出文件,很多有很多信息。</p>
</blockquote>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line">Al4 <span class="comment">#代表了体系的名称,第一行随便写。 I'm from China</span></span><br><span class="line"><span class="number">1.0</span> <span class="comment">#缩放系数</span></span><br><span class="line"><span class="number">4.038930</span> <span class="number">0.000000</span> <span class="number">0.000000</span></span><br><span class="line"><span class="number">0.000000</span> <span class="number">4.038930</span> <span class="number">0.000000</span></span><br><span class="line"><span class="number">0.000000</span> <span class="number">0.000000</span> <span class="number">4.038930</span></span><br><span class="line">Al <span class="comment">#体系中元素的名称</span></span><br><span class="line"><span class="number">4</span> <span class="comment">#体系中元素的个数</span></span><br><span class="line">direct <span class="comment">#可以写成分数坐标和直角(Cartersian)坐标,这里面写成分数坐标。</span></span><br><span class="line"><span class="number">0.000000</span> <span class="number">0.000000</span> <span class="number">0.000000</span> Al</span><br><span class="line"><span class="number">0.000000</span> <span class="number">0.500000</span> <span class="number">0.500000</span> Al</span><br><span class="line"><span class="number">0.500000</span> <span class="number">0.000000</span> <span class="number">0.500000</span> Al</span><br><span class="line"><span class="number">0.500000</span> <span class="number">0.500000</span> <span class="number">0.000000</span> Al</span><br></pre></td></tr></table></figure>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line">EDIFF = <span class="number">1e-5</span> <span class="comment">#能量的收敛标准,10**-5~10**-6 eV/atom</span></span><br><span class="line">EDIFFG = <span class="number">-0.015</span> <span class="comment">#力的收敛标准,暂时不考.BULK计算可以不放,slab计算要放。</span></span><br><span class="line">ENCUT = <span class="number">480</span> <span class="comment">#截断能,grep “ENMAX” POTCAR,POTCAR一般使用PBE。</span></span><br><span class="line">IBRION = <span class="number">2</span> <span class="comment">#conjugate-gradient algorithm</span></span><br><span class="line">NSW = <span class="number">200</span> <span class="comment">#离子收敛步数</span></span><br><span class="line">NELM = <span class="number">100</span> <span class="comment">#电子收敛步数</span></span><br><span class="line">ISIF = <span class="number">3</span> <span class="comment">#controls whether the stress tensor is calculated.</span></span><br><span class="line">ISMEAR = <span class="number">1</span> <span class="comment">#金属设置1就可以,半导体绝缘体设置0</span></span><br><span class="line">ISPIN = <span class="number">1</span> <span class="comment">#电子自旋,Fe,Co,Ni或者O原子需要设置为2,其余为1</span></span><br><span class="line"></span><br><span class="line">SIGMA = <span class="number">0.05</span></span><br><span class="line">POTIM = <span class="number">0.1</span></span><br><span class="line">LREAL = Auto</span><br><span class="line">PREC = Accurate</span><br><span class="line">ALGO = Fast</span><br></pre></td></tr></table></figure>
<p>python脚本自动生成KPOINTS文件和POTCAR文件</p>
<h5 id="Material-project"><a href="#Material-project" class="headerlink" title="Material project"></a>Material project</h5><p><a href="https://materialsproject.org/(排在第一的绿色的),下载POSCAR。" target="_blank" rel="noopener">https://materialsproject.org/(排在第一的绿色的),下载POSCAR。</a></p>
<p><a href="https://www.vasp.at/forum/" target="_blank" rel="noopener">https://www.vasp.at/forum/</a></p>
<p><a href="https://cms.mpi.univie.ac.at/vasp/vasp/vasp.html" target="_blank" rel="noopener">https://cms.mpi.univie.ac.at/vasp/vasp/vasp.html</a></p>
<h4 id="虚拟环境"><a href="#虚拟环境" class="headerlink" title="虚拟环境"></a>虚拟环境</h4><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">conda env list <span class="comment">#查看虚拟环境个数及名称</span></span><br><span class="line">conda activate atomate_wyw <span class="comment">#进入虚拟环境</span></span><br><span class="line">source deactivate atomate_wyw <span class="comment">#退出虚拟环境</span></span><br><span class="line">python get.py <span class="comment">#获得KPOINTS文件和POTCAR文件</span></span><br><span class="line">Ctrl+D 退出集群登陆</span><br><span class="line"></span><br><span class="line">scancel+id 取消任务</span><br></pre></td></tr></table></figure>
<h4 id="提交任务"><a href="#提交任务" class="headerlink" title="提交任务"></a>提交任务</h4><figure class="highlight python"><table><tr><td class="code"><pre><span class="line">sbatch vasp_std.slurm</span><br><span class="line">squeue <span class="comment">#查看任务计算情况</span></span><br><span class="line">cat CONTCAR</span><br></pre></td></tr></table></figure>
<h4 id="第二天"><a href="#第二天" class="headerlink" title="第二天"></a>第二天</h4><h5 id="表面能的计算公式"><a href="#表面能的计算公式" class="headerlink" title="表面能的计算公式"></a>表面能的计算公式</h5><p>$E_{surf}=\frac{E_{slab}-E_{bulk}}{2S}$</p>
<p>其中$E_{surf}$代表体系对应的表面能,$E_{slab}$,$E_{bulk}$ 分别代表slab和bulk(体相)的能量,S代表表面积。</p>
<h5 id="结果读取"><a href="#结果读取" class="headerlink" title="结果读取"></a>结果读取</h5><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 判断体系是否正常结束?收敛?</span></span><br><span class="line">OUTCAR, <span class="string">"reached required accuracy - stopping structural energy minimisation"</span></span><br><span class="line">- grep <span class="string">"reached required accuracy"</span> OUTCAR</span><br><span class="line"></span><br><span class="line"><span class="comment"># 体系的能量在哪里读?</span></span><br><span class="line">OSZICAR 中E0后面的 E0= <span class="number">-.14946477E+02</span> = <span class="number">-14.946477</span> eV</span><br></pre></td></tr></table></figure>
<h5 id="切表面的过程"><a href="#切表面的过程" class="headerlink" title="切表面的过程"></a>切表面的过程</h5><p>1.将计算好的CONTCAR保存为POSCAR,并在VESTA中将.vasp文件转位MS支持的.cif文件。File-Export data-save as .alcif</p>
<h4 id="第三天"><a href="#第三天" class="headerlink" title="第三天"></a>第三天</h4><blockquote>
<p>之前计算了Al(001), (110), (111)表面的表面能,并且发现Al(111)表面是最稳定的。</p>
</blockquote>
<pre class="mermaid">graph LR
ISIF=3优化晶格常数-->MS切表面
MS切表面-->计算低指数表面的表面能
计算低指数表面的表面能-->选择的最稳定表面做H吸附</pre>
<h4 id="吸附能的计算公式"><a href="#吸附能的计算公式" class="headerlink" title="吸附能的计算公式"></a>吸附能的计算公式</h4><p>$E_{ads}=E_{slab<em>H}-E_{slab}-\frac{n</em>E_{H_2}}{2}$</p>
<p>n代表吸附原子的个数</p>
<h4 id="找到Al-111-表面具有代表性的吸附位点"><a href="#找到Al-111-表面具有代表性的吸附位点" class="headerlink" title="找到Al(111)表面具有代表性的吸附位点"></a>找到Al(111)表面具有代表性的吸附位点</h4><p><img src="/2020/11/09/VASP%E6%95%99%E5%AD%A6/1.png" alt></p>
<h4 id="在表面添加吸附H原子"><a href="#在表面添加吸附H原子" class="headerlink" title="在表面添加吸附H原子"></a>在表面添加吸附H原子</h4><p>编辑CONTCAR文件</p>
<h4 id="功函数计算流程"><a href="#功函数计算流程" class="headerlink" title="功函数计算流程"></a>功函数计算流程</h4><p><img src="/2020/11/09/VASP%E6%95%99%E5%AD%A6/2.png" alt></p>
<p>$W_{F}=E_{vac}-E_{fermi}$</p>
<p><strong>费米能的计算</strong>:VASP 弛豫计算结束之后,通过命令,<code>grep 'E-fermi' OUTCAR</code> 即可提取出来。</p>
<h5 id="静电势能的计算-通过在-INCAR-中添加:-LVHAR-TRUE-这个参数。"><a href="#静电势能的计算-通过在-INCAR-中添加:-LVHAR-TRUE-这个参数。" class="headerlink" title="静电势能的计算: 通过在 INCAR 中添加: LVHAR =.TRUE. 这个参数。"></a>静电势能的计算: 通过在 INCAR 中添加: <code>LVHAR =.TRUE.</code> 这个参数。</h5><p>加入这个参数,计算结束后,VASP 会输出一个文件: <strong>LOCPOT</strong> 文件。我们可以通过脚本,或者程序对这个文件后处理来获取静电势能。</p>
<p>功函数计算流程总结:</p>
<pre class="mermaid">graph LR
优化获取稳定的结构-->将CONTCAR复制成POSCAR
将CONTCAR复制成POSCAR-->更改INCAR参数
更改INCAR参数-->提交任务</pre>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">EDIFF = 1e-4</span><br><span class="line">EDIFFG = -0.015</span><br><span class="line">ENCUT = 480</span><br><span class="line">IBRION = 2</span><br><span class="line"># 计算功函数时需要更改!</span><br><span class="line">NSW = 0</span><br><span class="line">NELM = 100</span><br><span class="line">ISIF = 3</span><br><span class="line">ISMEAR = 1</span><br><span class="line">ISPIN = 1</span><br><span class="line"></span><br><span class="line">SIGMA = 0.05</span><br><span class="line">POTIM = 0.1</span><br><span class="line">LREAL = Auto</span><br><span class="line">PREC = Accurate</span><br><span class="line">ALGO = Fast</span><br><span class="line"></span><br><span class="line"># 需要增加的参数</span><br><span class="line">LVHAR = .TRUE.</span><br><span class="line">IDIPOL =.TRUE.</span><br><span class="line">IDIPOL = 3</span><br></pre></td></tr></table></figure>
<h4 id="计算-H-2-分子能量"><a href="#计算-H-2-分子能量" class="headerlink" title="计算$H_2$分子能量"></a>计算$H_2$分子能量</h4><h4 id="基体、析出相电极电位差"><a href="#基体、析出相电极电位差" class="headerlink" title="基体、析出相电极电位差"></a>基体、析出相电极电位差</h4><h5 id="能斯特方程"><a href="#能斯特方程" class="headerlink" title="能斯特方程"></a>能斯特方程</h5><p>在标准状态下,标准H电极的电位是0.</p>
<p>常见的离子化学势网站:<a href="https://job-stiftung.de/index.php?id=63" target="_blank" rel="noopener">https://job-stiftung.de/index.php?id=63</a></p>
<p>Pourbaix diagram, E-PH图, 布拜图定腐蚀产物</p>
<p>我们假设的腐蚀环境,离子浓度为$10^{-6}$或者$10^{-8}$,环境为中性</p>
<h4 id="NEB的计算"><a href="#NEB的计算" class="headerlink" title="NEB的计算"></a>NEB的计算</h4><p>1.准备结构优化后的NEB初始状态和结束状态,并将两个文件夹改名为“start”,“end”。</p>
<p>2.在平行于begin文件夹的目录下输入:</p>
<p><code>nebmake.pl begin/CONTCAR end/CONTCAR 5</code></p>
<p>这行命令的意思是:利用nebmake脚本,以begin文件夹下的CONTCAR为初始结构,end文件夹下的CONTCAR为末态结构,在这个过度态过程中插入5个点。 nebmake的脚本需要自行下载编译。</p>
<p>3.将begin或end文件夹下的OUTCAR复制到00和06中,KPOINTS和POTCATR复制到00-06中。INCAR需要加入四个VASP相关的计算参数。</p>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line">IBRION 改为<span class="number">3</span></span><br><span class="line"></span><br><span class="line">LCLIMB = .TRUE.</span><br><span class="line">IMAGES = <span class="number">5</span></span><br><span class="line">SPRING = <span class="number">-5.0</span></span><br><span class="line">ICHAIN = <span class="number">0</span></span><br></pre></td></tr></table></figure>
<p>4.提交任务</p>
<p><code>sbatch -N 5 vasp_neb.slurm</code></p>
<p>5.结果处理脚本:</p>
<p><code>nebresultsrev.pl</code></p>
<h4 id="化合物的表面建立过程"><a href="#化合物的表面建立过程" class="headerlink" title="化合物的表面建立过程"></a>化合物的表面建立过程</h4><p>1.找出某一晶体方向的所有表面</p>
<p>2.</p>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">from</span> pymatgen.core.surface <span class="keyword">import</span> Slab, SlabGenerator, generate_all_slabs, Structure, Lattice, ReconstructionGenerator, get_symmetrically_distinct_miller_indices</span><br><span class="line"><span class="keyword">from</span> pymatgen.core.structure <span class="keyword">import</span> Structure</span><br><span class="line"><span class="keyword">from</span> pymatgen.analysis.adsorption <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">from</span> pymatgen.ext.matproj <span class="keyword">import</span> MPRester</span><br><span class="line"><span class="keyword">from</span> pymatgen.symmetry.analyzer <span class="keyword">import</span> SpacegroupAnalyzer</span><br><span class="line"><span class="keyword">from</span> pymatgen.io.vasp.inputs <span class="keyword">import</span> Poscar</span><br><span class="line"><span class="keyword">from</span> matplotlib <span class="keyword">import</span> pyplot <span class="keyword">as</span> plt</span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line"></span><br><span class="line">mpr = MPRester(<span class="string">'Bw7HdCARiXvzEWJK'</span>)</span><br><span class="line">path = <span class="string">'/Users/wangyaowei/Desktop/codes'</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># struct = Structure.from_file("Mg.vasp")</span></span><br><span class="line">struct = mpr.get_structure_by_material_id(<span class="string">'mp-1124'</span>)</span><br><span class="line">struct = SpacegroupAnalyzer(struct).get_conventional_standard_structure()</span><br><span class="line"></span><br><span class="line">formula = struct.composition.reduced_formula</span><br><span class="line">print(formula)</span><br><span class="line">print(<span class="string">"输入的结构是:{}"</span>.format(formula))</span><br><span class="line"></span><br><span class="line">os.mkdir(formula)</span><br><span class="line">os.chdir(formula)</span><br><span class="line">ls = get_symmetrically_distinct_miller_indices(struct, <span class="number">1</span>, return_hkil=<span class="literal">False</span>)</span><br><span class="line">print(ls)</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> ls:</span><br><span class="line"> slab = SlabGenerator(struct, miller_index=i, min_slab_size=<span class="number">25</span>,min_vacuum_size=<span class="number">15.0</span>, lll_reduce=<span class="literal">True</span>, center_slab=<span class="literal">True</span>)</span><br><span class="line"> <span class="keyword">for</span> n, slabs <span class="keyword">in</span> enumerate(slab.get_slabs(bonds=<span class="literal">None</span>, ftol=<span class="number">0.1</span>, tol=<span class="number">0.1</span>, max_broken_bonds=<span class="number">0</span>, repair=<span class="literal">False</span>, symmetrize=<span class="literal">True</span>)):</span><br><span class="line"> slabs.make_supercell([[<span class="number">2</span>,<span class="number">0</span>,<span class="number">0</span>],[<span class="number">0</span>,<span class="number">2</span>,<span class="number">0</span>],[<span class="number">0</span>,<span class="number">0</span>,<span class="number">1</span>]])</span><br><span class="line"> name = str(i).split(<span class="string">','</span>)[<span class="number">0</span>][<span class="number">1</span>]+str(i).split(<span class="string">','</span>)[<span class="number">1</span>][<span class="number">1</span>]+str(i).split(<span class="string">','</span>)[<span class="number">2</span>][<span class="number">1</span>]</span><br><span class="line"> open(formula+<span class="string">'_'</span>+name +<span class="string">'_'</span> + str(n+<span class="number">1</span>) + <span class="string">'.vasp'</span>, <span class="string">'w'</span>).write(str(Poscar(slabs)))</span><br></pre></td></tr></table></figure>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">from</span> pymatgen.io.vasp <span class="keyword">import</span> Locpot</span><br><span class="line"><span class="keyword">import</span> matplotlib.pyplot <span class="keyword">as</span> plt</span><br><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np</span><br><span class="line"></span><br><span class="line">locpot = Locpot.from_file(<span class="string">"LOCPOT"</span>) </span><br><span class="line"></span><br><span class="line">z_locpot = locpot.get_average_along_axis(<span class="number">2</span>)</span><br><span class="line"></span><br><span class="line">fermi_level = <span class="number">1.7968</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> matplotlib.pyplot <span class="keyword">as</span> plt</span><br><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np</span><br><span class="line"><span class="keyword">import</span> matplotlib.pyplot <span class="keyword">as</span> plt </span><br><span class="line"><span class="keyword">from</span> pylab <span class="keyword">import</span> * <span class="comment">#控制刻度线</span></span><br><span class="line"><span class="keyword">from</span> matplotlib <span class="keyword">import</span> cm</span><br><span class="line"><span class="keyword">from</span> matplotlib.collections <span class="keyword">import</span> LineCollection</span><br><span class="line">cm = plt.cm.get_cmap(<span class="string">'viridis'</span>)</span><br><span class="line"></span><br><span class="line">plt.figure(figsize=(<span class="number">11.3</span>,<span class="number">6</span>))<span class="comment">#图片大小设置</span></span><br><span class="line"><span class="comment"># plt.ylim(-2.54+2.534,-2.44+2.534)</span></span><br><span class="line">label_font = {<span class="string">'family'</span>:<span class="string">'Arial'</span>,<span class="string">'weight'</span>:<span class="string">'normal'</span>,<span class="string">'size'</span>:<span class="number">22</span>}<span class="comment">#设置标签和图例字体</span></span><br><span class="line">legend_font = {<span class="string">'family'</span>:<span class="string">'Arial'</span>,<span class="string">'weight'</span>:<span class="string">'normal'</span>,<span class="string">'size'</span>:<span class="number">12</span>}</span><br><span class="line">plt.ylabel(<span class="string">'Electrostatic potential'</span>,label_font)</span><br><span class="line">plt.xlabel(<span class="string">'Distance along Z direction'</span>,label_font)</span><br><span class="line">plt.yticks(fontproperties = <span class="string">'Arial'</span>, size = <span class="number">24</span>)</span><br><span class="line">plt.xticks(fontproperties = <span class="string">'Arial'</span>, size = <span class="number">24</span>)</span><br><span class="line"><span class="comment"># plt.xticks(np.arange(1, 5.1, 1))#横坐标范围及间隔</span></span><br><span class="line">matplotlib.rcParams[<span class="string">'patch.linewidth'</span>] = <span class="number">1.5</span><span class="comment">#图例边框线宽度</span></span><br><span class="line">plt.rcParams[<span class="string">'xtick.direction'</span>] = <span class="string">'in'</span><span class="comment">#将x周的刻度线方向设置向内</span></span><br><span class="line">plt.rcParams[<span class="string">'ytick.direction'</span>] = <span class="string">'in'</span><span class="comment">#将y轴的刻度方向设置向内</span></span><br><span class="line">plt.tick_params(which=<span class="string">'major'</span>,width=<span class="number">2</span>,length=<span class="number">6</span>)<span class="comment">#设置刻度线宽度</span></span><br><span class="line">bwith = <span class="number">2</span><span class="comment">#加粗图四周边框</span></span><br><span class="line">ax=plt.gca()</span><br><span class="line">ax.spines[<span class="string">'bottom'</span>].set_linewidth(bwith) </span><br><span class="line">ax.spines[<span class="string">'top'</span>].set_linewidth(bwith)</span><br><span class="line">ax.spines[<span class="string">'left'</span>].set_linewidth(bwith) </span><br><span class="line">ax.spines[<span class="string">'right'</span>].set_linewidth(bwith) </span><br><span class="line"></span><br><span class="line">plt.plot(z_locpot, lw = <span class="number">3</span>)</span><br><span class="line">ax.axvline(<span class="number">300</span>,color=<span class="string">'red'</span>,ls=<span class="string">'dashed'</span>)</span><br><span class="line">ax.axvline(<span class="number">352</span>,color=<span class="string">'red'</span>,ls=<span class="string">'dashed'</span>)</span><br><span class="line"></span><br><span class="line">vac = np.average(z_locpot[<span class="number">300</span>:<span class="number">352</span>])</span><br><span class="line"></span><br><span class="line">plt.savefig(<span class="string">'plotential.tif'</span>,dpi=<span class="number">200</span>)</span><br><span class="line"></span><br><span class="line">print(vac)</span><br><span class="line"></span><br><span class="line">print(<span class="string">"Al(001)表面的功函数为:{}"</span>.format(round(vac-fermi_level,<span class="number">3</span>)))</span><br></pre></td></tr></table></figure>
]]></content>
<categories>
<category>VASP</category>
</categories>
</entry>
<entry>
<title>python机器学习的那些坑</title>
<url>/2020/10/20/python%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E7%9A%84%E9%82%A3%E4%BA%9B%E5%9D%91/</url>
<content><![CDATA[<p>自己踩的那些坑</p>
<a id="more"></a>
<h4 id="Dataframe和numpy求标准差的区别"><a href="#Dataframe和numpy求标准差的区别" class="headerlink" title="Dataframe和numpy求标准差的区别"></a>Dataframe和numpy求标准差的区别</h4><p>1、在统计学中,标准差分为两种:</p>
<p>(1)总体标准差:标准差公式根号内除以n,是有偏的。</p>
<p>(2)样本标准差:标准差公式根号内除以n-1,是无偏的。</p>
<p><code>np.std(df[i])</code> 求的是除以n的,是有偏的。</p>
<p><code>df[i].std()</code> 求的是除以n-1的,是无偏的。</p>
]]></content>
<categories>
<category>机器学习</category>
</categories>
</entry>
<entry>
<title>python排列组合</title>
<url>/2020/10/12/python%E6%8E%92%E5%88%97%E7%BB%84%E5%90%88/</url>
<content><![CDATA[<p>python排列组合</p>
<a id="more"></a>
<h3 id="排列"><a href="#排列" class="headerlink" title="排列"></a>排列</h3><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> itertools</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> itertools.permutations(<span class="string">'ABCD'</span>, <span class="number">2</span>):</span><br><span class="line"> <span class="keyword">print</span> (<span class="string">''</span>.join(i),end=<span class="string">' '</span>)</span><br><span class="line">>> AB AC AD BA BC BD CA CB CD DA DB DC</span><br></pre></td></tr></table></figure>
<h3 id="组合-高中学习的组合,不包含重复"><a href="#组合-高中学习的组合,不包含重复" class="headerlink" title="组合(高中学习的组合,不包含重复)"></a>组合(高中学习的组合,不包含重复)</h3><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> itertools</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> itertools.combinations(<span class="string">'ABCD'</span>, <span class="number">2</span>):</span><br><span class="line"> <span class="keyword">print</span> (<span class="string">''</span>.join(i),end=<span class="string">' '</span>)</span><br><span class="line">>> AB AC AD BC BD CD</span><br></pre></td></tr></table></figure>
<h3 id="组合-包含自身重复"><a href="#组合-包含自身重复" class="headerlink" title="组合(包含自身重复)"></a>组合(包含自身重复)</h3><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> itertools</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> itertools.combinations_with_replacement(<span class="string">'ABCD'</span>, <span class="number">2</span>):</span><br><span class="line"> <span class="keyword">print</span> (<span class="string">''</span>.join(i),end=<span class="string">' '</span>)</span><br><span class="line">>> AA AB AC AD BB BC BD CC CD DD</span><br></pre></td></tr></table></figure>
<h3 id="笛卡尔积-内积"><a href="#笛卡尔积-内积" class="headerlink" title="笛卡尔积(内积)"></a>笛卡尔积(内积)</h3><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> itertools</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> itertools.product(<span class="string">'ABCD'</span>, repeat = <span class="number">2</span>):</span><br><span class="line"> <span class="keyword">print</span> (<span class="string">''</span>.join(i),end=<span class="string">' '</span>)</span><br><span class="line">>> AA AB AC AD BA BB BC BD CA CB CC CD DA DB DC DD</span><br><span class="line"><span class="comment"># 两个不同元祖之间的笛卡尔积</span></span><br><span class="line"><span class="keyword">import</span> itertools</span><br><span class="line">a = (<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>)</span><br><span class="line">b = (<span class="string">'A'</span>, <span class="string">'B'</span>, <span class="string">'C'</span>)</span><br><span class="line">c = itertools.product(a,b)</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> c:</span><br><span class="line"> print(i,end=<span class="string">' '</span>)</span><br><span class="line">(<span class="number">1</span>, <span class="string">'A'</span>) (<span class="number">1</span>, <span class="string">'B'</span>) (<span class="number">1</span>, <span class="string">'C'</span>) (<span class="number">2</span>, <span class="string">'A'</span>) (<span class="number">2</span>, <span class="string">'B'</span>) (<span class="number">2</span>, <span class="string">'C'</span>) (<span class="number">3</span>, <span class="string">'A'</span>) (<span class="number">3</span>, <span class="string">'B'</span>) (<span class="number">3</span>, <span class="string">'C'</span>)</span><br></pre></td></tr></table></figure>
]]></content>
<categories>
<category>常用脚本</category>
</categories>
</entry>
<entry>
<title>sci作图</title>
<url>/2020/10/07/sci%E4%BD%9C%E5%9B%BE/</url>
<content><![CDATA[<figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> matplotlib.pyplot <span class="keyword">as</span> plt </span><br><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np</span><br><span class="line"><span class="keyword">import</span> pandas <span class="keyword">as</span> pd</span><br><span class="line"><span class="keyword">from</span> pylab <span class="keyword">import</span> *</span><br><span class="line"></span><br><span class="line">plt.figure(figsize=(<span class="number">8.3</span>,<span class="number">6</span>)) </span><br><span class="line">label_font = {<span class="string">'family'</span>:<span class="string">'Arial'</span>,<span class="string">'weight'</span>:<span class="string">'normal'</span>,<span class="string">'size'</span>:<span class="number">22</span>}</span><br><span class="line">legend_font = {<span class="string">'family'</span>:<span class="string">'Arial'</span>,<span class="string">'weight'</span>:<span class="string">'normal'</span>,<span class="string">'size'</span>:<span class="number">15</span>}</span><br><span class="line">plt.rcParams[<span class="string">'xtick.direction'</span>] = <span class="string">'in'</span><span class="comment">#将x周的刻度线方向设置向内</span></span><br><span class="line">plt.rcParams[<span class="string">'ytick.direction'</span>] = <span class="string">'in'</span><span class="comment">#将y轴的刻度方向设置向内</span></span><br><span class="line">plt.yticks(fontproperties = <span class="string">'Arial'</span>, size = <span class="number">24</span>)</span><br><span class="line">plt.xticks(fontproperties = <span class="string">'Arial'</span>, size = <span class="number">20</span>)</span><br><span class="line">plt.ylabel(<span class="string">'$\mathregular{R^{2}}$'</span>+<span class="string">' coefficient of determination'</span>,label_font)</span><br><span class="line">plt.xlabel(<span class="string">'Number of features'</span>,label_font)</span><br><span class="line">tick_params(which=<span class="string">'major'</span>,width=<span class="number">2</span>,length=<span class="number">6</span>)</span><br><span class="line">ax=plt.gca()</span><br><span class="line">bwith = <span class="number">2</span></span><br><span class="line">ax.spines[<span class="string">'bottom'</span>].set_linewidth(bwith) </span><br><span class="line">ax.spines[<span class="string">'top'</span>].set_linewidth(bwith)</span><br><span class="line">ax.spines[<span class="string">'left'</span>].set_linewidth(bwith) </span><br><span class="line">ax.spines[<span class="string">'right'</span>].set_linewidth(bwith)</span><br><span class="line"></span><br><span class="line">plt.ylim([<span class="number">0</span>,<span class="number">1</span>])</span><br><span class="line">my_x_ticks = np.arange(<span class="number">1</span>, <span class="number">6</span>, <span class="number">1</span>)<span class="comment">#原始数据有13个点,故此处为设置从0开始,间隔为1</span></span><br><span class="line">plt.xticks(my_x_ticks)</span><br><span class="line">plt.title(<span class="string">'Random forest regression'</span>,fontsize=<span class="number">20</span>)</span><br><span class="line"></span><br><span class="line">d = [<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>,<span class="number">4</span>,<span class="number">5</span>]</span><br><span class="line">r2_rf = [<span class="number">0.822</span>,<span class="number">0.888</span>,<span class="number">0.964</span>,<span class="number">0.964</span>,<span class="number">0.964</span>]</span><br><span class="line">r2tr_rf = [<span class="number">0.8264</span>,<span class="number">0.892</span>,<span class="number">0.9629</span>,<span class="number">0.964</span>,<span class="number">0.9604</span>]</span><br><span class="line">r2te_rf = [<span class="number">0.5456</span>,<span class="number">0.5919</span>,<span class="number">0.7318</span>,<span class="number">0.7362</span>,<span class="number">0.7203</span>]</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">plt.plot(d,r2_rf,<span class="string">'o'</span>,ls=<span class="string">'solid'</span>,lw=<span class="number">1</span>,markeredgecolor=<span class="string">'black'</span>,markersize=<span class="number">8</span>,label=<span class="string">'Entire dataset(50 cases) without cross-validation'</span>)</span><br><span class="line">plt.plot(d,r2tr_rf,<span class="string">'s'</span>,ls=<span class="string">'solid'</span>,lw=<span class="number">1</span>,markeredgecolor=<span class="string">'black'</span>,markersize=<span class="number">8</span>,label=<span class="string">'Trainning dataset(45 cases)'</span>)</span><br><span class="line">plt.plot(d,r2te_rf,<span class="string">'^'</span>,ls=<span class="string">'solid'</span>,lw=<span class="number">1</span>,markeredgecolor=<span class="string">'black'</span>,markersize=<span class="number">8</span>,label=<span class="string">'Test dataset(5 cases)'</span>)</span><br><span class="line"></span><br><span class="line">plt.legend(loc=<span class="string">'best'</span>,prop =legend_font,fancybox=<span class="literal">False</span>,edgecolor=<span class="string">'black'</span>)</span><br><span class="line">plt.tight_layout()</span><br><span class="line">plt.savefig(<span class="string">'rfr.pdf'</span>,dpi = <span class="number">300</span>)</span><br><span class="line">plt.show()</span><br></pre></td></tr></table></figure>
<p>效果图:</p>
<img src="/2020/10/07/sci%E4%BD%9C%E5%9B%BE/rfr.jpeg" style="zoom:24%;">
]]></content>
<categories>
<category>常用脚本</category>
</categories>
</entry>
<entry>
<title>linux下screen的用法</title>
<url>/2020/10/07/linux%E4%B8%8Bscreen%E7%9A%84%E7%94%A8%E6%B3%95/</url>
<content><![CDATA[<p>linux下screen的用法</p>
<a id="more"></a>
<h3 id="screen命令解决的问题"><a href="#screen命令解决的问题" class="headerlink" title="screen命令解决的问题"></a>screen命令解决的问题</h3><p>当通过SSH 或者 telent 远程登录到 Linux 服务器长时间运行任务时,我们经常会为一些长时间运行的任务而头疼,比如系统备份、ftp 传输等等。通常情况下我们都是为每一个这样的任务开一个远程终端窗口,因为他们执行的时间太长了。必须等待它执行完毕,在此期间若不小心关掉窗口或者网络断开连接,这个任务就会被杀掉,一切就半途而废。screen命令就可以很好的解决这个问题。</p>
<h3 id="安装-screen"><a href="#安装-screen" class="headerlink" title="安装 screen"></a>安装 screen</h3><p>screen 在一些流行的发行版上已经预安装了。你可以使用下面的命令检查是否已经在你的服务器上安装了。</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">screen -v</span><br><span class="line">> Screen version 4.01.00devel (GNU) 2-May-06</span><br></pre></td></tr></table></figure>
<p>若未安装screen<a href="https://www.jianshu.com/p/420569381e74" target="_blank" rel="noopener">请参考这里</a>。</p>
<h3 id="Screen基础语法"><a href="#Screen基础语法" class="headerlink" title="Screen基础语法"></a>Screen基础语法</h3><p>新建一个screen窗口</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">screen -S <任务名字></span><br></pre></td></tr></table></figure>
<p>显示所有的screen窗口</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">screen -ls</span><br><span class="line">> There is a screen on:</span><br><span class="line"> 27389.rfr (Detached)</span><br><span class="line">1 Socket <span class="keyword">in</span> /var/run/screen/S-um008.</span><br><span class="line">(意思是只有一个叫做rfr任务,目前状态是未接触/detached)</span><br></pre></td></tr></table></figure>
<p>attach到某一个screen任务</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">screen -r <任务名字>/<任务id></span><br></pre></td></tr></table></figure>
<p>退出screen窗口并且使<strong>任务继续运行</strong></p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">Ctrl a + d</span><br></pre></td></tr></table></figure>
<p>杀死screen窗口</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">screen -X -S <任务id> quit</span><br></pre></td></tr></table></figure>
]]></content>
<categories>
<category>Linux操作系统与常用软件</category>
</categories>
</entry>
<entry>
<title>数据分割之KFold,StratifiedKFold,RepeatedKFold</title>
<url>/2020/10/06/%E6%95%B0%E6%8D%AE%E5%88%86%E5%89%B2%E4%B9%8BKFold-StratifiedKFold-RepeatedKFold/</url>
<content><![CDATA[<p>n折交叉验证数据分割</p>
<a id="more"></a>
<h3 id="KFold"><a href="#KFold" class="headerlink" title="KFold"></a><strong>KFold</strong></h3><p>首先看官网对这个类的定义(括号中均为默认参数)</p>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">sklearn</span>.<span class="title">model_selection</span>.<span class="title">KFold</span><span class="params">(n_splits=<span class="number">5</span>, *, shuffle=False, random_state=None)</span></span></span><br></pre></td></tr></table></figure>
<p>KFold返回的是索引,共有三个参数:</p>
<p><strong>n_splits</strong>,n折交叉验证,作者一般取10。</p>
<p><strong>shuffle</strong>,洗牌的意思。若<code>shuffle=False</code>,则返回的测试集索引连续且固定。比如我们有50个样本,若采用十折交叉验证,则返回的测试集索引依次为,0-4,5-9……,代码实例于下:</p>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">from</span> sklearn.model_selection <span class="keyword">import</span> KFold,StratifiedKFold,RepeatedKFold</span><br><span class="line"><span class="keyword">import</span> pandas <span class="keyword">as</span> pd</span><br><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np</span><br><span class="line"></span><br><span class="line"><span class="comment">#导入有50个样本的数据集</span></span><br><span class="line">df = pd.read_excel(<span class="string">'raw_org_0.xlsx'</span>)</span><br><span class="line">y = df[<span class="string">'Ads_En'</span>]</span><br><span class="line">data = np.array(df)</span><br><span class="line"></span><br><span class="line">kf = KFold(n_splits=<span class="number">10</span>, shuffle=<span class="literal">False</span>)</span><br><span class="line"><span class="keyword">for</span> n, index <span class="keyword">in</span> enumerate(kf.split(data)):</span><br><span class="line"> print(<span class="string">'-----第{}组测试集索引为:-----'</span>.format(n+<span class="number">1</span>))</span><br><span class="line"> print(index[<span class="number">1</span>])</span><br><span class="line"> print(<span class="string">'-----第{}组训练集索引为:-----'</span>.format(n+<span class="number">1</span>))</span><br><span class="line"> print(index[<span class="number">0</span>])</span><br></pre></td></tr></table></figure>
<p><img src="/2020/10/06/%E6%95%B0%E6%8D%AE%E5%88%86%E5%89%B2%E4%B9%8BKFold-StratifiedKFold-RepeatedKFold/kfold_example.png" alt></p>
<p>(后续为了解释方便将不打印出训练集系数)</p>
<p>若<code>shuffle=True</code>,则返回的测试集索引随机且不连续。仍以50个样本为例,若采用十折交叉验证,代码实例于下:</p>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">from</span> sklearn.model_selection <span class="keyword">import</span> KFold,StratifiedKFold,RepeatedKFold</span><br><span class="line"><span class="keyword">import</span> pandas <span class="keyword">as</span> pd</span><br><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np</span><br><span class="line"></span><br><span class="line"><span class="comment">#导入有50个样本的数据集</span></span><br><span class="line">df = pd.read_excel(<span class="string">'raw_org_0.xlsx'</span>)</span><br><span class="line">y = df[<span class="string">'Ads_En'</span>]</span><br><span class="line">data = np.array(df)</span><br><span class="line"></span><br><span class="line">kf = KFold(n_splits=<span class="number">10</span>,shuffle=<span class="literal">True</span>)</span><br><span class="line"><span class="keyword">for</span> n, index <span class="keyword">in</span> enumerate(kf.split(data)):</span><br><span class="line"> print(<span class="string">'-----第{}组测试集索引为:-----'</span>.format(n+<span class="number">1</span>))</span><br><span class="line"> print(index[<span class="number">1</span>])</span><br></pre></td></tr></table></figure>
<blockquote>
<p>第一次运行结果:</p>
</blockquote>
<img src="/2020/10/06/%E6%95%B0%E6%8D%AE%E5%88%86%E5%89%B2%E4%B9%8BKFold-StratifiedKFold-RepeatedKFold/kf1.png" style="zoom:50%;">
<blockquote>
<p>第二次运行结果:</p>
</blockquote>
<img src="/2020/10/06/%E6%95%B0%E6%8D%AE%E5%88%86%E5%89%B2%E4%B9%8BKFold-StratifiedKFold-RepeatedKFold/kf2.png" style="zoom:50%;">
<p>可以看出当参数<code>shuffle=True</code>,每次返回的索引值都不同。</p>
<p><strong>random_state</strong>:在<code>shuffle=False</code>时没有意义。在<code>shuffle=True</code>时,设置成一个数字会使每次生成的随机数字相同,还以之前的50个样本的数据集为例:</p>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">from</span> sklearn.model_selection <span class="keyword">import</span> KFold,StratifiedKFold,RepeatedKFold</span><br><span class="line"><span class="keyword">import</span> pandas <span class="keyword">as</span> pd</span><br><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np</span><br><span class="line"></span><br><span class="line"><span class="comment">#导入有50个样本的数据集</span></span><br><span class="line">df = pd.read_excel(<span class="string">'raw_org_0.xlsx'</span>)</span><br><span class="line">y = df[<span class="string">'Ads_En'</span>]</span><br><span class="line">data = np.array(df)</span><br><span class="line"></span><br><span class="line">kf = KFold(n_splits=<span class="number">10</span>,shuffle=<span class="literal">True</span>,random_state=<span class="number">10</span>)</span><br><span class="line"><span class="keyword">for</span> n, index <span class="keyword">in</span> enumerate(kf.split(data)):</span><br><span class="line"> print(<span class="string">'-----第{}组测试集索引为:-----'</span>.format(n+<span class="number">1</span>))</span><br><span class="line"> print(index[<span class="number">1</span>])</span><br></pre></td></tr></table></figure>
<blockquote>
<p>第一次运行结果:</p>
</blockquote>
<img src="/2020/10/06/%E6%95%B0%E6%8D%AE%E5%88%86%E5%89%B2%E4%B9%8BKFold-StratifiedKFold-RepeatedKFold/kfr.png" style="zoom:50%;">
<blockquote>
<p>第二次运行结果:</p>
</blockquote>
<img src="/2020/10/06/%E6%95%B0%E6%8D%AE%E5%88%86%E5%89%B2%E4%B9%8BKFold-StratifiedKFold-RepeatedKFold/kfr.png" style="zoom:50%;">
<h3 id="StratifiedKFold"><a href="#StratifiedKFold" class="headerlink" title="StratifiedKFold"></a>StratifiedKFold</h3><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">sklearn</span>.<span class="title">model_selection</span>.<span class="title">StratifiedKFold</span><span class="params">(n_splits=<span class="number">5</span>, *, shuffle=False, random_state=None)</span></span></span><br></pre></td></tr></table></figure>
<p>参数与KFold中的参数相同,唯一不同是“The folds are made by preserving the percentage of samples for each class.” 即划分后的训练集和验证集中类别分布尽量和原数据集一样。</p>
<figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">from</span> sklearn.model_selection <span class="keyword">import</span> KFold</span><br><span class="line"><span class="keyword">from</span> sklearn.model_selection <span class="keyword">import</span> StratifiedKFold</span><br><span class="line"></span><br><span class="line">X = np.array([[<span class="number">10</span>, <span class="number">1</span>], [<span class="number">20</span>, <span class="number">2</span>], [<span class="number">30</span>, <span class="number">3</span>], [<span class="number">40</span>, <span class="number">4</span>], [<span class="number">50</span>,<span class="number">5</span>], [<span class="number">60</span>,<span class="number">6</span>], [<span class="number">70</span>,<span class="number">7</span>],[<span class="number">80</span>,<span class="number">8</span>],[<span class="number">90</span>,<span class="number">9</span>],[<span class="number">100</span>,<span class="number">10</span>],</span><br><span class="line"> [<span class="number">110</span>, <span class="number">1</span>], [<span class="number">120</span>, <span class="number">2</span>], [<span class="number">130</span>, <span class="number">3</span>], [<span class="number">140</span>, <span class="number">4</span>], [<span class="number">150</span>,<span class="number">5</span>], [<span class="number">160</span>,<span class="number">6</span>], [<span class="number">170</span>,<span class="number">7</span>],[<span class="number">180</span>,<span class="number">8</span>],[<span class="number">190</span>,<span class="number">9</span>],[<span class="number">200</span>,<span class="number">10</span>]])</span><br><span class="line"><span class="comment"># 两个类别:2:3</span></span><br><span class="line">Y2 = np.array([<span class="number">1</span>,<span class="number">1</span>,<span class="number">1</span>,<span class="number">1</span>,<span class="number">2</span>,<span class="number">2</span>,<span class="number">2</span>,<span class="number">2</span>,<span class="number">2</span>,<span class="number">2</span>,<span class="number">1</span>,<span class="number">1</span>,<span class="number">1</span>,<span class="number">1</span>,<span class="number">2</span>,<span class="number">2</span>,<span class="number">2</span>,<span class="number">2</span>,<span class="number">2</span>,<span class="number">2</span>])</span><br><span class="line"></span><br><span class="line">kfolds = KFold(n_splits=<span class="number">4</span>, shuffle=<span class="literal">False</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> n, val_idx <span class="keyword">in</span> enumerate(kfolds.split(X, Y2),start=<span class="number">1</span>):</span><br><span class="line"> print(<span class="string">'Y数据比例是2:3,kfold划分测试集{}结果{}'</span>.format(n,Y2[val_idx[<span class="number">1</span>]]))</span><br><span class="line"></span><br><span class="line">print(<span class="string">'------------我是分割线------------'</span>)</span><br><span class="line">skf = StratifiedKFold(n_splits=<span class="number">4</span>, shuffle=<span class="literal">False</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> n, val_idx <span class="keyword">in</span> enumerate(skf.split(X, Y2),start=<span class="number">1</span>):</span><br><span class="line"> print(<span class="string">'Y数据比例是2:3,StratifiedKFold划分测试集{}结果{}'</span>.format(n,Y2[val_idx[<span class="number">1</span>]]))</span><br></pre></td></tr></table></figure>
<img src="/2020/10/06/%E6%95%B0%E6%8D%AE%E5%88%86%E5%89%B2%E4%B9%8BKFold-StratifiedKFold-RepeatedKFold/skf.png" style="zoom:50%;">
<h3 id="RepeatedKFold"><a href="#RepeatedKFold" class="headerlink" title="RepeatedKFold"></a><strong>RepeatedKFold</strong></h3><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">sklearn</span>.<span class="title">model_selection</span>.<span class="title">RepeatedKFold</span><span class="params">(*, n_splits=<span class="number">5</span>, n_repeats=<span class="number">10</span>, random_state=None)</span></span></span><br></pre></td></tr></table></figure>
<p>生成的一定是随机的,只不过是加了重复的次数</p>
]]></content>
<categories>
<category>机器学习</category>
</categories>
</entry>
<entry>
<title>分类分析因素关联性</title>
<url>/2020/09/15/%E5%88%86%E7%B1%BB%E5%88%86%E6%9E%90%E5%9B%A0%E7%B4%A0%E5%85%B3%E8%81%94%E6%80%A7/</url>
<content><![CDATA[<figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="keyword">from</span> sklearn.metrics <span class="keyword">import</span> r2_score</span><br><span class="line"><span class="keyword">from</span> sklearn <span class="keyword">import</span> linear_model</span><br><span class="line"><span class="keyword">import</span> matplotlib.pyplot <span class="keyword">as</span> plt </span><br><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np</span><br><span class="line"><span class="keyword">import</span> pandas <span class="keyword">as</span> pd</span><br><span class="line"><span class="keyword">from</span> pylab <span class="keyword">import</span> *</span><br><span class="line"></span><br><span class="line"><span class="string">'''</span></span><br><span class="line"><span class="string">文件用pandas读入命名为df</span></span><br><span class="line"><span class="string">colume是待分类的一列</span></span><br><span class="line"><span class="string">label是待分类的列表,如我想分析data.csv文件夹下,的ads_ele下的x和Mg不同情况下的时候吸附能与一些变量的关系</span></span><br><span class="line"><span class="string">y是想分析的因变量,如吸附能</span></span><br><span class="line"><span class="string">x是想分析的自变量</span></span><br><span class="line"><span class="string">'''</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">classify_scatter</span><span class="params">(filename,column,y_goal,x_goal,labels)</span>:</span></span><br><span class="line"> plt.figure(figsize=(<span class="number">8.3</span>,<span class="number">6</span>)) </span><br><span class="line"> label_font = {<span class="string">'family'</span>:<span class="string">'Arial'</span>,<span class="string">'weight'</span>:<span class="string">'normal'</span>,<span class="string">'size'</span>:<span class="number">26</span>}</span><br><span class="line"> legend_font = {<span class="string">'family'</span>:<span class="string">'Arial'</span>,<span class="string">'weight'</span>:<span class="string">'normal'</span>,<span class="string">'size'</span>:<span class="number">15</span>}</span><br><span class="line"> plt.rcParams[<span class="string">'xtick.direction'</span>] = <span class="string">'in'</span><span class="comment">#将x周的刻度线方向设置向内</span></span><br><span class="line"> plt.rcParams[<span class="string">'ytick.direction'</span>] = <span class="string">'in'</span><span class="comment">#将y轴的刻度方向设置向内</span></span><br><span class="line"> plt.yticks(fontproperties = <span class="string">'Arial'</span>, size = <span class="number">24</span>)</span><br><span class="line"> plt.xticks(fontproperties = <span class="string">'Arial'</span>, size = <span class="number">20</span>)</span><br><span class="line"> plt.ylabel(y_goal,label_font)</span><br><span class="line"> plt.xlabel(x_goal,label_font)</span><br><span class="line"> minorticks_on()</span><br><span class="line"> tick_params(which=<span class="string">'major'</span>,width=<span class="number">2</span>,length=<span class="number">6</span>)</span><br><span class="line"> tick_params(which=<span class="string">'minor'</span>,width=<span class="number">2</span>,length=<span class="number">4</span>)</span><br><span class="line"> bwith = <span class="number">2</span></span><br><span class="line"> ax=plt.gca()</span><br><span class="line"> ax.spines[<span class="string">'bottom'</span>].set_linewidth(bwith) </span><br><span class="line"> ax.spines[<span class="string">'top'</span>].set_linewidth(bwith)</span><br><span class="line"> ax.spines[<span class="string">'left'</span>].set_linewidth(bwith) </span><br><span class="line"> ax.spines[<span class="string">'right'</span>].set_linewidth(bwith)</span><br><span class="line"></span><br><span class="line"> <span class="keyword">for</span> label <span class="keyword">in</span> labels:</span><br><span class="line"> df = pd.read_excel(filename)</span><br><span class="line"> df = df[df[column] == str(label)]</span><br><span class="line"> y = np.array(df[y_goal]).reshape(<span class="number">-1</span>,<span class="number">1</span>)</span><br><span class="line"> x = np.array(df[x_goal]).reshape(<span class="number">-1</span>,<span class="number">1</span>)</span><br><span class="line"></span><br><span class="line"> linear = linear_model.LinearRegression()</span><br><span class="line"> linear.fit(x, y)</span><br><span class="line"></span><br><span class="line"> y_true = y</span><br><span class="line"> y_pred = linear.predict(x)</span><br><span class="line"> plt.scatter(x, y,label=label+<span class="string">':$R^2$='</span>+str(round(r2_score(y_true,y_pred),<span class="number">3</span>)),s=<span class="number">160</span>,edgecolor=<span class="string">'black'</span>,alpha=<span class="number">0.8</span>)</span><br><span class="line"> x_aixs = np.linspace(np.min(x)<span class="number">-0.1</span>*(np.max(x)-np.min(x)),<span class="number">1.1</span>*np.max(x)+<span class="number">0.3</span>*(np.max(x)-np.min(x)),<span class="number">10</span>, endpoint=<span class="literal">True</span>).reshape(<span class="number">-1</span>,<span class="number">1</span>)</span><br><span class="line"> plt.plot(x_aixs, linear.predict(x_aixs), ls=<span class="string">'dashed'</span>)</span><br><span class="line"> plt.legend(loc=<span class="string">'best'</span>,prop ={<span class="string">'family'</span>:<span class="string">'Arial'</span>,<span class="string">'weight'</span>:<span class="string">'normal'</span>,<span class="string">'size'</span>:<span class="number">14</span>},fancybox=<span class="literal">False</span>,edgecolor=<span class="string">'black'</span>)</span><br><span class="line"> plt.tight_layout()</span><br><span class="line"> plt.savefig(y_goal+<span class="string">' VS. '</span>+x_goal+<span class="string">' sorted by '</span>+column+<span class="string">'.pdf'</span>,dpi=<span class="number">300</span>)</span><br><span class="line"> print(label+<span class="string">'的R2:{}'</span>.format(r2_score(y_true,y_pred)))</span><br><span class="line"></span><br><span class="line">filename = <span class="string">'raw.xlsx'</span></span><br><span class="line"><span class="keyword">for</span> c <span class="keyword">in</span> [<span class="string">'Spacegroup'</span>,<span class="string">'type'</span>,<span class="string">'ads_ele'</span>]:</span><br><span class="line"> column = c</span><br><span class="line"> df = pd.read_excel(filename)</span><br><span class="line"><span class="comment"># 将这一列的所有行分离出来,并删除数据小于5的点</span></span><br><span class="line"> temp = df[column].value_counts()</span><br><span class="line"> labels = temp[temp><span class="number">4</span>].index.tolist()</span><br><span class="line"><span class="comment"># 目标变量和自变量</span></span><br><span class="line"> y_analysis = <span class="string">'Ads_En'</span></span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> [<span class="string">'Bader'</span>,<span class="string">'Workfunction'</span>, <span class="string">'D -0'</span>]:</span><br><span class="line"> x_analysis = i</span><br><span class="line"> classify_scatter(filename,column,y_analysis,x_analysis,labels)</span><br></pre></td></tr></table></figure>
]]></content>
<categories>
<category>常用脚本</category>
</categories>
</entry>
<entry>
<title>python画图配色</title>
<url>/2020/09/11/python%E7%94%BB%E5%9B%BE%E9%85%8D%E8%89%B2/</url>
<content><![CDATA[<p><img src="/2020/09/11/python%E7%94%BB%E5%9B%BE%E9%85%8D%E8%89%B2/1.png" alt></p>
<p><img src="/2020/09/11/python%E7%94%BB%E5%9B%BE%E9%85%8D%E8%89%B2/2.png" alt></p>
<p><img src="/2020/09/11/python%E7%94%BB%E5%9B%BE%E9%85%8D%E8%89%B2/3.png" alt></p>
<p><img src="/2020/09/11/python%E7%94%BB%E5%9B%BE%E9%85%8D%E8%89%B2/4.png" alt></p>
<p><img src="/2020/09/11/python%E7%94%BB%E5%9B%BE%E9%85%8D%E8%89%B2/5.png" alt></p>
<p><img src="/2020/09/11/python%E7%94%BB%E5%9B%BE%E9%85%8D%E8%89%B2/6.png" alt></p>
<p><img src="/2020/09/11/python%E7%94%BB%E5%9B%BE%E9%85%8D%E8%89%B2/7.png" alt></p>
]]></content>
<categories>
<category>python数据分析与机器学习实战-唐宇迪</category>
</categories>
</entry>
<entry>
<title>双电层的建立</title>
<url>/2020/09/08/%E5%8F%8C%E7%94%B5%E5%B1%82%E7%9A%84%E5%BB%BA%E7%AB%8B/</url>
<content><![CDATA[<p>双电层建立的GCS模型</p>
<a id="more"></a>
<p>这篇文章想介绍电化学中一个很优雅的概念,并阐释这个概念如何通过建立模型而不断完善。<br>这个概念叫做:</p>
<blockquote>
<p><strong>双电层(electrical double layer)</strong></p>
</blockquote>
<p>假设,将一个金属片放进电解液中,那么会发生什么呢?或者更科学性的描述是:<strong>在电极与电解液的界面处,物质与电荷的分布状态是怎样的?</strong>下面选自百度百科的一段话:</p>
<blockquote>
<p>在双电层两侧之间,即电子导体相与离子导体之间的电位差就是所谓的电极电位。金属浸入电解质溶液中,金属表面由于晶格畸变能较高使表面金属离子易于和溶液中极性水分子作用而发生水化。如果金属离子的水化能高于金属表面晶格的键能,一些表面金属离子将脱离金属晶格进入溶液,形成水化离子。金属表面晶格的电子由于被水分子电子壳层中的同名电荷排斥,不能随水化反应转入溶液,因此就必然有相当数量的过剩电子在金属表面积累。<br>由于金属表面负电荷的吸引和溶液中正电荷的排斥,进入溶液的水化金属离子不能向溶液深处扩散,而只能滞留在金属表面附近,这就阻碍了表其他金属离子继续溶解。浴液中的部分水化金属离子也可能再沉积到金属表面。当溶解于沉积速度相等的时候,就可以在该处形成一种动态平衡的电荷分布。通常把金属与电解质溶液界面处形成的这种荷电的界面偶层称为双电层。<br>由于双电层的形成,界面处即双电层两侧之间变产生了电位差。</p>
</blockquote>
<h3 id="1-Helmholtz模型"><a href="#1-Helmholtz模型" class="headerlink" title="(1)Helmholtz模型"></a>(1)Helmholtz模型</h3><p>首先,亥姆赫兹(Helmholtz)试图探究这个问题,他建立了一个模型,我们简称其为H模型。<br>H模型的核心思想是:<code>相反的电荷等量分布于界面两侧</code>。这也是“double layer”的由来。</p>
<p><img src="/2020/09/08/%E5%8F%8C%E7%94%B5%E5%B1%82%E7%9A%84%E5%BB%BA%E7%AB%8B/h.png" alt></p>
<p>进而,这个结构可以等效为一个平板电容器,并用如下公式描述单侧的电荷密度(σ)与两层电荷间的电势差(V)的关系,其中,d为正负电荷中心的距离。</p>
<p><img src="/2020/09/08/%E5%8F%8C%E7%94%B5%E5%B1%82%E7%9A%84%E5%BB%BA%E7%AB%8B/formula.png" alt></p>
<p>至此,H模型成功地将将一个电化学的普遍场景抽象为基本公式。</p>
<p>然而,该模型存在一个明显缺陷:由上式可推论出,C是一个恒定值,然而实验观测中,C是一个变量,<strong>相对电位</strong>与<strong>电解液浓度</strong>等都会对其产生影响。</p>
<p>比如,汞电极在NaF电解液中,测得C值如下图所示</p>
<img src="/2020/09/08/%E5%8F%8C%E7%94%B5%E5%B1%82%E7%9A%84%E5%BB%BA%E7%AB%8B/exp.png" style="zoom:80%;">
<p>其中可以看到明显的两个趋势是:</p>
<p>(1)C相对于电位成V型的对称分布;</p>
<p>(2)电解液的浓度越高,C数值越大。</p>
<p>因此,一个良好双电层模型需要解释这两个现象。</p>
<h3 id="2-Gouy-Chapman模型"><a href="#2-Gouy-Chapman模型" class="headerlink" title="(2)Gouy-Chapman模型"></a>(2)Gouy-Chapman模型</h3><p>随后,Gouy和Chapman联手改进了这个模型,我们简称其为G-C模型。G-C模型的核心是引入了一个新的概念:<code>扩散层(diffuse layer)</code></p>
<p>让我们回到电极与电解液的界面处,电荷在电极这一侧是严格分布于其表面。然而,在电解液这一侧却不是这样:由于不同离子间的相互作用,使得很多电荷会扩散到远离界面的体相溶液中。</p>
<p>因此,G-C模型可由下图近似表示,</p>
<p><img src="/2020/09/08/%E5%8F%8C%E7%94%B5%E5%B1%82%E7%9A%84%E5%BB%BA%E7%AB%8B/GC.png" alt></p>
<p>经过G-C模型的改进,原本电容公式中的d就变成了一个变量。</p>
<p>不难想象,当界面两侧电势差较大时,更多的离子会被压缩到靠近电极的位置;当电解液浓度高时,离子也可以在较小的空间上与电极达到电荷平衡。</p>
<p>经过G-C模型的改进,双电层预测NaF的水溶液作为电解液,其电容与电位及浓度关系如下,</p>
<p><img src="/2020/09/08/%E5%8F%8C%E7%94%B5%E5%B1%82%E7%9A%84%E5%BB%BA%E7%AB%8B/gc_curve.png" alt></p>
<p>可见,经过G-C模型的改进,双电层理论对Cd变化有了很好的解释。</p>
<p>然而,G-C模型也是由弊端的:</p>
<p>(1)预测图中,在V型曲线的两端(既电位差极大处),C值趋近于无穷大。而实际测试中,在该处的C值趋向平缓;</p>
<p>(2)预测值远远高于实测值。</p>
<p>综上,我们可以说G-C模型揭示了“部分真理”,但与现实世界仍有较大偏差。</p>
<h3 id="(3)Gouy-Chapman-Stern模型"><a href="#(3)Gouy-Chapman-Stern模型" class="headerlink" title="(3)Gouy-Chapman-Stern模型"></a>(3)Gouy-Chapman-Stern模型</h3><p>G-C模型中,之所以会出现Cd无穷大的预测,是因为电荷被抽象为一个点,这也是物理学中常用的处理方法。</p>
<p>然而,当我们电势差很大时,这些抽象的“点电荷”会被无限压缩到接近电极表面的位置,因此正负电荷的距离d将趋紧于0,从而造成C接近无穷大。</p>
<p>据此,Stern在G-C模型的基础上,加入了一个新的条件:<code>离子是有尺寸的</code></p>
<p>进而,得到下图所示的G-C-S模型。</p>
<p><img src="/2020/09/08/%E5%8F%8C%E7%94%B5%E5%B1%82%E7%9A%84%E5%BB%BA%E7%AB%8B/gcs.png" alt></p>
<p>G-C-S模型中,Stern将较为紧密的内层成为亥姆赫兹层(Helmholtz layer),该层产生的电容!C_H在固定体系中为恒定值,不受电势差的影响。外层仍为扩散层,产生电容C_D。</p>
<p>C_H与C_D为串联,共同组成双电层电容C_d,三者关系为:</p>
<p><img src="/2020/09/08/%E5%8F%8C%E7%94%B5%E5%B1%82%E7%9A%84%E5%BB%BA%E7%AB%8B/gdc_formula.png" alt></p>
<p>由电学知识可知,C_d永远小于C_H与C_D中的较小值。在低电势差时,C_D值很小,C_d主要受其影响,而具有V型的特征。在高电势差时,C_D值很大,而对C_d值的贡献可以忽略不计,C_d趋近于$C_H$值。</p>
<p>至此,G-C-S模型妥善地解决了上文中涉及的问题。然而,事情并没有结束。</p>
<h3 id="4-后续"><a href="#4-后续" class="headerlink" title="(4)后续"></a>(4)后续</h3><p>G-C-S模型中仍然有很多未尽之处,比如:</p>
<p>(1)在实际情况中,电解液中的阴阳离子表面会被溶剂离子包围,电荷的载体是这种“溶剂化离子(solvated ions)”;</p>
<p>(2)在界面处会有吸附现象(adsorption)发生,如果吸附力大于静电力,那么即使是同种电荷也可以稳定处于界面处。</p>
<p>如果考虑这两点,那么,G-C-S模型的改进版将如下图所示,</p>
<p><img src="/2020/09/08/%E5%8F%8C%E7%94%B5%E5%B1%82%E7%9A%84%E5%BB%BA%E7%AB%8B/gcs_revised.png" alt></p>
]]></content>
<categories>
<category>腐蚀科学</category>
</categories>
</entry>
<entry>
<title>财务报销三步</title>
<url>/2020/09/07/%E8%B4%A2%E5%8A%A1%E6%8A%A5%E9%94%80%E4%B8%89%E6%AD%A5/</url>
<content><![CDATA[<p>1.买东西并且所要发票</p>
<p>2.下载科研报销单并且按照要求填写,基金号可以先空着</p>
<p> <a href="财务报销三步/科研报销单.xls">科研报销单.xls</a> </p>
<p>3.去453科研办公室交给进门方向最左边里面的陆静洁老师</p>
]]></content>
</entry>
<entry>
<title>LDA+U</title>
<url>/2020/08/31/LDA-U/</url>
<content><![CDATA[<p>加U体系</p>
<a id="more"></a>
<p>在平均场近似或者说是一般得LDA计算中,能带得自旋分裂是由一个称为Stoner 参数I来主导得,而且平均场近似中认为这个交换分裂能是小于带宽得,一般而言I得数值在LSDA中大概在1eV左右,这样即使对于某些氧化物如 NiO,FeO,MnO等即使能带发生交换分裂,整个体系依然是金属性得,试验观察到得这些氧化物实际上是绝缘体,主要原因在于在这些氧化物中d轨道得能级位置不是由I来决定得,而是Hubbard参数U决定,U也称为On-site Coulomb作用能,相当于把两个电子放在空间同一个位置需要得能量,U数值一般在10eV左右,如此大得分裂能足以将Fermi面附近连续分布得d能级分开,从而得到正确得基态性质,目前广泛采用得LDA+U的算法就是针对某些定域轨道,如d或者f,这些轨道占据存在强烈的在位Coulomb排斥。正是U使得带隙分裂,而不是轨道极化参量I。<br>U计算目前仍然是一个研究热点,最近由人采用线性响应理论,同时结合轨道束缚的DFT计算自洽的求解了部分体系的U参数,在大部分情况下U数值要根据计算结果和试验参数的符合程度而定。<br>LDA+U计算核心思路是:首先将研究体系的轨道分隔成两个子体系(subsystem),其中一部分是一般的DFT算法(如LSDA,GGA)等可以比较准确描述的体系,另外是定域在原子周围的轨道如d或者f轨道,这些轨道在标准的DFT计算下不能获得正确的能量与占据数之间的关系(如DFT总是认为分数占据是能量最小的,而不是整数占据);对于d或者f轨道,能带模型采用Hubbard模型,而其他轨道仍然是按照Kohn-SHam方程求解;d以及f 轨道电子之间的关联能采用一个和轨道占据以及自旋相关的有效U表示;整体计算的时候需要将原来DFT计算过程中已经包含的部分关联能扣除,这部分一般叫 Double Counting part,并且用一个新的U来表示,最终的结果是在DFT计算的基础上新增加一个和d或者f轨道直接相关的分裂势的微扰项,这部分能量可以采用一般微扰理论计算。<br>在CASTEP最新的版本中增加的LDA+U的计算,U参数的设置一般主要是针对过渡金属氧化物(Charge transfer type insulator),包含非满层f轨道的元素等,高温超导体强关联体系。在参数设置方面主要是需要注意d和f轨道,至于s以及p轨道一般不需要设置,当然由文献也报道p轨道的这种关联性。过渡金属氧化物的有效U如下:</p>
<table>
<thead>
<tr>
<th align="center">Species</th>
<th>U</th>
<th>J</th>
<th align="center">U-J(UEff)</th>
</tr>
</thead>
<tbody><tr>
<td align="center">NiO</td>
<td>8.0</td>
<td>0.95</td>
<td align="center">7.1</td>
</tr>
<tr>
<td align="center">CoO</td>
<td>7.8</td>
<td>0.92</td>
<td align="center">6.9</td>
</tr>
<tr>
<td align="center">FeO</td>
<td>6.8</td>
<td>0.89</td>
<td align="center">5.9</td>
</tr>
<tr>
<td align="center">MnO</td>
<td>6.9</td>
<td>0.86</td>
<td align="center">10.3</td>
</tr>
<tr>
<td align="center">VO</td>
<td>6.7</td>
<td>0.81</td>
<td align="center">5.9</td>
</tr>
<tr>
<td align="center">TiO</td>
<td>6.6</td>
<td>0.78</td>
<td align="center">5.8</td>
</tr>
</tbody></table>
<p>Reference: Band theory and Mott insulators: Hubbard U insteat of Stoner I, PRB Vol44 No 3 (1991);<br>3d轨道U和J计算如下所示:主要原理是改变d轨道的占据,在自旋极化的前提下计算不同自旋轨道能量的差值提取U和J,U微Coulomb排斥能,J是交换能,U在所有电子中都存在,不管自旋是否相同,J只存在于自旋相同的电子上。<br>下面给出过渡金属(不包括稀土元素)U和J参数的选取(uint in Ry,1Ry=13.6eV):</p>
<p>3d series:<br>Elements U J<br>V 0.25 0.05<br>Cr 0.26 0.053<br>Mn 0.28 0.055<br>Fe 0.3 0.058<br>Co 0.31 0.059<br>Ni 0.31 0.06<br>4d series:<br>Elements U J<br>Nb 0.19 0.04<br>Mo 0.2 0.04<br>Tc 0.21 0.042<br>Ru 0.22 0.042<br>Rh 0.25 0.044<br>Pd 0.29 0.044<br>5d series:<br>Elements U J<br>Ta 0.19 0.039<br>W 0.20 0.038<br>Re 0.205 0.039<br>Os 0.2 0.039<br>Ir 0.21 0.038<br>Pt 0.215 0.038<br>对于其他过渡金属化合物U一般在5-10eV之间。如在PRB73,134418(2006)这个文献中作者在计算Co掺杂的ZnO时采用的U是6和 8eV。过渡金属的U数值和d电子排列以及价态有关系,因此上面给出的数值只是一个大概的估算数值,具体文献见Physical Review B Vol50,No23,1994.<br>LDA+U 算法主要原创作者是俄罗斯金属研究所的V.I. Anisimov,重要文献有:<br>Corrected atomic limit in the local density approximation and the electronic structure of d impurities in Rb, Phys.Rev.B 50,23 (1994);<br>Band theory and Mott insulators: Hubbard U instead of Stoner I, Phys.Rev.B. 44 No.3 (1991);<br>Materials Studio 4.3版本中也给出了一些元素默认的U数值(实际是Ueff=U-J):</p>
<table>
<thead>
<tr>
<th>Element Name</th>
<th>Atomic number</th>
<th>Angular Momentum</th>
<th>Hubbard U</th>
</tr>
</thead>
<tbody><tr>
<td>Sc</td>
<td>21</td>
<td>d</td>
<td>2.5 eV</td>
</tr>
<tr>
<td>Ti</td>
<td>22</td>
<td>d</td>
<td>2.5 eV</td>
</tr>
<tr>
<td>V</td>
<td>23</td>
<td>d</td>
<td>2.5 eV</td>
</tr>
<tr>
<td>Cr</td>
<td>24</td>
<td>d</td>
<td>2.5 eV</td>
</tr>
<tr>
<td>Mn</td>
<td>25</td>
<td>d</td>
<td>2.5 eV</td>
</tr>
<tr>
<td>Fe</td>
<td>26</td>
<td>d</td>
<td>2.5 eV</td>
</tr>
<tr>
<td>Co</td>
<td>27</td>
<td>d</td>
<td>2.5 eV</td>
</tr>
<tr>
<td>Ni</td>
<td>28</td>
<td>d</td>
<td>2.5 eV</td>
</tr>
<tr>
<td>Cu</td>
<td>29</td>
<td>d</td>
<td>2.5 eV</td>
</tr>
<tr>
<td>Y</td>
<td>39</td>
<td>d</td>
<td>2.0 eV</td>
</tr>
<tr>
<td>Zr</td>
<td>40</td>
<td>d</td>
<td>2.0 eV</td>
</tr>
<tr>
<td>Nb</td>
<td>41</td>
<td>d</td>
<td>2.0 eV</td>
</tr>
<tr>
<td>Mo</td>
<td>42</td>
<td>d</td>
<td>2.0 eV</td>
</tr>
<tr>
<td>Tc</td>
<td>43</td>
<td>d</td>
<td>2.0 eV</td>
</tr>
<tr>
<td>Ru</td>
<td>44</td>
<td>d</td>
<td>2.0 eV</td>
</tr>
<tr>
<td>Rh</td>
<td>45</td>
<td>d</td>
<td>2.0 eV</td>
</tr>
<tr>
<td>Pd</td>
<td>46</td>
<td>d</td>
<td>2.0 eV</td>
</tr>
<tr>
<td>Ag</td>
<td>47</td>
<td>d</td>
<td>2.0 eV</td>
</tr>
<tr>
<td>Cd</td>
<td>48</td>
<td>d</td>
<td>2.0 eV</td>
</tr>
<tr>
<td>La</td>
<td>57</td>
<td>f</td>
<td>6.0 eV</td>
</tr>
<tr>
<td>Ce</td>
<td>58</td>
<td>f</td>
<td>6.0 eV</td>
</tr>
<tr>
<td>Pr</td>
<td>59</td>
<td>f</td>
<td>6.0 eV</td>
</tr>
<tr>
<td>Nd</td>
<td>60</td>
<td>f</td>
<td>6.0 eV</td>
</tr>
<tr>
<td>Pm</td>
<td>61</td>
<td>f</td>
<td>6.0 eV</td>
</tr>
<tr>
<td>Sm</td>
<td>62</td>
<td>f</td>
<td>6.0 eV</td>
</tr>
<tr>
<td>Eu</td>
<td>63</td>
<td>f</td>
<td>6.0 eV</td>
</tr>
<tr>
<td>Gd</td>
<td>64</td>
<td>f</td>
<td>6.0 eV</td>
</tr>
<tr>
<td>Tb</td>
<td>65</td>
<td>f</td>
<td>6.0 eV</td>
</tr>
<tr>
<td>Dy</td>
<td>66</td>
<td>f</td>
<td>6.0 eV</td>
</tr>
<tr>
<td>Ho</td>
<td>67</td>
<td>f</td>
<td>6.0 eV</td>
</tr>
<tr>
<td>Er</td>
<td>68</td>
<td>f</td>
<td>6.0 eV</td>
</tr>
<tr>
<td>Tm</td>
<td>69</td>
<td>f</td>
<td>6.0 eV</td>
</tr>
<tr>
<td>Yb</td>
<td>70</td>
<td>f</td>
<td>6.0 eV</td>
</tr>
<tr>
<td>Fr</td>
<td>87</td>
<td>f</td>
<td>2.0 eV</td>
</tr>
<tr>
<td>Ra</td>
<td>88</td>
<td>f</td>
<td>2.0 eV</td>
</tr>
<tr>
<td>Ac</td>
<td>89</td>
<td>f</td>
<td>2.0 eV</td>
</tr>
<tr>
<td>Th</td>
<td>90</td>
<td>f</td>
<td>2.0 eV</td>
</tr>
<tr>
<td>Pa</td>
<td>91</td>
<td>f</td>
<td>2.0 eV</td>
</tr>
<tr>
<td>U</td>
<td>92</td>
<td>f</td>
<td>2.0 eV</td>
</tr>
<tr>
<td>Np</td>
<td>93</td>
<td>f</td>
<td>2.0 eV</td>
</tr>
<tr>
<td>Pu</td>
<td>94</td>
<td>f</td>
<td>2.0 eV</td>
</tr>
<tr>
<td>Am</td>
<td>95</td>
<td>f</td>
<td>2.0 eV</td>
</tr>
<tr>
<td>Cm</td>
<td>96</td>
<td>f</td>
<td>2.0 eV</td>
</tr>
<tr>
<td>Bk</td>
<td>97</td>
<td>f</td>
<td>2.0 eV</td>
</tr>
<tr>
<td>Cf</td>