# python 变量 - 数据类型 与 数据处理篇
*python 技术栏*
本文章将介绍 python 中的一些 数据类型,以及其本身的特点和基础的使用方式。
## 目录
[TOC]

## 布尔类型
计算机中的程序执行是一个固定的流程,事实上,在这个固定流程中具有很多的分支,因此我们的程序可以在用户执行不同操作的时候产生不同的效果,最典型的例子就是点击关闭按钮之后,程序会执行关闭,点击打开按钮之后,程序会执行打开。
什么?你问我什么是分支?分段函数就是典型的分支,若您无法理解分段函数以及分支的概念,那么请思考一下,我要开电视,但是开电视分有遥控和无遥控两个情况,这个就是分支,不同的情况需要执行不同的动作。

现在我们明白了什么是分支,就以上面的图来说,其中的 `有没有遥控器` 就是个布尔,如果有就是 `True` 没有就是 `False`。
### 构造布尔
```python
a = True
b = False
```
### 逻辑运算操作符
每一个逻辑运算符会返回一个布尔值,可以进行使用计算出来的数值进行布尔计算操作。
```python
a = True
b = False
# a满足 并且 b满足
print(a and b)
# a满足 或者 b满足
print(a or b)
# 取反 代表 a not 满足
print(not a)
# 取反 代表 b not 满足
print(not b)
# 联合逻辑运算 布尔也是可以联合计算的,就行联加一样
print(a and b and (a or b))
```
## 数值类型
在计算机中,所有的数据对象其都是对应的某个类型的,而在python中,支持进行数值运算的数据类型就叫做数值类型,这样的类型可以进行基本的数值计算操作,
### 整数 int
整数是可以被 `1` 整除的数字,人类社会中比较常见的一种数学知识,您需要先学习什么是数字才可以学习此章节。
#### 数值类型构造
python 是一个面向对象的语言,这类语言的典型操作就是每一个对象都具有一个可以将其构造出来的函数,我们调用这类函数之后,函数被我们调用之后,我们才可以获取到它的对象,也称之为构造函数。
`A:` "我想要一个对象,我对对象的要求就是没有小数点,且实数是 `1`"
`B:` "你别和我说 和 `int(x)` 去说,它是制造咱的工厂"
`A:` "好吧"
`A -> int(x):` "我想要一个对象,我对对象的要求就是没有小数点,且实数是 `1`"
`int(x):` "行"
##### 使用构造函数 - int(x)
```python
# int(x) 函数中 x 可以是字符串 也可以是一个数值
# 大部分情况下,人们通常使用它来进行数值之间的强制转换
a1 = int("1024")
a2 = int(1024)
print(a1, a2)
```
##### 使用隐式的构造函数
```python
# 当然,如果您不需要使用构造函数进行类型转换,完全可以不调用构造函数
a = 1024
print(a)
```
### 浮点数 float
浮点数就是小数,没啥可说的。
#### 数值类型构造
构造函数是 `float(x)` 使用方法也没啥区别。
##### 使用构造函数 - float
```python
a1 = float("1024.123")
a2 = float(1024.123)
print(a1, a2)
```
##### 使用隐式的构造函数
```python
a = 1024.123
print(a)
```
#### 基本运算
数值类型之间可以相互进行基本运算,在这里我们将会逐一进行演示。
##### 基本运算操作符
运算操作成功之后会返回一个新的数值,新的数值可以继续使用。
```
a = 1024.123
b = 1024
print(a + b)
print(a - b)
print(a * b)
print(a / b)
print(a % b)
```
##### 比较运算操作符
比较操作成功之后会返回一个新的布尔值,新的布尔值可以继续使用,至于如何使用,您需要阅读 [布尔类型章节](#布尔类型),其中详细记载了布尔运算的主要作用。
其中介绍了遥控器的例子,发现 `有没有xxx` 以及 `是不是xxx` 都属于布尔数值。所以在这里,我们就是判断的`a 是不是大于c` 之类的操作。
```python
a = 1024.123
c = 1024
d = None
# 大于
b1 = a > c
# 小于
b2 = a < c
# 大于等于
b3 = a >= c
# 小于等于
b4 = a <= c
# 等于
b5 = a == c
# 不等于
b6 = a != c
# 为空判断
b7 = d is None
# 不为空判断
b8 = d is not None
```
## 字符串类型
在电脑中,并不存在字符的概念,因此为了解决这个问题,我们使用 ASCII 来充当电脑中数字到字符的翻译器,可以根据 ASCII 来实现将数值转换为字符,而很多个字符串联起来,就形成了一句话,这就是字符串。
### 构造字符串
```python
# 使用构造和隐式构造来创建两个字符串
a = str("this is a string")
b = "this is a string"
# 使用拼接操作来创建一个新字符串
c = "b 变量中存储的是:" + b
# 使用 format 函数构造一个新字符串
d = "b 变量中存储的是:{}".format(b)
# 使用插值表达式 构造一个新字符串
e = f"b 变量中存储的是:{b}"
```
### 常用的函数
#### startswith - 字符串是否以 x 开头
返回值:布尔类型
此函数用于判断一个字符串是否以指定的某些字符串开头。在很多数据处理领域会很有用,例如我们要查询姓 `xxx` 以及 `xxx` 的人。
```python
# 准备字符串
s1 = "this is a string"
s2 = f"s1 is a string, data = 【{s1}】"
s3 = "hello~~~~"
# 判断 s1 和 s2 是否以 this 开头
print(s1.startswith("this"))
print(s2.startswith("this"))
# 判断 s1 s2 s3 是否以 this or th or s1 开头
word = ("this", "th", "s1")
print(s1.startswith(word))
print(s2.startswith(word))
print(s3.startswith(word))
```
#### endswith - 字符串是否以 x 结尾
返回值:布尔类型
此函数用于判断一个字符串是否以指定的某些字符串结尾。在很多数据处理领域会很有用,例如我们要查询名 `xxx` 以及 `xxx` 的中国人。
```python
# 准备字符串
s1 = "this is a string"
s2 = f"s1 is a string, data = 【{s1}】"
s3 = "hello~~~~"
# 判断 s1 和 s2 是否以 string 结尾
print(s1.endswith("string"))
print(s2.endswith("string"))
# 判断 s1 s2 s3 是否以 string or g or s1 结尾
word = ("string", "g", "s1")
print(s1.endswith(word))
print(s2.endswith(word))
print(s3.endswith(word))
```
#### 索引操作
返回值:字符串
字符串的本质是一个类似列表和集合的数据结构,它存储的就是大量的字符,也支持进行索引操作,接下来就是一个语法示例。
```
# 在下面展示的语法中,就是提取出区间 [x:y) 的元素 且每递增s次索引提取一次
# x 要获取的起始元素索引-默认0
# y 要获取的终止元素索-默认length的值
# s 提取元素时的索引递增步长-默认1
字符串变量[<x>:<y>:<s>]
```
下面是一个使用实例
```python
# 准备字符串
s1 = "this is a string"
# 打印出字符串中第 1 索引的字符
print(s1[1])
# 打印出字符串中第 1~10 索引的字符
print(s1[1:10])
# 打印出字符串中奇数索引位的元素
print(s1[::2])
```
下面是输出的结果
```
h
his is a
ti sasrn
```
#### find - 查找子字符串 并返回索引
返回值:数值
此函数用于查找字符串A中的B字符串,会返回您指定的字符串B中的第一个字符在A中的索引位置,如果找不到会返回 `-1`。
```python
# 准备字符串
s1 = "this is a string data!!!"
# 查找 string 在 s1 中出现的位置
index = s1.find("string")
print(index)
# 利用这个特性 搭配 索引操作,我们可以直接将 string 以及后面的数据提取出来
print(s1[index:])
# 如果找不到会返回 -1
if s1.find('zhao') == -1:
print("s1 中没有找到 zhao")
else:
print("s1 中有 zhao 的出现")
```
下面就是计算结果
```
10
string data!!!
s1 中没有找到 zhao
```
#### replace - 替换字符
返回值:字符串
```python
# 准备字符串
s1 = "this is a string data!!!"
# 将所有的空格替换为 -
s2 = s1.replace(' ', '-')
print(s2)
```
#### split - 字符串分割
返回值:list[str]
```python
# 准备字符串
s1 = "this is a string data!!!"
# 按照空字符进行切分
s_array1 = s1.split(' ')
print(s_array1)
```
下面是输出结果
```
['this', 'is', 'a', 'string', 'data!!!']
```
#### join - 字符串与列表交叉拼接
返回值:字符串
在某些情况下,我们希望将一个 列表中所有的字符串进行拼接,成为一个字符串对象,我们可以像下面一样做。
```python
# 准备字符串
s1 = " & "
s2 = ['this', 'is', 'a', 'string', 'data!!!']
# 将 s1 和 s2 交叉拼接
s3 = s1.join(s2)
# 交叉拼接就是值得 s2 的每两个元素中间使用 s1 拼接
print(s3)
```
下面是一个示例
```
this & is & a & string & data!!!
```
#### strip - 字符首尾清洗
返回值:字符串
此函数用于将字符串的首尾进行清洗和删除,实现字符串清洗。
```python
s = " +This is a string, like human text!!! "
# 去除首尾的空格
print(s.strip(' '))
# 去除首尾的标点符号和空格
print(s.strip(' !+'))
```
下面是计算结果
```
+This is a string, like human text!!!
This is a string, like human text
```
#### count - 子字符串统计
返回值:整形数值
```python
s = " +This is a string, like human text!!! "
# 统计字符串中出现了多少个 is
r = s.count('is')
print(r)
```
#### format - 格式化函数
返回值:字符串
> 格式化函数相关知识比较多,在 [《 字符串格式化 变量&字符串 python 篇》](https://www.lingyuzhao.top/?/linkController=/articleController&link=35233898#字符串格式化%20-%20{}%20&%20format) 文章中有详细的记载!
### 案例
=未完待续=
#### 将字符串的数量限制为取前 x 个数值。
```
# 输入一个字符串 要求输出它的 前 4 个字符
a = input()
b = print(a[:4])
```
#### 将数学表达式修正
我们在这会提供一个数学表达式 `1 + 2 + (8 / 0`,很显然,这个是错误的,现在需要我们使用一切手段来通过 python 修正它。
```python
import mathematical_expression
a = "1 + 2 + (8 / 0"
# 去除括号
b = a.replace("(", "")
c = b.replace("0", "2")
# 尝试计算
c1 = mathematical_expression.get_instance(mathematical_expression.bracketsCalculation2, "c")
print("计算结果:" + str(c1.calculation(c)))
```
#### 字符串反转
输入一个字符串,并使用相反的方向将字符串输出,例如 `zhao` 输出 `oahz`.
```python
s = "zhao"
# 将索引 [-5, 0) 范围中的数据反向提取出来(-1的步长代表反向)
print(s[:-5:-1])
```
## 集合与数据结构类型
Python 的数据结构是内置的一系列容器,用于存储和组织其他数据。这些数据结构对于处理和操作数据至关重要,Python 提供了丰富的选择来满足不同场景的需求
### 列表 - List
列表是最基本且灵活的数据结构之一,可以存储任何类型的数据(整数、浮点数、字符串等),并且元素可以修改。列表是有序的,元素可以通过索引访问。列表用方括号 [] 表示,例如:[1, 2, 3, 'four', 5.6]。
#### append(x)
操作类型:在源对象中操作
在列表末尾添加一个元素`x`
```python
a = [1, 2, 3]
a.append(4)
print(a) # 输出: [1, 2, 3, 4]
```
#### extend(iterable)
操作类型:在源对象中操作
在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)。
```python
a = [1, 2, 3]
b = [4, 5, 6]
a.extend(b)
print(a) # 输出: [1, 2, 3, 4, 5, 6]
```
#### insert(i, x)
操作类型:在源对象中操作
将一个对象`x`插入到列表中第`i`索引的位置。
```python
a = [1, 2, 3]
a.insert(1, 4)
print(a) # 输出: [1, 4, 2, 3]
```
#### remove(x)
操作类型:在源对象中操作
移除列表中第一个匹配项`x`。
```python
a = [1, 2, 3, 2]
a.remove(2)
print(a) # 输出: [1, 3, 2]
```
#### pop([i])
操作类型:在源对象中操作
移除并返回列表中的指定索引处的元素,如果没有指定索引,则默认删除并返回最后一个元素。
```python
a = [1, 2, 3]
b = a.pop()
print(b) # 输出: 3
print(a) # 输出: [1, 2]
```
#### index(x[, start[, end]])
操作类型:读取源对象
返回列表中第一个匹配项x的索引值,如果找不到则抛出异常。
```python
a = [1, 2, 3, 2]
print(a.index(2)) # 输出: 1
```
#### count(x)
操作类型:读取源对象
统计列表中元素x出现的次数。
```python
a = [1, 2, 3, 2]
print(a.count(2)) # 输出: 2
```
#### sort(key=None, reverse=False)
操作类型:在源对象中操作
对原地对列表进行排序,默认升序排列.
```python
a = [3, 1, 2]
a.sort()
print(a) # 输出: [1, 2, 3]
```
#### reverse()
操作类型:在源对象中操作
反转列表中的元素。
```python
a = [1, 2, 3]
a.reverse()
print(a) # 输出: [3, 2, 1]
```
#### copy()
操作类型:新对象
返回列表的一个浅拷贝。
```python
a = [1, 2, 3]
b = a.copy()
print(b) # 输出: [1, 2, 3]
```
### 元组 - Tuple
元组与列表类似,也是有序的元素集合,但元组一旦创建后就不能修改(即不可变)。元组使用圆括号 () 表示,例如:(1, 2, 3)。虽然元组不如列表灵活,但在不需要修改数据且追求性能的情况下更为适用。
### 字典 - Dictionary
字典是一种可变的、无序的键值对集合。每个键(key)都是唯一的,且与一个值(value)相关联。字典用花括号 {} 表示,例如:{'name': 'Alice', 'age': 30}。字典非常适合用于快速查找和访问数据。
### 集合 - Set
集合是一个无序的、不重复元素的集合。它用于去重或执行集合运算(如并集、交集、差集等)。集合用花括号 {} 或 set() 函数表示,但当用花括号时,不能有逗号分隔的空项,例如:{1, 2, 3} 或 set([1, 2, 3])。
### 字符串 - string
虽然严格来说字符串属于序列类型,但因其在处理文本数据时的重要性而常被单独提及。字符串是由字符组成的序列,可以进行索引、切片等操作。字符串可以用单引号 ' '、双引号 " " 或三引号(多行字符串)''' ''' 或 """ """ 来表示。
本章节可以直接在 [字符串类型](# 字符串类型) 章节中查看到相关的知识。
### 区间 - Range
范围对象表示一个数字序列,通常用于循环中。在 Python 3 中,range() 生成一个迭代器,而不是列表。例如,range(5) 生成从 0 到 4 的整数序列。
## File 类型
### 读取一个文件
首先我们准备了一个文件,文件的路径为 `./test`,下面是文件内容。
```
aaaaaaaaaa
bbbbbbbbbbb
ccccccccca
```
```
# 将 ./test 文件的文件对象获取到
f = open("./test", mode='r')
# 全读取出来
print("\nread")
print(f.read())
# 读取出所有的行,并将每行做一个元素 组合为列表
print("\nreadlines")
print(f.readlines())
# 读取出来当前指针对应的一行 每次调用都读取一行 直到读取结束
print("\nreadline")
print(f.readline())
# 释放资源
f.close()
```



#### 指定编码的读取一个文件
在计算机的世界中,本就不存在字符,字符都是使用一些数字和编号来标记的字典,这个字典叫做编码集,现在最常用的就是 `UTF8` 和 `GBK` 编码,当我们尝试**使用 GBK 读取 UTF-8 的字符的时候,会乱码,反之亦然**。
例如这里的一个文本,其中可以看到有一句话,但是这个句子在记事本中和终端显示是不一样的,在终端中发生了乱码,这是因为,**终端的编码是 GBK 而 文件的编码是 UTF-8**。
我们必须要保证读取的编码集和字符串的编码集一致!

而在 python 中,我们是可以将一个字符串变为指定的格式的,就拿刚才的例子来说,由于文件内容是 UTF-8,如果希望读取到字符串,就需要使用 UTF-8 读取,下面是一个例子。
```python
# # 获取到文件对象 TODO 不设置 encoding encoding 默认是 当前操作系统的编码 我们的是 GBK 无法解析 UTF-8 的文件
# f = open(r"C:\Users\zhao\Downloads\这是一个中文字符串.txt", "r")
# # 获取到文件的字符串
# print(f.read())
# f.close()
# 获取到文件对象 TODO 使用 encoding 手动设置读取文件时的编码集
f = open(r"C:\Users\zhao\Downloads\这是一个中文字符串.txt", "r", encoding='UTF-8')
# 获取到文件的字符串
print(f.read())
f.close()
```
------
***操作记录***
作者:[python](https://www.lingyuzhao.top//index.html?search=33 "python")
操作时间:2024-06-03 17:23:47 星期一
事件描述备注:保存/发布
中国 天津
[](如果不需要此记录可以手动删除,每次保存都会自动的追加记录)