函數的基本概念:
python中函數分為以下四種:
1,python內置函數:如abs,len,max,min;
2,標準庫函數:通過import聲明標準庫,如:math,random,通過import聲明引入;
3,第三方庫:由社區提供,同樣由import聲明引入;
4,由函數自定義的函數;
函數的使用:
函數的定義與調用:
函數定義的語法格式如下:
def 函數名([參數列表]):函數體
注意:
1,多個參數使用‘,’隔開;
2,不要少了圓括號后的‘ :’;
3,函數體與def語句之間要保持一定的縮進;
4,無論顯示聲明與否,函數語句都會返回一個return值:
例如:
def dayin(a):print(a)print(dayin(a))
若輸入:2,則輸出結果為:2; None。即說明了在沒有顯示說明return值時,實際上會返回None值
ps:
函數幫助文檔的書寫:
幫助文檔可以隨時對于某一變量或是某一函數的作用進行說明(由自己撰寫),其聲名方式如下:
def shili(x):'''本代碼作為解釋說明的作用'''函數體
用shift + tab 喚出;
函數的參數:
1,默認值函數:
在聲明函數時,可以為某些參數指定默認值,當沒有傳入對應的實參值時,該變量就會使用默認值
例如:
def babble(words, times = 1):print((words + " ") * times)
babble("hello",3)
babble("nihao")輸出:
hello hello hello
nihao
注意:默認值參數必須寫在形參列表的右邊
2,按名稱傳遞參數:
可以指定某一個參數名進行傳參,擺脫了順序的限制:
def test(a, b):print(a + '=' + b)
test(a = "aa", b = "bb")
test(b = "bb", a = "aa")結果相同
?在print函數中按名稱傳參的例子:
若希望在輸出的不同項之間用指定字符A相連,可以調用形式:
print(..., sep = "A")
若不希望在一次輸出后換行,可以使用形式:
print(...., end = "")
?自動換行的實現:
for i in range(1, 10):print(i, end = ", " if i %3 != 0 else "\n")1, 2, 3
4, 5, 6
7, 8, 9
這里注意一個新的if else語句書寫形式:
A if 條件1 else B
3,可變參數:
在定義函數的參數時,
使用帶? *? 的參數,意味著允許向函數傳遞可變數組的參數。調用函數時,自該參數后的所有參數都被收集為一個元組。例如:
def test(*a):for i in a:print("{:^4}".format(i), end = ' ')return len(a)
count = test('李白', '杜甫')
print("共{}人".format(count))輸出:李白 杜甫 共2人
???使用帶 ** 的參數,自該參數后的所有參數都被收集為字典
def test(**a):print(a)
test(group1 = 10, group2 = 20, group3 = 30)輸出:{'group1': 10, 'group2': 20, 'group3': 30}
?若同時存在多個可變參數與默認值參數該怎么傳參:
4,形參與實參的討論:
單個數據類型與c++類似,不再贅述;
當實參是列表等可變對象時,形參實質上就是對該列表的直接引用,形參的改變之間反饋在實參列表上。
(ps:? 列表,字典...... 均為可變對象; int, float, str(字符串),bool 類型均是不可變對象)
5,函數返回多個值:
可以采用直接返回一個元組,返回多個值:
例如:
def fun(a, b):return (a, b, a / b, a % b)
n1 = fun(6 ,4 )
print(n1)
?lambda函數:
定義:
lambda函數——匿名函數,是一種在同一行進行函數定義的方法。廣泛用于需要函數對象作為參數或者函數比較簡單且只是用一次的場合。
定義語法格式:
lambda 參數1, 參數2, ....: <函數語句>
實例:
輸出負數:
f = lambda x: x < 0
lis = [1, -1, 2, 3, -2, -3]
for i in filter(f, lis):print(i)
?注意:這里的filter函數用于過濾序列,過濾掉不符合條件的元素。
? ? ? ? ? ? filter函數接受兩個參數:第一個為判斷函數,第二個是序列
也可以簡化為:
lis = [1, -1, 2, 3, -2, -3]
for i in filter(lambda x: x < 0, lis):print(i)
利用lambda對字典元素按值或按鍵排序:
若未提前說明:則默認視作字符串,通過字典序比較大小:
sorted(dict_data.items())按照值比大小
sorted(dict_data.items(), key = lambda x: x[1]) 按值與10的余數比大小:
sorted(dict_data.items(), key = lambda x: x[1] % 10) 按照列表中元素的長度比大小:
sorted(dict_data.items(), key = lambda x: len(x))
變量的作用域:
兩種最基本的變量作用域是局部變量和全局變量。
全局變量:
變量在函數外命名。
局部優先原則:
在局部變量與全局變量同名時,優先使用局部變量。
注意:若要強制聲明為全局變量,則應加上global,聲明后面出現的同名局部變量即是全局變量
遞歸函數 的調用:
聲明好邊界——即具體return值;
例如遞歸方法求最大公約數:
def gcd(a, b):if b == 0: return aelse : return gcd( b, a % b) %%這一步相當于自動完成了較大數與較小數的交換print(gcd(12, 24))
實例運用:
補充:
zip函數的使用:將對應元素打包成一個個元組,然后返回由這些元組組成的對象
zip([1, 2, 3], ['a', 'b', 'c'])輸出結果為 (1, ‘a’),(2, 'b'),(3, 'c')
相反的,將匹配后的結果再給zip函數,則會返回拆開后的兩個列表
統計文章詞頻:
def gettext(text): ##除去特殊符號和字母統一小寫text = text.lower()for ch in ",.;?=:\'":text = text.replace(ch, " ")return textdef wordfreq(text):words = text.split() ##split默認以空格和換行符為間隔分割元素counts = {}for word in words:count[word] = counts.get(word, 0) +1excludes = {'the','and','to','of','a','be'} ##去掉無意義單詞for word in excludes:del(counts[word])items = list(counts.items())items.sort(key = lambda x: x[1], reverse = True)return items[:topn]