Python训练营 Task2 Python基础入门:Python基础练习:数据结构大汇总 学习笔记
一、学习知识点概要
对python的基本了解
列表、元组、字符串、字典、集合、序列
- 列表
<class 'list'>
- 元组
<class 'tuple'>
- 字典
<class 'dict'>
- 集合
<class 'set'>
- 字符串
<class 'str'>
二、学习内容
1、Python 是一种通用编程语言,其在科学计算和机器学习领域具有广泛的应用。
2、列表
2.1 列表的定义:列表是有序集合,没有固定大小,能够保存任意数量任意类型的 Python 对象,语法为 [元素1, 元素2, ..., 元素n]
。
- 关键点是「中括号 []」和「逗号 ,」
- 中括号 把所有元素绑在一起
- 逗号 将每个元素一一分开
2.2 列表的创建:
- 普通列表的创建
- 利用
range()
创建列表
- 利用推导式创建列表(由于list的元素可以是任何对象,因此列表中所保存的是对象的指针。)
- 混合列表的创建
- 创建空列表 (列表内容可更改 (mutable),因此附加 (
append
,extend
)、插入 (insert
)、删除 (remove
,pop
) 这些操作都可以用在它身上。)
empty = [ ]
print(empty, type(empty)) # [ ] <class 'list'>
2.3 列表添加元素 list.append(obj) 、 list.extend(seq) 、list.insert(index, obj)
注意: list.append(obj) 只接受一个参数,参数可以是任何数据类型,被追加的元素在 list 中保持着原结构类型
list.extend(seq) 在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)
list.insert(index, obj) :
1 x = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
2 x.insert(2, 'Sunday')
3 print(x)
4 # ['Monday', 'Tuesday', 'Sunday', 'Wednesday', 'Thursday', 'Friday']
区别:append 为追加; expend 为扩展
2.4 列表删除元素 :list.remove(obj) 、list.pop([index=-1]) 、del var1[, var2 ……]
list.remove(obj) 移除列表中某个值的第一个匹配项
list.pop([index=-1]) 移除列表中的一个元素(默认最后一个元素),并且返回该元素的值
del var1[, var2 ……] 删除单个或多个对象;知道要删除的元素在列表中的位置,可使用del
语句。
区别:remove
和 pop
都可以删除元素,前者是指定具体要删除的元素,后者是指定一个索引
如果你要从列表中删除一个元素,且不再以任何方式使用它,就使用del
语句;如果你要在删除元素后还能继续使用它,就使用方法pop()
2.5 获取列表元素 (切片的通用写法是 start : stop : step)
- 通过元素的索引值,从列表获取单个元素,注意,列表索引值是从0开始的。
- 通过将索引指定为-1,可让Python返回最后一个列表元素,索引 -2 返回倒数第二个列表元素,以此类推。
情况一 "start :" 以 step
为 1 (默认) 从编号 start
往列表尾部切片。
1 x = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
2 print(x[3:]) # ['Thursday', 'Friday']
3 print(x[-3:]) # ['Wednesday', 'Thursday', 'Friday']
情况二 ": stop" 以 step
为 1 (默认) 从列表头部往编号 stop
切片。
1 week = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
2 print(week[:3]) # ['Monday', 'Tuesday', 'Wednesday']
3 print(week[:-3]) # ['Monday', 'Tuesday']
情况三 "start : stop" 以 step
为 1 (默认) 从编号 start
往编号 stop
切片。
1 week = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
2 print(week[1:3]) # ['Tuesday', 'Wednesday']
3 print(week[-3:-1]) # ['Wednesday', 'Thursday']
情况四 "start : stop : step" 以具体的 step
从编号 start
往编号 stop
切片。注意最后把 step
设为 -1,相当于将列表反向排列。
1 week = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
2 print(week[1:4:2]) # ['Tuesday', 'Thursday'] ;2为步长(step)
3 print(week[:4:2]) # ['Monday', 'Wednesday']
4 print(week[1::2]) # ['Tuesday', 'Thursday']
5 print(week[::-1]) # ['Friday', 'Thursday', 'Wednesday', 'Tuesday', 'Monday']
3.元组
3.1创建和访问一个元组
元组与列表的区别
- 元组(tuple)被创建后就不能对其进行修改,类似字符串。
- 元组使用小括号,列表使用方括号。
- 元组与列表类似,也用整数来对它进行索引 (indexing) 和切片 (slicing)。
- 创建元组可以用小括号 (),也可以什么都不用。(建议使用小括号)
- 元组中只包含一个元素时,需要在元素后面添加逗号,否则括号会被当作运算符使用。
3.2 更新和删除一个元组(元组有不可更改的性质,因此不能直接给元组的元素赋值,但是只要元组中的元素可更改,我们可以直接更改其元素,注意这跟赋值其元素不同。)
1 t1 = (1, 2, 3, [4, 5, 6])
2 print(t1) # (1, 2, 3, [4, 5, 6])
3 t1[3][0] = 9
4 print(t1) # (1, 2, 3, [9, 5, 6])
3.3 元组有两种拼接方式:
' + ' (加号) :首尾拼接
' * ' (乘号):复制拼接
3.4内置方法 (count
和 index
两种方法。)
1 t = (1, 10.31, 'python')
2 print(t.count('python')) # 1
3 print(t.index(10.31)) # 1
count('python')
是记录在元组t
中该元素出现几次,显然是 1 次index(10.31)
是找到该元素在元组t
的索引,显然是 1
4.字符串:引号之间的字符集合(支持使用 单引号 和 双引号)
4.1 转义字符
\\
反斜杠符号
\'
单引号
\"
双引号
\n
换行
\t
横向制表符(TAB)
\r
回车
4.3 字符串的切片与拼接
- 从 0 开始
- 切片通常写成
start:end
这种形式,包括「start
索引」对应的元素,不包括「end
索引」对应的元素。 - 索引值可正可负,正索引从 0 开始,从左往右;负索引从 -1 开始,从右往左。使用负数索引时,会从最后一个元素开始计数。最后一个元素的位置编号是 -1。
例如:
1 str1 = 'I Love LsgoGroup'
2 print(str1[:6]) # I Love
3 print(str1[5]) # e
4 print(str1[:6] + " 插入的字符串 " + str1[6:]) # I Love 插入的字符串 LsgoGroup
1 s = 'Python'
2 print(s) # Python
3 print(s[2:4]) # th
4 print(s[-5:-2]) # yth
5 print(s[2]) # t
6 print(s[-1]) # n
4.4 字符串格式化
%c | 格式化字符及其ASCII码 |
%s | 格式化字符串,用str()方法处理对象 |
%r | 格式化字符串,用rper()方法处理对象 |
%d | 格式化整数 |
%o | 格式化无符号八进制数 |
%x | 格式化无符号十六进制数 |
%X | 格式化无符号十六进制数(大写) |
%f | 格式化浮点数字,可指定小数点后的精度 |
%e | 用科学计数法格式化浮点数 |
%E | 作用同%e,用科学计数法格式化浮点数 |
%g | 根据值的大小决定使用%f或%e |
%G | 作用同%g,根据值的大小决定使用%f或%E |
5、字典
5.1 判断一个数据类型 X
是不是可变类型的两种方法:
- 麻烦方法:用
id(X)
函数,对 X 进行某种操作,比较操作前后的id
,如果不一样,则X
不可变,如果一样,则X
可变。 - 便捷方法:用
hash(X)
,只要不报错,证明X
可被哈希,即不可变,反过来不可被哈希,即可变。
5.2字典定义:字典是无序的键:值(key:value
)对集合,键必须是互不相同的(在同一个字典之内)。
dict
内部存放的顺序和key
放入的顺序是没有关系的。dict
查找和插入的速度极快,不会随着key
的增加而增加,但是需要占用大量的内存。
字典 定义语法为 {元素1, 元素2, ..., 元素n}
- 其中每一个元素是一个「键值对」-- 键:值 (
key:value
) - 关键点是「大括号 {}」,「逗号 ,」和「冒号 :」
- 大括号 -- 把所有元素绑在一起
- 逗号 -- 将每个键值对分开
- 冒号 -- 将键和值分开
5.3 创建和访问字典
dict()
创建一个空的字典
通过key
直接把数据放入字典中,但一个key
只能对应一个value
,多次对一个key
放入 value
,后面的值会把前面的值冲掉。
例如:
1 dic = dict()
2 dic['a'] = 1
3 dic['b'] = 2
4 dic['c'] = 35 print(dic)
6 # {'a': 1, 'b': 2, 'c': 3}
1 dic['a'] = 11
2 print(dic)
3 # {'a': 11, 'b': 2, 'c': 3}
1 dic['d'] = 4
2 print(dic)
3 # {'a': 11, 'b': 2, 'c': 3, 'd': 4}
5.4 字典的内置方法
dict.fromkeys(seq[, value])
用于创建一个新字典,以序列seq
中元素做字典的键,value
为字典所有键对应的初始值。dict.keys()
返回一个可迭代对象,可以使用list()
来转换为列表,列表为字典中的所有键。dict.items()
以列表返回可遍历的 (键, 值) 元组数组。dict.get(key, default=None)
返回指定键的值,如果值不在字典中返回默认值。dict.setdefault(key, default=None)
和get()
方法 类似, 如果键不存在于字典中,将会添加键并将值设为默认值。key in dict
in
操作符用于判断键是否存在于字典中,如果键在字典 dict 里返回true
,否则返回false
。而not in
操作符刚好相反,如果键在字典 dict 里返回false
,否则返回true
。dict.pop(key[,default])
删除字典给定键key
所对应的值,返回值为被删除的值。key
值必须给出。若key
不存在,则返回default
值。del dict[key]
删除字典给定键key
所对应的值。dict.clear()
用于删除字典内所有元素。dict.popitem()
随机返回并删除字典中的一对键和值,如果字典已经为空,却调用了此方法,就报出KeyError异常。
6.集合
6.1 集合的创建
- 先创建对象再加入元素。
- 在创建空集合的时候只能使用
s = set()
,因为s = {}
创建的是空字典。
6.2 访问集合中的值
- 可以使用
len()
內建函数得到集合的大小。
1 s = set(['Google', 'Baidu', 'Taobao'])
2 print(len(s))3 # 3
- 可以使用
for
把集合中的数据一个个读取出来。
1 s = set(['Google', 'Baidu', 'Taobao'])
2 for item in s:
3 print(item)
4 # Baidu
5 # Google
6 # Taobao
6.3 集合的内置方法
set.add(elmnt)
用于给集合添加元素,如果添加的元素在集合中已存在,则不执行任何操作。set.update(set)
用于修改当前集合,可以添加新的元素或集合到当前集合中,如果添加的元素在集合中已存在,则该元素只会出现一次,重复的会忽略。set.remove(item)
用于移除集合中的指定元素。如果元素不存在,则会发生错误。set.discard(value)
用于移除指定的集合元素。remove()
方法在移除一个不存在的元素时会发生错误,而discard()
方法不会。set.pop()
用于随机移除一个元素。- 由于 set 是无序和无重复元素的集合,所以两个或多个 set 可以做数学意义上的集合操作。
三、学习问题与解答
冒号切片的内容有点难理解,它们的取值规则有点奇怪。
解答:我在网上查找是发现一个关于切片的口诀“左右空,取到头;左要取,右不取” ;也就是 “左取右不取”,也可以用数学上的区间 [a,b)来理解
四、学习思考与总结
在Task2中我学习到了Python语言的构成部分,初步了解了python的基础构成;在这次的学习中,也出现了上一次任务的内容,例如程序的报错,深化了我对上一次学习的理解,这也启示了我,每个任务都是有关联的,要在认真对待每次学习,这样才能更好地掌握这门编程语言。