Python读书笔记(持续更新)

书籍:《Python基础教程》《Python核心编程》《Python Cookbook》《Python源码剖析》

  • 在Python中,等号=是赋值语句,可以把任意数据类型赋值给变量,同一个变量可以反复赋值,而且可以是不同类型的变量。这种变量本身类型不固定的语言称之为动态语言,与之对应的是静态语言

  • 在Python中,通常用全部大写的变量名表示常量。用全部大写的变量名表示常量只是一个习惯上的用法,其实它还是一个变量

  • Python的整数没有大小限制,而某些语言的整数根据其存储长度是有大小限制的,例如Java对32位整数的范围限制在-2147483648-2147483647。

  • Python的浮点数也没有大小限制,但是超出一定范围就直接表示为inf(无限大)。

  • 把一个变量a赋值给另一个变量b,这个操作实际上是把变量b指向变量a所指向的数据

  • ASCII编码是1个字节,而Unicode编码通常是2个字节。

  • Python里的字典{ }相当于键值对,不过一个键只能存放一个值,后放的值会覆盖前面的。删除用d.pop( );dict的key必须是不可变对象

  • *args是可变参数,args接收的是一个tuple;

  • **kw是关键字参数,kw接收的是一个dict。

  • 如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线,在Python中,实例的变量名如果以开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问,

  • 不能直接访问name是因为Python解释器对外把name变量改成了_Studentname,所以,仍然可以通过_Studentname来访问__name变量

  • 类中没有的属性可以在实例中动态绑定,也可调用MethodType来为实例绑定类中没有的方法。

  • 如果我们想要限制实例的属性怎么办?比如,只允许对Student实例添加name和age属性。为了达到限制的目的,Python允许在定义class的时候,定义一个特殊的slots变量,来限制该class实例能添加的属性

  • class Student(object):
    slots = (‘name’, ‘age’) # 用tuple定义允许绑定的属性名称
    使用slots要注意,slots定义的属性仅对当前类实例起作用,对继承的子类是不起作用的
    类可以绑定原本没定义的外部方法

  • Python内置的@property装饰器就是负责把一个方法变成属性调用的

  • 整除 “//“ 双反斜杠 把小数点后面的数去掉,即使是浮点数相除

  • 幂次方用 如2 4 = 16

  • 大数 大于20亿 后面加L表示(转换成长整型) 如 10000000000000L 说明这是个长整型 其实Python会自动转换 所有我们不用管 直接用 甚至不用写L

  • 十六进制以0x开头 八进制以0开头 都是数字零

  • In Python 3.0, print is a function, which means you need to write print(42) instead of print 42

  • 要得到某个数的几次方 可以用pow( )函数 如pow(2,4)=16

  • round( )函数用来四舍五入浮点数 round(3.6788,3) = 3.679 保留三位小数

  • math.floor( )用来向下取浮点数 math.ceil( )用来向上取浮点数

  • cmath是用来处理复数的库

  • str( ) repr( )和反引号

  • raw_input( )把所有输入都当作字符串 都加上 ‘ ‘ input( ) 则数字就是数字 Python3里input跟Python2的raw_input等同

  • 要输入一串很长的字符串 里面有单引号 双引号 甚至跨行 可以用三引号’’’ string ‘’’

  • 若要输出的里面有很多反斜杠 \ 比如C:\LBD\LSKE\NO 可以用r’ ——‘表示原始字符串,即忽略反斜杠的作用 不然得在每个\前面再加一个\

  • 在不想让序列被改变的情况下用元组 否则一般用列表

  • 字符串也可以切片

  • [2:20:3] [20:3:-2] for a positive step size, it moves from the beginning toward the end, and for a negative step size, it moves from the end toward the beginning.

  • None 代表什么都没有,但是占了个位置

  • print( )完自动换行 print(a,b,c) a b c 自动空格

列表

  • in 可以判断x是否在字符串或列表中

  • 字符串不能被修改 可以转成list

  • list()函数用来将字符串或序列转成列表

  • ‘ ‘.join(iterable)可以将序列用’ ‘ 连接起来 序列必须由字符串组成

  • 可以将字符串转成序列(方便处理),也可以把序列转成字符串

  • 切片不改变序列本身

  • 列表有特性:可以给某个位置赋值,删除某个位置,给切片赋值(还可以跳跃赋值,只是跳跃赋值的话提供的值数量要跟跳跃的相等)

  • python2中range( )函数产生一个列表 python3则不行,主要用来迭代次数 可以list(range(3,9,2)来将其转为列表

  • ls.count( )可以得到 在列表ls中出现的次数 *可以是列表

  • ls.append( ),在列表末尾加一个元素,append( )一个列表,该列表成为原列表的一个元素

  • ls.extend( )在列表末尾加一个序列(iterable),该序列里的元素全部成为原序列的元素 也可以通过 + 将两个列表相连,但是此时不改变原列表

  • 列表里什么都能放,包括数字、字符串、列表、元组、字典等 而且可以同时混合放

  • 切片x[a:b] 含左不含右

  • ls.index( ) 返回第一次出现的索引

  • ls.insert(a,* )可以在a位置插入a这个元素

  • x.pop( )默认将最后一个元素弹出并返回 del只移除不返回 还可以指定移除某个位置的 x.pop(1) pop( )是唯一一个既能修改列表又能返回值得列表方法

  • 若要移除某个已知的元素 而不是某个位置的元素 用ls.remove( ) 只移除第一次出现的 后面的 * 不移除

  • ls.reverse( )可以将列表反转 什么都不返回 列表操作里有返回值得只有pop

  • ls.sort( )可以对列表进行排序 不返回任何东西 只能用于列表排序

  • ls.sort(cmp = None,key = None,reverse = False) key用来决定用什么来排序(长度、字母表、。。)reverse决定要不要反转

元组

  • 决定是否是元组的是逗号,有逗号就是 除了空元组,其他都有逗号 如果只有一个元素,在后面加逗号表明这是一个元组

  • 元组用小括号(圆括号)表示

  • tuple( )函数可以把序列转成元组 ,元祖方法跟列表类似,少了很多

  • 序列(sequence)包含列表、元祖、字符串

字符串

  • 字符串 要格式化两个以上的值,需要用元祖或字典

  • 也可以用模板字符串来对字符串进行格式化

from string import Template
s = Template('A $thing must never $action.')
d = {}
d['thing'] = 'gentleman'
d['action'] = 'show his socks'
s.substitute(d)
'A gentleman must never show his socks.'
  • %-10.2f 总宽度为10 保留2位小数 左对齐(默认是右对齐) %010.2f 左边用0填充

  • %+5d 显示正负号(正的也要显示)

  • ‘%-s’ %(10,’ilovezxy) 左对齐 宽度为10 号用来接收宽度或精度

  • find( ) 在长字符串中找某个子字符串用 s.find(‘lbd’) 返回位置(最左边的) 若无 返回-1 还可以指定起始和结束位置s.find(‘lbd’,3,10)

  • join( ) s = (‘lbd’,’zxy’,’lxy’) ‘/‘.join(s) lbd/zxy/lxy 与split( )方法相反 将序列连接处字符串

  • lower( ) 返回小写字符串

  • title( ) ‘i love python’.title( ) f-> ‘I Love Python’ 首字母大写 其他小写 string.capwords(“that’s all”)

  • replace( ) 用来替换某个子串 ‘ldljeijkldsfe’.replace(‘a’,’b’)把所有的a都替换成b

  • split( ) 将字符串分割成序列(列表)’/lbd/zxy/lks/‘.split(‘/‘) -> [‘’, ‘lbd’, ‘zxy’, ‘lks’, ‘’] 不加参数默认用空格分割

  • strip( ) 去除字符串两边的空格 并将去除空格后的字符串返回 已可以去除指定字符 ‘dsfsfw’.strip(‘#@$1*e’)

  • translate( ) table = maketrans(‘cs’,’kz’) ‘this is a incredible test’.translate(table) 需要同时替换多个字母时使用

  • 电话号码应表示为字符串

字典

  • 键不能重复,值可以重复

  • dict( ) 用来创建字典 可以用(key,value)键值对 或 name=’lbd’,age=’23’ 这样来赋值 b = dict(name = ‘zxy’,age = 18,gender = ‘female’) or items=[(‘name’,’lbd’),(‘age’,23)] d = dict(items)

  • 为某个键赋值时 若原本字典中没这个键 则会自动将此键值对添加进去

  • value 可以是一个字典 里面包含多个键值对

  • 除了有元组的格式化字符串,还有字典的格式化字符串

  • clear( ) dict.clear( ) 清除字典里的所有内容 列表用 del x[ : ]实现

  • copy( )dict.copy( ) 返回一份dict的拷贝(新的,不是原本那份) y=x.copy( ) 此时y和x不是指向同一个对象 更新操作互不影响 删除操作会影响 若y=x 则两个指向相同内容 操作相互影响 列表虽然没有copy这个函数 但是可以用切片[ : ]实现 y=deepcopy(x)是深拷贝,完全不影响

  • get( ) y.get( keyname ,’default’ ) 得到key对应的value get方法更宽松 如果不存在该键不会报错 返回default x[‘keyname’]不存在会报错

  • has_key( ) 判断是否存在某个key

  • items( ) and iteritems( ) x.items( ) 将x的内容以列表返回 [(‘age’, 18), (‘name’, ‘lbd’)] iteritems( )类似 只不过会返回一个迭代器而不是列表

  • keys( ) and iterkeys( ) 将keys以列表的形式返回

  • pop( ) x.pop(key) 将key对应的value返回 并删除key-value对

  • popitem( ) x.popitem( ) 随机弹出(删除)一个键值对,并将其返回

  • setdefault(key,default) 与get(key,default)类似,只不过若key不存在 setdefault()会加入

  • update( ) x.update(y) update可以用y字典来更新x字典 同意的key替换成y的value 不存在的key—value加入x

  • values( ) and itervalues( ) 以列表的形式返回所有value

  • 一个key只能对应一个value


  • x,y,z = 1,2,3 or x,y,z = (1,2,3) 解包 可以给多个变量同时赋值 values = (4,5,6) x,y,z = values x,y,z = z,x,y 可以三个互换 x,y = y,x

  • if … elif …else

  • 还可以用 2=y

  • ==比较的是值(相等性) 5 == 5.0 is 比较的是对象(同一性) 指向相同对象才相等 is一般用在可变值里

  • name = input(‘please input your name: ‘) or ‘default’ 如果没有输入 则name=default

  • x = 2 if 1>2 else 3 x=3

  • xrange( ) 一次只产生一个数 range( )一次性把所有数都产生出来 Python3中 range( ) 会被转化成 xrange( )

  • d={ } for k,v in d.items( )

  • zip(a,b) 可以把a,b两个可迭代的按顺序合并到一起称为一对 [ (a[0],b[0]) ,…, ] 用来进行并行迭代 短的结束后即停止

  • for index,string in enumerate(strings): strings[index] = ‘xxx’ 用来迭代index-value对

  • [ x*x for x in range(10) ] ->[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

  • [x*x for x in range(10) if x%3 == 0]->[0, 9, 36, 81]

  • [(x,y) for x in range(3) for y in range(3)]->[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]

  • 如果想让程序什么都不干,用pass

  • 若x = [1,2,3] y = x 则del x[0] 对y有影响 del x 对y无影响(编译器检测到还有变量指向该列表,所以不会真的删除这个列表)

  • Python编译器会自动回收不需要的东西,所以不要自己操心

  • exec可以用来执行字符串中的代码 exec “print ‘hello world!’”

  • eval(‘8+3*4) 20 eval( )可以对字符串里的算式进行计算

  • exec and eval are both not safe

  • scope = {‘x’:3,’y’:2} eval(‘x*y’,scope) 6

  • 为某个函数加注释可以直接在:下一行写字符串 然后调用func.doc可以查看函数文档 doc是特殊函数属性

  • def print_argument(arg): print_argument(3,4,’sll’,[2,4]) (3, 4, ‘sll’, [2, 4]) arg将输入的所有参数放到元组arg里

  • def print_argument2(*arg): print_argument2(x=1,y=2,z=’lbd’) {‘y’: 2, ‘x’: 1, ‘z’: ‘lbd’}*arg把所有输入的参数放到字典arg里 参数必须是x=a的形式

  • 以上两种方法都可以让用户输入任意多的参数 收集参数为元组或字典(在定义中使用 或 *

  • 若定义中有多个参数,调用函数时参数为arg 或 *arg 可将元组arg1或字典arg2分割为多个参数

  • 同一个函数要么定义时用或** 要么调用时用或** 不要在定义和调用时同时用

  • 如果有全局变量x 函数内部又有x 则后者为局部变量,不会对外面的x产生影响 若想要在函数内引用全局变量x 应声明为 global x

  • map(str, range(10)) -> [‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’]
    filter(lambda x:x.isalnum(),seq)
    num = [2,3,4,2,2,3,4,4] reduce(lambda x,y:x+y,num) ->24

  • 有函数可以调用的话就不要自己写,因为内置的一般效率更高

  • 绑定到对象特性上面的函数称为方法(method)

  • 多态就是不用管对象的类型,真的不同类型的对象会自动选取对应的方法

  • 类的属性,若想变成私有 1.双下划线 此时可以用ob._classattribute来访问 2.单下划线_ 外面无法访问 Python没有真正的私有化支持

  • issubclass(a,b) 判断a是否b的子类

  • isinstance(a,b) 判断a是否b的一个实例

  • a.bases a类的基类

  • a.class a是哪个类的对象(a这个对象属于哪个类)或者用 type(a)更直接

  • class a(b,c) a类继承b类和c类 叫做多重继承 若b、c中有相同的某个方法,则b会重写c 所有有顺序之分

  • 捕获异常是为了发生异常时按我们的想法来运行,而不是直接崩溃(前提是你知道此处可能会有异常)

  • try: except: or try: except(exc1,exc2,…):
    except (ZeroDivisionError,NameError,TypeError) as e: print(e) 把异常打印出来 程序继续运行

  • try: except: else: finally: 没有异常的时候会执行else里的内容,有异常不会,finally里的语句一定会执行,不管有没有发生异常
    类的构造方法 def init(self): 创建新对象是会自动执行里面的内容

  • __del__是析构方法,在对象被垃圾回收之前调用,自己不要去用

  • 正常情况下,子类会重写超类的构造方法(新建子类对象是只会初始化子类的构造方法,不会初始化超类的构造方法)两种方法解决:1.调用超类构造方法的未绑定版本 2.使用super函数(现在用这个)

  • 在调用一个实例的方法时,该方法的self参数会自动绑定到该实例上

  • 如果直接调用类的方法,该方法就不会绑定到实例上
    可以用type()函数创建出class 内部也是这么执行的
    Hello = type(‘Hello’,(object,),dict(hello = fn)) 创建的Hello类,继承object类,里面有个hello方法,该方法与fn函数绑定

  • metaclass是元类 很高级 可以把类看作metaclass的实例
    两种方法实现新式类:1. 开头添加 metaclass = type 2.继承object类

  • property()函数:屏蔽类访问器方法 如 size = property(getSize,setSize)

  • 静态方法和类成员方法 静态方法没有self参数,可以被类直接调用 类成员方法有个类似于self参数的cls参数 除此之外还要加上装饰器 @staticmethod @classmethod

  • 一个实现了__iter__方法的对象是可迭代的,一个实现了next方法的对象是迭代器 next()返回迭代器的下一个值,__iter__返回迭代器本身

  • it = iter((1,2,3,4)) iter()为内建函数 可以将可迭代对象变成迭代器

  • list(iter) 可以将迭代器转化成列表

  • g = ((i+2)**2 for i in range(2,27)) g是个生成器,可以使用g.next()

  • 生成器是一个包含yield关键字的函数 生成器由两部分组成:生成器的函数和生成器的迭代器

  • import sys sys.path.append(‘/Users/linbingdong/Desktop’) 此时可以import放在该路径下的xxx.py文件 import xxx

  • 模块在第一次被导入时会自动执行(生成xxx.pyc文件),以后就不会

  • 在主程序中,__name__ == __main__ 在导入的模块中 __name__ == 模块名 用作测试代码

  • def test(): if ‘__name__‘ == ‘__main__‘: test()

  • import pprint pprint更加智能 可以打印的更好看 比如自动换行

  • 查看sys.path 找到site-packages目录 将自己写的模块放入该目录 其他程序就都可以import

  • import自己写的模块两种方法 1.放入site-packages目录 2.sys.path.append( )

  • dir()函数可以查看模块包含的内容 如 import copy dir(copy)

  • copy.all 定义了模块的公有接口 from copy import 只能导入copy.all里的内容 相当于将一些程序员不太需要的过滤掉 因此from copy import 一般已经足够了

  • copy.file 显示copy这个模块所在的路径

  • copydoc 显示copy的描述文档

  • sys.argv是个参数列表

  • os.sep 路径名中的分隔符 /

  • os.pathsep 分割路径名(不同路径名) :

  • os.linesep 换行符 \n

  • os.system(‘路径名’) 可以启动应用程序

  • import webbrowser webbrowser.open(‘http://www.qq.com‘) 会调用默认浏览器打开该网址

  • set集合 set([1,2,3,3,2,3,4]) -> set([1,2,3,4]) 顺序随意

  • 求两个集合的并集 a.union(b) or a | b

  • 求两个集合的交集 a.intersection(b) or a & b

  • a中特有的(a中有,b中没有) a.difference(b) or a - b

  • a、b中不共有的 a.symmetric_difference(b) or a ^ b

  • 集合是可变的 字典中的键必须是不可变的

  • frozenset(b)将b集合变成不可变的

  • forzenset()函数创建给定集合的副本

  • Python没有独立的“堆”类型 有个’heapq‘模块 通过heappush(heap,n) 得到的heap列表就是堆 或者用 heapify(heap) 将heap建成堆 其实可以把可迭代对象直接看成堆

  • heappop(heap) 每次弹出heap中的最小数

  • 先执行heappop()再执行heappush()等价于 heapreplace(heap,x) 返回弹出的数

  • 返回iter的前k大数 nlargest(k,iter) 返回前k小数 nsmallest(k,iter)

  • 双端队列 deque ‘from collections import deque’ q = deque(range(5))

  • deque与list的区别在于 deque可以从左端加入和弹出

  • q.appendleft(x) q.popleft() q.rotate(3)右移三位 q.rotate(-3)左移三位 都是循环移位

  • time 模块 import time time.asctime()

  • time.localtime() time.mktime()… sleep(k) 等待k秒

  • random 模块 from random import *

  • random()返回0~1之间的浮点数

  • uniform(a,b) 返回a~b之间的数

  • randrange(a,b) 返回a~b之间的随机整数

  • randrange(1,b,2) 返回小于b的随机正奇数

  • re模块 正则表达式

  • re.split(‘[, ]+’,text) 将text用任意长度的逗号或空格分开

欢迎关注公众号: FullStackPlan 获取更多干货

Copyright © 2016 - 2017 LBD All Rights Reserved.

访客数 : | 访问量 :