目录
1. Python说明
1.1 Python简介
Python由荷兰数学和计算机科学研究学会的吉多·范罗苏姆于1990年代初设计,作为一门叫作ABC语言的替代品。 Python提供了高效的高级数据结构,还能简单有效地面向对象编程。Python语法和动态类型,以及解释型语言的本质,使它成为多数平台上写脚本和快速开发应用的编程语言,随着版本的不断更新和语言新功能的添加,逐渐被用于独立的、大型项目的开发。
Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。Python 的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有比其他语言更有特色语法结构。
1.2 Python发展历程
- Python 是由 Guido van Rossum 在八十年代末和九十年代初,在荷兰国家数学和计算机科学研究所设计出来的。
- Python 本身也是由诸多其他语言发展而来的,这包括 ABC、Modula-3、C、C++、Algol-68、SmallTalk、Unix shell 和其他的脚本语言等等。
- 像 Perl 语言一样,Python 源代码同样遵循 GPL(GNU General Public License)协议。
- 现在 Python 是由一个核心开发团队在维护,Guido van Rossum 仍然占据着至关重要的作用,指导其进展。
- Python 2.0 于 2000 年 10 月 16 日发布,增加了实现完整的垃圾回收,并且支持 Unicode。
- Python 3.0 于 2008 年 12 月 3 日发布,此版不完全兼容之前的 Python 源代码。不过,很多新特性后来也被移植到旧的Python 2.6/2.7版本。
- Python 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。
- Python 2.7 被确定为最后一个 Python 2.x 版本,它除了支持 Python 2.x 语法外,还支持部分 Python 3.1 语法。
-
1.3 Python特点
- 跨平台性:一个相同且可运行的Python程序可以在多种不同的操作系统上顺利运行,其中包含:windows、Linux、FreeBSD、Macintosh、Solaris、OS/2、Amiga、AROS、AS/400、BeOS、OS/390、z/OS、Palm OS、QNX、VMS、Psion、Acom RISC OS、VxWorks、PlayStation、Sharp Zaurus、Windows CE、PocketPC、Symbian以及Google基于linux开发的android平台。
- 扩展性强:如果你需要一段运行很快的关键代码,或者是想要编写一些不愿开放的算法,你可以使用C或C++完成那部分程序,然后从你的Python程序中调用。
- 学习成本低:Python是一种代表简单主义思想的语言。阅读一个良好的Python程序就感觉像是在读英语一样。它使你能够专注于解决问题而不是去搞明白语言本身,另外Python也有着极其简单的说明文档,帮助你快速上手。
- 丰富的标准库:Python标准库十分庞大。它可以帮助处理各种工作,包括正则表达式、文档生成、单元测试、线程、数据库、网页浏览器、电子邮件、XML、XML-RPC、HTML、WAV文件、密码系统、GUI(图形用户界面)、Tk和其他与系统有关的操作。
2. Python环境搭建
2.1 Python下载
目前Python更新了多个版本,在本文中使用Python3.7作为示例,来进行讲解。
2.1.1 下载网址
① 官方下载地址:https://www.python.org/downloads/release/python-370/;
② 在上步骤中打开的网页中找到‘Files’部分,找到适配本地环境的版本,如下图所示:
③ 选择适配的版本,点击即可下载。
2.2 Python安装
2.2.1 Windows下安装
① 双击打开下载完成的安装包,将下方的‘Add Python 3.7 to PATH’勾选,下一步点击‘Customize installation’,进行自定义安装。
② 在安装界面,选择合适的安装位置进行安装,选择完毕之后单击‘Install’按钮。
③ 安装完成之后的测试,在此以windows系统为例,win+R键打开运行窗口,输入cmd打开命令行窗口,输入‘python --version’,点击回车之后下方显示‘python 3.7.0’即说明安装成功,此时即可以使用了。
2.2.2 Linux下安装
Linux下python的安装可以直接通过命令行来完成,命令输入之后等待安装完毕即可。
命令如下所示:
sudo apt-get update
sudo apt-get install python3.7
3. Python基础语法
在本文中使用PyCharm 作为集成开发环境,后续的程序运行等都在PyCharm 中执行。
3.1 注释
在 Python3 中,注释会使代码更易于阅读和理解,但是注释不会影响程序的执行,Python 中的注释有单行注释和多行注释。
3.1.1 单行注释
Python 中单行注释以 # 开头,例如:
#这是一个注释,下方程序含义为控制台输出“hello,world”的字符
print("hello,world")
3.1.2 多行注释
多行注释用三个单引号 ''' 或者三个双引号 """ 将注释括起来,例如:
①单引号(''')
'''
这是1个多行注释
time:2023.08.08
Author:Rop
version:V1.0
'''
print("hello,world")
②双引号(""")
"""
这是一个多行注释
time:2023.08.08
Author:Rop
version:V1.0
"""
print("hello,world")
注意:多行注释可以嵌套使用,但是单行注释不能嵌套使用。
3.2 行与缩进
python最具特色的就是使用缩进来表示代码块,不需要使用大括号 {} 。
缩进的空格数是可变的,但是同一个代码块的语句必须包含相同的缩进空格数。实例如下:
if True:
print ("True")
else:
print ("False")
以下代码最后一行语句缩进数的空格数不一致,会导致运行错误,:
if True:
print ("Answer")
print ("True")
else:
print ("Answer")
print ("False") # 缩进不一致,会导致运行错误
PyCharm中报错如下图所示:
4. Python数据类型
4.1 字符串
4.1.1 字符串创建
字符串是 Python 中最常用的数据类型。我们可以使用引号( ' 或 " )来创建字符串。
创建字符串很简单,只要为变量分配一个值即可。例如:
var1 = 'Hello World!'
var2 = "Runoob"
print(var2+var1)
4.1.2 输出字符串中指定位置的字符
Python 不支持单字符类型,单字符在 Python 中也是作为一个字符串使用。
Python 访问子字符串,可以使用方括号 [] 来截取字符串,字符串的截取的语法格式如下:
字符串名称[头下标:尾下标]
实例说明:
字符串正数的索引:0~N;字符串倒数的索引:-1~-N;
程序示例:
var1 = "Realman"
print("第四位:"+var1[3])
print("倒数第一位:"+var1[-1])
print("前三位:"+var1[0:3])
print("不输出后2位:"+var1[0:-2])
上述程序运行结果如下图所示:
4.2 字典
字典是一种可变容器模型,且可存储除‘list’外任意类型对象。
字典的每个键值 key=>value 对用冒号 : 分割,每个对之间用逗号‘,’分割,整个字典包括在花括号 {} 中 ,格式如下所示:
Realman = {key : value1, key2 : value2, key3 : value3}
在字典中,键是唯一的,但值不必是唯一的。值可以取任何数据类型,但键必须是不可变的,如字符串,数字。
4.2.1 字典的内置函数与方法
内置函数
① len(字典名称)
含义:计算字典元素个数,即键的总数。
②str(字典名称)
含义:输出字典,可以打印的字符串表示。
③typr(字典名称)
含义:返回输入的变量类型,如果变量是字典就返回字典类型。
部分内置方法
①字典名.clear()
含义:删除字典内所有元素。
②字典名.copy()
含义:返回一个字典的浅复制。
③字典名.fromkeys()
含义:创建一个新字典,以序列seq中元素做字典的键,val为字典所有键对应的初始值。
含义:返回指定键的值,如果键不在字典中返回 default 设置的默认值
⑤字典名.keys()
含义:返回当前字典中所有键。
⑥字典名.values()
含义:返回当前字典中所有值。
4.2.2 创建空字典
使用大括号 { } 创建空字典实例:
# 使用大括号 {} 来创建空字典
emptyDict = {}
# 打印字典
print(emptyDict)
# 查看字典的数量
print("Length:", len(emptyDict))
# 查看类型
print(type(emptyDict))
以上实例输出结果:
使用内建函数 dict() 创建字典实例:
emptyDict=dict()
# 打印字典
print(emptyDict)
# 查看字典的数量
print("Length:",len(emptyDict))
# 查看类型
print(type(emptyDict))
以上实例输出结果:
4.2.3 访问字典里的值
把相应的键放入到方括号中,如下实例:
tinydict = {'Name': 'Runoob', 'Age': 7, 'Class': 'First'}
print ("tinydict['Name']: ", tinydict['Name'])
print ("tinydict['Age']: ", tinydict['Age'])
以上实例输出结果:
如果用字典里没有的键访问数据,会输出错误如下:
示例
#创建1个字典
tinydict = {'Name': 'Runoob', 'Age': 7, 'Class': 'First'}
#输出1个字典中没有的键
print ("tinydict['Alice']: ", tinydict['Alice'])
以上示例输出结果:
4.2.4 修改字典键/值
向字典添加新内容的方法是增加新的键/值对,修改或删除已有键/值对如下实例:
#创建名为tinydict的字典
tinydict = {'Name': 'Runoob', 'Age': 7, 'Class': 'First'}
# 更新 Age
tinydict['Age'] = 8
# 添加信息
tinydict['Realman'] = "RM65"
#输出Age 键
print ("tinydict['Age']: ", tinydict['Age'])
#输出Realman 键
print ("tinydict['Realman']: ", tinydict['Realman'])
以上实例输出结果:
4.2.5 删除字典元素
能删单一的元素也能清空字典,清空只需一项操作。
删除一个字典用del命令,如下实例:
tinydict = {'Name': 'Runoob', 'Age': 7, 'Class': 'First'}
# 删除键 'Name'
del tinydict['Name']
# 清空字典
tinydict.clear()
# 删除字典
del tinydict
print("tinydict['Age']: ", tinydict['Age'])
print("tinydict['School']: ", tinydict['School'])
但这会引发一个异常,因为用执行‘del’操作后字典不再存在:
5. Python中的函数
5.1 def 用法
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。
①创建函数
创建1个函数需要遵循一定的规则,规则如下:
- 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()。
- 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。
- 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
- 函数内容以冒号 : 起始,并且缩进。
- return [表达式] 结束函数,选择性地返回一个值给调用方,不带表达式的 return 相当于返回 None。
②语法示例
Python中创建函格式如下:
def 函数名(参数名称):
函数体
③基础函数示例
def realman():
print("hello,Realman")
realman()
示例输出:
④函数调用示例
定义一个函数:给了函数一个名称,指定了函数里包含的参数,和代码块结构。
这个函数的基本结构完成以后,你可以通过另一个函数调用执行,也可以直接从 Python 命令提示符执行。
如下实例调用了 printme() 函数:
# 定义名称为printme的函数
def printme(str):
# 打印任何传入的字符串
print(str)
return
# 调用函数并且传入一个字符串
printme("我要调用用户自定义函数!")
printme("再次调用同一函数")
示例输出结果为:
6. Python网络编程
Python 提供了两个级别访问的网络服务:
- 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的全部方法。
- 高级别的网络服务模块 SocketServer, 它提供了服务器中心类,可以简化网络服务器的开发。
本文中仅对Socket进行讲述。注意:在使用Socket创建连接时,使用完毕之后必须调用close()方法关闭连接。
6.1 Scoket()函数介绍
Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。
Python3 中,我们用 socket() 函数来创建套接字,语法格式如下:
socket.socket([family[, type[, proto]]])
参数说明:
family: 套接字家族可以是 AF_UNIX 或者 AF_INET。
type: 套接字类型可以根据是面向连接的还是非连接分为SOCK_STREAM或SOCK_DGRAM。
proto: 一般不填默认为0。
Socket对象方法
服务器端方法
①s.bind()
说明:绑定地址(host,port)到套接字, 在AF_INET下,以元组(host,port)的形式表示地址。
②s.listen()
说明:开始TCP监听。backlog指定在拒绝连接之前,操作系统可以挂起的最大连接数量。该值至少为1,大部分应用程序设为5就可以了。
③s.accept()
说明:被动接受TCP客户端连接,(阻塞式)等待连接的到来。
客户端方法
①s.connect()
说明:主动初始化TCP服务器连接,。一般address的格式为元组(hostname,port),如果连接出错,返回socket.error错误。
②s.connect_ex()
说明:connect()函数的扩展版本,出错时返回出错码,而不是抛出异常。
公共方法
①s.recv()
说明:接收TCP数据,数据以字符串形式返回,bufsize指定要接收的最大数据量。flag提供有关消息的其他信息,通常可以忽略。
②s.send()
说明:发送TCP数据,将string中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小。
③s.close()
说明:关闭套接字
6.2 创建服务端
服务端开启后,会向外广播发送的内容,程序中设置了无限循环,所以程序会持续运行,服务端程序如下所示:
# 导入 socket、sys 模块
import socket
import sys
# 创建 socket 对象
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 获取本地主机名
host = socket.gethostname()
port = 9999
# 绑定端口号
serversocket.bind((host, port))
# 设置最大连接数,超过后排队
serversocket.listen(5)
while True:
# 建立客户端连接
clientsocket, addr = serversocket.accept()
print("连接地址: %s" % str(addr))
msg = '欢迎访问睿尔曼' + "\r\n"
clientsocket.send(msg.encode('utf-8'))
clientsocket.close()
客户端未连接服务端情况下,程序运行结果为:
客户端连接服务端之后,程序运行结果为:
6.3 创建客户端
Socket客户端创建完成,并且连接服务端之后,会接收到服务端向外广播的信息,且服务端可以获得客户端的IP及其他信息。创建客户端程序如下所示:
# 导入 socket、sys 模块
import socket
import sys
# 创建 socket 对象
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 获取本地主机名
host = socket.gethostname()
# 设置端口号
port = 9999
# 连接服务,指定主机和端口
s.connect((host, port))
# 接收小于 1024 字节的数据
msg = s.recv(1024)
s.close()
print (msg.decode('utf-8'))
客户端接收到服务端对外广播的信息,运行结果如下图所示