![大数据测试技术数据采集、分析与测试实践PPT完整全套教学课件_第1页](http://file4.renrendoc.com/view/1e212ffcae4c7a51c0c61abdf90c62a8/1e212ffcae4c7a51c0c61abdf90c62a81.gif)
![大数据测试技术数据采集、分析与测试实践PPT完整全套教学课件_第2页](http://file4.renrendoc.com/view/1e212ffcae4c7a51c0c61abdf90c62a8/1e212ffcae4c7a51c0c61abdf90c62a82.gif)
![大数据测试技术数据采集、分析与测试实践PPT完整全套教学课件_第3页](http://file4.renrendoc.com/view/1e212ffcae4c7a51c0c61abdf90c62a8/1e212ffcae4c7a51c0c61abdf90c62a83.gif)
![大数据测试技术数据采集、分析与测试实践PPT完整全套教学课件_第4页](http://file4.renrendoc.com/view/1e212ffcae4c7a51c0c61abdf90c62a8/1e212ffcae4c7a51c0c61abdf90c62a84.gif)
![大数据测试技术数据采集、分析与测试实践PPT完整全套教学课件_第5页](http://file4.renrendoc.com/view/1e212ffcae4c7a51c0c61abdf90c62a8/1e212ffcae4c7a51c0c61abdf90c62a85.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第一章:大数据测试的思维第1章:大数据测试的思维.pptx第2章:大数据收集概述.pptx第3章:网络数据的采集与分析.pptx第4章:数据格式转换及Python编程.pptx第5章:Splunk软件初探.pptx第6章:Splunk平台实践.pptx第7章:SPL案例编程.pptx第8章:数据导入及错误分析.pptx第9章:联网效率分析.pptx第10章:Linux部署.pptx第11章:大数据测试实践.pptx全套PPT课件内容大数据背后的规律传统软件测试方法大数据测试方法大数据测试思维大数据背后的规律数据背后是否存在规律?大数据背后的故事数据背后是否存在规律今天我们面临着海量的数据膨胀1018个字节(2003年)1021个字节(2013年)8*1021个字节(2015年)估计44ZB个字节(2020年)淘宝网推出了“时光机”---“个人网购日志”购买记录、浏览点击次数、收货地址数据当作一种重要的战略资源对数据进行简单的查询和分类统计,得出一些规律,但往往这些规律并不存在当数据规模达到一定数量时,原来的“经验”就变得不一定准确基于大数据分析之后,AlphaGo曾下出了人类长期以来认为是亏损的棋路大数据的背后(案例1)全球零售业巨头沃尔玛在对消费者购物行为分析时发现,男性顾客在购买婴儿尿片时,常常会顺便搭配几瓶啤酒来犒劳自己,于是尝试推出了将啤酒和尿片摆在一起的促销手段,没想到这个举措居然使尿片和啤酒的销量都大幅增加了。如果转换一种思路来理解这种现象,考虑“奶爸”在世界杯期间既想看足球比赛,又要带自己的孩子,为了不耽误他们观看完整的足球比赛,他们会将孩子放在边上,任由他们玩耍,而自己喝啤酒庆祝球队的胜利,因此,他们需要购买尿片来帮助他们的小宝宝隔尿,同时不影响自己喝啤酒庆祝球队的胜利。大数据的背后(案例2)另一个经典的例子就是Google预测流感案例。2009年2月,国际权威期刊Nature上刊登了一篇名为Detectinginfluenzaepidemicsusingsearchenginequerydata的文章,论述了Google基于用户的搜索日志(包括搜索关键词、用户搜索频率以及用户IP地址等信息),成功“预测”了流感病人的就诊人数。Google是如何做到的呢?原来美国有个疾控中心,它统计了美国本土各个地区的疾病就诊人数,一般会延迟两周公布数据。而Google利用其搜索引擎搭建了一个预测平台,提前获取疾控中心的大数据,并对这些数据进行回归分析,从而成功地预测了复杂的流感规模问题。大数据的背后(案例3)在国内,杭州市首次利用大数据治理交通阻塞问题。2016年10月,杭州市政府联合阿里云公布了一项计划:建立杭州市的数据大脑。城市大脑的内核将采用阿里云ET人工智能技术,对整个城市进行全局实时分析,自动调配公共资源,修正城市运行中的问题,并最终进化成为治理城市的超级人工智能。“缓解交通阻塞”是城市大脑的首个尝试,并已经在萧山区的中心路段投入使用,部分路段车辆通行速度提升了11%。大数据与软件测试能否将大数据的处理方法运用到实际的软件测试中,以便发现软件中的缺陷呢?如果能够获得海量的用户使用软件的数据,再利用大数据处理技术对这些数据进行分析,就能从中发现致使软件执行失效的小概率事件,从而发现软件缺陷,这种测试方法称为大数据测试方法。传统的软件测试方法在瀑布式软件开发流程中的4个测试阶段传统的软件测试方法传统软件测试方法的特点需要测试人员来设计测试用例测试用例的总数是小样本的传统软件开发的生命周期是从需求分析开始,到软件产品发布截止大数据测试方法但随着时代的发展,软件并非是在发布之后就停止更新,往往会在很短的时间内继续推出新的版本,如部分品牌的手机操作系统已经实现了一月甚至一周一更新。从长时间看,软件处于一个长期迭代的过程,可以在每一次软件开发和修改时采用传统软件测试技术进行测试,而在软件的某一版本发布之后实施大数据测试。大数据测试方法大数据测试的阶段和特点大数据测试方法包括:用户使用、数据收集、大数据分析及软件缺陷挖掘4个阶段。特点:不需要测试人员设计测试用例。大数据测试方法需要收集海量的用户使用数据,这相当于海量用户对软件进行测试。不需要传统的测试过程来发现软件错误。借助大数据分析的方法来实现软件错误的挖掘。思考:1)如何收集海量用户使用数据?2)如何对海量数据进行挖掘,以便发现软件bug呢?大数据的测试思维大数据测试思想的核心是通过分析海量用户的使用数据来发现传统软件测试阶段不易检测出来的软件缺陷,而不是单纯地从技术角度出发设计测试用例探测软件缺陷。大数据测试方法并不能替代传统的软件测试方法,即使探测出软件缺陷之后,仍需要软件测试人员采用传统的软件测试方法设计测试用例,进而发现软件错误的位置并修复它们。小结本章重点:理解大数据测试的过程及相关阶段。第二章:大数据收集概述内容目的案例介绍原理及方法环境配置数据采集同步操作小结目的介绍如何利用手机、360随身Wi-Fi和Wireshark软件抓取手机APP进行网络传输时的数据包,如何利用TotalControl工具来实现PC端对手机的控制,最终实现对手机APP软件联网的数据收集。案例介绍在使用手机APP时,用户常常会遇到一种情况,在某个地方(如便利店中)使用手机微信收发信息是正常的,但此时使用另外一款APP可能提示网络并不可用。在一天当中,电脑连接的网络是固定的,而手机网络则随着手机持有者所在的位置不同而不同,总是在不同基站之间、不同的Wi-Fi之间或者是基站网络与Wi-Fi网络之间切换。在这种状况下,手机APP必须对网络切换适应性能进行必要的优化,保证在网络切换过程中手机APP的可用性。案例分析探测某款手机APP在网络切换时的可用性是一件非常难的事情,首先,测试环境是千差万别的;其次,即使是同一环境、同一地点,不同时间也可能会存在网络的不稳定。因此,单纯地在某一个地点进行一次或多次测试难以探测手机APP在网络切换时的可用性,必须对大量的手机APP连接网络的数据进行分析才能探测手机APP在网络切换时的可用性问题。原理及方法原理:采用360随身Wi-Fi将手机与电脑进行网络连接,随后通过Wireshark软件来抓取手机APP进行网络传输时的数据包。方法:360随身Wi-Fi利用电脑的网络来创建无线热点采用Wireshark软件抓取并显示网络封包的详细信息采用TotalControl实现电脑对手机的控制环境配置配置无线网以Windows10系统为例,右击【此电脑】图标,选择【属性】命令,打开【系统】窗口,在左侧窗格中选择【设备管理器】,打开【设备管理器】窗口,选择【网络适配器】选项,找到无线网卡环境配置Windows10操作系统中,有时需要对无线网卡的驱动进行降级,但Windows7操作系统中可以跳过这步。右单击【Intel(R)Wireless-N7260】选项,选择【更新驱动程序】命令,在打开的对话框中选择【浏览我的计算机以查找驱动程序软件】选项,再在打开的对话框中选择【让我从计算机上的可用驱动程序列表中选取】选项,单击【下一步】按钮后,在打开的窗口中选择一个先前的版本进行驱动降级
环境配置将360随身Wi-Fi插入电脑的USB接口,下载并安装360随身Wi-Fi驱动打开【网络和共享中心】窗口安装分析软件从官网下载Wireshark软件的安装包,依据电脑操作系统的类型选择相应的安装包,通过【系统】窗口可查看操作系统的类型Wireshark安装双击安装文件,打开安装界面,如图2.5所示,单击【Next】按钮出现许可页面,单击【IAgree】按钮,在打开的对话框中选择需要安装的内容,随后依次单击【Next】按钮完成Wireshark软件的安装。
数据采集打开Wireshark软件,如图2.6所示。找到360随身Wi-Fi提供的网络(本例中是本地连接*6),右边对应了一条波浪线,显示了Wireshark软件获取了360随身Wi-Fi网络中手机APP进行网络处理的数据包。信息显示单击Wireshark软件工具栏中的按钮,或者双击360随身Wi-Fi的网络选项【本地连接*6】,可以显示Wireshark软件监视到的各种数据数据包的存储操作手机APP,使之产生网络传输数据。单击Wireshark软件的【文件】菜单,选择【导出分组解析结果】命令,可以将数据保存为纯文本、CSV或C语言数组等常见格式。同步操作打开TotalControl网站,如图2.10所示同步操作单击网站右下方的【立即下载】按钮,下载TotalControl软件,得到安装文件。双击TotalControl的安装文件,进入安装向导对话框。
同步操作运行TotalControl软件,若手机已经采用USB线与电脑连接,则TotalControl软件会在电脑屏幕上模拟一个手机屏幕,否则会出现同步操作连接成功后的画面小结数据收集是大数据测试的基础,可以通过不同的方式来进行数据收集。大体上这些方式可以分为主动式和被动式。目前多数企业采用的是被动式收集方式,即需要用户填写一些相关材料等。本章演示了如何采用Wireshark软件来获取手机APP软件访问网络的数据,重点介绍了采用360随身Wi-Fi与电脑连接时的环境设置及Wireshark软件进行数据收集时的常规做法。第三章:网络数据的采集与分析内容物理连接常用操作数据包的采集数据包的自动抓取数据包分析小结物理连接将手机、360随身Wi-Fi、电脑进行连接Wireshark软件的打开方式1)在电脑桌面找到并双击【Wireshark】图标2)在Windows10操作系统的【开始】菜单右侧的【Cortana】文本框中输入Wireshark后按【Enter】键3)在【开始】菜单中找到并单击Wireshark应用选项自由切换中英文界面左键单击编辑菜单【Edit】,找中属性子菜单【Preference…】,出现下图构建网络右击电脑桌面的【网络连接】图标,打开【网络和共享中心】窗口,如图所示。上面的是本地网络下面的是360随身Wi-Fi构建的网络其网络名称是WLAN注意:每一次用360随身Wi-Fi构建的网络名称都会变化Wireshark软件功能介绍双击360随身Wi-Fi构建的网络WLAN,进入Wireshark捕获的数据窗口数据包的采集TotalControl软件打开TotalControl软件,将手机操作同步到电脑端,显示效果如图所示。TotalControl软件双击Wireshark中的360随身WIFI网络,开始捕获网络中的数据包,如图所示TotalControl软件移动鼠标,打开手机上的同花顺APP,点击该APP中的【自选】菜单,产生同花顺访问网络的数据。随后,Wireshark就能获取同花顺访问网络的所有数据流量包,如图所示。TotalControl软件持续操作同花顺APP,不断地产生新的数据包被Wireshark软件捕获。在操作过程中,同花顺突然出现了网络请求超时错误,这次网络访问失效同样被Wireshark捕获,如图所示。数据的存储和打开单击Wireshark软件操作界面工具栏中的
按钮,停止网络数据包的收集,如图所示。数据的存储和打开单击【File】菜单,选择【Saveas】命令,如图所示。数据的存储和打开随后将数据包另存为appnetdata.pcapng文件,如图所示。数据的存储和打开双击pcap文件路径,可打开该文件。数据包的自动抓取为了大量获取这些数据包,手动开启\关闭WLAN的方式是不适合的,需要编写脚本实现批量数据包的获取。在电脑端打开TotalControl软件,选择连接手机,出现两个窗口,其中左边的一个窗口是手机的界面,右边窗口是TotalControl的主操作界面,如图所示。
脚本录制单击工具栏中的【脚本操作】按钮,在其下方会出现一排功能按钮,如图所示。脚本录制单击录制按钮,出现脚本录制窗口,如图所示;
脚本录制在【脚本名称】文本框中输入“WIFI”,在【脚本描述】文本框中输入“在TotalControl中录制脚本”,单击【确定】按钮,出现录制过程界面,如图所示。
脚本录制在手机端找到【设置】选项,关闭【无线网络】功能,TotalControl录制相关的脚本,如图所示。
脚本录制在手机端开启【无线网络】功能,相隔若干时间后重复这两个操作,再单击TotalControl操作窗口顶部的按钮,停止脚本录制,出现新窗口如图所示。脚本录制在图中可以看到一个脚本文件“WIFI.js”,选中这个文件,单击【脚本管理】按钮,弹出【脚本管理】窗口,如图所示。脚本录制在【脚本管理器】窗口的左侧窗口的【名称】列表框中选中【WIFI.js】文件,可以在右侧窗格看到脚本的具体内容。在脚本的最后增加如下代码,该行的目的是实现操作延时,可让手机连接WLAN和手机APP进行网络连接的时间是10秒。device.delay(10000);单击【保存】按钮,再单击按钮关闭窗口。脚本执行在TotalControl软件的主界面单击执行按钮,窗口将显示脚本执行次数,如图所示。脚本执行修改脚本的执行次数为10次,单击【确定】按钮,自动执行脚本,如图3.24所示。脚本执行在脚本自动执行过程中,TotalControl软件会依据脚本再次操作手机,通过Wireshark软件可自动获得网络访问数据包。数据包分析利用手机端的同花顺APP进行网络访问时,在网络进行切换,或者由不可用网络到可用网络时,如何通过数据分析探测手机同花顺APP连通网络的速度?通过在手机端开关无线网络,可获取手机在网络连通时的时间t1,随后再获取同花顺APP连通网络的时间t2,利用t2-t1即可以知道这款APP访问网络的时间延时。但是如何判断一款手机APP访问网络的性能呢?答案是采用同类型的APP作对比,就可以获得一款手机APP访问网络的性能。数据获取采用Wireshark软件来捕获手机网络中的数据包,同时打开手机端的同花顺APP,获取相关的网络访问数据,如图所示。数据获取在手机端关闭WLAN,此时Wireshark软件获得网络中的数据包在减缓,如图所示。数据获取随后,再次打开手机端WLAN,Wireshark软件捕获的网络数据包在增加,如图所示。数据获取接着,单击同花顺APP中的【自选】按钮,可以看到同花顺APP正在连接网络服务器,如图所示数据获取当该APP连通网络后,Wireshark软件捕获了更多的网络数据包,如图所示。数据获取重复上述过程,此时同花顺APP会自动连接网络,传输数据包。通过周期性地打开和关闭手机端的WLAN,利用Wireshark抓取同花顺APP产生的数据包获取大量的数据样本,即可统计和分析同花顺APP的网络访问时间。最后停止Wireshark软件的数据抓取,保存网络访问数据。数据包的大小在Wireshark软主界面双击打开已保存的数据包文件,在Wireshark主界面底部的状态栏中可以查看到数据包的大小是2212个,如图所示。数据分析由于Wireshark软件抓取的是网卡上的数据,因此需要从中过滤出同花顺APP产生的网络数据。需要从数据包中分析出两类数据,一类是手机连通WLAN的数据;另一类是同花顺APP连通服务器的数据。数据分析在【应用显示过滤器】文本框中输入icmpv6.type==135,如图所示,按【Enter】键,即可获取手机连通网络的数据包。数据分析获取同花顺APP连接服务器的数据相对而言要难一些,由于同花顺APP连接服务器采用了Socket协议,且【自选】股票的数据是由服务器端向手机端推送(push)的,因此可以在数据包列表中找到推送数据包(在Wireshark软件的数据包列表中缩写是PSH),在详细信息窗口可以看到相关的信息,其中连接的目的端口是9528,如图所示。数据分析下面需要将端口是9528的数据包找出来,右击数据组信息中的【DestinatienPort:952】(目的端口:9528)代码行,选择【ApplyasFilter】→【Selected】命令,如图所示。数据分析在【Info】栏中选择SYN数据,再在数据包的详细信息中右击带有【SYN】标识的行,选择【ApplyasFilter】→【…andSelected】命令,如图所示。数据分析获得相关数据包,如图所示。数据分析再次增加手机寻址的过滤条件,最后构造的复合过滤条件是“icmpv6.type==135or(tcp.dstport==9528andtcp.flags.syn==1)”,其结果显示在图中,选出的有用数据包为10组。数据分析观察这10组数据包,协议【Protocol】为icmpv6表示开启手机中的WLAN网络,协议【Protocol】为TCP,【Info】栏中有[SYN]标识,表示服务器端推送数据到手机同花顺APP上。数据分析本次实验总共进行了3次开关WLAN的操作,产生了3次服务器端向同花顺APP传输数据包的操作。右击协议Protocol为ICMPV6的数据包,弹出菜单,选择【Set/UnsetTimeReference】命令,如图所示。数据分析时间信息会显示在图所示的窗口中手机3次WLAN连接的时间分别为6.881769、6.247836和5.808334。数据分析再选中【Info】栏中包含【SYN】标识的数据包,执行上述操作,获得服务器端向同花顺APP推送数据包的时间,结果如图所示。小结介绍了Wireshark软件获取手机同花顺APP访问网络的数据、编写Wireshark的代码实现数据的约简以及批量网络数据采集的方法。本章重点运用网络知识来分析APP的联网访问数据;依据分析结果来编写相关的Wireshark代码,最终过滤出有效的数据包;再从这些数据包中查看手机联网时间及APP联网时间之差,获取APP联网的效率。第四章:数据格式转换及Python编程内容原理及方法基础概念Python安装及配置Python基础学习Notepad环境Python编程实践Python面向对象Python的集成开发环境pcapng文件到CSV文件小结原理及方法通过Wireshark软件导出手机APP访问网络的数据包(格式为*.pcapng),然后在Python中编程,将*.pcapng文件转换为CSV格式的文件。为了实现这个目的,首先需要下载安装pyshark软件安装包,以便于Python对pcapng文件的处理;还需要下载安装VisualC++2015BuildTools,因为pyshark软件安装包需要调用这个工具。pyshark介绍pyshark能从网络接口中进行数据嗅探,或者对存储的pcap文件进行分析和处理,在pyshark的官方主页文档内容如下。pyshark介绍1)使用LiveCapture或者FileCapture方法建立Capture对象后,在捕获(capture)和数据包(packet)层面就会有多个方法和属性可用。利用PyShark可以调用tshark内建的所有数据包解码器。2)获取数据包摘要的代码如下。3)按层深入获取数据包属性如下所述。pyshark介绍pyshark介绍4)遍历数据包,对每个数据包使用给定函数处理如下。FileCapture和LiveCapturepyshark中通常使用FileCapture和LiveCapture模块进行数据包分析FileCapture模块从一个存储的捕获文件中导入数据包;LiveCapture模块将使用本机的网络接口进行嗅探。这两个模块的具体应用详见本书的35-37页。Python基础语法在Python中,所有标识符可以包括英文、数字以及下划线(_),但不能以数字开头。Python中的标识符是区分大小写的。以下划线开头的标识符是有特殊意义的,以单下划线开头,代表不能直接访问的类属性,需通过类提供的接口进行访问,不能用fromxxximport*导入;以双下划线开头,代表类的私有成员;以双下划线开头和结尾,是Python里特殊方法专用的标识。Python可以同一行显示多条语句,但需用分号;分开。Python的代码块不使用大括号{}来控制类、函数以及其他逻辑判断,而是采用缩进来区分模块。缩进的空格数量是可变的,但是同一代码块中的语句必须包含相同的缩进空格数量,这个必须严格执行。Python安装及配置打开Python安装网址,选择【Downloads】→【Windows】命令,在打开的界面中选中并下载Python3.6.2。双击下载完成的文件Python3.6.2.exe,按照提示逐步安装。配置在Windows系统的【开始】菜单中选择【运行】命令,在文本框中输入cmd,启动命令行窗口,输入python后按【Enter】键,或者在python的安装目录中运行python.exe文件,显示如图所示。如果没有出现,则是环境变量出了问题。配置设置环境变量的方法是:打开【系统属性】对话框,选中【高级】选项卡,如图所示;配置单击【环境变量】按钮,打开【环境变量】对话框,如图所示;配置将安装好的目录加入Path列表框中,如“C:\User\Python\Python36-32
;”。如果是Windows10操作系统,则不需要增加最后的“;”;如果是其他Windows操作系统,则必须要加上“;”。配置好后,则可以在命令窗口中输入python,显示Python的版本信息。
注意:如果安装了多个版本的Python,则需要为它们分别配置环境变量,同时更改相应python.exe为python2.exe和python3.exe。pyshark包下载在Python官网主页的顶部单击PyPI(PythonPackageIndex,Python包索引)超链接,在页面右上角的【搜索】栏中输入“Pyshark”查找这个包,找到pyshark包并下载(该包的作用是让Python能够解析Wireshark文件),下载过程如图所示。pyshark包安装为了安装pyshark包,进入网站/KimiNewt/pyshark,找到下方的【Installation】选项栏,如图所示。pyshark包安装由安装文件可以看出,安装方式有两种,其一是采用如下命令。pipinstallpyshark其二是从git的库中安装,从网址/KimiNewt/pyshark.git中获取pyshark.git,再执行命令,示例代码如下:cdpyshark/srcpythonsetup.pyinstall然后,在命令行窗口中输入命令quit(),退出Python。再采用cd命令进入pipinstallpyshark,如果不能安装,则采用python-mpipinstallpyshark来代替安装。安装支撑文件如果用户没有安装VisualC++2015BuildTools,则还需要先安装这个工具。打开网址/visual-cpp-build-tools,下载并安装VisualC++2015BuildTools,安装界面如图所示。安装支撑文件最终PyShark安装成功后会出现提示信息Finishedprocessingdependenciesforpyshark==,如图所示。Python基础学习Python的命令行演示创建并运行.py文件Python出错演示Python注释一行多语句输出换行缩进Python帮助Python的命令行演示打开命令行窗口,输入Python,即可显示版本信息。输入print(“Hello,world!”)后按【Enter】键(注意:Python3版本与Python2版本不同,Python2版本无须括号),命令行窗口中会输出“Hello,world!”,如图所示。创建并运行.py文件在Windows操作系统桌面新建一个test.txt文件,将“print(“Hello,world!”)”代码行复制进去,再更改这个文件的后缀名为.py。在命令行窗口中输入quit()退出Python环境,采用cd命令进入桌面目录,如cd
C:\Users\用户名\Desktop,再输入Pythontest.py,运行这个文件,即可在命令行窗口中显示“Hello,world!”。Python出错演示采用记事本打开文件test.py,在尾部添加如下代码。ifTrue:print("Question")print("True")else:print("Answer")print("False")#未对齐的位置这段代码会出现什么样的错误提示呢?Python出错演示代码并没有严格遵循缩进格式,因此在命令行窗口中输入pythontest.py后按【Enter】键,会显示错误信息“IndentationError:unindentdoesnotmatchanyouterindentationlevel”,如图所示。Python注释在test.py文件头部添加注释格式如“#文件名:test.py”,在文件尾部增加多行注释的代码。Python中的多行注释采用了3个单引号(''')或3个双引号(""")。例如:'''这是多行注释;注释内容1;注释内容2;'''"""这同样是多行注释;注释内容。"""一行多语句Python可以在同一行中使用多条语句,语句之间使用分号(;)分隔。例如:importsys;x='runoob';sys.stdout.write(x+'\n')输出结果是什么?运行test.py程序,将在命令行窗口中输出runoob。输出换行Python3中的print命默认输出是换行的,如果要实现不换行,需要改变语句print('contents',end='!@#$%^&*')中的默认换行属性。其中end就表示print将如何结束,默认为end="\n"(换行)。例如:x="a"y="b"#换行输出print(x)print(y)print('---------')#不换行输出print(x,end='')print(y)缩进缩进空格数目相同的一组语句构成一个代码块,也称为代码组。像if、while、def和class这样的复合语句,首行以关键字开始,以冒号(:)结束,该行之后的一行或多行代码即构成代码组,而首行及后面的代码组称为一个子句(clause)。Python帮助在命令行窗口中输入python版本号–h,后按【Enter】键,将显示相应版本python各参数的帮助信息,如图所示。Notepad环境Notepad++软件运行设置多个变量赋值Python的标准数据类型删除Python语言的运算符Python条件语句Notepad++软件在命令行窗口中编写程序是不方便的,为此可以使用Notepad++软件来编写Python代码。上网下载Notepad++软件并安装,Notepad的开发环境如图所示。运行设置为了能够在Notepad中运行Python程序,需要对Notepad进行设置,具体步骤如下所述。步骤1:启动Notepad++,选择【运行】命令。运行设置步骤2:弹出【运行】对话框,在文本框中输入“cmd/kpython”$(FULL_CURRENT_PATH)“&PAUSE&EXIT”,单击【保存】按钮。运行设置如果安装了多个Python版本,python.exe需改为python3.exe,即输入“cmd/kpython3"$(FULL_CURRENT_PATH)"&PAUSE&EXIT”。运行设置步骤3:弹出【Shertcut】对话框,在【Name】文本框中输入“runpython”作为名称,选择快捷键为【Ctrl+Shift+0】,单击【OK】按钮。运行设置步骤4:返回Notepad主界面直接按【F5】键或者选择【run】→【runpython】命令,即可直接调试Python程序,运行结果如图所示。多个变量赋值Python允许同时为多个变量赋值。例如如下语句,功能即创建一个整型对象,值为8,三个变量被分配到相同的内存空间上。a=b=c=8为创建两个整型对象1和2分配给变量a和b,字符串对象
“Mike”分配给变量c,则a,b,c=1,2,"Mike"Python的标准数据类型Python有5个标准的数据类型,分别为Numbers(数字)、String(字符串)、List(列表)、Tuple(元组)、Dictionary(字典)。【数字】类型,用于存储数值,是不可改变的数据类型,改变【数字】类型,Python会分配一个新的对象。(1)Python的字符串是由数字、字母、下划线组成的一串字符。Python的字串列表有两种取值顺序,其一从左到右索引默认从0开始,最大范围是字符串长度减1。例如,对于s=mypython,则s[0]的结果是字符m。
其二从右到左索引默认从-1开始,最大范围是字符串开头字符的
位置。例如,对于s=lovepython,则s[-1]的结果是字符n。Python的标准数据类型要实现从字符串中获取一段子字符串,可以使用的语句格式为“变量[头下标:尾下标]”,其中头下标是从0开始算起,可以是正数或负数;头下标
可以为空,表示取到头或尾。
在Notepad中编写如下代码,按【F5】键运行,显示结果如图所示。str='HelloWorld!'print(str) #输出完整字符串print(str[0]) #输出字符串中的第一个字符print(str[2:5]) #输出字符串中第三个至第五个之间的字符串print(str[2:]) #输出从第三个字符开始的字符串print(str*2) #输出字符串两次print(str+"TEST") #输出连接的字符串(2)Python元组用()标识,内部元素用逗号隔开。但是元组不能二次赋值,相当于只读列表。tuple=('runoob',786,2.23,'john',70.2)tinytuple=(123,'john')print(tuple) #输出完整元组print(tuple[0]) #输出元组的第一个元素print(tuple[1:3]) #输出第二个至第三个的元素
print(tuple[2:]) #输出从第三个开始至列表末尾的所有元素print(tinytuple*2) #输出元组两次print(tuple+tinytuple) #打印组合的元组(3)元组是不允许更新的,列表是允许更新的。在Notepad中输入如下代码,运行代码将显示错误信息:“‘tuple’objectdoesnotsupportitemassignment”,输出结果如图所示。tuple=('runoob',786,2.23,'john',70.2)list=['runoob',786,2.23,'john',70.2]tuple[2]=1000 #元组中是非法应用list[2]=1000 #列表中是合法应用(4)Python字典(dictionary)是一种灵活的内置数据结构类型,列表是有序的对象集合,字典是无序的对象集合。两者之间的区别在于,字典当中的元素是通过键来存取的,而不是通过偏移存取。字典用{}标识,由索引(key)和它对应的值value组成。例如在Notepad中输入如下代码,按【F5】键运行:dict={} #定义字典dictdict['one']="Thisisone" #字典中one的值dict[2]="Thisistwo" #字典中2的值tinydict={'name':'john','code':6734,'dept':'sales'}#定义字典print(dict['one']) #输出键为'one'的值print(dict[2]) #输出键为2的值print(tinydict) #输出完整的字典print(tinydict.keys()) #输出所有键print(tinydict.values()) #输出所有值(5)Python数据类型转换。Python支持不同数据类型的转换。删除采用del语句可以删除单个或多个对象的引用,语句格式如下。delvardelvar_a,var_bPython语言的运算符Python的一些通常运算符与其他语言是类似的,如有需要可以参考其他语言。本小节仅仅介绍Python的一些特殊运算符,具体如下。(1)幂运算**:返回x的y次幂,例如如下示例,输出结果是16。a=2;b=4#2的4次方a**4Python语言的运算符(2)取整除//-:返回商的整数部分,例如如下示例,输出结果是4.0。9.0//2.0(3)Python逻辑运算符①xandy:布尔与,如果x为False,返回False;否则返回y的计算值。②xory:布尔或,如果x是非0,它返回x的值;否则返回y的计算值。③notx:布尔非,如果x为True,返回False;否则返回True。Python语言的运算符(4)Python成员运算符ainlist:a在序列list中找到值返回True,否则返回False。anotinlist:a在序列list中没有找到值返回True,否则返回False。(5)Python身份运算符xisy:如果x和y引用的是同一个对象,则返回True;否则返回Falsexisnoty:如果x和y引用的不是同一个对象,则返回结果True;否则返回False。is与==区别在于,is用于判断两个变量引用对象是否为同一个,==用于判断引用变量的值是否相等。例如在Notepad中输入如下代码,运行程序,输出分别是True、True、False、True。a=[1,2,3]b=aprint(bisa)#Trueprint(b==a)#Trueb=a[:]print(bisa)#Falseprint(b==a)#TruePython中会为每个出现的对象分配内存,哪怕它们的值完全相等(注意,是相等,不是相同)。如执行a=2.0、b=2.0这两个语句,会先后为2.0这个两Float类型对象分配内存,然后将a与b分别指向这两个对象,所以a与b指向的不是同一对象,代码如下。a=2.0b=2.0print(aisb) #结果为Falseprint(a==b) #结果为True为了提高内存利用效率,对于一些简单的对象,如一些数值较小的int对象,Python采取重用对象内存的办法,如指向a=2、b=2时,由于2作为简单的int类型且数值小,Python不会两次为其分配内存,而是只分配一次,然后将a与b同时指向已分配的对象,示例代码如下。a=2b=2print(aisb) #结果为Trueprint(a==b) #结果为True但如果赋的值不是2,而是大的数值,情况就跟前面的一样了,示例代码如下。a=6666b=6666print(aisb) #结果为Falseprint(a==b) #结果为True变量写在同一行,将会指向同一个对象,如:a=6666;b=6666; #写在同一行print(a==b) #结果为True但是,写在Notepad中时,不管是否同一行,都是指向同一个地址。Python条件语句if判断条件:
执行语句…else:
执行语句…其中,python复合布尔表达式计算采用短路规则,即如果通过前面的部分已经计算出整个表达式的值,则后面的部分不再计算。Python条件语句例如如下代码将正常执行,不会报除零错误。a=0b=1if(a>0)and(b/a>2):#a>0不满足,则b/a>2不会执行,因此不会产生除零错误print("yes“)else:print("no“)Python编程实践汉诺塔问题奇偶数分离Python中in的应用循环使用else语句编程汉诺塔问题汉诺塔问题是一个经典的问题。汉诺塔(HanoiTower)又称河内塔,源于印度一个古老传说。大梵天创造世界的时候做了3根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,任何时候,在小圆盘上面都不能放大圆盘,且在3根柱子之间一次只能移动一个圆盘。问应该如何操作?请在Notepad中编写如下Python代码即可解决问题。#一个简单的条件语句实现汉诺塔问题defmove(n,a,b,c): #定义一个函数moveifn==1:print(a,'-->',c)else:move(n-1,a,c,b) #将前n-1个盘子从a移动到b上
move(1,a,b,c) #将最底下的最后一个盘子从a移动到c上
move(n-1,b,a,c) #将b上的n-1个盘子移动到c上
move(3,'A','B','C')运行结果:奇偶数分离给出一个数列12,37,5,42,8,3,要求数列中的偶数进入even数列,奇数进入odd数列。#奇偶数进入不同的数列list=[12,37,5,42,8,3]even=[]odd=[]while(len(list)>0):number=list.pop()if(number%2==0):even.append(number)else:odd.append(number)print(even)print(odd)Python中in的应用编写如下代码,体验Python中in的应用。forletterin'Python': #第一个实例print('当前字母:',letter)fruits=['banana','apple','mango']forfruitinfruits: #第二个实例print('当前水果:',fruit)print("Goodbye!") #注意对齐方式循环使用else语句编程在Python中,在for…else中,for中的语句和普通语句没有区别,else中的语句会在循环正常执行完(即for语句不是通过break跳出而中断的)的情况下执行,while…else也是一样。循环使用else语句编程在10~20之间找到所有质数,同时对非质数写出某两个数的乘积,如12=2*6。在Notepad++中编写如下代码即可实现。fornuminrange(10,20): #迭代10~20之间的数字foriinrange(2,num): #根据因子迭代ifnum%i==0: #确定第一个因子j=num/i #计算第二个因子print('%d=%d*%d'%(num,i,j)) #此处与C语言不同break #跳出当前循环else: #循环的else部分print(num,'是一个质数')Python面向对象面向对象介绍self代表类的对象类的实例化Python内置类属性Python对象的销毁(垃圾回收)类的继承方法重写运算符重载类属性与方法面向对象介绍Python是一门面向对象的语言,在Python中能很容易地创建一个类和对象。实例化:创建一个类的实例、类的具体对象。方法:类中定义的函数。对象:通过类定义的数据结构对象。对象包括两个数据成员(类变量和实例变量)和方法。类(Class):用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中,且在函数体之外。类变量通常不作为实例变量使用。实例变量:定义在方法中的变量只作用于当前对象的类。数据成员:类变量或者实例变量用于处理类及其实例对象的相关数据。继承:一个派生类(derivedclass)继承基类(baseclass)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如这样一个设计,一个Dog类型的对象派生自Animal类,这模拟了“是一个(is-a)”关系。方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法重写。创建一个员工类classEmployee:#采用:作为一个范围'所有员工的基类'empCount=0
def__init__(self,name,salary):#初始化函数=nameself.salary=salaryEmployee.empCount+=1defdisplayCount(self):#员工总数print("TotalEmployee%d"%Employee.empCount)defdisplayEmployee(self):print("Name:",,",Salary:",self.salary)empCount变量是一个类变量,它的值将在这个类的所有对象之间共享,可以在内部类或外部类使用Employee.empCount访问。方法__init__()称为类的构造函数或初始化方法。当创建了这个类的对象时就会调用该方法。self代表类的对象,self在定义类的方法时是必须有的,虽然在调用时不必传入相应的参数。self代表类的对象self类的方法与普通的函数相比只有一个特别之处,即它们必须有一个额外的第一个参数名称,按照惯例它的名称是self。classTest:defprt(self):print(self)print(self.__class__)
t=Test()t.prt()类的实例化其他编程语言中一般用关键字new对类进行实例化,但是在Python中并没有这个关键字,类的实例化类似于函数的调用。以下使用类的名称Employee来进行实例化操作,并通过__init__方法接收参数。(1)创建Employee类的第一个对象,代码如下。emp1=Employee("Zara",2000)#self可以不用输入(2)创建Employee类的第二个对象,代码如下。emp2=Employee("Manni",5000)(3)使用点(.)来访问对象的属性,例如使用如下类的名称访问类变量。emp1.displayEmployee()emp2.displayEmployee()print("TotalEmployee%d"%Employee.empCount)(4)使用以下函数方式来访问属性。getattr(obj,name[,default]):访问对象的属性。hasattr(obj,name):检查是否存在一个属性。setattr(obj,name,value):设置一个属性。如果属性不存在,会创建一个新属性。delattr(obj,name):删除一个属性。Python内置类属性__dict__:类的属性,包含一个字典,由类的数据属性组成。__doc__:类的文档字符串。__name__:类的名称。__module__:类定义所在的模块(类的全名是__main__.className,如果类位于一个导入模块mymod中,那么className.__module__等于mymod)。__bases__:类的所有父类构成元素,包含了一个由所有父类组成的元组。Python对象的销毁(垃圾回收)Python使用了引用计数这一简单技术来跟踪和回收垃圾,在其内部记录着所有使用中的对象各有多少引用。一个内部跟踪变量称为一个引用计数器,当对象被创建时,就创建了一个引用计数器。当这个对象不再需要时,也就是说这个对象的引用计数变为0时,它被垃圾回收。但是回收不是“立即”的,而是由解释器在适当的时机将垃圾对象占用的内存空间回收。Python对象的销毁(垃圾回收)示例代码如下。a=40 #创建对象<40>b=a #增加引用<40>的计数c=[b] #增加引用<40>的计数dela #减少引用<40>的计数b=100 #减少引用<40>的计数c[0]=-1 #减少引用<40>的计数Python对象的销毁(垃圾回收)垃圾回收机制不仅针对引用计数为0的对象,同样也可以处理循环引用的情况。循环引用指的是两个对象相互引用,但是没有其他变量引用它们。Python的垃圾收集器实际上是一个引用计数器和一个循环垃圾收集器。作为引用计数的补充,垃圾收集器也会留心被分配的总量很大及未通过引用计数销毁的的对象。在这种情况下,解释器会暂停,试图清理所有未引用的循环。例3:析构函数__del__在对象被销毁的时候被调用,当对象不再被使用时,运行__del__方法,示例代码如下。classPoint:def__init__(self,x=0,y=0):self.x=xself.y=ydef__del__(self):class_name=self.__class__.__name__print(class_name,"销毁")
pt1=Point()pt2=pt1pt3=pt1print(id(pt1),id(pt2),id(pt3))#打印对象的iddelpt1delpt2delpt3类的继承面向对象的编程带来的主要好处之一是代码的重用。实现这种重用的方法之一是继承机制。需要注意的是,继承语法“class派生类名(基类名)://…”中的基类名写在括号里,基类是在类定义的时候在元组之中指明的。classParent:#定义父类parentAttr=100def__init__(self):print("调用父类构造函数")defparentMethod(self):print('调用父类方法')defsetAttr(self,attr):Parent.parentAttr=attrdefgetAttr(self):print("父类属性:",Parent.parentAttr)
classChild(Parent): #定义子类def__init__(self):print("调用子类构造方法")defchildMethod(self):print('调用子类方法')c=Child() #实例化子类c.childMethod() #调用子类的方法c.parentMethod() #调用父类方法c.setAttr(200) #再次调用父类的方法,设置属性值c.getAttr() #再次调用父类的方法,获取属性值可以使用issubclass()或者isinstance()方法来检测。
issubclass():布尔函数,判断一个类是否是另一个类的子类或者子孙类,语法为issubclass(sub,sup)。isinstance(obj,class):布尔函数,如果obj是class类的对象或者是一个class子类的对象,则返回True。方法重写如果父类的方法不能满足需求,可以在子类中重写父类的方法,示例代码如下。classParent: #定义父类defmyMethod(self):print('调用父类方法')classChild(Parent): #定义子类defmyMethod(self):print('调用子类方法')c=Child() #子类实例c.myMethod() #子类调用重写方法运算符重载Python同样支持运算符重载,示例代码如下。classVector:def__init__(self,a,b):self.a=aself.b=bdef__str__(self):return'Vector(%d,%d)'%(self.a,self.b)def__add__(self,other):returnVector(self.a+other.a,self.b-other.b)
v1=Vector(3,8)v2=Vector(5,-2)print(v1+v2)上述代码在执行print(v1+v2)时重新加载了__add__(self,other)函数,因此输出的结果是“Vector(8,10)”。类属性与方法1.类的私有属性_
_private_attrs:以两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用时为self._
_private_attrs。2.类的方法在类的内部,使用def关键字可以为类定义一个方法。与一般函数的定义不同,类方法必须包含参数self,且为第一个参数。3.类的私有方法_
_private_method:以两个下划线开头,声明该方法为私有方法,不能在类的外部调用,在类的内部可调用self._
_private_methods。Python不允许实例化的类访问私有变量,但可以使用“object._className__attrName”语句访问属性。单下划线、双下划线、头尾双下划线的含义说明如下。__foo__:定义的是特列方法,类似
__init__()
之类的方法。_foo:以单下划线开头的是protected类型的变量,即保护类型,只允许其本身与子类进行访问,不能用于frommoduleimport*。__foo:双下划线的是私有(private)类型的变量,只允许这个类本身进行访问。Python的集成开发环境PyCharm软件Jupyter软件PyCharm软件PyCharm2017专业版是一款PythonIDE,带有一套可以帮助用户在使用Python语言开发程序时提高效率的工具,比如调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试及版本控制等工具。PyCharm的开发环境打开网址/pycharm/,单击主页中的【DownloadNow】按钮,进入PyCharm下载页面,如图4.29所示。PyCharm的开发环境选择下载Windows版本,双击打开下载的文件,打开安装向导,如图所示,在安装过程中选择创建64位的桌面快捷键,创建.py文件的关联,其他选择默认安装。
运行PyCharm软件,主界面如图所示。选择【CreateNewProject】选项,在打开的窗口中输入项目名、路径,如图所示。为了添加Python的解析器,单击Interpreter下拉列表框右边的按钮,选择【AddLocal】命令,打开选择Python解析器窗口,如图所示。在【开始】菜单中找到并右击已安装好的Python3.6主程序,选择【属性】命令,打开【属性】窗口,复制目标输入框中的内容,如图所示,粘贴到Python解析器窗口中,然后单击【OK】按钮。新建文件右击项目Test,选择【New】→【PythonFile】命令,如图所示,新建一个HelloWorld.py文件,在其中输入代码print("HelloWorld")。设置控制台运行之前,工具栏中的【运行】和【调试】按钮都是灰色的,不可触发,这是因为控制台需要被提前设置。单击【运行】按钮旁边的倒三角按钮,选择命令,进入【Run/DebugConfigurations】配置界面。单击加号图标,新建一个配置项,并选择Python,如图所示。将Python文件命名为Hello,选择【Script】选项,找到新建的HelloWorld.py文件。单击【OK】按钮,自动返回编辑界面,这时候【运行】和【调试】按钮即可全部点亮,如图所示。单击【运行】按钮,查看输出的结果,如图所示。调试与运行在代码的前面、行号的后面右击,就可以设置断点,如图所示。单击甲虫图标,进行断点调试,如图所示。单击【调试】按钮,会执行到第一个断点,显示该断点之前的变量信息(蓝色条块标记),如图所示。单击【StepOver】按钮或者按【F8】键,到达下一个断点,如图所示。对于断点的其他操作和功能,把鼠标指针移到相应的按钮上便可以看到。Jupyter软件Jupyter软件介绍Jupyter的开发环境运行Jupyter新建文件修改文档单元格常用快捷键历史输入和输出变量Jupyter的外部功能创建目录导航导入和导出文件图形编程Jupyter软件介绍JupyterNotebook是一款集编程和写作于一体的效率工具,支持运行40多种编程语言。Jupyter脱胎于IPython项目,随着项目发展壮大,已经不仅仅局限于Python这一种编程语言。Jupyter的名字就很好地释义了这一发展过程,它是Julia、Python及R语言的组合,而且现在支持的语言也远超这3种。这款软件具有如下优点。极其适合数据分析:在命令行窗口中运行程序时,可视化结果显示在另一个窗口中,包含函数和类的脚本存在其他文档中,同时程序员还需另外写一份说明文档来解释程序如何执行以及结果如何。JupyterNotebook能够将所有内容收归一处。支持多语言:只要安装相对应的核,JupyterNotebook就同时支持R语言(做数据分析)和学术界常用的Matlab和Mathematica等。分享便捷:支持以网页的形式分享,GitHub支持Notebook展示,也可以通过nbviewer分享文档,当然也支持导出成HTML、Markdown、PDF等多种格式的文档。远程运行:在任何地点都可以通过网络连接远程服务器来实现运行。交互式展现:不仅可以输出图片、视频、数学公式,甚至可以通过交互插件(Interactivewidgets)来支持三维模型,呈现一些互动的可视化内容,比如可以缩放的地图或者可以旋转的三维模型。Jupyter的开发环境在Jupyter官网上提出了两种Jupyter的安装建议,其中强烈推荐的是安装Anaconda,因为其已经包含了JupyterNotebook、Python和其他常用于科学计算及数据分析的软件包。安装JupyterNotebook的步骤:打开网址https://www.continuum.io/downloads,下载与Python相应的Anaconda,如图所示。下载后,按照提示一步步安装,记住选中与Python相关联。运行Jupyter在【开始】菜单中找到【Anaconda3】级联菜单,再执行【JupyterNotebook】命令来运行软件,出现图所示的窗口。打开JupyterNotebook后是一个页面,【Files】选项卡中是本地的文件夹。新建文件单击页面右上角的【New】按钮,选择【Python3】选项,即可新建一个Python3程序,如图所示。JupyterNotebook是支持Tab键自动补充单词的,如在输入pr之后按【Tab】键,则会出现以pr开头的词列表,如图4.45所示。修改文档修改名称:JupyterNotebook提供了两种方法修改文档名称,一种是单击【Untitled】按钮;二是选择【File】→【Rename】命令。导出文档:选择【File】→【Downloadas】命令,如图所示,或按【Ctrl+S】组合,可以保存文档,默认保存的文件名为ipynb,保存在软件主目录下。单元格选择一个空的单元格,在【Code】下拉列表中选择【Heading】,会出现一个不同类型的单元格。改变单元格类型时弹出的消息中有解释,后面那个单元格以#号标记开头,意味着这是一个一级标题,如图所示。如果需要子标题,可以使用以下标记表示,标题的显示效果如图所示。常用
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《13洁净的水域》说课稿-2023-2024学年科学六年级下册苏教版
- Unit 2 Months of a Year Lesson Three(说课稿)-2024-2025学年重大版英语六年级上册
- Unit 6 Chores Lesson 4 Let's spell(说课稿)-2024-2025学年人教新起点版英语五年级上册001
- 2025水泥砖销售合同范文
- 2024年七年级数学下册 第10章 一元一次不等式和一元一次不等式组10.4一元一次不等式的应用说课稿(新版)冀教版
- 中型臭氧设备购买合同范例
- 8 安全地玩(说课稿)-部编版道德与法治二年级下册
- 农业设备供货合同范例
- 冷库设备购销合同范例
- 个人借还款合同范例
- 2025年中国山泉水市场前景预测及投资规划研究报告
- GB/T 18109-2024冻鱼
- 2025年八省联考数学试题(原卷版)
- 重庆市2025届高三第一次联合诊断检测英语试卷(含解析含听力原文无音频)
- 《榜样9》观后感心得体会二
- 天津市部分区2024-2025学年九年级(上)期末物理试卷(含答案)
- 一氧化碳中毒培训
- 初二上册好的数学试卷
- 保洁服务质量与服务意识的培训
- 突发公共卫生事件卫生应急
- 《景观设计》课件
评论
0/150
提交评论