一、变量
什么是变量?当你把值赋给一个名字时,它会存储在内存中,把这块内存称为变量。
使用变量时需要注意以下几点:
- 在使用变量之前,需要先对其赋值
- 变量名可以包括数字、字母、下划线,但变量名不能以数字开头
- 变量名中字母可以是大写或小写,但大小写是不同的
- 等号是赋值的意思,左边是名字,右边是值,不可弄反了
- 变量的命名可以是任意合法的名字,但尽量见名知义
二、数值类型
类型 | 英文简写 |
---|---|
整型 | 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分配到了新的内存地址,因此,真正的拷贝是要使用分片的方法!!!