字典的狂舞之石头剪刀布
小美:阿福,你玩过石头剪刀布游戏吗?
阿福:这是什么问题?谁还能没玩过石头剪刀布?要知道它可是一种世界闻名的猜拳游戏。它起源于中国,然后传到日本、朝鲜等地,随着亚欧贸易的不断发展它传到了欧洲,到了近现代逐渐风靡世界。简单明了的规则(石头打剪刀,布包石头,剪刀剪布),使得石头剪刀布游戏没有任何规则漏洞可钻,单次玩法比拼运气,多回合玩法比拼心理博弈,使得石头剪刀布这个古老的游戏同时拥有“意外”与“技术”两种特性,深受世界人民喜爱。
小美:哟,你还知道的挺多。那你会编写程序和电脑玩石头剪刀布游戏吗?
阿福:这个应该不难,不就是几条分支语句吗?我今天就让你看看我扎实的基本功。
问题1:
函数功能:根据游戏规则和甲乙玩家出拳情况,输出石头剪子布游戏的结果。
函数名:rock_paper_scissors(s1:str,s2:str)->str
参数表:s1,s2-- 字符串,分别表示甲乙两个人的出拳,只可能取值在{"石头","剪刀","布"}中。
返回值:字符串,存储了游戏结果,只可能取值在{"甲胜","乙胜","平局"}中。
示例1:s1="石头",s2="剪刀",返回"甲胜";
示例2:s1="石头",s2="布",返回"乙胜";
示例3:s1="石头",s2="石头",返回"平局"。
代码1:defrock_paper_scissors(s1:str, s2:str)->str:
if s1 == s2:
ans = "平局"
elif (s1 == "石头" and s2 == "剪刀" or
s1 == "剪刀" and s2 == "布" or
s1 == "布" and s2 == "石头"):
ans = "甲胜"
else:
ans = "乙胜"
return ans
小美:嗯,程序确实符合算法要求,思路也还算清晰。但你不觉得代码有点长吗?
阿福:这还长?
小美:是啊,特别是那个elif语句,里面条件表达式太长了,and和or交织在一起,这样容易出错。
阿福:那倒是。不过也没办法,它就是要分成3种情况来判断。难道你有更好的方法?
小美:哈哈,初中生要向小学生请教了!我给你点提示吧:利用Python里面的字典数据结构。
阿福:字典?我知道字典,它是用键值对存储元素的一种数据结构。但是它跟这道题目好像没什么关系啊。
小美:瞧瞧你这脑回路,亏你还知道键值对!我问你,本题中的出拳名称是不是各不相同,而且可以用字符串来存储?
阿福:是啊,我刚才就是这样做的。各不相同、字符串。。。。。。。哦,我明白了!我们可以使用出拳名称来作为字典元素的键,然后每种拳法的天敌作为其对应的值。例如R["石头"]="布",表示"石头"的天敌是"布",这样就可以直接利用字典的键值对来确定出拳的胜负关系了。
小美:总算开窍了。
阿福:没错,小美,今天从你这学到一招。现在我把代码写出来,你看看对不对。
代码2:def rock_paper_scissors(s1:str,s2:str)->str:
#用字典存储各种手法的天敌关系
R= {"石头":"布", "剪刀":"石头", "布":"剪刀"}
if s1 == R[s2]: #s1是s2的天敌
ans = "甲胜"
elif s2 == R[s1]:
ans = "乙胜"
else:
ans = "平局"
return ans
知识小贴士:
字典是一种可变容器模型,可存储任意类型对象,具有极快的查找速度。字典的每个元素都是一个键值对,其值可以取任何数据类型,但键必须是唯一且不可变的,如字符串,数字或元组,这种结构类型也称之为映射。
古老师:哎呀,不好意思来晚了。学如逆水行舟,不进则退。阿福你要努力啊,不然就要被小学生超过了。不过你们今天使用的方法有点意思,利用字典的键值对,可以直接设置两个对象的关系,避免复杂的条件判断,确实是解决配对类问题的好方法。这样吧,我今天也不教新东西了,就给你们提供一个拓展练习,巩固一下今天的内容吧。
问题2:
碱基链配对:脱氧核糖核酸(DNA)由两条互补的碱基链以双螺旋的方式结合而成。而构成DNA的碱基共有4种,分别为腺瞟呤(A)、鸟嘌呤(G)、胸腺嘧啶(T)和胞嘧啶(C)。我们知道,在两条互补碱基链的对应位置上,A总是和T配对,G总是和C配对。你的任务就是根据一条单链上的碱基序列,给出对应的互补链上的碱基序列。
函数功能:根据输入的一条单链上的碱基序列,给出对应的互补链上的碱基序列。
函数名:match(chain:str)-> str
参数表:chain-- 字符串,表示一条碱基链。这个字符串只含有大写字母A、T、G、C。
返回值:一个只含有大写字母A、T、G、C的字符串,为与输入的碱基链互补的碱基链。
示例1:chain='ATATGGATGGTGTTTGGCTCTG',返回'TATACCTACCACAAACCGAGAC'。
彩蛋:
阿福:小美啊,古老师出的这个题目和你出给我的几乎一模一样,我就不做重复的练习了。今天的话题是你挑起来的,这个光荣而艰巨的任务就交给你吧。
小美:不就是为4种碱基设置配对关系吗?这有何难!看我的。
代码3:def match(chain:str) -> str:
#用字典存储各种碱基的配对关系
R= {'A':'T', 'T':'A', 'G':'C', 'C':'G'}
a= []
for c in chain:
a.append(R[c])
return ''.join(a)