Python学习笔记02

来源:互联网 发布:网络流行字 编辑:程序博客网 时间:2024/05/16 18:13

chapter_2

Python常用的数学模块

>>>import math>>>math.pi3.14159...>>>math.sqrt(85)9.2195...

随机数字生成器/随机选择器

>>>import random>>>random.random()0.59268735266273953>>>random.choice([1,2,3,4])1

字符串序列的操作

>>>s = 'spam'>>>len(s)4>>>s[0]'s'>>>s[1]'p'>>>s[-1]'m'>>>s[-2]'a'
#以下两个操作等效>>>s[-1]'m'>>>s[len(s)-1]'m'

分片(slice):

  • 在一个分片中,左边界默认为0,右边界默认为分片序列的长度
  • 分片操作会产生一个新的对象,并不会对原对象产生修改
>>>s'Spam'>>>s[1:3]'pa'
>>>s[1:]'pam'>>>s'Spam'>>>s[0:3]'Spa'>>>s[:3]'Spa'>>>s[:-1]'Spa'>>>s[:]'Spam'

合并与重复

>>>s'Spam'>>>s+'XYZ''SpamXYZ'>>>s'Spam'>>>s*3'SpamSpamSpam'

注意:加号(+)对于不同的对象有不同的意义:对于数字为加法,对于字符串为合并,这是Python的一般特性,也就是所谓的多态.总之,一个操作的意义取决于被操作的对象.

字符串的不可变性

字符串在Python中具有不可变性,在创建后就不能就地改变,因此,不能通过对其某一位置进行赋值而改变字符串,但是,你总是可以通过建立一个新的字符串并以同一个变量名对其进行赋值.


小结

在核心类型中,数字,字符串和元组是不可变的;列表和字典是可变的.


字符串的特定方法

>>>s'Spam'>>>s.find('pa') #子字符串查找操作,返回传入的自字符串偏移量,没有找到时返回-1.1>>>s'Spam'>>>s.replace('pa','XYZ') #对全局进行搜索和替换.'SXYZm'
>>>line = 'aaa,bbb,ccc,dd'>>>line.split(',') #通过分隔符将字符串拆分为子字符串['aaa','bbb','ccc','dd']>>>S = 'spam'>>>S.upper() #变为大写字母'SPAM'>>>S.isalpha() #判断是否为字母True>>>line='aaa,bbb,cccc,dd\n'>>>line=line.rstrip() #去掉字符串后面的空格字符>>>line'aaa,bbb,cccc,dd'

字符串的格式化替代

>>>'%s,eggs,and %s'%('spam','SPAM!')'spam,eggs,and SPAM!'>>>'{0},eggs,and {1}'.format('spam','SPAM!')'spam,eggs,and SPAM!'

编写字符串的其他方法

  • 反斜线序列表示特殊的字符
>>>S = 'A\nB\t'>>>len(S)5>>>ord('\n') #获取Ascii值10>>>S = 'A\0B\0C' #'\0'是二进制的0,不是结束字符>>>len(S)5
  • 在三个引号中可以包含多行字符串常量,字符串的打印格式和输入的格式保持一致
>>>msg = '''aaaabbbbbbcccccdddd'''

原始字符串常量(raw)

  • 以字母’r’开头的字符串常量,可以去掉反斜线转义机制

寻求帮助

  • 调用内置的dir函数,可以返回一个包含了对象所有属性的列表
>>>S = 'spam'>>>dir(S)
  • dir函数简单的给出了方法的名称.要查询具体它们是做什么的,可以将它们传递给help函数.
>>>help(S.replace)

模式匹配

  • 模式匹配需要导入 re 模块
>>>import re>>>match = re.match('Hello[ \t]*(.*)world','Hello Python world') #[\t]*表示有零个或几个制表符或空格,[ \t]*表示一个空格之后再匹配零个或几个制表符或空格,(.*)表示有任意个字符>>>match.group(1) #group[0]保存的是匹配的内容,group[1]之后的保存匹配的字符.'Python '>>>match.groups(1) #返回的是匹配的字符元组,groups()和groups(0)是一样的,默认索引为0,保存的是匹配的内容,以元组的方式存储('Python ',)
>>>match = re.match('/(.*)/(.*)/(.*)','/usr/home/lumberjack')>>>match.groups()('usr', 'home', 'lumberjack')>>>match.group()'/usr/home/lumberjack'>>>match.group(1)'usr'>>>match.group(2)'home'>>>match.group(3)'lumberjack'

列表

  • 列表支持字符串中的所有序列操作,唯一的区别就是其结果往往是列表而不是字符串
>>> L = [123,'spam',1.23]>>> len(L)3
>>> L[123, 'spam', 1.23]>>> L[0]123>>> L[:-1][123, 'spam']>>> L+[4,5,6][123, 'spam', 1.23, 4, 5, 6]>>> L[123, 'spam', 1.23]
  • 列表自身具备的操作
>>> L[123, 'spam', 1.23]>>> L.append('NI')>>> L[123, 'spam', 1.23,'NI']>>> L.pop(2)1.23>>> L[123, 'spam','NI']
>>> M['bb', 'aa', 'cc']>>> M.sort()#默认以升序的方式排序>>> M['aa','bb',  'cc']>>> M.reverse()#将列表反转>>> M['cc','bb','aa']

列表的边界检查

  • 尽管列表没有固定的大小,Python仍不允许引用不存在的元素.超出列表末尾之外的索引总是会导致错误,对列表末尾范围之外的赋值也是不被允许的.

嵌套

Python核心数据类型的一个优秀的特性就是它们支持任意的嵌套.

>>> M = [[1,2,3],        [4,5,6],        [7,8,9]]>>> M[[1,2,3],[4,5,6],[7,8,9]]>>> M[1][4,5,6]>>> M[1][2]6

列表解析

  • 处理序列的操作和列表的方法中,Python还包括了一个更高级的操作,称作列表解析表达式,从而提供了一种处理像矩阵这样结构强大的工具.
>>> M[[1,2,3],[4,5,6],[7,8,9]]>>> col2 = [row[1] for row in M] #列表解析不会改变被解析的内容>>> col2[2,5,8]>>> M[[1,2,3],[4,5,6],[7,8,9]]
  • 实际应用中的列表解析
>>> [row[1] + 1 for row in M] [3,6,9]>>> [row[1] for row in M if row[1] % 2 == 0] #筛选出偶数[2,8]
>>> diag = [M[i][i] for i in [0,1,2]] #取出M[0][0],M[1][1],M[2][2]的值>>> diag[1,5,9]>>> doubles = [c * 2 for c in 'spam']>>> doubles['ss','pp','aa','mm']
  • 迭代器(生成器)解析
>>> M[[1,2,3],[4,5,6],[7,8,9]]>>> G = (sum(row) for row in M) #对大列表里面的每一个小列表进行求和,并构造为迭代器>>> next(G)6>>> next(G)15
  • 内置函数map
  • map(参数1,参数2),将参数1一般为函数名,将参数2中的内容逐个取出作为参数1中的函数的参数,运行结果返回一个迭代器

  • list(),将迭代器或可迭代对象的结果取出,放到一个列表中

>>> list(map(sum,M))[6,15,24]
  • 在Python3.0中,解析语法也可以用来创建集合和字典:
>>> {sum(row) for row in M} #产生一个集合{24,6,15}>>> {i:sum(M[i]) for i in range(3)} #构造一个字典{0:6, 1:15, 2:24}

小结

在Python3.0中,列表,集合和字典都可以用解析来创建:

>>> [ord(x) for x in 'spaam'][115,112,97,97,109]>>> {ord(x) for x in 'spaam'}{112,97,115,109}>>> {x:ord(x) for x in 'spaam'}{'a':97,'p':112,'s':115,'m':109}

字典

  • 字典是Python核心对象集合中的唯一的一种映射类型,也具有可变性,能够就地改变,使用时可以根据需求进行增删,就像列表那样.

  • 字典编写在大括号中,并包含一系列的”键:值”对.

  • 字典是可迭代的对象,可以用一个next返回后续的键.
>>> D = {'food':'Spam','quantity':4,'color':'pink'}

*通过键来对字典进行读取或改变键所关联的值,字典保存的顺序是无序的,不能像列表那样通过相对位置来对字典的内容进行读取或修改.

>>> D['food']'Spam'>>> D['quantity'] += 1>>> D{'food':'Spam','quantity':5,'color':'pink'}
  • 创建字典的另一种方式
>>> D = {}>>> D['name'] = 'BOb'>>> D['job'] = 'dev'>>> D['age'] = 40>>> D{'age':40, 'job':'dev' ,'name':'Bob'}>>> print(D['name'])Bob

注意

  • 在Python中,一旦一个对象的最后一次引用被移除,空间将会立即回收.

字典进行有序输出处理

  • 常用方法:通过字典的keys()方法收集一个键的列表,使用列表的sort()方法对键列表进行排序,然后使用Python的for循环逐个进行索引显示.
>>> D = {'a':1,'b':2,'c':3}>>> Ks = list(D.keys())>>> Ks['a','c','b']>>> Ks.sort()>>> Ks['a','b','c']>>> for key in Ks:        print(key, '=>', D[key])a => 1b => 2c => 3
  • 在最近版本的Python中,通过使用最新的sorted内置函数可以一步完成.
>>> D{'a':1,'c':3,'b':2}>>> for key in sorted(D):      #sorted()方法将字典的键排序好返回        print(key, '=>', D[key])a => 1b => 2c => 3

in关系表达式

  • in关系表达式允许我们查询字典中一个键是否存在,并可以通过使用Python的if语句对结果进行分支处理.
>>> D{'a':1,'c':3,'b':2}>>> 'f' in DFalse>>> if not 'f' in D:        print('missing')missing
  • get方法可以避免从字典中获取不存在的字典键
>>> D{'a':1,'c':3,'b':2}>>> value = D.get('x',0) #如果字典中存在'x'的键,则返回对应的值,否则返回设置的值0>>> value0>>> value = D['x'] if 'x' in D else 0 #通过if/else语句来实现上面的功能>>> value0

元组

  • 元组对象(tuple),基本上就像一个不可改变的列表

  • 像列表一样,元组是序列,但它具有不可改变性,和字符串类似.

>>> T = (1,2,3,4)>>> len(T)4>>> T + (5,6)(1,2,3,4,5,6)>>> T(1,2,3,4)>>> T[0]1
  • Python3.0中,元组还有两个专有的可调用方法
>>> T.index(4) #获得元素4的下标索引值3>>> T.count(4) #统计元素4在元组中出现的次数1
  • 元组是不可变的序列
>>> T[0] = 2 #试图改变第一个元素的值,结果报错Traceback (most recent call last):  File "<stdin>", line 1, in <module>TypeError: 'tuple' object does not support item assignment

文件

  • 文件对象是Python代码对电脑上外部文件的主要接口.
  • 要创建一个文件对象,需要调用内置的open函数以字符串的形式传递给它一个外部的文件名以及一个处理模式的字符串.

  • 写入文件

>>> f = open('data.txt','w')>>> f.write('Hello\n') #返回写入的字符串的字节数6>>> f.write('world\n') #依次调用write()方法,是以追加的方式写入内容,并不会覆盖前面的内容6>>> f.close()
  • 读取文件
>>> f = open('data.txt') #默认是以'r'的模式打开>>> text = f.read() #将文件以一个字符串的形式读出>>> text'Hello\nworld\n'>>> print(text)Helloworld>>> text.split() #将字符串按照空白占位符(回车,tab,空格)进行分割,返回列表['Hello','world']>>> f.seek(0) #将文件指针偏移值返回文件头>>> f.readline() #一行一行的读取'Hello\n'>>> f.readline()'world\n'>>> f.seek(0)>>> f.readlines() #将文件的内容一次性读取出来,保存到列表中,列表中的每一个元素是文件的一行['Hello\n', 'world\n']

其他核心类型

  • 集合
>>> X = set('spam') #创建集合>>> X{'m', 'p', 'a', 's'}>>> Y = {'h','a','m'}>>> X,Y({'m', 'p', 'a', 's'}, {'h', 'a', 'm'})>>> X & Y #集合的与运算{'a', 'm'}>>> X | Y #集合或运算{'p', 'h', 'a', 'm', 's'}>>> X - Y #集合减{'p', 's'}
  • 检查对象的类型
>>> L = [1,2,3]>>> if type(L) == type([]):   ...      print('yes')... yes>>> if type(L) == list:...      print('yes')  ... yes>>> if isinstance(L,list): #判断两个参数是否是同一个类型...      print('yes')... yes
0 0
原创粉丝点击