python中的下层函数

问题描述

我想在python中制作自己的下层函数

就像我们使用的:

>>“你好,世界!”.lower()

>>你好,世界!

我想做自己的下层功能

我试过这个代码

String = "Hello,World!"

def lowerFunction(MyStr):
    if "A" in MyStr:
        MyStr = MyStr.replace("A",'a')
    if "B" in MyStr:
        MyStr = MyStr.replace("B",'b')
    if "C" in MyStr:
        MyStr = MyStr.replace("C",'c')
    if "D" in MyStr:
        MyStr = MyStr.replace("D",'d')
    if "E" in MyStr:
        MyStr = MyStr.replace("E",'e')
    if "F" in MyStr:
        MyStr = MyStr.replace("F",'f')
    if "G" in MyStr:
        MyStr = MyStr.replace("G",'g')
    if "H" in MyStr:
        MyStr = MyStr.replace("H",'h')
    if "I" in MyStr:
        MyStr = MyStr.replace("I",'i')
    if "J" in MyStr:
        MyStr = MyStr.replace("J",'j')
    if "K" in MyStr:
        MyStr = MyStr.replace("K",'k')
    if "L" in MyStr:
        MyStr = MyStr.replace("L",'l')
    if "M" in MyStr:
        MyStr = MyStr.replace("M",'m')
    if "N" in MyStr:
        MyStr = MyStr.replace("N",'n')
    if "O" in MyStr:
        MyStr = MyStr.replace("O",'o')
    if "P" in MyStr:
        MyStr = MyStr.replace("P",'p')
    if "Q" in MyStr:
        MyStr = MyStr.replace("Q",'q')
    if "R" in MyStr:
        MyStr = MyStr.replace("R",'r')
    if "S" in MyStr:
        MyStr = MyStr.replace("S",'s')
    if "T" in MyStr:
        MyStr = MyStr.replace("T",'t')
    if "U" in MyStr:
        MyStr = MyStr.replace("U",'u')
    if "V" in MyStr:
        MyStr = MyStr.replace("V",'v')
    if "W" in MyStr:
        MyStr = MyStr.replace("W",'w')
    if "X" in MyStr:
        MyStr = MyStr.replace("X",'x')
    if "Y" in MyStr:
        MyStr = MyStr.replace("Y",'y')
    if "Z" in MyStr:
        MyStr = MyStr.replace("Z",'z')
    return MyStr


print(lowerFunction(String))

但是这段代码太大了,我们可以用不同的技术来做到这一点吗?

提前致谢

解决方法

您的代码中存在太多挑战。

  1. 执行多个替换语句。对于这些步骤中的每一步,python 在内部都会创建一个新字符串。在 Python 中,字符串是不可变的。

  2. if 条件太多。

def _lowerFunction(char):
    if 65 <= ord(char) <= 90:
        return chr(ord(char) + 32)
    return char


def lowerFunction(myStr):
    return ''.join([_lowerFunction(char) for char in myStr])

使用 ordchr 检查它是大写还是小写字符。

>>> ord('a') # ord example
97
>>> ord('A')
65
>>> chr(97) # chr example
'a'
>>> chr(98)
'b'
,

您可以使用 ascii 来替换字符。

stri = "Hello,World!"
lower_stri = ''.join([chr(ord(i)+32) if ord(i) >= 65 and ord(i) <= 90 else i for i in stri ])

这将检查字符是否在大写字母中,并用小写字母替换它们。

,

Python 有特殊的字符转换功能 - str.translate()

它需要 str.maketrans('ABC','abc') 来创建查找表。

但您不必手动编写 ABC...Zabc...z,因为您在变量 string.ascii_uppercasestring.ascii_lowercase 中拥有它。

import string

def lower(text):
    lookup = str.maketrans(string.ascii_uppercase,string.ascii_lowercase)
    return text.translate(lookup)

text = lower("Hello,World!")

print(text)

结果

'hello,world!'

当然,这仅适用于 ASCII,就像其他解决方案一样。

对于 Unicode,它需要 maketrans() 中的所有字符


顺便说一句:使用这个你可以用ROT13

加密文本
import string

def rot13(text):
    lookup = str.maketrans('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz','NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm')
    return text.translate(lookup)

text = ro13("Hello,World!")

结果

'Uryyb,Jbeyq!'
,

此代码可能对您有所帮助

def lowerFunction(MyStr):
    MyStr=list(MyStr)
    for i in range(len(MyStr)):
        v=ord(MyStr[i])
        if v>=65 and v<=90:
            MyStr[i]=chr(v+32)
    MyStr=''.join(MyStr)

    return MyStr

val=lowerFunction('Hello,World!')
print(val)
,

使用小写和大写字母列表的另一种解决方案。 The maketrans solution 速度更快,因此您应该使用它,但此解决方案更接近原始解决方案。

def lower_function(my_string):
    for lower,upper in zip(string.ascii_lowercase,string.ascii_uppercase):
        my_string = my_string.replace(upper,lower)
    return my_string

zip 创建这样的小写字母对:

list(zip('abc','ABC')) 等于 [('a','A'),('b','B'),('c','C')]。如果没有 list,它会创建一个迭代器,这对 for 循环来说很好。

作为迄今为止的其他解决方案,它仅适用于 ASCII 字符,而较低的方法也适用于其他解决方案。这将导致所有小写字母:

"CSÖN CSÖN gyűrŰ Arany GYŰRŰ".lower()  # gives "csön csön gyűrű arany gyűrű"

但是您可以在 zip 部分使用更长的字符列表,例如

zip(string.ascii_lowercase + 'áéíóöőúüűä',string.ascii_uppercase + "ÁÉÍÓÖŐÚÜŰÄ")

但可能还有其他一些问题,例如 German scharfes s