一、前提介绍:

  可以开辟作用域的只有类,函数,和模块            for循环 if,else: 不能开辟自己的作用域

  避免程序复用和重复调用,将这些写到一个.py文件中,做成一个模块,进行调用,就不再需要重复的编写代码。

  模块就是py文件 使用的话就是:import 模块名

二、时间模块:time
  1、python中有三种方式来表示时间:时间戳、元组(stuct_time),格式化的时间字符串。

  时间戳:time.time() 从1970年开始以秒为单位计数的一个浮点型数字

  格式化的时间字符串(Format time)time.strftime(%Y-%m-%d %X,结构化时间(默认为当前时间)) 对人查看时间

  结构化时间(struct time):time.localtime(),是对时间进行操作

import time

#不传值默认为当前时间
print(time.time())
print(time.localtime())
print(time.strftime('%Y-%m-%d %X')) #格式化输出可以查看下方法 #执行结果:
1493193768.864164
time.struct_time(tm_year=2017, tm_mon=4, tm_mday=26, tm_hour=16, tm_min=2, tm_sec=48, tm_wday=2, tm_yday=116, tm_isdst=0)
2017-04-26 16:02:48

  2、几种时间格式的转换

(1)

import time

#时间戳与结构化时间之间的互换
#时间戳转成结构化时间
print(time.localtime(123456)) #本地时间 (UCT)
print(time.gmtime(123456)) #标准时间
#结构化时间转成时间戳,必须传一个结构化时间的做参数
print(time.mktime(time.localtime())) #执行结果:
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=2, tm_hour=18, tm_min=17, tm_sec=36, tm_wday=4, tm_yday=2, tm_isdst=0)
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=2, tm_hour=10, tm_min=17, tm_sec=36, tm_wday=4, tm_yday=2, tm_isdst=0)
1493193977.0 #结构化时间与字符串时间之间的转换
#结构化时间转成字符串时间
print(time.strftime('%Y-%m-%d %X',time.localtime()))#time.localtime()不写默认是当前时间
print(time.strftime('%Y-%m-%d %X',time.localtime(123456)))
#字符串时间转换成结构化时间
print(time.strptime('2017-4-21','%Y-%m-%d')) #字符串时间转成结构化时间 可以先查看下方法 #执行结果:
2017-04-26 16:06:17
1970-01-02 18:17:36
time.struct_time(tm_year=2017, tm_mon=4, tm_mday=21, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=4, tm_yday=111, tm_isdst=-1)

(2)

import time
#时间戳直接转换成字符串时间,有固定的格式
print(time.ctime(1234560))
print(time.ctime(2314560)) #执行结果:
Thu Jan 15 14:56:00 1970
Wed Jan 28 02:56:00 1970 #结构化时间直接转成字符串时间,有固定的格式
print(time.asctime(time.localtime()))
print(time.asctime(time.localtime(2314560))) #执行结果:
Wed Apr 26 16:08:35 2017
Wed Jan 28 02:56:00 1970

三、随机数模块:random模块

  random.random() 拿到0-1之间随机的小数
  random.randint(范围) 拿到范围内的整数
  random.randrange(范围) 拿到范围内的整数(顾头不顾尾)
  random.choice([1,2,3,4]) 随机选择一参数
  random.sample([1,2,3,4],2) 随机选择2个参数
  random.uniform(1,3) 随机输出一个1到3之间的小数
  random.shuffle([1,2,3,4]) 打乱序列,随机排序

import random

print(random.random()) #拿到0-1之间随机的小数

print(random.randint(1,3)) #随机拿到范围内的整数

print(random.randrange(1,3)) #随机拿到范围内的整数(顾头不顾尾)

print(random.choice([1,2,3,4])) #随机选择一参数(传值为列表形式)

print(random.sample([1,2,3,4],2)) #随机选择2个参数(传值为列表形式),结果也是列表格式

print(random.uniform(1,3)) #随机输出一个1到3之间的小数

l = [1,2,3,4]
random.shuffle(l) #打乱列表内元素的顺序,随机排序
print(l) #执行结果:
0.9841947311970075
2
1
4
[2, 4]
2.739979599540173
[4, 1, 3, 2]

小练习:随机生成验证码

import random
s = ''
for i in range(5):
Rnum = random.randint(0,9) #数字0-9
Rletter = random.randint(65,90) #大写字母A-Z
Rupper = random.randint(97,122) #小写字母a-z
res = random.choice([str(Rnum),chr(Rletter),chr(Rupper)])
s+=res
print(s)

四、摘要算法:hashlib模块

  摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。

  摘要算法就是通过摘要函数f()对任意长度的数据data计算出固定长度的摘要digest,目的是为了发现原始数据是否被人篡改过。

  摘要算法之所以能指出数据是否被篡改过,就是因为摘要函数是一个单向函数,计算f(data)很容易,但通过digest反推data却非常困难。而且,对原始数据做一个bit的修改,都会导致计算出的摘要完全不同。

  MD5是最常见的摘要算法,速度很快,生成结果是固定的128 bit字节,通常用一个32位的16进制字符串表示。

  注意:操作的是byte字节数据,如果是字符串str 则需要先转成字节 byte。

md5()方法
m = hashlib.md5()
m.update('hello'.encode('utf-8')) #字节数据 
print(m.hexdigest()) #16进制的摘要算法结果

import hashlib
#
md5 = hashlib.md5() #调用md5算法
md5.update(b'hello') #对字节格式的文件进行摘要算法计算
print(md5.hexdigest()) #打印算法结果 'hello'
#5d41402abc4b2a76b9719d911017c592 md5.update(b'world') #对字节格式的文件进行摘要算法计算 作用的字节是'helloworld'将上一次的加入到当前文本前
print(md5.hexdigest()) #打印算法结果。
#fc5e038d38a57032085441e7fe7010b0
#假设大文件为helloworld,最后得出的结果与上边最后打印的world一致。可以认为摘要算法有自动叠加的功能!
import hashlib
md5 = hashlib.md5() #调用md5算法
md5.update(b'helloworld') #
print(md5.hexdigest()) #打印算法结果 与上边执行的摘要算法结果一致。
#fc5e038d38a57032085441e7fe7010b0

  应用于:文件校验:大文件分块校验,防止文件过大导致的效率问题,最终传递的结果一样。

另一种常见的摘要算法是SHA1,调用SHA1和调用MD5完全类似:

import hashlib

sha1 = hashlib.sha1()
sha1.update('how to use sha1 in ')
sha1.update('python hashlib?')
print sha1.hexdigest()

 SHA1的结果是160 bit字节,通常用一个40位的16进制字符串表示。比SHA1更安全的算法是SHA256和SHA512,不过越安全的算法越慢,而且摘要长度更长。

2、摘要算法应用

任何允许用户登录的网站都会存储用户登录的用户名和口令。如何存储用户名和口令呢?方法是存到数据库表中:

name    | password
--------+----------
michael | 123456
bob | abc999
alice | alice2008

如果以明文保存用户口令,如果数据库泄露,所有用户的口令就落入黑客的手里。此外,网站运维人员是可以访问数据库的,也就是能获取到所有用户的口令。正确的保存口令的方式是不存储用户的明文口令,而是存储用户口令的摘要,比如MD5:

username | password
---------+---------------------------------
michael | e10adc3949ba59abbe56e057f20f883e
bob | 878ef96e86145580c38c87f0410ad153
alice | 99b1c2188db85afee403b1536010c2c9

考虑这么个情况,很多用户喜欢用123456,888888,password这些简单的口令,于是,黑客可以事先计算出这些常用口令的MD5值,得到一个反推表:

'e10adc3949ba59abbe56e057f20f883e': '123456'
'21218cca77804d2ba1922c33e0151105': '888888'
'5f4dcc3b5aa765d61d8327deb882cf99': 'password'

这样,无需破解,只需要对比数据库的MD5,黑客就获得了使用常用口令的用户账号。

对于用户来讲,当然不要使用过于简单的口令。但是,我们能否在程序设计上对简单口令加强保护呢?

由于常用口令的MD5值很容易被计算出来,所以,要确保存储的用户口令不是那些已经被计算出来的常用口令的MD5,这一方法通过对原始口令加一个复杂字符串来实现,俗称“加盐”:

hashlib.md5("salt".encode("utf8"))

经过Salt处理的MD5口令,只要Salt不被黑客知道,即使用户输入简单口令,也很难通过MD5反推明文口令。

但是如果有两个用户都使用了相同的简单口令比如123456,在数据库中,将存储两条相同的MD5值,这说明这两个用户的口令是一样的。有没有办法让使用相同口令的用户存储不同的MD5呢?

如果假定用户无法修改登录名,就可以通过把登录名(不再是口令)作为Salt的一部分来计算MD5,从而实现相同口令的用户也存储不同的MD5。

摘要算法在很多地方都有广泛的应用。要注意摘要算法不是加密算法,不能用于加密(因为无法通过摘要反推明文),只能用于防篡改,但是它的单向计算特性决定了可以在不存储明文口令的情况下验证用户口令。

五、OS模块
OS模块是与操作系统交互的接口
os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推;若目录内有内容,不会执行删除操作。

os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd
os.curdir 返回当前目录: ('.')
os.pardir 获取当前目录的父目录字符串名:('..')
os.makedirs('dirname1/dirname2') 可生成多层递归目录
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 输出用于分割文件路径的字符串 win下为;,Linux下为:
os.name 输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
os.system("bash command") 运行shell命令,直接显示
os.environ 获取系统环境变量
os.walk("path") 递归的获取,某目录下的文件绝对路径,文件夹和文件。注意点:文件夹和文件会以列表的形式存储。
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所指向的文件或者目录的最后修改时间
os.path.getsize(path) 返回path的大小
3、递归获取目录下所有文件并拼接路径打印的操作
#!/usr/bin/python
#coding:utf8 import os def listdir(path,fileslist): #传入存储的list for file in os.listdir(path):
file_path = os.path.join(path,file)
if os.path.isdir(file_path):
listdir(file_path,fileslist)
else:
fileslist.append(file_path)
return fileslist print dirlist("/home/testdir", [])

六、sys模块
与解释器交互

sys.argv           命令行参数List,第一个元素是程序本身路径
sys.exit(n) 退出程序,正常退出时exit(0)
sys.version 获取Python解释程序的版本信息
sys.maxint 最大的Int值
sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
sys.platform 返回操作系统平台名称

Py修行路 python基础 (二十)模块 time模块,random模块,hashlib模块,OS及sys模块的更多相关文章

  1. Py修行路 python基础 (十八) 反射 内置attr 包装

    一.isinstance 和 issubclass1.isinstance(obj,cls)检查是否obj是否是类 cls 的对象.2.issubclass(sub, super)检查sub类是否是 ...

  2. Py修行路 python基础 (十二) 协程函数应用 列表生成式 生成器表达式

    一.知识点整理: 1.可迭代的:对象下有_iter_方法的都是可迭代的对象 迭代器:对象._iter_()得到的结果就是迭代器 迭代器的特性: 迭代器._next_() 取下一个值 优点: 1.提供了 ...

  3. Py修行路 python基础 (十五)面向对象编程 继承 组合 接口和抽象类

    一.前提回忆: 1.类是用来描述某一类的事物,类的对象就是这一类事物中的一个个体.是事物就要有属性,属性分为 1:数据属性:就是变量 2:函数属性:就是函数,在面向对象里通常称为方法 注意:类和对象均 ...

  4. Py修行路 python基础 (十九)面向对象进阶(下)

    item系列 __slots__方法 __next__ 和 __iter__实现迭代器  析构函数 上下文管理协议 元类一.item系列 把对象操作属性模拟成字典的格式.  例如:对象名['key'] ...

  5. Py修行路 python基础 (十四)递归 及 面向对象初识及编程思想

    一.递归 1.定义: 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. (1)递归就是在过程或函数里调用自身: (2)在使用递归策略时,必须有一个明确的递归结束条件 ...

  6. Py修行路 python基础 (十六)面向对象编程的 继承 多态与多态性 封装

    一.继承顺序: 多继承情况下,有两种方式:深度优先和广度优先 1.py3/py2 新式类的继承:在查找属性时遵循:广度优先 继承顺序是多条分支,按照从左往右的顺序,进行一步一步查找,一个分支走完会走另 ...

  7. Py修行路 python基础 (十)装饰器

    装饰器 一.定义 装饰器:顾名思义,就是对某个东西起到装饰修饰的功能. python中的装饰器,其本质上就是一个python函数,它可以让其他函数在不需要任何代码变动的前提下增加额外功能.通俗理解就是 ...

  8. Py修行路 python基础 (二十三)模块与包

    一.模块 1)定义: 模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 2)为何要用模块: 退出python解释器然后重新进入,那之前定义的函数或者变量都将丢失,因 ...

  9. Py修行路 python基础 (二十五)线程与进程

    操作系统是用户和硬件沟通的桥梁 操作系统,位于底层硬件与应用软件之间的一层 工作方式:向下管理硬件,向上提供接口 操作系统进行切换操作: 把CPU的使用权切换给不同的进程. 1.出现IO操作 2.固定 ...

随机推荐

  1. ORACLE TO_CHAR,TO_DATE函数格式说明

    YEAR,年份的英文全称 YYYY:四位表示的年份 YYY,YY,Y:年份的最后三位.两位或一位,缺省为当前世纪 MM:01~12的月份编号 MONTH:九个字符表示的月份,右边用空格填补 MON:三 ...

  2. Ubuntu下Python使用MySQLdb远程连接数据库的常见问题及解决方案

    本文基于http://www.cnblogs.com/fnng/p/3565912.html这篇博文,学习使用MySQLdb过程中遇到下面这些问题. 1. 安装MySQLdb时运行sudo pytho ...

  3. Struts12---文件的下载

    01.创建一个下载的页面  (我们的下载是把文件的路径写成固定的) <body> <form action="user/download" method=&quo ...

  4. webpack 使用中的问题

    用gulp-watch代替watch webpack打包体积分析器 集合

  5. C++友元函数实现

    友元函数是一种特殊的函数,它必须要在类中进行声明,但其本身并不是类的成员函数,但友元函数可以访问类的私有成员变量. 友元函数的好处: 1.实现类之间的数据共享 2.提高程序运行效率,方便编程 友元函数 ...

  6. FFmpeg再学习 -- 视音频基础知识

    最近一直在看雷霄骅 FFmpeg 系列视频,然后将自己的理解总结一下. 参看:<基于 FFmpeg + SDL 的视频播放器的制作>课程的视频 一.视频播放器原理 自己理解: 比如一个 M ...

  7. 深入Guerrilla Games解密次世代开山大作《杀戮地带暗影坠落》(The technology of Killzone Shadow Fall)

    文章摘要:这几天终于有时间,把全文翻译完了,自己感觉不是太满意,不过大家能看懂就好,就当一个学习的机会.整篇文章通过SONY第一方游戏工作室Guerrilla Games主创的语录,为我们展现了次世代 ...

  8. 防止前端脚本JavaScript注入

    在使用ajax进行留言的时候,出现了一个问题.因为留言内容写完之后,通过ajax提交内容,同时使用js把留言的内容添加到页面上来.浏览留言的时候也是通过ajax请求,然后再显示的.这样,如果有人在留言 ...

  9. android wifi 热点、socket通讯

    WiFi管理工具类 package com.wyf.app.common; import java.lang.reflect.InvocationTargetException; import jav ...

  10. HDU - 6096 :String (AC自动机,已知前后缀,匹配单词,弱数据)

    Bob has a dictionary with N words in it. Now there is a list of words in which the middle part of th ...