title: Python学习记录day6

tags: python

author: Chinge Yang

date: 2016-12-03

Python学习记录day6

@(学习)[python]

1.反射

反射:利用字符串的形式去对象(默认)中操作(寻找)成员

cat commons.py

  1. #!/usr/bin/env python
  2. #_*_coding:utf-8_*_
  3. '''
  4. * Created on 2016/12/3 21:54.
  5. * @author: Chinge_Yang.
  6. '''
  7. def login():
  8. print("炫酷登录")
  9. def home():
  10. print("炫酷页面")
  11. def logout():
  12. print("欢乐退出")

cat index.py

  1. #!/usr/bin/env python
  2. #_*_coding:utf-8_*_
  3. '''
  4. * Created on 2016/12/3 21:56.
  5. * @author: Chinge_Yang.
  6. '''
  7. import commons
  8. def run():
  9. if hasattr(commons, inp):
  10. inp = input("请输入要访问的url:")
  11. func = getattr(commons, inp)
  12. func()
  13. else:
  14. print("404")
  15. if __name__ == "__main__":
  16. run()

以字符串方式导入模块:

  1. obj = __import__("commons")
  2. obj = __import__("commons.login", fromlist = True)

实例实质:伪造Web框架的路由系统

getattr,delattr,setattr,hasattr

2.常用模块

模块中的特殊变量:

  1. print(__doc__) #获取文件开头的注释,(3个引号中间的信息)
  2. __cache__ #缓存pyc存放的位置
  3. print(__file__) #当前py文件所在的路径
  4. os.path.abspath() #获取文件的绝对路径
  5. os.path.dirname() #获取文件目录的名字
  6. sys.path.append(os.path.dirname(os.path.abspath(__file__))) #添加文件上层目录到python库
  7. print(admin.__packages__) #获取admin所在的包名
  8. #只有执行当前文件时,当前文件的特殊变量__name__ == "__main__"

2.1 sys

用于提供对Python解释器相关的操作:

  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.stdin 输入相关
  8. sys.stdout 输出相关
  9. sys.stderror 错误相关

进度条案例:

  1. #!/usr/bin/env python
  2. # _*_coding:utf-8_*_
  3. '''
  4. * Created on 2016/12/4 10:53.
  5. * @author: Chinge_Yang.
  6. '''
  7. import sys
  8. import time
  9. def view_bar(num, total):
  10. rate = num / total
  11. rate_num = int(rate * 100)
  12. #r = '\r%d%%' % (rate_num, )
  13. r = '\r%s>%d%%' % (">" * num, rate_num)
  14. sys.stdout.write(r)
  15. sys.stdout.flush()
  16. if __name__ == '__main__':
  17. for i in range(0, 100):
  18. time.sleep(0.1)
  19. view_bar(i, 100)

2.2 os

用于提供系统级别的操作:

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

2.3 hashlib

用于加密相关的操作,代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法

  1. import hashlib
  2. # ######## md5 ########
  3. hash = hashlib.md5()
  4. # help(hash.update)
  5. hash.update(bytes('admin', encoding='utf-8'))
  6. print(hash.hexdigest())
  7. print(hash.digest())
  8. ######## sha1 ########
  9. hash = hashlib.sha1()
  10. hash.update(bytes('admin', encoding='utf-8'))
  11. print(hash.hexdigest())
  12. # ######## sha256 ########
  13. hash = hashlib.sha256()
  14. hash.update(bytes('admin', encoding='utf-8'))
  15. print(hash.hexdigest())
  16. # ######## sha384 ########
  17. hash = hashlib.sha384()
  18. hash.update(bytes('admin', encoding='utf-8'))
  19. print(hash.hexdigest())
  20. # ######## sha512 ########
  21. hash = hashlib.sha512()
  22. hash.update(bytes('admin', encoding='utf-8'))
  23. print(hash.hexdigest())
  24. 以上加密算法虽然依然非常厉害,但时候存在缺陷,即:通过撞库可以反解。所以,有必要对加密算法中添加自定义key再来做加密。
  25. import hashlib
  26. # ######## md5 ########
  27. hash = hashlib.md5(bytes('ygqygq2',encoding="utf-8"))
  28. hash.update(bytes('admin',encoding="utf-8"))
  29. print(hash.hexdigest())
  30. python内置还有一个 hmac 模块,它内部对我们创建 key 内容 进行进一步的处理然后再加密
  31. import hmac
  32. h = hmac.new(bytes('ygqygq2',encoding="utf-8"))
  33. h.update(bytes('admin',encoding="utf-8"))
  34. print(h.hexdigest())

2.3 re

简介:

就其本质而言,正则表达式(或re)是一种小型的、高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过re模块实现。正则表达式模式被编译成一系列的字节码,然后由用C编写的匹配引擎执行。

  • 字符:

    . 匹配除换行符以外的任意字符

    \w 匹配字母或数字或下划线或汉字

    \s 匹配任意的空白符

    \d 匹配数字

    \b 匹配单词的开始或结束

    ^ 匹配字符串的开始

    $ 匹配字符串的结束

  • 次数:

    * 重复零次或更多次

    + 重复一次或更多次

    ? 重复零次或一次

    {n} 重复n次

    {n,} 重复n次或更多次

    {n,m} 重复n到m次

Python提供re模块,包含所有正则表达式的功能。由于Python的字符串本身也用\转义,所以要特别注意:

  1. s = 'ABC\\-001' # Python的字符串
  2. # 对应的正则表达式字符串变成:
  3. # 'ABC\-001'

因此我们强烈建议使用Python的r前缀,就不用考虑转义的问题了:

  1. s = r'ABC\-001' # Python的字符串
  2. # 对应的正则表达式字符串不变:
  3. # 'ABC\-001'

先看看如何判断正则表达式是否匹配:

  1. >>> import re
  2. >>> re.match(r'^\d{3}\-\d{3,8}$', '010-12345')
  3. <_sre.SRE_Match object; span=(0, 9), match='010-12345'>
  4. >>> re.match(r'^\d{3}\-\d{3,8}$', '010 12345')
  5. >>>

分组

除了简单地判断是否匹配之外,正则表达式还有提取子串的强大功能。用()表示的就是要提取的分组(Group)。比如:

^(\d{3})-(\d{3,8})$分别定义了两个组,可以直接从匹配的字符串中提取出区号和本地号码:

  1. >>> m = re.match(r'^(\d{3})-(\d{3,8})$', '010-12345')
  2. >>> m
  3. <_sre.SRE_Match object; span=(0, 9), match='010-12345'>
  4. >>> m.group(0)
  5. '010-12345'
  6. >>> m.group(1)
  7. '010'
  8. >>> m.group(2)
  9. '12345'

如果正则表达式中定义了组,就可以在Match对象上用group()方法提取出子串来。

注意到group(0)永远是原始字符串,group(1)、group(2)……表示第1、2、……个子串。

提取子串非常有用。来看一个更凶残的例子:

  1. >>> t = '19:05:30'
  2. >>> m = re.match(r'^(0[0-9]|1[0-9]|2[0-3]|[0-9])\:(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9])\:(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9])$', t)
  3. >>> m.groups()
  4. ('19', '05', '30')

这个正则表达式可以直接识别合法的时间。但是有些时候,用正则表达式也无法做到完全验证,比如识别日期:

'^(0[1-9]|1[0-2]|[0-9])-(0[1-9]|1[0-9]|2[0-9]|3[0-1]|[0-9])$'

对于'2-30','4-31'这样的非法日期,用正则还是识别不了,或者说写出来非常困难,这时就需要程序配合识别了。

编译

当我们在Python中使用正则表达式时,re模块内部会干两件事情:

编译正则表达式,如果正则表达式的字符串本身不合法,会报错;

用编译后的正则表达式去匹配字符串。

如果一个正则表达式要重复使用几千次,出于效率的考虑,我们可以预编译该正则表达式,接下来重复使用时就不需要编译这个步骤了,直接匹配:

  1. >>> import re
  2. # 编译:
  3. >>> re_telephone = re.compile(r'^(\d{3})-(\d{3,8})$')
  4. # 使用:
  5. >>> re_telephone.match('010-12345').groups()
  6. ('010', '12345')
  7. >>> re_telephone.match('010-8086').groups()
  8. ('010', '8086')

match

  1. # match,从起始位置开始匹配,匹配成功返回一个对象,未匹配成功返回None
  2. match(pattern, string, flags=0)
  3. # pattern: 正则模型
  4. # string : 要匹配的字符串
  5. # falgs : 匹配模式
  6. X VERBOSE Ignore whitespace and comments for nicer looking RE's.
  7. I IGNORECASE Perform case-insensitive matching.
  8. M MULTILINE "^" matches the beginning of lines (after a newline)
  9. as well as the string.
  10. "$" matches the end of lines (before a newline) as well
  11. as the end of the string.
  12. S DOTALL "." matches any character at all, including the newline.
  13. A ASCII For string patterns, make \w, \W, \b, \B, \d, \D
  14. match the corresponding ASCII character categories
  15. (rather than the whole Unicode categories, which is the
  16. default).
  17. For bytes patterns, this flag is the only available
  18. behaviour and needn't be specified.
  19. L LOCALE Make \w, \W, \b, \B, dependent on the current locale.
  20. U UNICODE For compatibility only. Ignored for string patterns (it
  21. is the default), and forbidden for bytes patterns.

实例:

  1. # 无分组
  2. r = re.match("h\w+", origin)
  3. print(r.group()) # 获取匹配到的所有结果
  4. print(r.groups()) # 获取模型中匹配到的分组结果
  5. print(r.groupdict()) # 获取模型中匹配到的分组结果
  6. # 有分组
  7. # 为何要有分组?提取匹配成功的指定内容(先匹配成功全部正则,再匹配成功的局部内容提取出来)
  8. r = re.match("h(\w+).*(?P<name>\d)$", origin)
  9. print(r.group()) # 获取匹配到的所有结果
  10. print(r.groups()) # 获取模型中匹配到的分组结果
  11. print(r.groupdict()) # 获取模型中匹配到的分组中所有执行了key的组

search

  1. # search,浏览整个字符串去匹配第一个,未匹配成功返回None
  2. # search(pattern, string, flags=0)

实例:

  1. # 无分组
  2. r = re.search("a\w+", origin)
  3. print(r.group()) # 获取匹配到的所有结果
  4. print(r.groups()) # 获取模型中匹配到的分组结果
  5. print(r.groupdict()) # 获取模型中匹配到的分组结果
  6. # 有分组
  7. r = re.search("a(\w+).*(?P<name>\d)$", origin)
  8. print(r.group()) # 获取匹配到的所有结果
  9. print(r.groups()) # 获取模型中匹配到的分组结果
  10. print(r.groupdict()) # 获取模型中匹配到的分组中所有执行了key的组

findall

  1. # findall,获取非重复的匹配列表;如果有一个组则以列表形式返回,且每一个匹配均是字符串;如果模型中有多个组,则以列表形式返回,且每一个匹配均是元祖;
  2. # 空的匹配也会包含在结果中
  3. #findall(pattern, string, flags=0)

实例:

  1. # 无分组
  2. r = re.findall("a\w+",origin)
  3. print(r)
  4. # 有分组
  5. origin = "hello alex bcd abcd lge acd 19"
  6. r = re.findall("a((\w*)c)(d)", origin)
  7. print(r)

sub

  1. # sub,替换匹配成功的指定位置字符串
  2. sub(pattern, repl, string, count=0, flags=0)
  3. # pattern: 正则模型
  4. # repl : 要替换的字符串或可执行对象
  5. # string : 要匹配的字符串
  6. # count : 指定匹配个数
  7. # flags : 匹配模式

实例:

  1. # 与分组无关
  2. origin = "hello alex bcd alex lge alex acd 19"
  3. r = re.sub("a\w+", "999", origin, 2)
  4. print(r)

split

  1. # split,根据正则匹配分割字符串
  2. split(pattern, string, maxsplit=0, flags=0)
  3. # pattern: 正则模型
  4. # string : 要匹配的字符串
  5. # maxsplit:指定分割个数
  6. # flags : 匹配模式

实例:

  1. # 无分组
  2. origin = "hello alex bcd alex lge alex acd 19"
  3. r = re.split("alex", origin, 1)
  4. print(r)
  5. # 有分组
  6. origin = "hello alex bcd alex lge alex acd 19"
  7. r1 = re.split("(alex)", origin, 1)
  8. print(r1)
  9. r2 = re.split("(al(ex))", origin, 1)
  10. print(r2)

常用正则表达式:

  1. IP
  2. ^(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}$
  3. 手机号:
  4. ^1[3|4|5|8][0-9]\d{8}$
  5. 邮箱:
  6. [a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+

Python学习记录day6的更多相关文章

  1. Python学习记录day5

    title: Python学习记录day5 tags: python author: Chinge Yang date: 2016-11-26 --- 1.多层装饰器 多层装饰器的原理是,装饰器装饰函 ...

  2. Python学习记录day8

    目录 Python学习记录day8 1. 静态方法 2. 类方法 3. 属性方法 4. 类的特殊成员方法 4.1 __doc__表示类的描述信息 4.2 __module__ 和 __class__ ...

  3. Python学习记录day7

    目录 Python学习记录day7 1. 面向过程 VS 面向对象 编程范式 2. 面向对象特性 3. 类的定义.构造函数和公有属性 4. 类的析构函数 5. 类的继承 6. 经典类vs新式类 7. ...

  4. Python学习记录:括号配对检测问题

    Python学习记录:括号配对检测问题 一.问题描述 在练习Python程序题的时候,我遇到了括号配对检测问题. 问题描述:提示用户输入一行字符串,其中可能包括小括号 (),请检查小括号是否配对正确, ...

  5. 实验楼Python学习记录_挑战字符串操作

    自我学习记录 Python3 挑战实验 -- 字符串操作 目标 在/home/shiyanlou/Code创建一个 名为 FindDigits.py 的Python 脚本,请读取一串字符串并且把其中所 ...

  6. 我的Python学习记录

    Python日期时间处理:time模块.datetime模块 Python提供了两个标准日期时间处理模块:--time.datetime模块. 那么,这两个模块的功能有什么相同和共同之处呢? 一般来说 ...

  7. Python 学习记录

    记录一些 学习python 的过程 -------------------------------------- 1. 初始学习 @2013年10月6日 今天开始学习python 了 遇到好多困难但是 ...

  8. python学习记录_IPython基础,Tab自动完成,内省,%run命令_

        这是我第一次写博客,之前也有很多想法,想把自己所接触的,以文本的形式储存,总是没有及时行动.此次下定决心,想把自己所学,所遇到的问题做个记录共享给诸位,与此同时自己作为备忘,感谢各位访问我的博 ...

  9. python学习笔记-Day6(2)

    xml处理模块 xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,不过,古时候,在json还没诞生的黑暗年代,大家只能选择用xml呀,至今很多传统公司如金融 ...

随机推荐

  1. .NET设计模式(1):1.1 单例模式(Singleton Pattern)

    概述 单例模式就是保证在整个应用程序的生命周期中,在任何时刻,被指定的类只有一个实例,并为客户程序提供一个获取该实例的全局访问点. 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单 ...

  2. Guava学习-目录

    备份一下地址: 目录 1. 基本工具 [Basic utilities] 让使用Java语言变得更舒适 1.1 使用和避免null:null是模棱两可的,会引起令人困惑的错误,有些时候它让人很不舒服. ...

  3. IT基础架构规划方案之实际网络设计案例

    根据某集团总部新办公大楼.厂房和分支机构(店面)的情况,以及IT部门对网络节点数.网络应用和分支机构(店面)的初步规划,对企业的总体网络拓扑结构进行设计,如下图. 设备选型和部署参考: 类型 设备选型 ...

  4. PHP规范PSR2

    为了尽可能的提升阅读其他人代码时的效率,下面例举了一系列的通用规则,特别是有关于PHP代码风格的.各个成员项目间的共性组成了这组代码规范.当开发者们在多个项目中合作时,本指南将会成为所有这些项目中共用 ...

  5. jQuery Ion.Calendar 日期/日历

    在线实例 实例演示 默认 实例演示 每周第一天 实例演示 输入框插件 实例演示 HTML data 属性 实例演示 回调函数1 实例演示 回调函数2 使用方法 <div id="cal ...

  6. ember.js里的实用方法

    一款基于jQuery的插件,以下是关于数组的一些方法 var arr = ['Wang', 'Jason', '444128852@qq.com', 'i2cao.xyz', 'ubuntuvim.x ...

  7. 【requireJS路径加载】与程序员小卡的交流

    这两天正好看到了程序员小卡同学的一篇博客,里面对requireJS路径的解析做了一些说明,里面有点问题待解决,我这里正好知道一点,所以整理成文,不知对小卡同学是否有帮助. http://www.cnb ...

  8. 码农干货系列【20】--add gtTime to Promise.js

    使用场景 在一些时候,希望一件task不能太快完成,需要大于多少时间才可以执行,就可以使用Promise的gtTime方法. 使用方式 Promise.gtTime(f1(), 5000).then( ...

  9. js的url解析函数封装

    在实际开发中,有些通过get方式与后台交换数据的时候,需要用到的数据在url中,因此就需要我们来获取到url中有用的信息,下面封装的函数已经可以将url解析的很彻底了,可以拿来直接用的: functi ...

  10. 春节快乐!推荐一个关于 SharePoint 和 BI 的视频,笑死我了

    在春节即将来临的日子里,我偶然看到了这个相见恨晚的视频:Attractive Business Intelligence 我几乎是从头笑到尾看完的,太有趣儿了!特别适合放假.过节的时候看.本来今天下午 ...