1 / 29

字符串计算

字符串计算. 文本数据. 2. 计算机应用 科学计算 信息管理 信息管理中大量的数据都是文本数据 . 如:姓名 , 地址 , 简历等等 小测验 : 身份证号码 , 电话号码等是数值 ? 计算机中用字符串来表示文本数据. Lu Chaojun, SJTU. 字符串类型. 字符串:字符序列 字符串字面值:用一对引号(单/双/三)括住. ' hello world' "~!@#$%^&*" "汉字也是字符" '''line one, line two''' """line one, line two""". 字符的转义. 4.

Download Presentation

字符串计算

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 字符串计算

  2. 文本数据 2 • 计算机应用 • 科学计算 • 信息管理 • 信息管理中大量的数据都是文本数据. • 如:姓名,地址,简历等等 • 小测验:身份证号码,电话号码等是数值? • 计算机中用字符串来表示文本数据. Lu Chaojun, SJTU

  3. 字符串类型 • 字符串:字符序列 • 字符串字面值:用一对引号(单/双/三)括住. 'hello world' "~!@#$%^&*" "汉字也是字符" '''line one, line two''' """line one, line two""" Lu Chaojun, SJTU

  4. 字符的转义 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. 字符串的输入 5 • 错误输入: >>>str = input("Enter a string: ") Enter a string: John • 原因:input()是把输入当成表达式来计算的! • 解决方法: • 输入时加上引号 • 使用raw_input() Lu Chaojun, SJTU

  6. 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

  7. 字符串操作:取字符 • 字符串是字符序列,可通过位置索引访问每个字符. <string>[<index-expr>] • 对长度为n的字符串,索引可以 • 是大于0的数:自左向右为0 ~ n1, 或者 • 是负数:自右向左为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]越界出错

  8. 字符串操作:取子串 • 切段:取一个索引范围内的字符. <string>[<start>:<end>] • 所取子串:位置索引从start ~ end1 • 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]

  9. 字符串操作:连接 • 两字符串的连接 <string1> + <string2> • 例如: "Hello" + "Bob"得到"HelloBob" • 一个字符串的重复 • 例如: 3*"Hi"和"Hi"*3都得到"HiHiHi" • 串长度函数len()

  10. 编程实例:表查找 • 在一个数据表里查找目标 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+"." • 这是简单查找:利用位置规律来定位. • 例如:定长记录文件. • 若是月份全称怎么办?

  11. 字符的机内表示 • 与数值一样,计算机内用二进制数表示每一个字符. • 因此操作字符串本质上仍然是数值运算. • 表示字符的这个数值称为字符的编码. • 问题:计算机采用什么字符集?其中每个字符用什么编码? • 对这个问题的不同回答就导致了许多不同的字符编码系统.

  12. 编码标准 • 不同计算机若用不同编码,则彼此无法沟通. • 标准化 • 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:最多四字节.

  13. 字符与编码 • 求给定字符的编码: ord() ord('a')可得97 • 求给定编码的字符:chr() chr(97)可得'a' • 可见Python 2.7默认编码为ASCII. • Q:非ASCII字符怎么办?A:用Unicode字符串 >>>print u'A\xc4B' AÄB

  14. Python程序中使用汉字 • 国际化:希望程序中显示中文信息 • 中文Windows的缺省编码是GBK >>>'汉' \xba\xba 输入'汉'即输入其GBK编码 >>>print '\xba\xba' 或用'汉' 汉 print语句能正确解码GBK >>>print '\xba\xba\xc4' 不能解码! • 最好用Unicode >>>print u'\u6c49\xc4' \xc4或用\u00c4 汉Ä

  15. 编程实例:编码与解码 • 编码与解码是用计算机解决问题时常用的方法 • 底层的字符编码 • 高层应用编码:如图像,音频视频,密码学...... • 编码 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

  16. 从编码到密码 • 字符编码是物理实现的必然,不是为了保密. • 密码:为了保密而对信息进行编码. • 福尔摩斯探案:跳舞的小人. 加密 明文 密文 解密

  17. 字符串库 • Python提供的string模块包含了很多有用的字符串处理函数 • 例如split():将字符串拆分成子串 string.split(“Hello string library!”) 返回结果:[‘Hello’,’string’,’library!’] string.split(“32,24,25,57”,”,”) 返回结果:[’32’,’24’,’25’,’57’]

  18. 字符串库(续) • 一些常用函数 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中用新子串替换旧子串

  19. 数值与字符串的互相转换 • eval()函数:将字符串当作数值表达式进行计算. • 语法: eval(<string>) • 例如: eval("3+4*5") • str()函数:将数值当作字符串 • 语法: str(<expr>) • 例如: str(3+4*5)

  20. 字符串的格式化输出 • 格式化运算符% • 语法 <template-string> % (<values>) • 语义:模板串中用%标记“空位”,输出时用实际值填入. • 例如 print “The price is $%0.2f” % (100)

  21. 格式描述 • 空位:格式指示符,描述了填入的值的输出形式. %<width>.<precision><type-char> • 三种类型字符:decimal, float, string • 宽度:用多少位置显示数值. • 省略或指定为0:根据值的实际长度显示. • 宽度超出值的长度时:右对齐显示 • 宽度前加负号:左对齐. • 对浮点数用超长宽度会怎样?试试… • 精度:指示浮点数值的小数位数. • 省略:按系统默认的小数位数显示. print "%f" % (math.pi)

  22. 编程实例:浮点数如何精确化? • 浮点数的机内表示是近似值. • 银行应用要求精确表示金额,故不宜用浮点数及浮点运算. • 解决办法:以“分”为单位,用整数表示金额. • 设金额是x分,输出时利用x/100和x%100分别得到“元”和“角分”. print “You have %d.%02d” % \ (x/100, x%100) • 02d:不足2位用0填充 • \:语句换行继续

  23. 文件处理 23 • 文件:存储在磁盘上的一组数据. • 典型的数据组织粒度: • 基本数据项 • 若干数据项构成固定结构的记录 • 若干记录构成文件 • 例: • 基本数据项:学号,姓名,年龄 • 一个学生的记录:{学号,姓名,年龄} • 一个文件:全体学生的记录 Lu Chaojun, SJTU

  24. 文本文件 24 • 文件中是文本数据,而非二进制数据. • 可视为存储在磁盘上的字符串. • 单行字符串 • 多行字符串 • 行尾(EOL):用特殊字符,如新行(newline)字符. • Python用\n表示新行字符,该字符在显示时被解释成新行字符. 例: print “first line\nsecond line” Lu Chaojun, SJTU

  25. 文件处理:打开文件 25 • 打开文件:将磁盘文件与一个变量关联,做好读写准备. <filevar> = open(<filename>,<mode>) • <mode>: “r”或“w” • 例如 infile = open("myfile","r") outfile = open("myfile","w") • 写打开时小心文件名!因为可能破坏现有文件 Lu Chaojun, SJTU

  26. 文件处理:读写文件 26 • 读文件:读出文件内容 <filevar>.read() <filevar>.readline() <filevar>.readlines() • 点表示法:文件是对象! • 要有文件当前读写位置的概念! • 写文件:将新内容写入文件. <filevar>.write(<string>) • 若想写多行内容,需写入\n Lu Chaojun, SJTU

  27. 文件处理:关闭文件 27 • 关闭文件:取消文件变量与磁盘文件的关联. <filevar>.close() • 关闭文件时,系统会将内存中文件内容输出到磁盘. Lu Chaojun, SJTU

  28. 编程实例:批处理 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

  29. End

More Related