Python进阶分享

本教程面向有其他编程语言基础的Python初学者和有一定基础寻求进阶的Python学习者

一、python字符串处理——新手梦魇之encode、decode

Python2

存在自动转换,字节码(bytes)自动转成字符串(string)。默认按ASCII码解码bytes。提供Unicode类型,效果类似一个中间人,把bytes先解码Unicode码,再指定Unicode字符集下的某个标准,比如一般常用的utf8解码成最终正确的string。可以认为Python2是在string层面进行bytes操作的。

Python3

所读即所得,不会被转换。bytes和string各自独立了

# -*- coding: utf-8 -*-

这个表示这个代码文件中的字符按utf8解释(运行过程中再从外部读入的不算)

reload(sys)

sys.setdefaultencoding('utf-8')

这个表示自动转换时系统按哪种编码解释bytes

例子:

Python2

'a' + 'b' = 'ab'

u'a + u'b' = u'ab'

u'a'+'b'  = u'ab'

Python3

'a' + 'b' = 'ab'

b'a' + b'b' = b'ab'

b'a' + 'b' = TYPE ERROR

b'a' + 'b'.encode('utf8')= b'ab'

b'a' .decode('utf8')+ 'b' = 'ab'

所以认为由于自动转换的存在,按string表示bytes,稍不留意就会把不同的东西都按string合并了,Python2的字符处理可用但是混乱

二、可读性

脚本越写越长如何增加可读性?

按类封装,类名可以长一些,同一项目统一命名。前期先不考虑通用、复用,先把各种循环,代码长度很长的段落塞进类里,对类的复用这件事要随项目边做边改。

谷歌开源项目风格指南——Python命名规范:http://zh-google-styleguide.readthedocs.io/en/latest/google-python-styleguide/python_style_rules/#id16

其实简单地说就是用下划线_取代驼峰,驼峰的话是首字母也要大写的驼峰(也仅用于类、异常)

三、一些黑魔法

class ExampleClass(object):

c= 'in classmethord'

def__init__(self):

self.path= '/var/temp'

self.connect= 'sql_instance'

self.count=1

def loop(self):

self.count+=1

ifself.count<10:

print('in loop:',self.count)

return__class__.loop(self)

@staticmethod

def tool(a):

a+=1

returna

@classmethod

def cm(cls):

returncls.c

if__name__== '__main__':

a=ExampleClass.tool(1)

b=ExampleClass.cm()

print(a)

print(b)

c=ExampleClass()

c.loop()

类的装饰器、关键字:

staticmethod工具类方法,不用访问类内部的其他属性

classmethod不能访问self部分,使用cls关键字调取类属性、方法

self不能访问cls部分,self属性为类私有属性,外部无法访问

__init__表示类在实例化时执行,一般把类一级的静态变量放在里面,本着用不到就不阻塞加载的原则,尤其阻塞读取的那种静态变量,比如分词算法启动时的dict加载

其他黑魔法如在不需要的时候删除内部属性字典,可以提升运行速度。更新__dict__,类和字典互转。eval,exec执行字符串。用多了越写越像C语言这里就不赘述了,记得关键时刻偶尔用一下,有奇效。

四、如何将Python2 代码转换成 Python 3

如果有需要从2转到3的

注意以下几点:

1、使用Python3自带的2to3.py,会自动转换脚本,解决大部分问题。但注意使用后,手工检查还是必要的。(会改乱三目表达式顺序)

2、Python基础库、关键字等,2和3的区别:sorted一个升序一个降序,print有无括号

3、第三方库,Python3现在一般都是有支持的,几年前的老黄历Python3是啥也不支持

4、字符串处理迁移。重点来了!!!先按业务流程把数据流思路理一下,不要encode、decode、强制类型转换啊这些,原代码上直接删删减减,Python2里很多都是冗余的

比如获取bytes——加工bytes——输出bytes

Python2 —— Unicode?—— utf8?——按string加工——输出

Python3 ——获取bytes ——直接加工bytes ——输出bytes

你可能感兴趣的:(Python进阶分享)