python之day6(反射,模块,正则)
一,上期作业(ATM机+购物系统)
非本次课主要内容略过
二,递归的例子,阶乘
1*2*3*4*5*6*7并计算出结果。
def func(n): if n == 1: #n=1 直接终止这个函数 return 1 return n * func(n-1) #n=7 * func(7-1) 再重新执行这个函数 s=func(7) print(s)
*三,反射
实例:伪造web框架的路由系统
反射:基于字符串的形式去对象(模块)中操作其成员
delattr setattr hasattr getattr
扩展:导入模块
import xxx
from xx import ooo
字符串导入方法:
obj = __import__("xxx")
obj = __import__("xxx.oo.xxx",fromlist=True)
def run(): #account/login #模块/函数 inp = input('') #利用字符串的形式去对象(模块)中操作(寻找/检查/删除/设置)成员,反射 m,f = inp.split('/') obj = __import__("lib."+ m,fromlist=True) #import lib.m 写的路径是什么,就导入什么,lib目录下的模块导入方法 #delattr() #删除成员 #setattr() #设置成员 if hasattr(obj,f): #func = getattr(commons,"login") func = getattr(obj,f) func() else: print('404') if __name__ == '__main__': run
四,模块
已经学过的模块
logging
time/datetime
json/pickle
requests(简单涉及)
全局变量(python为什么生成的变量)
import s2
print(vars(s2))
模块中特殊的变量
__doc__ #查看注释
*__file__ #当前运行的py文件所在的绝对路径
__cached__ #指定字节码的路径
__name__ #只有执行当前文件时候,当前文件的特殊变量__name__ == "__main__"(被导入不等于)
*__package__ #引入模块的目录或者包
import os,sys
print(os.path.abspath(__file__)) #绝对路径
os.path.dirname 上级目录
ret = os.path.dirname(os.path.dirname(os.path.abspath)) #前两层目录
sys.path.append(ret) 加入可直接调用模块的列表
sys模块:
#python 解释器相关的
sys.stdout.write(r) #清除回车
sys.stdout.flush() #他是将我们写入缓冲区的内容刷到终端上,而不是清空
\r 回到当前行的首个位置
其他方法请关注:
sys.argv 命令行参数List,第一个元素是程序本身路径
sys.exit(n) 退出程序,正常退出时exit(0)
sys.version 获取Python解释程序的版本信息
sys.maxint 最大的Int值 sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
sys.platform 返回操作系统平台名称
sys.stdin 输入相关
sys.stdout 输出相关
sys.stderror 错误相关
进度条写法
import sys import time def view_bar(num, total): rate = float(num) / float(total) rate_num = int(rate * 100) #除完的数肯定是个小数所以要*100 r = '\r%d%%' % (rate_num, ) #\r 回到首行首位 sys.stdout.write(r) #去掉换行 sys.stdout.flush() #刷到终端 if __name__ == '__main__': for i in range(0, 101): time.sleep(0.1) view_bar(i, 100)
os模块:
#和系统相关的
os.path.abspath
os.path.dirname
os.path.join(path1[,path2]) #os.mkdir(os.path.join("D:\","test.txt"))这样就可以了。
#所以说os.path.join("D:\","test.txt")的功能仅仅是连接的作用,而不能生成。
其他os方法:
os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd
os.curdir 返回当前目录: ('.')
os.pardir 获取当前目录的父目录字符串名:('..')
os.makedirs('dir1/dir2') 可生成多层递归目录
os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
os.mkdir('dirname') 生成单级目录;相当于shell中mkdir dirname
os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
os.remove() 删除一个文件
os.rename("oldname","new") 重命名文件/目录
os.stat('path/filename') 获取文件/目录信息
os.sep 操作系统特定的路径分隔符,win下为"\\",Linux下为"/"
os.linesep 当前平台使用的行终止符,win下为"\t\n",Linux下为"\n"
os.pathsep 用于分割文件路径的字符串 os.name 字符串指示当前使用平台。win->'nt'; Linux->'posix'
os.system("bash command") 运行shell命令,直接显示
os.environ 获取系统环境变量 os.path.abspath(path) 返回path规范化的绝对路径
os.path.split(path) 将path分割成目录和文件名二元组返回
os.path.dirname(path) 返回path的目录。其实就是
os.path.split(path)的第一个元素
os.path.basename(path) 返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即
os.path.split(path)的第二个元素
os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False
os.path.isabs(path) 如果path是绝对路径,返回True
os.path.isfile(path) 如果path是一个存在的文件,返回True。否则返回False
os.path.isdir(path) 如果path是一个存在的目录,则返回True。否则返回False
os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
os.path.getatime(path) 返回path所指向的文件或者目录的最后存取时间
os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间
hashlib
#加密
import hashlib obj = hashlib.md5(bytes('xxxx',encoding='utf-8')) obj.update(bytes('123',encoding='utf-8')) res = obj.hexdigest() print(res)
五,正则表达式:
import re
re.findall('alex','dqwdeqwdqdxasdalexqwdqdxqw')
['alex']
2元字符
. 可以匹配任何一个除换行符以外的字符
^ 起始位置匹配
$ 终止位置匹配
* .*可以匹配0个-多个字符 重复前面的.,也可以是d*
+ .+可以匹配1个-多个字符
? .?可以匹配0个或者1个字符
{} .{3}可以匹配3次 .{1,5}可以匹配1到5次
[] re.findall('a[a-z]x','dqwdaaxqdxqw') []匹配字符集,
在[]中元素符将没有效果,
除了'-'#代表范围,
'^'#代表非,
'\' #\d 代表数字,匹配任意一个数字
'\b'#位置信息,匹配非字母数字(包括特殊字符,空白等)
re方法:
match:z只匹配字符串起始位置
>>> import re
>>> re.match('com', 'comwww.runcomoob').group()
'com'
>>> re.match('com', 'Comwww.runComoob',re.I).group()
'Com'
re.I 使匹配对大小写不敏感
re.L 做本地化识别(locale-aware)匹配
re.M 多行匹配,影响 ^ 和 $
re.S 使 . 匹配包括换行在内的所有字符
>>> re.findall(".","abc\nde")
>>> re.findall(".","abc\nde",re.S)
re.U 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
re.X 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。
re.S:.将会匹配换行符,默认.逗号不会匹配换行符
search:只找到一个就返回 re.search(r'\\','qaswdqwdwq\qwewq') 加r就是原生字符串否则要写\\\\
>>> re.search('\dcom', 'www.4comrunoob.5com').group()
'4com'
compile:
>>> p = re.compile(r'\d+')
>>> print(p.findall('one1two2three3four4'))
['1', '2', '3', '4']
sub:替换
subn:会提示替换的次数
>>> re.sub("g.t","have",'I get A, I got B ,I gut C')
'I have A, I have B ,I have C'
split:分割
>>> p = re.compile(r'\d+')
>>> p.split('one1two2three3four4')
['one', 'two', 'three', 'four', '']
>>> re.split('\d+','one1two2three3four4')
['one', 'two', 'three', 'four', '']
关于正则表达式详解:
推荐:http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html