day05

1.递归

利用递归实现阶乘(1*2*3*4*5*6*7)

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

x = func(7)
print(x)

 2.反射

利用字符串的形式去对象(模块)中操作(寻找/检查/删除/设置)成员

getattr()

setattr()

hasattr()

delattr()

import commons
inp = input('请输入url:')
if hasattr(commons, inp)
    func = getattr(commons,inp)
    func()
else:
    print('404')

 __import__()

__import__('lib.' + m, fromlist=True)

3.特殊变量

__name__:只有执行当前文件时,当前文件的特殊变量__name__ == "__main__"

__doc__:文件的文档

__file__:当前文件的路径,相对路径

 4.sys模块

sys.path:返回一个列表,包含python环境变量

sys.platform:返回操作系统平台名称

进度条:

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

import sys
import time


def view_bar(num, total):
    rate = num / total
    new_rate = int(rate * 100)
    r = '
%s>%d%%' % ('='*num, new_rate)  # 
清除当前行第一个位置的内容,回到第一个位置
    sys.stdout.write(r)  # 相当于print,print打印默认带
换行,sys.stdout.write()不带换行符
    sys.stdout.flush()


def main():
    for i in range(101):
        time.sleep(0.1)  # 暂停0.1秒
        view_bar(i, 100)


if __name__ == '__main__':
    main()

5.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","new")  重命名文件/目录
os.stat('path/filename')    获取文件/目录信息
os.sep                      操作系统特定的路径分隔符,win下为"\",Linux下为"/"
os.linesep                  当前平台使用的行终止符,win下为"	
",Linux下为"
"
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所指向的文件或者目录的最后修改时间

6.hashlib模块

生成一个MD5密文

import hashlib

obj = hashlib.md5(bytes('asdf', encoding='utf-8'))
obj.update(bytes('123', encoding='utf-8'))
ret = obj.hexdigest()
print(ret)

7.正则表达式

python中re模块提供了正则表达式相关操作

字符:

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

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

s 匹配任意的空白符   

d 匹配数字   

 匹配单词的开始或结束   

^ 匹配字符串的开始   

$ 匹配字符串的结束

次数:

* 重复零次或更多次

+ 重复一次或更多次  

? 重复零次或一次

{n} 重复n次

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

{n,m} 重复n到m次

match

# match,从起始位置开始匹配,匹配成功返回一个对象,未匹配成功返回None
 
 
 match(pattern, string, flags=0)
 # pattern: 正则模型
 # string : 要匹配的字符串
 # falgs  : 匹配模式
     X  VERBOSE     Ignore whitespace and comments for nicer looking RE's.
     I  IGNORECASE  Perform case-insensitive matching.
     M  MULTILINE   "^" matches the beginning of lines (after a newline)
                    as well as the string.
                    "$" matches the end of lines (before a newline) as well
                    as the end of the string.
     S  DOTALL      "." matches any character at all, including the newline.
 
     A  ASCII       For string patterns, make w, W, , B, d, D
                    match the corresponding ASCII character categories
                    (rather than the whole Unicode categories, which is the
                    default).
                    For bytes patterns, this flag is the only available
                    behaviour and needn't be specified.
      
     L  LOCALE      Make w, W, , B, dependent on the current locale.
     U  UNICODE     For compatibility only. Ignored for string patterns (it
                    is the default), and forbidden for bytes patterns.
# 无分组
r = re.match("hw+", origin)
print(r.group())     # 获取匹配到的所有结果
print(r.groups())    # 获取模型中匹配到的分组结果
print(r.groupdict()) # 获取模型中匹配到的分组结果
# 有分组
# 为何要有分组?提取匹配成功的指定内容(先匹配成功全部正则,再匹配成功的局部内容提取出来)

r = re.match("h(w+).*(?P<name>d)$", origin)
print(r.group())     # 获取匹配到的所有结果
print(r.groups())    # 获取模型中匹配到的分组结果
print(r.groupdict()) # 获取模型中匹配到的分组中所有执行了key的组

 search

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

 # 无分组

 r = re.search("aw+", origin)
 print(r.group())     # 获取匹配到的所有结果
 print(r.groups())    # 获取模型中匹配到的分组结果
 print(r.groupdict()) # 获取模型中匹配到的分组结果

 # 有分组

 r = re.search("a(w+).*(?P<name>d)$", origin)
 print(r.group())     # 获取匹配到的所有结果
 print(r.groups())    # 获取模型中匹配到的分组结果
 print(r.groupdict()) # 获取模型中匹配到的分组中所有执行了key的组

 findall

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

 # 无分组
 r = re.findall("aw+",origin)
 print(r)

 # 有分组
 origin = "hello alex bcd abcd lge acd 19"
 r = re.findall("a((w*)c)(d)", origin)
 print(r)

 sub

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

 # 与分组无关

 origin = "hello alex bcd alex lge alex acd 19"
 r = re.sub("aw+", "999", origin, 2)
 print(r)

 split

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

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

 # 有分组
        
 origin = "hello alex bcd alex lge alex acd 19"
 r1 = re.split("(alex)", origin, 1)
 print(r1)
 r2 = re.split("(al(ex))", origin, 1)
 print(r2)

 常用正则表达式

IP:
^(25[0-5]|2[0-4]d|[0-1]?d?d)(.(25[0-5]|2[0-4]d|[0-1]?d?d)){3}$
手机号:
^1[3|4|5|8][0-9]d{8}$
邮箱:
[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(.[a-zA-Z0-9_-]+)+
原文地址:https://www.cnblogs.com/terrycy/p/5823619.html