@pluto-the-lost
2020-10-16T03:18:08.000000Z
字数 4745
阅读 35
从零开始的Python
这里只说各种python里的数据结构和他们的用法,如果想了解底层是怎么回事,在这里:数据结构基础知识
(这节看不懂可以跳过)
动态语言意思是“变量和数据类型不绑定,可以动态切换”。反过来说其他的一些语言,一个变量生成的时候是什么数据类型,它一辈子就只能是这个类型。举个例子
# 这是python代码
a = 1
a = '1' # 先定义a为数字,再改成字符串,这是可以的
print(a) # 会输出'1'
# 这是C++代码
int main(){
int a=1; # 生成a的时候,它是数字
a = '1';
cout << a; # 会输出49,这是字符'1'的ascii码,程序自动把字符'1'转成了数字
char b='1';
cout << b; # 会输出'1'
}
# 注:cout就是c++里的print
所以python还是很方便的
和前置课程里说的一样,python里的基础数据类型也是这么几个:整数、浮点数、字符串、布尔值、空值
(字符和指针被藏起来了,不让程序员直接看见,但是很多高级数据结构会间接地用到它们)
下面是生成这些数据类型的方法
a = 1 # 整数
b = 1.0 # 浮点数,也可以用“b = float(a)”
c = '123' # 字符串,单双引号都可以,但是要配对
d = True # 布尔值,假是False
e = None # 空值
注意空值是不会显示在变量观察区的
内建函数的意思是类自带的函数,在下一个篇章会有详细介绍(现在还没有,不用点过去了)。现在可以暂时理解成这些数据天生具有的一些功能,就像人天生就会呼吸
调用类的某个内建函数,要通过这个数据类型的一个变量,在变量名后面打上小数点,再接上内建函数名和必须的参数。在一般的IDE中,打上小数点再按Tab,就能看到都有哪些函数了
显然不同类型的内建函数不一样,常用的内建函数包括但不限于
a = 123
a.bit_length() # 返回变量a占了多少比特的内存空间,这里返回7
# bit_length() 这个函数每个数据类型都会有,后面就不说了
a = 1.5
a.is_integer() # 判断a是不是整数,这里返回False,如果a=1.0就返回True
a.as_integer_ratio() # 把a表示成两个整数的商,这里返回(3,2)
# 这个可丰富了,做好心理准备
a = 'abc'
a.capitalize() # 首字母大写,这里返回'Abc'
a.casefold() # 返回全小写的字符串
a.count('a') # 数字符串里出现某个子串的次数
a.find('a') # 返回字符串里出现某个字串的位置
a.isdigit() # 判断字符串是不是完全由数字组成,包含小数点也不行
a.islower() # 判断字符串是不是完全由小写字母组成,相对还有isupper()
a.strip() # 去掉字符串前后的空格
a.startswith('a') #判断a是不是由某个字串开头的,对应的还有endswith()
字符串还有很多很多的内建函数,可以实现相当丰富的操作,具体可见python字符串内置函数
字符串可以说是python里最重要的数据类型之一了。python的常用场景是数据分析、网络爬虫、机器学习、网页开发等领域,几乎全部要和大量字符串打交道。比如
对字符串的基础操作通常包括【去除杂字符、分割和拼接、查找和替换、编码和解码】等,其中最有技术难度的是“查找”
虽然找一个特定的字串很容易,但是通常我们的需求都是【寻找符合某种模式的字串】。比如网页爬虫拿到一个html,我想知道这个网页都链接到了哪些其它网页,那么我是想在html文件中寻找“以https://”开头,以“.com/.cn/.en/.us/.org/...”等结尾的子串
这个功能的实现并不简单,需要用到“正则表达式”。后面的篇章会详细介绍
## 3. python自带的复合数据类型
就像在前置课程里说的,所有其它类型都是上述基础类型的结合、变换和应用。这里只介绍一些最重要的
(不看也行:元组是数组,列表是动态数组,有关知识在这里)
# 生成元组
a = (1,2,3,4,5)
b = (1,'2',True) # 元组的元素可以是不同数据类型
c = (a,b) # 元组的元素甚至可以是元组
d = a + b # 会得到(1,2,3,4,5,1,'2',True),把两个元组拼在一起
e = () # 空的元组也可以噢,更建议使用e = tuple()生成空元组
# 调用元组的元素,也叫【索引】
a[0] # 返回1,python里的索引都是从0开始的,所以a[0]是取a元组的第一个元素
a[1:4] # 返回(2,3,4),:号表示取中间的所有元素,含头不含尾(这个设定相当坑爹)
c[0][6] # c[0]返回a,再接一个[1]返回a的第二个元素,即2
# 生成列表和生成元组完全一样,只是把小括号换成中括号
a = [1,3,2,4,5]
# 列表的索引和元组完全一样
# 列表的内建函数,这可就不一样了
a.append(6) # 把一个元素加在列表末尾
#【注意】这个函数返回None,但是a现在变成了[1,3,2,4,5,6]
a.pop() # 返回最末尾的元素6,同时把它从列表里删除
#【注意】现在a又变回了[1,3,2,4,5]
# 为了方便,我们之后假定每个函数作用的a一直是[1,3,2,4,5]吧
a.insert(2,6) # 在idx=2的位置插入一个6,a变成[1,3,6,2,4,5]
a.remove(5) # 删掉【第一个】值为5的元素,a变成[1,3,2,4]
a.sort() # 从小到大排序,a变成[1,2,3,4,5]
a.reverse() # 列表前后翻转,a变成[5,4,2,3,1]
a = [1,2,3,4,5] # 这里换成元组(1,2,3,4,5)也是一样的
# 直接遍历每个值
for i in a:
print(i)
# 通过索引遍历
for idx in range(0,len(a)): # len(a)返回5,即列表的长度,range(0,5)返回(0,1,2,3,4)
print(a[idx])
为什么要用索引呢,一是有时候我们会想知道现在遍历到第几个了,二是这样可以在循环中对元素做改动。比如循环的内容可以变成"a[idx] = a[idx] + idx",这样a就会变成[1,3,5,7,9]
而"for i in a"那种遍历法只能看,不能改,即使你的循环内容写的是"i = i + i",a也不会变。背后的原理很复杂,涉及到传值和引用,先记住就行
当然如果你不想知道遍历到了第几个,也不打算改内容,那就用第一种嘛,方便
(不看也行:集合和字典都是哈希表,其中集合以值作为哈希函数的输入,字典以键作为哈希函数的输入)
# 集合的生成
a = set(['diandian', 'diandian', 'xiangxiang'])
a
# Out[37]: {'diandian', 'xiangxiang'}
a = {'diandian', 'xiangxiang', 'xiangxiang'} # 这样也是一样的
# 字符串输入就很神奇
a = set('xyzxayabc')
a
# Out[38]: {'a', 'b', 'c', 'd', 'e', 'f'}
# 集合的内建函数
a = set('abcabcdef')
a.add('g') # 加入一个元素
a.discard('g') #删除一个元素
# 集合的运算
set1 = set(['a','b'])
set2 = set(['b','c'])
set1 & set2 # 交集,返回{'b'}
set1 | set2 # 并集,返回{'a','b','c'}
set1 ^ set2 # 异或,返回{'a','c'}
set1 - set2 # 做差,返回{'a'}
# 集合的遍历不可以用索引法,只能这样
a = set('abcabcdef')
for c in a:
print(c)
# 字典的生成和索引
loveArrow = {'..':'xx', 'xx':'..'}
loveArrow['..']
# Out[46]: 'xx'
loveArrow['xx']
# Out[47]: '..'
# 字典的内建函数
a = {'first':'a', 'second':'b'}
a['first'] = 'new value' # 修改某个值
a['third'] = 'c' # 创建新的键值对(key-value pair)
a.pop('third') # 根据键删除某个键值对
a.keys() # 返回字典所有的键
a.values() # 返回字典所有的值
a.items() # 返回字典所有的键值对,以元组(key,value)的形式
# 字典的遍历
a = {'first':'a', 'second':'b'}
# 根据键遍历
for k in a:
print(k)
# 根据值遍历
for v in a.values():
print(v)
# 根据键值对遍历:
for k,v in a.items():
print(k,v)
(碰到再写吧)
很多数据类型储存的内容可以是一样的,只是储存数据的格式不同。针对这种情况,python提供了很方便的数据类型转换方法
# 基本类型间的相互转换
a = 123
b = float(a) # 整数转浮点数,b是123.0
c = str(a) # 整数转字符串,c是'123'
d = bool(a) # 整数转布尔值,d是True,除了0以外的数字转布尔都是True
e = int(c) # 字符串转整数,e是123
f = int(d) # 布尔值转整数,f是1
# 复合类型间的相互转换
a = (1,2,3,1,2)
b = list(a) # b是[1,2,3,1,2]
c = set(a) # c是{1,2,3}
(可以先不看,现在看了也很难理解,以后写程序的时候会碰到想破脑袋也不知道怎么回事的bug,八成就是在这出了问题,到时再回来看)