跟着老男孩教育学Python开发【第五篇】:模块

递归的案例:阶乘
1*2*3*4*5*6*7…
- def func(num):
- if num == 1:
- return 1
- return num * func(num - 1)
- ret = func(7)
- print(ret)
反射
- def f1():
- print('f1')
f1:函数名
'f1':字符串
commons:
- def login():
- print('登录页面')
- def logout():
- print('退出页面')
- def home():
- print('主页面')
index:
- import commons
- def run():
- inp = input('请输入要访问的url:')
- if inp == 'login':
- commons.login()
- elif inp == 'logout':
- commons.logout()
- elif inp == 'home':
- commons.home()
- else:
- print('404')
- if __name__ == '__main__':
- run()
用反射进行优化,利用字符串的形式去对象(模块)中操作(寻找)成员。
index:
- import commons
- def run():
- inp = input('请输入要访问的url:')
- #反射:利用字符串的形式去对象(模块)中操作(寻找/检查/删除/设置)成员
- #hasattr查看inp是否存在(返回True or False)
- if hasattr(commons,inp):
- func = getattr(commons,inp)
- func()
- else:
- print('404')
- if __name__ == '__main__':
- run()
hasattr():寻找
getattr():检查
delattr():删除
setattr():设置
进一步优化,字符串导入。
index:
- def run():
- inp = input('请输入要访问的url:')
- m,f = inp.split('/')
- obj = __import__(m)
- if hasattr(obj,f):
- func = getattr(obj,f)
- func()
- else:
- print('404')
- if __name__ == '__main__':
- run()
补充,当需要导入文件夹下面的:
- obj = __import__('lib.account')
- print(obj)
- 输出:<module 'lib' from 'D:\\work_software\\PycharmProjects\\oldboy_python\\day6\\lib\\__init__.py'>
- obj = __import__('lib.account',fromlist=True)
- print(obj)
- 输出:<module 'lib.account' from 'D:\\work_software\\PycharmProjects\\oldboy_python\\day6\\lib\\account.py'>
web框架的路由系统。
特殊变量__file__
- import os
- print(__file__)
- #abspath()获取绝对路径
- print(os.path.abspath(__file__))
- #获取上级目录dirname()
- ret = os.path.dirname(os.path.abspath(__file__))
- ret_1 = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
- print(ret)
- print(ret_1)
- 输出:
- D:/work_software/PycharmProjects/oldboy_python/day6/bin/admin.py
- D:\work_software\PycharmProjects\oldboy_python\day6\bin\admin.py
- D:\work_software\PycharmProjects\oldboy_python\day6\bin
- D:\work_software\PycharmProjects\oldboy_python\day6
特殊变量__name__
- #只有执行当前文件的时候,当前文件的特殊变量__name__ == '__main__'
- def run():
- print('rum')
- if __name__ == "__main__":
- run()
sys模块
用于提供python解释器相关的操作。
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 time
- import sys
- def view_bar(num,total):
- rate = float(num)/float(total)
- rate_num = int(rate * 100)
- #数字进度显示
- #\r回到当前行的首位置
- r = '\r%d%%'%(rate_num)
- #输出不换行
- sys.stdout.write(r)
- #进度条显示
- """
- r1 = '\r%s>%d%%'%("="*num,rate_num)
- sys.stdout.write(r1)
- """
- sys.stdout.flush()
- if __name__ == '__main__':
- for i in range(0,101):
- time.sleep(0.1)
- view_bar(i,100)
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","newname"):重命名文件/目录
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
用于加密相关的操作,代替了md5模块和sha模块,主要提供SHA1,SHA224,SHA256,SHA512,MD5算法。
MD5加密:
- import hashlib
- #添加自定义key再来做加密
- obj = hashlib.md5(bytes('shisjajlj131424rdt5t6577ueuewmz',encoding='utf-8'))
- obj.update(bytes('123',encoding='utf-8'))
- result = obj.hexdigest()
- print(result)
正则表达式
字符匹配:普通字符、元字符。
普通字符匹配
- import re
- ret = re.findall('alex','adasjkalex78272hshdsjhds')
- print(ret)
- 输出:['alex']
元字符匹配
.:除换行符以外的任何一个字符
- import re
- ret = re.findall('al.x','uiiu9alaxuialbx798alcx21oalaaxiwq2al\nxjk')
- print(ret)
- 输出:['alax', 'albx', 'alcx']
^:以什么开头
- import re
- ret = re.findall('^al.x','al@xjkasjalexk')
- print(ret)
- 输出:['al@x']
$:以什么结尾
- import re
- ret = re.findall('al.x$','al@xhhalexuieuial#x')
- print(ret)
- 输出:['al#x']
*:重复*前面的字符0次到n次
- import re
- ret = re.findall('al.*x','yiuial3278hcxuxewualeexo')
- print(ret)
- 输出:['al3278hcxuxewualeex']
+:重复+前面一个字符的1次到n次
?:重复?前面一个字符的0次或1次
{}:指定重复的次数,{1,5}重复1次到5次,{5}重复5次,{,5}重复0次到5次,{5,}重复5次到n次。
[]:或,[a-z]匹配a到z的任何一个,[ab]匹配a或b。
[]里面的特殊含义
-:表示范围,例如[0-9]表示0到9。
^:表示非、排除,例如[^d]表示排除d;
\:反斜杠后边跟元字符去除特殊功能;反斜杠后边跟普通字符实现特殊功能;引用序号对应的字组所匹配的字符串,例如re.search(r"(alex)(eric)com\2","alexericcomeric")。
\d:匹配任何十进制数,相当于[0-9]。
\D:匹配任何非数字字符,相当于[^0-9]。
\s:匹配任何空白字符,相当于[ \t\n\r\f\v]。
\S:匹配任何非空白字符,相当于[^ \t\n\r\f\v]。
\w:匹配任何字母数字字符,相当于[a-zA-Z0-9_]。
\W:匹配任何非字母数字字符,相当于[^a-zA-Z0-9_]。
\b:匹配一个字符串的边界,也就是指单词和空格间的位置。字符串是指连续的字母、数字和下划线组成的。注意,\b的定义是\w和\W的交界。
- import re
- ret = re.findall(r'I\b','I am aaIbbb')
- print(ret)
- 输出:['I']
零宽界定符(zero-width assertions)只用以匹配字符串的头部和尾部。尾部用空白符或非字母数字符来标识。
():指定匹配的组。
函数
match
re.match(pattern,string,flags=0),match只匹配起始位置。
flags编译标志位,用于修改正则表达式的匹配方式,如是否区分大小写,多行匹配等。
- import re
- ret = re.match('com','comwww.runcomoob')
- print(ret)
- ret = re.match('com','comwww.runcomoob').group()
- print(ret)
- ret = re.match('com','comwww.runcomoob').span()
- print(ret)
- 输出:
- <_sre.SRE_Match object; span=(0, 3), match='com'>
- com
- (0, 3)
search
一旦匹配成功,就是一个match object对象。
- import re
- ret = re.search('\dcom','www.4comrunco.5com')
- print(ret)
- 输出:<_sre.SRE_Match object; span=(4, 8), match='4com'>
match object对象拥有以下方法:
group()返回被RE匹配的字符串。
group()返回re整体匹配的字符串,可以一次输入多个组号,对应组号匹配的字符串。
1、group()返回re整体匹配的字符串。
2、group(n,m)返回组号为n,m所匹配的字符串,如果组号不存在,则返回indexError异常。
3、groups()返回一个包含正则表达式中所有小组字符串的元组,从1到所含的小组号,通常groups()不需要参数,返回一个元组,元组中的元就是正则表达式中定义的组。
start()返回匹配开始的位置。
end()返回匹配结束的位置。
span()返回一个元组包含匹配(开始,结束)的位置。
findall
re.findall以列表形式返回所有匹配的字符串。
sub
匹配替换。
re.sub(pattern,repl,string,max=0)
- import re
- ret = re.sub("g.t","have",'I get A,I got B,I gut C')
- print(ret)
- 输出:I have A,I have B,I have C
设置最大替换次数
- import re
- ret = re.sub("g.t","have",'I get A,I got B,I gut C',2)
- print(ret)
- 输出:I have A,I have B,I gut C
subn
- import re
- ret = re.subn("g.t","have",'I get A,I got B,I gut C')
- print(ret)
- 输出:('I have A,I have B,I have C', 3)
split
- import re
- ret = re.split('\d+','0one1two2three3four4')
- print(ret)
- 输出:['', 'one', 'two', 'three', 'four', '']
compile
re.compile(strPattern[,flag])
这个方法是Pattern类的工厂方法,用于将字符串形式的正则表达式编译为Pattern对象。第二个参数flag是匹配模式,取值可以使用按位或运算符'|',表示同时生效,例如re.I|re.M,可以把经常使用的正则表达式编译成正则表达式对象,这样可以提高一定的效率。
- import re
- text = "JGood is a handsome boy,he is cool,clever,and so on..."
- regex = re.compile(r'\w*oo\w*')
- ret = regex.findall(text)
- print(ret)
- 输出:['JGood', 'cool']
re.I:使匹配对大小写不敏感。
re.L:做本地化识别(locale-aware)匹配。
re.M:多行匹配,影响^和$。
re.S:使"."匹配包括换行在内的所有字符。
re.U:根据Unicode字符集解析字符。这个标识影响\w,\W,\b,\B。
正则分组
在已经匹配到的数据中再提取数据。
match的分组匹配
- import re
- origin = "has dhjdahk29832"
- r = re.match("h\w+",origin)
- #获取匹配到的所有结果
- print(r.group())
- #获取模型中匹配到的分组结果
- print(r.groups())
- #获取模型中匹配到的分组结果
- print(r.groupdict())
- 输出:
- has
- ()
- {}
- import re
- origin = "has dhjdahk29832"
- r = re.match("h(\w+)",origin)
- #获取匹配到的所有结果
- print(r.group())
- #获取模型中匹配到的分组结果
- print(r.groups())
- #获取模型中匹配到的分组结果
- print(r.groupdict())
- 输出:
- has
- ('as',)
- {}
- import re
- origin = "has dhjdahk29832"
- r = re.match("h(?P<name>\w+)",origin)
- #获取匹配到的所有结果
- print(r.group())
- #获取模型中匹配到的分组结果
- print(r.groups())
- #获取模型中匹配到的分组结果
- print(r.groupdict())
- 输出:
- has
- ('as',)
- {'name': 'as'}
findall的分组匹配
- import re
- origin = "has sajkd hjda hk2983ds wqw2"
- r = re.findall("h(\w+)",origin)
- print(r)
- 输出:['as', 'jda', 'k2983ds']
- import re
- origin = "hasaabc sajkd hjdaabc hk2983dsaabc wqw2"
- r = re.findall("h(\w+)a(ab)c",origin)
- print(r)
- 输出:[('as', 'ab'), ('jd', 'ab'), ('k2983ds', 'ab')]
split的分组匹配
- import re
- origin = "hello alex bcd alex lgc alex acd 19"
- r = re.split("alex",origin,1)
- print(r)
- 输出:['hello ', ' bcd alex lgc alex acd 19']
- import re
- origin = "hello alex bcd alex lgc alex acd 19"
- #匹配值中()的内容需要输出
- r = re.split("(alex)",origin,1)
- print(r)
- 输出:['hello ', 'alex', ' bcd alex lgc alex acd 19']
- import re
- origin = "hello alex bcd alex lgc alex acd 19"
- r = re.split("a(le)x",origin,1)
- print(r)
- 输出:['hello ', 'le', ' bcd alex lgc alex acd 19']
- import re
- origin = "hello alex bcd alex lgc alex acd 19"
- r = re.split("(a(le)x)",origin,1)
- print(r)
- 输出:['hello ', 'alex', 'le', ' bcd alex lgc alex acd 19']
- import re
- origin = "hello alex bcd alex lgc alex acd 19"
- r = re.split("(a(l(e))x)",origin,1)
- print(r)
- 输出:['hello ', 'alex', 'le', 'e', ' bcd alex lgc alex acd 19']
跟着老男孩教育学Python开发【第五篇】:模块的更多相关文章
- 跟着老男孩教育学Python开发【第一篇】:初识Python
Python简介 Python前世今生 Python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解 ...
- 跟着老男孩教育学Python开发【第二篇】:Python基本数据类型
运算符 设定:a=10,b=20 . 算数运算 2.比较运算 3.赋值运算 4.逻辑运算 5.成员运算 基本数据类型 1.数字 int(整型) 在32位机器上,整数的位数为32位,取值范围为-2**3 ...
- 跟着老男孩教育学Python开发【第四篇】:模块
双层装饰器示例 __author__ = 'Golden' #!/usr/bin/env python # -*- coding:utf-8 -*- USER_INFO = {} def ch ...
- 跟着老男孩教育学Python开发【第三篇】:Python函数
set 无序,不重复,可嵌套. 函数 创建函数: 1.def关键字,创建函数 2.函数名 3.() 4.函数体 5.返回值 发邮件函数 def sendmail(): import smtpl ...
- Python开发第五篇
面向对象程序设计 面向过程编程:就是分析问题的解决步骤,按部就班的编写代码解决问题 函数式编程:就是把代码封装到函数中,然后在使用时调用封装好的函数 面向对象编程:把一类事物所共有的属性和行为提取出来 ...
- Python开发【第二篇】:初识Python
Python开发[第二篇]:初识Python Python简介 Python前世今生 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏 ...
- Python开发【第一篇】:目录
本系列博文包含 Python基础.前端开发.Web框架.缓存以及队列等,希望可以给正在学习编程的童鞋提供一点帮助!!! Python开发[第一篇]:目录 Python开发[第二篇]:初识Python ...
- Python开发【第一篇】:目录
本系列博文包含Python基础.前端开发.Web框架.缓存以及队列等,希望可以给正在学习Python编程的朋友们提供一点帮助! .Python开发[第一篇]:目录 .Python开发[第二篇]:初始P ...
- 【python自动化第五篇:python入门进阶】
今天内容: 模块的定义 导入方法 import的本质 导入优化 模块分类 模块介绍 一.模块定义: 用来在逻辑上组织python代码(变量,函数,逻辑,类):本质就是为了实现一个功能(就是以.py结尾 ...
随机推荐
- 01.SQLServer性能优化之----强大的文件组----分盘存储
汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 文章内容皆自己的理解,如有不足之处欢迎指正~谢谢 前天有学弟问逆天:“逆天,有没有一种方 ...
- MVVM模式和在WPF中的实现(一)MVVM模式简介
MVVM模式解析和在WPF中的实现(一) MVVM模式简介 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在 ...
- 菜鸟学Struts2——Struts工作原理
在完成Struts2的HelloWorld后,对Struts2的工作原理进行学习.Struts2框架可以按照模块来划分为Servlet Filters,Struts核心模块,拦截器和用户实现部分,其中 ...
- Js 原型和原型链
Js中通过原型和原型链实现了继承 Js对象属性的访问,首先会查找自身是否拥有这个属性 如果查到,则返回属性值,如果找不到,就会遍历原型链,一层一层的查找,如果找到就会返回属性值 直到遍历完Object ...
- favicon.ioc使用以及注意事项
1.效果 2.使用引入方法 2.1 注意事项:(把图标命名为favicon.ico,并且放在根目录下,同时使用Link标签,多重保险) 浏览器默认使用根目录下的favicon.ico 图标(如果你并没 ...
- SDWebImage源码解读 之 NSData+ImageContentType
第一篇 前言 从今天开始,我将开启一段源码解读的旅途了.在这里先暂时不透露具体解读的源码到底是哪些?因为也可能随着解读的进行会更改计划.但能够肯定的是,这一系列之中肯定会有Swift版本的代码. 说说 ...
- Asp.Net 操作XML文件的增删改查 利用GridView
不废话,直接上如何利用Asp.NET操作XML文件,并对其属性进行修改,刚开始的时候,是打算使用JS来控制生成XML文件的,但是最后却是无法创建文件,读取文件则没有使用了 index.aspx 文件 ...
- jQuery2.x源码解析(缓存篇)
jQuery2.x源码解析(构建篇) jQuery2.x源码解析(设计篇) jQuery2.x源码解析(回调篇) jQuery2.x源码解析(缓存篇) 缓存是jQuery中的又一核心设计,jQuery ...
- Jvm 内存浅析 及 GC个人学习总结
从诞生至今,20多年过去,Java至今仍是使用最为广泛的语言.这仰赖于Java提供的各种技术和特性,让开发人员能优雅的编写高效的程序.今天我们就来说说Java的一项基本但非常重要的技术内存管理 了解C ...
- C# 泛型
C# 泛型 1.定义泛型类 在类定义中包含尖括号语法,即可创建泛型类: class MyGenericClass<T> { //Add code } 其中T可以遵循C#命名规则的任意字符. ...