一、冒泡排序
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步:
第2步:
第3步:
第4步:
第5步:
第6步:
第7步:
第8步:
第9步:
第10步:
第11步:
第12步:
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 |
|
上面的第2 和第3行也可以合并成一行来写:
|
|
效果是一样的,区别在于,第一种方式是提前对要匹配的格式进行了编译(对匹配公式进行解析),这样再去匹配的时候就不用在编译匹配的格式,第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 |
|
输出: [‘alex‘, ‘rain‘, ‘jack‘, ‘helen rachel‘, ‘‘]
re.findall() # 找到所有要匹配的字符并返回列表格式
1 2 |
|
输出:[‘1‘, ‘2‘, ‘3‘, ‘8‘]
re.sub(pattern, repl, string, count,flag) # 替换匹配到的字符
1 2 |
|
输出: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所指向的文件或者目录的最后修改时间