Python读书笔记
二次阅读《Python基础教程》的一点点笔记
整除运算符 双斜线
幂运算符比取反(一元减法运算符)优先级高
!#/usr/bin/env python
拼接字符串,可以一个接着另一个的方式写两个字符串,Python会自动拼接他们
repr函数,以合法的Python表达式的形式来表示值;repr(x)也可以写作`x`(`是反引号)
如果一行之中最后一个字符是反斜线,那么换行符本身就被转义了,也就是忽略了
原始字符串中:需要像平常一样对引号进行转义;不能在原始字符串结尾输入反斜线
序列(包括列表、元组、字符串、Unicode字符串、buffer对象、xrange对象)操作:索引、分片、加、乘、in操作、len、max、min;其中负数作为步长的时候必须起点大于结束点
创建长度为10的列表,元素内容为空 P32
list函数 P34
通过分片赋值来插入元素和删除元素P35
count方法P36页
extend方法修改了被扩展的序列;而原始的连接操作会返回一个全新的列表
复制列表的最有效方法是调用x[:];这是深拷贝,不是让两个指向同一个列表
元组与括弧P41、P42
字符串都是不可变的
字符串格式化中字符宽度跟精度:P47
字符串方法:find、join、split、lower、replace、strip
字典的格式化字符串P58
浅拷贝的事情!!!P60例子
字典方法:get、has_key、items、iteritems、keys、iterkeys
print的逗号
import中的as
序列解包 赋值、链式赋值 P67 P68
False None 0 “” () []{} 会被解释器看成假(False)
同一性运算符跟==的区别 P73
迭代工具:zip、enumerate、reverse、sorted
在循环中增加一个else子句,仅在没有调用break的时候调用执行
列表推导式!!!P83
文档字符串做注释 __doc__来访问 P91;内建的help函数
函数的参数 P93,跟普通=赋值一样
参数收集:任意多参数以及任意多位置参数 *和** P99
参数收集的逆过程:P101
重新绑定全局变量使用关键字global
闭包以及修饰符!!常用来记录日志
for…in…for…in…if…/...if … else … /for…in…if…for…in…if...语句
lambda函数式编程语法
lambda [arg1[,arg2,arg3....argN]]:expression
map、filter以及reduce的应用
类中方法变成私有,只需要在名字前面加上双下划线;在类的内部定义中,所有以双下划线开始的名字都被翻译成前面加上单下划线和类名的形式。所以实际上还是能够访问这些私有方法的。
类的属性__bases__重看基类以及对象属于哪个类的__class__特性
多个超累中的顺序问题,先继承的类中的方法会重写后继承的类中的方法
查看对象所有存储的值,可以使用__dict__特性;dir方法可以列出模块的内容
如果捕捉到了异常,但是又想引发它,可以调用不带参数的raise
try后面多个except,一个except捕获多个异常(用元组列出),捕捉异常本身可以使用两个参数(except (xxerror, xxxerror), e:语句)
一段代码捕捉所有异常,可以except子句中忽略所有的异常类
可以在一条语句中组合使用try、except、else、finally
继承超类的时候覆盖__init__构造函数,需要在构造函数调用super(类名, self).__init__() P143
使用property方法创建一个属性!
把一个getter方法变成属性,只需要加上@property就可以了,此时,@property本身又创建了另一个装饰器@score.setter,负责把一个setter方法变成属性赋值,于是,我们就拥有一个可控的属性操作
只定义getter方法,不定义setter方法就是一个只读属性
静态方法和类成员方法 装饰器 @staticmethod @classmethod P150
__getattr__和__setattr__和它的朋友们 P151 例子用来实现属性
迭代器:实现了__iter__方法来返回迭代器本身和next方法
从迭代器得到序列;结束的时候在next方法中raise StopIteration异常
递归+生成器 遍历嵌套列表 !!!例子很好 P155
生成器是由两部分组成:生成器的函数和生成器的迭代器。生成器的函数式用def语句定义的,包含yield的部分,生成器的迭代器是这个函数返回的部分。
生成器的方法:next()和send() P156
生成器还有两个方法throw以及close方法P157
使用send方法只有在生成器挂起之后才有意义;如果想在刚刚启动的生成器使用send,可以将None作为参数进行调用
The send() method returns the next value yielded by the generator, or raises StopIteration if the generator exits without yielding another value.
模块导入 sys.path.append(‘模块目录’),然后import就行了;或者用export、写入.bashrc等方法更改环境变量PYTHONPATH
导入模块的时候会被执行一次,第二次导入不会被执行
包是一类模块,名字就是模块所在的目录,必须包含一个命名为__init__.py的文件(模块) P172解释import的时候发生的事情
属性:__all__定义了模块的公有接口;__file__属性可以看源代码的路径
堆栈集合、time等等标准库
open的文件模式!注意覆盖写的问题 http://blog.csdn.net/ztf312/article/details/47259805
with语法、闭包、__call__属性来改变类
定制类
任何类,只需要定义一个__call__()方法,就可以直接对实例进行调用
__call__()还可以定义参数。对实例进行直接调用就好比对一个函数进行调用一样,所以你完全可以把对象看成函数,把函数看成对象,因为这两者之间本来就没啥根本的区别。
__getattr__()方法,动态返回一个属性:当调用不存在的属性时,比如score,Python解释器会试图调用__getattr__(self, 'score')来尝试获得属性,这样,我们就有机会返回score的值;可以搞搞REST API
调试
行缓冲、全缓冲的问题http://blog.csdn.net/anonymalias/article/details/8011115
当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法
如果我们想要限制实例的属性怎么办?比如,只允许对Student实例添加name和age属性
Python允许在定义class的时候,定义一个特殊的__slots__变量,来限制该class实例能添加的属性
Python提供了Enum类来实现枚举类
单元测试
编写单元测试时,我们需要编写一个测试类,从unittest.TestCase继承
以test开头的方法就是测试方法,不以test开头的方法不被认为是测试方法,测试的时候不会被执行
由于unittest.TestCase提供了很多内置的条件判断,我们只需要调用这些方法就可以断言输出是否是我们所期望的。最常用的断言就是assertEqual():
在命令行通过参数-m unittest直接运行单元测试
python3 -m unittest mydict_test可以在单元测试中编写两个特殊的setUp()和tearDown()方法。这两个方法会分别在每调用一个测试方法的前后分别被执行
单元测试可以有效地测试某个程序模块的行为,是未来重构代码的信心保证。单元测试的测试用例要覆盖常用的输入组合、边界条件和异常。单元测试代码要非常简单,如果测试代码太复杂,那么测试代码本身就可能有bug。单元测试通过了并不意味着程序就没有bug了,但是不通过程序肯定有bug。
全局变量local_school就是一个ThreadLocal对象,每个Thread对它都可以读写student属性,但互不影响。你可以把local_school看成全局变量,但每个属性如local_school.student都是线程的局部变量,可以任意读写而互不干扰,也不用管理锁的问题,ThreadLocal内部会处理。
ThreadLocal最常用的地方就是为每个线程绑定一个数据库连接,HTTP请求,用户身份信息等,这样一个线程的所有调用到的处理函数都可以非常方便地访问这些资源。
一个ThreadLocal变量虽然是全局变量,但每个线程都只能读写自己线程的独立副本,互不干扰。ThreadLocal解决了参数在一个线程中各个函数之间互相传递的问题。
Import问题:http://blog.csdn.net/hansel/article/details/8975663
全局性解释锁 GIL
对于任何Python程序,不管有多少的处理器,任何时候都总是只有一个线程在执行。
不要使用多线程,请使用多进程
纯计算的话,会感到gil的局限;如果有io操作的话,影响相对小,可以用多线程
无法利用多核cpu而已,可以利用多进程来提高速度
很多情况下都会用multiprocessing实现并发
- 1楼 张斌 2017-06-14 23:21:49 [回复]
- 可以用于查漏补缺,都是很基础的东西
- 2楼 张曦 2017-06-15 10:05:31 [回复]
- x[:]是浅拷贝啦~