Python开发笔记

开发中遇到的疑惑,通过自己验证的或在网上找的资料,对问题的理解做一个简单整理。

参数传递

Python中一切皆对象,参数传递是通过传引用的方式。需要注意的是函数如果收到的是一个不可变对象(数字、字符或元组)时,进行赋值操是不会修改原始对象的,而是绑定一个新对象。
在这里插入图片描述
具体可参考文章:https://www.cnblogs.com/ljxh/p/11286748.html

模块和包

模块(Module),是一个Python文件(.py结尾),包含了变量、对象、函数、可执行代码及其他Python语句。
模块分类分为三种:

  • 内置标准模块 (又称标准库)
  • 第三方开源模块(可通过pip install 安装)
  • 自定义模块 (即创建的.py文件,可以在另一个程序里导入)

包(Package),是一个分层次的文件目录结构,简单来说就是个文件夹,用来放置重组好的多个模块,但该文件夹下必须存在__init__.py文件,该文件的内容可以为空,init.py 用于标识当前文件夹是一个包。

模块导入方式

语法说明
import module_nameimport直接导入
import module_name as XXXimport导入模块并设置一个别名
from module_name import class_name, funct_name导入模块中的部分类或函数或变量
from module_name import *导入模块全部内容
import importlib借助importlib模块实现导入以数字开头的模块,例如XXX = importlib.import_module(“module_name”)

包导入方式

语法说明
import package_nameimport直接导入包(仅仅导入__init__.py中的内容)
import package_name.module_name导入包中的某一个模块
import package_name.module_name as XXXimport导入包中的模块并设置一个别名
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 也有一个内置的垃圾收集器,它回收所有未使用的内存,以便它可以用于堆空间。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值