常用的数据结构
1.编程规范
2.基本数据类型
3.列表,元组,字典,集合
4.文件操作
5.条件判断
6.分支循环
1.编程规范
-代码开头 顶格编写,除非在条件判断或循环
-代码层级 第一层顶格编写,第二层开头预留4个空格
-对齐方式 同一层级必须严格对齐
-注释 单行注释 # 多行注释 首尾处用成对三引号引用, '''注释''' """注释“”“
- 代码块 if, while, for均以冒号结尾,冒号后面接上的语句是代码块
2.基本数据类型
-变量不需要声明
-变量赋值后才会被创建
-类型是变量所指的内存中对象的类型
基本数据类型:Number(数字), String(字符串), LIst(列表), Tuple(元组), Set(集合), Dictionary(字典)
可变:Number(数字), String(字符串),Tuple(元组) 不可变:LIst(列表), Set(集合), Dictionary(字典)
3.列表,元组,字典,集合
Number:
int float bool complex(复数)
type() 查询变量所指的对象类型
isinstance() 判断变量所指类型是否是某类型
del() 删除变量
a=1
print(type(a))
print(isinstance(a,int))
print(isinstance(a,float))
del(a)
print(a)
String
-使用单引号或双引号
-使用反斜杠\转义特殊字符
-不让反斜杠转义,在字符串前边添加一个r
-索引以0为开始值,-1为末尾的开始位置
-'+'进行字符串连接
-字符串不能发生变化
str="I'm ok"
print(str)
print(str[2])
print(str+str)
print('I\'m ok')
print(r'I\'m ok')
str[1]='a'
List
- 一种有序集合
- 元素类型可以是不相同的
- 可随时添加和删除其中的元素 append insert pop
- 可以被索引和切片
- '+'是列表连接
- 元素可变
t=[ 'a', 'b', 'c', 'd', 'e'] 0~4 -5~-1
note=['apple','banaba','pear','peach']
print(note)
print(len(note))
print(note[0])
print(note[-1])
print(note[-2])
note.append('melon') #末尾追加
print(note)
note.insert(1,'grape') #位置之后
note.pop() #删除末尾元素
note.pop(1)
note[0]='watermelon'
L=['Apple',12,True,'']
Tuple
-元组写在小括号()中,元素之间用逗号隔开
- 与字符串一样,依然可以索引和切片
- 元组的元素不可改变,但可以包含可变对象(如list)
- 构建单元素的元组,需要格外注意逗号
- 可以使用'+'进行拼接
note=('apple','pear','grape') #元组不可变,没有append(),insert()
note[-1]
t=(1,) #与小括号表达式区别
t=('apple', 'grape',['melon','pear'])
t[2][0]='a'
t[2][1]='b'
dictionary
- {key1:value1, key2:value2,...}
- 是一种无序的键值集合,通过键来存取
- 列表是一种有序的对象集合,通过偏移存取
- 同一个字典中,键(key)必须是唯一的
- 创建空字典: {}
d={'key1':1,'key2':2,'key3':3}
d['key1']
'key4' in d #False
d.get('key4') #返回none时不显示
d.get('key4', '-1') #指定返回值
d.pop('key1')
key5=[1,2,3]
d[key5]='list' #列表不能作为字典中的key值
dict:
查找和插入的速度极快,不会随着key的增加而变慢;
需要占用大量的内存;
list:
查找和插入的时间随着元素的增加而增加;
占用空间小
dict同时存储key和value,根据key值计算value的位置,其中key是不可变对象,通过key计算value存储位置的算法称为哈希算法。
字符串,整数等都是不可变的,可以放心的用作于key值,list是可变的,不能作为key。
Set
- 不重复的元素组成的集合
- 基本功能是进行成员关系测试和删除重复元素
- 创建集合使用大括号{} or set()
- 空集合只能使用set(),不能使用{}, {} 是用来创建字典的
- 集合操作:交集,并集,差集,同时并不能存在两个集合中的元素
s=set([1,2,3,4,5,6,6]) #重复元素会被过滤
s.add(6) #添加重复元素不会有效果
s.remove(4)
s1=set([1,2,3])
s2=set([2.3,4])
s1&s2 #交集
s1|s2 #并集
数据类型转换
int(x) float(x) str(x) tuple(s) list(s) set(s) dict(d) 创建一个字典,d必须是一个(key,value)元组
4.文件操作
-读文件:打开文件open() 读取文件read() 关闭文件close()
-读取特定文件:二进制文件,字符编码文件
-写文件
读文件
#第一种方法
f = open('./test.txt', 'r')#'r'表示读
f.read()
f.close() #关闭以免占用操作系统的资源
#第二种方法
#读写时一旦出错,后边文件的关闭就不会调用,为了无论是否出错都能产生正确的关闭文件,可以使用try...finally来实现
try:
f = open('./test.txt', 'r')
print(f.read())
finally:
if f:
f.close()
#第三种方法
#简化上述语句,会自动调用close()
with open('./test.txt','r') as f:
print(f.read())
read()会一次性读取文件的全部内容,如果文件的内容很大,内存就会爆炸。所以可以采用read(size)的方法,每次最多读取size个字节的内容。
readline()可以每次读取一行内容
readlines()一次读取所有内容并按行返回list
若文件很小,read()一次性读取最方便;
若不能确定文件的大小,反复调用read(size)比较保险; 若是配置文件,调用readlines()最方便。
f = open('./test.txt', 'r')
for line in f.readlines():
print(line.strip()) #去掉末尾的'\n'
f.close()
读取特定文件
二进制文件
f = open('./Tulips.jpg', 'rb')
f.read() #输出十六进制表示的字节
字符编码文件
f = open('./gbk.txt' , encoding = 'gbk')
f.read()
遇到编码错误后如何处理
f = open('./gkb.txt', 'r', encoding = 'gkb', errors = 'ignore')
f.read()
写文件
标识符'w', 'wb'
f = open('./test.txt' , 'w')
f.write('Hello, world')
f.close() #只有调用close()方法时,操作系统才保证把没有写入的数据全部写入磁盘。
#因此,忘记调用close()的结果是数据可能只写一部分到磁盘了,剩下的丢失了
'w'会直接复写之前的内容,使用'a'以追加方式写入,另外保险的做法是使用with语句
with open('./test.txt', 'a') as f:
f.write(',开始读写文件之旅!')
写入特定编码文本
open('./gbk.txt', 'w', encoding = 'gkb')
5.条件判断
x = int(input('birth:')) #input输入的为字符串类型,需要转成int
if x < 2000:
print('00后')
else:
print('00后')
#当有两个及两个以上的判断语句,需要使用elif判断
score = 90
if score < 60:
print("不合格")
elif score < 70:
print("中等")
elif score < 80:
print("良好")
else:
print("优秀")
6.分支循环
for
fruits = ['apple', 'grape', 'banana', 'melon']
for fruit in fruits:
print(fruit)
# 0-100的整数求和
sum = 0
for i in range(101):
sum += i
print(sum)
while
sum = 0
n = 100
while n > 0:
sum += n
n = n - 1
print(sum)
break:退出循环
continue:退出当前循环