第二章 数字类型及其操作3
本章围绕 Python 字符串字符类型操作展开学习分为教学案例与配套实验两大模块。案例以身份证信息解析、字符图形打印、字符统计、凯撒加密为主练习字符串切片、遍历、判断、拼接基础操作实验拓展回文判断、多种加密解密、信用卡 / ISBN 编号校验、数字日期汉字互转、格式化输出、字符绘图等综合场景。习题融合身份信息处理、密码加密、编码校验、格式转换、图案打印等实用场景全面掌握切片、循环遍历、字符判断、替换、格式化、加密算法等字符串核心操作。教学案例三 字符类型及其操作I提取身份证号性别通过身份证的第17位也就是倒数第二位的数字可以辨别该身份证所属人的性别,奇数为男性,偶数为女性。输入身份证号第17位若是偶数输出性别女否则输出性别男sfzhinput(输入身份证号) #代码开始 sexsfzh[:17] sexint(sex) if sex%20: print(性别女) else: print(性别男) #代码结束II提取身份证号生肖sfzhinput(输入身份证号) #代码开始 sxzf猴鸡狗猪鼠牛虎兔龙蛇马羊 nfsfzh[6:10] shuxiangsxzf[int(nf)%12] print(生肖shuxiang) #代码结束III打印三角形hseval(input(请输入行数)) #代码开始 for i in range(hs): print( *(hs-1-i)*(2*i1)) #代码结束IV打印钻石图形hseval(input(请输入行数)) #代码开始 for i in range(hs): print( *(hs-i-1)*(2*i1)) for i in range(hs-2,-1,-1): print( *(hs-i-1)*(2*i1)) #代码结束V身份证合法性检查sfzhinput(输入身份证号) #代码开始 sfzhsfzh.strip() if len(sfzh)!18: print(长度错误) else: if not sfzh[:17].isnumeric(): print(不是数字) #代码结束VI身份证号校验码sfzhinput(输入身份证号) #代码开始 xs 79a584216379a5842 s 0 for i in range(17): if xs[i]! a: sseval(xs[i])*eval(sfzh[i]) else: ss10*eval(sfzh[i]) jym10X98765432 if jym[s%11]! sfzh[17]: print(校验码错误) else: print(合法卡号) #代码结束VII统计字符串中的各类字符x input(请输入字符串) #代码开始 sz0 dxzm0 xxzm0 qt0 hz0 for c in x: if c.isdigit(): szsz1 elif c.isupper(): dxzmdxzm1 elif c.islower(): xxzmxxzm1 elif \u4e00 c and c \u9fff: hzhz1 else: qtqt1 print(大写字母{}小写字母{}汉字{}数字{}其他{}.format(dxzm,xxzm,hz,sz,qt)) #代码结束VIII凯撒密码加密x input(输入明文:) #代码开始 y for c in x: if acz: yychr(ord(a)(ord(c)-ord(a)3)%26) else: yyc print(密文为:y) #代码结束实验三 字符类型及其操作新I判断回文数输入一个整数判断其是否回文数。回文数是指该数翻转后也等于该数本身。例如12321就是回文数12345不是回文数。xinput(请输入一个数字) #代码开始 if x.isdigit(): if x x[::-1]: print(f{x}是回文数) else: print(f{x}不是回文数) else: print(不是数字) #代码结束II凯撒密码解密mw input() #代码开始 ming for i in mw: if i.isupper(): ming ming chr((ord(i)-65-3)%2665) elif i.islower(): ming ming chr((ord(i)-97-3)%2697) else: ming ming i #代码结束 print(ming)III简单密码加密某用户在存储自己的密码时密码由大小写英文字母和数字组成为了不被别人知晓将其按下列规则加密数字字符0用9替换1用8替换2用7替换3用6替换4用5替换5用4替换6用3替换7用2替换8用1替换英文字母a用z替换b用y替换c用x替换d用w替换e用v替换f用u替换g用n替换,以此类推英文字母A用Z替换B用Y替换C用X替换D用W替换E用V替换F用U替换G用N替换,以此类推编写程序输入用户的密码输出其加密后的密码例如输入0012xyzM输出9987cbaNpinput() y #代码开始 for i in p: if i.isdigit(): yystr(9-int(i)) elif i.islower(): ichr(25-(ord(i)-97)97) yi elif i.isupper(): ichr(25-(ord(i)-65)65) yi #代码结束 print(y)IV信用卡号校验编写一个能判断信用卡号是否合法的小程序。信用卡号必须通过lun算法进行校验其过程1、从卡号最后一位数字开始逆向将奇数位(1、3、5等等)相加。2、从卡号倒数第二位数字开始逆向将偶数位数字先乘以2如果乘积为两位数则将其减去9再求和。3、将奇数位总和加上偶数位总和结果应该可以被10整除。例如卡号是5432123456788881逆向奇数位为 4 2 2 4 6 8 8 1 和 35逆向偶数位乘以2有些要减去9的结果1 6 2 6 1 5 7 7求和 35。最后 35 35 70 可以被10整除认定校验通过。注意信用卡的卡号长度是根据输入来确定的。提示字符串[结尾字符:开始字符:负整数]可以逆序间隔地取字符例如 xhello world则x[-1::-2]表示从结尾字符每隔2个字符取子串即drwolhcardidinput(请输入信用卡号) #代码开始 sjso0 for i in cardid[-1::-2]: sjint(i) for i in cardid[-2::-2]: if int(i)*210: soint(i)*2 else: soint(i)*2-9 if(sjso)%100: print(合法卡号) else: print(非法卡号) #代码结束VISBN 校验国际标准书号(ISBN)用10位数字唯一标识的一本书。最后一位数字为校验位可以由其他9位数字计算出来且d12d23d3……10d10必须是11的倍数di的下标表示从右边起第i个数。校验位必须是介于0到10中的一个数字用字母X表示10.例如020131452的校验和是510*09*28*07*16*35*14*43*52*21*5为88是11的倍数编写一个python程序将9位整数作为输入计算校验和并打印isbn号例如输入020131452输出0201314525xinput() #代码开始 a10 b0 for i in x: bint(i)*a a-1 bb%11 b11-b if b10: bX else: bstr(b) print(xb) #代码结束VI打印田字格#打印田字格 xeval(input()) #代码开始 for i in range(2*x-1): if i0 or ix-1 or i2*x-2: print(* *(2*x-1)) else: print(* *(2*x-4)* *(2*x-4)* ) #代码结束VII数字汉字转换不管是阿拉伯数字(1、2、3……), 还是所谓汉字小写数码(一、二、三……), 由于笔画简单,容易被涂改伪篡。所以一般文书和商业财务票据上的数字都要采用汉字数码大写: 壹、贰、叁、肆、伍、陆、柒、捌、玖、拾、佰、仟、“万、亿”本身笔画已经比较复杂,使用机会也少,没有必要再用别的字代替。如“ 3564 元”写作“叁仟伍佰陆拾肆元”xinput() hz零壹贰叁肆伍陆柒捌玖 dw拾佰仟万拾佰仟 y #代码开始 ilen(x) for c in x[:-1]: if c!0or(c0and x[-i1]!0and i!5 and i!9): yhz[int(c)] if c!0 or(c0and((i5and y[-1]!亿and y[-1]!兆)or(i9and y[-1]!兆))): ydw[i-2] i-1 if x[-1]!0: yyhz[int(x[-1])] y元 #代码结束 print(y)VIII日期汉字格式转换编写程序用户输入阿拉伯数字的日期转换为汉字的日期。例如输入2021/2/25,输出二零二一年二月二十五日xinput() hz零一二三四五六七八九 #代码开始 zwnf zwyf zwrh for i in x[:4]: zwnfhz[int(i)] if x[6]!/: if x[6]0: zwyf十 else: zwyf十hz[int(x[6])] else: zwyfhz[int(x[5])] if x[-2]!/: if x[-2]1: if x[-1]!0: zwrh十hz[int(x[-1])] else: zwrh十 else: if x[-1]!0: zwrh二十hz[int(x[-1])] else: zwrh二十 else: zwrhhz[int(x[-1])] #代码结束 print(zwnf年zwyf月zwrh日)IX输出格式化字符gleval(input(请输入武力)) sdeval(input(请输入速度)) zleval(input(请输入智力)) tzleval(input(请输入统治)) #代码开始 print(武力是 {:4}.format(gl)**(gl//10)) print(速度是 {:4}.format(sd)**(sd//10)) print(智力是 {:4}.format(zl)**(zl//10)) print(统治是 {:4}.format(tzl)**(tzl//10)) #代码结束