Python学习笔记

本文详细介绍了Python编程中的各种技巧和实用工具,包括列表解析与生成器表达式、私有API、类方法和静态方法、属性拦截、异常处理、模块的使用、时间与日期操作、数据库操作、JSON序列化、测试框架、虚拟环境管理、装饰器、抽象基类与多态、函数式编程、性能分析等核心概念和方法,旨在帮助读者深入理解并熟练运用Python编程。
摘要由CSDN通过智能技术生成
1、列表解析和生成器表达式
    N=[i*2 for i in range(1,5)]为列表解析,N为一个列表对象;
    N=(i*2 for i in range(1,5))为生成器表达式,N为一个生成器的对象,它

利用了“惰性计算”的机制,在序列过长且每次只需要获取一个元素时应使用生

成器表达式。N.__next__()可获取下一个值,遍历完再用N.__next__()会抛出异

常。
2、使用下划线作为私有API的前缀,如foo是共有API,_bar是私有的。
3、类方法,在类内部定义的方法,由装饰器@classmethod来装饰,第一个参数

cls引用的就是这个类本身,调用时不用再传入参数。
4、静态方法,在类内部定义,前面通过@staticmethod来装饰,可以通过类或实

例来调用,参数随意,相当于一个普通方法。
5、类名._mro_为显示该类的继承顺序。
6、在需要私有化的属性(包括方法)前加双下划线__,无法直接通过.来访问私

有属性,可通过调用非私有方法(此方法中调用私有方法)来访问;用

@property装饰一个函数foo(self),返回某个私有属性,就可通过类.foo来访问

私有属性。
7、运算符之所以可以使用是因为进行运算的类有相应的特殊方法,比如

__add__,__sub__,__mul__,__div__。
8,使用__slots__特殊属性可以将__dict__挤出去,增加实例时,实例的

__slots__并不增加,通过类定义的属性都是只读的,__slots__可以提升对实例

属性的操作速度。
9、__setattr__(self , name , value)给name赋值时调用该方法。
__getattr__(self , name)访问name而name不存在时调用它;
__getattribute__(self , name)访问name时被调用,不管存在与否,return时

注意不要使用return self.__dict__[name],否则会无限循环调用

__getattribute__,应使用return object.__getattribute__(self,name)。
以上三种方法被称为属性拦截,可避免一些报错。
10、一个函数,只要包含了yield,就是生成器,生成器就是对象;直接调用生

成器不会执行函数体内语句,将调用后的函数引用传给一个变量,使用

__next__()则会开始执行函数,遇到yield会返回值,并暂停,下次再调用则从

暂停位置开始继续执行,没有满足条件的值后则会抛出StopIteration异常。
可以通过inspect.isgeneratorfunction()检查一个函数是否是生成器;

inspect.getgeneratorstate()可以查看生成器当前状态,

GEN_CREATED,GEN_RUNNING(正在被解析器执行),GEN_SUSPENDED(等待被唤醒调

用),GEN_CLOSED;
11、捕捉异常时用try: except: else: finally:,若无异常,则会执行try和

else里的语句,若有异常,则执行except的语句,finally语句总是会被执行。
12、assert断言,可用assert expression, "xxx"若表达式不为真,则输

出"xxx" 其异常类型为AssertionError,可用try,except语句接收。
13、导入一个自定义的模块,需要先import sys,然后sys.path.append('模块

的路径'),然后可以导入,这种方式当关闭当前terminal时会失效,可设置

PYTHONPATH环境变量:export PYTHONPATH=$PYTHONPATH:路径;属性__name__是

模块的名称。
14、模块中的私有变量不能直接访问,可通过模块.变量来访问,__all__属性是

一个列表,其中包含了可被访问的变量名,无论是否私有,不在该列表里的变量

无法被访问(通过from xx import *导入的就是__all__里面的方法)。
15、在一个包中增加一个名为__init__.py的空文件,就可以将该目录中的其

他.py文件作为模块被引用。
16、模块的__doc__属性是模块的文档,位于模块文件的开始注释处,__file__

属性是该模块的位置。
17、sys.argv是向Python解释器传递参数的,如$python a b c d ,sys.argv

[0]就是a。
18、os模块,os.rename(原文件名,新文件名),可重命名文件或目录,

os.remove(文件名),不能用来删除目录;os.listdir(目录),显示目录中的内

容到一个列表中;os.getcwd()获取当前路径,os.chdir(路径)改变当前路径,

os.pardir()上一级目录;os.removedirs(dir),删除目录,该目录必须为空,

os.makedirs(dir),新建目录,可以级联新建,而os.mkdir()不可以;
os.stat(dir)可查看目录或文件的信息。
os.system(xxx)xxx为操作系统的命令,这样可在Python中使用操作系统命令。
19、shutil模块的rmtree(dir)方法可以删除不为空的目录。
20、import webbrowser   webbrowser.open("http://www.xxx.com")可打开网

页。
21、最上面是最小值的是最小堆(父节点总小于等于子节点),最上面是最大值

的是最大堆(父节点总大于等于子节点)。
22、堆,heapq模块,heap使用列表存储数据,里面不仅可以放数字;

heapq.heappush(heap,x),往二叉树里增加值,并按照二叉树的结构进行存储(

最小堆);heapq.heappop(heap),从堆中删除一个最小元素并返回;

heapq.heapify(list),将一个列表转化为最小堆,改变了list而不是新生成一个

对象;heapq.heapreplace(heap,x),是heappop和heappop的结合,删掉最小的一

个并加入一个新值x。
23、collections模块中包括许多有用的数据结构;比如depue,双端队列,先

a=depue(list),将list转化为depue对象,然后a.append(x),从右边增加值,

a.appendleft(b),从左边增加;a.pop()删除最后一个元素,a.popleft()删除第

一个元素;a.rotate(i)表示将a中的元素首尾连接起来,像一个圆,元素顺时针

排列,i表示每个元素按顺时针方向前进i个位置,若i为负数,则逆时针旋转,

该函数改变了这个depue对象。
24、calendar模块,calendar.month(year,month,w=2,l=1)显示月历;

calendar.calendar(year,w=2,l=1,c=6)返回year年的年历,三个月一行,间隔

距离为c,每日宽度间隔为w字符,每行的长度为21*w+18+2*c,l为每星期的行数


calendar.isleap(year)判断是否为闰年,是返回True,不是返回False;
calendar.leapdays(y1,y2)返回两年之间的闰年总数,包括y1不包括y2(像是切

片);
calendar.monthcalendar(year,month)返回一个列表,列表中的元素还是列表,

每一个子列表都是该月份的每个星期的日期,从周一到周日,如果没有本月的则

为0;
calendar.monthrange(year,month)返回一个元组,里面有两个整数,第一个是

该月从周几开始,0代表周一,6代表周日,第二个代表这个月有多少天;
calendar.weekday(year,month,day)返回是周几,0为周一,6为周日。
25、time模块;
time.time(),获取当前时间戳,从1970年1月1日0时0分0秒开始到当前的总秒数

(不包括闰秒);
time.localtime() 得到time.struct_time(tm_year=2015,

tm_mon=5,tm_mday=4,tm_hour=20,tm_min=33,tm_sec=39,tm_wday=1,tm_yday=12

4,tm_isdat=0)其中tm_wday是一周中的第几天,tm_yday是一年中的第几天,

tm_isdst是否为夏令时,该函数的默认参数为time.time(),参数为时间戳;
time.gmtime()得到的是格林尼治时间;
time.asctime() 得到 'weekday month day hour:min:sec year'该函数默认以

time.localtime()的值作为参数&
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值