《改善Python程序的91个建议》学习笔记 8—18

# !/usr/bin/python3
# -*- coding: utf-8 -*-
# @Time    : 2019/6/18 22:33
from __future__ import unicode_literals

import time

"""
建议8:利用assert来发现问题
"""
# assert语法
a = 1
# 断言`a != 1`, 抛出异常`sss`
# assert a != 1, 'sss'

# 不要滥用断言
# 如果python本身的异常能够处理,就不要用断言
# 不要使用断言来检查用户输入
# 当对函数返回值的合理性进行检查时,可进行断言
# 当条件是业务逻辑继续进行的先决条件时,可进行断言

"""
建议9:数据交换的时候,不推荐使用中间变量
"""
c = 1
b = 2
print('c:', c, 'b:', b)
c, b = b, c
print('c:', c, 'b:', b)

"""
建议10、充分利用Lazy evaluation的特性
"""
# 1、避免不必要的计算,带来性能上的提升
# 在一个表达式中有or、and时,将or放到前面
# 2、节省空间,使得无限循环的数据结构成为可能

"""
建议11、理解枚举替代实现的缺陷
"""


# 枚举的实现方式有
# 1、使用类属性
class Seasons(object):
    Spring = 0
    Summer = 1
    Autumn = 3
    Winter = 4


# 简化上面的例子
class Seasons(object):
    Spring, Summer, Autumn, Winter = range(4)


print(Seasons.Spring)


# 2、借助函数
def enum(*args):
    return type('Enum', (object,), dict(zip(args, range(len(args)))))


Seasons = enum('Spring', 'Summer', 'Autumn', 'Winter')
print(Seasons.Spring)
# 3、使用collections.namedtuple
import collections

Seasons = collections.namedtuple('Seasons', 'Spring Summer Autumn Winter')._make(range(4))
print(Seasons.Summer)

"""
建议12、不推荐使用type来进行类型检查
"""

# 使用isinstance来判断类型
u = 1
if isinstance(u, int):
    print('{u} type is int.'.format(u=u))

"""
建议13、尽量转换为浮点类型后再在做除法
"""
# 编译器会进行强制类型转换

"""
建议14、警惕eval()的安全漏洞
"""
b = None
# 输出结果为`s`
print(eval('"s" if b is None else "xxx"'))

"""
建议15、使用enumerate获取迭代器的索引和值
"""

li = [i for i in 'abcde']
for index, element in enumerate(li):
    print('index:{index},element:{element}'.format(index=index, element=element))

# 使用下面的语句会更好简单
[print('index:{index},element:{element}'.format(index=s[0], element=s[1])) for s in enumerate(li)]

"""
建议16、分清`==`与`is`的适用场景
"""
# 1、is是比较的内存地址
# 2、==是比较两个对象的值、内部调用了__eq__()

"""
建议17、考虑兼容性、尽可能使用unicode
"""
# 1、python的内建字符串有两种:str和unicode、它们的基类都是basestring
# 2、unicode字符串为不同语言设置了唯一的二进制表示形式
# 3、对于编码格式不一致的数据,先解码为unicode、后进行编码
file_name = open('test.txt', 'r', encoding='utf-8')
print(file_name.read().encode('utf-8').decode('utf-8'))
file_name.close()
#               编码参数        错误处理
# str.encode(encoding='utf-8', errors='strict')
# str.decode(encoding='utf-8', errors='strict')
# errors的值有:
# `strict`默认为严格的处理方式,编码错误时,会抛出异常
# `ignore`,忽略不可转换的字符
# `replace`,将不可转换的字符,用?的值代替
import sys

# 获取Python中默认编码方式
print(sys.getdefaultencoding())
# 编码申明
# !/usr/bin/python3
# -*- coding: utf-8 -*-

"""
建议18、构建合理的包层次来管理model
"""
# 1、直接导入包 import package
# 2、使用from package import model
# 3、使用__all__ = []来限定导入

你可能感兴趣的:(笔记)