1. 路径os.path.dirname(file) 的使用
¶(1) 当脚本是以完整路径运行,如 python c:/python27/test/test.py
,输出如下:
c:/python27/test/
¶(2)以相对路径运行,如python test.py
,输出为空字符串:
2. 不同路径下导入包的方法[1]
¶(1)相同路径直接按照文件名导入即可
-src
|- t1.py
|- t2.py
例如想在t2中导入t1,直接import t1
即可
¶(2)不同路径
¶子目录
– src
|– t4.py
|– tools
| |– t3.py
|– lib
| |– t2.py
|– t1.py
例如想在t1中导入t2,直接import lib.t2
即可
¶
但是如果想在t2中导入t1和t3,那么先得在环境变量中加入src目录,然后可以直接可以调用t1,(然后python会在lib上当下建一个空文件__init__.py),就可以像第二步调用子目录下的模块一样,通过import tools.t2调用t2了
import sys
sys.path.append("/home/***/***/src")
import t1
import tools.t3
执行完这个代码之后你会发现/src目录霞多了一个__init__.py
关于__init__.py
在python模块的每一个包中,都有一个__init__.py文件(这个文件定义了包的属性和方法)然后是一些模块文件和子目录,假如子目录中也有__init__.py 那么它就是这个包的子包了。当你将一个包作为模块导入(比如从 xml 导入 dom )的时候,实际上导入了它的__init__.py 文件。
一个包是一个带有特殊文件 __init__.py 的目录。__init__.py 文件定义了包的属性和方法。其实它可以什么也不定义;可以只是一个空文件,但是必须存在。如果 __init__.py 不存在,这个目录就仅仅是一个目录,而不是一个包,它就不能被导入或者包含其它的模块和嵌套包。
__init__.py 中还有一个重要的变量,叫做__all__。利用使用 `from lib import *`,他会将所有该包的子模块和子包导入。
3. lambda 表达式
¶通常用法
lambda 表达式是为了避免频繁的单行函数定义,可以实现单行函数的功能。
sum= lambda x,y:x+y
print(sum(1,2)) # 3
¶注意
这里的多行不是顺序执行,而是单独计算
f=lambda x,y:(
x+1,
y+1,
x*y,
)
print(f(1,2))
#输出 (2, 3, 2)
¶特殊函数 [2] [3]
a=[1,2,3,4]
print(list(filter(lambda x: x % 3 == 0, a))) # [3]
print(list(map(lambda x: x * 2 + 10, a))) # [12, 14, 16, 18]
from functools import reduce
print(reduce(lambda x,y: x*y+1, a)) # 41
#计算过程如下:
# 这个式子只有两个参数,没有初始化值,那么就取列表前2项,通过lambda函数计算结果
# 1*2+1=3,
#上面计算的结果在与列表第三个元素通过lambda函数计算
# 3*3+1=10
#上面计算的结果在与列表第四个元素通过lambda函数计算
# 10*4+1=41
print(reduce(lambda x,y: x+y, a,5)) # 15
# 有初始值的情况。5是初始值,也可以理解为第三个参数
# 计算呢过程
# >5+1=6
# >6+2=8
# >8+3=11
# >11+4=15
4. 实现类似matlab效果的列表操作,更新符合条件的元素
a=[1,2,3,4]
a[[idx for idx,value in enumerate(a) if value%2==0]]=a[[idx for idx,value in enumerate(a) if value%2==0]]+1
print(a) # [1,3,3,5]
对于取偶数项,奇数项的操作更简单
a=a[::2] # 奇数项
a=a[1::2] # 偶数项