def- define function
url
pip的安装
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cVFCoTex-1634041017240)(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-gQXaAW6D-1634041017242)(C:\Users\32873\AppData\Roaming\Typora\typora-user-images\image-20211011114146510.png)]
快捷键
ctrl + d 复制一行代码
ctrl + y 删除一行代码
代码格式规范化:ctrl + alt + L
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VmRfgRUh-1634041017244)(C:\Users\32873\AppData\Roaming\Typora\typora-user-images\image-20211011144220555.png)]
控制台查找:控制台内 ctrl + f
优化导入顺序:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o9ynDjAA-1634041017246)(C:\Users\32873\AppData\Roaming\Typora\typora-user-images\image-20211012103202654.png)]
奇奇怪怪的bug
1包围符| ,可能遇到的的bug输入方式:中文输入拼音gun —> 丨
数据库导入顺序
库导入写法顺序:(从上往下)
? 标准库
? 三方库
? 自己的库
? 对象序列化和反序列化
def is_prime(num: int) -> bool:
'''
判断一个正整数是不是质数
:param num: 正整数
:return: 质数返回True,否则返回False
'''
for i in range(2, int(num ** 0.5) + 1):
if num % i == 0:
return False
return True
with 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)
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)解码(反序列化 - 从字节串或字符串中还原出一个对象(字典、列表等))
2.1.1 序列化(读出)
将字典和列表写入到文件中
import json
person = {
'name': '骆骆',
'age': 41,
'sex': True,
'friends': ['赵云', '马超', '辛弃疾'],
'car': {
'brand': 'QQ',
'max_speed': 120
}
}
with open('person.txt', 'w') as file:
json.dump(person, fp=file)
2.1.2 反序列化
读取文件中的JSON格式数据还原成字典对象
反序列化:将字符串还原成(字典)对象
import json
with 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 pickle
person = {
'name': '骆骆',
'age': 41,
'sex': True,
'friends': ['赵云', '马超', '辛弃疾'],
'car': {
'brand': 'QQ',
'max_speed': 120
}
}
with open('person.dat', 'wb') as file:
pickle.dump(person, file=file)
2.3.2 反序列化
读取文件中的Pickle格式数据还原成字典对象
反序列化:将字节串(二进制数据)还原成(字典)对象
import pickle
with open('person.dat', 'rb') as file:
obj = pickle.load(file)
print(obj)
print(type(obj))
? 联网获取数据(通过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),获取请求参数
import json
import requests
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'])
import json
import requests
url = '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)
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()
for news_dict in result['newslist']:
print(news_dict['title'])
print(news_dict['url'])
print(news_dict['source'])
print('-'*30)
3.3 通过响应对象获取服务器返回的内容
import requests
resp = 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 datetime
import openpyxl
import requests
workbook = 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(行索引,列索引,数据)
sheet.append(('姓名', '语文', '数学', '英语'))
sheet.append(('张三', 50, 60, 70))
sheet.append(('李四', 53, 66, 72))
sheet.append(('王五', 51, 67, 74))
sheet.cell(5, 1, '小明')
4.4 保存工作簿
workbook.save('学生成绩表.xlsx')
练习:
news = openpyxl.Workbook()
sheet = news.active
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()
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()
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-SnJPTGA2-1634041017248)(C:\Users\32873\AppData\Roaming\Typora\typora-user-images\image-20211012091006237.png)]
4.5.1 加载Excel文件
openpyxl.load_workbook(‘文件路径’)
import openpyxl
workbook = openpyxl.load_workbook('resources/口罩销售数据.xlsx')
print(workbook.sheetnames)
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(2, sheet.max_row + 1):
for col in 'ABCDEF':
print(sheet[f'{col}{row}'].value, end='\t')
print()
例如:
在当前?文件夹下有?一个名为“阿?里里巴巴2020年年股票数据.xlsx”的Excel?文件,如果想读取并显示该?文件的内容, 可以通过如下所示的代码来完成。
import datetime
import openpyxl
wb = openpyxl.load_workbook('阿?里里巴巴2020年年股票数据.xlsx')
print(wb.sheetnames)
sheet = wb.worksheets[0]
print(sheet.dimensions)
print(sheet.max_row, sheet.max_column)
print(sheet.cell(3, 3).value)
print(sheet['C3'].value)
print(sheet['G255'].value)
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}'].value
if type(value) == datetime.datetime:
print(value.strftime('%Y年年%m?月%d?日'), end='\t')
elif type(value) == int:
print(f'{value:<10d}', end='\t')
elif type(value) == float:
print(f'{value:.4f}', end='\t')
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:
content = file.readline()
while content:
print(content, end='')
content = file.readline()
with open('./resurces/2018年北京积分落户数据.csv', 'r', encoding='utf-8') as file:
with open('./resources/2018年北京积分落户数据.csv', 'r', encoding='utf-8-sig') as file:
reader = csv.reader(file, delimiter='#')
for line in reader:
print(line)
2. 将数据写入CSV文件
with open('./resources/2018年北京积分落户数据.csv', 'a', encoding='utf-8-sig', newline='') as file:
writer = csv.writer(file)
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格式
import csv
import openpyxl
from openpyxl.styles import Font, Alignment
workbook = openpyxl.Workbook()
sheet = workbook.create_sheet('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)
用对象的概念将数据和操作数据的函数从逻辑上组织成一个整体。 在面向对象的世界里,我们要解决任何问题都是先创建对象,然后给对象发出消息。
对象 - 接收消息的实体 —> 具体概念 类 - 对象的蓝图和模板 —> 抽象概念
- 一切皆为对象
- 每个对象都是独一无二的
- 对象都有静态特征(属性)和动态特征(行为)
- 对象都属于某个类
面向对象编程的实施步骤:
-
定义类
-
数据抽象:给出对象的静态特征 —> 属性
-
行为抽象:给出对象的动态特征 —> 行为
-
创建对象 -
给对象发消息
定义类的语法:
? class 类名:
说明:
- class - 关键字
- 类名 - 每个单词首字母大写
变量、函数的命名:snake_case
类命名:CamelNotation(驼峰命名法)
练习:创建一个矩形类
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zsXYuJzh-1634041017250)(file:///C:\Users\32873\Documents\Tencent Files\1090340335\Image\Group2\0S\N0\0SN0}0F[U7LU6W3DU@PR@`2.jpg)]
class Rectangle:
"""矩形"""
def __init__(self, width, height):
"""
初始化方法
:param width: 矩形的宽度
:param height: 矩形的高度
"""
self.width = width
self.height = height
def perimeter(self):
"""计算周长"""
return (self.width + self.height) * 2
def area(self):
"""计算面积"""
return self.width * self.height
rect = Rectangle(width=5, height=3)
print(f'矩形的周长:{rect.perimeter()}')
print(f'矩形的面积:{rect.area()}')
练习:创建一个学生类
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w3RegQdd-1634041017251)(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 = name
self.age = age
def eat(self):
"""吃饭"""
pass
return 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-sYfbwPKS-1634041017252)(C:\Users\32873\AppData\Roaming\Typora\typora-user-images\image-20211012153812149.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zy9BbzQp-1634041017253)(C:\Users\32873\AppData\Roaming\Typora\typora-user-images\image-20211012154907611.png)]
class Circle:
def __init__(self, radius):
self.radius = radius
def perimeter(self):
return 2 * math.pi * self.radius
def area(self):
return math.pi * self.radius ** 2
r = 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 = hour
self.minute = minute
self.second = second
def 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.hour
return 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 += 1
if self.second == 60:
self.second = 0
self.minute += 1
if self.minute == 60:
self.hour += 1
self.minute = 0
if self.hour == 24:
self.hour = 0
clock = Clock()
while True:
import os
os.system('cls')
os.system('clear')
print(clock.show())
time.sleep(1)
clock.run()
练习:定义类描述倒计时器
class CountdownTimer():
def __init__(self, hour=24, minute=0, second=0):
self.hour = hour
self.minute = minute
self.second = second
def show(self):
"""显示时间"""
return f'{self.hour:0>2d}:{self.minute:0>2d}:{self.second:0>2d}'
def run(self):
"""走字"""
self.second -= 1
if self.second < 0:
self.minute -= 1
self.second = 59
if self.minute < 0:
self.hour -= 1
self.minute = 59
clock = CountdownTimer(0, 0, 1)
while True:
print(clock.show())
if clock.show() == '00:00:00':
print('end!')
exit()
clock.run()
time.sleep(1)
? 函数式编程
|