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] # 偶数项

参考文献:


  1. 不同路径下导入包 ↩︎

  2. reduce函数 ↩︎

  3. map\filter\reduce ↩︎