 
实用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 02
- Sample 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 | 

