python day6

 

递归,阶乘
1*2*3*...7

def func(num):
    if num == 1:
        return 1
    return num * func(num-1)

x = func(7)
print(x)

 

反射
#利用字符串的形式去对像(模块)中操作(寻找/检查/删除/设置)成员
hasattr    #利用字符串的形式去对像(模块)判断是否存在,存在True,不存在False
getatrr    #利用字符串的形式去对像(模块)中操作(寻找)成员
delattr
setattr

 
commons.py
#!/usr/bin/env python
#-*- coding:utf-8 -*-
# Author:Minghu Wang


def login():
    print('炫酷登录页面')

def logout():
    print('炫酷退出页面')


def home():
    print('炫酷主页面')

 


   
index.py
import commons
def run():
    inp = input('请输入要访问的url:')  
    #hasattr  利用字符串的形式去对像(模块)判断是否存在,存在True,不存在False
    #getatrr  利用字符串的形式去对像(模块)中操作(寻找)成员
    #if hasattr(commons,login): 
    if hasattr(commons,inp):             #去commons判断你输入的是否存在此函数
        func = getattr(commons,inp)         #去commons寻找你输入相同字符函数
        func()
    else:
        print('404')

if __name__=='__main__':
    run()

   
   
   
结果
    请输入要访问的url:login
    炫酷登录页面

    请输入要访问的url:home
    炫酷主页面


    请输入要访问的url:logout
    炫酷退出页面


    请输入要访问的url:sadfskafjsafd
    404

 

   
   

   
   
程序二

----index.py

#!/usr/bin/env python
#-*- coding:utf-8 -*-
# Author:Minghu Wang

def run():
    # account/login
    inp = input('请输入要访问的url:')
    # inp字符串类型 inp = "login"
    # commons.inp() # commons.login
    # 利用字符串的形式去对象(模块)中操作(寻找/检查/删除/设置)成员,反射

    m, f = inp.split('/')        #以/方式输入分隔,前面为模块,后在为函数
    obj = __import__(m)          #以字符串形式调模块
    if hasattr(obj, f):
        func = getattr(obj, f)
        func()
    else:
        print('404')

if __name__ == '__main__':
    run()

   
   
----manager.py

#!/usr/bin/env python
#-*- coding:utf-8 -*-
# Author:Minghu Wang

def order():
    print('炫酷的订单页面')
   
   
   
   
----commons.py
   
#!/usr/bin/env python
#-*- coding:utf-8 -*-
# Author:Minghu Wang

def home():
    print('炫酷主页面')
   
   
   
----account.py

#!/usr/bin/env python
#-*- coding:utf-8 -*-
# Author:Minghu Wang


def login():
    print('炫酷登录页面')

def logout():
    print('炫酷退出页面')
   
   
   
结果:
    请输入要访问的url:manager/order           #输入manager/order
    炫酷的订单页面
   
    请输入要访问的url:account/jfkdsjfa
    404
   

 


   
obj = __import__('lib.account', fromlist=True)    #fromlist=True把lib和account拼接导入,否则查找到lib就停止了
print(obj)
   
#测试程序   
目录结构   
lib
    account.py
    commons.py
    manager.py
index.py

--index.py
def run():
    # account/login
    inp = input('请输入要访问的url:').strip()
    # inp字符串类型 inp = "login"
    # commons.inp() # commons.login
    # 利用字符串的形式去对象(模块)中操作(寻找/检查/删除/设置)成员,反射

    m, f = inp.split('/')
    # import lib.account
    obj = __import__("lib."+ m, fromlist=True)   #fromlist=True把lib拼接查找函数,否则查找到lib就停止了(调用lib目录模块)
    if hasattr(obj, f):                    #判断obj模块中是否有函数,有否为真,继续,没有报404
        func = getattr(obj, f)            #获取obj模块的函数
        func()                            #执行obj模块的函数
    else:
        print('404')

if __name__ == '__main__':
    run()
   
   
   
   
   
--manager.py
#!/usr/bin/env python
#-*- coding:utf-8 -*-
# Author:Minghu Wang

def order():
    print('炫酷的订单页面')
   
   
   
   
--commons.py   
#!/usr/bin/env python
#-*- coding:utf-8 -*-
# Author:Minghu Wang

def home():
    print('炫酷主页面')
   
   
   
--account.py
#!/usr/bin/env python
#-*- coding:utf-8 -*-
# Author:Minghu Wang
def login():
    print('炫酷登录页面')

def logout():
    print('炫酷退出页面')
       
       
       
结果
请输入要访问的url:manager/order
炫酷的订单页面       
       
       
       
       
       
       

获得我程序的根目录    (跨目录使用模块)
import sys
import os
#os.path.abspath 获得程序的绝对路径
#os.path.dirname 获取上级目录
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))  #os.path.abspath 获得程序的绝对路径
#print(sys.path)  

跨目录导入模块
    base_dir=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))    #定位我程序的根目录
    sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))  #将我的目录追加到sys.path


import os
import sys
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

from b import b1 as nb
nb.b()


程序实现
a
---a1.py
    def a():
        print('aaa')
b
---b1.py
    def b():
        print('bbb')

       
c
---test.py
    import os
    import sys
    sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))    # 一层层找
    from b import b1 as nb                        #导入b目录的b1程序,并别名
    nb.b()                                        #执行别名nb.b()  就是b目录中b1.py中的b函数
       

结果
bbb

 

 

当执行脚本时相等,别人调用时不执行(因为脚本名和__main__不相等)
__name__ == '__main__':  

 

 


老师博客:
http://www.cnblogs.com/wupeiqi/articles/5501365.html


进度百分比
import sys
import time


def view_bar(num, total):
    rate = float(num) / float(total)
    rate_num = int(rate * 100)
    r = '\r%d%%' % (rate_num, )
    sys.stdout.write(r)
    sys.stdout.flush()


if __name__ == '__main__':
    for i in range(0, 100):
        time.sleep(0.1)
        view_bar(i, 100)

 

进度百分比完整
import sys
import time

def view_bar(num, total):
    rate = num / total
    rate_num = int(rate * 100)
    r1 = '\r%s>%d%%' %("="*num, rate_num)
    sys.stdout.write(r1)
    sys.stdout.flush()
   
if __name__ == '__main__':
    # r = ' %d%%' % (1, )
    # print(r)
    # 0 - 100
    for i in range(0, 101):
        time.sleep(0.1)
        view_bar(i, 100)
       
       
       


   
       
       
       
重要
os.path.join(path1[, path2[, ...]])  将多个路径组合后返回,第一个绝对路径之前的参数将被

 

 

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所指向的文件或者目录的最后修改时间

#!/usr/bin/env python
#-*- coding:utf-8 -*-
# Author:Minghu Wang
"""
我是注释
"""

print(__doc__)

 

 


__cached__
from bin import admin
print(__file__)
print(__package__)
print(admin.__package__)
只有执行当前文件时候,当前文件的特殊变量 __name__ == "__main__"
__name__ == __main__

def run():
    print('run')

if __name__ == "__main__":
    run()
import os
print(os.pathsep)

 

 

 

 

hashlib

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

import hashlib

# ######## md5 ########
hash = hashlib.md5()
# help(hash.update)
hash.update(bytes('admin', encoding='utf-8'))
print(hash.hexdigest())
print(hash.digest())

 
######## sha1 ########
hash = hashlib.sha1()
hash.update(bytes('admin', encoding='utf-8'))
print(hash.hexdigest())

 

# ######## sha256 ########
hash = hashlib.sha256()
hash.update(bytes('admin', encoding='utf-8'))
print(hash.hexdigest())

 
# ######## sha384 ########
hash = hashlib.sha384()
hash.update(bytes('admin', encoding='utf-8'))
print(hash.hexdigest())


# ######## sha512 ########
hash = hashlib.sha512()
hash.update(bytes('admin', encoding='utf-8'))
print(hash.hexdigest())

 

 

以上加密算法虽然依然非常厉害,但时候存在缺陷,
即:通过撞库可以反解。所以,有必要对加密算法中添加自定义key再来做加密。
#Md5加码
import hashlib
obj = hashlib.md5(bytes('kfdsjfkjsafkj',encoding='utf-8'))    #第二次加密码,防止撞库
obj.update(bytes('123',encoding='utf-8'))                        #给字节123加密码
result = obj.hexdigest()                                      #输出md5值                   
print(result)

 


结果
f4d91bff1af010c7161ce872447977b5

 

 

       
       
       
re        
正则表达式
       
    字符:
    . 匹配除换行符以外的任意字符
    \w 匹配字母或数字或下划线或汉字
    \s 匹配任意的空白符
    \d 匹配数字
    \b 匹配单词的开始或结束
    ^ 匹配字符串的开始
    $ 匹配字符串的结束

    

    次数:
    * 重复零次或更多次
    + 重复一次或更多次
    ? 重复零次或一次
    {n} 重复n次
    {n,} 重复n次或更多次
    {n,m} 重复n到m次
    分组:
        去已经匹配到的数据中再提取数据
       
       
       
# match,从起始位置开始匹配,匹配成功返回一个对象,未匹配成功返回None       
# search,浏览整个字符串去匹配第一个,未匹配成功返回None
# findall,获取非重复的匹配列表;如果有一个组则以列表形式返回,且每一个匹配均是字符串;如果模型中有多个组,则以列表形式返回,且每一个匹配均是元祖;
# sub,替换匹配成功的指定位置字符串
# split,根据正则匹配分割字符串


s="web site is http://www.python.com"       
       
#search  匹配查找,直到找到第一个匹配为止,即不向下查找,匹配任意位置
re.search('w{3}\..*\..{2,4}',s)
a=re.search('w{3}\..*\..{2,4}',s)
a.group()
a=re.search('(w{3})\.(.*\.)(.{2,4})',s) #分组抽取
a.group(1)  #回显组1
a.group(2)
a.group(3)

 

#match  匹配开始,只从开头查找匹配
s="aaa   www.python.com"
a=re.match('(w{3})\.(.*\.)(.{2,4})',s)   #无法匹配,因为不是以www开头
print(a)
print(a.group())  #显示所有组


s="www.python.com"
a=re.match('(w{3})\.(.*\.)(.{2,4})',s)   #无法匹配,因为不是以www开头
print(a)
print(a.group())  #显示所有组


结果
<_sre.SRE_Match object; span=(0, 14), match='www.python.com'>
www.python.com

 

       
#re.findall – 所有匹配对象
xx='fdsafa  abc djfdksaf fdskjfsjalf abc  sdkfjsalf abc'
a = re.findall('abc',xx)  #abc全部回显
print(a)

 

结果
['abc', 'abc', 'abc']

 

       
#search ,  match , findall 综合例子
import re
s="foo bar foo abc foo"           #以foo开头
a = re.match('foo',s).group()      #可以查找到,因为以foo开头
b = re.search('foo',s).group()     #可以匹配,因为有foo字符
c = re.findall('foo',s)            #可以匹配所有

print(a)
print(b)
print(c)

结果
foo
foo
['foo', 'foo', 'foo']

 

s="xxx bar foo abc foo"   #不以foo开头测试
re.match('foo',s).group()   #会报错,无法匹配,因为不是以foo开头
re.search('foo',s).group()  #可以匹配,因有foo字符

 

#多重选择匹配
import re
s="web site is http://www.python.com "
a=re.search('(w{3})\.(.*\.)(.{cn|com|org|net})',s)
print(a.group())

 

结果
www.python.com


#re.compile 将正则表达式编译成对象,使用对象进行匹配

例子:
# encoding: UTF-8
import re
pattern = re.compile(r'hello') # 将正则表达式编译成Pattern对象
match = pattern.match('hello world!')   # 使用Pattern匹配文本,获得匹配结果,无法匹配时将返回None
if match:
      print(match.group()) # 使用Match获得分组信息
### 输出 ###
hello


#re.sub 匹配替换

import re
s = '100 BROAD'
a=re.sub('ROAD$', 'RD.', s)
print(a)

结果
100 BRD.


import re
k = '100 BRROAD  ROAD'
a = re.sub('\\bROAD$','RD.',k)    #有边界匹配替换
print(a)


结果
100 BRROAD  RD.


import re
s = '100 BRROAD  ROAD'
a = re.sub(r'\bROAD$','RD.',s)   #r为原始字符串,字符串中的所有字符都不转义
b = re.sub(r'\bROAD\b','RD.',s)  #只匹配两个\b中间字符

print(a)
print(b)

结果
100 BRROAD  RD.
100 BRROAD  RD.

 

       
       
       
       
       
正则综合练习

re.findall('alex','jsfjsfalexkjfkdslajfla')    
re.findall('al.x','jsfjsfaltxkjfkdslajfla')    #.x单个匹配

 

import re
origin = "hasaabc dfuojqw halaabc m098u2934l"
# r = re.match("h\w+", origin)
# r = re.match("h(\w+)", origin)
r = re.findall("h(\w+)a(ab)c", origin)
print(r)
print(r.group())     # 获取匹配到的所有结果
print(r.groups())    # 获取模型中匹配到的分组结果
print(r.groupdict()) # 获取模型中匹配到的分组结果

 

# 无分组
origin = "hello alex bcd alex lge alex acd 19"
r = re.split("alex", origin, 1)
print(r)

r = re.split("a(le)x", origin, 1)
print(r)


结果
['hello ', ' bcd alex lge alex acd 19']
['hello ', 'le', ' bcd alex lge alex acd 19']


分组
    去已经匹配到的数据中再提取数据
# 有分组,给分隔字符整个加括号

import re
origin = "hello alex bcd alex lge alex acd 19"
r1 = re.split("(alex)", origin, 1)    #用alex做分隔并取其值
print(r1)
r2 = re.split("(al(ex))", origin, 1)   #取分隔字符中的值
print(r2)


结果
['hello ', 'alex', ' bcd alex lge alex acd 19']
['hello ', 'alex', 'ex', ' bcd alex lge alex acd 19']

posted @ 2016-06-14 22:13  颠覆自我  阅读(169)  评论(0编辑  收藏  举报