全角文字の平仮名⇔カタカナ変換

文字コード表を使用せず、計算だけで行います。
次の文字は、変換しません。

濁点、合成用    [゙    ]→ '\u3099'
半濁点、合成用 [゚    ]→ '\u309a'
濁点          [゛] → '\u309b'
半濁点        [゛] → '\u309c'
よりの合略仮名 [ゟ] → '\u309f'
中点         [・] → '\u30fb'
長音         [ー] → '\u30fc'
ワに濁点      [ヷ] → '\u30f7'
ヰに濁点      [ヸ] → '\u30f8'
ヱに濁点      [ヹ] → '\u30f9'
ヲに濁点      [ヺ] → '\u30fa'

以下の記号文字は、平仮名とカタカナで対応が存在するので変換します

繰り返し記号(平仮名)  [ゝ]→ '\u309d' 12445
繰り返し記号(平仮名)  [ゞ]→ '\u309e' 12446
繰り返し記号(カタカナ) [ヽ]→ '\u30fd' 12541
繰り返し記号(カタカナ) [ヾ]→ '\u30fe' 12542

全角平仮名→全角カタカナ変換

def hiraToKata(target):
    return ''.join([chr(n+96) if (12352 < n and n < 12439) or n==12445 or n==12446 else chr(n) for n in [ord(c) for c in target]])


全角カタカナ→全角平仮名変換

def kataToHira(target):
    return ''.join([chr(n-96) if (12448 < n and n < 12535) or n==12541 or n==12542 else chr(n) for n in [ord(c) for c in target]])

平仮名、カタカナ、それぞれ以下のように文字コードが存在します。

>>> from functools import reduce
>>> reduce(lambda r, t: r + chr(t), range(12353, 12448), '') 
'ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをんヴ??\u3097\u3098??゛゜ゝゞ?'
>>> reduce(lambda r,t:r+chr(t),range(12449,12543),'')
'ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶ????・ーヽヾ'


文字列、h. k に対して変換を実行します

h = "ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをんゔゕゖ゗゘゙゚゛゜ゝゞゟ"
k = "ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶヷヸヹヺ・ーヽヾ"

print( hiraToKata(h) )
print( kataToHira(k) )

結果

ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶ゗゘゙゚゛゜ヽヾゟ
ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをんゔゕゖヷヸヹヺ・ーゝゞ