开发中遇到的疑惑,通过自己验证的或在网上找的资料,对问题的理解做一个简单整理。
参数传递
Python中一切皆对象,参数传递是通过传引用的方式。需要注意的是函数如果收到的是一个不可变对象(数字、字符或元组)时,进行赋值操是不会修改原始对象的,而是绑定一个新对象。
具体可参考文章:https://www.cnblogs.com/ljxh/p/11286748.html
模块和包
模块(Module),是一个Python文件(.py结尾),包含了变量、对象、函数、可执行代码及其他Python语句。
模块分类分为三种:
- 内置标准模块 (又称标准库)
- 第三方开源模块(可通过pip install 安装)
- 自定义模块 (即创建的.py文件,可以在另一个程序里导入)
包(Package),是一个分层次的文件目录结构,简单来说就是个文件夹,用来放置重组好的多个模块,但该文件夹下必须存在__init__.py文件,该文件的内容可以为空,init.py 用于标识当前文件夹是一个包。
模块导入方式
语法 | 说明 |
---|---|
import module_name | import直接导入 |
import module_name as XXX | import导入模块并设置一个别名 |
from module_name import class_name, funct_name | 导入模块中的部分类或函数或变量 |
from module_name import * | 导入模块全部内容 |
import importlib | 借助importlib模块实现导入以数字开头的模块,例如XXX = importlib.import_module(“module_name”) |
包导入方式
语法 | 说明 |
---|---|
import package_name | import直接导入包(仅仅导入__init__.py中的内容) |
import package_name.module_name | 导入包中的某一个模块 |
import package_name.module_name as XXX | import导入包中的模块并设置一个别名 |
from package_name.module_name import class_name, funct_name | 导入包内模块中的部分类或函数或变量 |
from package_name import * | 导入__init__.py中所有内容 |
需要注意的是:
- 使用from导入,会导致相同名称的变量被覆盖,也就是说不同模块的命名空间会在此处重叠。
- 一个模块只会被导入一次,不管你执行了多少次import,这样可以防止导入模块被一遍又一遍地执行。
- 当你导入一个模块,Python 解析器对模块位置的搜索顺序是:当前目录 > PYTHONPATH目录 >
Python默认路径(Linux下,默认路径一般为/usr/local/lib/python) - 模块搜索路径存储在 system 模块的 sys.path 变量中。变量里包含当前目录,PYTHONPATH和由安装过程决定的默认目录。
模块多次导入,全局变量的变化
在同一进程中相同模块的导入,模块中的全局变量都只维护一份。
比如 模块c有一个全局变量,b 导入 c, a 导入b, c, 其中b会修改c中的全局变量。
c.py
v = 0
b.py
import c
def foo():
c.v = c.v + 5
return c.v
a.py
import b
print b.foo()
import c
print c.v
print b.foo()
运行a.py后的结果:
装饰器函数
装饰器函数作为模块中的全局变量只运行一次,返回装饰后的函数。例如我们用装饰器来实现一个单实例:
def singleton(cls):
print "enter..."
_instance = {}
def wrapper(*args, **kwargs):
if cls not in _instance.keys():
_instance[cls] = cls(*args, **kwargs)
return _instance[cls]
return wrapper
@singleton
class Test(object):
pass
print '-' * 30
t1 = Test()
print t1
t2 = Test()
print t2
运行后的结果:
可以看出在没有实例类之前,就已经执行了装饰器函数
生成器与迭代器
首先理清下面几个概念
迭代:是可以通过遍历的方式依次把某个对象中的元素取出的方法,在python中,迭代是通过使用for…in…语句完成的。
可迭代对象:可以被直接作用于for语句的对象都可以被称为可迭代对象(iterable)。比如集合数据类型str,list,tuple,dict,set…) 和 生成器(包括带yield的生成器函数)。
迭代器: 实现了iter(),next()方法的对象。是迭代器的一定是可迭代对象,是可迭代对象的,不一定是迭代器。
生成器:也是用在迭代操作中,其本质可以理解为一个特殊的迭代器,具有和迭代器一样的性质,但是它们在实现方式上不一样。可通过生成器表达式、生成器函数创建。
可参考文章:https://www.cnblogs.com/YMWH/p/16520965.html
Python内存管理
- Python 中的内存管理由 Python 私有堆空间管理。 所有 Python 对象和数据结构都位于私有堆中。 程序员无权访问此私有堆。python 解释器会处理这个问题。
- Python 对象的堆空间分配由 Python 的内存管理器完成。 核心 API 让程序员可以访问一些工具来编写代码。
- Python 也有一个内置的垃圾收集器,它回收所有未使用的内存,以便它可以用于堆空间。