目录
序列通用操作自学检测
拼接成一个新列表 B
索引操作 A序列的重复操作 D
切片操作 A
获取序列的长度 B
索引号 A
成员测试 A
切片 A
重复操作 D
字符串常用方法自学检测
子串的索引位置 B
upper B
检查字符串是否以指定的子串结束 B
分割一个字符串 A
title() A
合并一个字符串列表 B
去除字符串首尾的空白字符 B
检查字符串 A
字符串转换为整数 A
找到子串 A
5.1 统计英文文件中的单词数(project)
# 补充你的代码
a = input()
import string
with open(f'/data/bigfiles/{a}', 'r', encoding='utf-8') as text: # 打开文件a.txt,创建文件对象
txt = text.read() # 读文件为字符串
for i in ",.!\'":
txt = txt.replace(i, " ")
x1 = txt.split()
print('共有'+str(len(x1))+"个单词")
5.2 凯撒密码(project)
凯撒密码-加密
import string def caesar_cipher(text): """接收一个字符串为参数,采用字母表和数字中后面第3个字符代替当前字符的方法 对字符串中的字母和数字进行替换,实现加密效果,返回值为加密的字符串。 例如:2019 abc 替换为5342 def """ ########## Begin ########## lower = string.ascii_lowercase upper = string.ascii_uppercase digit = string.digits before = lower + upper + digit after = lower[3:]+lower[:3] + upper[3:]+upper[:3]+ digit[3:]+digit[:3] result = ''.maketrans(before, after) return text.translate(result) ########## End ########## if __name__ == '__main__': plaintext = input() print(caesar_cipher(plaintext)) #+
凯撒密码-解密import string def caesar_decrypt(text, offset): """接收一个加密的字符串text和一个整数offset为参数,采用字母表和数字中前面第offset个字符 代替当前字符的方法对字符串中的字母和数字进行替换,实现解密效果,返回值为解密的字符串。""" ###############################Begin############################################# lower = string.ascii_lowercase # 小写字母 upper = string.ascii_uppercase # 大写字母 digit = string.digits # 数字 before = string.ascii_letters + digit after = lower[offset:] + lower[:offset] + upper[offset:] + upper[:offset] + digit[offset:] + digit[:offset] table = ''.maketrans(after, before) decrypt_text = text.translate(table) return decrypt_text ################################End############################################## def find_offset(key_text, ciphertext): """接收一个单词和一个加密字符串为参数,尝试用[0,25]之间的数为偏移量进行解密。 如果key_text 在解密后的明文里,则说明解密成功。 找出偏移量数值并返回这个整数偏移量。""" ###############################Begin############################################# for i in range(26): plain_text = caesar_decrypt(ciphertext, i) #使用i作为偏移量,尝试解密得到明文 if key_text in plain_text : # 如果key_text在明文里,说明偏移值为i时能成功解密 return i ################################End############################################## if __name__ == '__main__': key_message = 'question' #密文中的已知单词 cipher_text = 'Yt gj,tw sty yt gj,ymfy nx f vzjxynts.' #截获的密文 secret_key = find_offset(key_message, cipher_text) #破解密码,得到密匙 print(f'密钥是{secret_key}') target_text = input() #读入新密文,进行解密 #'Fyyfhp ts Ujfwq Mfwgtw ts Ijhjrgjw 2, 6496' #新密文,需要解密 print(caesar_decrypt(target_text, secret_key)) #解密,打印明文
5.4 文本分析与加密(project)
统计字符数量
import string # 读文件,返回字符串 def read_file(file): # 补充你的代码 with open(file, 'r', encoding='utf-8') as f: return f.read() # 返回大写字母、小写字母、数字、空格和其他字符的数量 def classify_char(txt): # 补充你的代码 upper, lower, digit, space, other = 0, 0, 0, 0, 0 for ch in txt: if ch.islower(): lower = lower + 1 elif ch.isupper(): upper = upper + 1 elif ch.isnumeric(): digit = digit + 1 elif ch.isspace(): space = space + 1 else: other = other + 1 return upper, lower, digit, space, other if __name__ == '__main__': filename = 'mayun.txt' # 读取的文件名 text = read_file(filename) # text为字符串 print(*classify_char(text))
统计单词数量import string # 读文件,返回字符串 def read_file(file): with open(file, 'r', encoding='utf-8') as f: return f.read() def word_list(txt): """用空格替换所有符号,切分为列表""" for ch in '!"#$%&()*+,-.:;<=>?@[\\]^_’‘{|}~/': # 补充你的代 txt = txt.replace(ch, " ") # 所有符号替换为空格 # print(txt) return txt.split() # 切分为列表,返回列表 def number_of_words(ls): """返回单词数量""" # 补充你的代码 total_words = len(ls) # 列表长度 return total_words # 列表长度即单词个数 if __name__ == '__main__': filename = 'mayun.txt' # 读取的文件名 text = read_file(filename) # text为字符串 words_list = word_list(text) # 单词的列表 words_counts = number_of_words(words_list) print(f'共有{words_counts}单词')
计算偏移量import string # def offset_cal(day): """用字符串中字符ASCII值的和对26取模为偏移量""" # 补充你的代码 sum_of_ch = 0 for c in day: sum_of_ch = sum_of_ch + ord(c) offset = sum_of_ch % 26 return offset if __name__ == '__main__': secret_word = input() offset_number = offset_cal(secret_word) print(offset_number)
凯撒密码加密import string # 读文件,返回字符串 def read_file(file): with open(file, 'r', encoding='utf-8') as f: return f.read() # def offset_cal(day): """用字符串中字符ASCII值的和对26取模为偏移量 """ sum_of_ch = 0 for c in day: sum_of_ch = sum_of_ch + ord(c) offset = sum_of_ch % 26 return offset def kaisa(txt, number): # 补充你的代码 lower = string.ascii_lowercase # 小写字母 upper = string.ascii_uppercase # 大写字母 before = string.ascii_letters after = lower[number:] + lower[:number] + upper[number:] + upper[:number] table = ''.maketrans(before, after) # 创建映射表 return txt.translate(table) if __name__ == '__main__': filename = 'mayun.txt' # 读取的文件名 text = read_file(filename) # text为字符串 secret_word = input() offset_number = offset_cal(secret_word) print(kaisa(text, offset_number))
5.5 日期分析处理(project)
判断闰年
def leap(current_date): """接收一个用8个字符表示日期的字符串为参数,判断这个日期中的年份是否为闰年 返回值为布尔型。 闰年的判定方法是:能被400整除或能被4整除且同时不能被100整除的是闰年。 """ # 补充你的代码 if (int(current_date[:4]) % 4 ==0 or int(current_date[:4]) % 400 ==0) and int(current_date[:4]) % 100 !=0: return True else: return False if __name__ == '__main__': date = input() # 输入一个表示年份的8位数字字符串 if leap(date[:4]): # 如果输入的年份是闰年 print(f'{date[:4]}年是闰年') else: print(f'{date[:4]}年不是闰年')
输出当前月份共有多少天def days_of_month(current_date): """接收一个用8个字符表示日期的字符串为参数,计算这个日期中的月份有多少天?返回值为整型, 表示当前月份天数。 @参数 current_date:表示日期,字符串类型 """ # 补充你的代码 dm = [31,28,31,30,31,30,31,31,30,31,30,31] if leap(current_date): dm[1] = 29 days = dm[(int(CurrentDate[4:6])-1)] return days def leap(current_date): """接收一个用8个字符表示日期的字符串为参数,判断这个日期中的年份是否为闰年 返回值为布尔型。 闰年的判定方法是:能被400整除或能被4整除且同时不能被100整除的是闰年。 """ # 补充你的代码 if (int(current_date[:4]) % 4 ==0 or int(current_date[:4]) % 400 ==0) and int(current_date[:4]) % 100 !=0: return True else: return False if __name__ == '__main__': CurrentDate = input() days = days_of_month(CurrentDate) print(f'{CurrentDate[:4]}年{int(CurrentDate[4:6])}月有{days}天')
日期转换格式def separate_date(current_date, symbol): """接收一个用8个字符表示日期的字符串和一个符号为参数,返回用该符号分隔的日期,字符串类型。 @参数 current_date:表示日期,字符串类型 @参数 symbol:分隔符号,字符串类型 例如传入'20201031'和"/",返回字符串'2020/09/09' """ # 补充你的代码 return f'{current_date[0:4]}{symbol}{current_date[4:6]}{symbol}{current_date[6:]}' if __name__ == '__main__': CurrentDate = input() # 输入8位数字表示的日期 sign = input() # 输入分隔符 print(separate_date(CurrentDate, sign)) # 输出用分隔符分隔的日期
判断日期合法性def legal_judge(current_date): """接收一个用8个字符表示日期的字符串为参数,判定日期的合法性,返回值为布尔型。 1,3,5,7,8,10,12月各31天,4,6,9,11各30天,闰年2月29天,平年2月28天。 @参数 current_date:表示日期,字符串类型 """ # 补充你的代码 dm = [31,28,31,30,31,30,31,31,30,31,30,31] if leap(current_date): dm[1] = 29 if int(CurrentDate[6:]) <= dm[(int(CurrentDate[4:6])-1)]: return True else: return False def leap(current_date): """接收一个用8个字符表示日期的字符串为参数,判断这个日期中的年份是否为闰年 返回值为布尔型。 闰年的判定方法是:能被400整除或能被4整除且同时不能被100整除的是闰年。 """ # 补充你的代码 if (int(current_date[:4]) % 4 ==0 or int(current_date[:4]) % 400 ==0) and int(current_date[:4]) % 100 !=0: return True else: return False if __name__ == '__main__': CurrentDate = input() if legal_judge(CurrentDate): print(f'{CurrentDate}是合法日期') else: print(f'{CurrentDate}是非法日期')
月份的英文名称def name_of_month(current_date): """接收一个用8个字符表示日期的字符串为参数,返回这个月份对应的英文单词及其缩写形式。 @参数 current_date:表示日期,字符串类型 例如:current_date为20201031,返回值为'October','Oct.' 日期的英文全称:['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October','November', 'December'] 日期的英文缩写:September为前四位字母加点,其余月份均为前三位字母加点,如:'Sept.','Jan.' """ # 补充你的代码 m =['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October','November', 'December'] monthName = m[(int(current_date[4:6])-1)] if int(current_date[4:6]) == 9: monthAbbr = str(monthName[:4]) else: monthAbbr = str(monthName[:3]) return monthName, monthAbbr if __name__ == '__main__': CurrentDate = input() monthName, monthAbbr = name_of_month(CurrentDate) # 获得月份名称和缩写 print(f'{int(CurrentDate[4:6])}月英文是{monthName},缩写为{monthAbbr}.')
5.6 单词猎手游戏(project)
字符串、列表随机取值
import random def read_file(file): """接收一个文件名为参数,读取文件中的内容为字符串类型, 替换字符串中的标点和符号为空格,根据空格将字符串切分为单词为元素的列表, 返回这个列表。 @参数 file:文件名,字符串类型 读取文件前先输出'正在从文件加载单词列表...' 转为列表后输出输出'成功加载了多少个单词' """ print('正在从文件加载单词列表...') with open(file, 'r', encoding='utf-8') as novel: txt = novel.read() symbols = '!"#$%&()*+,-.:;[\'][\"]<=>?@[\\]^_‘{|}~/' #标点、符号 字符串 # 将所有符号替换为空格 #####################Begin##################################### # 此处去掉注释符号“#”并补充你的代码 for i in symbols: if i in txt: txt = txt.replace(i, " ") #####################End##################################### print(f'成功加载{len(txt.split())}个单词') return txt.split() # 切分为列表,返回列表 def secret_word(ls): """参数为从文件中读取的单词列表,返回值为随机得到的一个单词。 @参数 ls:单词列表,列表类型 在测试程序时,可以先预设一个有少数单词的列表,例如随机数种子为19730516时: # >>> ls = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'] # >>> secret_word(ls) # 'Monday' """ #####################Begin##################################### # 此处去掉注释符号“#”并补充你的代码 return random.choice(ls) #####################End##################################### if __name__ == '__main__': test_seed = int(input()) random.seed(test_seed) filename = 'data/gone with the wind.txt' # 文件名 wordlist = read_file(filename) secretword = secret_word(wordlist) print(secretword)
猜测目标单词def get_guessed_word(cover_word, word, letter): """接受三个字符串为参数:分别表示正在猜测的遮盖了字母的单词、随机抽取的单词和正在猜测的字母。 每次猜测后产生一个由猜中字母和下划线与空格组成的字符串,猜中的字母显示出来,未知字母用"_" 表示,字母间留一个空格。返回每次猜测后由字母和下划线组成的字符串。 @参数 cover_word:遮盖了字母的单词,字符串类型 @参数 word:随机抽取的单词,字符串类型 @参数 letter:正在猜测的字母,字符串类型 """ #####################Begin##################################### # 此处去掉注释符号“#”并补充你的代码 for i in range(len(word)): if letter == word[i]: cover_word = cover_word[:2*i] + letter + " " + cover_word[2*(i+1):] #####################End##################################### print(f'当前猜测结果为:{cover_word}') return cover_word if __name__ == '__main__': word = input() print(f'单词长度为{len(word)}') # 先提示用户单词长度 cover_word = '_ ' * len(word) # 产生一个由下划线与空格构成的字符串,每组下划线与空格代表一个字母 print(cover_word) for i in range(1, 2 * len(word) + 1): # 最多猜测2倍字母数次 print(f'当前是第{i}次猜测,你还有{2 * len(word) - i}次机会') letter = input('请输入你猜测的字母:') # 输入猜测的字母 cover_word = get_guessed_word(cover_word, word, letter) guess_word = cover_word.replace(' ', '') if guess_word == word: # 替换字符串中的空格,查看是否猜中 print(f'你太厉害了,居然只用了{i}次就猜中了单词') print(f'秘密单词是:{guess_word}') # 猜中后输出时去掉单词中的空格 break
单词猎手游戏import random def read_file(file): """接收一个文件名为参数,读取文件中的内容为字符串类型, 替换字符串中的标点和符号为空格,根据空格将字符串切分为单词为元素的列表, 返回这个列表。 @参数 file:文件名,字符串类型 读取文件前先输出'正在从文件加载单词列表...' 转为列表后输出输出'成功加载了多少个单词' """ print('正在从文件加载单词列表...') with open(file, 'r', encoding='utf-8') as novel: txt = novel.read() symbols = '!"#$%&()*+,-.:;[\'][\"]<=>?@[\\]^_‘{|}~/' for ch in symbols: txt = txt.replace(ch, " ") # 所有符号替换为空格 print(f'成功加载{len(txt.split())}个单词') # print(txt.split()) return txt.split() # 切分为列表,返回列表 def secret_word(ls): """参数为从文件中读取的单词列表,返回值为随机得到的一个单词。 @参数 ls:单词列表,列表类型 在测试程序时,可以先预设一个有少数单词的列表,例如随机数种子为19730516时: # >>> ls = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'] # >>> secret_word(ls) # 'Monday' """ #####################Begin##################################### # 此处去掉注释符号“#”并补充你的代码 word = random.choice(ls) return word #####################End##################################### def get_guessed_word(cover_word, word, letter): """接受三个字符串为参数:分别表示正在猜测的遮盖了字母的单词、随机抽取的单词和正在猜测的字母。 每次猜测后产生一个由猜中字母和下划线与空格组成的字符串,猜中的字母显示出来,未知字母用"_" 表示,字母间留一个空格。返回每次猜测后由字母和下划线组成的字符串。 @参数 cover_word:遮盖了字母的单词,字符串类型 @参数 word:随机抽取的单词,字符串类型 @参数 letter:正在猜测的字母,字符串类型 """ #####################Begin##################################### # 此处去掉注释符号“#”并补充你的代码 for i in range(len(word)): if letter == word[i]: cover_word = cover_word[:2*i] + letter + " " + cover_word[2*(i+1):] #####################End##################################### print(f'当前猜测结果为:{cover_word}') return cover_word def word_guess(word): """以随机抽取的秘密单词为参数,参数类型为字符串。 @参数 word:随机抽取的秘密单词,字符串类型 先输出一个单词长度的提示信息,产生一个由下划线与空格构成的字符串,每组下划线与空格代表一个字母 限制用户最多猜测次数为单词长度的2倍 每次猜测并输入一个字母,调用get_guessed_word()函数对猜测进行处理。 然后回车换行,并按题目要求进行输出。 若去除处理后的单词中的空格后得到的单词与传入参数相同,表示已经猜中了秘密单词。 例如秘密单词为'Tuesday',且用户在6次猜测时猜中了单词中的全部字母,此时输出: 你太厉害了,居然只用了6次就猜中了单词 秘密单词是:Tuesday '""" #####################Begin##################################### # 此处去掉注释符号“#”并补充你的代码 print(f'单词长度为{len(word)}') # 先提示用户单词长度 cover_word = '_ ' * len(word) # 产生一个由下划线与空格构成的字符串,每组下划线与空格代表一个字母 print(cover_word) for i in range(1, 2 * len(word) + 1): # 最多猜测2倍字母数次 print(f'当前是第{i}次猜测,你还有{2 * len(word) - i}次机会') letter = input('请输入你猜测的字母:') # 输入猜测的字母 cover_word = get_guessed_word(cover_word, word, letter) guess_word = cover_word.replace(' ', '') if guess_word == word: # 替换字符串中的空格,查看是否猜中 print(f'你太厉害了,居然只用了{i}次就猜中了单词') print(f'秘密单词是:{guess_word}') # 猜中后输出时去掉单词中的空格 return guess_word else: print(f'太遗憾了,你未能在{2 * len(word)}次内猜出单词') return cover_word #####################End##################################### def judge(txt): """接收一个字符串为参数,根据参数值调用不同函数完成任务""" test_seed = int(input()) random.seed(test_seed) filename = 'data/gone with the wind.txt' # 文件名 wordlist = read_file(filename) secretword = secret_word(wordlist) if txt == '选词': # 输出抽中的单词 #####################Begin##################################### # 此处去掉注释符号“#”并补充你的代码 print(secretword) #####################End##################################### elif txt == '模板': # 输出猜词模板,形如:_ _ _ _ _ _ #####################Begin##################################### # 此处去掉注释符号“#”并补充你的代码 print('_ ' * len(secretword)) #####################End##################################### elif txt == '开始填词': word_guess(secretword) else: print('输入错误') if __name__ == '__main__': text = input() judge(text)