首页 > 代码库 > python第六天:一些常用函数,面向对象入门
python第六天:一些常用函数,面向对象入门
上节回顾
yield的表达式用法→协程函数
只要函数内有yield关键字,函数名得到的结果就是生成器,表达式形式的生成器就是在整个生成的过程中使用send传值。
面向过程
面向过程的是编程范式的一种,是流水线式的编程范式,一般来说逻辑比较清晰,但是可扩展性差,牵一发而动全身。
匿名函数
匿名函数定义的时候要使用关键字lambda,格式如下 lambda val:val1,其中val是传的参数,val1是返回值。
递归函数
递归调用:在函数的调用过程中,直接或者间接的调用本身的话就是递归函数。递归函数需要注意的问题:
1、必须要有一个明确的结束条件;
2、每次递归,问题的规模都要减少;
3、递归有两个阶段,递推和回溯
模块和包的使用
模块的常见分类:内置模块、自定义模块、第三方模块。
导入模块干的事情:
1、产生新的名称空间
2、执行模块的代码,以1产生的名称空间为准。
3、定义一个模块名,指向1这个名称空间(就是用模块名.的方式调用)
4、方法和变量的使用:模块名.变量名
导入方法
import
from...import...
导入包:包就是看起来像一个文件夹,但又不是文件夹的东西。包是包含有__init__.py文件的目录。
包的用途是从目录级别去组织模块,包就相当于一个大的模块。
今日内容
正则模块(re)
正则模块主要是从一段信息中,匹配出来我们想要的东西出来,并且形成列表,比如说在一段字符串的算式中,匹配出所有的数字。
导入的方法是import re
常用的几个方法如下:
re.findall: 传入两个参数,第一个是匹配的parttern,第二个是要匹配的字符串。然后会返回一个列表,列表中包含字符串所有的结果。
re.search: 传入两个参数,第一个是匹配的parttern,第二个是要匹配的字符串,返回一个search对象。
re.match:相当于在search的parttern的前面加上了一个上尖号,只匹配开头的内容,最后返回一个search对象。
.group:search的partten中如果有多个小括号圈起来的表达式,说明要弄多个分组。在匹配成功的search对象使用.group方法就可以取出我们想要的结果。使用groups方法就是匹配全部的方法。
.split:也是传入两个参数,pattern和要匹配的字符串,在字符串中去除pattern所匹配出来的字符串,然后将剩余的部分形成一个列表返回给用户。
.sub:替换功能,匹配并且替换,还有后向引用的功能。
一些常用的pattern的元字符:
\w:匹配字母数字及下划线。
\W:匹配非字母数字下划线。
\s:所有的空白字符 \t\n\r\f
\S:所有的非空字符
\d:所有的数字
\D:匹配任意非数字
\n:匹配换行符
\t:匹配制表符
^:匹配字符串的开头
$:匹配字符串的末尾
*:0到无穷次
?:0次或1次
+:1次或无穷次
{}:指定出现的次数
?: :用在小括号里面
贪婪匹配/非贪婪匹配:贪婪匹配是.*,非贪婪匹配是.*?
|:匹配完就往后走继续匹配,知道所有的都结束。
这种情况的话,结果集的个数是和不加括号一样的,但是如果结果集内的结果不符合括号里面的内容,就直接替换成空。
时间模块(time)
时间模块的话主要是用来返回时间的。调用方式就是import time。在这个模块下面,时间有三种表现形式:时间戳、时间对象、格式化时间。
三种形式时间的获取:
.time():返回程序执行时刻的时间戳。
.localtime():返回程序执行时刻的时间对象。
.strftime("%Y-%m-%d %H:%M:%S"):返回当前时刻的格式化的时间。
.gmtime():返回程序执行时刻的格林尼治天文台的时间对象。
三种形式时间的相互转换:
时间戳转化为其他:
time.localtime(时间戳):将时间戳转化为时间对象。
time.ctime(时间戳):将时间戳转化为格式化时间。
时间对象转化为其他:
time.mktime(时间对象):将结构化的时间转化成时间戳。
time.strftime(格式,时间对象):将时间对象转化为格式化的时间
将格式化时间转化为其他:
time.strptime(格式化时间,格式):将格式化的时间转化为时间对象。
随机数模块(random)
我们知道一个
randint(num1,num2):在[num1,num2]之间随机生成一个整数。
random.choice:传入一个可迭代对象,然后随机选取其中的一个对象。
random.sample:传入一个列表和一个数字,随机将列表中数字个数的元素生成一个新的列表。
文件操作模块(os)
os.chdir(‘dirname’):改变当前脚本的工作目录;相当于是shell下的cd。
os.curdir 返回当前所在目录
os.pardir 获取当前目录的父目录字符串名字。
os.makedirs:生成一个多层递归的目录
removedirs:若目录为空,则删除目录,并递归到上一级目录,如若也为空,则删除,依此类推。
mkdir:生成单级目录。
rmdir:删除单级目录,如果不为空则无法删除。
listdir:列出执行目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印出来。只列出一层,不会递归的继续列出字目录。
remove:删除一个文件
rename:重命名文件/目录
stat:获取文件/目录信息
sep:输出操作系统的特殊的路径分割符。
linesep:输出当前平台使用的行终止符。
pathsep:输出用于分割文件路径的字符串。
name:输出字符串知识到当前平台
system:运行shell命令,直接显示。
environ:获取系统环境变量。
path.abspath(path):返回path规范化的绝对路径。
path.split(path):将path切分成dirname 和filename。
path.exists(path):如果path存在,则返回True,如果path不存在,返回False。
path.isabs(path):如果path是绝对路径,返回True。
path.isfile(path):如果path是一个存在的文件,返回True,否则返回False。
path.isdir(path):如果path是一个存在的目录,则返回True,否则返回False。
path.getsize(path):返回path的大小。
获取参数模块(sys)
sys.argv:以空格为分割将参数分割成一个列表,第一个元素是文件的路径。
文件、压缩包处理模块(shutil)
.copyfileobj:将一个文件对象的内容拷贝到另一个文件对象里面。
.copyfile(src,dst):拷贝文件。参数是文件名。
.copymode(src,dst):拷贝权限,内容、组、用户都保持不变。参数是文件名。
.copystat(src,dst):仅拷贝状态的信息,包括mode bits,atime,mtime,flags。参数是文件名。
.copy(src,dst):拷贝文件和权限。
数据序列化模块(json,pickle)
这两个模块就是数据的序列化,他的主要作用就是将内存中的数据序列化到硬盘中,或者将硬盘、网络传输的数据序列化到内存中。
序列化有两种模式,json,pickle。
pickle可以序列化所有的数据类型,但是不能跨平台,只能自己玩。他可以序列化一些eval无法序列化的东西,比如说NONE,布尔型数据。
json只能序列化字典,列表,字符串,数字等信息。对其他的python信息无法序列化。更多的作用是用来做数据交互的时候使用。
具体语法:
.dumps(data)
.loads(data)
将对象转化为json可以识别的字符串。
快捷操作
.dump(dic,open(‘b.json’))
.load(open(‘b.json’))
pickle的语法差不多:也是dumps,loads,dump,load。
XML模块
自己看
哈希模块
哈希模块主要是文本校验。
常用语法:
import hashlib
m = hashlib.md5()
m.update(‘xxxxx’.encode())
print(m.hexdigest())
对于大文件的md5校验
subpress模块
主要是调用系统本身的模块进行执行运行,并且将结果进行处理,比如说作为另外一个命令的输入,或者说存到变量里面去。
传送到变量中
res = subprocess.Popen(‘cmd’,shell=True,stderr=suprocess.PIPE,stdout=subprocess.PIPE)
res_right=res.stdout.read().decode(‘gbk’)
res_error=res.stderr.read()
自己做管道:
res1=subprocess.Popen(r’dir E:\wupeiqi\s17\day06’,stdout=subprocess.PIPE)
res=subprocess.Popen(r’findstr txt*’,shell=True,stdin=res1.stdout,stderr=subprocess.PIPE,stdout=subprocess.PIPE)
print(res.stdout.read().decode(‘gbk’))
这样在网络编程里面可以做两个线程之间的交互。注意:管道只能取一次内容,取一次管道就空了。
日志模块(logging)
日志模块主要记住下面的用法就好。
初始化模块。
logging.basicConfig(filename=‘.access.log.swap‘,
format=‘%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s‘,
datefmt=‘%Y-%m-%d %H:%M:%S %p‘,
level=0,
)
这样就初始化了日志内容,然后通过logging.debug(‘msg’)等等来进行对应日志级别的输出。
配置文件管理模块(configparser)
配置文件的格式如下:
[section1:base]
user = 111
passwd = 222
初始化生成一个对象:
config = ConfigParser.ConfigParser()
读取文件内容:
config.read(‘x.ini’)
增加section、内容:
config.add_section(‘section1’)
congfig.set(‘section1’,’age’,‘18’)
修改指定section里的内容:
config.set(‘section1’,‘age’,‘2000’)
删除section、内容:
config.remove_section(‘section1’)
config.remove_option(‘section1’,’age’)
查看:
config.sections():以列表形式返回所有的section。
config.option(section):返回section下的所有option
config.items(section):返回所有section下的所有键值对
config.get(section,option):返回这个目录下这个option的值。
将配置文件写到文件里面去:
config.write(open(filename,‘w‘))
软件开发规范
我们每开发一个软件,就要起一个软件名命名的目录,然后这个目录下面有个4个子目录:bin,conf,lib,logs。为了方便导入模块,要把这个大目录的路径放到sys.path里面去。
假设我们开发一个叫做ATM的软件,我们先建一个大的目录叫ATM,然后下面放。
bin
conf
lib
logs
四个目录
然后将ATM的目录加到sys,path里面去。
os.path.abspath(__file__)
base_dir=os.path.dirname(os.path.dirname())
sys.path.append(base_dir)
面向对象
面向对象主要是看中了他的可扩展性,但是优良的可扩展性带来的就是不可控性。
对象其实就是特征和技能的结合体。对象的特征是初始化的嘶吼定义的,而对象的技能是从初始化他的类中复刻下来的。
我们如果使用面向对象编程的话,需要先使用class定义一个类,这个类的实例化就可以产生对象。
类就是在很多个体中提取出共同的部分。
类和对象分别有自己的名称空间:
类在定义的时候就会产生类的名称空间,里面有数据属性和函数属性。
对象在实例化的时候也产生了对象的名称空间。里面只有数据属性。
查看他们的名称空间,使用__dict__方法。
python第六天:一些常用函数,面向对象入门