先抛出一个简单python web应用的例子的目录结构:
mysite/
manage.py
mysite/
__init__.py
settings.py
urls.py
wsgi.py
polls/
__init__.py
admin.py
migrations/
__init__.py
0001_initial.py
models.py
static/
polls/
images/
background.gif
style.css
templates/
polls/
detail.html
index.html
results.html
tests.py
urls.py
views.py
templates/
admin/
base_site.html
你可以执行以下import语句引入
- import mysite.polls.tests
- from mysite.polls import urls
- import mysite.pools.views as views
python最大特点也是最核心思想就是: 一切皆对象。
命名空间是名字和对象的映射,可以把一个namespace理解为一个字典。
命名空间的作用:程序在直接访问变量时,会在当前的命名空间内查找,并会从内到外依次访问所有的作用域直到找到。
命名空间可以分为三类:
- 函数的局部命名空间
- 模块的全局命名空间
- 内置命名空间
作用域就是一个Python程序可以直接访问命名空间的区域,可以具体分为以下四个作用域:
- Local(innermost) 最里面的局部作用域
- Enclosing 外层函数的局部作用域
- Global(next-to-last) 模块的全局作用域
- Built-in(outtermost) 包含Python内置对象的最外层作用域
def scope_test():
def do_local():
variable = "local variable"
def do_nonlocal():
nonlocal variable
variable = "nonlocal variable"
def do_global():
global variable
variable = "global variable"
variable = "test variable"
do_local()
print("After local assignment:", variable)
do_nonlocal()
print("After nonlocal assignment:", variable)
do_global()
print("After global assignment:", variable)
scope_test()
print("In global scope:", variable)
模块即一个Python文件.py
包是由一系列模块组成的集合,包中必须至少含有一个__init__.py文件,该文件的内容可以为空,用于标识当前文件夹是一个包。
上面例子包含了三个包:mysite、polls、migrations
Python内置了非常多的模块,大部分是纯Python的,也有一些用C编写的模块。熟练使用这些模块,能帮助你解决日常编程中出现的许多问题,所以大家很有必要熟悉这些标准库模块。
这里简单介绍下以下常用模块的使用方法:
捕获各种异常,并做特殊处理。
>>>import os
>>>os.kill(123, 0)
>>>os.strerror(3)
subprocess模块允许你生成新进程,连接到它们的input/output/error管道,并获取它们的返回代码, 该模块旨在替换几个较旧的模块和功能:os.system、os.spawn*、os.popen*等
>>> import subprocess
>>> subprocess.run(["ls", "-l", "/dev/null"], stdout=subprocess.PIPE)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0, stdout=b'crw-rw-rw- 1 root wheel 3, 2 2 5 17:52 /dev/null\n')
Python程序通过上下文管理能让代码的可读性更强并且错误更少。
from contextlib import contextmanager
@contextmanager
def tag(name):
print("<%s>" % name)
yield
print("</%s>" % name)
with tag("h1"):
print("python")
glob是用来匹配UNIX风格路径名的模块,支持 '*'、'?'、'[]'三种通配符。
$ ls
1.txt 2.txt a1.txt a2.txt b1.txt b2.txt
>>> import glob
>>> glob.glob('./*.txt')
['./a1.txt', './a2.txt', './b2.txt', './2.txt', './b1.txt', './1.txt']
>>> glob.glob('./a?.txt')
['./a1.txt', './a2.txt']
>>> glob.glob('./b?.txt')
['./b2.txt', './b1.txt']
>>> glob.glob('./[0-9].*')
['./2.txt', './1.txt']
>>> glob.glob('./a[0-9].*')
['./a1.txt', './a2.txt']
>>> glob.glob('./b[0-9].*')
['./b2.txt', './b1.txt']
标准运算符作为函数,如求和我们可以使用sum,乘积可结合operator和reduce模块来实现。
>>> import operator
>>> from functools import reduce
>>> reduce(operator.mul, (5, 4, 3, 2, 1))
120
functools模块用于高阶函数,包含了一系列操作其它函数的工具。
>>> from functools import partial
>>> basetwo = partial(int, base=2)
>>> basetwo.__doc__ = '将base 2字符串转换为整数'
>>> basetwo('10010')
18
>>> basetwo('11111')
31
回忆一下之前提到的标准数据类型中包含的:dict, list, set, tuple。
collections模块实现了专门的容器数据类型:
- namedtuple:能创建可以通过属性访问元素内容的扩展元祖。
- deque:一个双端队列,能够在队列两端添加或删除队列元素。
- ChainMap:
- Counter:一个方便、快速计算的计时器工具。
- OrderedDict:Python的dict是无序的,而OrderedDict保证字典健值对的顺序。
- defaultdict:简化了处理不存在键的场景。
- UserDict:
- UserList:
- UserString:
举一个Counter的例子
>>> import collections
>>> words = ['a', 'b', 'a', 'c', 'd', 'c', 'e', 'b']
>>> cnt = collections.Counter(words)
>>> cnt.most_common(5)
[('a', 2), ('b', 2), ('c', 2), ('d', 1), ('e', 1)]
7张Python常见标准库思维导图:
配图来自Twitter:@chengr28







