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

