python中函數(shù)進(jìn)階 python函數(shù)詳解

如何從零開始學(xué)python

新手學(xué)Python可以按照以下步驟進(jìn)行:

創(chuàng)新互聯(lián)專注于營口企業(yè)網(wǎng)站建設(shè),自適應(yīng)網(wǎng)站建設(shè),商城系統(tǒng)網(wǎng)站開發(fā)。營口網(wǎng)站建設(shè)公司,為營口等地區(qū)提供建站服務(wù)。全流程按需規(guī)劃網(wǎng)站,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)

1. 按部就班敲代碼

在Python的學(xué)習(xí)教程中,在講到相應(yīng)的語法規(guī)則的時(shí)候,必定有相應(yīng)的案例,Python新手應(yīng)按部就班的敲一遍代碼,切記不可直接抄寫,而是默寫,然后進(jìn)行對比,及時(shí)發(fā)現(xiàn)錯(cuò)誤,并訂正。

2. 階段案例實(shí)操

對于正規(guī)的Python學(xué)習(xí)教程中,會(huì)安排階段性的作業(yè)考核,也稱為案例,一個(gè)階段的案例就比較具有綜合性,可以客觀的考察Python學(xué)員能否真正的對Python知識點(diǎn)消化吸收,并融會(huì)貫通,通過該案例的實(shí)操,可以進(jìn)行知識點(diǎn)的查漏補(bǔ)缺!

3. 大型項(xiàng)目模仿

在Python學(xué)習(xí)中,少不了大型項(xiàng)目實(shí)操,如果參加培訓(xùn)學(xué)習(xí),這個(gè)就比較簡單了,往往課程教學(xué)中會(huì)包含這一項(xiàng),Python學(xué)員可以先自己寫一遍,然后再聽老師的講解,通過對比,找到疑惑點(diǎn)和不足之處,然后進(jìn)行思路和項(xiàng)目的優(yōu)化;對于未參加Python培訓(xùn)的學(xué)員,可以在網(wǎng)上找一些大型項(xiàng)目進(jìn)行練習(xí),多看多練多總結(jié),就能熟練掌握Python,形成更優(yōu)化的Python思路。

對于Python等編程語言的學(xué)習(xí),首先是要掌握齊全科學(xué)的Python學(xué)習(xí)教程,其次,要有恒心和細(xì)心,多看、勤思考、多練習(xí)是一定能夠?qū)ython學(xué)好的!

學(xué)習(xí)這個(gè)的嗎Python3實(shí)用編程技巧進(jìn)階我

一、如何在列表,字典,集合中根據(jù)條件篩選數(shù)據(jù)?

問題1:

如何過濾掉列表[3,9,-1,10,20,-2]中的負(fù)數(shù)?

解決方法:

在Python中可以使用函數(shù)式編程,列表解析,字典解析集合解析等方式進(jìn)行篩選。

1)最通常的方法:迭代

data = [3,9,-1,10,20,-2]res = []for x in data: if(x = 0): res.append(x)print(res)

2)使用filter函數(shù)

from random import randintdata = [randint(-10,10) for x in range(10)] #在-10到10之間隨機(jī)生成10個(gè)隨機(jī)數(shù)newdata = list(filter(lambda x: x = 0, data))print(newdata)

注意Python3中的filter函數(shù)返回的對象從列表改為了Iterator(迭代器),因此如果想返回一個(gè)列表,就要加上list()

3)列表解析

newdata2 = [x for x in data if x = 0]print(newdata2)

結(jié)果和使用filter函數(shù)相同,但是使用列表解析所需的時(shí)間要比使用filter快很多,所以首選的方式就是列表解析,另外這兩種方式都遠(yuǎn)快于迭代的方式。(推薦閱讀:Python零基礎(chǔ)入門在線網(wǎng)課)

問題2:

如何篩選出字典中值高于90的項(xiàng)?

解決方法:

from random import randintdic = {x: randint(60,100) for x in range(1,11)} #隨機(jī)生成學(xué)號1到10的學(xué)生成績newdic = {k:v for k,v in dic.items() if v = 90} #同時(shí)迭代鍵和值,Python3中的iteritems變?yōu)閕temsprint(newdic)

問題3:

如何篩選出集合{77,89,32,29,33}中能被3整除的元素?

解決方法:

s = {77,89,32,29,33}news = {x for x in s if x % 3 == 0}print(news)

二、如何為元組中的每個(gè)元素命名,提高程序的可讀性?

實(shí)際案例:

如學(xué)生信息管理系統(tǒng)中數(shù)據(jù)為固定格式:

(名字,年齡,性別...)

學(xué)生數(shù)量很大,為了減少存儲開銷,對每個(gè)學(xué)生信息采用元組表示:

(‘jam’,16,’male’)

(‘tom’,18,’male’)

(‘july’,19,’female’)

...

訪問元組時(shí),需要使用索引(index)來訪問,

如一個(gè)學(xué)生元組為student = ('jam',19,'male'),那么想要訪問其名字時(shí)要使用student[0],訪問其性別時(shí)要使用student[2]

由此帶來的問題是大量的索引會(huì)降低程序的可讀性,

那么如何來解決這個(gè)問題呢?

有兩種解決方案:

方案1:定義枚舉類型,也就是定義一系列數(shù)值常量

NAME = 0AGE = 1SEX = 2# NAME,AGE,SEX = range(1,4)student = ('jam',19,'male')print(student[NAME])print(student[AGE])

方案2:使用標(biāo)準(zhǔn)庫中collections.namedtuple替代內(nèi)置的tuple

from collections import namedtupleStudent = namedtuple('student',['name','age','sex']) #相當(dāng)于創(chuàng)建了一個(gè)命名元組類,第一個(gè)參數(shù)是元組的名字,第二個(gè)參數(shù)是其屬性s1 = Student('jam',18,'male') #可以直接傳參s2 = Student(name='tom',age=20,sex='male') #也可以通過關(guān)鍵字傳參print(s1.name) #通過屬性來訪問print(s2.age)

python中zip函數(shù)有哪些高級用法

zip() ?功能是從參數(shù)的多個(gè)迭代器中選取元素組合成一個(gè)新的迭代器。顧名思義,它就是一個(gè)將對象進(jìn)行打包和解包的函數(shù)。

它可以傳入的參數(shù)包括;元組、列表、字典等迭代器

它返回一個(gè)zip對象,其內(nèi)部元素為元組,一組一組的,可以轉(zhuǎn)化為列表或元組,這里要強(qiáng)調(diào)一下,Python2和Python3中返回的zip對象有所不同。

Python3中zip()函數(shù)再不再返回list對象,但是可以通過list強(qiáng)行轉(zhuǎn)換。(類似的函數(shù)變化還有dictionary關(guān)聯(lián)的keys()、values()、items(),map(),filter())。

打包zip(iterables)

上面的代碼使用的環(huán)境是Python3.6,其中l(wèi)ist (z)操作就是強(qiáng)制轉(zhuǎn)換。注意一個(gè)問題,a和b這兩個(gè)列表是不同長短的,這時(shí)候zip函數(shù)就會(huì)匹配完最短的那個(gè)便結(jié)束。

當(dāng)zip函數(shù)的參數(shù)只有一個(gè)時(shí),它將從iterable中依次取一個(gè)元素,組成一個(gè)元組。

解包zip(*iterables)

解包,zip 相反,可理解為解壓,返回多維矩陣形式,有幾個(gè)組元素就返回幾維的。

比如,下面我是用三個(gè)列表組合起來的迭代式,那么解壓后就返回三維的矩陣

zip高級用法

講完了基本的再來說一下該函數(shù)的高級用法。高級用法離不開一個(gè)詞:Pythonic,就是將代碼寫的更優(yōu)雅美觀,看起來有逼格!

1. 列表推導(dǎo)

例如:

a = [1,2,3,4]

b = [5,6,7,8]

我們要同時(shí)遍歷a、b,且要對它們進(jìn)行操作,那就要放在同一個(gè)for循環(huán)內(nèi),zip函數(shù)正好合適

注意:如果是Python2環(huán)境中,要使用izip才能提高效率。

當(dāng)然,如果你需要對下標(biāo)進(jìn)行操作,那么還需要加上enumerate函數(shù)

2. 使用zip創(chuàng)建鍵值對,zip方法返回的是一個(gè)元組,用它來創(chuàng)建鍵值對,簡單明了。

數(shù)據(jù)蛙-Python進(jìn)階

這是漫長的一周,本周完成了Python的進(jìn)階模塊,主要是pandas、numpy、matplotlib、seaborn、pyecharts這些模塊的學(xué)習(xí)以及一個(gè)實(shí)際的案例:商品銷售情況分析,之前一直覺得課程難度不夠,但到這一周難度就大大提高了。尤其是案例練習(xí)中的RFM模型和用戶生命周期建立,看懂不難但是自己寫一直出錯(cuò),在不斷出錯(cuò)不斷嘗試中知識得到了積累,另外可視化部分沒有什么練習(xí)題,希望后面可以加上一些這方面的練習(xí),接下來分模塊來總結(jié)一下學(xué)習(xí)的內(nèi)容。

重新設(shè)置索引:df.set_index()

Series格式轉(zhuǎn)換為DataFrame:df.to_frame()

文件讀取:pd.read_csv(filepath, header = 0,skiprows=[1,2])?

使用位置做索引:df.loc[0]????????使用列表做索引:df.loc[[0,1,2]]

使用切片做索引:df.loc[0:4]????????使用bool類型索引:df[df['年齡']30]

loc 是基于索引值的,切片是左閉右閉的

iloc 是基于位置的,切片是左閉右開的

修改列索引:df.rename(columns={'姓名':'name', '年齡':'age'},inplace=True)

替換一個(gè)值:df.replace({'name':{'小明':'xiaoming'}},inplace=True)

對數(shù)據(jù)進(jìn)行排序:df.sort_values('age')

累加求和:df.cumsum(0)

刪除列:del df['player']?????????刪除行:df.drop(labels=0)?labels 是行列的名字

數(shù)據(jù)拼接:pd.concat([left,right],axis=1)

# 指定列進(jìn)行關(guān)聯(lián),默認(rèn)是 inner join ????result = pd.merge(left,right,on='key')

#多個(gè)關(guān)聯(lián)條件:result = pd.merge(left, right, on=['key1', 'key2'])

#左連接:result = pd.merge(left, right, how='left', on=['key1', 'key2'])

# 列名不一樣的關(guān)聯(lián):pd.merge(left,right,left_on = ['key1','key2'],right_on = ['key3','key4'])

#單個(gè)分組:groups = df.groupby('district')

# 作用多個(gè)聚合函數(shù):groups.agg([np.mean,np.sum,np.std])

# 針對具體列聚合 groups.age.agg([np.mean,np.sum,np.std])

# 不同列不同聚合函數(shù) groups.agg({"age":np.mean,"novip_buy_times":np.sum})

分組后該列值求和顯示:groups['vip_buy_times'].transform('sum')

通常用于求占比:transform(lambda x: x /sum(x))

# 填充指定值:np.full([3,4],1)

# 起始為10,5為步長,30為結(jié)尾取不到:np.arange(10, 30, 5)

#隨機(jī)矩陣:np.random.random((2,3))

# 平均劃分:np.linspace( 0, 2*pi, 100 )

# 類型及轉(zhuǎn)換:vector.astype('float')

# 多維變一維:matrix.ravel()

# 矩陣的擴(kuò)展:a = np.arange(0, 40, 10)? ? b = np.tile(a, (3, 5))? ? # 行變成3倍,列變成5倍

# 水平拼接:np.hstack((a,b))? 豎直拼接:np.vstack((a,b))

# 豎直分割:np.hsplit(a,3)? ? #水平分割:np.vsplit(a,3)

8. Select the data in rows [3, 4, 8] and in columns ['animal', 'age'].

A:df.loc[df.index[[3,4,8]],['animal','age']]

行采用位置,列采用普通索引,這里利用index函數(shù)將位置變化為具體的普通索引,再利用loc函數(shù)

19. The 'priority' column contains the values 'yes' and 'no'. Replace this column with a column of boolean values: 'yes' should be True and 'no' should be False

A1:df['priority'].replace(['yes','no'],[True,False],inplace=True) 用replace函數(shù)替換

A2:df['priority'] = df['priority'].map({'yes': True, 'no': False}) 用map函數(shù)替換

最大最小值的索引:df.idxmax、df.idxmin

找出最大最小的前N個(gè)數(shù):nlargest()和nsmallest()?

將原表分組 并設(shè)置分段區(qū)間 pd.cut(df['A'], np.arange(0, 101, 10))

resample函數(shù) 日期重采樣:s.resample('M').mean()

TimeGrouper 重組:s.groupby(pd.TimeGrouper('4M')).idxmax()

split 分割函數(shù):temp = df['From_To'].str.split('_', expand=True) True為DataFrame

兩個(gè)DataFrame拼接用join:df = df.join(temp)

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif']=['SimHei'] #用來正常顯示中文標(biāo)簽

plt.rcParams['axes.unicode_minus']=False #用來正常顯示負(fù)號

%matplotlib inline 直接顯示

折線圖:plt.plot(x,y,color = 'r')

柱狀圖:plt.bar(x,y)? plt.barh(x,y) 多個(gè)bar x設(shè)置不同 堆積圖 bottom設(shè)置不同

散點(diǎn)圖:plt.scatter(x, y, c=colors, alpha=0.5, s = area)

直方圖:plt.hist(a,bins= 20) bin代表分隔的最小單位

plt.legend() 顯示圖例

for a,b in zip(X+W[i],data[i]):

plt.text(a,b,"%.0f"% b,ha="center",va= "bottom") 添加數(shù)據(jù)標(biāo)簽

plt.annotate('注釋文本',xy=(1, np.sin(1)),xytext=(2, 0.5), fontsize=16,arrowprops=dict(arrowstyle="-")) 添加注釋文本

plt.xlabel("Group") x軸標(biāo)題

plt.ylabel("Num") y軸標(biāo)題

fig, axes = plt.subplots(nrows=2, ncols=2,facecolor='darkslategray')? 繪制多個(gè)圖形

axes[0,0] axes[0,1] axes[1,0] axes[1,1]

pylab.rcParams['figure.figsize'] = (10, 6) # 調(diào)整圖片大小

動(dòng)態(tài)展示圖表

from pyecharts.charts import Bar

from pyecharts import options as opts

** pyecharts 繪圖的五個(gè)步驟:**

創(chuàng)建圖形對象:bar = Bar()

添加繪圖數(shù)據(jù):bar.add_xaxis(["襯衫", "毛衣", "領(lǐng)帶", "褲子", "風(fēng)衣", "高跟鞋", "襪子"])

? ? ???????????????? bar.add_yaxis("商家A", [114, 55, 27, 101, 125, 27, 105])

? ? ? ? ? ? ? ? ? ? ?bar.add_yaxis("商家B", [57, 134, 137, 129, 145, 60, 49])

配置系列參數(shù):對標(biāo)簽、線型等的一些設(shè)置

配置全局參數(shù):bar.set_global_opts(title_opts=opts.TitleOpts(title="銷售情況"))

渲染圖片:生成本地 HTML 文件 bar.render("mycharts.html")? bar.render()

notebook 渲染:bar.render_notebook()

bar = (Bar()

.add_xaxis(["襯衫", "毛衣", "領(lǐng)帶", "褲子", "風(fēng)衣", "高跟鞋", "襪子"])

.add_yaxis("商家A", [114, 55, 27, 101, 125, 27, 105])

.add_yaxis("商家B", [57, 134, 137, 129, 145, 60, 49])

.set_global_opts(title_opts=opts.TitleOpts(title="某商場銷售情況"))

)

bar.render_notebook()

柱狀圖:Bar()

條形圖:bar.reversal_axis() #翻轉(zhuǎn)XY軸,將柱狀圖轉(zhuǎn)換為條形圖

折線圖:from pyecharts.charts import Line? line=Line()

餅圖:from pyecharts.charts import Page, Pie????Pie()?

轉(zhuǎn)換日期類型:df['order_dt']=pd. to_datetime (df.order_dt,format="%Y%m%d")

將日期轉(zhuǎn)換為月為單位:df['month']=df.order_dt.values. astype('datetime64[M]') 所有日期顯示為當(dāng)月第一天

去除日期單元值:order_diff/ np.timedelta64(1,'D')

過濾部分極值:grouped_user.sum() .query('order_products100') .order_amount

數(shù)據(jù)透視表:rfm=df.pivot_table( index ='user_id', values =['order_products','order_amount'], aggfunc ={'order_amount':'sum','order_products':'sum'})

map() 方法是pandas.series.map()方法, 對DF中的元素級別的操作, 可以對df的某列或某多列

applymap(func) 也是DF的屬性, 對整個(gè)DF所有元素應(yīng)用func操作

purchase_r=pivoted_counts.applymap(lambda x: 1 if x1 else np.NaN if x==0 else 0)

apply(func) 是DF的屬性, 對DF中的行數(shù)據(jù)或列數(shù)據(jù)應(yīng)用func操作,也可用于Series

apply(lambda x:x.cumsum()/x.sum())? ? 累計(jì)占比

apply(lambda x:x/x.sum(),axis=0)? ? ?每一列中每行數(shù)據(jù)占比

下周開始進(jìn)入數(shù)據(jù)分析思維的課程,很期待后面的課程以及項(xiàng)目,加油!

分享標(biāo)題:python中函數(shù)進(jìn)階 python函數(shù)詳解
本文網(wǎng)址:http://muchs.cn/article44/dospdhe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化、網(wǎng)站建設(shè)、面包屑導(dǎo)航、靜態(tài)網(wǎng)站定制網(wǎng)站、用戶體驗(yàn)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)