290 likes | 423 Views
字符串计算. 文本数据. 2. 计算机应用 科学计算 信息管理 信息管理中大量的数据都是文本数据 . 如:姓名 , 地址 , 简历等等 小测验 : 身份证号码 , 电话号码等是数值 ? 计算机中用字符串来表示文本数据. Lu Chaojun, SJTU. 字符串类型. 字符串:字符序列 字符串字面值:用一对引号(单/双/三)括住. ' hello world' "~!@#$%^&*" "汉字也是字符" '''line one, line two''' """line one, line two""". 字符的转义. 4.
E N D
文本数据 2 • 计算机应用 • 科学计算 • 信息管理 • 信息管理中大量的数据都是文本数据. • 如:姓名,地址,简历等等 • 小测验:身份证号码,电话号码等是数值? • 计算机中用字符串来表示文本数据. Lu Chaojun, SJTU
字符串类型 • 字符串:字符序列 • 字符串字面值:用一对引号(单/双/三)括住. 'hello world' "~!@#$%^&*" "汉字也是字符" '''line one, line two''' """line one, line two""" Lu Chaojun, SJTU
字符的转义 4 • 字符串本身含有引号怎么办? • 含有单引号:串用双引号括住 "I'm a student." • 含有双引号:串用单引号括住 'He said "I am a student" to the teacher.' • 两者都有: He said, " I'm a student."这个串该用什么引号呢? • 更一般的做法:用escape字符\来转变字符含义 "He said, \"I'm a student.\"" • 以后会学到其他一些字符的转义情形 Lu Chaojun, SJTU
字符串的输入 5 • 错误输入: >>>str = input("Enter a string: ") Enter a string: John • 原因:input()是把输入当成表达式来计算的! • 解决方法: • 输入时加上引号 • 使用raw_input() Lu Chaojun, SJTU
input与raw_input 6 • 例:比较 >>>x = input() >>>x = raw_input() "John" John >>>x >>>x >>>x = input() >>>x = raw_input() 3*4+2 3*4+2 >>>x >>>x • 可见raw_input()将输入当成字符串数据. Lu Chaojun, SJTU
字符串操作:取字符 • 字符串是字符序列,可通过位置索引访问每个字符. <string>[<index-expr>] • 对长度为n的字符串,索引可以 • 是大于0的数:自左向右为0 ~ n1, 或者 • 是负数:自右向左为1, 2, 3,…, n • 例如:若str = "Hello Bob",则 str[0]或str[9]是'H' str[5]或str[4]是' ' str[8]或str[1]是'b' str[9]或str[10]越界出错
字符串操作:取子串 • 切段:取一个索引范围内的字符. <string>[<start>:<end>] • 所取子串:位置索引从start ~ end1 • start或/和end可省略,缺省值为串的首尾 • 例如:若str = "Hello Bob",则 str[0:3]是'Hel' str[5:9]是' Bob' str[:5]即str[0:5] str[5:]即str[5,9] str[:]即str[0:9]
字符串操作:连接 • 两字符串的连接 <string1> + <string2> • 例如: "Hello" + "Bob"得到"HelloBob" • 一个字符串的重复 • 例如: 3*"Hi"和"Hi"*3都得到"HiHiHi" • 串长度函数len()
编程实例:表查找 • 在一个数据表里查找目标 def main(): months="JanFebMarAprMayJunJulAugSepOctNovDec" n = input("Enter month number (1-12): ") pos = (n-1)*3 monthAbbr = months[pos:pos+3] print "The month abbreviation is",monthAbbr+"." • 这是简单查找:利用位置规律来定位. • 例如:定长记录文件. • 若是月份全称怎么办?
字符的机内表示 • 与数值一样,计算机内用二进制数表示每一个字符. • 因此操作字符串本质上仍然是数值运算. • 表示字符的这个数值称为字符的编码. • 问题:计算机采用什么字符集?其中每个字符用什么编码? • 对这个问题的不同回答就导致了许多不同的字符编码系统.
编码标准 • 不同计算机若用不同编码,则彼此无法沟通. • 标准化 • ASCII:单字节编码,但只用到7位(0~127) • 96个可打印字符,32个控制字符 • ISO/IEC 8859-1(Latin-1):单字节用满8位(0~255) • GB2312:两字节(7445字符/6763汉字) • GBK:两字节(21886字符/21003汉字),中文缺省编码 • GB18030:最多四字节(76556字符/70244汉字) • ISO/IEC 10646或Unicode:最多四字节.
字符与编码 • 求给定字符的编码: ord() ord('a')可得97 • 求给定编码的字符:chr() chr(97)可得'a' • 可见Python 2.7默认编码为ASCII. • Q:非ASCII字符怎么办?A:用Unicode字符串 >>>print u'A\xc4B' AÄB
Python程序中使用汉字 • 国际化:希望程序中显示中文信息 • 中文Windows的缺省编码是GBK >>>'汉' \xba\xba 输入'汉'即输入其GBK编码 >>>print '\xba\xba' 或用'汉' 汉 print语句能正确解码GBK >>>print '\xba\xba\xc4' 不能解码! • 最好用Unicode >>>print u'\u6c49\xc4' \xc4或用\u00c4 汉Ä
编程实例:编码与解码 • 编码与解码是用计算机解决问题时常用的方法 • 底层的字符编码 • 高层应用编码:如图像,音频视频,密码学...... • 编码 message=raw_input(“Enter the message to encode: “) for ch in message: print ord(ch), • 解码 code = raw_input(“Enter the code of message: “) message = “” for numStr in string.split(code): num = eval(numStr) message = message + chr(num) print “The decoded message is:”,message
从编码到密码 • 字符编码是物理实现的必然,不是为了保密. • 密码:为了保密而对信息进行编码. • 福尔摩斯探案:跳舞的小人. 加密 明文 密文 解密
字符串库 • Python提供的string模块包含了很多有用的字符串处理函数 • 例如split():将字符串拆分成子串 string.split(“Hello string library!”) 返回结果:[‘Hello’,’string’,’library!’] string.split(“32,24,25,57”,”,”) 返回结果:[’32’,’24’,’25’,’57’]
字符串库(续) • 一些常用函数 capitalize(s): 使s首字母大写 capwords(s): 使s的每个单词首字母大写 center(s,width), ljust(s,width), rjust(s,width): 使s变成width宽度且居中/左对齐/右对齐 count(s,sub): sub在s中出现次数 find(s,sub), rfind(s,sub): 在s中找sub的首次/末次出现 join(seq): 将串序列中的串合并成一个串,分隔符默认为空格 lower(s), upper(s): 将串变成小写/大写 lstrip(s), rstrip(s): 删除打头/收尾的空格 replace(s,oldsub,newsub): 在s中用新子串替换旧子串
数值与字符串的互相转换 • eval()函数:将字符串当作数值表达式进行计算. • 语法: eval(<string>) • 例如: eval("3+4*5") • str()函数:将数值当作字符串 • 语法: str(<expr>) • 例如: str(3+4*5)
字符串的格式化输出 • 格式化运算符% • 语法 <template-string> % (<values>) • 语义:模板串中用%标记“空位”,输出时用实际值填入. • 例如 print “The price is $%0.2f” % (100)
格式描述 • 空位:格式指示符,描述了填入的值的输出形式. %<width>.<precision><type-char> • 三种类型字符:decimal, float, string • 宽度:用多少位置显示数值. • 省略或指定为0:根据值的实际长度显示. • 宽度超出值的长度时:右对齐显示 • 宽度前加负号:左对齐. • 对浮点数用超长宽度会怎样?试试… • 精度:指示浮点数值的小数位数. • 省略:按系统默认的小数位数显示. print "%f" % (math.pi)
编程实例:浮点数如何精确化? • 浮点数的机内表示是近似值. • 银行应用要求精确表示金额,故不宜用浮点数及浮点运算. • 解决办法:以“分”为单位,用整数表示金额. • 设金额是x分,输出时利用x/100和x%100分别得到“元”和“角分”. print “You have %d.%02d” % \ (x/100, x%100) • 02d:不足2位用0填充 • \:语句换行继续
文件处理 23 • 文件:存储在磁盘上的一组数据. • 典型的数据组织粒度: • 基本数据项 • 若干数据项构成固定结构的记录 • 若干记录构成文件 • 例: • 基本数据项:学号,姓名,年龄 • 一个学生的记录:{学号,姓名,年龄} • 一个文件:全体学生的记录 Lu Chaojun, SJTU
文本文件 24 • 文件中是文本数据,而非二进制数据. • 可视为存储在磁盘上的字符串. • 单行字符串 • 多行字符串 • 行尾(EOL):用特殊字符,如新行(newline)字符. • Python用\n表示新行字符,该字符在显示时被解释成新行字符. 例: print “first line\nsecond line” Lu Chaojun, SJTU
文件处理:打开文件 25 • 打开文件:将磁盘文件与一个变量关联,做好读写准备. <filevar> = open(<filename>,<mode>) • <mode>: “r”或“w” • 例如 infile = open("myfile","r") outfile = open("myfile","w") • 写打开时小心文件名!因为可能破坏现有文件 Lu Chaojun, SJTU
文件处理:读写文件 26 • 读文件:读出文件内容 <filevar>.read() <filevar>.readline() <filevar>.readlines() • 点表示法:文件是对象! • 要有文件当前读写位置的概念! • 写文件:将新内容写入文件. <filevar>.write(<string>) • 若想写多行内容,需写入\n Lu Chaojun, SJTU
文件处理:关闭文件 27 • 关闭文件:取消文件变量与磁盘文件的关联. <filevar>.close() • 关闭文件时,系统会将内存中文件内容输出到磁盘. Lu Chaojun, SJTU
编程实例:批处理 28 • 通过文件实现成批数据的输入输出 • 这种情况不适合用交互方式输入 infile = open(infileName,'r') outfile = open(outfileName,'w') for line in infile.readlines(): first, last = string.split(line) uname = string.lower(first[0]+last[:7]) outfile.write(uname + '\n') infile.close() outfile.close() Lu Chaojun, SJTU