说在前面的话,本系列为复学笔记,相当于作者的巩固笔记,虽然介绍的是python的基础但是更适合有一定程序设计基础,或是之前有python基础,一段时间后有些遗忘,可以用来复习,本系列对程序设计基础涉及比较少,不适合完全入门的选手。
文章目录
- Python基础
- 基础数据类型及变量
- 集合数据类型Set
- 序列数据类型
- 元组Tuple
- 字典Dict
- 字符串数据类型String
- 字符串及编码
Python基础
基础数据类型及变量
基础数据类型整数int
、浮点数float
、布尔型bool
、复数complex
等不再赘述。
下面列出一些可能存有困惑的地方:
1、Python的变量:Python变量本身类型不固定,称之为动态语言,与之对应的是静态语言。静态语言在定义变量时必须指定变量类型,如果赋值的时候类型不匹配,就会报错。由于Python的变量数据类型不固定,所以等号=
赋值语句可以把任意数据类型赋值给变量,同一个变量可以反复赋值,而且可以是不同类型的变量。
2、Python的数据类型没有存储长度的大小限制,如整数型,而某些语言的整数根据其存储长度是有大小限制的,例如Java对32位整数的范围限制在-2147483648
-2147483647
,Python的浮点数也没有大小限制,但是超出一定范围就直接表示为inf
(无限大)。
3、None:Python 中的None
是一个特殊常量,不是0
,也不是False
,不是空字符串,None表示更多的是一种不存在,是真正的空,当函数无输出时常返回None。None 可作为一个对象,该对象的类型为:NoneType
,它只是一个空值的对象,也就是一个空的对象,只是没有赋值而已。None 表示的含义,更多的是一种不存在,是真正的空,而不是空列表[]
的空,也不是空的字符串,比如一个函数没有返回值def f(): pass
,因此not None
可以表示True
。
>>> type(None)
<class 'NoneType'>
>>> id(None)
140719064431840
>>> def f():
pass
>>> f()
>>> a=f()
>>> a is None
True
>>> not None
True
4、关于常量:在Python中,通常用全部大写的变量名表示常量:
PI = 3.14159265359
但事实上PI
仍然是一个变量,Python根本没有任何机制保证PI
不会被改变,所以,用全部大写的变量名表示常量只是一个习惯上的用法,该值可以作为变量改变。
集合数据类型Set
Set为集合,无序,不包含重复元素,可以用来过滤重复数据元素作为dict的key输入。
Set的创建需要使用set()函数,而不能使用{ }创建。
>>> s=set([1,2,3])
>>> s
{1, 2, 3}
>>> a={}
>>> type(a)
<class 'dict'>
>>> type(s)
<class 'set'>
序列数据类型
Python有三种序列数据类型:列表、元组、字典
其区别可以参照下表格:
数据类型 | 是否有序 | 数据元素是否可变 |
列表List | 有序 | 可变 |
元组Tuple | 有序 | 不可变 |
字典Dict | 无序 | 可变 |
索引:对于有序序列,可以使用索引来访问每一个位置的元素。
索引从0
开始,倒序的索引从-1
开始,对于索引的使用参考下表:
L=list(range(1,101)) | 1 | 2 | 3 | … | 98 | 99 | 100 |
正序 | 0 | 1 | 2 | … | 97 | 98 | 99 |
倒序 | -100 | -99 | -98 | … | -3 | -2 | -1 |
当索引超出了范围时,Python会报一个IndexError
错误,所以,要确保索引不要越界,记得最后一个元素的索引是len(classmates) - 1
。
元组Tuple
元组指向不变性:tuple一旦初始化就不能修改,当你定义一个tuple时,在定义的时候,tuple的元素就必须被确定下来。
但是当元组中含有可变的序列类型,如tuple、dict时,可以改变序列中的元素来达到改变元组中元素的效果,但是本质上元组中的元素没有改变,即指向的元素不变。
因为tuple不可变,所以代码更安全。如果可能,能用tuple代替list就尽量用tuple。
>>> a=[3,4]
>>> t=(1,2,a)
>>> a.append(5)
>>> t
(1, 2, [3, 4, 5])
单元素元组:只有1个元素的tuple定义时必须加一个逗号,
,来消除歧义。Python在显示只有1个元素的tuple时,也会加一个逗号,
,以免你误解成数学计算意义上的括号。
>>> a=(1)
>>> a
1
>>> b=(1,)
>>> b
(1,)
在python中,多个元素赋值,默认以元组的形式进行赋值,同样交换元素值也可以使用元组进行交换,省去了临时变量交换变量值。
>>> a,b=0,1 #相当于(a,b)=(0,1) a=0 b=1
>>> a,b=b,a+b #相当于(a,b)=(b,a+b)
# t=(b,a+b)
# a=t[0]
# b=t[1]
字典Dict
字典dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,可以直接用键查找对应值,具有极快的查找速度,但需要占用大量的内存,内存浪费多。
1、dict的key必须是不可变元素且不能重复,这被称为“可哈希性”,可以用hash()
函数检测一个对象是否可哈希。
>>> hash('abc') #字符串类型为不可变类型
2688246369669087898
>>> hash((1,2,(1,1))) #元组类型也为不可变类型
-43645920702070155
>>> hash((1,[1,2])) #该数据类型中含有可变类型列表
Traceback (most recent call last):
File "<pyshell#6>", line 1, in <module>
hash((1,[1,2]))
TypeError: unhashable type: 'list'
2、一个key只能对应一个value,多次对一个key放入value,后面的值会把前面的值覆盖掉。
3、key不存在,dict就会报错,要避免key不存在的错误,有两种办法,一是通过in
判断key是否存在,二是通过dict提供的get()
方法,如果key不存在,可以返回None
,或者自己指定的value,返回None
的时候Python的交互环境不显示结果。
>>> score={'Jack':99,'Marry':78,'Bob':88,'Amy':77}
>>> score['Jack']
99
>>> score['Black']
Traceback (most recent call last):
File "<pyshell#11>", line 1, in <module>
score['Black']
KeyError: 'Black'
>>> 'Black' in score
False
>>> score.get('Black')
>>> score.get('Black',-1)
-1
4、使用序列创建字典,这里使用zip()
函数。
zip()
函数:可以将多个列表、元组或其它序列成对组合成一个元组列表,(这里很形象,就像拉链一样,把多个序列拉成每一个元素一一对应的拉链,最后形成一个有序的元组列表):
>>> L1=['one','two','three']
>>> L2=[1,2,3]
>>> zipped=zip(L1,L2)
>>> zipped
<zip object at 0x000001F488F42608>
>>> list(zipped)
[('one', 1), ('two', 2), ('three', 3)]
注意zip()
返回的是一个可迭代的zip对象。
zip
可以处理任意多的序列,元素的个数取决于最短的序列:
>>> L3=['a','b','c','d']
>>> list(zip(L1,L2,L3))
[('one', 1, 'a'), ('two', 2, 'b'), ('three', 3, 'c')]
zip也可以把给定的配对拆分,给出一个“被压缩的”序列,zip
可以被用来解压序列。也可以当作把行的列表转换为列的列表。
>>> L=list(zip(L1,L2))
>>> L
[('one', 1), ('two', 2), ('three', 3)]
>>> string,num=zip(*L)
>>> string
('one', 'two', 'three')
>>> num
(1, 2, 3)
通过zip()
将多个序列创建为字典:
mapping = {}
for key, value in zip(key_list, value_list):
mapping[key] = value
因为字典本质上也是二元元组的集合,也可以通过使用dict()
函数,配合zip()
使用:
>>> mapping = dict(zip(L1,L2))
>>> mapping
{'one': 1, 'two': 2, 'three': 3}
字符串数据类型String
字符串数据类型String本身是一种数据元素不可变的List。
对不可变对象的理解:str是不变对象,而list是可变对象。对于不可变对象str,对str a进行操作
>>> a = 'abc'
>>> a.replace('a', 'A')
'Abc'
>>> a
'abc'
虽然字符串有个replace()
方法,也确实变出了'Abc'
,但变量a
最后仍是'abc'
,要始终牢记的是,a
是变量,而'abc'
才是字符串对象!有些时候,我们经常说,对象a
的内容是'abc'
,但其实是指,a
本身是一个变量,它指向的对象的内容才是'abc'
:
当我们调用a.replace('a', 'A')
时,实际上调用方法replace
是作用在字符串对象'abc'
上的,而这个方法虽然名字叫replace
,但却没有改变字符串'abc'
的内容。相反,replace
方法创建了一个新字符串'Abc'
并返回,如果我们用变量b
指向该新字符串,就容易理解了,变量a
仍指向原有的字符串'abc'
,但变量b
却指向新字符串'Abc'
了:
所以,对于不变对象来说,调用对象自身的任意方法,也不会改变该对象自身的内容。相反,这些方法会创建新的对象并返回,这样,就保证了不可变对象本身永远是不可变的。
转义字符:字符\
经常用于转义,而字符\
需要用\\
表示,如果字符串中需要多次使用\
将会非常麻烦,Python允许用r''
表示''
内部的字符串默认不转义,这将经常运用在文件路经的表示中。
with open(r"C:\Users\pythonProject\a.txt",'r',encoding="utf-8") as f:
c = f.read()
print(c)
多行内容的表示:如果字符串内部有很多换行,用\n
写在一行里不好阅读,为了简化,Python允许用'''...'''
的格式表示多行内容。
>>> s=('''line1
line2
line3''')
>>> print(s)
line1
line2
line3
字符串及编码
编码是字符串中比较特殊的问题,我们都知道计算机只能处理0 1代码,如果想要处理文本,就必须先把文本转换为代码才能处理,这个过程即编码。
下面介绍几种常用的编码格式:
ASCII编码:最早的字符集编码,只有127个字符,包括大小写英文字母、数字和一些符号,无法表示中文。
GB2312编码:中文字符集编码,与ASCII编码不冲突。
Unicode编码:即统一码,也叫万国码,是计算机科学领域里的一项业界标准,包括字符集、编码方案等,Unicode是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。现代操作系统和大多数编程语言都直接支持Unicode。Unicode编码通常为两个字节,英文部分只需要在ASCII编码前面补一个字节的零即可,中文即其他字符需要两个或以上的字节。
UTF-8编码:可变长编码,由于Unicode表示英文字符也需要两个字节,原本使用ASCII编码只需要一个字节就可以表示,如果文本中包含大量的英文字符,UTF-8中常用的英文字母被编码为1个字节,汉字通常为3个字节,只有很生僻的字符才会被编码为4-6个字节,使用UTF-8可以比Unicode编码节省很多空间,同时与ASCII码不冲突,可以将ASCII码看做UTF-8的一部分。
使用表格对比ASCII、Unicode、UTF-8三种编码的区别:
字符 | ASCII | Unicode | UTF-8 |
A | 01000001 | 00000000 01000001 | 01000001 |
中 | 无 | 01001110 00101101 | 11100100 10111000 10101101 |