图片来源于turtle库的练习
共勉:纸上得来终觉浅,绝知此事要躬行。
1. 字符串和元组
TBD.
1.1 Python变量的指针本质
TBD.
1.2 字符串
1.2.1 转义字符
TBD.
规定 ‘\’ 不转义的字符串
print(r’ab\ncd)
r 表示字符串里面的\就是\,不会和后面的字符合并起来看待
1.2.2 字符串切片
a[x:y:z]表示,从a[x]取到a[y](a[y]不算),每z个字符取一个,最后拼起来。
z为负数则代表倒着取
x,y可以省略。x,y全省略表示从头取到尾或从尾取到头
print("1234"[3:1:-1]) #>>43
print("abcde“[::-1]) #>>edcba 可用于字符串反转
print("12345678"[1:7:2]) #>>246
print("12345678"[7:1:-2]) #>>864
字符串切片的用法也适用于元组和列表!
1.2.3 字符串的分割
s.split(x)
两个相邻的分隔符之间会被分隔出一个空串
a = "12..34.5346...a"
print(a.split(".")) #>>['12','','34','5346','','','a']
1.2.4 字符串的高级分割
用多个分隔串进行分割,要引入re(正则包)
import re
a = 'Beautiful, is; better*than\nugly'
print(re.split(';| |,|\*|\n',a)) #分隔串用|隔开,‘;’ ‘ ’ ‘,’ ‘*’ ‘\n’都被看作是分隔串
#>>[‘Beautiful’, ’ ', ‘is’, ’ ', ‘better’, ‘than’, ‘ugly’]
1.2.5 字符串函数
- count 求子串出现次数
- len字符串长度
- upper, lower大小写转换
- find, rfind, index, rindex 在字符串查找子串,返回找到的位置(下标)。找不到的话,find返回-1,index引发异常
- find还可以指定查找的起点
- replace替换
- isdigit判断是否全是数
- islower, isupper判断是否全是小写、大写
- startwith, endwith判断是否以某子串开头、结尾
- strip()返回除去头尾空白字符(空格,’\r’ ‘\t’ ‘\n’)后的字符串
- lstrip()返回除去头部(左端)空白字符串后的字符串
- rstrip()返回除去尾部(右端)空白字符串后的字符串
1.2.6 字符串的编码
字符串的编码在内存中的编码都是Unicode的,虽然写入文件时可能是gbk或者utf-8的
1.2.7 字符串格式化
参考之前的博文。
1.3 元组
一个元组由数个逗号分隔的值组成,前后可加括号
元组不能修改,即不可增删元素,不可对元素赋值,不可修改元素顺序(如排序)
t = 12345, 54321, 'hello!' #t是一个元组
print(t[0]) #>>12345
print(t) #>>(12345, 54321, 'hello!')
u = t, (1, 2, 3, 4, 5) #u有两个元素,都是元组
print(u) #>>((12345, 54321, 'hello!'), (1,2,3,4,5))
print(u[0][1]) #>>54321
print(u[1][2]) #>>3
t[0] = 88888 #运行错误,元组的元素不能赋值
1.3.1 元组元素的指针本质
元组的元素都是指针。元组元素不可修改,是指不可改变元组元素的指向,但是元组元素指向的内容,是有可能被修改的
例如:如果元素时列表,就可以修改该列表
v = ("hello", [1,2,3],[3,2,1]) #[1,2,3]是列表
v[1] = 32 #运行错误,元组元素不可能修改成指向别的
v[1][0] = 'world' #可以
print(v) #>>('hello', ['world',2,3], [3,2,1])
print(len(v)) #>>3
1.3.2 单元素的元组
empty = () #空元组
singleton = 'hello', #注意末尾的逗号,如果没有,就不是元组而是字符串了
print(len(empty)) #>>0
print(len(singleton)) #>>1
x = ('hello',) #无逗号则x为字符串
print(x) #>>('hello',)
1.3.3 元组赋值
x = (1,2,3)
b = x
print(b is x) #true is表示两个操作数是否指向同一个东西,即是否是同一个对象
x += (100,) #等价于x=x+(100,)新建了一个元组
print(x) #(1,2,3,100)
print(b) #(1,2,3)
1.3.4 元组比大小
两个元组比大小,就是逐个元素比大小,直到分出胜负
如果有两个对应元素不可比大小,则出runtime error
1.3.5 元组实例
已知2012年1月25日是星期三,编写一个程序,输入用“年 月 日”表示的一个2012年1月25日之后的日期,输出该日期是星期几(星期日输出0)
思路:2012年1月22日是星期天。算出给定日期是从该天起过了x天,然后输出x%7
monthDays = [-1,31,28,31,30,31,30,31,31,30,31,30,31]
days = 0 #从2012/01/22开始过了多少天
lst = input().split()
year,month,date = int(lst[0]), int(lst[1]), int(lst[2])
for y in range(2012, year): #先累加过掉的整年的天数
if y%4 ==0 and y%100!=0 or y%400 == 0: #闰年
days += 366
else:
days += 365
if year%4 == 0 and year%100!=0 or year%100 == 0:
monthDays[2] = 29
for i in range(1,month): #再累加year那年过掉的正月的天数
days += monthDays[i]
days += date #累加year年month那月的天数
days -= 22 #2012年1月22日是星期天,扣掉2012年的前22天
print(days%7) #星期天算一周的第0天
2. 列表
2.1 列表的增删和修改
empty=[] #[]表示空表
list1=['abc', 'Huawei', 1997, 23]
list1[1]=100
print(list1) #>>['abc', 100, 1997, 23]
del list1[2] #删除元素
print(list1) #>>['abc', 100, 23]
list1 += [100,110] #在list1原地添加
list1.append(200) #添加元素200
2.2 列表相加
列表相加可以得到新的列表
2.2.1 列表和+=
对于列表来说,a+=b和a=a+b不同
b=a=[1,2]
a+=[3] #b和a指向相同地方,在a末尾添加元素,b也受影响
print(a,b) #>>[1,2,3] [1,2,3]
a=a+[4,5] #对a重新赋值,不会影响到b
print(a) #>>[1,2,3,4,5]
print(b) #>>[1,2,3]
2.2.2 列表的乘法
TBD.
2.2.3 列表相关函数
- append(x) 添加元素x到尾部
- extend(x) 添加列表x中的元素到尾部
- insert(i, x) 将元素x插入到下标i处
- remove(x) 删除元素x
- reverse() 颠倒整个列表
- index(x) 查找元素x,找到则返回第一次出现的下标,找不到则引发异常
2.2.4 列表映射
TBD.
2.2.5 列表的拷贝
a=[1,2,3,4]
b=a[:]
2.2.6 列表的深拷贝
a=[1,[2]]
b=a[:]
b.append(4)
print(b) #>>[1,[2],4]
a[1].append(3)
print(a) #>>[1,[2,3]]
print(b) #>>[1,[2,3],4]
import copy
a=[1,[2]]
b=copy.deepcopy(a)
b.append(4)
print(b) #>>[1,[2],4]
a[1].append(3)
print(a) #>>[1,[2,3]]
print(b) #>>[1,[2],4]
2.2.7 元组、列表和字符串互转
print(list("hello")) #>>['h', 'e', 'l', 'l', 'o']
print("".join(['a','44','c'])) #>>a44c
print(tuple("hello")) #>>('h', 'c', '1', '1', 'o')
print("".join(('a','44','c'))) #>>a44c
2.2.8 二维列表
错误
a=[0,0,0]
b=[a]*3 #b有三个元素,都是指针,都和a指向同一地方
正确
matrix = [[1,2,3], [4,5,6], [7,8,9]]
matrix = [[0 for i in range(3)] for i in range(3)]
生成一个3行4列的矩阵,所有元素都是0
lst=[]
for i in range(3):
lst.append([0]*4)
lst[0][0]=lst[2][3]=100
for i in range(3):
for j in range(4):
print(lst[i][j],end=" ")
print("")
扩展:
定义二维元组
matrix=((1,2,3), (4,5,6), (7,8,9))
matrix = tuple(tuple(0 for i in range(3)) for i in range(3))
3. 参考资料
【1】慕课网,北京理工大学,嵩天教授,《Python语言程序设计》声明:笔记中截图、部分代码来自该课程课件,非博主原创
【2】Python123:在线编程网站
【3】菜鸟教程
【4】慕课网,北大,郭玮老师,《实用Python程序设计》