常用内建模块(一)
一、datetimedatetime是Python处理日期和时间的标准库。
1.1 获取当前日期和时间123456789from datetime import datetimenow = datetime.now()print(now)print(type(now))#结果2023-07-30 16:52:03.452670<class 'datetime.datetime'>
注意到datetime是模块,datetime模块还包含一个datetime类,通过from datetime import datetime导入的才是datetime这个类。
如果仅导入import datetime,则必须引用全名datetime.datetime。
datetime.now()返回当前日期和时间,其类型是datetime。
1.2 获取指定日期和时间指定某个日期和时间,我们直接用参数构造一个datetime:
123456from datetime import datetimedt = datetime(2015, 4, 19, 12, 20)print ...
Python细节小小知识点(七)
一、异常处理1.1 捕获错误高级语言通常都内置了一套try...except...finally...的错误处理机制,Python也不例外。让我们用一个例子来看看try的机制:
123456789try: print('try...') r = 10 / 0 print('result:', r)except ZeroDivisionError as e: print('except:', e)finally: print('finally...')print('END')
当我们认为某些代码可能会出错时,就可以用try来运行这段代码,如果执行出错,则后续代码不会继续执行,而是直接跳转至错误处理代码,即except语句块,执行完except后,如果有finally语句块,则执行finally语句块,至此,执行完毕。
上面的代码在计算10 / 0时会产生一个除法运算错误:
1234try...except: division by zerofinally... ...
正则表达式
一、概念正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个规则字符串,这个规则字符串用来表达对字符串的一种过滤逻辑(可以用来做检索,截取或者替换操作)。
二、正则表达式的使用2.1 match()re.match()尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回None。语法格式如下:
1re.match(pattern, string, flags=0)
参数
描述
pattern
匹配的正则表达式
string
目标字符串
flags
标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。如下表列出正则表达式修饰符 - 可选标志
修饰符
描述
re.I
是匹配对大小写不敏感
re.L
做本地化识别(locale-aware)匹配
re.M
多行匹配,影响^和$
re.S
使,匹配包括换行内的所有字符
re.U
根据Unicode字符集解析字符。这个标志影响\w,\W,\b,\B
re.X
该标志通过给予你更 ...
Python细节小小知识点(八)
一、进程和线程对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程,打开一个Word就启动了一个Word进程。,在一个进程内部,要同时干多件事,就需要同时运行多个子任务,我们把进程内的这些子任务称为线程(Thread)。
总结一下就是,多任务的实现有3种方式:
多进程模式;
多线程模式;
多进程+多线程模式。
同时执行多个任务通常各个任务之间并不是没有关联的,而是需要相互通信和协调,有时,任务1必须暂停等待任务2完成后才能继续执行,有时,任务3和任务4又不能同时执行,所以,多进程和多线程的程序的复杂度要远远高于我们前面写的单进程单线程的程序。
因为复杂度高,调试困难,所以,不是迫不得已,我们也不想编写多任务。但是,有很多时候,没有多任务还真不行。想想在电脑上看电影,就必须由一个线程播放视频,另一个线程播放音频,否则,单线程实现的话就只能先把视频播放完再播放音频,或者先把音频播放完再播放视频,这显然是不行的。
Python既支持多进程,又支持多线程,我们会讨论如何 ...
Python细节小小知识点(五)
一、使用_slots_还可以尝试给实例绑定一个方法:
12345678>>> def set_age(self, age): # 定义一个函数作为实例方法... self.age = age...>>> from types import MethodType>>> s.set_age = MethodType(set_age, s) # 给实例绑定一个方法>>> s.set_age(25) # 调用实例方法>>> s.age # 测试结果25
但是,给一个实例绑定的方法,对另一个实例是不起作用的:
12345>>> s2 = Student() # 创建新的实例>>> s2.set_age(25) # 尝试调用方法Traceback (most recent call last): File "<stdin>", line 1, in <module>AttributeError: 'Studen ...
Python细节小小知识点(六)
一、回调模式和轮询模式你说“来个汉堡”,服务员告诉你,汉堡需要等5分钟,你可以先去逛商场,等做好了,我们再通知你,这样你可以立刻去干别的事情(逛商场),这是异步IO。很明显,使用异步IO来编写程序性能会远远高于同步IO,但是异步IO的缺点是编程模型复杂。想想看,你得知道什么时候通知你“汉堡做好了”,而通知你的方法也各不相同。如果是服务员跑过来找到你,这是回调模式,如果服务员发短信通知你,你就得不停地检查手机,这是轮询模式。总之,异步IO的复杂度远远高于同步IO。
二、读写文件2.1 二进制文件前面讲的默认都是读取文本文件,并且是UTF-8编码的文本文件。要读取二进制文件,比如图片、视频等等,用'rb'模式打开文件即可:
123>>> f = open('/Users/michael/test.jpg', 'rb')>>> f.read()b'\xff\xd8\xff\xe1\x00\x18Exif\x00\x00...' # 十六进制表示的字节
2.2 字符编码要读取非UTF ...
Python细节小小知识点(四)
一、作用域在一个模块中,我们可能会定义很多函数和变量,但有的函数和变量我们希望给别人使用,有的函数和变量我们希望仅仅在模块内部使用。在Python中,是通过_前缀来实现的。
正常的函数和变量名是公开的(public),可以被直接引用,比如:abc,x123,PI等;
类似__xxx__这样的变量是特殊变量,可以被直接引用,但是有特殊用途,比如__author__,__name__就是特殊变量,hello模块定义的文档注释也可以用特殊变量__doc__访问,我们自己的变量一般不要用这种变量名;
类似_xxx和__xxx这样的函数或变量就是非公开的(private),不应该被直接引用,比如_abc,__abc等;
之所以我们说,private函数和变量“不应该”被直接引用,而不是“不能”被直接引用,是因为Python并没有一种方法可以完全限制访问private函数或变量,但是,从编程习惯上不应该引用private函数或变量。
private函数或变量不应该被别人引用,那它们有什么用呢?请看例子:
1234567891011def _private_1(name): return ...
Python细节小小知识点(三)
一、高阶函数既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。
123def add(x, y, f): return f(x) + f(y)print(-10, 5, abs)
1.1 mapmap()函数接收一个函数名和n个可迭代对象。
123456>>> def f(x):... return x * x...>>> r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])>>> list(r)[1, 4, 9, 16, 25, 36, 49, 64, 81]
123456a = [1,2,3,4,5]b = [2,3,4,5,6]def sum_num(x, y): return x + ysum_a_b = map(sum_num, a, b)print(list(sum_a_b))
1.2 reducereduce把一个函数作用在一个序列[x1, x2, x3, ...]上,这个函数必须接收两个参数,reduce把结果 ...
Python细节小小知识点(二)
重新看了廖雪峰的Python,发现之前学过的后来都没用过导致记忆模糊哦,所以搬运过来了
一、尾递归fact(n)函数由于return n * fact(n - 1)引入了乘法表达式,所以就不是尾递归了。要改成尾递归方式,需要多一点代码,主要是要把每一步的乘积传入到递归函数中:
1234567def fact(n): return fact_iter(n, 1)def fact_iter(num, product): if num == 1: return product return fact_iter(num - 1, num * product)
可以看到,return fact_iter(num - 1, num * product)仅返回递归函数本身,num - 1和num * product在函数调用前就会被计算,不影响函数调用。
fact(5)对应的fact_iter(5, 1)的调用如下:
123456===> fact_iter(5, 1)===> fact_iter(4, 5)===> fact_iter(3, 20 ...
Python细节小小知识点(一)
重新看了廖雪峰的Python,发现之前学过的后来都没用过导致记忆模糊哦,所以搬运过来了
一、字符串与编码1.1 编码格式转换在最新的Python 3版本中,字符串是以Unicode编码的,也就是说,Python的字符串支持多语言。对于单个字符的编码,Python提供了ord()函数来获取字符的整数表示,chr()函数把编码转换成对应的字符。
12345678>>> ord('A')65>>> ord('中')20013>>> chr('66')`B`>>> chr(25991) #这里25991为十进制'文'
如果知道字符的整数编码,还可以用十六进制写str,两种写法等价。
12>>> '\u4e2d\u6587''中文'
由于Python的字符串类型是str,在内存中以Unicode表示,一个字符对应若干个字节。如果要在网络上传输,或者保存到磁盘上,就需要把str变为以字节为 ...