Python学习心得——基础知识(七)

时间:2022-09-29 16:25:05

一、冒泡排序

 1、要求

把列表中无序的字符按小到大排序:[9,6,15,11,36,28]

2、思路

把列表中相邻的字符值进行排序,值的放到右侧,逐个比较直到满足要求,类似水中的气泡朝水面移动。

3、样例

针对列表[9,236,1,7,5,18]按从小到大排序

 1 #!usr/bin/env python
2 # -*- coding: utf-8
3
4 lis=[9,236,1,7,5,18]
5 for i in range(1,len(lis)): #判断有几次大循环数据比较
6 for j in range(len(lis)-i): #取列表值的索引
7 if lis[j]>lis[j+1]:
8 temp=lis[j]
9 lis[j]=lis[j+1]
10 lis[j+1]=temp
11 print(lis)

 

二、递归

 1、思路

一个函数内部调用自身函数,那这个函数就是递归函数

2、知名样例

斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368...

当某个元素的值大于10000时,结束调用,展示满足条件的斐波那契数列

 1 #!usr/bin/env python
2 # -*- coding: utf-8 -*-
3
4 def f1(a1,a2):
5 if a1>10000: #若元素大于10000,结束调用
6 return
7 print(a1)
8 a3=a1+a2
9 f1(a2,a3)
10 r=f1(0,1)

 

三、装饰器

1、定义

装饰器是函数,它用来装饰其它函数或类,也就是对其它函数或类进行包装;作用是可以不在改变其它函数或类的功能下,添加相应功能。

2、样例

若f1函数的功能是打印‘功能1’,现在要不改变f1函数的前提下,调用f1函数,先打印‘功能2’,然后打印‘功能1’,最后打印‘功能3’

 1 #!usr/bin/env python
2 # -*- coding: utf-8 -*-
3
4 def f2(arge):
5 def inner():
6 print('功能2')
7 arge()
8 print('功能3')
9 return inner
10
11 @f2 #装饰器特有的标示
12 def f1():
13 print('功能1')
14
15 f1()

内部逻辑是怎么样的呢,请看下面图形分解

第1步:

Python学习心得——基础知识(七)

第2步:

Python学习心得——基础知识(七)

第3步:

Python学习心得——基础知识(七)

第4步:

Python学习心得——基础知识(七)

第5步:

Python学习心得——基础知识(七)

第6步:

Python学习心得——基础知识(七)

第7步:

Python学习心得——基础知识(七)

第8步:

Python学习心得——基础知识(七)

第9步:

Python学习心得——基础知识(七)

第10步:

Python学习心得——基础知识(七)

第11步:

Python学习心得——基础知识(七)

第12步:

Python学习心得——基础知识(七)

 3、被装饰的函数有一个参数

 1 #!usr/bin/env python
2 # -*- coding: utf-8 -*-
3
4 def f2(func):
5 def inner(arge):
6 print('功能2')
7 func(arge)
8 print('功能3')
9 return inner
10
11 @f2 #装饰器特有的标示
12 def f1(arge):
13 print('功能1')
14
15 arge='abc'
16 f1(arge)

4、动态参数

 1 #!usr/bin/env python
2 # -*- coding: utf-8 -*-
3
4 def f2(func):
5 def inner(*arge,**kwargs):
6 print('功能2')
7 func(*arge,**kwargs)
8 print('功能3')
9 return inner
10
11 @f2 #装饰器特有的标示
12 def f1(arge1,arge2,arge3):
13 print('功能1')
14
15 arge1='abc'
16 arge2='uio'
17 arge3='haoyun'
18 f1(arge1,arge2,arge3)

5、多个装饰器

 1 #!usr/bin/env python
2 # -*- coding: utf-8 -*-
3
4 def f3(func):
5 def inner(*arge,**kwargs):
6 print('功能5')
7 func(*arge,**kwargs)
8 print('功能4')
9 return inner
10
11
12 def f2(func):
13 def inner(*arge,**kwargs):
14 print('功能2')
15 func(*arge,**kwargs)
16 print('功能3')
17 return inner
18 @f3
19 @f2 #装饰器特有的标示
20 def f1(arge1,arge2,arge3):
21 print('功能1')
22
23 arge1='abc'
24 arge2='uio'
25 arge3='haoyun'
26 f1(arge1,arge2,arge3)

 

 四、正则

说明:正则本着会用即可的原则,此处直接引用了老师的佳作

1、语法

1
2
3
4
5
6
import  re  #导入模块名
 
=  re. compile ( "^[0-9]" )   #生成要匹配的正则对象 , ^代表从开头匹配,[0-9]代表匹配0至9的任意一个数字, 所以这里的意思是对传进来的字符串进行匹配,如果这个字符串的开头第一个字符是数字,就代表匹配上了
 
=  p.match( '14534Abc' )    #按上面生成的正则对象 去匹配 字符串, 如果能匹配成功,这个m就会有值, 否则m为None<br><br>if m: #不为空代表匹配上了
   print (m.group())     #m.group()返回匹配上的结果,此处为1,因为匹配上的是1这个字符<br>else:<br>  print("doesn't match.")<br>

上面的第2 和第3行也可以合并成一行来写:

 
=  p.match( "^[0-9]" , '14534Abc'

效果是一样的,区别在于,第一种方式是提前对要匹配的格式进行了编译(对匹配公式进行解析),这样再去匹配的时候就不用在编译匹配的格式,第2种简写是每次匹配的时候 都 要进行一次匹配公式的编译,所以,如果你需要从一个5w行的文件中匹配出所有以数字开头的行,建议先把正则公式进行编译再匹配,这样速度会快点。

 2、匹配格式

模式 描述
^ 匹配字符串的开头
$ 匹配字符串的末尾。
. 匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。
[...] 用来表示一组字符,单独列出:[amk] 匹配 'a','m'或'k'
[^...] 不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。
re* 匹配0个或多个的表达式。
re+ 匹配1个或多个的表达式。
re? 匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式
re{ n}  
re{ n,} 精确匹配n个前面表达式。
re{ n, m} 匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式
a| b 匹配a或b
(re) G匹配括号内的表达式,也表示一个组
(?imx) 正则表达式包含三种可选标志:i, m, 或 x 。只影响括号中的区域。
(?-imx) 正则表达式关闭 i, m, 或 x 可选标志。只影响括号中的区域。
(?: re) 类似 (...), 但是不表示一个组
(?imx: re) 在括号中使用i, m, 或 x 可选标志
(?-imx: re) 在括号中不使用i, m, 或 x 可选标志
(?#...) 注释.
(?= re) 前向肯定界定符。如果所含正则表达式,以 ... 表示,在当前位置成功匹配时成功,否则失败。但一旦所含表达式已经尝试,匹配引擎根本没有提高;模式的剩余部分还要尝试界定符的右边。
(?! re) 前向否定界定符。与肯定界定符相反;当所含表达式不能在字符串当前位置匹配时成功
(?> re) 匹配的独立模式,省去回溯。
\w 匹配字母数字
\W 匹配非字母数字
\s 匹配任意空白字符,等价于 [\t\n\r\f].
\S 匹配任意非空字符
\d 匹配任意数字,等价于 [0-9].
\D 匹配任意非数字
\A 匹配字符串开始
\Z 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串。c
\z 匹配字符串结束
\G 匹配最后匹配完成的位置。
\b 匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
\B 匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。
\n, \t, 等. 匹配一个换行符。匹配一个制表符。等
\1...\9 匹配第n个分组的子表达式。
\10 匹配第n个分组的子表达式,如果它经匹配。否则指的是八进制字符码的表达式。

 3、正则表达式五种常用操作

re.match(pattern, string)     # 从头匹配

re.search(pattern, string)    # 匹配整个字符串,直到找到一个匹配

re.split()            # 将匹配到的格式当做分割点对字符串分割成列表

1
2
>>>m  =  re.split( "[0-9]" "alex1rain2jack3helen rachel8" )
>>> print (m)

输出: ['alex', 'rain', 'jack', 'helen rachel', '']

re.findall()          # 找到所有要匹配的字符并返回列表格式

1
2
>>>m  =  re.findall( "[0-9]" "alex1rain2jack3helen rachel8" )
>>> print (m)<br>

输出:['1', '2', '3', '8']

re.sub(pattern, repl, string, count,flag)    # 替换匹配到的字符

1
2
m = re.sub( "[0-9]" , "|" "alex1rain2jack3helen rachel8" ,count = 2  )
print (m)

输出:alex|rain|jack3helen rachel8

 

五、模块

1、概念

模块它是多个功能的集合。

 

2、模块的分类

A:内置模块——python自带的模块

B:自定义模块——自己写的模块

C:第三方模块

 

3、模块导入格式

import  '模块名‘  

如:import re

 

4、常用的内置模块介绍

time/datetime模块

 1 #_*_coding:utf-8_*_
2 import time
3 import datetime
4
5 print(time.clock()) #返回处理器时间,3.3开始已废弃
6 print(time.process_time()) #返回处理器时间,3.3开始已废弃
7 print(time.time()) #返回当前系统时间戳
8 print(time.ctime()) #输出Tue Jan 26 18:23:48 2016 ,当前系统时间
9 print(time.ctime(time.time()-86640)) #将时间戳转为字符串格式
10 print(time.gmtime(time.time()-86640)) #将时间戳转换成struct_time格式
11 print(time.localtime(time.time()-86640)) #将时间戳转换成struct_time格式,但返回 的本地时间
12 print(time.mktime(time.localtime())) #与time.localtime()功能相反,将struct_time格式转回成时间戳格式
13 #time.sleep(4) #sleep
14 print(time.strftime("%Y-%m-%d %H:%M:%S",time.gmtime()) ) #将struct_time格式转成指定的字符串格式
15 print(time.strptime("2016-01-28","%Y-%m-%d") ) #将字符串格式转换成struct_time格式
16
17 #datetime module
18
19 print(datetime.date.today()) #输出格式 2016-01-26
20 print(datetime.date.fromtimestamp(time.time()-864400) ) #2016-01-16 将时间戳转成日期格式
21 current_time = datetime.datetime.now() #
22 print(current_time) #输出2016-01-26 19:04:30.335935
23 print(current_time.timetuple()) #返回struct_time格式
24
25 #datetime.replace([year[, month[, day[, hour[, minute[, second[, microsecond[, tzinfo]]]]]]]])
26 print(current_time.replace(2014,9,12)) #输出2014-09-12 19:06:24.074900,返回当前时间,但指定的值将被替换
27
28 str_to_date = datetime.datetime.strptime("21/11/06 16:30", "%d/%m/%y %H:%M") #将字符串转换成日期格式
29 new_date = datetime.datetime.now() + datetime.timedelta(days=10) #比现在加10天
30 new_date = datetime.datetime.now() + datetime.timedelta(days=-10) #比现在减10天
31 new_date = datetime.datetime.now() + datetime.timedelta(hours=-10) #比现在减10小时
32 new_date = datetime.datetime.now() + datetime.timedelta(seconds=120) #比现在+120s
33 print(new_date)

 

sys模块——用于提供对解释器相关的操作

1 sys.argv           命令行参数List,第一个元素是程序本身路径
2 sys.exit(n) 退出程序,正常退出时exit(0)
3 sys.version 获取Python解释程序的版本信息
4 sys.maxint 最大的Int值
5 sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
6 sys.platform 返回操作系统平台名称
7 sys.stdout.write('please:')
8 val = sys.stdin.readline()[:-1]

 

os模块——用于提供系统级别的操作

 1 os.getcwd()                #获取当前工作目录,即当前python脚本工作的目录路径
2 os.chdir("dirname") #改变当前脚本工作目录;相当于shell下cd
3 os.curdir #返回当前目录: ('.')
4 os.pardir #获取当前目录的父目录字符串名:('..')
5 os.makedirs('dirname1/dirname2') #可生成多层递归目录
6 os.removedirs('dirname1') #若目录为空,则删除,并递归到上一级目录,如若也为空,
7 则删除,依此类推
8 os.mkdir('dirname') #生成单级目录;相当于shell中mkdir dirname
9 os.rmdir('dirname') #删除单级空目录,若目录不为空则无法删除,报错;相当于shell
10 中rmdir dirname
11 os.listdir('dirname') #列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
12 os.remove() #删除一个文件
13 os.rename("oldname","newname") #重命名文件/目录
14 os.stat('path/filename') #获取文件/目录信息
15 os.sep #输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/"
16 os.linesep #输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n"
17 os.pathsep #输出用于分割文件路径的字符串
18 os.name #输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
19 os.system("bash command") #运行shell命令,直接显示
20 os.environ #获取系统环境变量
21 os.path.abspath(path) #返回path规范化的绝对路径
22 os.path.split(path) #将path分割成目录和文件名二元组返回
23 os.path.dirname(path) #返回path的目录。其实就是os.path.split(path)的第一个元素
24 os.path.basename(path) #返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。
25 即os.path.split(path)的第二个元素
26 os.path.exists(path) #如果path存在,返回True;如果path不存在,返回False
27 os.path.isabs(path) #如果path是绝对路径,返回True
28 os.path.isfile(path) #如果path是一个存在的文件,返回True。否则返回False
29 os.path.isdir(path) #如果path是一个存在的目录,则返回True。否则返回False
30 os.path.join(path1[, path2[, ...]]) #将多个路径组合后返回,第一个绝对路径之前的参数
31 将被忽略
32 os.path.getatime(path) #返回path所指向的文件或者目录的最后存取时间
33 os.path.getmtime(path) #返回path所指向的文件或者目录的最后修改时间