Python的知识点回顾


=Start=

周末北京雾霾,没有出门,宅在家里把《编写高质量代码:改善Python程序的91个建议》这本书看了一遍,结合之前看的《Python高手之路》,回顾了一下Python中的知识点,在此记录一下:

什么样的代码才够Pythonic?

这是很难定义的。而且对于Pythonic的概念,不同的人有不同的看法。但以下几个方面还是值得参考的:

  1. 代码应充分体现Python自身的风格(看起来像伪码般清晰易懂);
  2. 对Python语法有充分理解,熟悉常见的idioms,但不应当为了使用而使用;
  3. 对Python标准库有充分的理解,特别是内置函数和内置数据类型;
  4. 学习Python不同版本提供的新特性,以及掌握它的变化趋势;
  5. 学习公认的Pythonic风格的代码,比如:Flask、requests等;

代码规范

使用类似于 PEP8 这样的代码规范/风格检测工具帮助学习:代码布局、注释、命名规范等方面的要求。


构建合理的包层次来管理module

本质上每一个Python文件都是一个模块,使用模块可以增强代码的可维护性和可重用性。但显然在大的项目中将所有的Python文件都放在一个目录下并不是一个值得推荐的做法,我们需要合理的组织项目的层次来管理模块,这就是包(package)发挥功效的地方了。

什么是包(package)呢?简单来说,包(package)即目录,但与普通目录不同,它除了包含常规的Python文件以外,还包含一个 __init__.py 文件,同时它允许嵌套。比如:

Package/__init__.py
    Module1.py
    Module2.py
    Subpackage/__init__.py
        Module1.py
        Module2.py

包中的模块可以通过“.”访问符进行访问,即“包名.模块名”。比如:

import Package
from Package import Module1
from Package import Subpackage
import Package.Subpackage
from Package.Subpackage import Module1

列表解析/推导式(list comprehension)

1.代码量更少,简洁、直观清晰;

2.列表解析的效率更高(但对于大数据的处理,列表解析不是一个最佳选择,过多的内存消耗可能会导致 MemoryError ,这时还是推荐使用传统的循环进行处理);


Python性能优化的小tips

减少函数调用

==

性能: 列表解析 > for 循环 > while 循环
遍历list时,列表解析性能最优,while循环最差(需要一个外部计数器)

==

处理大数据时,尽可能使用不可变数据类型,更快 —— tuple > list

==

尽可能的创建生成器和使用yield,因为这相对于常规序列实现方式,性能更优

==

使用局部变量
局部变量性能优于全局变量,内建变量及属性查找(LEGB)

==

使用后用del删除无用对象


创建大文件的技巧
with open('large.txt', 'wb') as fp:
    fp.seek(1073741824-1)
    fp.write('\0')

Python中的新式类和古典类
'''
Python中一切皆对象:字符是对象,列表是对象,内建类型(built-in type)也是对象;用户定义的类型是对象,object是对象,type也是对象。
自 Python 2.2 之后,为了弥补内建类型(built-in type)和古典类(classic classes)之间的鸿沟引入了新式类(new-style classes)。在新式类中,object是所有内建类型的基类,用户所定义的类可以继承自object也可继承自内建类型。

鸿沟:类和类型并不统一;
比如上面的 a 是古典类Class A的一个实例,那么 a.__class__ 返回 __main__.A ,type(a)返回<type 'instance'>
b 是新式类Class B的一个实例,那么 b.__class__ 返回 <class '__main__.B'> ,type(b)返回<class '__main__.B'>
'''

class A:
	pass

class B(object):
	pass

# class C(type):
# 	pass

class D(dict):
	pass

a = A()
b = B()
# c = C()
d = D()
print type(A), type(B), type(D)	#<type 'classobj'> <type 'type'> <type 'type'>
print type(a), type(b), type(d)	#<type 'instance'> <class '__main__.B'> <class '__main__.D'>

print a.__class__, isinstance(a, object), isinstance(a, type)	#__main__.A True False
print b.__class__, isinstance(b, object), isinstance(b, type)	#<class '__main__.B'> True False
# print c.__class__, isinstance(c, object), isinstance(c, type)
print d.__class__, isinstance(d, object), isinstance(d, type)	#<class '__main__.D'> True False

Python中的「空」数据
  • 常量 None
  • 常量 False
  • 任何形式的数值类型零,如 0/0L/0.0/0j
  • 空的序列,如 ”/()/[]
  • 空的字典,如 {}
  • 当用户定义的类中定义了 nonzero() 方法和 len() 方法,并且该方法返回整数0或者布尔值False的时候。

其中常量 None 的特殊性体现在它既不是 0、False,也不是空字符串,它就是一个空值对象。其数据类型为 NoneType,遵循单例模式,是唯一的,因而不能创建 None 对象。所有赋值为None的变量都相等,并且None与任何其他非None的对象的比较结果都为False。


Python中时间戳字符串的大小比较

datetime对象自身就支持用「>/<」操作符进行比较操作

参考:How to compare two dates?

Python中将字符串转换成datetime对象的方法

datetime.datetime.strptime

>>> from datetime import datetime as dt
>>> a = dt.strptime("10/12/13", "%m/%d/%y")
>>> b = dt.strptime("10/15/13", "%m/%d/%y")
>>> a > b
False
>>> a < b
True
>>>

Python中的多行字符串
multi_line_str = """line one
             line two
             line three"""

joined_line_str = ("this is an "
            "implicitly joined "
            "string")
Python中多行字符串的格式化

搜索关键字:python multi line string format

'''line {0}
line {1}
line {2}'''.format(1,2,3)

args = (1,2,3)
'''line {0}
line {1}
line {2}'''.format(*args)

kwargs = {'arg1':1, 'arg2':2, 'arg3':3}
'''line {arg1}
line {arg2}
line {arg3}'''.format(**kwargs)

=EOF=

,

《 “Python的知识点回顾” 》 有 3 条评论

  1. Python 字符串格式化 str.format 简介
    http://kuanghy.github.io/2016/11/25/python-str-format
    Python字符串格式化
    http://gohom.win/2015/09/13/PyStringFormat/
    `
    ”.format()的格式限定符
    首先将格式化限定式写在{}内,:作为格式化标识开始。同样支持 [flags][width].[precision]typecode 格式化表达式,其中左中右对齐和format函数一样, 使用

    In [7]: ‘{:_<8.4f}'.format(6.4)
    Out[7]: '6.4000__'

    In [8]: '{0:_<8.4f}'.format(6.4)
    Out[8]: '6.4000__'

    In [9]: '{0:8.4f}’.format(6.4)
    Out[10]: ‘ 6.4000’

    In [11]: ‘{0:_>8.4f}’.format(6.4)
    Out[11]: ‘__6.4000’
    `

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注