2014-03-07 132 views
0
def char(): 
    letter = str(input("Input Letter from alphabet: ")) 
    x = int(input("Input Value to shift letter to the right x number of times: : ")) 
    newLetter = ord(letter) + x 
    if newLetter > 90 and newLetter < 97: 
     remainder = newLetter % 90 
     newLetterI = 65 + remainder 
     print(chr(newLetterI)) 
    elif newLetter > 122: 
     remainder = newLetter % 122 
     newLetterI = 97 + remainder 
     print(chr(newLetterI)) 

char() 

这是我的代码,将字母向右移动一个'数字'次。 这是非常漫长的,但它是唯一的方式,我发现如何做到这一点没有很多错误,我真的不明白。我只是想知道它是否可以,只是想知道一旦字母表达到Z或Z的时候是否回绕。插入字母和数字 - 在字母“数字”的时间右移字母

+0

可能重复[凯撒的密码使用python,可以使用一点帮助](http://stackoverflow.com/questions/15389 35/caesars-cipher-using-python-could-use-a-little-help) – icedtrees

+0

谢谢。我看到了这一点,但我真的不明白它的代码。 – user3382238

回答

0

能否请您检查:

#!/usr/bin/python 

def next_nchar(char, n): 
    # 97, 122 
    upper = None 
    if char.isupper(): 
     upper = True 
    lw = char.lower() 
    start = ord(lw) 
    num = ord(lw) + n 
    if num > 122: 
     ex = num - 122 
    else: 
     ex = None 
    if not ex: 
     r = range(start, num) 
    else: 
     r = range(start, 123) + range(97, 97+ex-1) 
    if upper: 
     return [chr(x).upper() for x in r] 
    return [chr(x) for x in r] 

for i in ['a', 'k', 'y', 'P']: 
    print next_nchar(i, 5) 

输出:

['a', 'b', 'c', 'd', 'e'] 
['k', 'l', 'm', 'n', 'o'] 
['y', 'z', 'a', 'b', 'c'] 
['P', 'Q', 'R', 'S', 'T'] 
0

你应该使用这样一个

import sys 
def char(): 
    letter = sys.stdin.readline().strip() 
    x = int(sys.stdin.readline()) 
    oldLetter = ord(letter) 
    if oldLetter > 64 and oldLetter < 91: 
     if (oldLetter+x) <= 90: 
      remainder = (oldLetter + x) % 65 
      newLetter = 65 + remainder 
     else: 
      remainder = (oldLetter + x) % 90 
      newLetter = 64 + remainder 
     print(chr(newLetter)) 
    elif oldLetter > 96 and oldLetter < 123: 
     if (oldLetter+x) <= 122: 
      remainder = (oldLetter + x) % 97 
      newLetter = 97 + remainder 
     else: 
      remainder = (oldLetter + x) % 122 
      newLetter = 96 + remainder 
     print(chr(newLetter)) 
char() 
0

的一个问题,我可以用你的代码中找到的是,环绕似乎没有多大意义。例如,如果你对newLetter进行模122,例如,当你有26个换档时,你会遇到问题,并且由于你必须记住ascii值,所以它有点难以阅读。

我会尽量解释略有改进版:

letter = input("Enter a letter from the alphabet: ") # No need for str, it is already a string 
shift = int(input("Enter your letter shift: ")) 

if letter.islower(): # Much better than worrying about ascii values 
    initial = 'a' 
else: 
    initial = 'A' 

letterIndex = (ord(letter) - ord(initial)) # So 'a' would have index 0, 'b' 1, 'z' 25 
newIndex = (letterIndex + shift) % 26 # Making sure our index is from 0 to 25 
newLetter = chr(ord(initial) + newIndex) # after 'a' or 'A', increment by newIndex 
print newLetter 

这里是它的一个更简洁的版本,不带注释:

letter = input("Enter a letter from the alphabet: ") 
shift = int(input("Enter your letter shift: ")) 

initial = 'a' if letter.islower() else 'A' 

newIndex = (ord(letter) - ord(initial) + shift) % 26 
print(chr(ord(initial) + newIndex)) 
0

这是最可读的方式做到这一点,国际海事组织:

import string 

def shiftchar(char, n): 
    if char.isupper(): 
     letters = string.uppercase # all uppercase letters in alphabetical order 
    elif char.islower(): 
     letters = string.lowercase # all lowercase letters in alphabetical order 
    try: 
     initcharpos = letters.index(char) 
     newchar = letters[(initcharpos + n) % 26] 
     # get the letter n characters later, with wraparound 
     return newchar 
    except (NameError, ValueError): 
     # NameError: char is mixed-case or non-English, so letters is never defined 
     # ValueError: char not found in letters; probably a multi-char string 
     raise TypeError("Expected a single English char as first argument") 

print shiftchar('A', 5) # F 
print shiftchar('z', 1) # a 
print shiftchar('foo', 5) # TypeError