1、 前言
Python 学习笔记,记录平时易忘和零碎的细节。本文为知识点的整理~
2、知识点
2.1 python 内置函数
2.2 python 装饰器
2.3 __name__和 __main__
name是一个变量。前后加了双下划线是因为是因为这是系统定义的名字。
1. name就是标识模块的名字的一个系统变量
2. 对于if __name__ == ‘__main__’:这里分两种情况:假如当前模块是主模块(也就是调用其他模块的模块),那么此模块名字就是”main”,通过if判断这样就可以执行”main:”后面的主函数内容。假如此模块是被import的,则此模块名字为文件名字(不加后面的.py),通过if判断这样就会跳过“main:”后面的内容。
3. 通过上面方式,python就可以分清楚哪些是主函数,进入主函数执行;并且可以调用其他模块的各个函数等等。
4. 这里的模块(module)可以是一个类,也可以是一个函数。
2.4 python中__dict__ 属性
dict是一个字典,键是属性名,值为属性值。Python的实例有自己的dict,它对应的类也有自己的dict(除某些没有 dict 属性的对象外)。一个对象的属性查找顺序遵循首先查找实例对象自己,然后是类,接着是类的父类。
参考:http://www.cnblogs.com/duanv/p/5947525.html
2.5 python中 getattr()、setattr()、hasattr() 函数
参考以下代码,就知道这三个函数的基本用法了:
class text():
name = "xiaohua"
t = text()
print getattr(t, "age") # age属性不存在,程序会报错
print getattr(t, "age", setattr(t, "age", "18")) # age属性不存在时,设置该属性
print getattr(t, "age") # 可检测设置成功
print hasattr(t, "age") # True
print t.age # 18
参考:http://www.cnblogs.com/cenyu/p/5713686.html
2.6 python 全局变量、局部变量以及global关键字
global语句用来声明x是全局变量,当我们在函数内给x赋值时,它的改变映射到我们在主块中使用的x的值。用同样的global语句可以指定多个全局变量,比如: global x, y, z。
注意:同名变量在一个函数中要么是局部变量,要么是全局变量,不能搞混。
1. 一旦一个变量在函数中定义,那么该变量就是局部变量。
2. 一个变量在函数外有定义,但是函数中没有定义而直接使用,那么该变量就是全局变量。
3. 一个变量A在函数外有定义,在函数内可以再定义A,这样A在函数内就是局部变量,接下来怎么用都行。
4. 一个变量A在函数外有定义,在函数内先使用变量A,再重新定义变量A,这样就会报错。因为先使用A时认为A是全局变量,再定义A时认为A是局部变量。
2.7 python 类变量和实例变量
参考:http://blog.csdn.net/chenggong2dm/article/details/9030481
类变量:是可在类的所有实例之间共享的值(也就是说,它们不是单独分配给每个实例的)
实例变量:实例化之后,每个实例单独拥有的变量。
class Test(object):
num_of_instance = 0
def __init__(self, name):
self.name = name
Test.num_of_instance += 1
if __name__ == '__main__':
print Test.num_of_instance
t1 = Test('jack')
print Test.num_of_instance
t2 = Test('lucy')
print t1.name , t1.num_of_instance
print t2.name , t2.num_of_instance
2.8 python copy
浅拷贝:
被拷贝对象中的基本属性的拷贝。浅拷贝后还是会存在对象引用情况。可见下图
深拷贝:
如果对象中有其他对象的引用,使用浅拷贝无法完成对象的整个克隆,因为如果使用浅拷贝,只是对象的引用得到的拷贝,而两个引用是指向了同一个对象,对其中一个修改还是会影响到另外一个对象。这时后我们需要引入深拷贝,深拷贝实现起来也比较简单,只需要对对象中的对象再次进行clone操作。
python中deepcopy和copy方法。
http://greybeard.iteye.com/blog/1442259
2.9 python中的 map、filter、reduce 函数
map、filter、reduce 三个函数的参数都是 一个函数和一个可遍历对象。这种能够接受一个函数作为参数的函数叫做「高阶函数」(higher-order function),是来自函数式编程(functional programming)的思想。
参考:http://blog.sina.com.cn/s/blog_45ac0d0a010191rb.html
2.9.1 filter函数
filter函数: filter(function or None, sequence) -> list, tuple, or string
function是一个谓词函数,接受一个参数,返回布尔值True或False。filter函数会对序列参数sequence中的每个元素调用function函数,最后返回的结果包含调用结果为True的元素。
filter函数使用示例1:
def my_function(num):
if 5 < num < 10:
return True
print filter(my_function, [12, 50, 8, 17, 65, 14, 9, 6, 14, 5]) # [8, 9, 6]
filter函数使用示例2:
print filter(lambda num: True if 5 < num < 10 else False , [12, 50, 8, 17, 65, 14, 9, 6, 14, 5]) # [8, 9, 6]
2.9.2 map函数
map函数: map(function, sequence[, sequence, …]) -> list
通过定义可以看到,这个函数的第一个参数是一个函数,剩下的参数是一个或多个序列,返回值是一个集合。function可以理解为是一个一对一或多对一函数,map的作用是以参数序列中的每一个元素调用function函数,返回包含每次function函数返回值的list。示例:
map函数使用示例:
print map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])
print map(lambda x: x + 10, [1, 2, 3, 4]) # [11, 12, 13, 14]
print map(lambda file_name: hdfs_path + self.sep + file_name, file_name_ls)
2.9.3 reduce函数
reduce函数:reduce(function, sequence[, initial]) -> value
function参数是一个有两个参数的函数,且function 函数不能为None,reduce依次从sequence中取一个元素,和上一次调用function的结果做参数再次调用function。第一次调用function时,如果提供initial参数,会以sequence中的第一个元素和initial作为参数调用function,否则会以序列sequence中的前两个元素做参数调用function。
reduce 函数示例:
reduce(lambda x, y: x + y, [2, 3, 4, 5, 6], 1) # 21
reduce(lambda x, y: x + y, [2, 3, 4, 5, 6]) # 20
2.10 python lambda 表达式
匿名函数,函数式编程。参考:https://www.zhihu.com/question/20125256
示例1:
f = lambda x,y,z : x+y+z #:前为输入参数,:后为运行逻辑
print f(1,2,3) #输出:6
示例2:
L = [(lambda x: x ** 2),
(lambda x: x ** 3),
(lambda x: x ** 4)]
print L[0](2), L[1](2), L[2](2) # 12 6 8
示例3: 和map函数一起使用
ls = [1, 2, 3, 4]
print map(lambda x: x + 10, ls) # [11, 12, 13, 14]
2.11 不要在for/while后面写else模块
for…else…/ while…else…结构会在for正常运行完,运行else部分。但是不建议使用。
2.12 合理使用try…finally…/try…except…else…模块
try/finally:无论try是否发生异常,都可以执行finally部分。
try/except/else: 运行try模块时,如果有异常则运行except模块,如果没有异常则运行else模块。
try/except/else/finally:混合使用,在try/except/else基础上,不管有没有异常,都运行finally部分。
2.13 python 中format用法
参考:http://www.jb51.net/article/63672.htm
通过位置取
通过关键字参数
通过对象属性
先通过位置/关键字/对象属性取(指取list类型的数据),再通过下标取。
2.14 单下划线”_”和双下划线”__”区别
”_” 表示方法私有。
”__” 用于避免子类覆盖其内容,表示一个方法只能在一个类的内部使用(因为这个方法底层实现时被重命名了,所以在外部调用不了),且这个方法不能被重写。
参考:http://www.cnblogs.com/coder2012/p/4423356.html
2.15 python 赋值
赋值语句是语言最常见的功能了。但即使是最简单的赋值语句,也可以很有内涵。如:a = 1。整数1为一个对象。而a是一个引用。利用赋值语句,引用a指向对象1。Python是动态类型的语言(参考动态类型),对象与引用分离。Python像使用“筷子”那样,通过引用来接触和翻动真正的食物——对象。
为了检验两个引用指向同一个对象,可以用is关键字判断两个引用所指的对象是否相同。
2.16 python 命名规范
参考:http://www.cnblogs.com/weaming/p/5056492.html
包名、模块名、局部变量名、函数名
全小写+下划线式驼峰
example:this_is_var
全局变量
全大写+下划线式驼峰
example:GLOBAL_VAR
类名
首字母大写式驼峰
example:ClassName()
3、其他参考
http://www.cnblogs.com/coder2012/p/4309999.html
http://stackoverflow.com/questions/9663562/what-is-difference-between-init-and-call-in-python
http://stackoverflow.com/questions/674304/pythons-use-of-new-and-init