Python 学习笔记1 - Go语言中文社区

Python 学习笔记1


1、 前言

Python 学习笔记,记录平时易忘和零碎的细节。本文为知识点的整理~

2、知识点

2.1 python 内置函数

  python 内置函数

2.2 python 装饰器

  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

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/xsdxs/article/details/72082484
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-02-13 15:38:15
  • 阅读 ( 1251 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢