赞
踩
e是接受异常信息的变量
try:
代码
except Exception as e:
处理异常
如果异常是在某一层产生,但是没有被catch,那么会继续往上层抛出,此时这一层的后续代码就不会执行。直到异常在某一层被catch,这一层的后续代码能继续执行。
一般不要用from 模块名 import *
,因为这样相当于把模块里的全部代码都导入python程序内,可能会出现重名问题。
注意:当导入多个模块时,且模块内有同名功能。当调用这个同名功能时,调用的是后面导入的模块的功能。
指定导入不受__all__影响
必须有__init__.py文件才是python包
import 包名.模块名
包名.模块名.功能
from 包名 import 模块名
模块名.功能
from 包名.模块名 import 功能
功能
__init__.py
文件中添加__all__ = []
,来控制from 包名 import *
允许导入的模块列表pip install 包名
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple 包名
pycharm也可以在右下角“解释器设置”中添加新的python包,下载时可以添加option参数来通过国内镜像服务器下载包
为了将含中文的python数据转化为json字符串,需要使用参数ensure_ascii为False,表明不使用ascii码进行转化,而把内容直接输出出去,为True,则中文会转化为Unicode的字符
json_str = json.dumps(data, ensure_ascii=False)
pyecharts官网:pyecharts.org
pyecharts画廊官网:gallery.pyecharts.org(类似美术的展览会)
全局配置:针对图像进行设置,如标题、图例、工具箱
系列配置:针对具体轴数据进行设置
is_piecewise=True表示开始手动校准范围
pieces表示具体的范围是多少
可以通过ab173.com的前端rgb颜色对照表来查看某种颜色对应的16位的颜色代码
略
bar.add_yaxis("GDP", [30, 20, 10], label_opts=LabelOpts(position="right"))
bar.reversal_axis()
timeline.add_schema(
play_interval=1000,
is_timeline_show=True,
is_auto_play=True,
is_loop_play=True
)
import pyecharts.globals import ThemeType
timeline = Timeline(
{"theme": ThemeType.LIGHT}
)
python3.6后,字典是有序的,参考:https://juejin.cn/post/7041433783362387982
由于bar.reversal_axis()
会将从左到右从大到小变成从上到下,从小到大,所以在绘制柱状图之前需要将x_data和y_data都反转一下
from pyecharts.charts import Bar, Timeline from pyecharts.options import LabelOpts, TitleOpts from pyecharts.globals import ThemeType with open("D:\计算机\Python\黑马程序员python教程\资料\可视化案例数据\动态柱状图数据\\1960-2019全球GDP数据.csv", "r", encoding="GB18030") as f: data_lines = f.readlines() data_lines.pop(0) data_dict = {} for line in data_lines: line_list = line.split(",") year = int(line_list[0]) country = line_list[1] gdp = float(line_list[2]) try: data_dict[year].append([country, gdp]) except KeyError: data_dict[year] = [[country, gdp]] timeline = Timeline( {"theme": ThemeType.LIGHT} ) for year in data_dict: data_dict[year].sort(key = lambda x: x[1], reverse=True) year_data = data_dict[year][:8] x_data = [] y_data = [] for country_gdp in year_data: x_data.append(country_gdp[0]) y_data.append(country_gdp[1] / 1E8) bar = Bar() x_data.reverse() y_data.reverse() bar.add_xaxis(x_data) bar.add_yaxis("GDP(亿)", y_data, label_opts=LabelOpts(position="right")) bar.reversal_axis() bar.set_global_opts( title_opts=TitleOpts(title=f"{year}年全球前8GDP数据") ) timeline.add(bar, str(year)) timeline.add_schema( play_interval=1000, is_timeline_show=True, is_auto_play=True, is_loop_play=True ) timeline.render("1960-2019全球GDP前8国家.html")
定义在类内部的函数称之为类的方法
self相当于以后会创建但在定义类时还不存在的对象
面向对象编程:设计类,基于类创建对象,由对象做具体的工作
面向对象包含3大特性:封装、继承、多态
继承表示:将从父类那里继承(复制)成员变量和成员方法(不含私有)
pass关键字是用来补全语法的
"""
数据定义的类
"""
class Record:
def __init__(self, date, order_id, money, province):
self.date = date # 订单日期
self.order_id = order_id # 订单ID
self.money = money # 订单金额
self.province = province # 销售省份
def __str__(self):
return f"{self.date}, {self.order_id}, {self.money}, {self.province}"
""" 和文件相关的类定义 """ import json from data_define import Record # 先定义一个抽象类用来做顶层设计,确定有哪些功能需要实现 class FileReader: def read_data(self) -> list[Record]: """读取文件的数据,读到的每一条数据都转换为Record对象,将它们都封装到list内返回即可""" pass class TextFileReader(FileReader): def __init__(self, path): self.path = path # 定义成员变量记录文件的路径 # 复写(实现抽象方法)父类的方法 def read_data(self) -> list[Record]: with open(self.path, 'r', encoding='utf-8') as f: record_list: list[Record] = [] for line in f.readlines(): line = line.strip() # 消除读取到的每一行数据中的\n data_list = line.split(",") record = Record(data_list[0], data_list[1], int(data_list[2]), data_list[3]) record_list.append(record) return record_list class JsonFileReader(FileReader): def __init__(self, path): self.path = path # 定义成员变量记录文件的路径 def read_data(self) -> list[Record]: with open(self.path, 'r', encoding='utf-8') as f: record_list: list[Record] = [] for line in f.readlines(): data_dict = json.loads(line) record = Record(data_dict['date'], data_dict['order_id'], int(data_dict['money']), data_dict['province']) record_list.append(record) return record_list if __name__ == '__main__': text_file_reader = TextFileReader("D:\\计算机\\Python\\黑马程序员python教程\\资料\\数据分析案例\\2011年1月销售数据.txt") json_file_reader = JsonFileReader("D:\\计算机\\Python\\黑马程序员python教程\\资料\\数据分析案例\\2011年2月销售数据JSON.txt") list1 = text_file_reader.read_data() list2 = json_file_reader.read_data() for l in list1: print(l) for l in list2: print(l)
from file_define import FileReader, TextFileReader, JsonFileReader from data_define import Record text_file_reader = TextFileReader("D:\\计算机\\Python\\黑马程序员python教程\\资料\\数据分析案例\\2011年1月销售数据.txt") json_file_reader = JsonFileReader("D:\\计算机\\Python\\黑马程序员python教程\\资料\\数据分析案例\\2011年2月销售数据JSON.txt") jan_data: list[Record] = text_file_reader.read_data() feb_data: list[Record] = json_file_reader.read_data() # 将2个月份的数据合并为1个list来存储 all_data: list[Record] = jan_data + feb_data # 开始进行数据计算 data_dict = {} for record in all_data: if record.date in data_dict: data_dict[record.date] += record.money else: data_dict[record.date] = record.money
# 可视化图表开发
bar = Bar(init_opts=InitOpts(ThemeType.LIGHT))
bar.add_xaxis(list(data_dict.keys())) # 添加x轴数据
bar.add_yaxis("销售额", list(data_dict.values()), label_opts=LabelOpts(is_show=False))
bar.set_global_opts(
title_opts=TitleOpts(title="每日销售额")
)
bar.render("每日销售额柱状图.html")
mysql的官网:www.mysql.com
略,详细请参考视频
# 查看数据库
SHOW DATABASES;
# 使用数据库
USE 数据库名称;
# 创建数据库
CREATE DATABASE 数据库名称 [CHARSET UTF8];
# 删除数据库
DROP DATABASE 数据库名称;
# 查看当前使用的数据库
SELECT DATABASE();
# 查看有哪些表 show tables; # 删除表 drop table 表名称; drop table if exists 表名称; # 创建表 create table 表名称( 列名称 列类型, 列名称 列类型, ...... ); -- 列类型有 int -- 整数 float -- 浮点数 varchar(长度) -- 文本,长度为数字,做最大长度限制 date -- 日期类型 timestamp -- 时间戳类型
DML-数据操作语言。
cursor = conn.cursor()
conn.select_db("test")
cursor.execute("create table test_pymysql2(id int)")
cursor = conn.cursor()
conn.select_db("world")
cursor.execute("select * from student")
results = cursor.fetchall()
for r in results:
print(r)
from file_define import FileReader, TextFileReader, JsonFileReader from data_define import Record from pymysql import Connection text_file_reader = TextFileReader("D:\\计算机\\Python\\黑马程序员python教程\\资料\\数据分析案例\\2011年1月销售数据.txt") json_file_reader = JsonFileReader("D:\\计算机\\Python\\黑马程序员python教程\\资料\\数据分析案例\\2011年2月销售数据JSON.txt") jan_data: list[Record] = text_file_reader.read_data() feb_data: list[Record] = json_file_reader.read_data() # 将2个月份的数据合并为1个list来存储 all_data: list[Record] = jan_data + feb_data conn = Connection( host="127.0.0.1", port=3306, user="root", password="xxxxxx", autocommit=True ) cursor = conn.cursor() conn.select_db("py_sql") for record in all_data: sql = f"INSERT INTO orders(`order_date`, `order_id`, `money`, `province`) " \ f"VALUES ('{record.date}', '{record.order_id}', {record.money}, '{record.province}')" cursor.execute(sql) conn.close()
import json from file_define import FileReader, TextFileReader, JsonFileReader from data_define import Record from pymysql import Connection text_file_reader = TextFileReader("D:\\计算机\\Python\\黑马程序员python教程\\资料\\数据分析案例\\2011年1月销售数据.txt") json_file_reader = JsonFileReader("D:\\计算机\\Python\\黑马程序员python教程\\资料\\数据分析案例\\2011年2月销售数据JSON.txt") jan_data: list[Record] = text_file_reader.read_data() feb_data: list[Record] = json_file_reader.read_data() # 将2个月份的数据合并为1个list来存储 all_data: list[Record] = jan_data + feb_data conn = Connection( host="127.0.0.1", port=3306, user="root", password="xxxxxx", autocommit=True ) cursor = conn.cursor() conn.select_db("py_sql") sql = f"select * from orders" cursor.execute(sql) with open("./json.txt", 'a', encoding='utf-8') as f: for line in cursor.fetchall(): dict = {} dict['date'] = str(line[0]) dict['order_id'] = line[1] dict['money'] = line[2] dict['province'] = line[3] tmp = json.dumps(dict, ensure_ascii=False) f.write(tmp + '\n') conn.close()
Apache Spark是用于大规模数据处理的统一分析引擎。简单来说,Spark是一款分布式计算框架,可以调度成百上千的服务器集群。
因为已经学过PySpark了,这里略。
闭包(函数)
在闭包(函数)内修改外部函数的值-nonlocal关键字
优缺点
装饰器核心思想是:将需要被包装的函数作为参数传递
语法糖:也叫糖衣语法,对语言的功能并没有影响,而是更方便程序员使用
进程是系统资源调度的基本单位,线程是系统资源的最小单位
每个Thread类对象就是多线程中的一个线程
把工作封装到函数里,然后传入到target参数
import socket # 创建Socket对象 socket_server = socket.socket() # 绑定ip地址和端口 socket_server.bind(('localhost', 8888)) # 监听端口 socket_server.listen(1) # listen方法内接受一个整数传参数,表示接受链接数量 # 等待客户端链接 conn, address = socket_server.accept() # accpet方法返回的是二元元组(链接对象, 客户端地址信息) # accpet方法是阻塞方法,等待客户端链接,如果没有链接,就卡在这一行不向下执行 print(f"接收到了客户端的链接,客户端的信息是:{address}") # 接受客户端信息 data = conn.recv(1024).decode('utf8') # recv也是阻塞方法,等待客户端发送信息 # recv接受的参数是缓冲区大小,一般给1024即可 # recv方法的返回值是一个字节数组(bytes对象),不是字符串,可以通过decode方法通过utf0编码,将字节数组转换为字符串对象 print(f"客户端发来的消息是:{data}") # 发送恢复消息 msg = input("请输入你要和客户端回复的消息:") conn.send(msg.encode('utf8')) # encode可以将字符串编码为字节数组对象 conn.close() socket_server.close()
字符串前面带上r的标记,表示字符串中转义字符无效,就是普通字符的意思
{}中间别带空格
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。