这是我的代码,要求用户输入一个字母和输入一个数字。我的代码将字母移到了字母表中的右侧,这个字母的数字是多少。是
def code_char(character, number):
characterOrd = ord(character)
characterNew = characterOrd + number
if 65 <= characterOrd <= 90:
characterNew = characterOrd + number
if characterNew > 90:
characterNewi = characterNew - 26
return (chr(characterNewi))
elif characterNew <= 90:
return (chr(characterNew))
elif 97 <= characterOrd <= 122:
characterNew = characterOrd + number
if characterNew > 122:
characterNewi = characterNew - 26
return (chr(characterNewi))
elif characterNew <= 122:
return (chr(characterNew))
(不要担心我的代码中的缩进,当我从我的python程序复制并粘贴时它们没有出现 - 我已经测试过它并且工作正常 - 例如插入&#39; a&# 39;给出&#39;&#39;并插入&#39;给出&#39; A&#39;。
我想知道如何在一个新函数中使用这个函数,它要求一个8个字符长的字符串&#39; abcdefgh&#39;和一个8位数的长号&#39; 11111111&#39;并将所有相应的字母移到字母表的右侧,所以我的例子将返回&#39; bcdefghi&#39;。 棘手的是我宁愿使用字符串而不是像我在顶部的函数中那样的条例。
任何提示或方法都会受到赞赏,但我对python的了解有限,所以如果使用基本功能会更好。
答案 0 :(得分:1)
最简单的方法是在for循环中使用你的函数,并使用zip来组合字符串和偏移量。
def new_func(string, offsets):
outstr = ""
for char, num in zip(string, offsets):
outstr += code_char(char, int(num))
print(outstr)
奖金指向一个班轮版本:
print("".join([code_char(char, int(num)) for char, num in zip(string, offsets)]))
在行动中看到它(使用python3):
if __name__ == '__main__':
string = input("string: ")
offsets = input("offsets: ")
if len(string) != len(offsets):
print("They must be the same length!")
else:
print("".join([code_char(char, int(num))
for char, num in zip(string, offsets)]))
# string: abcdefgh
# offsets: 12345678
# bdfhjlnp
您还可以简单地更新现有功能以满足新需求。
# Modified original
def code_char_string(character_string, offsets):
out_string = ""
for character, offset in zip(character_string, offsets):
number = int(offset)
characterOrd = ord(character)
characterNew = characterOrd + number
if 65 <= characterOrd <= 90:
characterNew = characterOrd + number
if characterNew > 90:
characterNewi = characterNew - 26
out_string += (chr(characterNewi))
elif characterNew <= 90:
out_string+= (chr(characterNew))
elif 97 <= characterOrd <= 122:
characterNew = characterOrd + number
if characterNew > 122:
characterNewi = characterNew - 26
out_string += (chr(characterNewi))
elif characterNew <= 122:
out_string += (chr(characterNew))
return out_string
您还可以使用以下技巧使其更易于阅读。
# Simplified readable version
def code_char_string_compact(character_string, offsets):
out_string = ""
for cord, number in zip([ord(x) for x in character_string], [int(x) for x in offsets]):
newchar = cord + number
if 65 <= cord <= 90:
out_string += chr(newchar - 26) if newchar > 90 else chr(newchar)
elif 97 <= cord <= 122:
out_string += chr(newchar - 26) if newchar > 122 else chr(newchar)
return out_string
您的功能也可简化为冗长的一行。
# oneliner awesomeness
def code_char_one_line(character_string, offsets): return "".join([chr(cord + number - 26) if 65 <= cord <= 90 < cord + number or 97 <= cord <= 122 < cord + number else chr(cord + number) for cord, number in zip([ord(x) for x in character_string], [int(x) for x in offsets])])
全部测试:
string, offsets, offsets2 = "abcdefgh", "11111111", "48151623"
print(code_char_string(string, offsets), code_char_string_compact(string, offsets), code_char_one_line(string, offsets))
# bcdefghi bcdefghi bcdefghi
print(code_char_string(string, offsets2), code_char_string_compact(string, offsets2), code_char_one_line(string, offsets2))
# ejdiflik ejdiflik ejdiflik
答案 1 :(得分:0)
看起来你正在做一些cesar-cipher加密。
这是一个简化版本:
def code_char(text, shift):
a = ord('a')
return ''.join(
chr((ord(char) - a + shift) % 26 + a) if 'a' <= char <= 'z' else char
for char in text.lower())
print code_char('abcdefgh', 1)
>>> bcdefghi
这可以让你更有活力:
print code_char('rstuwxyz', 1)
>>> stuvxyza
在26之后记住ASCII码点 start 非常重要:
>>> ord('a')
97
所以你仍然需要使用序数,这就是为什么我设置a = ord('a')
允许你传递字符串而必须指定一个&#39;字符串&#39;列表或抵消。