递归的案例:阶乘

1*2*3*4*5*6*7…

  1. def func(num):
  2.     if num == 1:
  3.         return 1
  4.     return num * func(num - 1)
  5.  
  6. ret = func(7)
  7. print(ret)

反射

  1. def f1():
  2.    print('f1')

f1:函数名

'f1':字符串

commons:

  1. def login():
  2.     print('登录页面')
  3.  
  4. def logout():
  5.     print('退出页面')
  6.  
  7. def home():
  8.     print('主页面')

index:

  1. import commons
  2.  
  3. def run():
  4.     inp = input('请输入要访问的url:')
  5.     if inp == 'login':
  6.         commons.login()
  7.     elif inp == 'logout':
  8.         commons.logout()
  9.     elif inp == 'home':
  10.         commons.home()
  11.     else:
  12.         print('404')
  13.  
  14. if __name__ == '__main__':
  15.     run()

用反射进行优化,利用字符串的形式去对象(模块)中操作(寻找)成员。

index:

  1. import commons
  2.  
  3. def run():
  4.     inp = input('请输入要访问的url:')
  5.     #反射:利用字符串的形式去对象(模块)中操作(寻找/检查/删除/设置)成员
  6.     #hasattr查看inp是否存在(返回True or False)
  7.     if hasattr(commons,inp):
  8.         func = getattr(commons,inp)
  9.         func()
  10.     else:
  11.         print('404')
  12. if __name__ == '__main__':
  13.     run()

hasattr():寻找

getattr():检查

delattr():删除

setattr():设置

进一步优化,字符串导入。

index:

  1. def run():
  2.     inp = input('请输入要访问的url:')
  3.     m,f = inp.split('/')
  4.     obj = __import__(m)
  5.     if hasattr(obj,f):
  6.         func = getattr(obj,f)
  7.         func()
  8.     else:
  9.         print('404')
  10.  
  11. if __name__ == '__main__':
  12.     run()

补充,当需要导入文件夹下面的:

  1. obj = __import__('lib.account')
  2. print(obj)
  3. 输出:<module 'lib' from 'D:\\work_software\\PycharmProjects\\oldboy_python\\day6\\lib\\__init__.py'>
  4. obj = __import__('lib.account',fromlist=True)
  5. print(obj)
  6. 输出:<module 'lib.account' from 'D:\\work_software\\PycharmProjects\\oldboy_python\\day6\\lib\\account.py'>

web框架的路由系统。

特殊变量__file__

  1. import os
  2.  
  3. print(__file__)
  4.  
  5. #abspath()获取绝对路径
  6. print(os.path.abspath(__file__))
  7.  
  8. #获取上级目录dirname()
  9. ret = os.path.dirname(os.path.abspath(__file__))
  10. ret_1 = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
  11. print(ret)
  12. print(ret_1)
  13. 输出:
  14. D:/work_software/PycharmProjects/oldboy_python/day6/bin/admin.py
  15. D:\work_software\PycharmProjects\oldboy_python\day6\bin\admin.py
  16. D:\work_software\PycharmProjects\oldboy_python\day6\bin
  17. D:\work_software\PycharmProjects\oldboy_python\day6

特殊变量__name__

  1. #只有执行当前文件的时候,当前文件的特殊变量__name__ == '__main__'
  2.  
  3. def run():
  4.     print('rum')
  5.  
  6. if __name__ == "__main__":
  7.     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:错误相关

进度百分比:

  1. import time
  2. import sys
  3.  
  4. def view_bar(num,total):
  5.     rate = float(num)/float(total)
  6.     rate_num = int(rate * 100)
  7.  
  8.     #数字进度显示
  9.     #\r回到当前行的首位置
  10.     r = '\r%d%%'%(rate_num)
  11.     #输出不换行
  12.     sys.stdout.write(r)
  13.  
  14.     #进度条显示
  15.     """
  16.     r1 = '\r%s>%d%%'%("="*num,rate_num)
  17.     sys.stdout.write(r1)
  18.     """
  19.  
  20.     sys.stdout.flush()
  21.  
  22. if __name__ == '__main__':
  23.     for i in range(0,101):
  24.         time.sleep(0.1)
  25.         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加密:

  1. import hashlib
  2.  
  3. #添加自定义key再来做加密
  4. obj = hashlib.md5(bytes('shisjajlj131424rdt5t6577ueuewmz',encoding='utf-8'))
  5. obj.update(bytes('123',encoding='utf-8'))
  6. result = obj.hexdigest()
  7. print(result)

正则表达式

字符匹配:普通字符、元字符。

普通字符匹配

  1. import re
  2.  
  3. ret = re.findall('alex','adasjkalex78272hshdsjhds')
  4. print(ret)
  5. 输出:['alex']

元字符匹配

.:除换行符以外的任何一个字符

  1. import re
  2.  
  3. ret = re.findall('al.x','uiiu9alaxuialbx798alcx21oalaaxiwq2al\nxjk')
  4. print(ret)
  5. 输出:['alax', 'albx', 'alcx']

^:以什么开头

  1. import re
  2.  
  3. ret = re.findall('^al.x','al@xjkasjalexk')
  4. print(ret)
  5. 输出:['al@x']

$:以什么结尾

  1. import re
  2.  
  3. ret = re.findall('al.x$','al@xhhalexuieuial#x')
  4. print(ret)
  5. 输出:['al#x']

*:重复*前面的字符0次到n次

  1. import re
  2.  
  3. ret = re.findall('al.*x','yiuial3278hcxuxewualeexo')
  4. print(ret)
  5. 输出:['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的交界。

  1. import re
  2.  
  3. ret = re.findall(r'I\b','I am aaIbbb')
  4. print(ret)
  5. 输出:['I']

零宽界定符(zero-width assertions)只用以匹配字符串的头部和尾部。尾部用空白符或非字母数字符来标识。

():指定匹配的组。

函数

match

re.match(pattern,string,flags=0),match只匹配起始位置。

flags编译标志位,用于修改正则表达式的匹配方式,如是否区分大小写,多行匹配等。

  1. import re
  2.  
  3. ret = re.match('com','comwww.runcomoob')
  4. print(ret)
  5.  
  6. ret = re.match('com','comwww.runcomoob').group()
  7. print(ret)
  8.  
  9. ret = re.match('com','comwww.runcomoob').span()
  10. print(ret)
  11.  
  12. 输出:
  13. <_sre.SRE_Match object; span=(0, 3), match='com'>
  14. com
  15. (0, 3)

search

一旦匹配成功,就是一个match object对象。

  1. import re
  2.  
  3. ret = re.search('\dcom','www.4comrunco.5com')
  4. print(ret)
  5.  
  6. 输出:<_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)

  1. import re
  2.  
  3. ret = re.sub("g.t","have",'I get A,I got B,I gut C')
  4. print(ret)
  5. 输出:I have A,I have B,I have C

设置最大替换次数

  1. import re
  2.  
  3. ret = re.sub("g.t","have",'I get A,I got B,I gut C',2)
  4. print(ret)
  5. 输出:I have A,I have B,I gut C

subn

  1. import re
  2.  
  3. ret = re.subn("g.t","have",'I get A,I got B,I gut C')
  4. print(ret)
  5. 输出:('I have A,I have B,I have C', 3)

split

  1. import re
  2.  
  3. ret = re.split('\d+','0one1two2three3four4')
  4. print(ret)
  5. 输出:['', 'one', 'two', 'three', 'four', '']

compile

re.compile(strPattern[,flag])

这个方法是Pattern类的工厂方法,用于将字符串形式的正则表达式编译为Pattern对象。第二个参数flag是匹配模式,取值可以使用按位或运算符'|',表示同时生效,例如re.I|re.M,可以把经常使用的正则表达式编译成正则表达式对象,这样可以提高一定的效率。

  1. import re
  2.  
  3. text = "JGood is a handsome boy,he is cool,clever,and so on..."
  4. regex = re.compile(r'\w*oo\w*')
  5. ret = regex.findall(text)
  6. print(ret)
  7. 输出:['JGood', 'cool']

re.I:使匹配对大小写不敏感。

re.L:做本地化识别(locale-aware)匹配。

re.M:多行匹配,影响^和$。

re.S:使"."匹配包括换行在内的所有字符。

re.U:根据Unicode字符集解析字符。这个标识影响\w,\W,\b,\B。

正则分组

在已经匹配到的数据中再提取数据。

match的分组匹配

  1. import re
  2.  
  3. origin = "has dhjdahk29832"
  4. r = re.match("h\w+",origin)
  5. #获取匹配到的所有结果
  6. print(r.group())
  7. #获取模型中匹配到的分组结果
  8. print(r.groups())
  9. #获取模型中匹配到的分组结果
  10. print(r.groupdict())
  11. 输出:
  12. has
  13. ()
  14. {}
  15.  
  16. import re
  17.  
  18. origin = "has dhjdahk29832"
  19. r = re.match("h(\w+)",origin)
  20. #获取匹配到的所有结果
  21. print(r.group())
  22. #获取模型中匹配到的分组结果
  23. print(r.groups())
  24. #获取模型中匹配到的分组结果
  25. print(r.groupdict())
  26. 输出:
  27. has
  28. ('as',)
  29. {}
  30.  
  31. import re
  32.  
  33. origin = "has dhjdahk29832"
  34. r = re.match("h(?P<name>\w+)",origin)
  35. #获取匹配到的所有结果
  36. print(r.group())
  37. #获取模型中匹配到的分组结果
  38. print(r.groups())
  39. #获取模型中匹配到的分组结果
  40. print(r.groupdict())
  41. 输出:
  42. has
  43. ('as',)
  44. {'name': 'as'}

findall的分组匹配

  1. import re
  2.  
  3. origin = "has sajkd hjda hk2983ds wqw2"
  4. r = re.findall("h(\w+)",origin)
  5. print(r)
  6. 输出:['as', 'jda', 'k2983ds']
  7.  
  8. import re
  9.  
  10. origin = "hasaabc sajkd hjdaabc hk2983dsaabc wqw2"
  11. r = re.findall("h(\w+)a(ab)c",origin)
  12. print(r)
  13. 输出:[('as', 'ab'), ('jd', 'ab'), ('k2983ds', 'ab')]

split的分组匹配

  1. import re
  2.  
  3. origin = "hello alex bcd alex lgc alex acd 19"
  4. r = re.split("alex",origin,1)
  5. print(r)
  6. 输出:['hello ', ' bcd alex lgc alex acd 19']
  7.  
  8. import re
  9.  
  10. origin = "hello alex bcd alex lgc alex acd 19"
  11. #匹配值中()的内容需要输出
  12. r = re.split("(alex)",origin,1)
  13. print(r)
  14. 输出:['hello ', 'alex', ' bcd alex lgc alex acd 19']
  15.  
  16. import re
  17.  
  18. origin = "hello alex bcd alex lgc alex acd 19"
  19. r = re.split("a(le)x",origin,1)
  20. print(r)
  21. 输出:['hello ', 'le', ' bcd alex lgc alex acd 19']
  22.  
  23. import re
  24.  
  25. origin = "hello alex bcd alex lgc alex acd 19"
  26. r = re.split("(a(le)x)",origin,1)
  27. print(r)
  28. 输出:['hello ', 'alex', 'le', ' bcd alex lgc alex acd 19']
  29.  
  30. import re
  31.  
  32. origin = "hello alex bcd alex lgc alex acd 19"
  33. r = re.split("(a(l(e))x)",origin,1)
  34. print(r)
  35. 输出:['hello ', 'alex', 'le', 'e', ' bcd alex lgc alex acd 19']

跟着老男孩教育学Python开发【第五篇】:模块的更多相关文章

  1. 跟着老男孩教育学Python开发【第一篇】:初识Python

    Python简介 Python前世今生 Python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解 ...

  2. 跟着老男孩教育学Python开发【第二篇】:Python基本数据类型

    运算符 设定:a=10,b=20 . 算数运算 2.比较运算 3.赋值运算 4.逻辑运算 5.成员运算 基本数据类型 1.数字 int(整型) 在32位机器上,整数的位数为32位,取值范围为-2**3 ...

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

    双层装饰器示例 __author__ = 'Golden' #!/usr/bin/env python # -*- coding:utf-8 -*-   USER_INFO = {}   def ch ...

  4. 跟着老男孩教育学Python开发【第三篇】:Python函数

    set 无序,不重复,可嵌套. 函数 创建函数: 1.def关键字,创建函数 2.函数名 3.() 4.函数体 5.返回值 发邮件函数 def sendmail():     import smtpl ...

  5. Python开发第五篇

    面向对象程序设计 面向过程编程:就是分析问题的解决步骤,按部就班的编写代码解决问题 函数式编程:就是把代码封装到函数中,然后在使用时调用封装好的函数 面向对象编程:把一类事物所共有的属性和行为提取出来 ...

  6. Python开发【第二篇】:初识Python

    Python开发[第二篇]:初识Python   Python简介 Python前世今生 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏 ...

  7. Python开发【第一篇】:目录

    本系列博文包含 Python基础.前端开发.Web框架.缓存以及队列等,希望可以给正在学习编程的童鞋提供一点帮助!!! Python开发[第一篇]:目录 Python开发[第二篇]:初识Python ...

  8. Python开发【第一篇】:目录

    本系列博文包含Python基础.前端开发.Web框架.缓存以及队列等,希望可以给正在学习Python编程的朋友们提供一点帮助! .Python开发[第一篇]:目录 .Python开发[第二篇]:初始P ...

  9. 【python自动化第五篇:python入门进阶】

    今天内容: 模块的定义 导入方法 import的本质 导入优化 模块分类 模块介绍 一.模块定义: 用来在逻辑上组织python代码(变量,函数,逻辑,类):本质就是为了实现一个功能(就是以.py结尾 ...

随机推荐

  1. Socket聊天程序——服务端

    写在前面: 昨天在博客记录自己抽空写的一个Socket聊天程序的初始设计,那是这个程序的整体设计,为了完整性,今天把服务端的设计细化记录一下,首页贴出Socket聊天程序的服务端大体设计图,如下图: ...

  2. MVC5+EF6+MYSQl,使用codeFirst的数据迁移

    之前本人在用MVC4+EF5+MYSQL搭建自己的博客.地址:www.seesharply.com;遇到一个问题,就是采用ef的codefirst模式来编写程序,我们一般会在程序开发初期直接在glob ...

  3. css样式之background详解

    background用法详解: 1.background-color 属性设置元素的背景颜色 可能的值 color_name            规定颜色值为颜色名称的背景颜色(比如 red) he ...

  4. JAVA环境变量和TomCat服务器配置

    Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选.对于一个初学者来说,可以这样 ...

  5. 在Centos下搭建git并可以通过windows客户端访问

    亲测在本地虚拟机和远程服务器上无问题,如有不懂请留言. 注意事项:以下所有操作是在root权限下操作的.1.Centos服务器版本centos6.5 2.首先安装git,使用yum在线安装 yum i ...

  6. 如何区别char与varchar?

    1.varchar与char两个数据类型用于存储字符串长度小于255的字符,MySQL5.0之前是varchar支持最大255.比如向一个长度为40个字符的字段中输入一个为10个字符的数据.使用var ...

  7. SQL Server存储过程

    创建于2016-12-24 16:12:19 存储过程 概念: 1.存储过程是在数据库管理系统中保存的.预先编译的.能实现某种功能的SQL程序,它是数据库应用中运用比较广泛的 一种数据对象. 2.存储 ...

  8. 监控 SQL Server (2005/2008) 的运行状况

    Microsoft SQL Server 2005 提供了一些工具来监控数据库.方法之一是动态管理视图.动态管理视图 (DMV) 和动态管理函数 (DMF) 返回的服务器状态信息可用于监控服务器实例的 ...

  9. Ford-Fulkerson 最大流算法

    流网络(Flow Networks)指的是一个有向图 G = (V, E),其中每条边 (u, v) ∈ E 均有一非负容量 c(u, v) ≥ 0.如果 (u, v) ∉ E 则可以规定 c(u, ...

  10. 任意多边形切割/裁剪(附C#代码实现)

    本实现主要参考了发表于2003年<软件学报>的<一个有效的多边形裁剪算法>(刘勇奎,高云,黄有群)这篇论文,所使用的理论与算法大都基于本文,对论文中部分阐述进行了详细解释,并提 ...