python学习笔记15

一、上堂回顾

1.默写题目

1.自定义一个异常,抛出异常对象并捕获

#1.自定义一个类,继承自Exception
class CustomException(Exception):
  #2.书写构造函数,调用父类的构造函数【将系统的异常机制继承】
  def __init__(self,msg):
    super(CustomException,self).__init__()
    self.msg = msg
    
  #3.重写__str__函数
  def __str__(self):
    return self.msg
  
  #4.定义一个成员函数,处理异常
  def handle(self):
    pass
  
 
#6.捕获:为了后面的代码能够正常运行
try:
    #5.抛出异常 raise  异常对象
    raise CustomException("自定义异常")
except CustomException as e:
  print(e)
  e.handle()

2.实现一个.txt文件内容的拷贝

import os
​
path1 = ""
path2 = ""
​
#1.打开文件
f1 = open(path1,"rb")
f2 = open(path2,"wb")
​
#2.读取并且写入
#获取源文件的大小
size = os.path.getsize(path1)
#循环读取文件,直到将所有的内容全部读取完毕  size = 0
while size > 0:
    content = f1.read(1024)
    f2.write(content)
    f2.flush()
    size -= 1024
    
#3.关闭文件
f1.close()
f2.close()

2.上堂回顾

 

3.作业讲解

3.1邮编查询

"""
2、邮编查询
        查到返回对应的城市 否则提示无此邮编
"""
​
num = input("请输入邮编")
​
path = "youbian.txt"
​
f = open(path,"r",encoding="utf-8")
​
result = f.readline()
​
while result:
    newStr = result[1:]
    if newStr.startswith(num):
        print(result[9:-4])
        break
    result = f.readline()

3.2开房记录查询

"""
3、开房查询
    输入名字,查询其开房记录,如果没有,是一个单纯哥们,如果有的话,将其所有开房信息写入到以这哥们命名的文件中
"""
import os
​
#1.读取文件
def loadFile(path):
    f = open(path,"r",encoding="utf-8")
    #返回值为一个列表
    l = f.readlines()
    f.close()
​
    return  l
​
#2.查询
def search(list1,name):
    #定义一个新的列表,用于保存能够查找到的人的信息
    subList = []
​
    #遍历原列表,获取每一条信息
    for line in list1:
        infoList = line.split(",")
        #查询
        if name == infoList[0]:
            #将查询到的数据添加到subList中
            subList.append(line)
​
    """
    如果查询到数据,则返回一个有信息的列表
    如果查询不到数据,则返回一个空列表
    """
    return subList
​
if __name__ == "__main__":
    path = "kaifanglist.txt"
​
    #调用读取数据的函数,返回的是所有的信息
    allList = loadFile(path)
​
    while True:
        name = input("请输入要查找的人的姓名【输入q退出】:")
        if name == "q":
            break
        else:
            #调用查找的函数
            singleList = search(allList,name)
​
            if singleList:
                print(name + "果然去开房了")
​
                #将singleList中的信息写入到一个新的文件中
                f = open(name + ".txt","a",encoding="utf-8")
​
                #遍历列表,将查询到的数据写入到文件中
                for row in singleList:
                    f.write(row)
                    f.flush()
​
                #关闭文件
                f.close()
​
                print("数据提取成功")
            else:
                print("他是个好人,好好珍惜吧")

二、csv文件读写

1.概念

csv:Comma Separated Values 逗号分隔值

.csv是一种文件格式【txt,doc】,是一种特殊的文本格式【一组字符序列,字符之间使用逗号或者使用制表符隔开】

作用:纯文本文件,存储数据,可以在不同的程序之间进行数据的交互

打开方式:记事本,excel

2.读取csv文件

代码演示:

#一.导入模块csv
import  csv
​
#二.三步读取
def readCsv1(path):
    #1.打开文件
    f = open(path,"r")
    #2.获取迭代类型【将打开的文件对象转换为一个可迭代对象】
    read = csv.reader(f)   #f.read(path)
    print(type(read))
​
    #3.遍历可迭代对象
    infoList = []
    for item in read:
        print(item)
        infoList.append(item)   #infoList就是一个二维列表
​
    #3.关闭文件
    f.close()
    return  infoList
​
​
path = r"person.csv"
print(readCsv1(path))
​
#三。简写形式
def readCsv2(path):
    infoList = []
    with open(path,"r") as f:
        read = csv.reader(f)
        for item in read:
            print(item)
            infoList.append(item)
    return  infoList

3.向csv文件写入

代码演示:

#一.导入模块csv
import  csv
​
#二、从列表写入csv
def writeCsv1(path):
​
    infoList = [['username', 'password', 'age', 'address'], ['zhangsan', 'abc123', '10', 'China'], ['lisi', 'aaa123', '18', 'xian']]
    #1.打开文件
    csvFile1 = open(path,"w",newline="")  #默认每一行的后面会出现一个空行,如果想要取消,则设置newline=""
    #2.将文件对象转换为可迭代对象
    writer1 = csv.writer(csvFile1)      #f.write("")
    #3.将列表中的数据分条写入
    for i in range(len(infoList)):
        writer1.writerow(infoList[i])
​
    #4.关闭文件
    csvFile1.close()
​
#writeCsv1("file1.csv")
​
#思考问题:使用普通文件的写入方式写入csv文件???
​
#三、从字典写入csv文件
def writeCsv2(path):
    dic = {"张三":123,"李四":111,"王麻子":999}
​
    csvFile2 = open(path,"w",newline="")
    writer2 = csv.writer(csvFile2)
    #遍历字典
    for key in dic:
        #写入
        writer2.writerow([key,dic[key]])
​
    csvFile2.close()
​
writeCsv2("file2.csv")
​
#四、简写方式
def writeCsv3(path):
    infoList = [['username', 'password', 'age', 'address'], ['zhangsan', 'abc123', '10', 'China'],
                ['lisi', 'aaa123', '18', 'xian']]
    with open(path,"w",newline="") as f:
        wri = csv.writer(f)
​
        for item in infoList:
            wri.writerow(item)

三、枚举类【了解】

代码演示:

from  enum import  Enum,IntEnum,unique
​
#1.当需要定义常量时,办法:使用大写字母定义变量名
#例如:
JAN = 1
FEB = 2
#好处:简单, 缺点;类型为int,并且本质上仍然是一个变量
​
#2.使用字典的方式定义常量
MONTH = {"JAN":1,"FEB":2}
print(MONTH["JAN"])
MONTH["JAN"] = 10
​
#3.使用类的方式定义常量
class Month(object):
    #类属性
    JAN = 1
    FEB = 2
print(Month.JAN)
m = Month()
print(m.JAN)
Month.JAN = 10
m.JAN = 20
​
#4.枚举类
"""
枚举类型可以被看做是一种标签或者是一系列常量的集合,将其中的常量称为枚举成员或者枚举常量
作用:常用来表示某些特定的有限的集合,例如:月份,星期,状态,性别
实现:enum模块
​
实现思路:
enum中提供了Enum类,IntEnum类和unique装饰器  三个工具
可以继承自Enum类或者IntEnum类
Enum类:通过定义一个类,继承自Enum类,该类就是一个枚举类
IntEnum类:通过定义一个类,继承自IntEnum类,则该类就是一个枚举类,限定枚举成员只能是为整数类型
unique装饰器:前提:类是一个枚举类,修饰一个类,表示该类中的枚举成员只能是唯一的
"""
​
#5.三个工具的使用
#注意1:枚举类的类名一般使用全大写
class MONTH1(Enum):
    #枚举成员/枚举常量
    #注意2:枚举中的成员就是一个实例【对象】,其实就是一个单例对象,不可更改,不可实例化,只能获取
    JAN = 1
    FEB = 2
​
#注意3:当一个类继承自IntEnum的时候,则枚举成员的值只能是int或者可以转换为int类型【调用了int()函数】
class MONTH2(IntEnum):
    JAN = 1
    FEB = "11"
​
​
#注意4:当使用unique修饰一个枚举类的时候,则枚举成员的值不能重复
@unique
class MONTH3(IntEnum):
    JAN = 1
    FEB = 2
    #MAR = 1   #ValueError: duplicate values found in <enum 'MONTH3'>: MAR -> JAN
​
#6.访问枚举成员
#方式一
print(MONTH3.JAN)
print(type(MONTH3.JAN))
#注意5:枚举成员的value一般使用int表示,从0开始
​
#方式二
jan = MONTH3(1)
print(jan)
​
#注意6:区别于普通类,枚举类的成员可以相互访问
#方式三
print(jan.FEB)
print(MONTH3.JAN.FEB)

四、高阶函数【掌握】

以一个函数作为参数,返回一个结果,被称为高阶函数

map()

reduce()

filter()

sorted()

1.map

代码演示:

"""
map(function,Iterable)
function:函数
Iterable:可迭代对象【list,tuple。dict,set,string,生成器】
作用:将传入的函数依次作用于可迭代对象中的每一个元素,并将结果返回
"""
​
#需求1:给一个已知列表中的元素求平方
def square(x):
    return  x ** 2
list1 = [1,2,3,4,5]
result1 = map(square,list1)
print(result1)   #<map object at 0x00000245058B0DD8>
print(type(result1))   #<class 'map'>
print(list(result1))   #[1, 4, 9, 16, 25]
​
#工作原理
"""
newList = []
for num in list1:
    newList.append(num ** 2)
​
列表生成式
newList = [num **2 for num in list1]
"""
result2 = map(lambda  x: x ** 2,list1)
print(list(result2))
​
#str = "hello"
​
#需求2:将整型元素的列表转换为字符串元素的列表
#举例:[1,2,3,4,5]---->[“1”,'2','3','4']
#str(1) ---->’1‘
#注意:在使用系统函数之前,最好不要出现同名的变量
result3 = map(str,[1,2,3,4])
print(list(result3))
​
#需求3:已知两个整型列表,将两个列表中相同位置的元素求和,返回一个新的列表
l1 = [1,2,3,4]
l2 = [5,6,7,8]
#[6,8,10,12]
def add(x,y):
    return  x + y
result4 = map(add,l1,l2)
print(list(result4))
​
"""
工作原理
newList1 = []
for i in range(len(l1)):
    newList1.append(l1[i] + l2[i])
​
print(newList1)
"""

2.reduce

代码演示:

from  functools import reduce
​
"""
reduce(function,Iterable)
function;函数
Iterable:可迭代对象,最常用的是list
作用:通过函数对可迭代对象中的元素进行累积,如何进行累积取决于函数中是如何实现的
工作原理:用传给reduce的fucntion先作用于list中的第一个和第二个元素,用得到的结果和list中第三个元素再进行指定的计算。。。
举例:
reduce(add,[a,b,c,d])
add(a,b)
add(add(a,b),c)
add(add(add(a,b),c),d)----->类似于递归
"""
#需求1:求一个已知列表中所有元素的和
list1 = [1,2,3,4,5]
def add(x,y):
    return  x + y
​
result1 = reduce(add,list1)
print(result1)   #15
​
"""
工作原理
add(1,2)---->3
add(3,3)---->6
add(6,4)---->10
add(10,5) ---->15
"""
​
#需求2:将列表[1,3,5,7,9]转换为整数13579
"""
工作原理
13 = 1 * 10 + 3
135 = 13 * 10 + 5
1357 = 135 *10 + 7
13579 = 1357 * 10 + 9
"""
list2 = [1,3,5,7,9]
def func(x,y):
    return  x * 10 + y
​
result2 = reduce(func,list2)
print(result2)
​
#需求3:结合map函数,实现一个将str转换为int的函数    int()
#前提:字符串为全数字组成的
def strToInt(s):
    d = {"0":0,"1":1,"2":2,"3":3}
    return d[s]
​
#第一步:将字符串中的每一个字符转换为对应的整型,得到一个列表
#strToInt("1")  --->1
#strToInt("12301")--->12301
result3 = map(strToInt,"2301")
#print(list(result3))   #[2, 3, 0, 1]
​
"""
"2301" ---->("2","3","0","1")
strToInt("2")---->d[s] --->d["2"] = 2
"""
​
#第二步:将列表中的每一个数字元素进行累积
result4 = reduce(func,list(result3))
print(result4)  #2301
result5 = reduce(func,map(strToInt,"2301"))
print(result5)

3.filter

代码演示:

"""
过滤器
filter(function,Iterable)
function;函数
Iterable:可迭代对象,最常用的是list
作用:进行数据的过滤
工作原理:将传入的函数依次作用于列表中的每一个元素,根据返回的结果为True或者False决定元素是否需要保留
"""
#需求1:将已知列表中的偶数元素筛选出来
list1 = [1,2,3,4,5,6,7,8,9,10]
​
newList = []
for num in list1:
    if num % 2 == 0:
        newList.append(num)
​
newList1 = [num for num in list1 if num % 2 == 0]
​
def func(num):
    #保留偶数元素
    if num % 2 == 0:
        return  True
​
    #剔除奇数元素
    return  False
​
result1 = filter(func,list1)
print(type(result1))
print(list(result1))
​
#需求2:将下面列表中 爱好为"无"的数据剔除掉
data = [["姓名","爱好","年龄"],["jack","dance",10],["bob","无",18]]
def func2(v):
    v = str(v)
    if v == "无":
        return  False
    return True
​
for line in data:
    result2 = filter(func2,line)
    print(list(result2))

4.sorted

代码演示:

#冒泡  选择
​
#1.普通排序
#注意:生成了一个新的列表,默认为升序排序
list1 = [3,2,5,6,2,4]
list2 = sorted(list1)
print(list1)
print(list2)
​
#2.按绝对值排序
#注意:sorted函数中,可以通过关键字key进行指定排序的规则
list3 = [-4,27,-10,5]
list4 = sorted(list3,key=abs)
print(list4)
​
​
#3.降序排序
#注意:关键字reverse,reverse=True说明降序
list5 = sorted(list1,reverse=True)
print(list5)
​
#4.字符也可以排序,排序的规则:在字典中出现的先后顺序
list6 =['g','o','f','a']
list7 = sorted(list6)
print(list7)
​
#5.自定义函数:按照字符串的长度进行排序
def myLen(s):
    return len(s)
list8 = ["fhgh","hello","abc","ll"]
list9 = sorted(list8,key=myLen,reverse=True)
print(list9)

五、发短信和发邮件【扩展】

APIID:C11345804

APIKey:735d183ae02189f678c26800ac19b03a

1.发短信

代码演示:

# 接口类型:互亿无线触发短信接口,支持发送验证码短信、订单通知短信等。
# 账户注册:请通过该地址开通账户http://sms.ihuyi.com/register.html
# 注意事项:
# (1)调试期间,请用默认的模板进行测试,默认模板详见接口文档;
# (2)请使用APIID(查看APIID请登录用户中心->验证码短信->产品总览->APIID)及 APIkey来调用接口;
# (3)该代码仅供接入互亿无线短信接口参考使用,客户可根据实际需要自行编写;
​
# !/usr/local/bin/python
# -*- coding:utf-8 -*-
import http.client
import urllib
​
host = "106.ihuyi.com"
sms_send_uri = "/webservice/sms.php?method=Submit"
​
# 用户名是登录用户中心->验证码短信->产品总览->APIID
account = "C11345804"
# 密码 查看密码请登录用户中心->验证码短信->产品总览->APIKEY
password = "735d183ae02189f678c26800ac19b03a"
​
​
def send_sms(text, mobile):
    params = urllib.parse.urlencode(
        {'account': account, 'password': password, 'content': text, 'mobile': mobile, 'format': 'json'})
    headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain"}
    conn = http.client.HTTPConnection(host, port=80, timeout=30)
    conn.request("POST", sms_send_uri, params, headers)
    response = conn.getresponse()
    response_str = response.read()
    conn.close()
    return response_str
​
​
if __name__ == '__main__':
    mobile = "18501970795"
    text = "您的验证码是:121254。请不要把验证码泄露给其他人。"
​
    print(send_sms(text, mobile))

2.发邮件

2.1发送纯文本

代码演示:

#SMTP:简单邮件传输协议,只能用来发送邮件,不能用来接收邮件
#需求:发送纯文本邮件
​
​
import  smtplib   #发邮件
from email.header import  Header   #邮件的标题
from email.mime.text import MIMEText   #邮件的正文
​
"""
user:用户名
pwd:密码【授权码】
sender:发送方
receiver:接收方
content:邮件正文
title:邮件标题
"""
def sendMail(user,pwd,sender,receiver,content,title):
    mail_host = "smtp.163.com"   #163的smtp的服务器
​
    #第一部分:准备工作
    #1.将邮件信息打包成一个对象
    message = MIMEText(content,"plain","utf-8")  #内容,格式,编码
    #2.设置邮件的发送者
    message["From"] = sender
    #3.设置邮件的接收者
    #message["To"] = receiver
    #注意:邮件的接收者可能有多个,使用list进行处理
    message["To"] = ",".join(receiver)    #用户1,用户2,一用户3
    #4.设置邮件的标题
    message["Subject"] = title
​
    #第二部分:开始发送邮件
    try:
        #1.启动服务器,
        #参数:服务器的地址,端口号
        smtpObj = smtplib.SMTP_SSL(mail_host,465)
        #2.登录邮箱并进行验证
        #参数:用户名  密码
        smtpObj.login(user,pwd)
        #3.开始发送
        #参数;发送者,接收者,发送的信息
        smtpObj.sendmail(sender,receiver,message.as_string())
​
        #4.标记发送成功
        print("send successful")
​
    except smtplib.SMTPException  as e:
        print(e)
​
if __name__ == "__main__":
    mail_user = "18501970795@163.com"   #邮箱用户名
    mail_pwd = "yang0122"           #邮箱授权码
​
    sender = "18501970795@163.com"   #发送方的邮箱地址
    receiver = ["1490980468@qq.com"]
​
    content = "XAPython1804"
    title = "邮件测试测试"
​
    sendMail(mail_user,mail_pwd,sender,receiver,content,title)

2.2发送带有附件的邮件

代码演示:

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值