赞
踩
python弊端:没有声明语句
a=1 #如果没有a=1也不会出错,global a相当于在外面声明一个a
def func_out():
global a #说明要修改外面的a
a=a+1
print(a) #2
func_out()
print(a) #2
改为:
def func_out():
c=a
c=c+1
print(c)
闭包——函数内嵌
用到非常多,大多用于安全(加密)
如果b函数有父函数a函数,B想用A的变量a,使用nonlocal声明a(尽量不要用)
闭包用不好,不如不用,下面是典型用不好闭包的例子,按理说用完func_in()就会被回收,但a是外部变量也被回收掉了,会出现问题,一定要切记使用的闭包要与外部断了联系:
a=1 #全局变量(函数外部)
def func_out(): #全局函数,全局的运行完程序才会被回收
a=2
def func_in(): #闭包,局部函数,调用时出现,不调用时就相当于没有过
nonlocal a
print(a)
return func_in
func_out()()
用完a让a=None或者直接用拷贝的值,一定要return,不然会把闭包封死在函数里,而闭包应让外部也使用
内置函数
# lambda函数有自己的作用域
def makeAction():
acts=[]
for i in range(5):
# i=0,1,2,3,4
acts.append((lambda x,j=i:j**x))
return acts
fs=makeAction()
res01=fs[0](3)
print(res01)
查看系统内置函数:print(dir(builtins))
from functools import reduce
arr=[2,4,6]
res01=reduce(lambda x,y:str(x)+str(y),arr)
print(res01) #246
arr=('张晓明','张三丰','王重阳','李娟')
res=filter(lambda s:s[0]=='张' and len(s)==2,arr)
print(list(res))
users=[
{'id':'008','user_name':'admin','user_password':'888','type':0},
{'id':'002','user_name':'joke','user_password':'777','type':1},
{'id':'001','user_name':'nose','user_password':'777','type':1}
]
res=sorted(users,key=lambda user:user['id'],reverse=True)
print(res)
模块
介绍
Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句。
模块让你能够有逻辑地组织你的 Python 代码段,把相关的代码分配到一个模块里能让你的代码更好用,更易懂。
模块能定义函数,类和变量,模块里也能包含可执行的代码。模块可以被别的程序引入,以使用该模块中的函数等功能。
import
import如何工作:一个模块只会被导入一次,不管你执行了多少次import。这样可以防止导入模块被一遍又一遍地执行。
module_a.py
#!/Users/lzhan/Lzhan/python/project/unit1
# -*- coding: UTF-8 -*-
def add(a,b):
return a+b
version='1.0'
print('add is end')
# print __name__=="__main__" # 结果为false
main.py
# -*- coding:UTF-8 -*-
# 第一种应用方式
# import module_a
# print module_a.add(10,20)
# dir(module_a) # get list of attributes for sys module
# 第二种调用方式
from module_a import add,version
print (add(10,20))
print (version)
print( __name__=='__main__')
补充:
#!/Users/lzhan/Lzhan/python/project/unit1 # -*- coding: UTF-8 -*- import sys print 'test import and arguments' for i in sys.argv: print(i) print (__name__=="__main__") print( 'end') print (__name__) #表示当前文件的文件名字 print( sys.path) print (dir())
当导入包文件夹的情况下,多级目录使用.作为分隔符,使用模块的时候,也要全部引入
import dir01.dir02.moudule
#调用模块中的内容
dir01.dir02.moudule.func()
或者
import dir01.dir02.moudule as m
m.func()
from xx import *
from module_a import add,version
搜索路径
当你导入一个模块,Python 解析器对模块位置的搜索顺序是:
import sys
print(list(sys.path))
#手动添加目录
sys.path.append('c:\\python\\modules')
sys.path.append('c:/python/modules')
在python安装路径的site-packages目录下修建了PckPath.pth文件
/Users/lzhan/AI/python/project_modules/modules
模块搜索路径存储在 system 模块的 sys.path 变量中。变量里包含当前目录,PYTHONPATH和由安装过程决定的默认目录。
globals() 和 locals() 函数
根据调用地方的不同,globals() 和 locals() 函数可被用来返回全局和局部命名空间里的名字。
如果在函数内部调用 locals(),返回的是所有能在该函数里访问的命名。
如果在函数内部调用 globals(),返回的是所有在该函数里能访问的全局名字。
两个函数的返回类型都是字典。所以名字们能用 keys() 函数摘取。
编译
当文件导入时,就会进行编译。因此、通常不会看到程序顶层文件的.pyc字节码文件。除非这个文件也被其他文件导入:只有被导入的文件才会留下字节码文件。顶层文件的字节码是在内部使用后就丢弃了。
执行
和def一样,import和form是可执行语句,而不是在编译期间的声明。直到python执行到这些语句时,才会进行解析。
distutils
Distutils可以用来在Python环境中构建和安装额外的模块。新的模块可以是纯Python的,也可以是用C/C++写的扩展模块,或者可以是Python包,包中包含了由C和Python编写的模块。
from
from会把模块中的变量复制到另一个作用域,所以顶层文件中就可以直接使用该变量了。
import modulea
from modulea import * #等价
from语句智能用在模块文件的顶部,不能放在函数中。
所以下面代码是等价的
from module import name1,name2
#等价于
import module
name1=module.name1
name2=module.name2
del module
from语句有破坏命名空间的潜质!!
查看模块命名空间
import public_var as p
print(p.__dict__)
print(dir(p))
reload() 函数
当一个模块被导入到一个脚本,模块顶层部分的代码只会被执行一次。
因此,如果你想重新执行模块里顶层部分的代码,可以用 reload() 函数。该函数会重新导入之前导入过的模块。语法如下:
import public_var as p
from importlib import reload
print(p.urls['first'])
p.urls['first']='baidu.com'
print(p.urls['first'])
reload(p)
print(p.urls['first'])
Python中的包:在保重隐藏数据
import modules.public_var
from modules.public_var import *
包是一个分层次的文件目录结构,它定义了一个由模块及子包,和子包下的子包等组成的 Python 的应用环境。
简单来说,包就是文件夹,但该文件夹下必须存在 init.py 文件, 该文件的内容可以为空。init.py 用于标识当前文件夹是一个包。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。