42個python經典小例子,讓你在學習的路上不迷路

告別枯燥,60秒學會一個Python小例子。奔著此出發點,我在過去1個月,將平時經常使用的代碼段換為小例子,分享出來後受到大家的喜歡。

今天我完整梳理一遍,總結到這裡。很感謝這段時間,有3個小夥伴為此庫所做出的貢獻。

一、基本操作

1 鏈式比較

i=3
print(1print(1

2 不用else和if實現計算器

fromoperatorimport*

defcalculator(a,b,k):
return{
'+':add,
'-':sub,
'*':mul,
'/':truediv,
'**':pow
}[k](a,b)

calculator(1,2,'+')#3
calculator(3,4,'**')#81

3 函數鏈

fromoperatorimport(add,sub)

defadd_or_sub(a,b,oper):
return(addifoper=='+'elsesub)(a,b)

add_or_sub(1,2,'-')#-1

4 求字符串的字節長度

defstr_byte_len(mystr):
return(len(mystr.encode('utf-8')))

str_byte_len('ilovepython')#13(個字節)
str_byte_len('字符')#6(個字節)

5 尋找第n次出現位置

defsearch_n(s,c,n):
size=0
fori,xinenumerate(s):
ifx==c:
size+=1
ifsize==n:
returni
return-1

(search_n("fdasadfadf","a",3))#結果為7,正確
print(search_n("fdasadfadf","a",30))#結果為-1,正確

6 去掉最高最低求平均

defscore_mean(lst):
lst.sort()
lst2=lst[1:(len(lst)-1)]
returnround((sum(lst2)/len(lst2)),2)

score_mean([9.1,9.0,8.1,9.7,19,8.2,8.6,9.8])#9.07

7 交換元素

defswap(a,b):
returnb,a

swap(1,0)#(0,1)

二、基礎算法

1 二分搜索

defbinarySearch(arr,left,right,x):
while<=:
mid=int(+(-)/2);#找到中間位置。求中點寫成(left+right)/2更容易溢出,所以不建議這樣寫

#檢查x是否出現在位置mid
ifarr[mid]==x:
print('found%d在索引位置%d處'%(x,mid))
returnmid

#假如x更大,則不可能出現在左半部分
elifarr[mid]=mid+1#搜索區間變為[mid+1,right]
print('區間縮小為[%d,%d]'%(mid+1,))

elifx=mid-1#搜索區間變為[left,mid-1]
print('區間縮小為[%d,%d]'%(,mid-1))

return-1

2 距離矩陣

x,y=mgrid[0:5,0:5]
list(map(lambdaxe,ye:[(ex,ey)forex,eyinzip(xe,ye)],x,y))
[[(0,0),(0,1),(0,2),(0,3),(0,4)],
[(1,0),(1,1),(1,2),(1,3),(1,4)],
[(2,0),(2,1),(2,2),(2,3),(2,4)],
[(3,0),(3,1),(3,2),(3,3),(3,4)],
[(4,0),(4,1),(4,2),(4,3),(4,4)]]

三、列表

1 打印乘法表

foriinrange(1,10):
forjinrange(1,i+1):
print('{0}*{1}={2}'.format(j,i,j*i),="\\t")
print()

結果:

1*1=1
1*2=22*2=4
1*3=32*3=63*3=9

1*4=42*4=83*4=124*4=16
1*5=52*5=103*5=154*5=205*5=25
1*6=62*6=123*6=184*6=245*6=306*6=36
1*7=72*7=143*7=214*7=285*7=356*7=427*7=49
1*8=82*8=163*8=244*8=325*8=406*8=487*8=568*8=64
1*9=92*9=183*9=274*9=365*9=456*9=547*9=638*9=729*9=81

2 嵌套數組完全展開

fromcollections.abcimport*

defflatten(input_arr,output_arr=None):
ifoutput_arrisNone:
output_arr=[]
foreleininput_arr:
ifisinstance(ele,Iterable):#判斷ele是否可迭代
flatten(ele,output_arr)#尾數遞歸
else:
output_arr.append(ele)#產生結果
returnoutput_arr

flatten([[1,2,3],[4,5]],[6,7])#[6,7,1,2,3,4,5]

3 將list等分為子組

frommathimportceil

defdivide(lst,size):
ifsize<=0:
return[lst]
return[lst[i*size:(i+1)*size]foriinrange(0,ceil(len(lst)/size))]

r=divide([1,3,5,7,9],2)#[[1,3],[5,7],[9]]

4 生成fibonacci序列前n項

deffibonacci(n):
ifn<=1:
return[1]
fib=[1,1]
whilelen(fib)fib.append(fib[len(fib)-1]+fib[len(fib)-2])
returnfib

fibonacci(5)#[1,1,2,3,5]

5 過濾掉各種空值

deffilter_false(lst):
returnlist(filter(bool,lst))

filter_false([None,0,False,'',[],'ok',[1,2]])#['ok',[1,2]]

6 返回列表頭元素

defhead(lst):
returnlst[0]iflen(lst)>0elseNone

head([])#None
head([3,4,1])#3

7 返回列表尾元素

deftail(lst):
returnlst[-1]iflen(lst)>0elseNone

print(tail([]))#None
print(tail([3,4,1]))#1

8 對象轉換為可迭代類型

fromcollections.abcimportIterable

defcast_iterable(val):
returnifisinstance(,Iterable)else[]

cast_iterable('foo')#foo
cast_iterable(12)#[12]
cast_iterable({'foo':12})#{'foo':12}

9 求更長列表

defmax_length(*lst):
returnmax(*lst,key=lambdav:len(v))

r=max_length([1,2,3],[4,5,6,7],[8])#[4,5,6,7]

10 出現最多元素

defmax_frequency(lst):
returnmax(lst,default='列表為空',key=lambdav:lst.count(v))

lst=[1,3,3,2,1,1,2]
max_frequency(lst)#1

11 求多個列表的最大值

defmax_lists(*lst):
returnmax(max(*lst,key=lambdav:max(v)))

max_lists([1,2,3],[6,7,8],[4,5])#8

12 求多個列表的最小值

defmin_lists(*lst):
returnmin(min(*lst,key=lambdav:max(v)))

min_lists([1,2,3],[6,7,8],[4,5])#1

13 檢查list是否有重複元素

defhas_duplicates(lst):
returnlen(lst)==len(set(lst))

x=[1,1,2,2,3,2,3,4,5,6]
y=[1,2,3,4,5]
has_duplicates(x)#False
has_duplicates(y)#True

14 求列表中所有重複元素

fromcollectionsimportCounter

deffind_all_duplicates(lst):
c=Counter(lst)
returnlist(filter(lambdak:c[k]>1,c))

find_all_duplicates([1,2,2,3,3,3])#[2,3]

15 列表反轉

defreverse(lst):
returnlst[::-1]

reverse([1,-2,3,4,1,2])#[2,1,4,3,-2,1]

16 浮點數等差數列

defrang(start,stop,n):
,,n=float('%.2f'%),float('%.2f'%),int('%.d'%n)
step=(-)/n
lst=[]
whilen>0:
,n=+step,n-1
lst.append(((),2))
returnlst

rang(1,8,10)#[1.0,1.7,2.4,3.1,3.8,4.5,5.2,5.9,6.6,7.3,8.0]

四、字典

1 字典值最大的鍵值對列表

defmax_pairs(dic):
iflen(dic)==0:
returndic
max_val=max(map(lambdav:v[1],dic.items()))
return[itemforitemindic.items()ifitem[1]==max_val]

max_pairs({'a':-10,'b':5,'c':3,'d':5})#[('b',5),('d',5)]

2 字典值最小的鍵值對列表

defmin_pairs(dic):
iflen(dic)==0:
return[]
min_val=min(map(lambdav:v[1],dic.items()))
return[itemforitemindic.items()ifitem[1]==min_val]


min_pairs({})#[]

r=min_pairs({'a':-10,'b':5,'c':3,'d':5})
print(r)#[('b',5),('d',5)]

3 合併兩個字典

defmerge_dict2(dic1,dic2):
return{**dic1,**dic2}#python3.5後支持的一行代碼實現合併字典

merge_dict({'a':1,'b':2},{'c':3})#{'a':1,'b':2,'c':3}

4 求字典前n個最大值

fromheapqimportnlargest

#返回字典d前n個最大值對應的鍵
deftopn_dict(d,n):
returnnlargest(n,d,key=lambdak:d[k])

topn_dict({'a':10,'b':8,'c':9,'d':10},3)#['a','d','c']

5 求最小鍵值對

d={'a':-10,'b':5,'c':3,'d':5}
min(d.items(),key=lambdax:x[1])#('a',-10)

五、集合

1 互為變位詞

fromcollectionsimportCounter
#檢查兩個字符串是否相同字母異序詞,簡稱:互為變位詞
defanagram(str1,str2):
returnCounter(str1)==Counter(str2)

anagram('eleven+two','twelve+one')#True這是一對神器的變位詞
anagram('eleven','twelve')#False

六、文件操作

1 查找指定文件格式文件

importos

deffind_file(work_dir,extension='jpg'):
lst=[]
forinos.listdir(work_dir):
print()
splits=os.path.splitext()

ext=splits[1]#拿到擴展名
ifext=='.'+extension:
lst.()
returnlst

find_file('.','md')#返回所有目錄下的md文件

七、正則和爬蟲

1 爬取天氣數據並解析溫度值

素材來自朋友袁紹

importrequests
fromlxmlimportetree
importpandasaspd
importre

url='http://www.weather.com.cn/weather1d/101010100.shtml#input'
withrequests.(url)asres:
content=res.content
html=etree.HTML(content)

通過lxml模塊提取值,lxml比beautifulsoup解析在某些場合更高效

=html.xpath('//*[@id="around"]//a[@target="_blank"]/span/text()')
temperature=html.xpath('//*[@id="around"]/div/ul/li/a/i/text()')

結果:

['香河','涿州','唐山','滄州','天津','廊坊','太原','石家莊','涿鹿','張家口','保定','三河','北京孔廟','北京國子監','中國地質博物館','月壇公園','明城牆遺址公園','北京市規劃展覽館','什剎海','南鑼鼓巷','天壇公園','北海公園','景山公園','北京海洋館']

['11/-5°C','14/-5°C','12/-6°C','12/-5°C','11/-1°C','11/-5°C','8/-7°C','13/-2°C','8/-6°C','5/-9°C','14/-6°C','11/-4°C','13/-3°C'
,'13/-3°C','12/-3°C','12/-3°C','13/-3°C','12/-2°C','12/-3°C','13/-3°C','12/-2°C','12/-2°C','12/-2°C','12/-3°C']
df=pd.DataFrame({'location':location,'temperature':temperature})
print('溫度列')
print(df['temperature'])

正則解析溫度值

df['high']=df['temperature'].apply(lambda:(re.('(-?[0-9]*?)/-?[0-9]*?°C',).group(1)))
df['low']=df['temperature'].apply(lambda:(re.('-?[0-9]*?/(-?[0-9]*?)°C',).group(1)))
(df)

詳細說明子字符創捕獲

除了簡單地判斷是否匹配之外,正則表達式還有提取子串的強大功能。用 () 表示的就是要提取的分組(group)。比如: ^(\\d{3})-(\\d{3,8})$ 分別定義了兩個組,可以直接從匹配的字符串中提取出區號和本地號碼

m=re.match(r'^(\\d{3})-(\\d{3,8})$','010-12345')
print(m.group(0))
print(m.group(1))
print(m.group(2))

#010-12345
#010
#12345

如果正則表達式中定義了組,就可以在 Match 對象上用 group() 方法提取出子串來。

注意到 group(0) 永遠是原始字符串,

group(1)group(2) ……表示第1、2、……個子串。

最終結果

Name:temperature,dtype:object
locationtemperaturehighlow
0香河11/-5°C11-5
1涿州14/-5°C14-5
2唐山12/-6°C12-6
3滄州12/-5°C12-5
4天津11/-1°C11-1
5廊坊11/-5°C11-5
6太原8/-7°C8-7
7石家莊13/-2°C13-2
8涿鹿8/-6°C8-6
9張家口5/-9°C5-9
10保定14/-6°C14-6
11三河11/-4°C11-4
12北京孔廟13/-3°C13-3
13北京國子監13/-3°C13-3
14中國地質博物館12/-3°C12-3
15月壇公園12/-3°C12-3
16明城牆遺址公園13/-3°C13-3
17北京市規劃展覽館12/-2°C12-2
18什剎海12/-3°C12-3
19南鑼鼓巷13/-3°C13-3
20天壇公園12/-2°C12-2
21北海公園12/-2°C12-2
22景山公園12/-2°C12-2
23北京海洋館12/-3°C12-3

2 批量轉化駝峰格式

importre
defcamel(s):
s=re.sub(r"(\\s|_|-)+","",s).title().replace("","")
returns[0].lower()+s[1:]


#批量轉化
defbatch_camel(slist):
return[camel(s)forsinslist]

batch_camel(['student_id','student\\tname','student-add'])#['studentId','studentName','studentAdd']

八、繪圖

1 turtle繪製奧運五環圖

結果:

42個python經典小例子,讓你在學習的路上不迷路

2 turtle繪製漫天雪花

結果:

42個python經典小例子,讓你在學習的路上不迷路

3 4種不同顏色的色塊,它們的顏色真的不同嗎?

42個python經典小例子,讓你在學習的路上不迷路

4 詞頻雲圖

importhashlib
importpandasaspd
fromwordcloudimportWordCloud
geo_data=pd.read_excel(r"../data/geo_data.xlsx")
words=','.join(xforxingeo_data['city']ifx!=[])#篩選出非空列表值
wc=WordCloud(
background_color="green",#背景顏色"green"綠色
max_words=100,#顯示最大詞數
font_path='./fonts/simhei.ttf',#顯示中文
min_font_size=5,
max_font_size=100,

width=500#圖幅寬度
)
x=wc.generate(words)
x.to_file('../data/geo_data.png')

42個python經典小例子,讓你在學習的路上不迷路

八、生成器

1 求斐波那契數列前n項(生成器版)

deffibonacci(n):
a,b=1,1
for_inrange(n):
yielda
a,b=b,a+b

list(fibonacci(5))#[1,1,2,3,5]

2 將list等分為子組(生成器版)

frommathimportceil

defdivide_iter(lst,n):
ifn<=0:
yieldlst
return
i,div=0,ceil(len(lst)/n)
whileiyieldlst[i*div:(i+1)*div]
i+=1

list(divide_iter([1,2,3,4,5],0))#[[1,2,3,4,5]]
list(divide_iter([1,2,3,4,5],2))#[[1,2,3],[4,5]]

九、keras

1 Keras入門例子

importnumpyasnp
fromkeras.modelsimportSequential
fromkeras.layersimportDense

data=np.random.random((1000,1000))
labels=np.random.randint(2,size=(1000,1))
model=Sequential()
model.add(Dense(32,
activation='relu',
input_dim=100))
model.add(Dense(1,activation='sigmoid'))
model.compile(optimize='rmsprop',loss='binary_crossentropy',
metrics=['accuracy'])
model.fit(data,labels,epochs=10,batch_size=32)
predictions=model.predict(data)

要想查看更多小例子,轉發此文+關注並私信小編“資料”即可,還可免費領取2020最新python資料和零基礎入門教程!小編不定期分享乾貨,歡迎初學者和進階中的小夥伴!


分享到:


相關文章: