目录
一,函数
二,列表和元组
2.1 列表基础操作
2.2 切片
2.3 列表的增删查改
2.4 连接链表
2.5 元组
三,字典
3.1 关于字典
3.2 字典的增删查改操作
3.3 遍历字典元素
3.4 合法的key类型
四,文件操作
4.1 打开关闭文件
4.2 读写文件
4.3 关于中文的处理
一,函数
Python 的函数和 C/C++ 的大体规则一致,但也有几点不同:
- Python 的函数由def 开头,后面跟上函数名和参数列表,不需要在前面带上返回值类型
- Python 的函数没有花括号,以def开头,return结尾,并且 Python 可以一次返回多个值,以逗号隔开
- Python 的参数可以设定默认值,这点和 C++ 缺省参数一样
def Range(begin=1, end=100): #参数可以设置默认值
sum = 0
for i in range(begin, end+1):
sum += i
return begin, end, sum #可以一次返回多个参数
x = input('请输入第一个数 x:')
y = input('请输入第二个数 y:')
x = int(x)
y = int(y)
a, b, sum = Range(x, y)
print(f'x({a}) 与 y({b}) 中间所有数的和为:{sum}')
其它的像变量作用域,链式和嵌套调用以及递归等方面,Python对这些内容的定义和C++是一样的,这里不再赘述
二,列表和元组
2.1 列表基础操作
直接看代码,学习一门语言最简单粗暴的方式就是直接分析代码:
alist = [1, 'hello', True, 1.11] #允许往列表存放不同类型的元素
alist[2] = 'world' #可以通过下标访问和修改
print(alist[2])
print(alist[-1]) #下标为负数时表示倒数第几个值
可以用for或while来遍历列表元素:
alist = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# 直接打印
for elem in alist:
print(elem)
# 通过下标访问打印
for i in range(0, len(alist)):
print(alist[i])
# 使用while打印
i = 0
while i < len(alist):
print(alist[i])
i += 1
2.2 切片
下标访问是一次访问一个元素,通过切片可以一次访问一组连续的元素,相当于得到一个子列表:
alist = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(alist[1:3]) #表示的是[1, 3) 这样的前闭后开区间,所以最终结果只有2,3
print(alist[1:]) # 省略后边界, 表示获取到列表末尾
print(alist[:-1]) # 省略前边界, 表示从列表开头获取
print(alist[:]) # 省略两个边界, 表示获取到整个列表.
#切片操作还可以指定 "步长" , 也就是 "每访问一个元素后, 下标自增几步"
print(alist[::2])
print(alist[::5])
#步长可以是负数,表示从后往前访问,下标自减几步
print(alist[::-2])
print(alist[::-5])
2.3 列表的增删查改
直接看代码:
alist = [1, 2, 3, 4]
# 1,增加操作
alist.append(5) #append 在末尾新增一个元素,俗称“尾插”
alist.insert(1, 'hello') #insert 表示在指定位置插入
print(alist)
# 2,删除操作
alist.pop() # 不加参数表示删除最后一个元素,俗称“尾删”
alist.pop(1) # 按照下标删除元素
alist.remove(3) # 按照值删除元素
print(alist)
# 3,查找操作
print(2 in alist) #in操作符表示判断该元素是否在列表中,返回值是布尔类型
print(10 in alist)
print(alist.index(2)) #index方法表示查找元素在列表中的下标,返回值是一个整数,如果元素不存在,则抛异常
print(alist.index(10))
2.4 连接链表
直接看代码:
from string import printable
alist1 = [1, 2, 3, 4, 5]
alist2 = [6, 7, 8, 9, 10]
print(alist1 + alist2) # +结果会生成一个新的列表,而不会影响到旧列表
alist1.extend(alist1)
print(alist1)
print(alist2)
2.5 元组
元组的功能和列表基本是一致的,但也有几点不同:
- 元组用 ( ) 来表示
- 元组不能修改里面的元素, 列表则可以修改里面的元素
- 因此, 像读操作,比如访问下标, 切片, 遍历, in, index, + 等, 元组也是一样支持的.
- 但是, 像写操作, 比如修改元素, 新增元素, 删除元素, extend 等, 元组则不能支持
- 另外, 元组在 Python 中很多时候是默认的集合类型. 例如, 当一个函数返回多个值的时候,返回的元素类型其实是元组
atuple = (1, 2, 3, 4)
def getPoint():
return 10, 20
result = getPoint()
print(atuple)
print(type(atuple))
print(type(result))
问题:有列表了为什么还要有元组?
解答:
- 你有一个列表,现在需要调用一个函数进行一些处理;但是你有不是特别确认这个函数是否会把你的列表数据弄乱,那么这时候传一个元组就安全很多
- 我们马上要讲的字典,是一个键值对结构。要求字典的键必须是 "可hash对象" (字典本质上也是一个hash表),而一个可hash对象的前提就是不可变,因此元组可以作为字典的键,但是列表不行
三,字典
3.1 关于字典
字典是一种键值对的结构,如下代码:
a = { } #创建空的字典
b = dict()
print(type(a))
print(type(b))
也可以在创建的同时指定初始值,键值对之间用逗号分开,如下代码:
student = {'id': 1, 'name': '张三'}
# 为了美观,我们创建字典时,分成多行来写
student1 = {
'id': 2,
'name': '李四' #最后一个键值对的逗号可写可不写
}
print(student)
print(student1)
3.2 字典的增删查改操作
student = {
'id': 1,
'name': '张三'
}
#新增/修改:使用 [] 根据key来新增/修改 value
student['score'] = 90 # 如果key不存在,则在后面新增键值对
print(student)
student['score'] = 100 # 如果key存在,则修改键值对的value
print(student)
# 查询操作
print('id' in student) # 判定key是否在字典中,返回类型是布尔
print(['id']) # 使用[]来根据key查找对应的value,如果不存在会抛异常
# 删除操作
student.pop('score') # 使用pop方法根据key删除键值对
print(student)
3.3 遍历字典元素
student = {
'id': 1,
'name': '张三',
'score': 100
}
# 直接用for循环获取所有的key,进而获得 value
for key in student:
print(key, student[key])
#可以使用 keys 方法获取到字典中所有的 key
print(student.keys())
#使用 values 方法可以获取到字典所有的value
print(student.values())
#使用 items 方法可以获取字典所有的键值对
print(student.items())
- 此处的dict_keys,dict_values,dict_items都是一种特殊的类型,专门用来表示字典的值的
3.4 合法的key类型
不是所有的类型都可以作为字典的key,字典本质是一个哈希表,哈希表的 key 要求是“可哈希的”,也就是可以计算出一个哈希值
- 可以使用 hash 函数计算某个对象的哈希值.
- 但凡能够计算出哈希值的类型, 都可以作为字典的 key.
- 列表和字典都无法计算哈希值
print(hash(0))
print(hash(3.14))
print(hash('hello'))
print(hash(True))
print(hash(()))
四,文件操作
4.1 打开关闭文件
打开和关闭文件用到的函数是open和close,这两个库函数的参数和使用是和C一样的,可以参照往期博客:C语言进阶——文件操作_如果文件名随时间变更,怎么通过c打开文件-CSDN博客
f = open('123.txt', 'r')
f.close()
可以先在项目目录建一个txt文件
4.2 读写文件
读写操作和也基本和C一致,如下代码:
# 往文件写数据
f = open('123.txt', 'w')
f.write('hello world1')
f.close()
f = open('123.txt', 'a') # a 是追加写,如果是w,就是把文件的旧数据全删除再重新写入
f.write('hello world2')
f.write('hello world3')
f.close()
读取文件也有多种方式,我们可以先往123.txt里添加部分值:
# 读取文件数据
f = open('123.txt', 'r')
print(f.read(12)) #read读取指定长度的数据
f.close()
f = open('123.txt', 'r')
# 可以使用for一次循环读取一行
for line in f:
print(f'line = {line}')
f.close()
f = open('123.txt', 'r')
# readlines 是直接把文件整个内容读取出来,返回一个列表,每个元素为一行
lines = f.readlines()
print(lines)
f.close()
# 至于这里要打开文件三次是因为:
# 在一个open和close之间,每次读取时,下次读取都会从上次读取的结尾位置开始读取
4.3 关于中文的处理
上面的操作在处理字母和数字时就没问题,但是在处理中文时,就会有报错或者乱码问题
- 我们知道, 计算机只能表示二进制数据. 要想表示英文字母, 或者汉字, 或者其他文字符号, 就都要通过编码.
- 最简单的字符编码就是 ascii. 使用一个简单的整数就可以表示英文字母和阿拉伯数字.
- 但是要想表示汉字, 就需要一个更大的码表.
- 一般常用的汉字编码方式, 主要是 GBK 和 UTF-8
- 必须要保证文件本身的编码方式, 和 Python 代码中读取文件使用的编码方式匹配, 才能避免出现问题.
- Python3 中默认打开文件的字符集跟随系统, 而 Windows 简体中文版的字符集采用了 GBK, 所以 如果文件本身是 GBK 的编码, 直接就能正确处理.
- 如果文件本身是其他编码(比如 UTF-8), 那么直接打开就可能出现上述问题
此时修改打开文件的代码, 给 open 方法加上 encoding 参数, 显式的指定为和文本相同的字符集, 问题即可解决,如下代码:
# 读取文件数据
f = open('123.txt', 'r', encoding='utf8')
lines = f.readlines()
print(lines)
f.close()