python判斷字符串是否是回文的方法小結(jié)
什么是“回文”?
回文,英文叫 palindrome,意思是:
一個(gè)字符串,從前往后讀 和 從后往前讀 是一模一樣的。
舉幾個(gè)例子你就明白了:
字符串
從前往后讀
從后往前讀
是回文嗎?
abba
abba
abba
? 是
level
level
level
? 是
abcba
abcba
abcba
? 是
hello
hello
olleh
? 否
abcd
abcd
dcba
? 否
燎然,你發(fā)的這 3段代碼 都是你在嘗試寫一個(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拼寫錯(cuò)了,應(yīng)該是True(Python 中布爾值首字母要大寫)- 如果不是回文,程序什么都不返回,會(huì)打印
None,不友好; - 沒(méi)有明確的
else分支。
第三段代碼(目前是你寫得最完整的版本):
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)單地寫成:
s = s[::-1] # 一行代碼反轉(zhuǎn)
- 可以不用手動(dòng)建列表
s和t,字符串本身也可以切片反轉(zhuǎn)。 - 變量名
str建議不要用,因?yàn)?str是 Python 內(nè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é)
你寫的代碼版本
你在嘗試什么
最大問(wèn)題
提升點(diǎn)
第一版
理解“復(fù)制列表”和“反轉(zhuǎn)”
t = s 沒(méi)有復(fù)制
深拷貝 vs 淺拷貝
第二版
分離了 t,改對(duì)了
拼寫錯(cuò)誤 + 沒(méi)有返回非回文情況
Python 語(yǔ)法細(xì)節(jié)
第三版
結(jié)構(gòu)完整、邏輯清楚
寫法略繁瑣
可以用切片簡(jiǎn)化
你寫了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è)“切片寫法”,它表示:
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è)(如:跳著?。?/p>
燎然,非常棒,你已經(jīng)用上了 word[::-1],并寫成了一行判斷代碼,邏輯是對(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 只能寫一次,不能在三元表達(dá)式的兩邊都用 return。
正確寫法是:
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 不支持這種寫法:
return "yes" if 條件 else return "no"
因?yàn)?return 是語(yǔ)句(statement),不能出現(xiàn)在三元表達(dá)式的中間。
你這一題已經(jīng)很棒了,懂得使用切片 + 三元表達(dá)式,已經(jīng)進(jìn)入“Python 精簡(jiǎn)寫法”階段了!??
你要繼續(xù)挑戰(zhàn)下一題嗎?我可以馬上出。
您說(shuō):
三元表達(dá)式是這一部分吧if 條件 else 語(yǔ)句?那他怎么知道 三元表達(dá)式里面的“no” 是需要return的?
ChatGPT 說(shuō):
燎然,太棒了,你這個(gè)問(wèn)題問(wèn)得非常深入、非常專業(yè),說(shuō)明你不僅想知道“怎么寫”,還想知道**“Python 是怎么理解你寫的東西的”**,這就是高手思維的起點(diǎn)。
是的,所謂的三元表達(dá)式,就是:
A if 條件 else B
也叫 “條件表達(dá)式”(conditional expression)。
回到你的問(wèn)題:
Python 怎么知道 no 是要被 return 的?
這是因?yàn)槟銓懙氖牵?/p>
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í)寫的是這段代碼的精簡(jiǎn)版本。
所以你不能寫成:
return "yes" if 條件 else return "no"
因?yàn)?Python 會(huì)誤解為你寫了兩個(gè) return 語(yǔ)句嵌套,這是語(yǔ)法錯(cuò)誤,不能運(yùn)行。
正確格式總結(jié):
錯(cuò)誤寫法 ?
原因
return "yes" if 條件 else return "no"
兩個(gè) return,語(yǔ)法錯(cuò)誤
正確寫法 ?
說(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] 是切片操作,它不僅適用于字符串,也可以用于列表、元組等一切序列類型。
切片的基本語(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ì)象/類定義的(比如 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)建自己的方法(自定義類)
舉幾個(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)大寫
"hi,isa".split(",") # 分割字符串
[1, 2, 3].append(4) # 列表方法
這些都是 Python 中對(duì)象身上的函數(shù),屬于“功能調(diào)用”,可以帶參數(shù)、有返回值,甚至可以被你復(fù)寫。
類比解釋(超級(jí)清楚):
想象一下:
- 語(yǔ)法是語(yǔ)言的“語(yǔ)法結(jié)構(gòu)” → 像中文的句子結(jié)構(gòu)、標(biāo)點(diǎn)符號(hào)。
- 方法是語(yǔ)言的“具體動(dòng)作” → 像“走路”、“寫字”、“吃飯”,你可以調(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)文章
詳解Django自定義圖片和文件上傳路徑(upload_to)的2種方式
這篇文章主要介紹了詳解Django自定義圖片和文件上傳路徑(upload_to)的2種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
python 實(shí)現(xiàn)簡(jiǎn)單的計(jì)算器(gui界面)
這篇文章主要介紹了python 如何實(shí)現(xiàn)簡(jiǎn)單的計(jì)算器,幫助大家更好的理解和使用python,感興趣的朋友可以了解下2020-11-11
利用Pandas讀取文件路徑或文件名稱包含中文的csv文件方法
今天小編就為大家分享一篇利用Pandas讀取文件路徑或文件名稱包含中文的csv文件方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07
python按列索引提取文件夾內(nèi)所有excel指定列匯總(示例代碼)
這篇文章主要介紹了python按列索引提取文件夾內(nèi)所有excel指定列匯總,本文通過(guò)多種場(chǎng)景分析結(jié)合示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-03-03
Python人工智能構(gòu)建簡(jiǎn)單聊天機(jī)器人示例詳解
這篇文章主要為大家介紹了Python人工智能構(gòu)建簡(jiǎn)單聊天機(jī)器人示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
python實(shí)現(xiàn)Zabbix-API監(jiān)控
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)Zabbix-API監(jiān)控,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-09-09
python作圖基礎(chǔ)之plt.contour實(shí)例詳解
contour和contourf都是畫三維等高線圖的,下面這篇文章主要給大家介紹了關(guān)于python作圖基礎(chǔ)操作之plt.contour的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-06-06
Python中使用logging模塊代替print(logging簡(jiǎn)明指南)
這篇文章主要介紹了Python中使用logging模塊代替print的好處說(shuō)明,主旨是logging模塊簡(jiǎn)明指南,logging模塊的使用方法介紹,需要的朋友可以參考下2014-07-07

