Python读书笔记

标签:无 2172人阅读 评论(2)
分类:

二次阅读《Python基础教程》的一点点笔记

  1. 整除运算符 双斜线

  2. 幂运算符比取反(一元减法运算符)优先级高

  3. !#/usr/bin/env python

  4. 拼接字符串,可以一个接着另一个的方式写两个字符串,Python会自动拼接他们

  5. repr函数,以合法的Python表达式的形式来表示值;repr(x)也可以写作`x`(`是反引号)

  6. 如果一行之中最后一个字符是反斜线,那么换行符本身就被转义了,也就是忽略了

  7. 原始字符串中:需要像平常一样对引号进行转义;不能在原始字符串结尾输入反斜线

  8. 序列(包括列表、元组、字符串、Unicode字符串、buffer对象、xrange对象)操作:索引、分片、加、乘、in操作、len、max、min;其中负数作为步长的时候必须起点大于结束点

  9. 创建长度为10的列表,元素内容为空 P32

  10. list函数 P34

  11. 通过分片赋值来插入元素和删除元素P35

  12. count方法P36页

  13. extend方法修改了被扩展的序列;而原始的连接操作会返回一个全新的列表

  14. 复制列表的最有效方法是调用x[:];这是深拷贝,不是让两个指向同一个列表

  15. 元组与括弧P41、P42

  16. 字符串都是不可变的

  17. 字符串格式化中字符宽度跟精度:P47

  18. 字符串方法:find、join、split、lower、replace、strip

  19. 字典的格式化字符串P58

  20. 浅拷贝的事情!!!P60例子

  21. 字典方法:get、has_key、items、iteritems、keys、iterkeys

  22. print的逗号

  23. import中的as

  24. 序列解包 赋值、链式赋值 P67 P68

  25. False None 0 “” () []{} 会被解释器看成假(False)

  26. 同一性运算符跟==的区别 P73

  27. 迭代工具:zip、enumerate、reverse、sorted

  28. 在循环中增加一个else子句,仅在没有调用break的时候调用执行

  29. 列表推导式!!!P83

  30. 文档字符串做注释 __doc__来访问 P91;内建的help函数

  31. 函数的参数 P93,跟普通=赋值一样

  32. 参数收集:任意多参数以及任意多位置参数 *和** P99

  33. 参数收集的逆过程:P101

  34. 重新绑定全局变量使用关键字global

  35. 闭包以及修饰符!!常用来记录日志

  36. for…in…for…in…if…/...if … else … /for…in…if…for…in…if...语句

  37. lambda函数式编程语法

    1. lambda [arg1[,arg2,arg3....argN]]:expression

  38. map、filter以及reduce的应用

  39. 类中方法变成私有,只需要在名字前面加上双下划线;在类的内部定义中,所有以双下划线开始的名字都被翻译成前面加上单下划线和类名的形式。所以实际上还是能够访问这些私有方法的。

  40. 类的属性__bases__重看基类以及对象属于哪个类的__class__特性

  41. 多个超累中的顺序问题,先继承的类中的方法会重写后继承的类中的方法

  42. 查看对象所有存储的值,可以使用__dict__特性;dir方法可以列出模块的内容

  43. 如果捕捉到了异常,但是又想引发它,可以调用不带参数的raise

  44. try后面多个except,一个except捕获多个异常(用元组列出),捕捉异常本身可以使用两个参数(except (xxerror, xxxerror), e:语句)

  45. 一段代码捕捉所有异常,可以except子句中忽略所有的异常类

  46. 可以在一条语句中组合使用try、except、else、finally

  47. 继承超类的时候覆盖__init__构造函数,需要在构造函数调用super(类名, self).__init__()   P143

  48. 使用property方法创建一个属性!

    1. 把一个getter方法变成属性,只需要加上@property就可以了,此时,@property本身又创建了另一个装饰器@score.setter,负责把一个setter方法变成属性赋值,于是,我们就拥有一个可控的属性操作

    2. 只定义getter方法,不定义setter方法就是一个只读属性

  49. 静态方法和类成员方法 装饰器 @staticmethod @classmethod P150

  50. __getattr__和__setattr__和它的朋友们 P151 例子用来实现属性

  51. 迭代器:实现了__iter__方法来返回迭代器本身和next方法

  52. 从迭代器得到序列;结束的时候在next方法中raise StopIteration异常

  53. 递归+生成器 遍历嵌套列表 !!!例子很好 P155

  54. 生成器是由两部分组成:生成器的函数和生成器的迭代器。生成器的函数式用def语句定义的,包含yield的部分,生成器的迭代器是这个函数返回的部分。

  55. 生成器的方法:next()和send() P156

    1. 生成器还有两个方法throw以及close方法P157

    2. 使用send方法只有在生成器挂起之后才有意义;如果想在刚刚启动的生成器使用send,可以将None作为参数进行调用

    3. The send() method returns the next value yielded by the generator, or raises StopIteration if the generator exits without yielding another value.

  56. 模块导入 sys.path.append(‘模块目录’),然后import就行了;或者用export、写入.bashrc等方法更改环境变量PYTHONPATH

  57. 导入模块的时候会被执行一次,第二次导入不会被执行

  58. 包是一类模块,名字就是模块所在的目录,必须包含一个命名为__init__.py的文件(模块) P172解释import的时候发生的事情

  59. 属性:__all__定义了模块的公有接口;__file__属性可以看源代码的路径

  60. 堆栈集合、time等等标准库

  61. open的文件模式!注意覆盖写的问题 http://blog.csdn.net/ztf312/article/details/47259805

  62. with语法、闭包、__call__属性来改变类

  63. 定制类

    1. 任何类,只需要定义一个__call__()方法,就可以直接对实例进行调用

    2. __call__()还可以定义参数。对实例进行直接调用就好比对一个函数进行调用一样,所以你完全可以把对象看成函数,把函数看成对象,因为这两者之间本来就没啥根本的区别。

    3. __getattr__()方法,动态返回一个属性:当调用不存在的属性时,比如score,Python解释器会试图调用__getattr__(self, 'score')来尝试获得属性,这样,我们就有机会返回score的值;可以搞搞REST API

  64. 调试

  65. 行缓冲、全缓冲的问题http://blog.csdn.net/anonymalias/article/details/8011115

  66. 当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法

    1. 如果我们想要限制实例的属性怎么办?比如,只允许对Student实例添加nameage属性

    2. Python允许在定义class的时候,定义一个特殊的__slots__变量,来限制该class实例能添加的属性

    3. 参考链接 http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143186739713011a09b63dcbd42cc87f907a778b3ac73000

  67. Python提供了Enum类来实现枚举类

  68. 单元测试

    1. 编写单元测试时,我们需要编写一个测试类,从unittest.TestCase继承

    2. test开头的方法就是测试方法,不以test开头的方法不被认为是测试方法,测试的时候不会被执行

    3. 由于unittest.TestCase提供了很多内置的条件判断,我们只需要调用这些方法就可以断言输出是否是我们所期望的。最常用的断言就是assertEqual()

    4. 在命令行通过参数-m unittest直接运行单元测试
      python3 -m unittest mydict_test

    5. 可以在单元测试中编写两个特殊的setUp()tearDown()方法。这两个方法会分别在每调用一个测试方法的前后分别被执行

    6. 单元测试可以有效地测试某个程序模块的行为,是未来重构代码的信心保证。单元测试的测试用例要覆盖常用的输入组合、边界条件和异常。单元测试代码要非常简单,如果测试代码太复杂,那么测试代码本身就可能有bug。单元测试通过了并不意味着程序就没有bug了,但是不通过程序肯定有bug。

  69. 全局变量local_school就是一个ThreadLocal对象,每个Thread对它都可以读写student属性,但互不影响。你可以把local_school看成全局变量,但每个属性如local_school.student都是线程的局部变量,可以任意读写而互不干扰,也不用管理锁的问题,ThreadLocal内部会处理。

    1. ThreadLocal最常用的地方就是为每个线程绑定一个数据库连接,HTTP请求,用户身份信息等,这样一个线程的所有调用到的处理函数都可以非常方便地访问这些资源。

    2. 一个ThreadLocal变量虽然是全局变量,但每个线程都只能读写自己线程的独立副本,互不干扰。ThreadLocal解决了参数在一个线程中各个函数之间互相传递的问题。

  70. Import问题:http://blog.csdn.net/hansel/article/details/8975663

  71. 全局性解释锁 GIL

    1. 对于任何Python程序,不管有多少的处理器,任何时候都总是只有一个线程在执行。

    2. 不要使用多线程,请使用多进程

    3. 纯计算的话,会感到gil的局限;如果有io操作的话,影响相对小,可以用多线程

    4. 无法利用多核cpu而已,可以利用多进程来提高速度

    5. 很多情况下都会用multiprocessing实现并发


查看评论
1楼 张斌 2017-06-14 23:21:49 [回复]
可以用于查漏补缺,都是很基础的东西
2楼 张曦 2017-06-15 10:05:31 [回复]
x[:]是浅拷贝啦~

发表评论
  • 评论内容:
      
    个人资料
    文章分类
    发表时间
    阅读排行
    评论排行
首页
团队介绍
发展历史
组织结构
MESA大事记
新闻中心
通知
组内动态
科研成果
专利
论文
项目
获奖
软著
人才培养
MESA毕业生
MESA在读生
MESA员工
招贤纳士
走进MESA
学长分享
招聘通知
招生宣传
知识库
文章
地址:北京市朝阳区华严北里甲22号楼五层 | 邮编:100029
邮箱:nelist@iie.ac.cn
京ICP备15019404号-1