2個Python入門級的實戰項目

這兩天後臺收到一些讀者朋友的消息,問我有沒有字符串的實戰項目,我仔細思考了一下,覺得對於入門的朋友來說,不僅需要熟悉字符串的實戰項目,還應該掌握Python的其他兩種數據類型——列表和字典。今天我就給大家介紹兩個關於Python基本數據類型的實戰項目。

1.字符串趣味實戰

題目:替換1-20內的數字,3的倍數和5的倍數用不同的數字代替。列出1到20的數字,若是3的倍數就用apple代替,若是5的倍數就用orange代替,若既是3的倍數又是5的倍數就用appleorange代替。

代碼思路:

第一種普通解法,循環1-20,然後用多個if/else進行判斷:

def replace_num(i):

ifi%3 ==0andi%5 ==0:

return"banana"

ifi%3 ==0:

return'apple'

ifi%5 ==0:

return'orange'

else:

returni

fori in range(1,20):

print(replace_num(i))

第二種牛逼解法:巧妙的利用列表切片

'apple'[i%3*len('apple')::]+'orange'[i%5*len('orange')::]ori

先說一下這道題的這種解法,猶如天外有天,令人拍案叫絕!

慢動作分解1:

print ('apple'[1::])

>>'pple'表示從第2個位置開始切片

慢動作分解2:

既然明白了上面的,來一個稍微複雜一點的

>>print ('apple'[1*5::])

爲空

爲啥因爲1*5是5,也就是要從第6個字符開始,apple一共就5個字符,所以輸出爲空

慢動作分解3:

foriinrange(1,10):

print ('apple'[i%3::])

>>

pple

ple

apple

pple

ple

apple

pple

ple

apple

會發現只有3的倍數的地方會出現完整的apple,其他地方都是殘缺,但是我們怎麼把非3的倍數的地方變成空呢,簡單乘以一個偏移量,這招對3的倍數沒有任何影響,但是對於其他的非3的倍數有很大的影響。

慢動作分解4:

foriinrange(1,10):

print ('apple'[i%3*len('apple')::])

>>

apple

apple

apple

這個時候雖然把非3的過濾掉了,但是我們要輸出數字啊,怎麼辦呢?這裏又用了一個非常巧妙的or for i in range(1,20):print(‘apple’[i%3*len(‘apple’)::]ori)

這道題的技巧性非常高,而且很巧妙,希望零基礎的同學仔細看明白每一步!

2. 列表、字典——綜合實戰應用

題目:尋找班級名字最長的人

現有一字符串人名:

names=(' Kunpen Ji, Li XIAO, Caron Li, Donl SHI, Ji ZHAO,Fia YUAN Y, Weue

DING, Xiu XU, Haiying WANG, Hai LIN,Jey JIANG, Joson WANG E, Aiyang ZHANG,Hay

MENG, Jak ZHANG E, Chang Zhang, Coro ZHANG'

)

需要實現下面3個要求:

(1):排序,按照名字A-Z排序

(2):找出裏面姓“ZHANG”的人數

(3):找出名字裏面最長的人

代碼思路:

分析問題1:

首先我們要做的是對字符串進行分割去掉‘,’,然後就變成了一個長的列表,最後對列表進行排序(注意名字前後有多餘空格去掉),第一個問題就解決了。

defsort_names(names):

return(sorted([name.strip()fornameinnames.split(',')]))

分析問題2:

我們需要找出姓“ZHANG”,因爲名字裏面有英文名字和中文名字,有的後面還跟E/Y,所以我們先定義一個函數,從分割後的新名字列表取出每一個名字,然後解析、翻轉,用推導列表形成一個新的名字列表,然後再用字符串裏的.startswitch(‘ZHANG’)取出符合的名字。

defget_chinese_names(names):

chinese_names=[]

fornameinsort_names(names):

iflen(name)>=2:

first_name=name.split()[0].capitalize()

last_name=name.split()[1].capitalize()

chinese_names.append(last_name+' '+first_name)

else:

chinese_names.append(name)

list_temp = []

foriinchinese_names:

ifi.startswith('Zhang'):

list_temp.append(i)

print("姓'ZHANG'的有%s個,分別是:%s"% (len(list_temp), list_temp))

returnchinese_names

分析問題3:

找出名字裏面字符串最長的人,我們先定義一個函數,然後從從問題1形成的新列表中取出每一個名字,然後用max方法,用推導列表取出符合的名字。

deflongest_name(names):

long_names = []

fornameinsort_names(names):

iflen(name) == max(len(name)fornameinsort_names(names)):

long_names.append(name)

print("名字最長的有%s個,分別是:%s"% (len(long_names), long_names))

returnlong_names

完整代碼:

names = ('Kunpen Ji, Li XIAO, Caron Li,'

'Dongjian SHI, Ji ZHAO, Fia YUAN Y,'

'Wenxue DING, Xiu XU, Haiying WANG, Hai LIN,'

'Jey JIANG, Joson WANG E,'

'Aiyang ZHANG, Haiying MENG,'

'Jack ZHANG E, Chang Zhang, Coron ZHANG')

defsort_names(names):

names_list = sorted([name.strip()fornameinnames.split(',')])

returnnames_list

defget_chinese_names(names):

chinese_names=[]

fornameinsort_names(names):

iflen(name)>=2:

first_name=name.split()[0].capitalize()

last_name=name.split()[1].capitalize()

chinese_names.append(last_name+' '+first_name)

else:

chinese_names.append(name)

list_temp = []

foriinchinese_names:

ifi.startswith('Zhang'):

list_temp.append(i)

print("姓'ZHANG'的有%s個,分別是:%s"% (len(list_temp), list_temp))

returnchinese_names

deflongest_name(names):

long_names = []

fornameinsort_names(names):

iflen(name) == max(len(name)fornameinsort_names(names)):

long_names.append(name)

print("名字最長的有%s個,分別是:%s"% (len(long_names), long_names))

returnlong_names

print(sort_names(names))

get_chinese_names(names)

longest_name(names)

今天給大家介紹的這兩個實戰項目,都非常經典,希望Python入門的朋友能好好看看。最近也剛好有點時間,準備寫一寫Python入門的一些實戰項目,大家覺得怎麼樣呢?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章