python笔记

# -- coding: utf-8 -- 魔法注释 防止中文注释报错

导包 先搜索当前路径 其次搜索PYTHONPATH环境变量 最后搜索默认路径 可在sys.path中查看
添加包路径: 1、直接修改sys.path.append(new_path); 2、设置环境变量PYTHONPATH
包下面必须有 __init__.py 否则只是普通文件夹

创建一个名为xxx的虚拟环境 不需要root权限
$ virtualenv xxx
$ cd xxx/
$ source bin/activate
当不再使用虚拟环境中的库时,可以通过释放命令来退出环境
$ deactivate

方向键乱码 easy_install readline


xx:共有变量
_xx:单前置下划线 私有化属性方法 form model import *禁止导入 类对象和子类可以访问
__xx:双前置下划线 避免与子类中属性命名冲突 无法在类外部直接访问(名字重整)
__xx__:双前后下划线 用户名字空间的魔法对象或属性 如init 不用自己定义
xx_:单后置下划线 用于避免和python关键词冲突
类中的__func() 和 __member 不可被外部直接访问 但可以通过_className__func()或_className__member访问 此机制为 命名重整(name mangling)

isinstance(var, type); 判断var是不是 type类型 type可以使用tuple 意为或者


class className:
    __slots__ = ('att1', 'att2', ... , 'attn')

仅允许给类添加 att1-attn这些实例 否则AttributeError异常
__slots__定义的属性仅对当前类实例起作用,对继承的子类是不起作用的:

from model import * 会导入模块所以内容
在模块内指定 __all__ = [‘var1’,’var2’,…,’varn’] 则导入时 只导var1-varn 别的不导入


动态给类添加函数

>>> def set_age(self, age): # 定义一个函数作为实例方法
...     self.age = age
...
>>> from types import MethodType
>>> s.set_age = MethodType(set_age, s) # 给实例绑定一个方法
>>> s.set_age(25) # 调用实例方法

使用@property 可以将一个函数变成一个属性 使用.直接访问
使用@property时 @property本身会创建另一个@score.setter的装饰器 来完成赋值运算
要是没有实现这个函数 则属性为只读属性

class Student(object):

    @property
    def score(self):
        return self._score

    @score.setter
    def score(self, value):
        if not isinstance(value, int):
            raise ValueError('score must be an integer!')
        if value < 0 or value > 100:
            raise ValueError('score must between 0 ~ 100!')
        self._score = value

obj = property(getter, setter) 使用这个函数绑定两个函数 也可以实现效果 规定顺序 getter在前 obj可以和实际变量不同名


className.__mro__ 包含了成员调用属性或方法的对象查找顺序
要是想指定调用可以使用 className().fun()
super().fun() 调用的函数 也是__mro__的第一个

type(var) 返回var的变量类型
dir()
eval() 函数可计算某个字符串,并执行其中的的 python 代码。
print(end=””) 默认换行 加上参数end=var 可在结束时打印end的内容而不是换行

类属性 实例属性
类方法 实例方法 静态方法


格式符号 转换
%c 字符
%s 通过str() 字符串转换来格式化
%i 有符号十进制整数
%d 有符号十进制整数
%u 无符号十进制整数
%o 八进制整数
%x 十六进制整数(小写字母)
%X 十六进制整数(大写字母)
%e 索引符号(小写’e’)
%E 索引符号(大写“E”)
%f 浮点实数
%g %f和%e 的简写
%G %f和%E的简写


列表 list = [var1, var2, var3, var4]
字典 dict = {key1:var1, key2:var2}
元组 tuple = (var1, var2, var3, var4)
集合 set = {var1, var2, var3, var4}
enumerate()可以遍历下标

>>> for i, var in enumerate(vars):
...     print i, chr

列表list
mix = [‘小不点’, 3.14, [1,2,3]] 列表中可以存放任意类型的数据
len(list) 返回list的长度
list.append(var) 将var添加到列表尾
list.extend(list2) 将另一个list的元素添加进来
list.insert(pos, var) 将var添加到pos位置
可以直接通过索引访问list
list.remove(var) 将var移除list 移除不存在的值会报错
del list[pos] 将list[pos]移除
del list[st,ed] 将[st,ed)删除
del list 将整个列表删除 注:此时list已不在内存中 而不是空列表
list.pop() 移除并返回list的最后一个元素
list.pop(pos) 将索引值为pos的值移除并返回
list(st,ed) 将[st,ed)之间的元素返回
list之间的比较是从第一个元素开始比较大小,一旦出结果就返回,若两着元素不匹配(无法比较大小)会抛出错误
list1 = list1 + list2 将两个list拼接
list n list = n 将list自身连接n次
var in list var not in list 返回bool值 var是否在list中
(对于列表里的列表不可查询) list=[1,[‘sj’]] ‘sj’ in list 返回false ‘sj’ in list[1] 返回true
dir(list) 列出list的函数
list.count(var) 统计var出现的次数
list.index(var) 查找var第一次出现的位置
list.index(var,st,ed) 查找var在[st,ed)中第一次出现的位置
list.reverse() 翻转list
list.sort() 排序 小到大 默认使用归并排序
list.sort(reverse=True) 排序大到小
list=list2[:] 深拷贝 只是a=[1,2,3] b=a[:]同级别深拷贝 如果a=[list1, list2] b=a[:] 则list1 list2还是浅拷贝
import copy b=copy.deepcopy(a) 递归深拷贝
b=copy.copy(a)则相当于 b=a[:] 因为元组不可变 所以对元组此方法为浅拷贝
list=list2 浅拷贝
list = list.append(val) 会把list清空 append返回值为空


字典dictionary
键唯一不可变 值不唯一可变 不可切片
dict[key] = val 添加
dict.update({otherDict}) 将另一个dict的元素添加进来
del dict[key] 删除一组(key-val)
dict[key] 如果key不存在会出现异常
dict.get(key, default) 存在返回值,不存在返回默认值 默认为None
dict.keys() dict.values() dict.items()


元组tuple
稳固版列表,内容不可修改,可被查看

函数可以返回多个值 底层是tuple


集合set
无序 不重复 不可切片 不可索引
set.add(var)
set.discard(var)
x in set 判断set中是否有x


string 为不可变对象 string的任何操作都不会影响原串 只将操作后的串当做返回值返回
strip() 去除前后空格
s.strip(rm) 删除s字符串中开头、结尾处,位于 rm删除序列的字符
s.lstrip(rm) s.rstrip(rm) 删除s字符串中开头|结尾处,位于 rm删除序列的字符
s.find(str, start=0, end=len(s) 查找指定字符串 找着返回下标 否则返回-1
s.rfind(str, start=0, end=len(s) 右边开始找
s.index(str, start=0, end=len(s) 作用同find() 找不着抛出异常
s.rindex(str, start=0, end=len(s) 右边开始找
s.count(str, start=0, end=len(s) 查找str出现的次数
s.replace(str1, str2, s.count(str1))将str1替换为str2 不超过count次
s.split(str=” “, 2) 以 str 为分隔符切片 s,如果 maxsplit有指定值,则仅分隔 maxsplit 个子字符串
若以空白(“ “ \t \n等)为分隔符 则str参数直接不写即可
s.capitalize() 第一个单词的首字母大写
s.title() 所有单词的首字母大写
s.startswith(str) s.endswith(str) 判断是否以str开头|结束 返回值为bool
s.lower() s.upper() 大写->小写 | 小写->大写
s.ljust(n) s.rjust(n) s.center(n) 将字符串填充空格值长度为n 居左|右|中显示字符串
s.partition(str) | rpartition(str) 把s以str分割成三部分,s前,s和s后 | 右边开始找str
s.splitlines() 按照行分隔,返回一个包含各行作为元素的列表
s.isalpha s.isdigit s.isalnum s只包含 字母|数字|字母数字
s.isspace() 如果 s 中只包含空格,则返回 True,否则返回 False.
s.join(str) str为list 使用s连接str中每一个元素


+= 操作调用 __iadd__方法,没有该方法时,再尝试调用__add__方法

  • 操作调用__add__方法
    __iadd__方法直接在原对象a1上进行更新,该方法的返回值为None
    __add__方法会返回一个新的对象,原对象不修改
    因为对于不可变对象,根本没有 __iadd__方法,所以+=和+的效果是一样的,因为调的都是 __add__ 方法

文件相关操作:
f = open(‘filename’, ‘[r|w|a等]’)
f.read() f.read(n) f.readline() f.readlines() 全读|读n个字节|读一行|类似全读但返回行的列表
f.write()
f.seek(offset, from=(0|1|2)) 文件指针定位到0(头)|1(当前)|2(尾)的偏移offset(可正可负)个字节的位置 越界出异常
f.tell() 返回文件指针的当前位置
f.close()
import os
os.rename(“oldname”, “newname”) 重命名文件
os.remove(“filename”) 删除文件
os.mkdir(“dirname”) 创建文件夹
os.rmdir(“dirname”) 删除文件夹
os.getcwd() 获取当前路径==pwd
os.chdir(“path”) 跳转文件夹
os.listdir(“path”) ls path下的文件


进程相关操作:
import os
os.fork() 效果同linux系统调用fork 两个返回值 0为子进程 父进程返回子进程id(windows无此函数)
os.getpid() 获取当前进程id
os.getppid() 获取父进程id

跨平台库 multiprocessing 主进程等子进程执行完
from multiprocessing import Process
p = Process(target=func, args=(var, var2, …, varn)) func为子进程要执行的函数 args为参数元组
p.start() 进程开始执行
p.join([timeout]) 等待进程结束 或等待timeout秒