def- define function

url

pip的安装

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g2ztViEV-1634118771721)(C:\Users\32873\AppData\Roaming\Typora\typora-user-images\image-20211011113735456.png)]

pip —> 包管理工具

修改python的命令行窗口使用程序:file → setting → Tools → Terminal → shell path:…cmd.exe → 勾选Active virtualenv → apply → ok

pip相关命令:

pip list 查看当前依赖的三方库

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pYQ02WVE-1634118771729)(C:\Users\32873\AppData\Roaming\Typora\typora-user-images\image-20211011114146510.png)]

快捷键

ctrl + d 复制一行代码

ctrl + y 删除一行代码

shift+alt+↓/↑ - 上移下移某行代码

代码格式规范化:ctrl + alt + L

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q3YVZ5eh-1634118771730)(C:\Users\32873\AppData\Roaming\Typora\typora-user-images\image-20211011144220555.png)]

控制台查找:控制台内 ctrl + f

优化导入顺序:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xXOCzcFu-1634118771733)(C:\Users\32873\AppData\Roaming\Typora\typora-user-images\image-20211012103202654.png)]

奇奇怪怪的bug

1包围符| ,可能遇到的的bug输入方式:中文输入拼音gun —> 丨

数据库导入顺序

库导入写法顺序:(从上往下)

​ 标准库

​ 三方库

​ 自己的库

❤ 对象序列化和反序列化

# 热身练习:将100以内的素数输出到一个文件中# 素数判断函数
def is_prime(num: int) -> bool:  '''判断一个正整数是不是质数:param num: 正整数:return: 质数返回True,否则返回False'''for i in range(2, int(num ** 0.5) + 1):  # 需取到num**0.5if num % i == 0:return Falsereturn Truewith open('prime.txt', 'w', encoding='utf-8') as file:for n in range(2, 100):if is_prime(n):# 方法一:print(n, file=file)  # 将结果打印到文件,而不是打印到控制台# 方法二:file.write(str(n))file.write('\n')  # 换行符# 方法三:file.write(f'{n}\n')  # 格式化字符串

1. 将字典和列表写入文件

对象的序列化(serialization)和反序列化(deserialization)

  • 序列化:把一个对象(字典、列表等)变成字符串(str)或者字节串(bytes)

  • 反序列化:从字节串或字符串中还原出一个对象(字典、列表等)

Python的标准库有**json(字符串) / pickle(字节串)**模块,可以支持我们做序列化和反序列化操作

JSON —> JavaScript Object Notation —> JavaScript语言创建对象的字面量语法 (字面量:常数量)

例如:

let person = {name: "骆骆",age: 41,sex: True
}

这种数据格式也非常适合在两个系统(尤其是异构的系统)传输数据(因为它是纯文本),所以今天当我们说到JSON,更多的时候是把它当成一种数据交换格式。

Python中的字典跟JSON格式非常的像,所以我们可以通过将字典转成JSON格式的字符串,就可以写入文件中实现持久化。

文件保存数据的方式:

  • 二进制文件,字节串

  • 文本文件,字符串

json序列化,其他编程语言能读出来

pickle序列化,是python的私有化语言,其他编程语言不能读出来

2 序列化和反序列化

2.1 json模块

Python3 中可以使用 json 模块来对 JSON(文本文件) 数据进行编解码,它包含了两个函数:

1)编码(序列化 - 把一个对象(字典、列表等)变成字符串(str)或者字节串(bytes))

  • json.dumps(): 对数据进行编码()。
  • json.dump(操作对象, fp = 文件对象): 对数据进行编码。

2)解码(反序列化 - 从字节串或字符串中还原出一个对象(字典、列表等))

  • json.loads(): 对数据进行解码。

2.1.1 序列化(读出)

将字典和列表写入到文件中

import jsonperson = {'name': '骆骆','age': 41,'sex': True,'friends': ['赵云', '马超', '辛弃疾'],'car': {'brand': 'QQ','max_speed': 120}
}
with open('person.txt', 'w') as file:# 序列化# 方法一:(分解写法)# content = json.dumps(person)# file.write(content)# 方法一:(合并写法)# print(json.dumps(person), file=file)# 方法二:json.dump(person, fp=file)

2.1.2 反序列化

读取文件中的JSON格式数据还原成字典对象

反序列化:将字符串还原成(字典)对象

import jsonwith open('person.txt') as file:# 反序列化:将字符串还原成(字典)对象# content = file.read()# obj = json.loads(content)# 从文件中读取JSON字符串还原成字典对象obj = json.load(fp=file)print(obj)print(type(obj))

2.2 pickle模块

Python3 中可以使用 pickle 模块来对 二进制文件 数据进行编解码,它包含了两个函数:

  • pickle.dumps(): 对数据进行编码。
  • pickle.dump(操作对象, file=文件对象):对数据进行编码。
  • pickle.loads(): 对数据进行解码。

2.3.1 序列化

将字典和列表写入到文件中

import pickleperson = {'name': '骆骆','age': 41,'sex': True,'friends': ['赵云', '马超', '辛弃疾'],'car': {'brand': 'QQ','max_speed': 120}
}
with open('person.dat', 'wb') as file:# 序列化# print(json.dumps(person), file=file)# content = json.dumps(person)# file.write(content)pickle.dump(person, file=file)

2.3.2 反序列化

读取文件中的Pickle格式数据还原成字典对象

反序列化:将字节串(二进制数据)还原成(字典)对象

import picklewith open('person.dat', 'rb') as file:# 反序列化:将字节串(二进制数据)还原成(字典)对象obj = pickle.load(file)print(obj)print(type(obj))# 结果:# {'name': '张三', 'age': 18, 'gender': True, 'friends': ['小花', '小明'], 'car': {'brand': 'QQ', 'max_speed': 120}}# class 'dict'>

❤ 联网获取数据(通过API接口获取数据)

URL —> 网址 —> 统一资源定位符 —> 能够唯一标识一个(网络)资源的符号
https://www.baidu.com:443/index.html
https://14.215.177.38:443/index.html
https://www.baidu.com:443/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png

协议://用户名:口令@域名或者IP地址:端口/路径1/路径2/资源名称

URI —> 统一资源标识符 —> URL + URN

使用三方库 requests 可以非常方便的实现通过URL访问网络资源的操作
可以使用Python的包管理工具 pip 来安装和管理三方库以及三方工具

修改 pip 下载源为国内的镜像网站(推荐使用豆瓣网的镜像)
pip config set global.index-url https://pypi.doubanio.com/simple

检查有没有pip包:terminal(py文件下方位置) - 输入:pip --version

查找三方库:pip search requests
安装三方库:pip install requests
卸载三方库:pip uninstall requests
更新三方库:pip install -U requests

协议 —> 规范和标准 —> 网络协议 —> 通过网络进行通信的双方要遵守的规范和标准
HTTP —> 超文本传输协议 —> 请求响应式协议

HTTP -> 超文本传输协议
HTTP(S) -> 超文本传输协议(安全版本)

3.1 导入第三方库 requests

首先,安装第三方库requests,使用前需先导入.

import requests

3.1 requests 模块

requests.get(url=数据地址, params = 请求数据参数) - 通过指定的URL向Web服务器发起一个请求,该函数会返回一个相应对象

网页上获取数据:例如:从聚合数据平台获取天气数据:聚合数据 —> 天气预报(查看) —> 申请数据(得到key) —> 测试 —> 填入请求参数 -> 发送请求

3.2 通过python联网获取数据

通过python联网获取数据:例如:从聚合数据平台获取天气数据:聚合数据 —> 天气预报 —> 申请数据,获取key—> 查看天气预报中的API文档,获取接口地址(http://apis.juhe.cn/simpleWeather/query),获取请求参数

# 从聚合数据平台获取天气数据
# 聚合数据 ---> 天气预报 ---> 申请数据,获取`key`---> 查看天气预报中的`API文档`,获取`接口地址`(http://apis.juhe.cn/simpleWeather/query),获取`请求参数`import jsonimport requests# get函数会通过你指定的URL向Web服务器发起一个请求,该函数会返回一个响应对象
resp = requests.get(url='http://apis.juhe.cn/simpleWeather/query',params={'city': '上海','key': 'e73ebce8dc3cb2f35510f4462f08430c'}
)
# 获取服务器响应的内容并将其反序列化成一个字典对象
weather_dict = json.loads(resp.text)
print(weather_dict['result']['realtime'])
# futures = weather_dict['result']['future']
# for future in futures:
#     print(future)
# 聚合数据 - 手机归属地import jsonimport requestsurl = 'http://apis.juhe.cn/mobile/get'key = 'a85eb75a4850c5502be6ff253e70b5f2'
phone = '15882460234'
resp_phone_belong = requests.get(url = url,params={'key':key,'phone':phone}
)print(resp_phone_belong.text)
phone_belong_dict = json.loads(resp_phone_belong.text)
print(phone_belong_dict)
# 天行数据 - 头条新闻获取
# 每页获取10条新闻
for page in range(1,6):resp_news = requests.get(url = 'http://api.tianapi.com/topnews/index',params={'key':'e8c5524dd2a365f20908ced735f8e480','page':1,'num':10})result = resp_news.json()  # 将resp_news转换为字典for news_dict in result['newslist']:print(news_dict['title'])  # 新闻标题print(news_dict['url'])  # 新闻链接print(news_dict['source'])  # 新闻来源print('-'*30)

3.3 通过响应对象获取服务器返回的内容

  • 文本文件对象.text - 通过响应对象获取服务器返回的文本内容

  • 二进制文件对象.content - 通过响应对象获取服务器返回的二进制数据

# 通过响应对象获取服务器返回的内容import requestsresp = requests.get('https://www.sohu.com/')
# 通过响应对象获取服务器返回的文本内容
print(resp.text)resp = requests.get('http://29e5534ea20a8.cdn.sohucs.com/c_cut,x_47,y_0,w_588,h_392,c_zoom,h_103/os/news/d5d461792f7944f11e9ed9a2bd2ff7a5.jpg')
with open('test.jpg', 'wb') as file:# 通过响应对象获取服务器返回的二进制数据file.write(resp.content)

给文件标题添加时间

from datetime import datetimeimport openpyxl
import requestsworkbook = openpyxl.Workbook()
sheet = workbook.active
sheet.append(('标题', '链接', '来源'))
for page in range(1, 6):resp = requests.get(url='http://api.tianapi.com/topnews/index',params={'key': 'e8c5524dd2a365f20908ced735f8e480','page': page,'num': 20})result = resp.json()for news_dict in result['newslist']:title, url, source = news_dict['title'], news_dict['url'], news_dict['source']sheet.append((title, url, source))
curr = datetime.now()
workbook.save(f'头条新闻数据_{curr.year}{curr.month:0>2d}{curr.day:0>2d}.xlsx')

❤ 用python操作Excel文件

4.1 导入第三方库 openpyxl

工作簿:一个Excel文件叫一个工作簿

工作表(sheet) :

单元格(cell):Excel文件表中的行列交汇点叫单元格

python操作Excel文件需借助第三方库openpyxl

首先,安装第三方库openpyxl,使用前需先导入

import openpyxl

4.2 创建工作簿

创建一个Excel工作簿

workbook = openpyxl.Workbook()

创建工作表

workbook.create_sheet('hello')

获取默认的工作表

sheet = workbook.active

4.3 将数据写入Excel文件

  • 工作表.append(数据)

  • 工作表.cell(行索引,列索引,数据)

    • 注意:列表中的行索引和列索引都是从1开始的
sheet.append(('姓名', '语文', '数学', '英语'))
sheet.append(('张三', 50, 60, 70))
sheet.append(('李四', 53, 66, 72))
sheet.append(('王五', 51, 67, 74))sheet.cell(5, 1, '小明')  # 在5行4列单元格写入'小明'

4.4 保存工作簿

  • 工作对象.save(文件路径)
workbook.save('学生成绩表.xlsx')

练习:

# 练习:从天行数据获取头条新闻,并将数据保存至excel
news = openpyxl.Workbook()
# news.create_sheet('news')
sheet = news.active
# sheet.append(('title'))for page in range(1, 6):resp_news = requests.get(url='http://api.tianapi.com/topnews/index',params={'key': 'e8c5524dd2a365f20908ced735f8e480','page': 1,'num': 10})result = resp_news.json()  # 将resp_news转换为字典for news_dict in result['newslist']:title,url,source = news_dict['title'], news_dict['url'], news_dict['source']sheet.append((title, url, source))# sheet.append((news_dict['url']))# sheet.append((news_dict['source']))# print(news_dict['title'])  # 新闻标题# print(news_dict['url'])  # 新闻链接# print(news_dict['source'])  # 新闻来源# print('-'*30)
curr = datetime.now()
news.save(f'新闻_{curr.year}{curr.month:0>2d}{curr.day:0>2d}.xlsx')  # 文件名中加日期

4.5 读取Excel文件

如何用Excel打开乱码文件:现将文件另存为UTF-8 with BOM utf8bom文件,再用Excel打开

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bHeU4YnT-1634118771734)(C:\Users\32873\AppData\Roaming\Typora\typora-user-images\image-20211012091006237.png)]

4.5.1 加载Excel文件

openpyxl.load_workbook(‘文件路径’)

#读取excel文件import openpyxl# 加载Excel文件 ---> Workbook
workbook = openpyxl.load_workbook('resources/口罩销售数据.xlsx')
# 获取所有工作表的名字
print(workbook.sheetnames)
# 获得第一个工作表 ---> Worksheet
sheet = workbook.worksheets[0]
# 获取单元格的数据
print(sheet.cell(3, 4).value)
print(sheet['D3'].value)
# 单元格的范围
print(sheet.dimensions)
# 获取表格的行数和列数
print(sheet.max_row, sheet.max_column)
# 循环遍历所有的数据
# for row in range(1, sheet.max_row + 1):
#     for col in range(1, sheet.max_column):
#         print(sheet.cell(row, col).value, end='\t')
#     print()
for row in range(2, sheet.max_row + 1):for col in 'ABCDEF':print(sheet[f'{col}{row}'].value, end='\t')print()

例如:

在当前⽂文件夹下有⼀一个名为“阿⾥里里巴巴2020年年股票数据.xlsx”的Excel⽂文件,如果想读取并显示该⽂文件的内容,
可以通过如下所示的代码来完成。

import datetimeimport openpyxl# 加载⼀一个⼯工作簿 ---> Workbook
wb = openpyxl.load_workbook('阿⾥里里巴巴2020年年股票数据.xlsx')
# 获取⼯工作表的名字
print(wb.sheetnames)
# 获取⼯工作表 ---> Worksheet
sheet = wb.worksheets[0]
# 获得单元格的范围
print(sheet.dimensions)
# 获得⾏行行数和列列数
print(sheet.max_row, sheet.max_column)# 获取指定单元格的值
print(sheet.cell(3, 3).value)    #通过cell方法
print(sheet['C3'].value)    # 通过单元格
print(sheet['G255'].value)         # 通过单元格# 获取多个单元格(嵌套元组)   -   返回嵌套的元组
print(sheet['A2:C5'])      # 通过切片
# print(sheet['A2':'C5'])# 读取所有单元格的数据
for row_ch in range(2, sheet.max_row + 1):for col_ch in 'ABCDEFG':value = sheet[f'{col_ch}{row_ch}'].valueif type(value) == datetime.datetime:print(value.strftime('%Y年年%m⽉月%d⽇日'), end='\t')    # \t表示空四个字符,或表示一个缩进elif type(value) == int:print(f'{value:<10d}', end='\t')# X < Nd   -   将数据转换为长度为N的字符串,不够在后面用X(默认为空格)对应的字符来填充elif type(value) == float:print(f'{value:.4f}', end='\t')  # .Nf   -   保留N位小数else:print(value, end='\t')print()

❤ 用python操作CSV文件

CSV(Comma Separated Values)全称逗号分隔值⽂文件是⼀一种简单、通⽤用的⽂文件格式,被⼴广泛的应⽤用于应⽤用程序
(数据库、电⼦子表格等)数据的导⼊入和导出以及异构系统之间的数据交换。因为CSV是纯⽂文本⽂文件,不不管是什什么操
作系统和编程语⾔言都是可以处理理纯⽂文本的,⽽而且很多编程语⾔言中都提供了了对读写CSV⽂文件的⽀支持,因此CSV格式在
数据处理理和数据科学中被⼴广泛应⽤用。

使用方法参见 ‘第23课:⽤用Python读写CSV⽂文件.pdf’

1. 读取CSV文件

常用的字符编码为’utf - 8’

若文件存为了UTF-8 with BOM utf8bom文件,则相应的字符编码为’utf-8-sig’

1utf - 8 - sig 带签名的UFT-8 —> 有字节序标记

with open('./resources/2018年北京积分落户数据.csv', 'r', encoding='utf-8-sig') as file:# utf - 8 - sig  带签名的UFT-8 ---> 有字节序标记content = file.readline()# file.readlines()  # 可一次性读完文件所有内容,但不推荐该做法(因为文件很大时,内存消耗太大)while content:print(content, end='')content = file.readline()# 注意:如果读取UTF-8 with BOM utf8bom文件时指定encoding='utf-8',读出结果结果中可能会多出一点内容,例如:
with open('./resurces/2018年北京积分落户数据.csv', 'r', encoding='utf-8') as file:
# 结果:
# ['\ufeffid', 'name', 'birthday', 'company', 'score']
# 其中的feff是字节序标记,因为该文件为UTF-8 with BOM utf8bom文件,即为带签名的UFT-8的文件,encoding='utf-8-sig'
with open('./resources/2018年北京积分落户数据.csv', 'r', encoding='utf-8-sig') as file:reader = csv.reader(file, delimiter='#')  ## csv.reader()的参数还有:# delimiter(默认是逗号)# 该文件为逗号分隔的文件,若为其他符号作为分隔符的文件,则需要用参数delimeter(默认是逗号)进行指定(需与原文件的分隔符相同),否则会将整个一行作为同一个字符串读出(即一行只有一个元素)# quotechar='|'     -   去掉包围符|# 如果值带有包围符(双引号,或|),但不想读出|,就需要用参数quotechar='|'来去除包围for line in reader:print(line)

2. 将数据写入CSV文件

# newline=''    -   这样追加后就不会出现空行
with open('./resources/2018年北京积分落户数据.csv', 'a', encoding='utf-8-sig', newline='') as file:writer = csv.writer(file)  ## writer.writerow(['6020', '一一', '1981-06', '北京宝洁技术有限公司', '90.74'])# writer.writerows(嵌套列表)     -   一次写多行# ['6020', '一一', '1981-06', '北京宝洁技术有限公司', '90.74']writer.writerows([['6021', '一一', '1981-06', '北京宝洁技术有限公司', '90.74'],['6022', '一一', '1981-06', '北京宝洁技术有限公司', '90.74'],['6023', '一一', '1981-06', '北京宝洁技术有限公司', '90.74']])

3. 将CSV文件转换为Excel、修改Excel文件样式

方法一:直接另存为Excel文件

方法二:通过python将CSV文件转换为Excel格式

# 将CSV文件转换为Excel格式import csvimport openpyxl
from openpyxl.styles import Font, Alignmentworkbook = openpyxl.Workbook()
sheet = workbook.create_sheet('2018年北京积分落户数据')
# sheet = workbook.active
# sheet.title('2018年北京积分落户数据')with open('resources/2018年北京积分落户数据.csv', 'r', encoding='utf-8-sig') as file:reader = csv.reader(file, delimiter='#', quotechar='|')for line in reader:sheet.append(line)# 修改单元格样式# 修改指定行的高度
sheet.row_dimensions[1].height = 40
# 修改指定列的宽度
cols_width = {'A': 30,'B': 50,'C': 60,'D': 180,'E': 50
}
for key in cols_width:sheet.column_dimensions[key].width = cols_width[key]
# 修改单元格的样式
for col in range(1, 6):sheet.cell(1, col).font = Font(name='STKaitiSC-Regular', size=22, bold=True, color='0000ff')sheet.cell(1, col).alignment = Alignment(horizontal='center', vertical='center')
workbook.save('resources/2018年北京积分落户数据.xlsx')

❤ 类、面向对象编程(OOP)

用对象的概念将数据和操作数据的函数从逻辑上组织成一个整体。
在面向对象的世界里,我们要解决任何问题都是先创建对象,然后给对象发出消息。

对象 - 接收消息的实体 —> 具体概念

类 - 对象的蓝图和模板 —> 抽象概念

总结:

  1. 一切皆为对象
  2. 每个对象都是独一无二的
  3. 对象都有静态特征(属性)和动态特征(行为)
  4. 对象都属于某个类

面向对象编程的实施步骤:

  1. 定义类
    数据抽象:给出对象的静态特征 —> 属性
    行为抽象:给出对象的动态特征 —> 行为
  2. 创建对象

  3. 给对象发消息

定义类的语法:

​ class 类名:

说明:

  • class - 关键字
  • 类名 - 每个单词首字母大写

变量、函数的命名:snake_case

类命名:CamelNotation(驼峰命名法)

练习:创建一个矩形类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UcRKtFQ5-1634118771735)(file:///C:\Users\32873\Documents\Tencent Files\1090340335\Image\Group2\0S\N0\0SN0}0F[U7LU6W3DU@PR@`2.jpg)]

# 矩形类# 第1步:定义类
class Rectangle:"""矩形"""# 数据抽象def __init__(self, width, height):# self - 第一个参数都是self;self代表对象自己# __init__方法:在使用构造器语法创建对象时,方法__init__会被自动调用"""初始化方法:param width: 矩形的宽度:param height: 矩形的高度"""self.width = widthself.height = height# def __init__(self, w, h):#     self.width = w#     self.height = h# 行为抽象def perimeter(self):"""计算周长"""return (self.width + self.height) * 2def area(self):"""计算面积"""return self.width * self.height# 第2步:创建对象 ---> 构造器语法
# 构造器语法:对象名 = 类名()
rect = Rectangle(width=5, height=3)
# rect = Rectangle(5,3)# 第3步:给对象发消息
print(f'矩形的周长:{rect.perimeter()}')
print(f'矩形的面积:{rect.area()}')

练习:创建一个学生类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LvmiPRFK-1634118771736)(C:\Users\32873\AppData\Roaming\Typora\typora-user-images\image-20211012144554507.png)]

# 学生类
class Student():"""学生"""def __init__(self, name, age):"""初始化代码:param name: 姓名:param age: 年龄"""self.name = nameself.age = agedef eat(self):"""吃饭"""passreturn f'{self.name} is eating.'def play(self):"""玩耍"""return f'{self.name} is playing.'def study(self, course_name):"""学习:param course_name: 课程名称:return:"""return f'{self.name} is studing {course_name}.'stu1 = Student('一一', 41)
stu2 = Student('二二', 32)stu1.eat()
stu2.play()
print(stu1.study('Chinese'))

练习:使用类的方法计算泳池造价

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G1Q6H47G-1634118771737)(C:\Users\32873\AppData\Roaming\Typora\typora-user-images\image-20211012153812149.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VCqaW8Je-1634118771737)(C:\Users\32873\AppData\Roaming\Typora\typora-user-images\image-20211012154907611.png)]

# 泳池造价
class Circle:def __init__(self, radius):self.radius = radiusdef perimeter(self):return 2 * math.pi * self.radiusdef area(self):return math.pi * self.radius ** 2r = float(input('请输入泳池半径:'))
c1, c2 = Circle(r), Circle(r + 3)
fence_price = c2.perimeter() * 38.2
aisle_price = (c2.area()-c1.area()) * 28.5
print(f'围墙的造价为{fence_price:.2f}')
print(f'过道的造价为{aisle_price:.2f}')

练习:定义类描述数字时钟

属性:时分秒

行为:走字、显示时间

清屏

# 数字时钟
class Clock:def __init__(self, hour=0, minute=0, second=0):self.hour = hourself.minute = minuteself.second = seconddef show(self, mode_12=False):"""显示时间:param mode_12::return:"""if mode_12:if self.hour < 12:return f'{self.hour:0>2d}:{self.minute:0>2d}:{self.second:0>2d} AM'else:self.hour = self.hour - 12 if self.hour > 12 else self.hourreturn f'{self.hour:0>2d}:{self.minute:0>2d}:{self.second:0>2d} PM'return f'{self.hour:0>2d}:{self.minute:0>2d}:{self.second:0>2d}'def run(self):"""走字"""self.second += 1if self.second == 60:self.second = 0self.minute += 1if self.minute == 60:self.hour += 1self.minute = 0if self.hour == 24:self.hour = 0clock = Clock()
while True:# 通过os模块的system函数# 清屏:Windows - --> cls#      macOS - --> clear# 即打印语句前写入代码:import osos.system('cls')  # windows系统os.system('clear')  # 苹果系统# 但写入后直接运行并不会清屏,需要在终端运行才会实现清屏效果# 调用终端运行程序:Terminal ---> 调用python解释器执行该py文件(即在终端输入:python example08.py) ---> 即可实现清屏效果print(clock.show())time.sleep(1)clock.run()

练习:倒计时器

import timeclass CountdownTimer():def __init__(self, hour=24, minute=0, second=0):self.hour = hourself.minute = minuteself.second = seconddef show(self):"""显示时间"""return f'{self.hour:0>2d}:{self.minute:0>2d}:{self.second:0>2d}'def is_over(self):"""判断倒计时是否结束"""return self.hour == 0 and self.minute == 0 and self.second == 0def run(self):"""走字"""if not self.is_over():self.second -= 1if self.second < 0:self.minute -= 1self.second = 59if self.minute < 0:self.hour -= 1self.minute = 59clock = CountdownTimer(0, 0, 3)
print(clock.show())
while not clock.is_over():clock.run()print(clock.show())time.sleep(1)
print('倒计时结束,时间到!')

❤ 类(进阶)

1. 点、移动点、两点距离、线段、线段相交

  1. 定义类描述平面上的点,提供移动点、计算一个点到另一个点距离的方法

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RTkwn8Nx-1634118771738)(C:\Users\32873\AppData\Roaming\Typora\typora-user-images\image-20211013125611363.png)]

  2. 定义类描述平面上的线段,提供计算线段长度,判断一个线段与另一个线段是否相交的方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ykgBGeJt-1634118771738)(C:\Users\32873\AppData\Roaming\Typora\typora-user-images\image-20211013140105261.png)]

import math# 1.定义类描述平面上的点,提供移动点、计算一个点到另一个点距离的方法
class Point:def __init__(self, x, y):self.x = xself.y = ydef move_to(self, x, y):self.x = xself.y = ydef move_by(self, dx, dy):self.x += dxself.y += dydef distance(self, other):return math.sqrt((self.x - other.x) ** 2 + (self.y - other.y) ** 2)def __str__(self):return f'<{self.x}, {self.y}>'p1 = Point(3, 5)
p2 = Point(6, 1)
print(p1, p2)
print(p1.distance(p2))
p1.move_to(0, 0)
p2.move_by(1, -1)
print(p1, p2)
print(p1.distance(p2))# 2.定义类描述平面上的线段,提供计算线段长度,判断一个线段与另一个线段是否相交的方法
class Line():def __init__(self, start: Point, end: Point):self.start = startself.end = enddef length(self):return self.start.distance(self.end)def intersect(self, other):# self就是接收消息的对象,就是下面的p1,other是另一个点的对象,就是下面的p2sx1, sy1, ex1, ey1 = self.start.x, self.start.y, self.end.x, self.end.ysx2, sy2, ex2, ey2 = other.start.x, other.start.y, other.end.x, other.end.yreturn not (max(sx1, ex1) > min(sx2, ex2)or min(sx1, ex1) < max(sx2, ex2)or max(sy1, ey1) > min(sy2, ey2)or min(sy1, ey1) < max(sy2, ey2))p1 = Point(1, 3)
p2 = Point(4, 7)
print(p1, p2)
print(p1.distance(p2))p3 = Point(2, 3)
p4 = Point(5, 7)
line1 = Line(p1, p2)
line2 = Line(p3, p4)
print(line1.intersect(line2))

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w9unBEl9-1634118771741)(C:\Users\32873\AppData\Roaming\Typora\typora-user-images\image-20211013130908588.png)]

2. 三角形

类方法

类方法 - 发给类的消息(比静态方法多一个参数,这个参数(cls)代表接收消息的类) —> @classmethod

@classmethod
def is_valid_sides(cls, a, b, c):return a + b > c and b + c > a and a + c > b

静态方法

静态方法 - 不是三角形对象的消息,而是发给三角形类的消息 —> @staticmethod

Triangle.check_sides(a, b, c)

@staticmethod
def check_sides(a, b, c):return a + b > c and b + c > a and a + c > b
  • 类方法和静态方法写一个即可

同时输入多个数据

a, b, c = map(float, input('请输入三条边的长度: ').split())

练习:通过类描述三角形,并计算三角形的周长和面积

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DguKgS2f-1634118771741)(C:\Users\32873\AppData\Roaming\Typora\typora-user-images\image-20211013131014828.png)]

# 通过类描述三角形,并计算三角形的周长和面积
import mathclass Triangle:def __init__(self, a, b, c):self.a = aself.b = bself.c = c@classmethoddef is_valid_sides(cls, a, b, c):return a + b > c and b + c > a and a + c > b@staticmethoddef check_sides(a, b, c):return a + b > c and b + c > a and a + c > bdef perimeter(self): """周长"""return self.a + self.b + self.cdef area(self):"""面积"""p = self.perimeter() / 2a, b, c = self.a, self.b, self.creturn math.sqrt(p * (p - a) * (p - b) * (p - c))def main():a, b, c = map(float, input('请输入三条边的长度: ').split())  # # 同时接收多数据if Triangle.check_sides(a, b, c):tri = Triangle(a, b, c)print(f'三角形的周长: {tri.perimeter()}')print(f'三角形的面积: {tri.area()}')else:print('不能构成三角形!')if __name__ == '__main__':main()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Yo3vIgB4-1634118771742)(C:\Users\32873\AppData\Roaming\Typora\typora-user-images\image-20211013131044797.png)]

3. 扑克游戏

思考:有哪些类对象?这些对象有哪些属性和方法?

  • 牌 - 花色、点数;显示牌面;比较大小

    一张张的

  • 扑克 - 装54张牌的列表;洗牌/发牌
    54张牌放一起叫做类

    洗牌/发牌改变的是扑克的状态,所以应该是扑克的属性

  • 玩家 - ID/昵称/手牌;摸牌/ 打牌/ 整理手牌

解决问题的套路:

  1. 根据问题描述来 圈名词、圈动词

    名词-要么是类,要么是类的属性

    动词 -方法

经验:

  • 符号常量总是优于字面常量
  • 例如:在扑克游戏中表示黑桃、红心、梅花、方片时,SPADE,HEART,CLUB,DIAMOND优于0,1,2,3

魔术方法缩写示意:

  • less than —> __ lt __ —> <
  • great than —> __ gt __ —> >
  • equal to —> __ eq __ —> =
  • less than or equal to—> __ xxx __ —> <=
import random# 定义常量(变量名大写):黑桃、红桃、梅花、方片
SPADE, HEART, CLUB, DIAMOND = range(4)class Card:"""牌"""def __init__(self, suite, face):"""初始化方法:param suite: 花色:param face: 点数"""self.suite = suiteself.face = facedef __repr__(self):# 打印时只需打印 对象 便可自动打印 对象.show()return self.show()def __lt__(self, other):# self一张牌,other另一张牌# 魔术方法__lt__    -   less than 小于# 花色不同比花色,花色相同比点数if self.suite != other.suite:return self.suite < other.suiteface1 = 14 if self.face == 1 else self.faceface2 = 14 if other.face == 1 else other.facereturn face1 < face2def show(self):"""显示牌面"""suites = ('♠︎', '♥︎', '♣︎', '♦︎')faces = ('', 'A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K')return f'{suites[self.suite]}{faces[self.face]}'class Poker:"""扑克"""def __init__(self):"""54张牌"""self.cards = [Card(suite, face)for suite in range(4)for face in range(1, 14)]self.index = 0def shuffle(self):"""洗牌"""self.index = 0random.shuffle(self.cards)def has_more(self):"""有没有牌可以发出"""return self.index < len(self.cards)def deal(self):"""发一张牌"""card = self.cards[self.index]self.index += 1return cardclass Player:"""玩家"""def __init__(self, nickname):"""初始化方法:param nickname: 昵称"""self.nickname = nicknameself.cards = []def get_card(self, card):"""摸牌"""self.cards.append(card)def arrange(self):"""整理手牌"""# # 方法一:不使用魔术方法__lt__# # sort方法可以传入key参数来指定根据什么比较元素的大小,从而自定义排序规则# self.cards.sort(key=lambda x: x.face)  # 按点数比大小# # self.cards.sort(key=lambda card: card.suite)  # 按花色比大小# 方法二:使用魔术方法__lt__self.cards.sort()poker = Poker()
poker.shuffle()
names = ('妲己', '狄仁杰', '赵云', '孙悟空')
players = [Player(name) for name in names]for _ in range(13):# 给每个玩家发13张牌for player in players:card = poker.deal()  # 扑克发牌player.get_card(card)  # 玩家得到牌for player in players:player.arrange()  # 整理牌print(player.nickname, end=': ')print(player.cards)# card1 = Card(HEART, 13)
# # # 无def __repr__(self):
# # print(card1.show())
# # 有def __repr__(self):
# print(card1)# card2 = Card(DIAMOND, 5)
# card3 = Card(SPADE, 1)
# card4 = Card(CLUB, 10)
# print(card1, card2, card3, card4)

❤ 继承

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vyuWy06E-1634118771742)(C:\Users\32873\AppData\Roaming\Typora\typora-user-images\image-20211013164049332.png)]

学生类、老师类

学生:姓名/年龄/年级;吃饭/玩耍/学习

老师:姓名/年龄/职称;吃饭/玩耍/授课

Martin Fowler - 代码有很多种很坏的味道,但重复是最坏的一种

class Person:def __init__(self, name, age):"""初始化方法:param name: 姓名:param age: 年龄"""self.name = nameself.age = agedef eat(self):"""吃饭"""print(f'{self.name}正在吃饭.')def play(self):"""玩耍"""print(f'{self.name}正在玩耍.')class Student(Person):"""学生"""def __init__(self, name, age, grade):"""初始化方法:param grade: 年级"""super().__init__(name, age)self.grade = gradedef study(self, course_name):"""学习:param course_name: 课程名称"""print(f'{self.name}正在学习{course_name}.')class Teacher(Person):"""老师"""def __init__(self, name, age, title):"""初始化方法:param title: 职称"""super().__init__(name, age)self.title = titledef teach(self, course_name):"""授课"""print(f'{self.name}{self.title}正在讲{course_name}.')student = Student('王大锤', 18, '大一')
teacher = Teacher('骆骆', 41, '叫兽')
student.play()
student.study('Python程序设计')
teacher.eat()
teacher.teach('数据库原理')

工资结算系统

公司有三类员工,结算工资的方式不同:

部门经理:15000
程序员:计时计薪:200元/小时
销售员:底薪+提成:1800元+销售额5%提成

给出员工的信息,自动结算月薪

小记:

  • employee 雇员
    姓名,职位,

  • employer 雇主

  • salary 薪资

  • programmer 程序员

  • manager 经理

  • salesman
    销售员

  • sale 销售额

class Employee:'''员工'''def __init__(self, name):'''初始类方法:param name: 名字:param position: 职位'''self.name = nameclass Salesman(Employee):"""销售员"""def __init__(self, name):"""初始化方法:param salary: 销售额"""super().__init__(name)def salary(self, sale):return 1800 + sale * 0.05class Manager(Employee):"""经理"""def __init__(self, name):"""初始化方法"""super().__init__(name)def salary(self):return 15000class Programmer(Employee):"""程序员"""def __init__(self, name):"""初始化方法:param day: 工作时长(小时)"""super().__init__(name)def salary(self, hour):return hour * 200salesman = Salesman('张三')
print(salesman.salary(50))manager = Manager('王大锤')
print(manager.salary())programmer = Programmer('小王')
print(programmer.salary(1000))

❤ 函数式编程

day16-17-18.对象序列化和反序列化、API获取数据、python操作Excel/CSV文件、类、面向对象编程(初级及进阶)、继承相关推荐

  1. C++实现对象序列化和反序列化(读写二进制文件)操作

    相关函数介绍 在我们的C语言中读写二进制文件一般使用的fread.fwrite全局函数,当然也可以使用更底层的read和write函数.在我们的C++中 通过ofstream 和 ifstream 对 ...

  2. Xson:Java对象序列化和反序列化工具

    1. Xson 介绍  Xson是一个Java对象序列化和反序列化程序.支持Java对象到字节数组的序列化,和从字节数组到Java对象的反序列化.  地址:https://github.com/xso ...

  3. 代码即财富之我学Java对象序列化与反序列化(2)

    2019独角兽企业重金招聘Python工程师标准>>> 我们在程序创建的Java对象都是存在于JVM内存中的,也就是Java对象的生命周期一定不会长于JVM,所以如何以一种持久化的方 ...

  4. Java对象序列化与反序列化

    什么是序列化与反序列化 当两个进程在进行远程通信时,彼此可以发送各种类型的数据.无论是何种类型的数据,都会以二进制序列的形式在网络上传送.发送方需要把这个Java对象转换为字节序列,才能在网络上传送: ...

  5. 从零开始学前端:对象序列化与反序列化、冒泡排序、数组去重 --- 今天你学习了吗?(JS:Day11)

    从零开始学前端:程序猿小白也可以完全掌握!-今天你学习了吗?(JS) 复习:从零开始学前端:字符串和数组的方法 - 今天你学习了吗?(JS:Day10) 文章目录 从零开始学前端:程序猿小白也可以完全 ...

  6. C#对象序列化与反序列化zz

    C#对象序列化与反序列化(转载自:http://www.cnblogs.com/LiZhiW/p/3622365.html) 1. 对象序列化的介绍.......................... ...

  7. C#对象序列化与反序列化

    C#对象序列化与反序列化 C#对象序列化与反序列化(转载自:http://www.cnblogs.com/LiZhiW/p/3622365.html) 1. 对象序列化的介绍............. ...

  8. FastJson实现复杂对象序列化与反序列化

    一.认识FastJson 1.优势 fastjson是目前java语言中最快的json库,比自称最快的jackson速度要快,第三方独立测试结果说明比gson快大约6倍,fastjson采用独创的算法 ...

  9. java培训教程分享:Java中怎样将数据对象序列化和反序列化?

    本期为大家介绍的java培训教程是关于"Java中怎样将数据对象序列化和反序列化?"的内容,相信大家都知道,程序在运行过程中,可能需要将一些数据永久地保存到磁盘上,而数据在Java ...

  10. 对象序列化和反序列化是怎么回事

    之前看公司RMI服务里多数类都实现了序列化接口(implements Serializable),但确怎么也不知道序列化是怎么一回事,上网查了很多序列化的概念,但那些概念太抽象了,还是无法理解,直到今 ...

最新文章

  1. java接口可以扩展抽象类_Java—接口与抽象类
  2. python爬虫经典教程-python爬虫经典例子有哪些
  3. 手把手教你webpack3(3)入口(多入口)entry
  4. Mysql中的递归层次查询(父子查询)
  5. 通用模块 -- Dubbo 用户模块
  6. HGAT-用于半监督短文本分类的异构图注意力网络
  7. Java NIO与IO的差别和比較
  8. Oracle11g 配置 ST_GEOMETRY
  9. Android组件间的数据传输
  10. 判断两个时间段是否有交集_判断两个人是否处于暧昧关系,就看四点,特明显...
  11. Intel 1Gb/10Gb网卡在多核处理器中使用的加速技术
  12. Linux下kafka之C/C++客户端库librdkafka的编译,安装以及函数介绍
  13. 2021-2027全球与中国触摸屏人机界面(HMI)市场现状及未来发展趋势
  14. win10家庭版设置本地策略组
  15. 【室内定位】采用TOA借助多个基站与终端之间距离进行目标定位matlab源码
  16. Excel怎么快速删除隐藏区域
  17. 组成新数python_小组组名大全
  18. 参加全国大学生电子设计竞赛有感
  19. 小米手表S1、华为的WATCH GT3、OPPOWatch2和魅族智能手表。
  20. IDEA的好用小工具Test RESTful web Service

热门文章

  1. 剑指 offer:变态跳水台
  2. 小学计算机二课堂活动总结,康宁路学校“信息技术与课堂教学深度融合”活动总结...
  3. 人工智能之父图灵头像将登上新版50英镑钞票
  4. 计算机键盘快速指南,正确方法:[字母键盘练习方法指南]教您如何快速键入
  5. 数据结构课程设计【银行储蓄系统】
  6. H无穷控制学习笔记——H无穷/H2控制
  7. 城市地铁类毕业论文文献包含哪些?
  8. Unity 3D学习(基础篇)——C#基础入门
  9. 双创项目_宫颈癌风险智能检测(2)
  10. 缓存问题(二) 布隆过滤器(Bloom Filter) 介绍和原理