实用Python程序设计MOOC-第五章字符串和元组
[TOC]
实用Python程序设计MOOC-第五章字符串和元组
Python变量的指针本质
Python的数据类型
基本数据类型
int,float,complex
组合数据类型
字符串:str
元组:tuple
列表:list
字典:dict
集合:set
isinstance函数
isinstance(x, y)
函数查询数据x是否是类型y
1 | a = "1233" |
len函数
len函数可以用来求组合数据类型的元素个数 (长度)
1 | print(len("12345")) #>>5 求字符串十 |
Python变量的指针本质
- Pyhton中的变量都是指针
- Python中所有可赋值的东西,即可以出现在赋值号”=”左边的东西,都是指针
- 指针即代表内存单元的地址
将指针称作”箭头”, 更容易理解。所有变量都是箭头,指向内存某处
对变量进行赋值的本质,就是让该变量(箭头)指向某个地方
1 | a = 3 #a → 3 |
- 用一个变量对另一个变量赋值意味着让两个变量指向同一个地方
1 | a = b #a ↘ 3 |
is运算符和==的区别
a is b
为True说a和b指向同一个地方
a == b
为True说明a和b指向的地方放的的东西相同,但是a和b不一定指向相同的地方
a = b
会使得a和b指向同一个地方
x is y
表示x和y是否指向同一个地方x == y
表示x和y的内容是否相同
1 | a = [1,2,3,4] #a → [1,2,3,4] |
对int,float,complex,str,tuple类型的变量a和b,只需关注
a == b
是否成立,关注a is b
是否成立无意义。因这些数据本身都不会更改,不会产生a指向的东西改了b指向的东西也跟着变的情况。数据类型不可能改变的。对list,dict,set类型的变量a和b,
a == b
和a is b
的结果都需要关注。因这些数据本身会改变。改别了a指向的内容,说不定b指向的内容也变了。该数据类型可能改变的。
列表元素的指针本质
列表的元素也可以赋值,因此也是指针
1 | a = [1,2,3,4] |
字符串的转义字符
转义字符
\
及其后面的某些字符会构成转义字符,即两个字符当一个字符看
1 | print ("hello\nworld\tok\"1\\2") #\n \t \" \\都是“转义字符”代表换行,制表符,双引号,斜杠 |
输出:1
2hello
world ok"1\2
字符,包括\n这样的转义字符,只能出现在字符串里面,必须用引号括起来!
print(a\nb)
不合法,不会打出a的值,然后换行,再打出b的值
- 规定
\
不转义的字符串
print(r'ab\ncd') #>>ab\ncd
r
表示字符串里面的\就是\,不会和后面的字符合并起来看待
字符串的切片(子串)
- 字符串的切片( 也叫子串,即连续的一部分)
a[x:y]
表示字符串a里从下标x到下标y那一部分的子串(不包括下标y的那个字符),左闭右开
1 | a = "ABCD" |
a[x:y:z]
表示,从a[x]
取到a[y]
(a[y]
不算),每z个字符取一个,最后拼起来。
z为负数则代表倒着取,左开右闭。
x, y可以省略。x, y全省略表示从头取到尾或从尾取到头
1 | print("1234"[3:1:-1]) #>>43 |
字符串切片的用法也适用于元组和列表!
字符串的分割(split)
split函数详解
s.split(x)
用字符串x做分隔符分割字符串s,得到分隔后的列表
两个相邻分隔符之间会被分隔出一个空串
1 | a = "12..34.5346...a" |
字符串高级分割
- 用多个分隔串进行分割
1 | import re #正则表达式包 |
两个相邻的分隔串之间,会隔出一个空串
字符串的函数
count
求子串出现次数
1 | s = 'thisAAbb AA' |
len
字符串长度
1 | s = '1234' |
upper
,lower
转大写、小写
1 | s = "abc" |
find
,rfind
,index
,rindex
在字符串中查找子串,返回找到的位置(下标)。
找不到的话,find返回-1,index引发异常
1 | s = "1234abc567abc12" |
find
还可以指定查找起点
1 | s = "1234abc567abc12" |
如果想要找到所有的子串,需要写一个循环,规定指针
replace
替换
1 | s = "1234abc567abc12" |
isdigit()
,islower()
,isupper()
判断字符串是否是数,是否全是小写,是否全是大写等startswith
,endswith
判断字符串是否以某子串开头、结尾
1 | print("123.4".isdigit()) #>>False |
strip()
返回除去头尾空白字符(空格,\r
\t
\n
)后的字符串lstrip()
返回除去头部(左端)空白字符后的字符串rstrip()
返回除去尾部(右端)空白字符后的字符串
1 | print(" \t12 34 \n'".strip()) #>>12 34 |
strip(s)
,lstrip(s)
,rstrip(s)
返回除去两端、左端、右端在s中出现的字符后的字符串
1 | print( "takeab \n".strip("ba \n")) #>>take |
字符串的编码和格式化
字符串的编码在内存中的编码是unicode的,虽然写入文件时可能是gbk或者utf-8的
1 | print(ord("a")) #>>97 |
字符串格式化
1 | x = "He1lo {0} {1:10}, you get ${2:0.4f}".format("Mr.", "Jack", 3.2) |
{序号:宽度.精度 类型}
宽度可以是0>
: 右对齐<
: 左对齐^
: 中对齐
如{0:>10.4f}
表示第0项是小数,以宽度至少是10字符,右对齐(宽度不足时空格补在左边),保留小数点后面4位的方式输出。
1 | print("Today is %s.%d." % ('May', 21)) #Today is May.21. |
元组
- 一个元组由数个逗号分隔的值组成,前后可加括号
- 元组不能修改,即不可增删元素,不可对元素赋值,不可修改元素顺序(如排序)
1 | t = 12345, 54321, 'he1lo!' #t是一个元组 |
- 元组的元素的内容有可能被修改。
例如,如果元素是列表,就可以修改该列表
1 | v = ("he11o", [1, 2, 3], [3, 2, 1]) #[1, 2, 3]是列表 |
元组元素的指针本质
- 元组的元素都是指针。元组元素不可修改,是指不可改变元组元素的指向,但是元组元素指向的内容,是有可能被修改的
所谓的元组元素不可改成别的,类似于组建了一只球队,规定球队人员不可更改。但是队员换个发型,增加体重,受伤缺胳膊少腿了,都是可以的
单元素的元组
1 | empty = () #空元组 |
用下标访问元组,以及元组切片
用法和字符串一样
1 | tup1 = ('Google', 'Runoob', 1997, 2000) |
可以对元组进行连接组合
1 | tup1 = (12, 34.56); |
元组运算和迭代
1 | x = (1, 2, 3) * 3 |
元组赋值
1 | x = (1, 2, 3) |
元组比大小
- 两个元组比大小,就是逐个元素比大小,直到分出胜负
- 如果有两个对应元素不可比大小,则出
runtime error
1 | print((1, 'a', 12 ) < (1, 'b', 7)) #>>True |
1 | t = (1, [2, 3], 4, 5) |
重点例题
1 | a = [1, 2, 3] |
用元组(列表)取代复杂分支结构
- 输入1-7,输出星期几
1 | weekdays = "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" |
万年历
例题
已知2012年1月25日是星期三,编写一个程序,输入用”年月日”表示的一个2012年1月25日以后的期,输出该日期是星期几(星期天输出0)。Sample Input
2015 11 02Sample Output
1思路
2012年1月22日是星期天。算出给定日期是从改天起过了x天,然后输出x%7
- 代码
1 | monthDays = [-1, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] #十二个月的天数 |
- 下面的方法可以更快算出过掉的整年的总天数,不必逐年累加
1 | days = 0 |