2023届新教材新选考一轮复习信息技术知识梳理(含答案)

文档属性

名称 2023届新教材新选考一轮复习信息技术知识梳理(含答案)
格式 zip
文件大小 5.7MB
资源类型 教案
版本资源 教科版(2019)
科目 信息技术(信息科技)
更新时间 2022-08-03 09:35:22

图片预览

文档简介

2023届新教材新选考一轮复习
信息技术
知识梳理
班级:_________ 姓名:_________
目 录
必修基本概念 —————————————————————— 1
必修一 ————————————————————————————————————— 1
必修二 ————————————————————————————————————— 6
必修算法程序 —————————————————————— 16
Python基础算法 ————————————————————————————— 16
Python常见程序 ————————————————————————————— 23
Pandas数据处理 ————————————————————————————— 30
Flask数据库 ————————————————————————————— 40
SQLite数据库 ————————————————————————————— 46
选择性必修第一册 —————————————————— 50
数组 —————————————————————————————————— 50
链表 —————————————————————————————————— 53
字符串 —————————————————————————————————— 59
队列与栈 —————————————————————————————————— 63
树与二叉树 —————————————————————————————————— 69
迭代与递归 —————————————————————————————————— 73
排序算法 —————————————————————————————————— 75
查找算法 —————————————————————————————————— 85
必修基本概念
必修一
一、数据与信息
1. 数据是对客观事物的符号表示,在计算机科学中,数据是指所有能输入到计算机并被计算机程序处理的符号总称,其表现形式可以是文字(数字)、图形、图像、音频、视频等。
2. 信息的一般定义是数据所包含的意义。在信息论中,香农给出的定义是用来消除随机不确定的东西。
3. 信息的特征:
(1)载体依附性:即信息必须依附于载体存在,不存没有载体的信息。
(2)时效性:信息(的内容或价值)会随着时间的推移发生变化。
(3)共享性:信息可以共享,且在传播的过程中不产生损耗。
(4)可加工处理性、真伪性:信息是可以进行加工的,加工后的信息具有真伪性。
(5)价值性:信息的价值包括显性价值和隐形价值两个方面,同时价值的高低具有相对性。
二、数字化
1. 数字化的定义:将模拟信号转换为数字信号的过程称为数字化。其中用到的主要设备是模数转换器(ADC)。
2. 模拟量:模拟信号以连续变化的物理量存在,自然界中大多数信号都以模拟量形式存在。
3. 数字量:数字信号在取值上是离散的、不连续的信号。
4. 将模拟信号转换成数字信号一般需要经过采样、量化与编码三个步骤。
(1)采样的参数是采样频率,单位是赫兹(Hz)。根据采样定理:当采样频率大于或等于被采样信号最高频率的两倍时,得到的离散信号可以完整的保留原始信号的所有信息。
(2)量化指将信号的连续取值近似为有限个离散值的过程。量化主要参数是量化位数,单位是比特(bit);量化位数越多,划分的越精细,量化结果与实际数据也越接近。
三、数制
1.数据在计算机内部是以二进制的方式存储和处理的。除了二进制(B)和十进制(D),常用的还有八进制(O)和十六进制(H)。
2.进制转换
(1)二进制转十进制:基权相乘再相加
(110)2 = 1*22+1*21+0*20 =(6)10
(2)十进制转二进制:除2取倒余
(173)10 = (10101101)2
(3)十六进制转二进制: 1位转4位 (4)二进制转十六进制:4位转1位
四、字符编码
1. ASCII码(美国信息交换标准代码,半角字符):主要用于显示现代英语和其他西欧语言,属于机内码;编码范围:00H—7FH;常用字符内码:字符“0”=48D=30H,字符“A”=65D=41H,字符“a”=97D=61H。
2. GB2312(国标码,全角字符):计算机中处理汉字需要经过外码(输入码),交换码,机内码和字形码多种编码过程。其中GB2312属于交换码,用两个字节表示一个汉字。GB2312中对英文字符和标点符号也进行了重新编码,在做题时需要根据具体情况确定其使用的编码类型。
五、图形编码
1. 条形码:常见的条形码是由反差率相差很大的黑条和白条排成的平行图案。我国普遍采用的条形码是EAN13条形码
2. 二维码:用某种特定的几何图形按一定规律在平面上分布黑白相间的图形记录数据符号信息。相对条形码,二维码存储信息量更大。
3. 对条形码和二维码的识别过程中虽然用到了摄像头,但信息是直接从图形编码中获取的,所以不涉及数字化的过程。
六、多媒体编码
1. 容量单位换算:1Byte=8bit;1KB=1024B;1MB=1024KB;1GB=1024MB;1TB=1024GB
2. 图像编码
(1)矢量图:基于数据方程的几何元素描述的图像,特点是放大不失真。
(2)未压缩BMP格式图像的容量计算公式:水平像素*垂直像素*颜色位深度(bit)/8
(3)常见颜色格式:RGB/8=全彩色=24位;256色图=256阶灰度=8位;黑白图像=1位。
(4)常见图像格式:
.bmp(未压缩);.jpg(静态图像有损压缩);.png(有透明像素);
.gif(可将多张图片压缩进一个文件中,最多支持256种颜色)
3. 音频编码
(1)未压缩Wave格式容量计算公式:采样频率(Hz)*量化位数(bit)*声道数*时间(s)/8
(2)常见格式:.wav(未压缩);.mp3(有损压缩);.wma(微软音频)
4. 视频编码
(1)PAL制式每秒25帧,NTSC制式每秒30帧。
(2)未压缩avi格式视频容量计算公式:每张图像容量*帧数*时间(s)
(3)常见视频格式:.avi(可以未压缩,也可压缩);.mp4(有损压缩);.mov(苹果)
七、数据保存与数据安全
1. 计算机数据的管理已经经历了人工管理、文件管理、数据库管理三个阶段。
2. 结构化、半结构化、非结构化数据
(1)结构化数据:也成为行数据,可以由二维表来进行逻辑表达和实现的数据
(2)非结构化数据:数据结构不规范,不完整,无法用二维表来进行逻辑呈现。
(3)半结构化数据:介于结构化和非结构化之间,具有一定的结构性
3. 通过保护介质实现数据安全的方法:磁盘阵列、数据备份、异地容灾
4. 通过加密数据实现数据安全的方法:凯撒加密、换位密码、简单异或
5. 通过数据校验保证数据完整的方法:MD5、CRC(奇偶校验)、SHA-1
八、数据处理
1. 常见的数据问题及其处理方法:
(1)数据缺失:数据集中普遍存在的问题,一般可能是数据丢失或数据本身不完整
处理方法:忽略或采用平均值、中间值或概率统计值填充。
(2)数据重复:在多数据源合并时经常出现,导致资源冗余和浪费。
处理方法:进一步审核的基础上进行合并或删除。
(3)异常数据:数据集中的某些数据不符合一般规律,例:健康系统显示体温到达50摄氏度。
处理方法:这些有可能是要去掉的噪声,也有可能是含有重要信息的数据对象。
(4)逻辑错误:属性与实际不符,违背业务规则或逻辑,例:某人的生日为13月40日
处理方法:对应的字段需要设置取值范围判断。
(5)格式不一致:多出现在数据来源多样的系统中
处理方法:将不同格式的数据转换成统一格式后再进行处理。
2. 常用的数据处理和统计分析工具有Excel、SPSS、SAS、MATLAB等软件,也可以通过R、Python、Java等计算机语言编程进行数据处理。
3. 常见的图表类型有:柱形图、折线图、饼图、雷达图、散点图、气泡图等。
九、大数据
1. 大数据的特征
(1)数据体量大 (2)速度快:包括产生速度和处理速度。
(3)数据类型多 (4)价值密度低
2. 大数据思维
(1)大数据分析全体数据而不是抽样数据
(2)对数据不再追求精确性
(3)不强调因果性而强调相关性。
十、大数据处理
1. 大数据处理的基本思想:“分治思想”,即将一个复杂的问题拆分成两个或多个相同或相似的子问题,找到求这几个问题的解法之后,再找出合适的方法把它们组合成求整个问题的解法。
2. 大数据处理的数据类型:
(1)静态数据:在处理时已经收集完成、在计算时不会发生改变的数据
处理方法:批处理
(2)流数据:不间断地、持续地到达的实时数据。流数据的价值会随着时间的流逝降低。
处理方法:流计算或实时分析计算
(3)图数据:现实世界中以图形式展现的数据。如社交网络、道路交通等
处理方法:图计算
3. 批处理
Hadoop是一个可运行于大规模计算机集群上的分布式系统基础架构,适用于静态数据的批量计算。Hadoop计算平台主要包括Common公共库、分布式文件系统HDFS、分布式数据库HBase、分布式并行计算模型MapReduce等多个模块。
(1)分布式文件系统(HDFS):将大规模海量数据以文件的形式、用多个副本保存在不同的存储节点中,并用分布式系统管理。HDFS是一个高度容错性的文件系统,云盘、网盘的底层一般采用HDFS实现。
(2)分布式数据库(HBase):HBase建立在HDFS提供的底层存储基础上,采用基于列的存储方式,主要存储非结构化和半结构化的数据,具有良好的横向扩展能力。
(3)分布式并行计算模型(MapReduce):MapReduce是一种分布式并行编程模型,能够进行大规模的并行计算。其核心处理思想是将任务分解并分发到多个节点上进行并行处理,最后汇总输出。
4. 流计算
流计算主要用于处理流数据,如大型购物网络的广告推荐、社交网络的个性化推荐等。处理流数据的软件主要有Twitter Storm、Heron、Yahoo!S4等。Storm和S4是目前较为流行的开源分布式实时计算系统。
5. 图计算
现实世界中的很多数据以图的形式呈现,或者是需要转换为图后才能分析。目前图处理的软件主要分为两类:图数据库和并行图处理系统。
十一、文本数据处理
1. 文本数据处理主要应用在搜索引擎、情报分析、自动摘要、自动校对、论文查重、文本分类、垃圾邮件过滤、机器翻译、自动应答等方面。
2. 典型的文本处理过程主要包括分词、特征提取、数据分析、结果呈现等。
3. 中文分词方法
(1)基于词典的分词方法:用词典中的词语进行比对。案例:Python中的jieba库
(2)基于统计的分词方法:根据上下文相邻字出现的频率统计。
(3)基于规则的分词方法:根据现有资料和规律学习实现分词。
4. 特征提取方法
(1)根据专家知识挑选有价值的特征。(约等于人工分析)
(2)用数学建模的方法构造评估函数自动选取特征。(目前大多采用)
5. 结果呈现方式:
(1)标签云:用文字大小形式表现词语的重要性
(2)文本情感分析:根据分析颗粒度可以分为词语级、语句级、整篇文章级三类。
十二、数据可视化
1. 数据可视化是将数据以图形、图像等形式表示、直接呈现数据中蕴含信息的处理过程。
2. 可视化的作用:快速观察与追踪数据、实时分析数据、增强数据的解释力和吸引力等。
3. 可视化的基本方法
(1)有关时间趋势的可视化:展示随时间的推移而变化的数据,可采用柱形图、折线图等。
(2)有关比例的可视化:展示各部分的大小及其占总体比例关系的数据,可以采用饼图、环形图(也称面包圈图)等。
(3)有关关系的可视化:探究具有关联性数据的分布关系,可以使用散点图、气泡图等。
(4)有关差异的可视化:包含多种变量的对象与同类之间的差异和联系,可以采用雷达图。
(5)有关空间关系的可视化:地理数据或者基于地理数据的分析结果可以运用不同颜色或图表直接在地图上进行展示。
十三、大数据的典型应用
1. 大数据应用领域:随着大数据在各行业的应用,数据成为核心资产。目前,大数据广泛应用于金融、交通、环境、医疗、能源、农业等领域,极大地促进了各行业的发展。
2. 大数据在电子商务方面的应用;精准营销基于用户购买行为挖掘用户偏好;仓储管理实现商品自动补货;供应链管理实现最优配送路径;智能网站分析用户后向用户智能推荐商品。
十四、人工智能
1. 人工智能的概念:人工智能是指以机器(计算机)为载体,模仿、延伸和扩展人类智能、其与人类或其他动物所呈现的生物智能有着重要区别。
2. 人工智能的主要方法
(1)符号主义:认为学习或者其他的智能特征原则上均可以被符号精确地描述,从而被机器仿真。符号主义方法包含知识库和推理引擎两个部分。它先将所有知识以逻辑形式表达,然后依靠推理引擎,去验证命题或谓语正确与否,或者学习推导出新规则、新知识。
案例:“鸵鸟会飞”、专家系统
(2)联结主义:通过模仿人类大脑中神经元之间的复杂交互来进行认知推理。多层神经网络(包含输入端、隐藏层和输出端)是一种典型的深度学习模型。
(3)行为主义:认为智能体可以在与环境的交互中不断学习,从而提升自己的智能水平。
案例:扫地机器人,阿尔法狗
3. 人工智能的应用分类
(1)领域人工智能:依赖于领域知识和数据的人工智能。
(2)跨领域人工智能:智能系统从一个领域快速跨越到另一个领域。
(3)混合增强人工智能:多种智能体的混合形式,他将人的作用或人的认知模型引入人工智能系统,形成“混合增强智能”的形态。需要注意的是,在智能叠加协调的回路中,人类智能是智能回路的开关。
4. 人工智能对社会的影响
(1)人工智能改善人类生活:智能家居、智慧城市、智能出行、智能购物等。
(2)人工智能促进经济发展:提供虚拟劳动力、提高生产力、加快实体经济转型升级。
(3)人工智能带来的社会担忧:人工智能取代人类岗位,威胁人类安全。
必修二
一、信息技术及其发展历史
1. 信息技术的定义:信息技术是指获取、传输、存储、加工和表达信息的各种技术的总和。
2. 信息技术的发展历史(划分依据:信息的输入、加工、输出和传播)
(1)前机械时期:信息被文字存储下来。
例:楔形文字、甲骨文、希腊字母、罗马字母
(2)机械时期:信息检索和加工技术发展。
例:活字印刷术、计算尺、加法器、莱布尼兹计算器
(3)电子机械时期:信息以电子脉冲方式传输。
例:电报、电话、收音机
(4)电子化时期:计算机技术的发展。
例:ENIAC诞生
二、信息系统
1. 信息系统的定义:由硬件软件设施、通信网络、数据和用户构成的人机交互系统。
2. 信息系统的组成要素:(1)硬件、(2)软件、(3)数据、(4)通信网络、(5)用户。
3. 信息系统的功能:数据收集和输入功能、数据存储功能、数据传输功能、数据加工处理功能、数据输出功能、数据查询功能。
4. 信息系统的分类:
(1)按信息系统规模分类:简单系统和复杂系统。其中简单系统可以是复杂系统的子系统,信息系统的硬件可以共用。
(2)按信息技术发展阶段:数据处理系统(初级阶段)、管理信息系统(发展阶段)、决策信息系统(发展阶段)
(3)按应用领域分类:通用信息系统、制造业信息系统、医疗保健信息系统、学校管理信息系统、银行信息系统、政府信息系统等。
5. 信息系统的优势
(1)规范工作流程,提高工作效率 (2)跨越时空限制,服务随时随处
(3)基于数据分析,支持科学决策 (4)便捷保存数据,利于共享追踪
6. 信息系统的劣势
(1)对外部环境有依赖性:受停电或极端天气的影响
(2)本身有安全隐患:感染病毒、系统本身的漏洞、黑客入侵
(3)技术门槛可能加剧数字鸿沟:不同年龄段、不同地域学习成本不同
三、信息社会
1. 信息社会的基本内涵
(1)信息社会是以人为本的:社会发展必须以人为中心;以人为本才能体现信息社会具有包容性;以人为本才能实现全面发展(人与社会均衡发展)
(2)信息社会是可持续发展的
(3)信息社会是以信息和知识作为重要资源的
2. 信息社会的主要特征包括信息经济、网络社会、在线政府、数字生活四个方面。一般用和信息社会指数(ISI)衡量信息社会发展水平。
四、计算机硬件
1. 计算机发展经历了电子管、晶体管、集成电路、大规模超大规模集成电路四个发展阶段。未来计算机逐渐向巨型化(超级计算机)、微型化(民用计算机)、智能化(阿尔法狗)、网络化(云计算)。
2. 计算机硬件主要由运算器、控制器、存储器、存储器、输入设备和输出设备五大部件组成。
3. 中央处理器(CPU)
(1)中央处理器是计算机最核心的部件,包括运算器和控制器两个部分,现代处理器中还包括浮点处理部件(FPU)、内部高速缓冲存储器(Cache)和存储管理部件,以加快计算机执行指令的速度。
(2)CPU的性能指标包括:时钟频率(主频)、字长、核心数量和高速缓存(Cache)。
1-时钟频率:计算机一般采用CPU的主频来描述运算速度,主频越高,运算速度越快。
2-字长:CPU在单位时间内能一次处理的二进制数的位数称为字长,字长越长,处理 数据的能力越强,现在主流计算机该项参数一般为32位和64位。
3-核心数量:即CPU的内核数量
4-高速缓存:CPU内部存储区,用于平衡CPU处理速度和内存的读取速度。一般由多 级构成,即一级缓存、二级缓存等
4. 存储器
(1)存储器是计算机中存放程序和数据的地方。按用途可以分为主存(内存)、辅助存储器(硬盘、U盘)、高速缓存(Cache)。读写速度由快到慢分别为:Cache、内存、硬盘、U盘
(2)RAM是随机存储器,它的特点是:读写速度相对较快、断电后数据会丢失,一般用来做内存(运存)
(3)ROM是只读存储器,它的特点是:断电后数据依然保留,但数据只能写入一次,之后只能读数据。后来它的衍生版本EEPROM成为现在外存(硬盘或手机存储)的主要材料。
(4)内存的主要参数有:版本(DDR)、容量、电压(标压或低压)
(5)硬盘主要有机械硬盘(HDD)和固态硬盘(SSD)两种。相比HDD,SSD具有快速读写、重量轻、能耗低等特点。
(6)闪存盘(U盘)是闪存(flash)做为存储介质,通常采用USB接口,即插即用。
5. 输入输出设备
(1)输入设备:将程序和数据以机器能够识别和接受的形式输入计算机。
(2)输出设备:将计算机的出理解结果以人们能接受的信息形式进行输出。
(3)部分设备可以兼具输入输出功能,例如网卡(计算机与网线的连接)、声卡(模拟和数字信号转换)、光驱(光盘数据的读取和刻录)。
6. 计算机工作原理
(1)计算机处理信息主要包括:输入、处理(运算和控制)、存储、和输出四个步骤。
(2)“存储程序式”(冯·诺依曼式)体系结构
五、计算机软件
计算机软件可以分为系统软件和应用软件两大类
1. 系统软件包含三类:操作系统、数据库软件、编程语言。常见的操作系统有Windows(微软)、Mac OS(苹果)、Linux(开源免费)和UNIX。
2. 应用软件:利用计算机的软、硬件资源为解决某一应用领域的某个实际问题而专门开发的软件。
六、移动终端
1. 移动终端也叫移动通信终端,是指可以在移动中使用的计算机设备。例:手机、平板、笔记本电脑等。
2. 移动终端的处理器是整个移动终端的控制核心。常见的处理器有苹果、三星、高通(Qualcomm)、英特尔(Inter)、英伟达(Nvidia)、联发科(MTK)等。麒麟(华为)是我国首款国产移动终端中央处理器。
3. X86架构(计算机处理器)和ARM(移动终端处理器)架构:
X86架构:使用标准指令集、效率一般、性能优越、扩展性强、功耗高
ARM架构:使用精简指令集、效率高、性能一般、“够用就好”、功耗低
4. 移动终端常见的操作系统:Android(基于Linux)、iOS(苹果)、Windows、HarmonyOS(鸿蒙OS/华为)等。扩展知识:常见安卓手机操作系统有:MIUI(小米)、MagicUI(荣耀)、ColorOS(oppo)、OriginOS(vivo)等。
5. 移动终端上的常见传感器及其功能
(1)光线传感器:自动调节屏幕背光的亮度;
(2)距离传感器:检测手机是否贴在耳朵上打电话,以便自动调暗屏幕;
(3)重力传感器:手机横竖屏智能切换、拍照照片朝向转换;
(4)加速度传感器:计步、检测睡眠;
(5)指纹传感器:加密、解锁、电子支付;
(6)霍尔传感器:翻盖自动解锁、合盖自动锁屏;
(7)磁场传感器:电子指南针、电子金属探测器;
(8)光学心率传感器:检测用户心率;
(9)皮电反应传感器:检测用户的运动状态;
七、传感与控制
1. 现代信息系统的三大支柱:传感器技术、通信技术、计算机技术。
2. 传感器:能感受被测量并按照一定的规律转换成可用输出信号的器件或装置,通常由敏感元件和转换元件组成。
3. 传感器与信息系统的连接
4. 串口:串行通信总线的简称。数据在串口上串行传输时,要求发送端和接收端必须设置相同的波特率,否则将无法正常通信。相比于并行通信,串行通信线路更简单,一般只要一对传输线就可以实现。
5. 传感技术负责将采集到的外部信息输入信息系统;控制技术负责实现信息系统对外部世界的控制。根据控制不同,可以分为开环控制和闭环控制。
八、射频识别(RFID)
1. 无源标签的射频识别过程
(1)读写器天线发射向外发射电磁波
(2)无源标签被激活,内置芯片向外发送自身携带信息
(3)读写器通过天线读取标签发送的信息,经过解码后传输到信息系统进行下一步操作
2. 电子标签的分类
(1)电子标签根据有无电池,分为有源标签和无源标签
(2)根据工作频率不同分为低频(LF)、高频(HF)、超高频(UHF)和微波频段(MW)。
3. 无源RFID开发较早,应用广泛,如公交卡、食堂餐卡、银行卡(闪付)、门禁卡、二代居民身份证等。为了实现安全的移动支付,NFC应运而生,NFC是一种短距(运行于10cm内)高频(13.56MHz)的无线识别技术,一般内置在手机中。
九、网络系统
1. 网络的功能与作用:数据通信功能、资源共享功能、分布处理功能(云计算、边缘计算)。
2. 网络的根据应用领域分为:计算机网络、移动通讯网络、广播电视网络。
3. 计算机网络
(1)根据覆盖范围分类:局域网(LAN)、城域网(MAN)、广域网(WAN)。
(2)根据拓扑结构分类:总线型、环型、星型、树型、网型等。其中网型是目前使用最广泛的网络连接类型,优点是容错率高,缺点是消耗资源多。
(3)根据数据交换方式分类:电路交换、报文交换、分组交换。现代计算机网络中使用的交换技术是分组交换。
4. 移动通信网络
(1)第一代(1G)移动通信网络:仅能语音通话;
(2)第二代(2G)移动通信网络:可以发送短信;
(3)第三代(3G)移动通信网络:可以传输图像和音乐;
(4)第四代(4G)移动通信网络:实现在线看视频;
(5)第五代(5G)移动通信网络:现在,用于实现物联网和车联网。
5. 广播电视网络也称为混合光纤同轴网络(HFC)。广播电视网络具有频带宽、容量大、功能多、成本低、抗干扰能力强、支撑多种业务等优势。但由于用户数据都在一条线上传输,有被搭线窃听的风险;其次其网络结构为树形结构,易造成单点故障;随着用户数量增加,网络会产生拥堵,用户体验急剧下降。
6. 三网融合与发展:数字技术得到迅猛的发展(语音、视频统一为二进制流传输);光纤技术的广泛应用和计算机网络互连通信技术(IP技术)的进一步发展。
十、计算机网络的构建与连接
1. 网址又称统一资源定位符(URL),由3部分组成:
2. 负责将服务器网址转为IP地址的系统称为域名系统,英文缩写为DNS。
3. 计算机网络的组成:计算机系统、数据通信系统、网络软件和网络协议。
(1)计算机系统包括服务器和终端两个部分
(2)数据通信系统主要由传输介质和网络互联设备组成。其中传输介质分为有线传输介质(光纤、双绞线等)和无线传输介质(Wifi、蓝牙等)。网络互联设备主要包括调制解调器(Modem)、路由器(Router)、和交换机(Switch)。
(3)网络软件一般包括网络操作系统、通信软件以及管理和服务软件,常见的网络操作系统有UNIX、Windows Server、Linux。
(4)网络协议从上到下分为三层:应用程序协议(AP)、传输控制协议(TCP)、网际协议(IP)。
4. 网络的构建步骤
5. 缩写中英对照
HTTP:超文本传输协议;
SMTP:简单邮件传输协议(邮件发送);
POP3:第三版邮局协议(邮件接收);
FTP:文件传输协议;
HTML:超文本标记语言;
ISP:互联网服务提供商;
DHCP:动态主机配置协议(动态IP);
SSID:服务集标识(热点名称);
十一、网络应用软件开发
1. 网络应用软件的实现框架:客户端/服务器架构(C/S)、浏览器/服务器架构(B/S)。
2. C/S架构的优缺点
(1)优点:将任务合理的分配到客户端和服务器端,降低了系统通信开销和开发难度
(2)缺点:客户端软件必须安装后才能使用,给应用程序升级维护带来一定的困难
3. B/S架构的优缺点
(1)优点:升级和维护都比较方便,极大的降低了成本和工作量
(2)缺点:服务器的负荷较重,对服务器的要求较高。
4. SQLite数据库的特点:轻量级、跨平台、独立性、零配置、开放性、占用资源低。
5. Python中常用的Web应用框架Flask、Django、Tronado。
6. 可靠的Web服务框架有很多,如IIS、Apache、Nginx、Tomcat、WebLogic。
十二、个人信息保护
1. 个人信息可以分为个人敏感信息和个人一般信息。个人敏感信息指一旦遭到泄露或修改,会对信息主体造成不良影响的信息,一般包括但不限于手机号,身份证号,政治观点,基因,指纹等;个人一般信息是指除了个人敏感信息以外的个人信息。
2. 个人信息泄露的渠道
(1)注册时无意泄露:网络平台账号注册;问卷调查填写个人信息;软件权限开放过度
(2)网上交流时被恶意窃取:上网浏览内容被记录;病毒、黑客入侵;公共场所免费Wifi
3. 个人信息泄露的危害:轻者导致个人或家庭被骚扰,隐私被公开。严重时不法分子会利用泄露的信息从事各种犯罪活动。
4. 个人信息保护途径
(1)通过国家立法保障实现对个人信息隐私权的保护;
(2)通过行业自律实现对个人信息的保护;
(3)加强个人信息意识;(定期修改口令;不随意提供个人或亲属信息;一旦发现信息被盗用,第一时间报警或通过法律途径维权)
十三、信息社会责任
1. 数字公民的定义:能够安全的、合法的、符合道德规范的使用数字化信息和工具的人。数字公民应具较高的数据意识、计算思维能力,具备利用信息技术解决问题的能力。
2. 数字公民素养教育
(1)尊重(尊重自己/尊重他人):数字礼仪、数字准入、数字法律
(2)教育(教育自己/链接他人):数字通信、数字素养、数字商务
(3)保护(保护自己/保护他人):数字权责、数字安全、数字健康
3. 知识产权
(1)知识产权通常是指法律规定的人们对于自己创造或拥有的智力成果所享有的各种权力的总称,包括相应的人身权力和财产权力。
(2)就信息技术领域而言,知识产权的保护主要是对知识产权权利人在微电子设备、计算机设备、通信设备等硬件设计制造以及软件的原创成果的保护。
(3)开发者设计开发的计算机软件,在开发完成之日就受到法律保护。使用者应自觉使用正版软件,抵制盗版及未经授权的软件。未经软件版权人的许可,不得对其软件复制、修改、传播等操作,更不能进行商业性转让、销售等侵权活动。
4. 开源软件虽然强调软件要自由使用、复制、研究、修改和分发,但也需要遵循自由软件授权协议;自由软件的意义不在于完全替代现存的商业软件,而在于自由软件开放过程中所体现出的巨大开发能力及让所有人可以参与的模式,通过该模式可以快速提高代码质量。
5. 自媒体在享有通信自由权、信息传播自由权、信息选择权时,还应承担道德上的责任和义务。在传播信息时要提升自律能力,加强自身新闻素养,遵循传播伦理规范,避免不良信息的产生和传播。
十四、数据加密
1. 一个密码系统至少由明文、密文、加密算法、解密算法和密钥5个部分组成。其中密钥是密码算法中引入的控制参数,对同一个算法采用不同的参数值,其加密的结果就不同(凯撒加密中的位移量K就可以理解为密钥,使用不同的位移量K,加密得到的结果不同)。其中我们又根据加密密钥(Ke)和解密密钥(Kd)是否相同分为:对称加密(Ke = Kd)和非对称加密(Ke ≠Kd)。
2. 替代密码(凯撒密码)通过字符转换的方式实现加密,由于加密和解密时使用的密钥相同,所以替代密码是对称加密。
3. 换位密码的基本思想是将明文中的字母位置通过一定的规则重新排序(没有增加或减少明文的字符),最简单的换位就是逆序法。
4. 简单异或加密就是将明文与密钥进行异或运算(相同为0,相异为1)(注意异或是位运算符,所以需要将明文和密文都先转换成对应的二进制才能运算)。解密则是将密文和密钥异或运算。同样的,简单异或在加密和解密过程中使用的密钥也是相同的,故异或加密也是对称加密。
十五、身份认证和访问控制(注意两者的作用范围和功能区别)
十六、病毒、漏洞、黑客、防火墙
1. 计算机病毒
(1)计算机病毒是指人为编制的能破坏计算机功能或者毁坏数据,影响计算机系统的使用,并能自我复制的一组计算机指令或者程序代码。它具有传染性、寄生性、隐蔽性、潜伏性、破坏性、可触发性等特征。
(2)病毒防治手段:安装并开启防火墙;安装应用系统补丁;安装防病毒软件;经常对系统和重要的数据进行备份;收到乱码信息后,及时删除;不接受陌生请求;保证下载内容的安全性;不随意连接公共场合的WiFi。
2. 漏洞
(1)漏洞是指一个系统存在的弱点或缺陷。漏洞可能来自应用软件或操作系统,由于设计时的缺陷或编码时的错误而产生,也可能来自逻辑流程上的不合理或程序员为了某种方便而留下的隐患(如“后门”)。
(2)漏洞的防治手段:使用防火墙来制止外部网络对内部网络的未经授权访问;经常使用安全监测与扫描工具来发现安全漏洞及薄弱环节,加强内部网络与系统的安全防护性能和抗破坏能力;使用有效的控制手段抓住入侵者;经常备份系统,以便在被攻击后能及时修复系统,将损失减少到最低程度。
3. 黑客:一般指热衷于计算机技术或解决难题、突破限制的高手。但由于部分人到处搜集黑客工具,利用网路进行捣乱和破环,使“黑客”逐渐沦为贬义词。
4. 防火墙
(1)防火墙一般是有硬件和软件组合而成的复杂系统,也可以只是软件系统。防火墙一般放在内部网络和外部网络之间,控制外网对内网的数据传输和访问。防火墙主要由服务访问规则、验证工具、包过滤和应用网关组成。
(2)防火墙按技术分类,主要分为地址转换防火墙、数据包过滤防火墙和代理防火墙;按形态分类分为硬件防火墙和软件防火墙。
(3)数据从外网到内网的经过的设备
十七、信息系统搭建
1. 搭建信息系统的前期准备
(1)需求分析:搭建信息系统前要明确用户对所搭建系统的目标期待,并由此分析需求。需求分析包括功能需求、性能需求、资源环境需求(软硬件环境)、用户界面需求、可扩展性需求。
(2)可行性分析:在需求分析的基础上,针对系统的环境、同类产品在市面上的完善程度,判断所提出的系统是否有必要搭建(必要性),有无实施的可能性(可行性)。必要性体现在搭建是否应该马上开始,有没有迫切需要。可行性分析主要从技术、经济、社会意义等方面分析系统的可行性。
(3)开发模式选择:在设计信息系统开发方案时,应根据信息系统的具体功能和应用场景确定开发模式。目前搭建信息系统一般采用C/S模式或B/S模式。
(4)概要设计:主要解决信息系统“怎么做”的问题,包括模块结构设计、系统物理配置和数据库管理系统选择三个部分:
1-模块结构设计:将信息系统分成若干模块,并确定每个模块的功能、模块间的接口和关系。
2-系统物理配置:包括了硬件设备配置、应用软件选择和通信网络的选择和设计。
3-数据库管理系统选择:主要考虑数据库的性能、类型、平台和安全保密性能。
(5)详细设计:是在概要设计的指导下,对系统进行详细具体的设计。主要包括输入设计、输出设计、人机界面设计、数据库设计、代码设计、安全设计。
2. 搭建信息系统
(1)硬件搭建:一个信息系统,其硬件组成主要包括服务器、网络设备、传感设备、智能终端等。
(2)软件开发:一般包括数据管理设计、服务器端程序、客户端程序几个部分。
3. 完善信息系统
(1)系统测试的目的是把测试结果与系统需求比较,发现问题并及时修正。系统测试包括软件测试、硬件测试、网络测试。
(2)软件测试包括正确性证明、静态测试和动态测试。正确性证明只选择一些代表性的数据验证程序的正确性,具有一定的局限性;静态测试不实际运行程序,采用人工检测和计算机辅助分析的手段,针对编程格式和结构进行评估;动态测试直接在客户端或服务器上运行程序,观察程序运行并发现错误。
4. 文档编写
(1)可行性研究报告:可行性分析阶段形成的文档,说明待开发系统在技术、经济和社会意义三个方面的可行性。
(2)系统分析说明书:概要设计阶段形成的文档,说明项目的主要工作内容、系统需求说明、系统功能说明、系统的数据说明。
(3)系统设计说明数:详细设计阶段形成的文档,包括模块设计、代码设计、输入设计、输出设计、数据库设计、人机交互界面、网络设计、安全设计等的实施方案。
(4)程序设计报告:软件开发阶段形成的文档,包括程序结构图、程序控制图、算法、程序流程图、源代码和注释等
(5)系统测试报告:系统测试报告,包括测试环境、测试内容、测试方案、测试结果等。
(6)系统使用和维护手册:为用户准备的文档,主要包括使用说明和内容解释。
(7)系统评价报告:系统开发完成后对整个系统和整个开发过程的评价文档。
必修算法程序
Python基础算法
一、算法概念
1. 广义的讲,“算法”指的是解决问题或完成任务的一系列步骤。在计算机科学领域内,“算法”指的是计算机解决问题的步骤,是为了解决问题而需要让计算机有序执行的,无歧义的,有限步骤的集合。
2. 算法的特征:
(1)有穷性:一个算法的处理步骤必须是有限的。
(2)可行性:每一步的操作与要求都是可行的,并且能够在有限时间内完成。
(3)确定性:每一步的执行描述必须是明确的
(4)0个或多个输入
(5)1个或多个输出
3. 描述算法的方法:1-自然语言描述;2-流程图描述;3-伪代码描述;4-用程序设计语言描述。
4. 编程解决问题的一般过程:1-抽象与建模;2-设计算法;3-编写程序;4-调试运行程序。
二、流程图基本图形及功能
三、解析算法和枚举算法
#鸡兔同笼问题:今有雉兔同笼,上有三十五头,下有九十四足,问雉兔各几何
1. 解析算法:用数学公式或解题步骤计算结果
head,foot = eval(input("请输入头和足的数量,格式是:头,足"))
rabbit = (foot-head*2)/2
chick = head-rabbit
print("兔子有{}只,鸡有{}只".format(rabbit,chick)
2. 枚举算法:按一定的顺序一一列举所有可能解
head,foot = eval(input("请输入头和足的数量,格式是:头,足"))
for rabbit in range(foot//4):
if rabbit*4+(head-rabbit)*2==foot:
print("兔子有{}只,鸡有{}只".format(rabbit,head-rabbit))
四、程序组成分析
1. 注释:在代码中添加注释,可以对代码功能进行解释说明。注释在代码运行过程中不参与执行。Python中有两种注释方式:1.用’#’开头的单行注释;2.用三引号开头和结尾的多行注释,这种注释本质是创建了一个多行字符串。
2. 变量和赋值:
程序中有些数据是未知或是可变的,为了零活的使用这些数据,可以使用变量进行存储。示例第二行就创建了一个名为TempStr的变量,用于存储外部输入值。
(1)变量命名时需要遵循一些基本规则:
1-变量名只能由数字,字母和下划线(英文)三种字符构成;
2-变量名不能用数字开头;
3-变量名区分大小写;
4-变量名不能和保留字相同;
这里特别需要指出两点:
1-Python变量名支持中文字符,但考虑兼容性一般不建议使用;
2-Python共有35个保留字(见下图),这些不可以被作为变量名使用。
(2)赋值语句:变量名=值;变量名=表达式;a,b=b,a
(3)赋值运算符:”=”、”+=”、”-=”、”*=”、”/=”、”%=”等
3. 数据类型:
Python共有四种数据类型:整型、浮点型(实型)、字符串型和布尔型
(1)整数类型(int):Python不带小数点的值都是整数类型。例:10;
除此之外整数类型可以用多种进制表示,二进制前缀0b或0B(10=0b1010);八进制0o或0O(10=0o12);十六进制前缀0x或0X(10=0xA)
(2)浮点类型(float):带小数点的数值类型。例10.0、1.0e1
(3)字符串型(str):字符串可以用单引号、双引号、三引号表示。
(4)布尔类型(Bool):只有True和False两个值。
4. 运算符和优先级
运算符 功能和作用 示例 优先级
( ) 小括号 略 0(最高)
** 幂运算 略 2
~ 按位取反 ~n = -n-1 1
*、/、//、% 乘,除,整除,取余 整除:不大于除法结果的最大整数;取余:x%y=x-y(x//y) 3
+、- 加法、减法 略 4
& 按位与 0b1111&0b1010=0b1010 5
^ 按位异或 0b1111^0b1010=0b0101 6
| 按位或 0b1111|0b1010=0b1111 7
<、>、==、<=、>=、!= 关系运算符 结果为布尔类型 8
in 、not in 存在性判断 结果为布尔类型 9
not 非 结果为布尔类型 10
and 与 结果为布尔类型 11
or 或 结果为布尔类型 12
5. 表达式:变量、常量、运算符按一定规则组合构成的式子
(1)表达式中存在多种运算符时,按优先级运算,优先级相同则从左到右
(2)Python中认为”0”(数值0)、””(空字符串)和False等价,非零数和非空字符串和True等价
(3)字符串比较时,比较的是两者的ASCII码值,从左到右逐位比较。例”123”<”23”=True
(4)数值类型的运算结果保留更精确的值。例1+2.0=3.0
6. 常用内建函数
(1)input([prompt]):获取输入,函数的参数为输出提示字符,返回值为字符串类型
(2)int(object[,base]):将数值字符串转为整数类型,base声明进制类型,默认base=10。返回值为十进制整数类型。例int(“FF”,16)=255
(3)float(object):将数值字符串转为浮点数类型
(4)abs(x):返回x的绝对值
(5)len(seq):返回列表或字符串的长度,整数类型
(6)str(x):将x转为字符串类型
(7)chr(x):x为ASCII码值,返回x对应的字符
(8)str(x):x为字符串,返回x对应的ACSII码值,整数类型
(9)round(x[,n]):对x四舍五入,保留n位小数。round(6,-1)=10
(10)max(),min():返回列表中的最大值和最小值
(11)print():输出内容到控制台。当参数只有一个,会自动将非字符类型转为字符类型后输出。当参数有多个,可以用逗号连接后转换位字符串输出。例:print(10);print(10,”全”,10,”美”)
(12)eval():删除字符两边的双引号。
7. 格式化字符串
(1)”%”
例1:print(‘转换后的温度是:%d℃’%22.5)
运行结果:转换后的温度是:22℃
注:%d为整数,%f为实数,%s为字符串
例2:print("转换后的温度%.2f℃,湿度%.2f"%(22.345,5.677))
运行结果:转换后的温度22.34℃,湿度5.67f
注:”.2”表示小数点后保留两位
例3:print(“%40s”%”今天的温度是十摄氏度”)
运行结果:' 今天的温度是十摄氏度'
注:”40”表示占位宽度为40且默认右对齐
(2)format方法
例1:print(“圆周率可以近似为:{}".format(3.1415926))
运行结果:”圆周率可以近似为:3.1415926”
注:format方法以{}为占位符
例2:print("转换后温度{:.2f}℃,湿度{:.2f}".format(23.456,5.678))
运行结果:"转换后的温度23.45℃,湿度5.67"
例3:print("转换后温度{1:5.2f}℃,湿度{0:-^20.2f}".format(23.456,,5.678))
运行结果:'转换后的温度 5.68℃,湿度-------23.46--------'
注:冒号前为参数序号,故两个值的替换位置变化;根据对应规则”-”为填充字符,”^”为居中对齐,”20”为替换槽宽度。
8. 字符串类型(str)
(1)字符串一旦创建就无法更改
(2)字符串的索引方式有正负两种
(3)字符串切片:字符串名[start:stop:step],结果含头不含尾,step可以为负。
(4)常用字符串操作方法
s.upper() #全部小写转大写
s.lower() #全部大写转小写
s.split(sep) #根据sep分割字符串s
s.find(y) #返回y第一次出现在s中的索引值,若未出现则为-1
s.replace(old,new[,max]) #将old用new替换,max为最大替换次数。
s.count(sub) #统计sub在s中出现的次数
s.join(iter) #用s对iter做分隔符
注意:由于字符串是不可变对象,所以以上方法不会改变s的值,只是将改变后的结果进行返回。
9. 列表类型(list)
(1)列表类型为可变对象,列表中的每个元素数据类型可以相同也可以不同,甚至可以嵌套列表类型;
(2)列表的访问和切片和字符串基本相同;
(3)列表的常用操作方法:
l.append(x) #在列表的最后添加一个元素x
l.clear() #清空列表s中的所有元素
l.insert(i,x) #在s的第i位置增加元素x
l.pop(i) #将s第i 位置的元素删除
l.remove(x) #将列表中第一次出现的x字符删除
l.sort(reverse) #对序列排序 reverse=True(降序)/False(升序,默认)
l.reverse() #将s的内容反转
注意:以上方法会直接改变列表l的值。
10. 字典类型(dic)
例:d = {"姓名":"小明","年龄":13,"性别":"男"}
(1)字典类型的特点是用花括号将各种元素放在一起,字典的每个值都由两部分组成:"键":"值",整个合起来叫“键值对”。
(2)字典的值只能通过“键”索引,因为字典内部元素是无序排列的,没有索引值的概念。
(3)字典添加值、修改值、删除值:
修改:d["性别"] = "女"
添加:d["国籍"] = "中国"
删除:del d["性别"]
(4)可以用d.key() 或 d.value() 单独输出字典的键和值
11. 分支结构
if <判断条件>:
语句块1
elif <判断条件>:
语句块2
else:
语句块3
(1)Python用代码缩进表示代码间的包含关系,同一级别代码缩进相同
(2)当<判断条件>为True才执行对应分支语句块
(3)elif 和 else 并非必须,且当前面有条件(if)满足后,后面的判断(elif)会直接跳过,不执行。
#例:
if 10>5:
print(10)
elif 20>10:
print(20)
#运行结果:10
12. 循环语句
for <循环变量> in <循环对象>:
语句块
(1)for循环是有限次循环,<循环对象>可以是字符串、列表,也可以是range()函数。
(2)range(start,stop,step)格式和字符串或列表切片类似。
while <判断语句>:
语句块
(3)while的判断语句不当,可能会造成“无限循环”。当<判断语句>结果为Ture运行循环,为False退出循环。
(4)break:结束并退出当前层循环
(5)continue:结束当前次循环,进入下一次循环
13. 自定义函数
def <函数名>(<参数1>,<参数2>...):
语句块
[return [返回值]]
(1)函数命名规则同变量命名规则
(2)函数参数可以设置默认值:<参数3>=<默认值>
(3)return 语句用于返还函数处理结果,并且结束函数运行
(4)函数内部变量为局部变量,当需要使用全局变量时需要用global声明
14. 第三方库的使用
(1)import <库名>
(2)import <库名> as <重命名>
(3)from <库名> import <函数名>
(4)from <库名> import *
注:常用的math和random模块函数见下页图表。
Python常见程序
1. 用辗转相除法(欧几里得算法)求最大公约数
def gcd(m,n):
while n != 0:
r = m%n; m = n; n = r
return m
print(gcd(24,15))
#注:m为两数中的较大值,n为两数中的较小值;通过m%n不断取余和交换,当余数为零时,最后的较小值就是原数的最大公约数。
2. 求素数
def prime_number(num):
for i in range(2,int(num**0.5)):
if num%i==0:
return False
return True
print(prime_number(15))
#注:素数只能被1和它本身整除,不能被其他自然数整除。
3. 进制转换
#(1)n进制转十进制(2<=n<=16)
def n_to_shi(n,str):
num = 0
for ch in str:
if n>10:
if "A"<=ch<="F":
num = num*n+(ord(ch)-ord("A")+10)
elif "a"<=ch<="f":
num = num*n+(ord(ch)-ord("a")+10)
else:
return "输入错误"
else:
if "0"<=ch<="9":
num = num*n+ch
else:
return "输入错误"
return num
print(n_to_shi(16,"FF"))
#(2)十进制转n进制(2<=n<=16)
def shi_to_n(num,n):
str = ""
while num>0:
r = num % n
if r<10:
str += str(r)
else:
str += chr(ord("A")+r-10)
num //= n
return str[::-1] #取倒余
print(shi_to_n(15,16))
4. 十进制拆解各个位
#在程序开始输入[100,500]范围内的正整数,程序输出5个数字,生成规则为:该项的数字+该数百位上的数+该数十位上的数+该数个位上的数=下一项数字。例如:
#输入:123
#输出:第1项为129,第2项为141,第3项为147,第4项为159,第5项为174,
n = eval(input())
if 100<=n<=500:
for i in range(5):
a = n // 100 #百位
b = n // 10 % 10 #十位
c = n % 10 #个位
n = n + a + b + c
print("第"+str(i+1)+"项为"+str(n),end=",")
else:
print("输入有误!")
5. 英文字符的大小写转换
def change(str):
ans = ""
for ch in str:
if "a"<=ch<="z": #ch.islower()
ch = chr(ord(ch)-32) #ch.upper()
elif 'A'<=ch<='Z': #ch.isupper()
ch = chr(ord(ch)+32) #ch.lower()
ans += ch
return ans
print(change("Ab1Cd2EFG3hij"))
6. 凯撒加密(替代加密)
def encrypt(code,key): #加密过程
code_new = ''
for s in code:
if 'A' <= s <= 'Z':
s_new = (ord(s)-ord('A')+key)%26+ord('A')
code_new += chr(s_new)
elif 'a' <= s <= 'z':
s_new = (ord(s)-ord('a')+key)%26+ord('a')
code_new += chr(s_new)
else:
code_new += s
return code_new
def decrypt(code,key): #解密过程
code_new = ''
for s in code:
if 'A' <= s <= 'Z':
s_new = (ord(s)-ord('A')-key)%26+ord('A')
code_new += chr(s_new)
elif 'a' <= s <= 'z':
s_new = (ord(s)-ord('a')-key)%26+ord('a')
code_new += chr(s_new)
else:
code_new += s
return code_new
s = input("code=")
s1 = encrypt(s,3) #加密
print(s1)
print(decrypt(s1,3)) #解密
7. 字符串切片(以身份证号处理为例)
def cut(id_num):
year = id_num[6:10]
month = id_num[10:12]
day = id_num[12:14]
sex = "男" if int(id_num[-2])%2==1 else "女" #执行if语句
print("您的出生日期为:"+year+"年"+month+"月"+day+"日,性别为:"+sex)
idnum = "330326199807071166"
print(cut(idnum))
#注:身份证号只能使用字符串存储,因为最后一位的校验码有可能为X。
#以下程序改编自必修教材例题
8. 角谷猜想
#以一个正整数n为例,当n是奇数时,下一步变为3n+1;当n是偶数时,下一步变为n/2。不断重复这样的运算,经过有限步后,一定可以得到1。
def conjecture(num):
s = str(num)+"->"
while True:
if num == 1:
break
elif num%2==1:
num = num*3+1
else:
num = num/2
s = s + str(num)+"->"
return s[:-2]
import random
print(conjecture(random.randint(0,1000)))
9. 图像字符画
ascil_char=list('"$_&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[] -/+@<>i!:;,\^`.')
def toText():
im = Image.open('二哈.jpg')
im.resize((100,100)) #修改图像大小
txt =' '
for i in range(im.size[1]): #垂直方向
for j in range(im.size[0]): #水平方向
r,g.b=im.getpixel((j, i))
gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b)
unit = 256 / len (ascil_char)
txt += ascil_char[int(gray//unit)]
txt += '\n'
fo = open('pic_char.txt', 'w')
fo.write(txt)
fo.close()
toText()
10. jieba分词并制作词云
import jieba
from wordcloud import WordCloud
import matplotlib.pyplot as plt
txt = open("你是我的荣耀.txt",'r',encoding='utf-8').read()
words = jieba.lcut(txt) #使用jieba库函数分词
counts = {}
for word in words:
if len(word) == 1: #排除长度为1的字符分词结果
continue
else:
counts[word] = counts.get(word,0)+1 #新词需要先新建,所以用get方法
items = list(counts.items()) #将字典中的键值对转为元组
items.sort(key=lambda x:x[1],reverse=True) #按照统计结果降序排序
ciyun = []
for i in range(50):
word,count = items[i]
print(word,count)
ciyun.append(word)
text_cut = ' '.join(ciyun) #转为字符串,并用空格分隔
wordscloud = WordCloud(background_color='white',font_path = '汉仪乐喵体.ttf',width=1000,height=1000,margin=2).generate(text_cut)
wordscloud.to_file("词云.png")
plt.imshow(wordscloud)
plt.axis('off') #关闭坐标轴
plt.show()
#运行结果:
11. 答题卡处理
from PIL import Image
x_start = 11 # 起始点坐标
y_start = 92
fill_width = 24 # 信息点宽度
fill_height = 10 # 信息点高度
space_width = 15 # 间隔宽度
space_height = 12 # 间隔高度
num_length = 9 # 准考证号长度
def bw_judge(R, G, B): # bw_judge 用于判断一个像素的填涂情况
Gray_scale = 0.299 * R + 0.587 * G + 0.114 * B
return Gray_scale < 132
def fill_judge(x, y): # fill_judge 用于判断信息点的填涂情况
count = 0
for i in range(x, x+fill_width):
for j in range(y, y+fill_width):
R, G, B = pixels[i, j]
if bw_judge(R, G, B) == True:
count = count + 1
if count >= fill_width * fill_height * 0.64:
return True
total_width = fill_width + space_width
total_height = fill_height + space_height
image = Image.open("答题卡.bmp")
pixels = image.load()
num = ""
for col in range(num_length):
for row in range(10):
x = x_start + total_width * col
y = y_start + total_height * row
if fill_judge(x, y) == True:
num = num+str(row)
break
else: #十个点检查完都没有填涂for...else...特殊用法
num = num+"#"
print(num)
12. Image模块(老虎图片)
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
choice=128
img=np.array(Image.open("lena.jpg").convert('L'))
rows,cols=img.shape #图像尺寸分别赋值
for i in range(rows): #依次取每个像素的坐标
for j in range(cols):
if (img[i,j]<=choice): #像素值小于等于指定值,赋值1,否则为0
img[i,j]=0
else:
img[i,j]=1
plt.figure("lena") #指定当前绘图对象
plt.imshow(img,cmap='gray') #显示灰度图像
plt.axis('off') #关闭图像坐标
plt.show() #弹出包含了图片的窗口
Pandas数据处理
一、一维结构Series
1. 创建Series
import pandas as pd
s1 = pd.Series([166,178,180])
print(s1)
#运行结果:
0 166
1 178
2 180
dtype: int64
2. 左列为索引(index),右列为数值(values),左侧索引默认从0开始递增,但也可以在创建Series对象时直接指定索引名称。
import pandas as pd
s1 = pd.Series([166,178,180],index=["s01","s02","s03"])
#创建Series并指定索引
print(s1)
#运行结果:
s01 166
s02 178
s03 180
dtype: int64
3. Series类型可以用属性方法将索引和值分别输出
print(s1.index) #运行结果Index(['s01', 's02', 's03'], dtype='object')
print(s1.values) #[166 178 180]
4. 当我们需要修改或输出某个值时,方法和列表类似:s1[index]
print(s1["s02"]) #运行结果178
当然也可以用这种方法修改单个值
s1["s02"] = 180 #修改索引"s02"的值
5. 需要特殊指出的是,由于上面代码指定索引时使用的是字符类型,默认的数值类型的索引值依然可用。
print(s1[1] ) #运行结果为180
s1[1] = 180 #修改索引1的值,和上面的s1["s02"] = 180等价
二、二维结构DataFrame
data1 = {"姓名":["张三","赵四","王五"],"性别":["男","女","男"],"年龄":[12,15,13]} #创建一个字典类型
df1 = pd.DataFrame(data1) #用字典类型生成DataFrame类型
print(df1)
#运行结果:
姓名 性别 年龄
0 张三 男 12
1 赵四 女 15
2 王五 男 13
和Series类似,第一列为索引值(index),默认从0开始递增。第一行是列标题,可以使用对应的方法输出
df1.index = ["01","02","03","04"] #修改索引值
print(df1.columns) #输出列标题
print(df1.values) #输出值区域的内容
1. 输出单列
print(df1.姓名)
print(df1["姓名"]) #两行代码等价,但注意两者引用的格式不同
#运行结果:
0 张三
1 赵四
2 王五
2. 修改单列
df1.年龄=[14,14,14]
df1["年龄"]=[14,14,14] #两行代码等价,修改"年龄"列的值
3. 输出单行
print(df1.loc[0]) #用loc函数输出索引0的行
print(df1[0:1]) #输出索引0的行,类似于截取,含头不含尾
#这两行代码运行结果等价,运行结果如下
姓名 性别 年龄
0 张三 男 12
4. 修改单行
df1.loc[0] = ["钱六","男",24]
df1[0:1]=["钱六","男",24] #两行代码等价,修改索引0的行
5. 输出或修改单个值,使用at(行,列)函数
print(df1.at[0,"年龄"]) #输出张三的年龄,结果为12岁
df1.at[0,'年龄'] = 50 #修改张三的年龄为50岁
6. 二维结构转置
print(df1.T)
#运行结果:
0 1 2
姓名 张三 赵四 王五
性别 男 女 男
年龄 12 15 13
7. 对DataFrame行/列的算数运算
1) sum(axis=0/1) #统计行或者列的数据和 #axis = 0统计列,axis = 1 统计行
print(df1.sum()) #统计各列数据和
#运行结果:
姓名 张三赵四王五
性别 男女男
年龄 40
dtype: object
2) count(axis=0/1) #统计列/行的非空(NaN)数据个数
print(df1.年龄.sum()) #求年龄列数据个数
3) mean(axis=0/1) #统计列/行的平均值
print(df1.年龄.mean()) #年龄列求平均值
4) max(axis=0/1) #统计列/行的最大值
print(df1['姓名'].max()) #姓名列求最大值
5) min(axis=0/1) #统计列/行的最小值
print(df1['年龄'].min()) #年龄列求最小值
8. 基本描述统计值函数describe()
print(df1.describe()) #返回各列的基本描述统计值,包括计数、平均、标准差、最大值、最小值等。(注:只对数值列生效)
#运行结果:
年龄
count 3.000000
mean 13.333333
std 1.527525
min 12.000000
25% 12.500000
50% 13.000000
75% 14.000000
max 15.000000
9. head(n),tail(n)返回前n行,后n行的数据,n默认为5
print(df1.head()) #返回前5行数据(由于df1只有三行,故全部输出)
#运行结果:
姓名 性别 年龄
0 张三 男 12
1 赵四 女 15
2 王五 男 13
print(df1.tail(1)) #返回最后一行数据
#运行结果:
姓名 性别 年龄
2 王五 男 13
10. 根据条件筛选行输出
print(df1[df1.性别=="男"]) #输出性别==男的所有行
print(df1[df1["年龄"]>13]) #输出年龄>13的所有行
11. 分类汇总groupby(列名,as_index=True/False)
#创建新df1,后面的函数均使用该新表为例
data1 = {"姓名":["张三","李四","张三","李四"],"科目":["语文","语文","数学","数学"],"成绩":[60,70,50,80]}
df1 = pd.DataFrame(data1)
#运行结果:
姓名 科目 成绩
0 张三 语文 60
1 李四 语文 70
2 张三 数学 50
3 李四 数学 80
观察新表,我们现在需要统计张三和李四的总成绩,需要对df1进行分类汇总
print(df1.groupby("姓名").sum()) #根据姓名列分类汇总后计算和
#运行结果:
姓名 成绩
张三 110
李四 150
#但需要注意的是,这种使用方式会使分类列(姓名)成为索引,所以一般还需要设置as_index=False。
print(df1.groupby("姓名",as_index=False).sum()) #根据姓名列分类汇总计算和
#运行结果:
姓名 成绩
0 张三 110
1 李四 150
12. 排序sort_values(列名,ascending=True/False,inplace=False/True)
print(df1.sort_values("成绩",ascending=False))
#根据成绩列排序,ascending确定升(True)降(False)序,默认升序(True)
#运行结果:
姓名 科目 成绩
3 李四 数学 80
1 李四 语文 70
0 张三 语文 60
2 张三 数学 50
print(df1.sort_values("成绩",inplace=True))
#成绩列升序排序,inplace声明是否用结果替换原表格,默认False不替换
#运行结果:
姓名 科目 成绩
2 张三 数学 50
0 张三 语文 60
1 李四 语文 70
3 李四 数学 80
13. 删除drop(axis = 0/1)
print(df1.drop("姓名",axis=1)) #删除姓名列
print(df1.drop(0)) #删除索引0的行
#需要特别指出,drop()的axis与前面算数运算行列定义相反,当要删除列时,axis需要特别设置为1,否则默认0删除的是行
14. 追加数据行append(ignore_index)
data2 = {"姓名":["张三","李四"],"科目":["英语","英语"],"成绩":[60,70]}
df2 = pd.DataFrame(data2) #创建一张新的表用于追加
print(df2)
#运行结果:
姓名 科目 成绩
0 张三 英语 60
1 李四 英语 70
print(df1.append(df2)) #将df2追加到df1后面
#运行结果:
姓名 科目 成绩
0 张三 语文 60
1 李四 语文 70
2 张三 数学 50
3 李四 数学 80
0 张三 英语 60
1 李四 英语 70
#观察运行结果,df2索引值也是直接追加到df1后面的,这会使得通过索引值输出时,英语成绩是无法输出的。
print(df1.append(df2,ignore_index=True)) #将df2追加到df1后面,索引值连续
#运行结果:
姓名 科目 成绩
0 张三 语文 60
1 李四 语文 70
2 张三 数学 50
3 李四 数学 80
4 张三 英语 60
5 李四 英语 70
15. 插入列insert(loc, column, value)
date = ["高一","高二","高一","高二"]
df1.insert(1,"年级",date)) #在第二列插入年级
print(df1)
#运行结果:
姓名 年级 科目 成绩
0 张三 高一 语文 60
1 李四 高二 语文 70
2 张三 高一 数学 50
3 李四 高二 数学 80
16. 修改行列名称rename(index, columns)
df1 = df1.rename(index={0:"a",1:"b"},columns={"姓名":"xingming"})
#修改行索引0,1为"a","b";修改姓名列为xingming
print(df1)
运行结果:
xingming 科目 成绩
a 张三 语文 60
b 李四 语文 70
2 张三 数学 50
3 李四 数学 80
17. 合并两张表concat([表1,表2])
df3 = pd.concat([df1,df2])
print(df3)
运行结果:
姓名 科目 成绩
0 张三 语文 60
1 李四 语文 70
2 张三 数学 50
3 李四 数学 80
0 张三 英语 60
1 李四 英语 70
#需要特别指出的是,两表连接的结果与追加相似,并且索引也是直接连接。
18. plot()绘图
import matplotlib.pyplot as plt
df1.plot(kind="bar") #用df1数据生成图,kind声明了生成的是柱状图
plt.show() #最后的图像需要通过matplotlib库的show()输出
#运行结果:
#注:图像中显示的成绩这一列的数据
#例题:利用Panda模块处理成绩单,输出信息技术成绩前10同学中男女同学的平均分。
import pandas as pd
df = pd.read_excel("成绩单.xls") #导入excel并转为DataFrame
df_sort = df.sort_values("信息技术",ascending=False) #根据信息技术成绩升序
df_t = df_sort.head(10) #取前十名的成绩
df_filter = df_t[["姓名","性别","信息技术"]] #只保留三列内容
df_group = df_filter.groupby("性别",as_index=False) #根据性别分类汇总
print(df_group.mean()) #根据分类结果计算平均值
运行结果:
性别 信息技术
0 女 45.000000
1 男 44.833333
三、matplotlib模块
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0,10,1000) #生成一个等差数组,(头,尾,数据个数)
y1 = np.sin(x)
y2 = np.sin(x**2)
plt.figure(figsize=(8,4)) #创建一个图表对象
plt.title("sin(x) and sin(x**2)") #设置图表标题
plt.plot(x,y1,label="sin(x)",color="r",linewidth=2) #绘制线型图
plt.scatter(x,y2,label="sin(x**2)") #绘制散点图
plt.ylim(-1.5,1.5) #设置y轴取值范围
plt.xlim(0,10) #设置x轴取值范围
plt.xlabel("x") #设置x轴标签
plt.ylabel("y") #设置y轴标签
plt.legend() #显示图例
plt.show() #显示绘图对象
#运行结果:
#垂直柱状图
import numpy as np
import matplotlib.pyplot as plt
X = np.linspace(0,10,10) #生成一个等差数组,(头,尾,数据个数)
Y1 = np.random.uniform(0.5,1,10) #生成随机数组
Y2 = np.random.uniform(0.5,1,10)
plt.figure(figsize=(8,4)) #创建一个图表对象
plt.title("random") #设置图表标题
plt.bar(X,Y1,label="Y1") #设置图形为柱形图
plt.bar(X,-Y2,label="Y2")
for x,y in zip(X,Y1): #添加y值显示
plt.text(x+0.01,y+0.05,"%.2f"%y,ha="center",va="bottom")
for x,y in zip(X,Y2):
plt.text(x+0.01,-y-0.05,"%.3f"%-y,ha="center",va="top")
plt.ylim(-1.5,1.5) #设置y轴取值范围
plt.xlim(-0.5,10.5) #设置x轴取值范围
plt.legend() #显示图例
plt.show() #显示绘图对象
运行结果:
Flask数据库
案例一:建立最简单的网页
Python代码
控制台输出
倒数第二行给出的是网页地址
当用浏览器打开网页时,Web服务器将受到一条GET请求
浏览器界面
案例二:建立新路由
Python代码
浏览器界面:注意URL的变化
案例三:使用变量
Python代码
浏览器界面:注意URL和显示内容
案例四:使用HTML模板,并向模板中传递变量
Python代码
HTML代码:注意变量的传递和HTML中变量的格式
浏览器显示:注意网页标题
注意:HTML模板需要放在templates文件夹下,这是Flask内部定义的默认路径。
案例五:Flask_wtf表单库的使用
Python代码
注意:代码中使用request.method == 'POST'接受按键按下后表单的返回值。课本上采用的是form.validate_on_submit()检测按键按下事件,两者效果基本等价。
load.html代码
text.html代码
浏览器登陆(load.html模板)
浏览器输入admin结果
浏览器输入Peter结果
附录:flask_wtf内置标准表单字段
序号 字段 描述
1 StringField 单行文本输入框(*)
2 TextField 单行文本输入框
3 BooleanField 多选框
4 DecimalField 用于显示带小数的文本字段
5 IntegerField 用于显示带整数的文本字段
6 RadioField 单选框
7 SelectField 下拉列表框
8 TextAreaField 多行长文本输入框
9 PasswordField 密码输入框(输入内容自动变为*)(*)
10 SubmitField 提交按钮(*)
SQLite数据库
1. SQLite基本操作
import sqlite3
#连接/创建数据库
conn = sqlite3.connect("Sqlite/text.db")
#创建游标
cu = conn.cursor()
#创建数据表(表名st)
#create table <表名>(<字段名> <字段数据类型>,……)
cu.execute('''
create table st
(
ID int primary key not NULL,
name text not NULL,
age int not NULL,
sex char(1) not NULL
)
''')
conn.commit() #保存并提交到数据库
#向数据库增加数据
#insert into <表名> (字段1,字段2,……) valuse(值1,值2,……)
cu.execute("insert into st(ID,name,age,sex) values(1,'Peter',15,'M')")
cu.execute("insert into st(ID,name,age,sex) values(2,'Jim',16,'M')")
cu.execute("insert into st(ID,name,age,sex) values(3,'Maray',14,'W')")
cu.execute("insert into st(ID,name,age,sex) values(4,'Brent',17,'M')")
conn.commit() #提交数据
#查找
#select <输出列1>,<输出列2> form <表名> where <筛选条件>
s = cu.execute("select * from st")
for i in s:
print(i)
s = cu.execute("select name,age from st")
for i in s:
print(i)
s = cu.execute("select name,age from st where age>15")
for i in s:
print(i)
#用fetchall() 获取游标结果,返回的是列表类型
cu.execute("select name,age from st where age>=15")
print(cu.fetchall())
#删除语句
#delete from <表名> where <筛选条件>
cu.execute("delete from st where ID=1 ")
conn.commit() #更新
cu.close()
conn.close()
2. 室内环境检测系统flask代码
import sqlite3 #导入 sqlite3 数据库
import json
from flask import Flask,render_template, request
DATABASE = "./flask_class4/data/data.db" #定义数据库路径
app = Flask(__name__) #创建一个服务器实例
@app.route("/")
def hello():
db = sqlite3.connect(DATABASE) #连接数据库 data.db
cur = db.cursor() #创建游标对象
cur.execute("SELECT * FROM sensorlog WHERE sensorid =1")
#Execute方法用来执行sql语句,当sensorid=1, 从"sensorlog" 表中选取所在列
data = cur.fetchall() #查询所有数据
cur.close() #关闭游标,不自动提交保存。
db.close() #关闭数据库,不自动提交保存。
temp1 = data[len(data) - 1] #获取最新一行数据,[ID,TIME,TEMP]
temp = temp1[2] #获取温度
return render_template('vews1.html', data=data,temp=temp)
#Get data
@app.route("/get",methods=['GET']) #响应网页的 get 请求,返回实时温度
def get_data():
sensorid=int(request.args.get('id')) #获取id值
db = sqlite3.connect(DATABASE) #连接数据库 data.db
cur = db.cursor() #创建游标对象
cur.execute("SELECT * FROM sensorlog WHERE sensorid = %s"% sensorid)
#Execute方法用来执行sql语句,当sensorid=1, 从"sensorlog" 表中选取所在列
data = cur.fetchall() #查询所有数据
dbsum=len(data) #所有数据的长度
dset={'sensorid':sensorid} #字典
temp=[] #空数组
for i in range(dbsum): #在该数据长度下轮询
value={} #空的字典
value['sensorvalue']=data[i][2] #当前i值的温度
value['updatetime']=data[i][3] #当前i值的时间
temp.append(value) #在temp对象末尾创建value值
#dset['value']={'sensorvalue':data[i-1][2],'updatetime':data[i-1][3]}
dset['value']=temp #在该字典后面放入温度和时间
djson=json.dumps(dset)#把编码字典数据
return djson #返回所有数据
#Adding data
@app.route("/input",methods=['POST','GET'])
#响应终端的 post和get 请求,获取实时温度
def add_data():
if request.method == 'POST':
sensorid = int(request.form.get('id'))
sensorvalue = float(request.form.get('val'))
else:
sensorid = int(request.args.get('id'))
sensorvalue = float(request.args.get('val'))
nowtime = datetime.datetime.now()
nowtime = nowtime.strftime('%Y-%m-%d %H:%M:%S')
db = sqlite3.connect(DATABASE)
cur = db.cursor()
cur.execute("INSERT INTO sensorlog(sensorid,sensorvalue,updatetime) VALUES(%d,%f,'%s')" %(sensorid,sensorvalue,nowtime) )
mit() #事务提交,保存修改内容。
cur.execute("SELECT * FROM sensorlist where sensorid = %d"% sensorid)
rv = cur.fetchall()
cur.close()
db.close() #关闭数据库,不自动提交保存。
maxrv = rv[0][2]
minrv = rv[0][3]
if sensorvalue > maxrv or sensorvalue < minrv:
return '1'
else:
return '0'
if __name__ == "__main__":
app.run(host="0.0.0.0", port=8080,threaded=True)
#绑定 Web 服务器的 IP 和端口
3. 室内环境检测系统html代码



室内环境监测系统

室内环境监测系统


当前室内温度:`temp`


刷新历史数据列表:



温度 记录时间

{% for i in data[::-1] %}
{{i[2]}} {{i[3]}}

{% endfor %}



提交数据:/input id=1&val=255
获取数据:/get id=1

选择性必修第一册
数组
1. 创建数组
s1 = [0]*9 #间接创建(一维)
s1 = [1,2,3,4] #直接创建(一维)
s2 = [[0 for i in range(4)]for i in range(4)] #间接创建(二维)
s2 = [[0]*4]*4 #间接创建(二维),但修改某行元素时,同一列的都会被改
s2 = [[1,2,3,4],[5,6,7,8],[9,10,11,12]] #直接创建(二维)
2. 列表生成式
d1 = [i*i for i in range(10)]
print("d1=",d1)
d2 = [i*i for i in range(10) if i%2==0]
print("d2=",d2)
d3 = [m+n for m in 'ABC' for n in 'XYZ']
print("d3=",d3)
d4 = [s.lower() for s in ["ABC",'EDG','LSP']]
print("d4=",d4)
#运行结果
d1= [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
d2= [0, 4, 16, 36, 64]
d3= ['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
d4= ['abc', 'edg', 'lsp']
3. 在数组中插入数据(while循环版)
a = [1,3,5,7,9,11,13,15,17,19,0] #最后一位空出来给待插入的数
num = 6 #待插入数据
i = 0
while iif a[i]i = i + 1
else:
break
j = len(a)-1
while j > i: #循环控制向后移位
a[j] = a[j-1] #注意移动位置是从后向前移动
j = j - 1
a[i] = num
print(a)
4. 在数组中删除数据(while循环版)
a = [1,3,5,7,9,11,13,15,17,19]
num = 9 #需要删除的元素
i = 0
while iif a[i] == num:
break
i = i + 1
while ia[i] = a[i+1]
i = i+1
a[i] = 0 #末尾清空
print(a)
5. 在数组中插入数据(for循环版)
a = [1,3,5,7,9,11,13,15,17,19,0] #最后一位空出来给待插入的数
num = 6 #待插入数据
for i in range(len(a)):
if a[i] > num:
break
for j in range(len(a)-1,i,-1): #循环控制向后移位
a[j] = a[j-1] #注意移动位置是从后向前移动
a[i] = num
print(a)
6. 在数组中删除数据(for循环版)
a = [1,3,5,7,9,11,13,15,17,19]
num = 9 #需要删除的元素
for i in range(len(a)): #查找元素所在位置
if a[i] == num:
break
for j in range(i+1,len(a)):
a[i] = a[i+1]
i = i + 1
a[len(a)-1] = 0 #末尾清空
print(a)
7. 常用的列表操作
1) s.append(x) #在列表的最后追加元素x,x整体被作为单个元素追加到最后
s = [1,2,3,4]
s.append(["5",6])
#结果为[1,2,3,4,["5",6]]
2) s.insert(i,x) #在s的第i索引位置增加元素x,x整体被作为单个元素插入序列
s = [1,2,4,5]
s.insert(2,[5,6])
#结果为[1,2,[5,6],3,4]
3) s.clear() #清空列表s中的所有元素
s = [1,2,3,4]
s.clear()
#结果为[]
4) s.pop(i) #将s第i索引位置的元素删除,默认值为i值为-1,
s = [1,2,3,4,5]
s.pop()
#结果是[1,2,3,4]
5) s.remove(x) #将列表中第一次出现的x字符删除
s = [1,2,2,3,2,4]
s.remove(2)
print(s)
#结果是[1,2,3,2,4]
6) s.reverse() #将s的内容反转
s = [1,2,3,4,5]
s.reverse()
print(s)
#结果是[5,4,3,2,1]
7) s.sort() #将s的内容升序排列
s = [2,3,6,1,4,5]
s.sort()
print(s)
#结果是[1,2,3,4,5,6]
链表
1. 创建空链表
item=[] #存储空间
head=-1 #头指针
2. 单向链表元素的遍历
head = 4
item = [[5,2],[7,3],[9,5],[2,-1],[1,0],[3,1]]
p = head
str1 = ''
while p != -1:
str1 += str(item[p][0])+"->"
p = item[p][1] #切换到下一节点
print(str1[:-2]) #清除最后的"->"
#运行结果
1->5->9->3->7->2
3. 在单向链表中插入数据
head = 0
item = [[99,1],[98,2],[97,3],[95,4],[94,-1]]
num = 96 #被插入数据
p = head
while p != -1: #未到尾部
if item[p][0] < num:
if p==head:
item.append([num,p]) #插入并复制前序next值
head = len(item)-1 #更新head值
break
else:
item.append([num,item[q][1]]) #插入并复制前序next值
item[q][1] = len(item)-1 #更新前序next值
break
q = p #存储前序节点
p = item[p][1] #切换到下一节点
if p == -1: #在链表尾部插入
item.append([num,-1])
item[q][1] = len(item)-1
print(head,item)
#运行结果
num = 96 #中间插入
head=0
item=[[99, 1], [98, 2], [97, 5], [95, 4], [94, -1], [96, 3]]
num = 100 #头部插入
head = 5
item = [[99, 1], [98, 2], [97, 3], [95, 4], [94, -1], [100, 0]]
num = 93 #尾部插入
head = 0
item = [[99, 1], [98, 2], [97, 3], [95, 4], [94, 5], [93, -1]]
4. 在单向链表中删除数据
head = 0
item = [[99,1],[98,2],[97,3],[96,-1]]
num = 99 #被删除数据
p = head
while p != -1: #未到尾部
if item[p][0] == num:
if p==head:
head = item[p][1] #更新头指针位置
else:
item[q][1] = item[p][1] #更新前序节点next值
q = p #存储前序节点
p = item[p][1] #切换到下一节点
print(head,item)
#运行结果
num = 97 #删除中间
head = 0
item = [[99, 1], [98, 3], [97, 3], [96, -1]]
num = 99 #删除头部
head = 1
item = [[99, 1], [98, 2], [97, 3], [96, -1]]
num = 96 #删除尾部
head = 0
item = [[99, 1], [98, 2], [97, -1], [96, -1]]
5. 双向链表的插入
#双向链表节点格式[num, prev, next]
head = 0
item = [[99,-1,1],[98,0,2],[97,1,3],[95,2,4],[94,3,-1]]
num = 96 #被插入数据
p = head
while p != -1:
if item[p][0] < num:
if p==head:
item.append([num,-1,head]) #item.append([num,-1,p])
head = len(item)-1
item[p][1]=len(item)-1
break
else:
item.append([num,item[p][1],p])
item[item[p][1]][2] = len(item)-1 #注意先后顺序
item[p][1] = len(item)-1 #注意先后顺序
break
p = item[p][2]
if item[p][2] == -1: #判断是否为最后一个节点
if item[p][0] > num: #判断是不是在尾部插入
item.append([num,p,-1])
item[p][2] = len(item)-1
break
print(head,item)
#运行结果
num = 96 #中间插入
head = 0
item = [[99, -1, 1], [98, 0, 2], [97, 1, 5], [95, 5, 4], [94, 3, -1], [96, 2, 3]]
num = 100 #头部插入
head = 5
item = [[99, 5, 1], [98, 0, 2], [97, 1, 3], [95, 2, 4], [94, 3, -1], [100, -1, 0]]
num = 93 #尾部插入
head = 0
item = [[99, -1, 1], [98, 0, 2], [97, 1, 3], [95, 2, 4], [94, 3, 5], [93, 4, -1]]
6. 双向链表的删除
head = 0
item = [[99,-1,1],[98,0,2],[97,1,3],[95,2,4],[94,3,-1]]
num = 94 #被删除入数据
p = head
while p != -1:
if item[p][0] == num:
if p==head:
head = item[p][2] #更新头指针
item[item[p][2]][1]=-1 #更新下一跳的前向指针
else:
item[item[p][1]][2] = item[p][2]
if item[p][2] != -1:
item[item[p][2]][1] = item[p][1]
#item[item[p][2]][1] = item[p][1] #运行这句话其实并没有报错
p = item[p][2]
print(head,item)
#运行结果
num = 97 #中间删除
head = 0
item = [[99, -1, 1], [98, 0, 3], [97, 1, 3], [95, 1, 4], [94, 3, -1]]
num = 99 #头部删除
head = 1
item = [[99, -1, 1], [98, -1, 2], [97, 1, 3], [95, 2, 4], [94, 3, -1]]
num = 94 #尾部删除
head = 0
item = [[99, -1, 1], [98, 0, 2], [97, 1, 3], [95, 2, -1], [94, 3, -1]]
7. 拓展:链表类
class LinkNode: #定义单节点类
def __init__(self,data_,next_=None): #注意默认值的使用
self.data = data_
self.next = next_
class LinkList: #定义单链表类
def __init__(self): #生成实例初始化设置
self.head=None
def __str__(self): #类实例字符串格式输出设置
s = ""
cur=self.head
while cur is not None:
s+=f"{cur.data}->" #format变种,与等价"{}->".format(cur.data)
cur=cur.next
return s[:-2] #删除多余的“->”
def len(self):
num = 0
cur = self.head
while cur is not None:
num += 1
cur = cur.next
return num
def perpend(self,data_): #头插法
if self.head is None:
self.head=LinkNode(data_)
else:
self.head=LinkNode(data_,self.head)
def append(self,data_): #尾插法
if self.head is None:
self.head = LinkNode(data_)
else:
cur = self.head
while cur.next is not None:
cur = cur.next
cur.next = LinkNode(data_)
def insert(self,index,data_): #指定位置插入节点
if index<0 or index>=self.len(): #位置不存在
self.append(data_) #用尾插法插入
else:
cur = self.head
while index>1:
cur = cur.next
index -= 1
cur.next = LinkNode(data_,cur.next)
def pop(self,index=-1): #指定位置删除
if index<0 or index>=self.len(): #越界则默认删除最后一个
index = self.len()
if index == 0:
self.head = self.head.next
else:
cur = self.head
while index>2:
cur = cur.next
index -= 1
print(cur.data)
cur.next = cur.next.next
a = LinkList()
for i in range(5):
a.perpend(i)
b = LinkList()
for i in range(5):
b.append(i)
print(a,b)
a.insert(1,10)
print(a)
a.pop(10)
print(a)
字符串
1. 字符串特性
1) 字符串有限序列性:
字符串是一种线性表结构,它的元素个数是有限的。字符串中的每个元素都可以用正负两种索引获取。
2) 字符串可比性:
当字符串中的字符来自同一字符集(以ASCII为例)时,可以按照码值进行比较。
比较规则是从左至右,依次比较两个字符串中对应位置上的字符码值。
2. 字符串基本操作
1) 字符串连接
s = "Hello" + ' ' + "World"
#运行结果:s = "Hello World"
2) 字符串复制
s = "ha"*3
#运行结果:s = "hahaha"
3) 子串(存在性)判断
print("hel" in "hello")
#运行结果:True
4) 字符串切片 s[首:尾:步长] 含头不含尾
s = "千山鸟飞绝,万径人踪灭"
print(s[:-5:-2])
#运行结果: 灭人
5) len(s)求字符串长度
s = "Hello World"
print(len(s))
#运行结果:11
6) s.find(y)
#返回字串在字符串中首次出现的位置(数值类型),若找不到返回-1
num = "hello".find("ell")
print(num)
#运行结果:1
7) s.split(sep[,num])
#根据sep分割字符串s,num指定切分个数,生成结果为列表类型,sep参数默认为空格
s = "1,2,3,4,5,6"
s1 = s.split(',')
s2 = s.split(',',3)
print(s1)
print(s2)
#运行结果:
['1', '2', '3', '4', '5', '6']
['1', '2', '3', '4,5,6']
8) s.replace(old,new[,max])
#将字符串s中的old用new替换掉,max定义最大替换次数
s = "is is is is"
s1 = s.replace("is","was")
s2 = s.replace("is","was",3)
print(s1,s2)
#运行结果: was was was was was was was is
9) 大小写转换
#s.upper() 全部小写转大写
#s.lower() 全部大写转小写
s = "abcDEF"
s1=s.upper()
s2=s.lower()
print(s1,s2)
#运行结果: ABCDEF abcdef
10) s.count(sub) #统计sub在字符串s中出现的次数
s = "is is is is"
print(s.count('is ')) #注意空格
#运行结果:3
11) iter.join(s) #用iter对s做分隔
s = '12345'
s1 = ','.join(s)
print(s1)
#运行结果:1,2,3,4,5
12) s.strip(iter) #删除首尾的iter字符,iter默认为空格
s = " a b c d e"
s1=s.strip()
print(s1)
x = "_a b c d e"
s2=s.strip("_")
print(s2)
#运行结果:a b c d e a b c d e
3.
同课章节目录