Python
注释 用# 表示单行 '''多行注释''' """ 多行注释 """
代码块不需要用{},而用相同的缩进来表示
函数 def my_function(): print("Hello, World!") if True: print("This is indented")#与下面的print保持一样的缩进 else: print("This is also indented")
多行语句 用\接上
total = item_one + \ item_two + \ item_three
complex 数据类型:复数 1+2i
转义符 \n:换行 前面加r可以取消转义
print(r"this is a line with \n") #直接打印出\n
-
按字面意义级联字符串,如 "this " "is " "string" 会被自动转换为 this is string。
-
字符串可以用 + 运算符连接在一起,用 * 运算符重复。
-
Python 没有单独的字符类型,一个字符就是长度为 1 的字符串。
str1 = "hello " str2 = "world " str3 = "!" result = str1 + str2 + str3 print(result) # 输出:hello world ! result = str1 * 3 print(result) # 输出:hello hello hello
-
Python 中的字符串有两种索引方式,从左往右以 0 开始,从右往左以 -1 开始。
-
字符串不能做单个元素的修改,但是可以给字符串变量赋新的字符串
my_string = "Hello" my_string[0] = "J" # 这是错误的,会导致 TypeError my_string = "J" + my_string[1:] print(my_string) # 输出:Jello
-
字符串的截取的语法格式如下:变量[头下标:尾下标:步长]
#!/usr/bin/python3 str='123456789' print(str) # 输出字符串 #123456789 print(str[0:-1]) # 输出第一个到倒数第二个的所有字符 #12345678 print(str[0]) # 输出字符串第一个字符 #1 print(str[2:5]) # 输出从第三个开始到第六个的字(不包含第六个) #345 print(str[2:]) # 输出从第三个开始后的所有字符 #3456789 print(str[1:5:2]) # 输出从第二个开始到第五个且每隔一步的字符(步长为2) #24 print(str * 2) # 输出字符串两次 #123456789123456789 print(str + '你好') # 连接字符串 #123456789你好
-
函数之间或类的方法之间用空行分隔,表示一段新的代码的开始。
-
多个语句构成代码组 if与else后面接:
if expression : suite elif expression : suite else : suite
-
print函数输出默认是换行的 不换行的话+end=""
#!/usr/bin/python3 x="a" y="b" # 换行输出 print( x ) print( y ) # 不换行输出 print( x, end=" " ) print( y, end=" " ) print() #输出一个空行
Python3
中的六个标准数据类型 还有bool
(布尔)类型 bytes(字节数组类型)
-
不可变数据(3 个):Number(数字)、String(字符串)、Tuple(元组);
-
可变数据(3 个):List(列表)、Dictionary(字典)、Set(集合)。
怎么理解不可变数据
x = 5 # 创建一个整数对象 5,并将变量 x 引用它 x = 6 # 创建另一个整数对象 6,并将变量 x 引用它,原来的对象 5 并未被修改
支持同时为多个变量赋值
a, b, c, d = 20, 5.5, True, 4+3j print(type(a), type(b), type(c), type(d)) # 输出:<class 'int'> <class 'float'> <class 'bool'> <class 'complex'>
isinstance
是 Python 中的一个内置函数,用于检查一个对象是否是特定类或类型的实例。该函数接受两个参数,第一个参数是要检查的对象,第二个参数是要检查的类或类型。如果对象是指定的类或类型的实例,则返回 True,否则返回 False。
a = 111 isinstance(a, int) # True
数值运算
5 + 4 # 加法 # 9 4.3 - 2 # 减法 # 2.3 3 * 7 # 乘法 # 21 2 / 4 # 除法,得到一个浮点数 # 0.5 2 // 4 # 除法,得到一个整数 # 0 17 % 3 # 取余 # 2 2 ** 5 # 乘方 表示2的5次方 # 32
python运算符 and or not
类型转换
a = True b = False print(int(a)) # 1 print(float(b)) # 0.0 print(str(a)) # "True"
list(列表)常用的数据类型 相当于杂交数组 (可以通过索引来修改列表中的元素)
# 创建一个包含数字的列表 numbers = [1, 2, 3, 4, 5] # 创建一个包含字符串的列表 fruits = ["apple", "banana", "orange"] # 创建一个包含不同类型的元素的列表 mixed = [1, "hello", True, [3, 4, 5]] print(numbers[1:3]) # 输出:[2, 3] fruits[0] = "pear" print(fruits) # 输出:["pear", "banana", "orange"]
对列表元素进行操作
fruits = ["apple", "banana", "orange"] fruits.append("pear") fruits.insert(1, "grape") fruits.remove("banana") popped = fruits.pop(0) print(fruits) # 输出:["grape", "orange", "pear"] print(popped) # 输出:apple
append()
向列表末尾添加元素, insert()
在指定位置(索引)插入元素,使用 remove()
方法删除指定值的元素,使用 pop()
方法删除指定位置的元素,并返回该元素的值。
numbers = [1, 2, 3, 4, 5] print(len(numbers)) # len()函数求列表中元素个数 输出:5 a = [1, 2, 3] b = [4, 5, 6] c = a + b # 连接两个列表 print(c) # 输出:[1, 2, 3, 4, 5, 6] d = a * 3 # 重复列表 print(d) # 输出:[1, 2, 3, 1, 2, 3, 1, 2, 3] print(3 in a) # 输出:True 查找操作 print(6 not in a) # 输出:True numbers.sort() # 排序列表 默认按照升序排列 print(numbers) # 输出:[1, 2, 3, 4, 5] numbers.sort(reverse=True) #按照降序排列 print(numbers) # 输出:[5, 4, 3, 2, 1]
元组 (tuple)与列表类似,不同之处在于元组的元素不能修改。元组写在小括号()里,元素之间用逗号隔开。元组中的元素类型也可以不相同
元组输出也带(),列表输出带[],输出单个元素不带括号 注意
tup1 = () # 空元组 tup2 = (20,) # 一个元素,需要在元素后添加逗号
str = "I like programming" result = str.split(" ") #split按照空格分割,变成新的列表 print(result) # 输出:['I', 'like', 'programming']
集合(set)是一种无序且不重复的数据集合,即它不会维持元素的插入顺序,输出是随机的。集合用大括号 {}
表示,其中的元素之间用逗号分隔。
注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。空集合可以用于初始化一个集合,然后逐渐向其中添加元素。空集合也可以用于初始化一个占位符,以便稍后向其中添加元素。
my_set = {1, 2, 3, 4, 5} #重复的元素会被自动去除
# set可以进行集合运算 a = set('abracadabra') b = set('alacazam') print(a) #{'r', 'd', 'c', 'b', 'a'} #无序输出 print(b) #{'l', 'c', 'z', 'a', 'm'} #无序输出 print(a - b) # a 和 b 的差集属于a但不属于b的元素组成的集合。 #{'r', 'b', 'd'} print(a | b) # a 和 b 的并集 #{'r', 'l', 'd', 'c', 'b', 'z', 'a', 'm'} print(a & b) # a 和 b 的交集 #{'a', 'c'} print(a ^ b) # a 和 b 中不同时存在的元素 #{'l', 'r', 'd', 'm', 'z', 'b'}
字典(Dictionary)是一种键值对的数据结构。字典用大括号 {}
表示,其中的元素是以键值对的形式出现的,键和值之间用冒号 :
分隔,键值对之间用逗号分隔。
my_dict = {"name": "Alice", "age": 25, "city": "New York"} # 通过键来访问字典中的值 print(my_dict["name"]) # 输出:Alice print(my_dict["age"]) # 输出:25 # 添加新的键值对 my_dict["gender"] = "female" # 更新已有键的值 my_dict["age"] = 26 # 删除指定键的键值对 del my_dict["city"] # 清空整个字典 my_dict.clear() # 遍历字典的键值对 for key, value in my_dict.items(): print(key, value)
逻辑运算符
-
and运算符:第一个操作数为真返回第二个操作数
第一个操作数为假返回第一个操作数(False、0、空字符 串、空列表、空字典、空集合等)
-
or运算符:第一个操作数为真返回第一个操作数否则返回第二个操作数
and的优先级高于or
# and运算符 result1 = True and False # 返回 False result2 = True and 10 # 返回 10 result3 = False and 10 # 返回 False resulta = 0 and 10 # 返回 0 result2 = 20 and 30 # 返回 30 result3 = '' and 'hello' # 返回 '' result4 = 'world' and 'hello' # 返回 'hello' # or运算符 result4 = True or False # 返回 True result5 = False or 10 # 返回 10 result6 = 0 or False # 返回 False
幂赋值运算符(**=)
c **= a #等效于 c = c ** a 即c的a次幂
-
成员运算符
in
:元素在列表中返回truenot in
相反 -
身份运算符
is
a = [1, 2, 3] b = a c = [1, 2, 3] print(a is b) # 输出True,因为a和b引用同一个列表对象 print(a is c) # 输出False,因为a和c引用不同的列表对象 a = 20 b = 20 print( a is b ) # 输出True print( id(a) == id(b) ) # 输出True # 较小的整数和短字符串,解释器会对它们进行缓存以提高性能。因此,当a和b都等于20时,它们引用的是同一个整数对象
常用数学函数
转换进制
用函数实现转换进制
x=5 a=bin(x) print(a[2:]) # 输出101
-
bin
函数:十进制转换成二进制 前缀是0b
-
oct
函数: 十进制转八进制 前缀是0o
-
hex
函数: 十进制转十六进制 前缀是0x
格式化输出
x=5 print("我今年%d岁"%x)
格式化字符串 f'字符串 {表达式或变量}'
x=5 print(f'我今年{x}岁')
常用字符串函数
-
len(string)
返回字符串长度
-
count(str, beg= 0,end=len(string)
返回 str 在 string 里面出现的次数,如果 beg 或者 end 指定则返回指定范围内 str 出现的次数
-
find(str, beg=0, end=len(string))
检测 str 是否包含在字符串中,如果指定范围 beg 和 end ,则检查是否包含在指定范围内,如果包含返回开始的索引值,否则返回-1
-
lower()
转换字符串中所有大写字符为小写.
常用列表函数
-
len(list)
返回列表元素个数
-
max(list)
返回列表元素最大值 -
list(seq)将元组转换为列表
def是用来定义函数的关键字。通过def关键字,可以创建一个新的函数,并指定函数的名称、参数和函数体。
match...case:相当于C语言中的switch
语句
def http_error(status): #定义函数 match status: case 400: return "Bad request" case 404: return "Not found" case 418: return "I'm a teapot" case _: return "Something's wrong with the internet" mystatus=400 print(http_error(400))
x = 2 match x: case 1: print(1) case 2: print(2) case 3: print(3) #结果输出2,不用加break
模块:相当于自己手写一个函数库
import sys
引入 python 标准库中的 sys.py
模块;这是引入某一模块的方法。
写一个源文件,后缀为.py
就可以引入模块 例如
import random
网络基础
网络层次划分
为了使不同计算机厂家生产的计算机能够相互通信,以便在更大的范围内建立计算机网络,国际标准化组织(ISO)在1978年提出了"开放系统互联参考模型",即著名的OSI/RM模型(Open System Interconnection/Reference Model)。它将计算机网络体系结构的通信协议划分为七层,自下而上依次为:物理层(Physics Layer)、数据链路层(Data Link Layer)、网络层(Network Layer)、传输层(Transport Layer)、会话层(Session Layer)、表示层(Presentation Layer)、应用层(Application Layer)。其中第四层完成数据传送服务,上面三层面向用户。
除了标准的OSI七层模型以外,常见的网络层次划分还有TCP/IP四层协议以及TCP/IP五层协议,它们之间的对应关系如下图所示:
ip地址
1)网络地址
IP
地址由网络号(包括子网号)和主机号组成,网络地址的主机号为全0,网络地址代表着整个网络。
2)广播地址
广播地址通常称为直接广播地址,是为了区分受限广播地址。
广播地址与网络地址的主机号正好相反,广播地址中,主机号为全1。当向某个网络的广播地址发送消息时,该网络内的所有主机都能收到该广播消息。
3)组播地址
D类地址就是组播地址。
先回忆下A,B,C,D类地址吧:
A类地址以0开头,第一个字节作为网络号,地址范围为:0.0.0.0~127.255.255.255;(modified @2016.05.31)
B类地址以10开头,前两个字节作为网络号,地址范围是:128.0.0.0~191.255.255.255;
C类地址以110开头,前三个字节作为网络号,地址范围是:192.0.0.0~223.255.255.255。
D类地址以1110开头,地址范围是224.0.0.0~239.255.255.255,D类地址作为组播地址(一对多的通信);
E类地址以1111开头,地址范围是240.0.0.0~255.255.255.255,E类地址为保留地址,供以后使用。
注:只有A,B,C有网络号和主机号之分,D类地址和E类地址没有划分网络号和主机号。
4)255.255.255.255
该IP地址指的是受限的广播地址。受限广播地址与一般广播地址(直接广播地址)的区别在于,受限广播地址只能用于本地网络,路由器不会转发以受限广播地址为目的地址的分组;一般广播地址既可在本地广播,也可跨网段广播。例如:主机192.168.1.1/30上的直接广播数据包后,另外一个网段192.168.1.5/30也能收到该数据报;若发送受限广播数据报,则不能收到。
注:一般的广播地址(直接广播地址)能够通过某些路由器(当然不是所有的路由器),而受限的广播地址不能通过路由器。
5)0.0.0.0
常用于寻找自己的IP地址,例如在我们的RARP,BOOTP和DHCP协议中,若某个未知IP地址的无盘机想要知道自己的IP地址,它就以255.255.255.255为目的地址,向本地范围(具体而言是被各个路由器屏蔽的范围内)的服务器发送IP请求分组。
6)回环地址
127.0.0.0/8被用作回环地址,回环地址表示本机的地址,常用于对本机的测试,用的最多的是127.0.0.1。
7)A、B、C类私有地址
私有地址(private address)也叫专用地址,它们不会在全球使用,只具有本地意义。
A类私有地址:10.0.0.0/8,范围是:10.0.0.0~10.255.255.255
B类私有地址:172.16.0.0/12,范围是:172.16.0.0~172.31.255.255
C类私有地址:192.168.0.0/16,范围是:192.168.0.0~192.168.255.255
HTTP协议
超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。 HTTP 协议包括哪些请求?
GET:请求读取由URL所标志的信息。
POST:给服务器添加信息(如注释)。
PUT:在给定的URL下存储一个文档。
DELETE:删除给定的URL所标志的资源。
HTTP 中, POST 与 GET 的区别
-
1)Get是从服务器上获取数据,Post是向服务器传送数据。
-
2)Get是把参数数据队列加到提交表单的Action属性所指向的URL中,值和表单内各个字段一一对应,在URL中可以看到。
-
3)Get传送的数据量小,不能大于2KB;Post传送的数据量较大,一般被默认为不受限制。
-
4)根据HTTP规范,GET用于信息获取,而且应该是安全的和幂等的。
-
I. 所谓 安全的 意味着该操作用于获取信息而非修改信息。换句话说,GET请求一般不应产生副作用。就是说,它仅仅是获取资源信息,就像数据库查询一样,不会修改,增加数据,不会影响资源的状态。
-
II. 幂等 的意味着对同一URL的多个请求应该返回同样的结果。
TCP/IP协议
TCP/IP协议是Internet最基本的协议、Internet国际互联网络的基础,由网络层的IP协议和传输层的TCP协议组成。通俗而言:TCP负责发现传输的问题,一有问题就发出信号,要求重新传输,直到所有数据安全正确地传输到目的地。而IP是给因特网的每一台联网设备规定一个地址。
IP层接收由更低层(网络接口层例如以太网设备驱动程序)发来的数据包,并把该数据包发送到更高层---TCP或UDP层;相反,IP层也把从TCP或UDP层接收来的数据包传送到更低层。IP数据包是不可靠的,因为IP并没有做任何事情来确认数据包是否按顺序发送的或者有没有被破坏,IP数据包中含有发送它的主机的地址(源地址)和接收它的主机的地址(目的地址)。
TCP是面向连接的通信协议,通过三次握手建立连接,通讯完成时要拆除连接,由于TCP是面向连接的所以只能用于端到端的通讯。TCP提供的是一种可靠的数据流服务,采用"带重传的肯定确认"技术来实现传输的可靠性。TCP还采用一种称为"滑动窗口"的方式进行流量控制,所谓窗口实际表示接收能力,用以限制发送方的发送速度。