@@ -1429,7 +1429,7 @@ <h2 id="map-filter-reduce">map/filter/reduce</h2>
1429
1429
< div class ="text_cell_render border-box-sizing rendered_html ">
1430
1430
< h2 id ="map-filter-for- "> map/filter,列表推导式和for循环的比较</ h2 >
1431
1431
< p > 三者都可以完成对list操作的特定功能,例如筛选出其中某些值,将其中的值转换为另一个值。但是三者在便利程度和使用细节上略有不同。</ p >
1432
- < p > map/filter和列表推导式比较间断 ,适用于相对不是很复杂的情况。真正复杂的情况需要用for来展开。</ p >
1432
+ < p > map/filter和列表推导式比较简短 ,适用于相对不是很复杂的情况。真正复杂的情况需要用for来展开。</ p >
1433
1433
< p > map/filter和列表推导式基本假定是“运算不彼此干扰”。即运算某个元素时,不受到其他元素的影响。for没有这一假定,某元素运算时可以受到另一个元素影响。</ p >
1434
1434
< p > 一般来说列表推导式比map/filter更简洁一些,因为map/filter需要定义lambda。但是在已经拥有现成函数的前提下,map/filter更加方便一些。</ p >
1435
1435
</ div >
@@ -4623,7 +4623,7 @@ <h2 id="-">命名规则</h2>
4623
4623
< div class ="inner_cell ">
4624
4624
< div class ="text_cell_render border-box-sizing rendered_html ">
4625
4625
< ul >
4626
- < li > 函数名建议全小写。如果有助于阅读,可以用 < em > 。如果和关键字冲突,一般会改个名字或者在后面加 </ em > 。</ li >
4626
+ < li > 函数名建议全小写。如果有助于阅读,可以用_ 。如果和关键字冲突,一般会改个名字或者在后面加_ 。</ li >
4627
4627
< li > 内部使用的全局变量名规则同函数名。</ li >
4628
4628
< li > 始终用self来指代对象本身,使用cls来指代类本身。</ li >
4629
4629
< li > 常量始终全大写。</ li >
@@ -5483,8 +5483,171 @@ <h2 id="-">其他编辑器</h2>
5483
5483
</ ul >
5484
5484
</ div >
5485
5485
</ div >
5486
+ </ div > </ section >
5487
+ </ section > < section >
5488
+ < section >
5489
+
5490
+ < div class ="cell border-box-sizing text_cell rendered ">
5491
+ < div class ="prompt input_prompt ">
5492
+ </ div >
5493
+ < div class ="inner_cell ">
5494
+ < div class ="text_cell_render border-box-sizing rendered_html ">
5495
+ < h1 id ="2-3- "> 2/3兼容技巧</ h1 >
5496
+ < p > 3基本下行兼容2,2不兼容3。所以2/3兼容的基本思想就是遵循3的编写规范,同时兼顾2。</ p >
5497
+ </ div >
5498
+ </ div >
5499
+ </ div > </ section > < section >
5500
+
5501
+ < div class ="cell border-box-sizing text_cell rendered ">
5502
+ < div class ="prompt input_prompt ">
5503
+ </ div >
5504
+ < div class ="inner_cell ">
5505
+ < div class ="text_cell_render border-box-sizing rendered_html ">
5506
+ < h2 id ="- "> 基本兼容性技巧</ h2 >
5507
+ < p > 在Python文件的开始,增加以下内容(注意按照pep-8,应该放在什么位置):</ p >
5508
+ </ div >
5509
+ </ div >
5510
+ </ div >
5511
+ < div class ="cell border-box-sizing code_cell rendered ">
5512
+ < div class ="input ">
5513
+ < div class ="prompt input_prompt "> In [1]:</ div >
5514
+ < div class ="inner_cell ">
5515
+ < div class ="input_area ">
5516
+ < div class ="highlight "> < pre > < span > </ span > < span class ="kn "> from</ span > < span class ="nn "> __future__</ span > < span class ="kn "> import</ span > < span class ="n "> absolute_import</ span > < span class ="p "> ,</ span > < span class ="n "> division</ span > < span class ="p "> ,</ span > < span class ="n "> print_function</ span > < span class ="p "> ,</ span > < span class ="n "> unicode_literals</ span >
5517
+ </ pre > </ div >
5518
+
5519
+ </ div >
5520
+ </ div >
5521
+ </ div >
5522
+
5523
+ </ div >
5524
+ < div class ="cell border-box-sizing text_cell rendered ">
5525
+ < div class ="prompt input_prompt ">
5526
+ </ div >
5527
+ < div class ="inner_cell ">
5528
+ < div class ="text_cell_render border-box-sizing rendered_html ">
5529
+ < p > 这会改变几个关键性的兼容性标志。主要是print变为函数,string变为unicode。</ p >
5530
+ </ div >
5531
+ </ div >
5486
5532
</ div > </ section > < section >
5487
5533
5534
+ < div class ="cell border-box-sizing text_cell rendered ">
5535
+ < div class ="prompt input_prompt ">
5536
+ </ div >
5537
+ < div class ="inner_cell ">
5538
+ < div class ="text_cell_render border-box-sizing rendered_html ">
5539
+ < h2 id ="- "> 编码</ h2 >
5540
+ < p > 虽然future技巧修正了内嵌字符串,但是对于str和unicode对象而言,并没有什么变化。因此建议在需要的头部如此定义:</ p >
5541
+ </ div >
5542
+ </ div >
5543
+ </ div >
5544
+ < div class ="cell border-box-sizing code_cell rendered ">
5545
+ < div class ="input ">
5546
+ < div class ="prompt input_prompt "> In [2]:</ div >
5547
+ < div class ="inner_cell ">
5548
+ < div class ="input_area ">
5549
+ < div class ="highlight "> < pre > < span > </ span > < span class ="k "> if</ span > < span class ="n "> sys</ span > < span class ="o "> .</ span > < span class ="n "> version_info</ span > < span class ="o "> .</ span > < span class ="n "> major</ span > < span class ="o "> ==</ span > < span class ="mi "> 3</ span > < span class ="p "> :</ span >
5550
+ < span class ="nb "> unicode</ span > < span class ="o "> =</ span > < span class ="nb "> str</ span >
5551
+ < span class ="k "> else</ span > < span class ="p "> :</ span >
5552
+ < span class ="nb "> bytes</ span > < span class ="o "> =</ span > < span class ="nb "> str</ span >
5553
+ </ pre > </ div >
5554
+
5555
+ </ div >
5556
+ </ div >
5557
+ </ div >
5558
+
5559
+ </ div >
5560
+ < div class ="cell border-box-sizing text_cell rendered ">
5561
+ < div class ="prompt input_prompt ">
5562
+ </ div >
5563
+ < div class ="inner_cell ">
5564
+ < div class ="text_cell_render border-box-sizing rendered_html ">
5565
+ < p > Python2中定义str为裸数据,unicode为字符串,bytes没有定义。Python3中定义bytes为裸数据,str为unicode字符串,unicode没有定义。在如此定义后,可以在2/3中,统一使用bytes表示裸数据,用unicode表示字符串。</ p >
5566
+ </ div >
5567
+ </ div >
5568
+ </ div > </ section > < section >
5569
+
5570
+ < div class ="cell border-box-sizing text_cell rendered ">
5571
+ < div class ="prompt input_prompt ">
5572
+ </ div >
5573
+ < div class ="inner_cell ">
5574
+ < div class ="text_cell_render border-box-sizing rendered_html ">
5575
+ < p > 同时,在代码中,应该对所有试图表现裸数据语义的代码内嵌字符串对象,加b前缀。对所有试图表达字符串语义的代码内嵌字符串对象,加u前缀。</ p >
5576
+ </ div >
5577
+ </ div >
5578
+ </ div >
5579
+ < div class ="cell border-box-sizing code_cell rendered ">
5580
+ < div class ="input ">
5581
+ < div class ="prompt input_prompt "> In [3]:</ div >
5582
+ < div class ="inner_cell ">
5583
+ < div class ="input_area ">
5584
+ < div class ="highlight "> < pre > < span > </ span > < span class ="k "> print</ span > < span class ="p "> (</ span > < span class ="s1 "> 'hello, world'</ span > < span class ="p "> )</ span >
5585
+ < span class ="k "> print</ span > < span class ="p "> (</ span > < span class ="s1 "> u'hello, world'</ span > < span class ="p "> )</ span >
5586
+ </ pre > </ div >
5587
+
5588
+ </ div >
5589
+ </ div >
5590
+ </ div >
5591
+
5592
+ < div class ="output_wrapper ">
5593
+ < div class ="output ">
5594
+
5595
+
5596
+ < div class ="output_area "> < div class ="prompt "> </ div >
5597
+ < div class ="output_subarea output_stream output_stdout output_text ">
5598
+ < pre >
5599
+ hello, world
5600
+ hello, world
5601
+
5602
+ </ pre >
5603
+ </ div >
5604
+ </ div >
5605
+
5606
+ </ div >
5607
+ </ div >
5608
+
5609
+ </ div >
5610
+ < div class ="cell border-box-sizing text_cell rendered ">
5611
+ < div class ="prompt input_prompt ">
5612
+ </ div >
5613
+ < div class ="inner_cell ">
5614
+ < div class ="text_cell_render border-box-sizing rendered_html ">
5615
+ < p > 原则上,应对所有内嵌字符串对象都添加b或u前缀,以明确代码中的每一处内嵌字符串的语义。但是实际上这会大大增加工作量,而且工程实践上并没有特别大的优势。因此往往有所折衷,只在需要澄清的地方增加前缀。其他地方可以含混带过,等需要时再修改。</ p >
5616
+ < p > 但是要注意到,项目越大,往往越难于根据后果追查出是哪个含混带过造成的问题。这里需要小心取舍。</ p >
5617
+ </ div >
5618
+ </ div >
5619
+ </ div > </ section > < section >
5620
+
5621
+ < div class ="cell border-box-sizing text_cell rendered ">
5622
+ < div class ="prompt input_prompt ">
5623
+ </ div >
5624
+ < div class ="inner_cell ">
5625
+ < div class ="text_cell_render border-box-sizing rendered_html ">
5626
+ < h2 id ="io "> IO</ h2 >
5627
+ < p > Python3下文件打开时要注意是打开为二进制,还是打开为文本。即打开时的b标志位,决定了读写时应使用裸数据还是字符串。如果使用文本方式打开,还需注意编码。</ p >
5628
+ < p > Python2下没有encoding参数,因此出于兼容考虑,建议使用codecs.open。这个调用在Python2/3下的语义是一致的。</ p >
5629
+ </ div >
5630
+ </ div >
5631
+ </ div > </ section > < section >
5632
+
5633
+ < div class ="cell border-box-sizing text_cell rendered ">
5634
+ < div class ="prompt input_prompt ">
5635
+ </ div >
5636
+ < div class ="inner_cell ">
5637
+ < div class ="text_cell_render border-box-sizing rendered_html ">
5638
+ < h2 id ="- "> 其余细节</ h2 >
5639
+ < ul >
5640
+ < li > 将xrange改为range。当然,作为代价,在python2下,range的效率很有问题。</ li >
5641
+ < li > urllib.quote和unquote改为了urllib.parse.quote和unquote。</ li >
5642
+ < li > 某些库,在python2和python3下行为不一致,例如csv。对于这些库,尽量不要折腾兼容性。直接针对Python2/3做两种不同代码更方便。</ li >
5643
+ < li > 使用next(it)而不是it.next()。</ li >
5644
+ </ ul >
5645
+ </ div >
5646
+ </ div >
5647
+ </ div > </ section >
5648
+ </ section > < section >
5649
+ < section >
5650
+
5488
5651
< div class ="cell border-box-sizing text_cell rendered ">
5489
5652
< div class ="prompt input_prompt ">
5490
5653
</ div >
0 commit comments