首页 > 代码库 > 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:相当于在searchparttern的前面加上了一个上尖号,只匹配开头的内容,最后返回一个search对象。

.groupsearchpartten中如果有多个小括号圈起来的表达式,说明要弄多个分组。在匹配成功的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.getsizepath):返回path的大小。

 

获取参数模块(sys

sys.argv:以空格为分割将参数分割成一个列表,第一个元素是文件的路径。

文件、压缩包处理模块(shutil

.copyfileobj:将一个文件对象的内容拷贝到另一个文件对象里面。

 

.copyfilesrc,dst):拷贝文件。参数是文件名。

.copymode(src,dst):拷贝权限,内容、组、用户都保持不变。参数是文件名。

.copystatsrcdst):仅拷贝状态的信息,包括mode bits,atime,mtime,flags。参数是文件名。

.copysrc,dst):拷贝文件和权限。

 

 

 

 

 

数据序列化模块(jsonpickle

这两个模块就是数据的序列化,他的主要作用就是将内存中的数据序列化到硬盘中,或者将硬盘、网络传输的数据序列化到内存中。

序列化有两种模式,jsonpickle

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第六天:一些常用函数,面向对象入门