当前位置: 代码迷 >> 综合 >> python基础——数据类型
  详细解决方案

python基础——数据类型

热度:95   发布时间:2023-09-05 17:54:39.0

一、变量

什么是变量?当你把值赋给一个名字时,它会存储在内存中,把这块内存称为变量。
使用变量时需要注意以下几点:

  • 在使用变量之前,需要先对其赋值
  • 变量名可以包括数字、字母、下划线,但变量名不能以数字开头
  • 变量名中字母可以是大写或小写,但大小写是不同的
  • 等号是赋值的意思,左边是名字,右边是值,不可弄反了
  • 变量的命名可以是任意合法的名字,但尽量见名知义

二、数值类型

类型 英文简写
整型 int, 例:a=1
浮点型 float, 例:b=1.1
布尔型 bool, 例:c=True
复数型 complex, 例:d=1+2j

三、序列类型

python的序列类型非常丰富,下面我们着重介绍一下字符串、列表以及元组

字符串

1、字符串的定义

定义:字符串(str)也叫文本,创建字符串时,需在字符两边加上引号,可以是单引号或双引号,当然,如果是多行文本的情况下,可以使用三引号。

例:

>>> 5 + 8
13
>>> '5' + '8'
'58'

如果是直接让两个数字相加,那么Python会直接将数字相加后的结果告诉你,但是如果在数字的两边加上了引号,就变成了字符串的拼接,这正是引号带来的差别。

那么问题来了,如果字符串中需要出现单引号或双引号怎么办??

>>> 'Let's go'
SyntaxError: invalid syntax

像上边这样写Python会误会你的意思,从而产生了语法错误。
第一种解决方法,也比较常用,使用转移符号()对字符串中的引号进行转义:

>>> 'Let\'s go'
"Let's go"

第二种方法,用双引号包含单引号:

>>> "Let's go"
"Let's go"
2、原始字符串

听起来反斜杠好像是个好东西,不妨打印下C:\now试试

>>> print('C:\now')
C:
ow

这个打印结果貌似和我们预期的不太一样呢,原因是反斜杠()和后边的字符(n)恰好转移之后构成了换行符(\n)

方法①(使用反斜杠转义反斜杠):

>>> print('C:\\now')
C:\now

方法②(使用原始字符串):

>>> string = r'C:\now'
>>> string
'C:\\now'
>>> print(string)
C:\now

注意:无论是否原字符串,都不能以反斜杠作为结尾,反斜杠放在字符串的末尾表示该字符串还没有结束,换行继续的意思。

3、字符串的常用方法
  • 字符串可实现索引和分片
>>> str1 = 'I love you'
>>> str1[0]
'I'
>>> str[:6]
'I love'
  • split()和join()方法:
 >>> str1 = 'I love you'>>> str1.split(' ')['I', 'love', 'you']>>> str2 = '_'.join('hello')>>> str2'h_e_l_l_o'>>> str2.split('_')['h', 'e', 'l', 'l', 'o']
方法 含义
count(sub) 返回sub在字符串里边出现的次数
find(sub) 检测sub是否包含在字符串中,如果有则返回索引值,否则返回-1
isdigit() 如果字符串中只包含数字字符,则返回True,否则返回False
replace(old, new) 把字符串中的old子字符串替换成new子字符串
lower() 转换字符串中所有大写字符为小写
upper() 转换字符串中所有小写字符为大写
startswith(pre) 检测字符串是否以pre开头,是则返回True,否则返回False
endswith(sub) 检测字符串是否以sub子字符串结束,是则返回True,否则返回False
4、格式化

格式化字符串:就是按统一的规格去输出一个字符串

  • format()
    format()方法接受位置参数和关键字参数
>>> "{0} like {1} and {2}".format('I', 'rap', 'basketball')
'I like rap and basketball'

如上所示,字符串中的{0},{1},{2}应该跟位置有关,依次被format()的三个参数替换,那么format()的三个参数就叫位置参数,那位置参数又是什么呢?再来看一个例子

>>> "{a} love {b} and {c}".format(a='I', b='rap', c='basketball')
'I love rap and basketball'

{a},{b},{c}就相当于三个标签,format()将参数中等值的字符串替换进去,这就是关键字参数啦!也可结合位置参数和关键字参数一起使用:

>>> "{0} love {b} and {c}".format('I',  b='rap', c='bascketball')
'I love rap and basketball'

但是要注意的是,如果将位置参数和关键字参数综合一起使用,那么位置参数必须在关键字参数之前,否则就会报错!

5、格式化操作符
  • python格式化符号及含义
符号 含义
%c 格式化字符及其ASCII码
%s 格式化字符串
%d 格式化整数
%o 格式化无符号八进制数
%x 格式化无符号十六进制数
%X 格式化无符号十六进制数(大写)
%f 格式化浮点数字,可指定小数点后的精度
%e 用科学计数法格式化浮点数
%E 作用同%e,用科学计数法格式化浮点数
%g 根据值的大小决定使用%f或%e
%G 作用同%g,根据值的大小决定使用%f或%E
6、python的转义字符及含义
符号 含义
\’ 单引号
\" 双引号
\a 发出系统响铃声
\b 退格符
\n 换行符
\t 横向制表符(TAB)
\v 纵向制表符
\r 回车符
\f 换页符
\o 八进制代表的字符
\x 十六进制代表的字符
\0 表示一个空字符
\\ 反斜杠

列表

1、创建列表
  • 创建一个空列表
>>> temp = []
  • 创建一个都是数字的列表
>>> number = [1, 2, 3, 4, 5]
  • 创建一个鱼龙混杂的列表
>>> mix = [1, '哈哈', 3.1415926, [1, 2, 3]]
2、向列表添加元素
  • append(): 只能向列表末尾添加一个
>>> number = [1, 2, 3]
>>> number.append(4)
>>> number
[1, 2, 3, 4]

可以看到,参数4已经被添加到列表number的末尾了

  • extend(): 像列表中末尾添加多个,它的参数一般为一个列表
>>> number.extend([5, 6])
>>> number
[1, 2, 3, 4, 5, 6]
  • insert(a, b): a代表在列表中的位置,b代表在这个位置要插入的元素
    不妨来试一下让数字0出现在列表number的最前边:
>>> number.insert(1, 0)
>>> number
[1, 0, 2, 3, 4, 5, 6]

啊哈??这跟我们想要的不太一样啊,怎么插入后0还是在1的后边呢?其实是这样的:凡是顺序索引,python均从0开始,同时这也是大多数编程语言约定俗成的规范。
所以,正确的做法应该是:

>>> number = [1, 2, 3]
>>> number.insert(0, 0)
>>> number
[0, 1, 2, 3]
3、向列表获取元素

跟数组一样,可以通过元素的索引值(index)从列表获取单个元素,注意,列表的索引值是从0开始的。

>>> name = ['张三', '李四', '王五', '赵六']
>>> name[0]
'张三'
>>> name[3]
'赵六'

那按照这个方法让‘张三’和‘赵六’的位置互换

>>> name[0], name[3] = name[3], name[0]
>>> name
['赵六', '李四', '王五', '张三']
4、从列表中删除元素
  • remove(): 指定删除列表中的单个元素,若元素不存在则报错
>>> number = [1, 2, 3]
>>> number.remove(1)
>>> number
[2, 3]

remove()方法并不能指定删除某个列表中某个位置的元素,这时候就要用del来实现

>>> number = [1, 2, 3]
>>> del number[1]
>>> number
[1, 3]

注意:del是一个语句,不是一个列表的方法,所以你不必在他后边加上小括号()。另外,如果你想删除整个列表,还可以直接用del加列表名删除。

>>> del number
>>> number
NameError: name 'number' is not defined
  • pop(): 默认删除列表的最后一个元素
>>> number = [1, 2, 3]
>>> number.pop()
3
>>> number
[1, 2]

当你为它加上一个索引值作为参数的时候,它会删除这个索引值对应的元素

>>> num = [1, 2, 3]
>>> num.pop(0)
1
>>> num
[2, 3]
5、列表分片

利用索引值,每次只能从列表中获取一个元素,如果需要一次性获取多个元素,有没有办法实现呢??这时候就要用到我们的分片(slice)啦!!!

>>> num = [1, 2, 3, 4, 5]
>>> num[0:2]
[1, 2]

很简单吧,只不过是用一个冒号隔开两个索引值,左边是开始位置,右边是结束位置,但是要注意,结束位置上的元素是不包含的,左开右闭。
python素以‘简洁’闻名于世,列表分片也是可以简写的。

>>> num[:3]
[1, 2, 3]
>>> num[1:]
[2, 3, 4, 5]
>>> num[:]
[1, 2, 3, 4, 5]

如果没有开始位置,python会默认开始位置是0。同样道理,如果要得到从指定索引值到列表末尾的所有元素,把结束位置省去即可。如果没有放入任何索引值,而只有一个冒号,将得到整个列表的拷贝。

注意:列表分片就是建立原列表的一个拷贝(或者说副本),所以如果你想对列表做出某些修改,但同时还想保持原来的那个列表,那么直接使用分片的方法来获取拷贝就很方便啦!

分片操作实际上还可以接收第三个参数,其代表的是步长,默认情况下,该值为1,来试试将其改为2会有什么效果?

>>> list1 = [1, 2, 3, 4, 5, 6, 7, 8]
>>> list1[0:5:2]
[1, 3, 5]

如上所示,本来去取出的应该是[1, 2, 3, 4, 5],当步长设置为2后变为[1, 3, 5]了,因为它是按每两个元素取前面一个的规则来选取的。
如果将步长设置为负数,例如-1,结果会怎样呢??不妨试试看:

>>> list1[::-1]
[8, 7, 6, 5, 4, 3, 2, 1]

是不是很有意思??这里步长设置为-1,就相当与复制一个反转的列表。

6、列表的一些常用方法补充
  • count(): 计算它的参数在列表中出现的次数
>>> num = [1, 2, 1, 4, 1]
>>> num.count(1)
3
>>> num.count(0)
0
  • index(): 返回它的参数在列表中的位置
>>> num = [1, 2, 3]
>>> num.index(1)
0
  • reverse(): 将整个列表原地翻转
>>> num = [1, 2, 3]
>>> num.reverse()
>>> num
[3, 2, 1]
  • sort(): 用指定的方式对列表的成员进行排序,默认不需要参数,从小到大,当使用参数reverse=True时,按从大到小排序
>>> num = [1, 0, 3, 4, 2]
>>> num.sort()
>>> num
[0, 1, 2, 3, 4]
>>> num.sort(reverse=True)
>>> num
[4, 3, 2, 1, 0]
7、关于分片拷贝概念的补充

前面提到过使用分片创建列表的拷贝:

>>> a = [1, 3, 2, 4]
>>> b = a[:]
>>> b
[1, 3, 2, 4]
>>> c = a
>>> c
[1, 3, 2, 4]

看似一样,对吧??但事实上呢??做以下修改后,大家再看看差别:

>>> a.sort()
>>> a
[1, 2, 3, 4]
>>> b
[1, 3, 2, 4]
>>> c
[1, 2, 3, 4]

可以看到当a排序后,使用分片方式得到的b并没有发生改变,而通过直接赋值得到的c却随着a的改变而改变了,这是为啥呢??我们用查看它们各自的id看看

>>> id(a)
2987563179272
>>> id(b)
2987563178696
>>> id(c)
2987563179272

可以看到,a和c的内存地址是一样的,而b却跟它两不一样,这下明白了把,通过赋值方式得到的c并没有给它分配新的内存地址,而是使用了原来a的,而通过切片方式得到的b分配到了新的内存地址,因此,真正的拷贝是要使用分片的方法!!!