Python工程应用-网络信息安全PPT完整全套教学课件_第1页
Python工程应用-网络信息安全PPT完整全套教学课件_第2页
Python工程应用-网络信息安全PPT完整全套教学课件_第3页
Python工程应用-网络信息安全PPT完整全套教学课件_第4页
Python工程应用-网络信息安全PPT完整全套教学课件_第5页
已阅读5页,还剩599页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

chap.1概述网络信息安全全套可编辑PPT课件网络信息安全概述Python语言简介

Python安全编程本章内容要点1.1网络信息安全概述

1.信息安全定义信息安全是指计算机信息系统的硬件、软件、网络及其系统中的数据受到保护,不受偶然的或者恶意的原因而遭到破坏、更改、泄露,系统连续可靠正常地运行,确保信息服务不中断。所谓网络信息安全就是信息安全的一个子集或是专门话题,泛指围绕着与通信/计算机网络相关的信息安全问题展开的防护行为。网络信息安全绝非一个单纯、简单的问题,遍布于网络空间的各个部位,各个层面侧重不同。通常,将网络空间领域可划分为物理域、信息域、认知域和社会域,从网络空间安全的角度来看,物理域和信息域主要关注以信息技术为核心的网络基础设施安全及网络信息通信安全,而认知域和社会域则更关注以人为核心的认知文化等精神层面以及个人与集体相互作用的社会层面。因此,要确保网络信息安全,就必须顾及到以上所有层面的安全,这显然是一个复杂的系统工程。2.信息安全特征要理解网络信息安全,必须了解信息的基本安全特征。信息安全一般应具备五个特征(机密性、完整性、可用性、可控性、不可否认性(可审查性)),具体如图1-1所示。当信息及网络信息系统同时满足以上五个特征的安全要求,就可以认为是它们是安全的。信息安全特征的状态并不是一成不变的,而是随着安全对抗双方的此消彼长不断发生转化3.安全理论技术

网络信息安全理论所涉及的领域知识非常宽泛。宏观上讲,只要是与信息安全相关的技术都属于这个范畴,除了数学、通信、计算机等自然科学外,还涉及法律、心理学等社会科学。这些科学指导下的技术是达成网络安全的主要手段,具体来讲,在常见的信息系统中,可以采用的信息安全技术主要包括:密码技术、身份验证、访问控制、审计追踪、安全协议等。所谓信息安全程序设计技术就是基于计算机语言实现特定安全功能的编程活动。目前,几乎绝大多数编程语言均可以不同程度实现面向安全目的的开发,实现效果也不尽相同,1.3.2节将结合Python语言的特点介绍其安全编程实现的思路。由于网络信息安全技术是一个开放的话题,随着科学技术的不断发展,还有更多、更丰富的技术加入进来,不断形成“物理”(技术组合)和“化学”(交叉产生新质技术)变化,衍生出更新的技术。1.2Python语言简介1.2.1Python发展回顾

Python语言诞生于20世纪90年代初,目前已被广泛应用计算机程序设计的各个领域之中。Python的创始人是荷兰人吉多·范罗苏姆(GuidovanRossum)。早在1989年,Guido在阿姆斯特丹,为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,并作为ABC语言的一种继承。这种编程语言之所以选中Python(大蟒蛇的意思)作为名字,主要是取自于Guido所喜爱的英国20世纪70年代首播的电视喜剧《蒙提.派森的飞行马戏团》(MontyPython'sFlyingCircus)的剧名。

Python在发展初期并未引起人们的注意,甚至到了Python2于2000年10月16日发布时,也没有引起人们的热捧。但是,自从2004年以后这一情况开始发生逆转。当Python3于2008年12月3日发布时,Python迅速得到普及,并于2011年1月正式被TIOBE编程语言排行榜评为2010年度语言。正如本书开篇所述,到了2020年10月,经过29年的发展,Python首次超过了Java,成为全球第二受欢迎的编程语言,距离首位的C语言也仅仅只相差4个百分点。这也是Tiobe指数近20年的历史上,首次出现Java和C语言不是两大顶级语言的情况。显而易见,现在Python已经步入最受欢迎的程序设计语言的行列。Python语言的成功源于其简洁性、易读性以及可扩展性。尤其是,在国外用Python做科学计算的研究机构日益增多,一些知名大学已经采用Python来教授程序设计课程,使其得以快速普及开来。此外,越来越多的开源科学计算软件包,都提供了Python的调用接口,例如:著名的计算机视觉库OpenCV、三维可视化库VTK、医学图像处理库ITK等等,这也加速了Python的普及。目前基于Python专用的科学计算扩展库则更是不胜枚举,其中包括十分经典的科学计算扩展库:NumPy、SciPy和matplotlib等,均可为Python提供了快速数组处理、数值运算以及绘图功能。

Python编程的前景也被认为是十分广阔的,Python语言及其众多的扩展库所构成的开发生态,十分适合工程技术、科研人员处理实验数据、制作图表,甚至开发科学计算应用程序。1.2.2Python工作原理

1.Python工作过程

Python是一种解释型语言,依赖解释器工作。解释器工作于程序代码与计算机硬件之间的软件逻辑层。Python解释器的工作模式如图1-2所示。由图1-2可知,当写好Python代码后,将其导入Python解释器后,将会执行两个步骤:第一步:把源代码编译成字节码编译后的字节码是特定于Python的一种表现形式,它不是二进制的机器码,需要进一步编译才能被机器执行,这也是Python代码无法运行的像C/C++一样快的原因。如果Python进程在机器上拥有写入权限,那么它将把程序的字节码保存为一个以.pyc为扩展名的文件,如果Python无法在机器上写入字节码,那么字节码将会在内存中生成并在程序结束时自动丢弃。在构建程序的时候,若给Python赋予计算机的写权限,这样只要源代码没有改变,生成的.pyc文件就可以重复利用,从而提高执行效率。第二步:把编译好的字节码转发到PVM中置于运行时状态

PVM是PythonVirtualMachine的简称,它是Python的运行引擎,因此是Python系统的一部分,它迭代运行上步编译形成的字节码指令,是一个大循环、一个接一个地完成字节码操作。在Python中PVM的概念与解释器通常不做区分,并有多种备选项。基于上述这种工作机制,就不难理解Python之所以能够体现出的简单、便捷特性。2.Python解释器实现方式

Python解释器实现不止一种,常用的有:CPython、AnacondaPython、Jython、IronPython和PyPy等。

(1)CPythonCPython是一种标准实现,是由C语言编写的,它是大多数Linux和MacOS机器预装的Python解释器,也是所有Python解释器中运行较快、最完整、最健全的。

(2)AnacondaPythonAnaconda源自Anaconda公司设计(原名为ContinuumAnalytics),其设计目标在于服务那些需要由商业供应商提供支持且具备企业支持服务的Python开发者。AnacondaPython的主要用例包括:数学、统计学、工程、数据分析、机器学习以及其他相关应用。

(3)JythonJython是一种Python语言的替代实现方式,其目的是为了与Java编程语言集成,Jython包含了Java类,这些类编译Python源代码、形成Java字节码,并将得到的字节码映射到Java虚拟机(JVM)上。因为Jython要比CPython慢而且也不够健壮,它往往看作是一个主要面向寻找Java代码前端脚本语言的Java开发者的工具。(4)IronPythonIronPython设计的目的是让Python程序可以与Windows平台上的.NET框架以及与之对应的Linux的上开源的Mono编写成的应用集成。

(5)PyPyPyPy属于CPython解释器的替代品,其利用即时(JIT)编译以加速Python程序的执行。根据实际执行的任务情况,其性能提升可能非常显著。PyPyJIT将Python代码编译为机器语言,从而带来平均7.7倍于CPython的运行速度。在某些特定任务中,其提速效果能够达到50倍。PyPy一般更适用于处理“纯”Python应用程序。由于PyPy会模拟CPython的原生二进制接口,因此在处理包含C库接口的Python软件包时,其表现并不理想。本书主要采用的是Cpython和AnacondaPython解释器(安装详见2.1.2节)1.2.3Python特点分析

Python作为工程实践的语言,选择使用之前需要了解其优缺点。1.Python的优点Python的优点包括以下几个方面。

(1)简单:Python遵循“简单、优雅、明确”的设计哲学,并且各个版本能够始终如一的秉承这一传统。

(2)高级:Python是一种高级语言,相对于C语言牺牲了性能而提升了编程人员的效率。它使得程序员可以不用关注底层细节,把精力全部放在编程上。

(3)面向对象:Python既支持面向过程,也支持面向对象。

(4)可扩展:Python可以通过C、C++语言为python编写扩充模块。(5)免费和开源:Python是FLOSS(自由/开放源码软件)之一,允许自由的发布软件的备份、阅读和修改其源代码、将其一部分自由地用于新的自由软件中。

(6)边编译边执行:Python是解释型语言,支持边编译边执行。

(7)可移植:Python能运行在不同的平台上。

(8)丰富的库:Python拥有许多功能丰富的库,尤其是众多的第三方库。

(9)可嵌入性:Python可以嵌入到C、C++等多种其它语言中,为其提供脚本功能。2.Python的缺点

Python的缺点是必须正视的问题,要充分考虑设计的需求趋利避害,具体包括如下方面。

(1)速度慢:Python程序比Java、C、C++等程序的运行效率都要慢。

(2)源代码加密困难:不像编译型语言的源程序会被编译成目标程序,Python直接运行源程序,因此对源代码加密比较困难。

(3)不支持底层操作:进行计算机底层操作的支持能力有限,需要借助于其它语言或第三方库(Ctypes等)。

Python的缺点也是其设计者力求改进的重要方向,相信在未来会有很大程度的改进。3.Python安全编程优势

综合评判Python,不难发现这种语言的优缺点都很明显,但是其在安全编程的优势还是被广泛接受的,究其原因可以概括为以下几个方面:

(1)综合能力良好网络安全本身就是一项综合、复杂体系性工作,涉及到几乎信息可达的所有位置,因此想要对信息安全进行全面实现,就需要一种综合性强的语言,而Python因其能够整合不同的工具而被喻为“胶水语言”,且包装能力、可组合性、可嵌入性都很好,可以把各种复杂性包装在Python模块里,完全匹配这种需求。进一步,由于在Python内部采用虚拟环境技术,对开发项目进行了沙箱隔离,也排除了相同软件不同版本冲突的困扰,工具综合的考虑也更加全面。

(2)数据分析优势显著

Python对于密集型的信息安全数据处理大有裨益。Python在数据分析和交互、探索性计算以及数据可视化等方面都显得比较活跃,这就是Python作为数据分析的原因之一,Python拥有numpy、matplotlib、scikit-learn、pandas、ipython等工具在科学计算方面十分有优势,尤其是pandas,在处理中型数据方面可以说是无与伦比的,已经成为数据分析中流砥柱的分析工具。(3)智能计算能力突出面对未来信息安全涌现的新问题,诸如:认证识别的模式匹配、入侵检测的特征分析、自动化漏洞挖掘的规则推理、图像文本数据的语义理解等核心问题,已经不是单纯依靠一门语言就可以解决的问题了,都需要智能技术的支持。展望智能技术的发展未来,根据李开复博士提出的“AI红利三段论”,认为未来的智能必将是“大众智能”,并预测95%甚至更多的AI技术人员,都将是不具有非常专业编程能力的AI工程师、应用工程师和AI工具用户。正因为如此,Python所秉承的“做到简单而严谨、易用而专业”宗旨,完全迎合了这种发展趋势。目前,人们已经可以清晰地看出Python作为智能技术天选之子的未来。因此,信息安全选择Python语言,倒不如说是信息安全对未来智能时代的拥抱。其实,Python在很早以前就已经被黑客所青睐。很多知名的黑客工具、入侵系统框架都是由Python开发的,比如:Metasploit、Fuzzing框架Sulley、交互式数据包处理程序Scapy等,基于这些框架黑客还可以很容易地扩展出自己的工具。之所以安全人员开始选择Python,就好像战场上的战士丢掉自己手中尚好的武器,而捡起敌人丢弃的武器,就是对敌人“武器”最好的肯定。1.3Python安全编程1.3.1安全应用程序分类

在进行安全编程之前,需要明确安全应用的分类。按照信息安全特征,目前常见的安全应用程序可以5划分五类。(1)机密性应用,包括:密码应用(加密)、数字水印(阈下通信应用),这种应用有时处于安全体系的最内核,因此需要较高的操作权限。

(2)完整性应用,包括:密码应用(数字签名、哈希)、数字水印(易碎型),由于这种应用会将数据暴露于开放环境,因此并不需要内核级权限。

(3)可用性应用,包括:网络扫描、渗透测试、防病毒、主机安全管理,对于确保系统核心可用性的应用,需要内核权限。

(4)不可抵赖性应用,包括:密码应用(数字签名)、网络实体识别与认证、网络安全取证、区块链,除了对核心数据的保护外,不必需内核权限。

(5)可控性应用,包括:入侵检测、防火墙、网闸、漏洞挖掘、内容安全,对于底层的保护需要内核权限。上述分类之间并不严格独立,存在交叉、联合。1.3.2Python安全编程思路

Python安全编程涉及信息安全的信息域、认知域和社会域,图1-3是现有安全技术在计算机网络系统分布的示意图,包括了:密码技术、认证与识别、VPN、数字水印、区块链、网络扫描与流量分析、防火墙、入侵检测、漏洞挖掘、主机安全、安全审计与取证、内容安全、渗透测试等多项,Python可以直接或间接地实现其中的绝大部分。在Windows平台上,这些安全应用的Python开发可以分别采用如下方法。1.密码技术密码是信息安全系统最内核的保护。由于Python在数据操作方面简洁明快,且并不失强大,所以几乎所有的密码算法都可以在Python中的以实现。无论是古典密码算法,还是基于现代数学难题的公钥密码,都有Python实现方案,常见的DES、RSA、哈希方法实现如下。

(1)利用pyDes模块可以提供DES加密等。

(2)利用Crypto.PublicKey.RSA和RSA模块提供生成公钥、私钥和RSA加密的功能。

(3)利用Hashlib模块可以提供常用的摘要算法如MD5、SHA1等。密码应用开发本书将在第三章进行介绍。由于Python是一种解释型语言,因此运行效率较差,虽然可以实现密码应用,但是必须对工程工作的实时性要求进行评估(如流密码)。并且,如果实现内核层加密,还需要借助于扩展和嵌入方法。2.区块链

区块链是近些年来兴起的新的信息模型和网络交易系统技术,具有可以改变人类社会结构的巨大潜力。Python可以实现从区块、挖矿、钱包、通信到网站等所有区块链需求,开发方法如下。

(1)利用hashlib模块的SHA256实现工作量证明和挖矿。

(2)利用json和hashlib模块实现交易与区块的记录。

(3)利用rpc模块实现网络通信和节点功能。本书将在第四章进行介绍。3.数字水印版权保护是信息隐藏技术中的水印技术所试图解决的一个重要问题,这与密码学是一个完全不同的范畴。水印总体可以分为空间域和变换域的算法,Python通过第三方的工具库可以实现LSB、DCT、DWT等图像变换处理,渐次实现水印保护,典型应用开发如下。

(1)利用CV2模块进行LSB位平面数据替换。

(2)利用CV2、numpy模块实现DCT算法嵌入水印。

(3)利用CV2、Pywt、numpy模块实现DWT算法嵌入水印。本书将在第五章进行介绍。4.识别与认证

Python可以实现密码学的许多功能,包括公钥密码的实现,因此也兼具继承了密码认证的能力。此外,随着就Python生物特征识别的工具库的兴起,Python人脸识别和声纹识别(或说话人识别)类的技术也经常得到应用,典型应用开发如下。

(1)利用Hashlib、random模块实现挑战响应口令认证。

(2)利用Dlib的FaceRecognition模块实现基于人脸的识别认证。

(3)利用Librosa、sidekit等语音特征分析模块实现说话人识别认证。本书将在第六章进行介绍。5.主机安全主机系统是网络中信息和信息处理最为集中的部分,也是黑客攻击的重点之一。Python可以实现主机运维、恶意软件分析、漏洞发现与挖掘。

(1)主机运维可以采用Psutil库、Popen、PIPE、pywin32、paramiko、fabric与pexpect库,等对主机运行状态进行监控,然后通过分析发现异常,进而执行主机的安全隔离、告警、处置等。

(2)Python支持采用静态分析、动态分析两种手段对恶意软件进行分析,静态分析利用PEfile、IDA、clamAV等工具在软件未运行的状态下,分析程序是否存在恶意特征,动态分析利用Volatility开源内存取证框架、Windbg工具、Olldbg工具、以及沙箱对得到运行的软件进行恶意行为分析。

(3)漏洞挖掘发现系统或协议的漏洞,确保保护对象的可用性。Windows平台上很多工具都提供对软件的动静态调试,进而实现漏洞挖掘的Fuzzing和代码逆向跟踪,典型挖掘包括:采用PyEmu对恶意软件进行分析、采用ImmuityDebugger的Python脚本辅助PoC编写和二进制文件逆向、采用IDAPython插件的Python脚本进行自定义软件分析、采用PyDbg的x86指令仿真器Python脚本实现Fuzzing测试器等。本书将在第七章进行介绍。6.网络安全网络连接主机,也是黑客攻击的重点。为了实现网络的安全防护,可以采用网络嗅探、网络扫描、防火墙、入侵检测手段。Python本身自带socket模块,可以实现TCP和UDP网络交互,并且在第三方库的支持下也可以实现网络数据包的构造,因此支持主机活动性、端口和漏洞的扫描,典型应用开发思路如下。

(1)利用pylibpcap、pycapy、pypcap、impacket、scapy等库对网络中的数据实施嗅探。

(2)采用socket原始套接字模式或scapy构造ICMP数据包可以实现ICMP扫射主机扫描;采用socket流套接字或数据报套接字实现TCP全连接以及UDP的端口扫描,socket原始套接字模式或scapy实现半连接端口扫描;基于已知漏洞模板,采用json和requests模块实现目标主机的网络漏洞扫描。

(3)Python由于工作的权限级别太低,无法直接完成涉及防火墙的内核操作,但可以通过修改已有的防7火墙的配置表实现防火墙的功能,如:修改iptables实现Linux防火墙操作。

(4)与防火墙类似,可以通过修改已有的入侵检测系统(snort、pytbull等)的配置表实现入侵检测的功能,由于入侵检测系统更加侧重于数据分析,因此机器学习的方法非常适合于对入侵行为的分析,可以采用sklearn、Tensorflow等工具实施深度入侵分析。上述防病毒、防火墙、主机管控、网闸等方面的网络安全软件,需要内核级操作权限,因此对于扩展对象要求很高,目前这类成熟的Python开发平台还不多见。现有少量的Python在这些应用方面,更多发挥的是提高操作效率的作用。本书将在第八章进行介绍。7.内容安全内容安全能够屏蔽违规文本、图片、音频、视频等传播色情、低俗内容等不良信息(亦可用于舆情监控)。内容安全一般可以分为:文本、语音、图像的内容安全。由于Python可以实现良好的自然语言处理功能,因此可以对基于自然语言的文本数据进行过滤,实现内容安全(如果经过语音文本转换,这种技术也可以对语音数据内容实施过滤),开发方法如下。

(1)基于NLTK工具包,进行自然语言分析。

(2)基于Gensim工具包从文档中自励提取语义。

(3)基于Jieba实现中文分词工具和词性标注。

(4)联合keras、librosa、scipy、sklearn、sounddevice、tensorflow实现语音文字的转换。图像语义理解方面,Python内容安全也取得了很多进展,但目前还不十分成熟,本书将在第九章进行介绍。8.其它

Python是黑客所推崇的编程语言,在网络攻击方面具有极好的先天基因。当前日渐兴起的渗透测试技术,在技术本质上与黑客攻击完全一致,因此基于Python的渗透测试也是其应用的一个重要方向。当前大多数渗透测试工具都提供Python脚本功能,尤其是,形成多种工具铰链的全渗透系统,典型应用开发如下。

(1)利用Requests、urlib2模块实施Web渗透测试。

(2)采用Python脚本操作Metasploit渗透测试自动框架,生成EXP和shellcode。

(3)采用Pywin32+WMI方式实施Windows提权。这部分内容,读者可以参考其他参考书。

Python安全应用的开发不能限制于上述基本思路,可以根据手头工具功能,进行灵活模仿实现。1.3.3Python安全开发趋势Python安全开发极具前景,尤其是Python在大数据和深度学习方面的优势是非常显著的,因此在未来基于Python的安全应用开发发展方向,其一是对安全应用的数据密集型计算进行形式化描述,采用大数据和深度学习的方法提升防护能力;此外,还可利用Python的模块整合和跨平台的特性,形成集成、综合的安全解决方案。

Python语言及开发工具,总体而言表现出数据逻辑处理能力强、底层操作弱的特点。即使如此,目前基于Python的安全应用开发热潮依然兴起,这与当前设备自动化、智能化程度越来越高不无关系。作为一种先天就具备智能基因的语言,Python的安全潜力尚待全面挖掘。由于Python工作层面过高,因此对于计算机内核或底层的对象不能直接操作(如:防火墙、病毒查杀、主机管控),需要借助于其它的工具或渠道。在这些工具没有成熟之前,利用Python实现是不现实的。总之,Python在安全编程方面的潜力是十分巨大的。本书后续章节,将围绕上述安全的典型案例编程展开介绍。信息安全是信息系统无法回避的问题。人们总是期望花费尽量少的代价去完成更可靠的安全功能。Python为这种想法提供了有力的支持。然而,Python不是万能的,但也基本涉及到绝大多数安全应用领域,尤其是在数字计算、智能处理、第三方库方面优势明显。思考题1.信息安全的定义和特征是什么?2.简述Python的工作过程。3.Python在信息安全编程中具有那些优势?4.简述Python安全应用设计的主要思路。chap.2Python语言基础知识网络信息安全本章内容要点Python开发环境构建数据类型与变量控制语句函数模块文件操作异常处理面向对象编程正则表达式张量计算1.Python的下载和安装在Python的官方网站/downloads/下载Python安装包2.1Python开发环境构建2.Python开发环境的配置假设Python系统安装在“C:\Python\”目录下。在Window操作系统下,右击桌面上“计算机”图标→选择“属性”菜单项→选择“高级系统设置”项→选择“高级”选项卡→单击“环境变量”按钮,→选择“系统变量”的“Path”变量,双击该项,→在弹出的“编辑系统变量”对话框中其变量值填写Python的安装路径,本例其变量值为:“C:\Python\”。3.Python在线帮助文档python帮助文档在python安装目录的doc文件夹下,双击即可打开。Python定义了6组标准数据类型:Number(数字)String(字符串)List(列表)Tuple(元组)Sets(集合)Dictionary(字典)2.2数据类型与变量1.数字类型数字类型包括整数(int)、浮点数(float)、复数(complex)、布尔值(bool)类型。Python的数据类型在使用时,不需要先声明,可以直接使用。例如:

x=13x为整数r=3.14r为浮点数a=3+4ja为复数【课堂练习】编写实践参数赋值。2.字符串

用单引号、双引号括起来的字符序列称为字符串。例如:

‘abc’,‘123’,“Hello”,“你好”都是字符串。字符串的几个常用函数和方法:(1)str()函数str()函数可以将数字、列表、元组等转换成字符串。

例如:输出用单引号括起来的字符>>>str(1+2)

‘3’#为什么不是1+2?>>>str([1,2,3,4])‘1,2,3,4’【课堂练习】

(2)find()方法find()方法可以查找字符子串在原字符串中首次出现的位置,如果没有找到,则返回-1。例如:

>>>s=“ABCDE12345” >>>s.find(“CD”)

2【课堂练习】

(3)

lower()方法

lower()方法可以将字符串中的大写字母转换为小写字母。例如:

>>>s=“ABCDE12345”

>>>s1=s.lower() >>>s1

abcde12345【课堂练习】

(4)

split()方法

split()方法按指定的分隔符将字符串拆分成多个字符子串,返回值为列表。例如:

>>>s=‘AB,CD,123,xyz’

>>>s.split(sep=’,’)

[‘AB’,’CD’,’123’,’xyz’]【课堂练习】

(5)

strip()方法strip()方法用于删除字符串头尾指定的字符(默认为空格)。例如:

>>>str="*****thisisstringexample....wow!!!*****"

>>>print(str.strip('*'))thisisstringexample....wow!!!【课堂练习】3.转义符str=‘Python语言入门很简单。\n明白了吗?’列表定义与列表元素1.列表的定义

列表名=[元素0,元素1,……,元素n]说明:(1) 列表名的命名规则跟变量名一样,不能用数字开头。(2) 方括号中的元素之间用逗号分隔。(3) 当列表增加或删除元素时,内存空间自动扩展或收缩。(4) 列表中元素的类型可以不相同,它支持数字,字符串甚至可以包含列表(称为列表嵌套)。例如:a1=[]#定义空列表a2=[1,2,3]#定义3个整数的列表a3=[‘red’,‘green’,‘blue’]#定义3个字符串的列表a4=[5,‘blue’,[3,4]]#定义元素类型不相同的嵌套列表2.列表中元素的访问(1)列表元素用“列表名[下标]”表示例如:有列表a=[0,1,2,3,4,5,6,7,8,9]其元素分别为a[0]=0;a[1]=1;...;a[9]=9;(2)用“列表名[起始下标:结束下标+1]”表示列表的片段(列表的部分元素)例如:设有列表a=[0,1,2,3,'red','green','blue']用交互方式访问其列表的部分元素。【课堂练习】

>>>>a=[0,1,2,3,'red','green','blue']列表的操作函数1.添加元素有3个函数可以在列表中添加元素:append()、extend()、insert()。(1)用append()函数在列表末尾添加元素(2)用extend()函数将另一个列表的元素添加到本列表之后(3)用insert()函数将元素插入到列表中指定的某个位置使用insert()函数的格式为:

insert(下标位置,插入的元素)2.删除元素(1)用del命令删除列表中指定下标的元素(2)用pop()函数删除列表中指定下标的元素(3)用remove(x)函数删除列表中所值为‘x’的元素3.查找元素位置用index()函数可以确定元素在列表中的位置。4.对列表元素排序用sort()函数可以对列表元素进行排序。sort()函数默认为按升序(从小到大)排序。【课堂练习】操作列表a=[0,1,2,3,‘red’,‘green’,‘blue’]或其他1、显示:显示所有,显示第3个之后的元素2、给a添加元素一个元素:‘hellopython’,第4个元素插入4。3、删除元素操作:删除脚标2的元素、删除‘hellopython’4、查找元素操作:查找‘red’5、排序操作6、清空操作元组

元组是一种元素序列。但元组是不可变的,元组一旦创建,就不能添加或删除元素,元素的值也不能修改。

1.元组的创建用一对圆括号创建元组。2.元组的删除只能用del命令删除整个元组,而不能仅删除元组中的部分元素,因为元组是不可变的。【课堂练习】

1、创建一个元组:

名字为:yuanzu

值为:3,4,’hellowpython’ 2、删除元组yuanzu字典Python的字典是包含多个元素的一种可变数据类型,其元素由“键:值”对组成,即每个元素包含“键”和“值”两部分。1.字典的定义用大括号“{}”把元素括起来就构成了一个字典对象。字典中的元素用“字典名[键名]”表示。2.字典元素的修改通过为键名重新赋值的方式修改字典元素的值。3.字典元素的添加添加字典元素,也是使用赋值方式。4.字典元素的删除用del命令可以删除字典中的元素。【课堂练习】操作字典c={'name':'Tom','age':21,'hometown':'Tokoy'}1、修改:name改为Bob2、增加字典元素:添加键gender,值为:male3、删除字典元素:删除age集合集合是一个无序不可重复的序列,是一种基本数据类型。集合分为可变集合(set)和不可变集合(frozenset)两种类型。可变集合的元素是可以添加、删除的,而不可变集合的元素不可添加、不可删除。1.集合的定义集合用一对大括号“{}”把元素括起来,元素之间用逗号“,”分隔。例如:s1={1,2,3,4,5}s2={‘a’,’b’,’c’,’d’}上述s1和s2都是集合。2.集合的创建使用set()函数创建一个集合。3.集合元素的添加

python集合有两种方法用于添加元素,分别是add()和update()。4.集合元素的删除用remove()可以删除集合中的元素。例如:>>>a=set(‘boy’)>>>a.remove(‘y’)>>>a{‘o’,’b’}【课堂练习】操作集合e={‘a‘,‘b’,‘c‘,‘d‘,’e’}1、创建结合:分别用两种方法创建上述集合2、添加元素:添加book到集合,采用add和update分别添加并比较。3、删除字典元素:删除元素a5.集合的专用操作符集合有4个专用操作符:

&(交集)、|(并集)、-(差集,又称为“相对补集”)、^(对称差分)。设有两个集合a、b,其关系如下:a&b表示两个集合的共同元素;a|b表示两个集合的所有元素;a-b表示只属于集合a,不属于集合b的元素;a^b表示两个集合的非共同元素;【课堂练习】集合p={'p','y','t','o','n','h'} q={'p','e','g','o','n','i'} 1、求交集2、求并集3、求差集4、求对称差分集在Python中使用print()函数输出数据。(1)直接输出2.3控制语句(2)格式化输出print()函数可以使用%格式化输出数据。常用的格式化输出符号如表2-1所示。【例】格式化输出及控制换行输出示例。

2.输入语句在Python中,使用input()函数输入数据。input()函数只能输入字符数据,当需要输入数值型数据时,可以使用eval()函数将字符转换为数值。【例2-2】从键盘上输入二个数,计算这二数之和。编写源程序如下:print("输入一个整数:")a=eval(input())print("输入一个实数:")b=eval(input())str=input()print(str)c=a+bprint("c=",a,"+",b,"=",c)【例】交换两个变量的值。在编写程序时,有时需要把两个变量的值互换,Python在交换值的运算不需要用中间变量。交换两个变量的值if选择语句语法格式为:【例2-4】从键盘任意输入两个整数,按从小到大的顺序依次输出这两个数。源程序如下:【例】对给定的三个数,求最大数的平方。2.双分支选择结构if条件表达式:程序段1else:程序段23.多分支选择结构【例】将百分制转换为五级记分制。if条件表达式1:程序段1elif条件表达式2:程序段2

……elif条件表达式n:程序段nelse:

程序段n+1循环语句1.for循环语句当循环变量的步长值为1时,可以省略,即可写成:【例】求从1加到9的和。【例】在循环体内发生循环变量的值,观察循环次数。For循环变量的值在循环体内部发生改变,不会影响循环次数!!!

在for循环中,可以使用continue语句来结束本次循环,也可以使用break语句跳出循环体,从而结束整个循环。【例】计算10以内的偶数和。2.while语句while循环语句一般形式的语法结构如下:【例】求10!。【思考题】用for循环计算上题(计算10!)。n=1p=1forninrange(1,11): p=p*n print('n=',n,'p=',p)

3.循环嵌套循环可以嵌套,在一个循环体内包含另一个完整的循环,叫做循环嵌套。循环嵌套运行时,外循环每执行一次,内层循环要执行一个周期。【例】应用循环嵌套,编写一个按9行9列排列输出的乘法九九表程序。【例】应用循环嵌套打印出由“*”组成的直角三角形图形。

内循环控制列外循环控制行流程图流程图(程序框图)是一种用程序框、流程线及文字说明来表示算法的图。算法的基本逻辑结构

顺序结构由若干个依次执行的步骤组成。条件结构需要经过条件判断后,才能决定执行哪个操作。循环结构从某处开始,按照一定的条件反复执行某些步骤。

可以证明:任何一个算法都可以由这三种结构组合而成。算法的基本结构就是构成算法的积木,这一点在程序框图中可以清楚看到。

画程序框图的规则1)框图一般按从上到下、从左到右的方向画。2)使用标准的图形符号。3)程序框一般只有一个进入点和一个退出点。4)判断框有两个退出点,用“是”与“否”或“Y”与“N”表示判断的两种结果。5)在图形符号内描述的语言要简练清楚。构成流程图的图形符号及其作用程序框名称功能起止框(终端框)表示一个算法的起始和结束,是任何流程图不可少的.输入、输出框表示一个算法输入和输出的信息,可用在算法中任何需要输入、输出的位置.处理框(执行框)赋值、计算,算法中处理数据需要的算式、公式等分别写在不同的用以处理数据的处理框内.判断框判断某一条件是否成立,成立时在出口处标明“是”或“Y”;不成立时标明“否”或“N”.流程线连接程序框连接点连接程序框图的两部分顺序结构顺序结构在程序框图中的体现就是用流程线将程序框自上而下地连接起来,按顺序执行算法步骤。如在示意图中,A框和B框是依次执行的,只有在执行完A框指定的操作后,才能接着执行B框所指定的操作。AB例1:计算以任意正实数为半径的圆的面积。算法:S1,输入r.S2,S=π*r*rS3,输出S.开始结束输入r输出SS=π*r*r条件结构条件结构是指在算法中通过对条件的判断,根据条件是否成立而选择不同流向的算法结构。满足条件?语句是否满足条件?语句语句是否判断符号:>、<、==、!=、>=、<=。逻辑符号:and、or

例2:设计求任意3个整数a,b,c的最大值的算法。算法:令max代表三个数中的最大值S1,输入a、b、c三个数;S2,令max=a;S3,如果b>max,则max=b;S4,如果c>max,则max=c;S5,输出maxmax=a输入a,b,c结束输出max开始b>max?c>max?max=bmax=c是否否是开始结束输入a,b,c输出max

b>max?是否max=amax=bmax=cc>max?否是不止一种框图:程序框图2循环结构循环结构:从某处开始,按照一定的条件反复执行某些步骤。循环体:复执行的步骤称为循环体。循环条件:控制反复执行的条件称为循环条件。每次执行循环体前,对条件进行判断;当条件满足时,执行循环体,否则终止循环。满足条件?循环体是否满足条件?循环体是否例3:设计一个算法1+2+…+100的值的算法,并画出程序框图.算法:

S1:S=0,i=1,S2:若i>100,则输出S,算法结束.S3:S=S+i.S4:i=i+1,

S5:转到S2.s=0foriinrange(1,101): s=s+iprint(”答案是:”,s)

开始

结束i=1输出Si>100?否是S=0i=i+1S=S+i【例】求50以内能被7整除,但不能同时被5整除的所有整数。修改:

150以内能被8整除,但同时被5整除的所有整数。【例】如果一个3位数的各位数字的立方和等于该数自身,则该数称为“水仙花数”。例如,153=13+53+33,所以153是一个水仙花数。求100~1000以内所有“水仙花数”。

修改:求1234~54321以内所有“水仙花数”。除10求余数,相当于提取出个位缩小10倍【例】设有一份某地连续10年内6月1日的气温记录,其数据为(0C):31、30、33、31、28、32、29、33、35、31,试计算其平均气温。修改:求该范围内的最高温度。a的元素个数【例】鸡兔同笼问题。鸡和兔在一个笼子里,从上面数,有35个头;从下面数,有94只脚。问笼中鸡和兔各有多少只?36注意编程解题的思路并不完全与我们人解题的思路一样!!!【例】百钱买百鸡问题。公鸡5文钱一只,母鸡3文钱一只,小鸡3只一文钱,用100文钱买100只鸡,如何买?

设公鸡x只,母鸡y只,小鸡z只,则:

x+y+z=1005x+3y+z/3=100题目:求100之内的素数。程序分析:素数只有1和它自己可以被除尽(余数为0)。fornuminrange(2,100+1):#素数大于1

foriinrange(2,num): if(num%i)==0: break ifi==num-1: print(num)题目:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。程序分析:学会使用布尔值判断。a=int(input("请输入一个五位数字:\n"))x=str(a)flag=Trueforiinrange(0,3): ifx[i]!=x[-i-1]: flag=False breakifflag: print("%d是一个回文数!"%a)else: print("%d不是一个回文数!"%a)1.函数定义的一般形式【例2-15】创建一个名为Hello的函数,其作用为输出“欢迎进入Python世界”的字符内容。创建该函数的程序段如下:

defHello():

print("欢迎进入Python世界")

在程序中调用Hello()函数,将显示“欢迎进入Python世界”的字符内容。2.4函数【例】创建一个名为sum()的函数,其作用为计算n以内的整数之和(包含n)。

下面为实现计算n以内的整数之和的函数程序段:defsum(n): s=0 foriinrange(1,n+1): s=s+i returns2.函数的调用在Python中,直接使用函数名调用函数。如果定义的函数包含有参数,则调用函数时也必须使用参数。【例2-17】创建显示如下排列字符的函数,并编写程序调用该函数。

**********************************

*欢迎进入学生成绩管理系统*

**********************************程序代码如下:defstar(): str="*****************************"returnstrdefprn():print("*欢迎进入学生成绩管理系统*")print(star())prn()print(star())【例2-18】应用函数,计算1~100的和。程序的运行结果如下:

5050局部变量与全局变量在函数体内部定义的变量或函数参数称为局部变量,该变量只在该函数内部有效。在函数体外部定义的变量称为全局变量,在变量定义后的代码中都有效。当全局变量与局部变量同名时,则在定义局部变量的函数中,全局变量被屏蔽,只有局部变量有效。全局变量在使用前要先用关键字global声明。【例】全局变量与局部变量同名的示例。常用内置函数Python内置函数是python系统内部创建的,在Python的程序中,可以随时调用这些函数,不需要另外定义。例如,最常见的print()是内置函数,在程序中直接使用: print("HelloWorld!")而平方根函数sqrt()不是内置函数,使用该函数时需要引用math模块: importmath y=math.sqrt(25)匿名函数lambda在Python中可以使用匿名函数。匿名函数即没有函数名的函数。通常用lambda声明匿名函数。例如,计算二个数的和,可以写成: add=lambdax,y:x+y print(add(1,2))输出的结果为3。从上面示例可以看到,lambda表达式的计算结果相当于函数的返回值。【例】用lambda表达式,求三个数的和。【例】编写计算n!的函数。

计算n!,应先计算(n-1)!,而计算(n-1)!,需要先计算(n-2)!,......,如此递推,直到最后变成计算1!的问题。

根据公式,1!=1,这是本问题的递归终止条件。由终止条件得到1!的结果后,再反来依次计算出2!,3!,......,直到最后计算出n!。

设计算n!的函数为fun(n),当n>1时,fun(n)=n*fun(n-1)。即在fun(n)函数体内将递归调用fun()自身。【例】编写函数,从键盘输入参数n,计算斐波那契数列中第一个大于n的项。

斐波那契数列为:1,1,2,3,5,8,13,......。即从第3项开始,每一项是前二项之和。

模块的导入

在Python中用关键字import来导入某个模块,其导入模块的形式有两种。1.用import形式导入模块用import导入模块的一般形式为:import模块名

在调用import导入模块的函数时,必须使用以下形式来调用:模块名.函数名2.5模块2.用

from....import....形式导入模块用from....import....导入模块的一般形式为:

from模块名import函数名或变量名

比如要引用模块math中的sqrt()函数,可以用frommathimportsqrt()语句来导入。在调用from....import....导入模块的函数时,直接使用函数名来调用模块中的函数,而不需要在函数的前面加上模块名。3.导入模块的顺序

当需要导入多个模块时,应按照下面的顺序依次导入模块:

(1)导入Python系统的标准库模块,如os、sys等;

(2)导入第三方扩展库模块,如pygame、mp3play等;

(3)导入自己定义和开发的本地模块。自定义模块

在Python中,每个包含有函数的Python文件都可以作为一个模块来使用,其模块名就是文件名。【例】自定义模块使用示例。(1)设有Python文件hello.py,其中包含hh()函数,代码如下:(2)调用模块hello中hh()函数的程序ex3_8.py代码如下:【例】编写一个计算二数和的模块,再在另一个程序中调用该模块。

(1)编写模块代码,其中包含有计算二数之和的函数sum(),保存为ex3_9_1.py。(2)编写调用模块程序ex3_9_2.py,其代码如下:使用pip安装和管理扩展模块

1.安装pipPython安装第三方的模块,大多使用包管理工具pip进行安装。Python包管理工具pip提供了对Python包的查找、下载、安装、卸载的功能。下载pip下载地址是:

https:///pypi/pip#downloads下载完成之后,解压到一个文件夹,使用控制台命令窗口进入解压目录,输入安装命令:

pythonsetup.pyinstall

安装pip完后还需要配置环境变量,pip指令才能生效。

2.通过pip安装扩展模块例如:(1)安装MySQL数据库管理模块:pipinstallpymysql

(2)安装图形处理库模块:pipinstallpillow

(3)安装SomePackage模块:

pipinstallSomePackage

(4)卸载SomePackage模块:

pipuninstallSomePackage

(5)查看当前已经安装的模块:

piplist2.6文件操作Python的os模块提供对文件的操作函数,常用操作函数如下表2-7所示:函数说明os.rmdir(path)创建一个文件夹os.mknod(“test.txt”)创建空文件open(“test.txt”,w)以w模式打开一个文件,如果文件不存在则创建文件os.rename(“oldfile”,”newfile”)文件重命名os.remove(“file”)删除文件os.path.exists(“goal”)判断文件是否存在文件操作函数

打开和关闭文件1.打开文件在python中,使用open函数,可以打开一个已经存在的文件,或者创建一个新文件。打开文件时将创建一个文件对象。其一般格式为:f=open(文件名,访问模式)

其中,f为创建的文件对象,参数“访问模式”见表6-3。2.关闭文件

文件操作完成之后,需要将文件对象关闭,其一般格式为:f.close()1.read()函数

使用read()函数可以读取文件内容,其一般格式为:str=f.read([b])其中:f为文件对象;参数b为指定读取的字节数,如果不指定,则读取全部内容;str为字符串,存放读取的内容。读取文件操作【例】设有文件a.txt,其文件内容为“HelloPython”,编写程序读取该文件中的内容,并显示到屏幕上。编写程序代码如下:importosf=open("a.txt","r")str=f.read()print(str)f.close()2.readline()函数

使用readline()函数可以逐行读取文件的内容,其一般形式如下:str=f.readline()【例】设有文件“荷塘月色.txt”,其文件内容为:荷塘月色剪一段时光缓缓流淌,流进了月色中微微荡漾,弹一首小荷淡淡的香,美丽的琴音就落在我身旁。编写程序,用readline()函数逐行读取文件的内容。编写程序代码如下:importosf=open("荷塘月色.txt","r")whileTrue: str=f.readline() print(str) ifnotstr: breakf.close()3.readlines()函数

使用readlines()函数可以一次读取文件中所有行的内容,其一般形式如下:str=f.readlines()

【例】编写程序,用readlines()函数读取上例的“荷塘月色.txt”文件内容。编写程序代码如下:importosf=open("荷塘月色.txt","r")str=f.readlines()print(str)f.close()写入文件操作

Python通过函数write()向文件写入数据,其一般格式为:

f.write(content)【例】编写程序,新建文本文件ex6_8.txt,并向其写入文本数据。编写程序代码如下:importosstr="HelloPython\n向文件写入数据"f=open("ex6_8.txt","w")f.write(str)f.close()

将程序保存为ex6_8.py,运行程序后,在当前目录下生成一个名为“ex6_8.txt”的文本文件,其内容为:HelloPython向文件写入数据【例】编写程序,在文件ex6_8.txt原数据内容之后,添加“我对学习Python很痴迷!”。

当以w模式为参数调用open()函数打开文件时,如果写入数据到文件中,新内容将覆盖文件中原有数据内容。若要在文件中追加数据,可以以a或a+模式为参数调用open()函数打开文件。

编写程序代码如下:importosf1=open("ex6_8.txt","a+")f1.write("\n我对学习Python很痴迷!")f1.close()f2=open("ex6_8.txt","r")str=f2.read()print(str)

运行程序,其结果如下:HelloPython向文件写入数据我对学习Python很痴迷!python中的常见标准异常2.7异常处理异常的捕捉与处理1.使用try...except语句try...except语句的语法格式为:

try: <被检测的语句块>except<异常类型名称>: <处理异常的语句块>

【例】元组下标越界引发异常。

编写程序代码如下:s=[1,2,3,4,5]try: print(s[5])exceptIndexError: print("发生异常原因:索引出界")

运行程序结果为:发生异常原因:索引出界

2.使用try...except...else语句try...except...else语句的语法格式为:

try: <被检测的语句块>except<异常类型名称>: <处理异常的语句块>

else: <无异常时执行的语句块>【例】编写一个把字符串写入到一个文件的程序。若写入成功,则提示“内容写入文件成功”,否则提示“Error:没有找到文件或读取文件失败”。

try:

fh=open("testfile.txt","w")

fh.write("这是一个测试文件,用于测试异常!!")exceptIOError:

print("Error:没有找到文件或读取文件失败")else:

print("内容写入文件成功")

fh.close()3.带有多个except子句的try语句【例】编写程序,从键盘输入1,2,……,5中的一个数字,否则,当输入其他数字或字符则提示为异常。4.带有finally子句的try语句【例】带有finally子句的try语句示例。1.类的一般形式

在类声明中,class是声明类的关键字,表示类声明的开始,类声明后面跟着类名,按习惯类名要用大写字母开头,并且类名不能用阿拉伯数字开头。

类中的self在调用时代表类的实例,与c++或Java中的this作用类似。

2.8面向对象编程2.创建对象类在使用时,必须创建类的对象,再通过类的对象来操作类中的成员变量和成员方法。创

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论