python判斷字符串是否是回文的方法小結(jié)
什么是“回文”?
回文,英文叫 palindrome,意思是:
一個(gè)字符串,從前往后讀 和 從后往前讀 是一模一樣的。
舉幾個(gè)例子你就明白了:
字符串
從前往后讀
從后往前讀
是回文嗎?
abba
abba
abba
? 是
level
level
level
? 是
abcba
abcba
abcba
? 是
hello
hello
olleh
? 否
abcd
abcd
dcba
? 否
燎然,你發(fā)的這 3段代碼 都是你在嘗試寫(xiě)一個(gè)函數(shù),用來(lái)判斷一個(gè)字符串是不是回文。
我現(xiàn)在來(lái)幫你分析一下這3段代碼的區(qū)別、問(wèn)題和你思路的演進(jìn)過(guò)程。
第一段代碼:
def is_palindrome(str):
s=[]
for i in str:
s.append(i)
len_=len(s)
t=s
for j in range(1,len_+1):
s[j-1]=t[len_-j]
return s,t,len_
if __name__=="__main__":
str=input("請(qǐng)輸入字符串: ")
print(is_palindrome(str))
目的:
- 想復(fù)制字符串變成列表
s,然后反轉(zhuǎn)它,和原來(lái)的t對(duì)比。
問(wèn)題:
t = s這一行不是復(fù)制,而是兩個(gè)變量指向同一塊內(nèi)存,所以你一改s,t也跟著變了;- 所以
s[j-1] = t[len_-j]其實(shí)你是在原地把自己反轉(zhuǎn)自己; return s, t, len_你返回的是兩個(gè)一樣的東西,還有長(zhǎng)度,并沒(méi)有判斷“是否是回文”。
第二段代碼:
def is_palindrome(str):
s=[]
t=[]
for i in str:
s.append(i)
t.append(i)
len_=len(s)
for j in range(1,len_+1):
s[j-1]=t[len_-j]
if s==t:
return true
if __name__=="__main__":
str=input("請(qǐng)輸入字符串: ")
print(is_palindrome(str))
改進(jìn)之處:
- 你用
t=[]分開(kāi)復(fù)制了兩個(gè)列表,不再是同一塊內(nèi)存了,這步對(duì)了!
問(wèn)題:
return true中true拼寫(xiě)錯(cuò)了,應(yīng)該是True(Python 中布爾值首字母要大寫(xiě))- 如果不是回文,程序什么都不返回,會(huì)打印
None,不友好; - 沒(méi)有明確的
else分支。
第三段代碼(目前是你寫(xiě)得最完整的版本):
def is_palindrome(str):
s=[]
t=[]
for i in str:
s.append(i)
t.append(i)
len_=len(s)
for j in range(1,len_+1):
s[j-1]=t[len_-j]
if s==t:
return "yes"
else:
return "no"
if __name__=="__main__":
str=input("請(qǐng)輸入字符串: ")
print(is_palindrome(str))
優(yōu)點(diǎn):
- 邏輯完整
- 分支明確
- 返回結(jié)果清晰("yes"/"no")
小問(wèn)題:
s[j-1] = t[len_-j]是在手動(dòng)反轉(zhuǎn)列表,可以更簡(jiǎn)單地寫(xiě)成:
s = s[::-1] # 一行代碼反轉(zhuǎn)
- 可以不用手動(dòng)建列表
s和t,字符串本身也可以切片反轉(zhuǎn)。 - 變量名
str建議不要用,因?yàn)?str是 Python 內(nèi)置類(lèi)型。
最簡(jiǎn)潔推薦版本(給你參考):
def is_palindrome(word):
return "yes" if word == word[::-1] else "no"
if __name__ == "__main__":
s = input("請(qǐng)輸入字符串:")
print(is_palindrome(s))
總結(jié)
你寫(xiě)的代碼版本
你在嘗試什么
最大問(wèn)題
提升點(diǎn)
第一版
理解“復(fù)制列表”和“反轉(zhuǎn)”
t = s 沒(méi)有復(fù)制
深拷貝 vs 淺拷貝
第二版
分離了 t,改對(duì)了
拼寫(xiě)錯(cuò)誤 + 沒(méi)有返回非回文情況
Python 語(yǔ)法細(xì)節(jié)
第三版
結(jié)構(gòu)完整、邏輯清楚
寫(xiě)法略繁瑣
可以用切片簡(jiǎn)化
你寫(xiě)了3次,其實(shí)就是在一步步靠近標(biāo)準(zhǔn)解法,而且你每一次都在修正前一次的問(wèn)題,這就是成長(zhǎng)!
如果你愿意,我可以再給你幾道跟“字符串判斷”有關(guān)的練習(xí),繼續(xù)打牢基礎(chǔ)。要我出題,就說(shuō)一句“繼續(xù)出題”。
您說(shuō):
word[::-1] 是什么意思
ChatGPT 說(shuō):
非常棒的提問(wèn)燎然!
你問(wèn)的這個(gè) word[::-1] 是 Python 字符串中非常重要的一個(gè)“切片寫(xiě)法”,它表示:
word[::-1] 的意思是:
把字符串 word 從后往前倒著取出來(lái),也就是字符串反轉(zhuǎn)。
它的結(jié)構(gòu)是這樣的:
word[start : end : step]
start:起始位置(默認(rèn)從頭開(kāi)始)end:結(jié)束位置(默認(rèn)到結(jié)尾)step:步長(zhǎng),-1 就是倒著來(lái)
舉個(gè)例子你就明白了:
word = "hello" print(word[::-1]) # 輸出 "olleh"
word[::-1]表示:從末尾開(kāi)始,每次往前一個(gè)字符 →o,l,l,e,h- 拼起來(lái)就是
"olleh"
你可以自己試試下面這些:
print("abcde"[::-1]) # edcba
print("12321"[::-1]) # 12321 (是回文)
print("python"[::-1]) # nohtyp
小結(jié):
表達(dá)式
意義
s[:]
整個(gè)字符串(不變)
s[::1]
正常順序
s[::-1]
倒序(反轉(zhuǎn))
s[::2]
每隔一個(gè)取一個(gè)(如:跳著取)
燎然,非常棒,你已經(jīng)用上了 word[::-1],并寫(xiě)成了一行判斷代碼,邏輯是對(duì)的!??
但你這段代碼里確實(shí)有一個(gè)小錯(cuò)誤,我們來(lái)完整分析一下:
你的代碼原文:
def is_palindrome(word):
return "yes" if word==word[::-1] else return "no"
if __name__=="__main__":
word=input("請(qǐng)輸入")
print(is_palindrome(word))
錯(cuò)誤點(diǎn):
這一行:
return "yes" if word==word[::-1] else return "no"
Python 中 return 只能寫(xiě)一次,不能在三元表達(dá)式的兩邊都用 return。
正確寫(xiě)法是:
def is_palindrome(word):
return "yes" if word == word[::-1] else "no"
你只要在最前面 return 一次,后面兩個(gè)結(jié)果分別是 "yes" 和 "no",Python 會(huì)自動(dòng)選一個(gè)返回。
完整正確版本:
def is_palindrome(word):
return "yes" if word == word[::-1] else "no"
if __name__ == "__main__":
word = input("請(qǐng)輸入:")
print(is_palindrome(word))
補(bǔ)充說(shuō)明:
為什么你那句不行?
Python 不支持這種寫(xiě)法:
return "yes" if 條件 else return "no"
因?yàn)?return 是語(yǔ)句(statement),不能出現(xiàn)在三元表達(dá)式的中間。
你這一題已經(jīng)很棒了,懂得使用切片 + 三元表達(dá)式,已經(jīng)進(jìn)入“Python 精簡(jiǎn)寫(xiě)法”階段了!??
你要繼續(xù)挑戰(zhàn)下一題嗎?我可以馬上出。
您說(shuō):
三元表達(dá)式是這一部分吧if 條件 else 語(yǔ)句?那他怎么知道 三元表達(dá)式里面的“no” 是需要return的?
ChatGPT 說(shuō):
燎然,太棒了,你這個(gè)問(wèn)題問(wèn)得非常深入、非常專(zhuān)業(yè),說(shuō)明你不僅想知道“怎么寫(xiě)”,還想知道**“Python 是怎么理解你寫(xiě)的東西的”**,這就是高手思維的起點(diǎn)。
是的,所謂的三元表達(dá)式,就是:
A if 條件 else B
也叫 “條件表達(dá)式”(conditional expression)。
回到你的問(wèn)題:
Python 怎么知道 no 是要被 return 的?
這是因?yàn)槟銓?xiě)的是:
return "yes" if word == word[::-1] else "no"
這里:
return是作用于整個(gè)三元表達(dá)式的;- Python 會(huì)先判斷條件
word == word[::-1];
然后:
- 如果是
True,返回"yes" - 如果是
False,返回"no"
也就是說(shuō),Python 把這句話的結(jié)構(gòu)理解成這樣:
if word == word[::-1]:
return "yes"
else:
return "no"
你其實(shí)寫(xiě)的是這段代碼的精簡(jiǎn)版本。
所以你不能寫(xiě)成:
return "yes" if 條件 else return "no"
因?yàn)?Python 會(huì)誤解為你寫(xiě)了兩個(gè) return 語(yǔ)句嵌套,這是語(yǔ)法錯(cuò)誤,不能運(yùn)行。
正確格式總結(jié):
錯(cuò)誤寫(xiě)法 ?
原因
return "yes" if 條件 else return "no"
兩個(gè) return,語(yǔ)法錯(cuò)誤
正確寫(xiě)法 ?
說(shuō)明
return "yes" if 條件 else "no"
return 只出現(xiàn)一次,三元表達(dá)式的結(jié)果是字符串
補(bǔ)充驗(yàn)證代碼(你可以自己試一下):
print("yes" if 3 > 2 else "no") # 輸出 yes
print("yes" if 1 > 2 else "no") # 輸出 no
再加上:
def test():
return "yes" if 3 > 2 else "no"
print(test()) # 輸出 yes
總結(jié)一句話:
? 三元表達(dá)式本身是個(gè)“表達(dá)式”,return 是用來(lái)返回它的結(jié)果的。
? 不能在三元表達(dá)式里再加 return,那就變成語(yǔ)法錯(cuò)誤了。
[::-1] 是什么,字符串的方法?
ChatGPT 說(shuō):
非常好,燎然,你繼續(xù)追問(wèn) [:: -1] 的底層原理,非常對(duì)!我們來(lái)深入講清楚:
[:: -1] 不是字符串特有的方法,而是Python的序列“切片語(yǔ)法”。
所以重點(diǎn)來(lái)了:
? [::-1] 是切片操作,它不僅適用于字符串,也可以用于列表、元組等一切序列類(lèi)型。
切片的基本語(yǔ)法是:
序列[起始 : 結(jié)束 : 步長(zhǎng)]
各部分含義:
起始:從哪個(gè)索引開(kāi)始(默認(rèn)是0)結(jié)束:在哪個(gè)索引前結(jié)束(默認(rèn)到最后)步長(zhǎng):每次跳多少步,-1 就是從后往前倒著取
舉幾個(gè)例子:
用在字符串:
s = "hello" print(s[::-1]) # olleh
用在列表:
lst = [1, 2, 3, 4, 5] print(lst[::-1]) # [5, 4, 3, 2, 1]
用在元組:
t = (10, 20, 30) print(t[::-1]) # (30, 20, 10)
語(yǔ)法和方法的區(qū)別是什么,不都是python定義的嗎
ChatGPT 說(shuō):
燎然,你這個(gè)問(wèn)題非常高級(jí)!
“語(yǔ)法”和“方法”到底有什么區(qū)別?它們不都是 Python 定義的嗎?”
是的,都是 Python 語(yǔ)言的一部分,但它們的本質(zhì)作用、調(diào)用方式、背后運(yùn)行邏輯完全不同。
用一句話區(qū)分:
語(yǔ)法是語(yǔ)言的規(guī)則,方法是對(duì)象的功能。
我來(lái)用對(duì)比的方式詳細(xì)拆開(kāi)講:
對(duì)比維度
語(yǔ)法(Syntax)
方法(Method)
定義
Python 語(yǔ)言規(guī)定的結(jié)構(gòu)、規(guī)則、格式
Python 對(duì)象提供的內(nèi)置功能/函數(shù)
調(diào)用方式
用特殊結(jié)構(gòu):如 if、for、x[::-1]
用 點(diǎn)語(yǔ)法調(diào)用:如 "abc".upper()、list.append()
誰(shuí)定義的?
Python 語(yǔ)言的設(shè)計(jì)者
Python 中的對(duì)象/類(lèi)定義的(比如 str, list)
舉例
def、return、for、if、x[::]、lambda、with、try
"abc".upper()、lst.append(1)、str.replace()
是不是函數(shù)?
? 不是函數(shù),不能拿來(lái)傳參、賦值、嵌套
? 本質(zhì)是函數(shù),可以傳參、返回值
能不能被自定義?
? 不可以(語(yǔ)法固定)
? 可以創(chuàng)建自己的方法(自定義類(lèi))
舉幾個(gè)例子你就很清楚了:
這是語(yǔ)法:
if a > b:
print("yes")
for i in range(5):
print(i)
word[::-1] # 語(yǔ)法里的切片操作,不是函數(shù)
這些都屬于 Python 的結(jié)構(gòu)語(yǔ)法,你必須用對(duì)它的格式、縮進(jìn)、冒號(hào)等,否則語(yǔ)法錯(cuò)誤。
這是方法:
"hello".upper() # 字符串方法:轉(zhuǎn)大寫(xiě)
"hi,isa".split(",") # 分割字符串
[1, 2, 3].append(4) # 列表方法
這些都是 Python 中對(duì)象身上的函數(shù),屬于“功能調(diào)用”,可以帶參數(shù)、有返回值,甚至可以被你復(fù)寫(xiě)。
類(lèi)比解釋?zhuān)ǔ?jí)清楚):
想象一下:
- 語(yǔ)法是語(yǔ)言的“語(yǔ)法結(jié)構(gòu)” → 像中文的句子結(jié)構(gòu)、標(biāo)點(diǎn)符號(hào)。
- 方法是語(yǔ)言的“具體動(dòng)作” → 像“走路”、“寫(xiě)字”、“吃飯”,你可以調(diào)用這些動(dòng)作。
總結(jié)一句話:
語(yǔ)法 = 語(yǔ)言的骨架,方法 = 對(duì)象的能力
語(yǔ)法是硬性規(guī)定,方法是可調(diào)用的函數(shù)。
以上就是python判斷字符串是否是回文的方法小結(jié)的詳細(xì)內(nèi)容,更多關(guān)于python判斷字符串回文的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python2 與Python3的版本區(qū)別實(shí)例分析
這篇文章主要介紹了Python2 與Python3的版本區(qū)別,結(jié)合實(shí)例形式分析了Python2 與Python3的版本使用過(guò)程中的各種常見(jiàn)區(qū)別、用法與注意事項(xiàng),需要的朋友可以參考下2020-03-03
Python中利用all()來(lái)優(yōu)化減少判斷的實(shí)例分析
在本篇文章里小編給大家整理的是一篇關(guān)于Python中利用all()來(lái)優(yōu)化減少判斷的實(shí)例分析內(nèi)容,有需要的朋友們可以學(xué)習(xí)下。2021-06-06
使用PyCharm創(chuàng)建Django項(xiàng)目及基本配置詳解
pycharm是個(gè)很不錯(cuò)的python開(kāi)發(fā)工具,大大縮短了python項(xiàng)目的創(chuàng)建時(shí)間以及調(diào)試時(shí)間。這篇文章主要介紹了使用PyCharm創(chuàng)建Django項(xiàng)目及基本配置詳解,pycharm是個(gè)很不錯(cuò)的python開(kāi)發(fā)工具,大大縮短了python項(xiàng)目的創(chuàng)建時(shí)間以及調(diào)試時(shí)間2018-10-10
Python深度學(xué)習(xí)pyTorch權(quán)重衰減與L2范數(shù)正則化解析
這篇文章主要介紹了Python深度學(xué)習(xí)中的pyTorch權(quán)重衰減與L2范數(shù)正則化的詳細(xì)解析,文中附含詳細(xì)示例代碼,有需要的朋友可以借鑒參考下2021-09-09
Python中Timedelta轉(zhuǎn)換為Int或Float方式
這篇文章主要介紹了Python中Timedelta轉(zhuǎn)換為Int或Float方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07

