1.函數的定義
函數是對代碼塊起了一個名字,在需要執行代碼塊的時候,直接調用函數
>>> def test(): ... print(test) ... >>> test() <function test at 0x7ff784f51e18>
>>> def test(a,b): ... print("{0}+{1}={2}".format(a,b,a+b)) ... >>> test(1,2) 1+2=3
2.return之後的函數是不會在做執行代碼的
如圖:當return後的
>>> def test(): ... return 1 ... print(2) ... >>> test() 1
3.函數參數
(1)第一種無默認值
>>> def test(a): ... print(a) ... >>> test(1) 1
(2)有默認值的參數,默認值參數必須在函數參數之後
如果在調用的時候不寫默認值就不會傳遞默認值,如果傳遞值的話就會覆蓋原來的默認值
>>> def test(a,b=1): ... print(a,b) ... >>> test(1) 1 1 >>> test(1,2) 1 2
4.忽略返回值
只接收前兩個參數
>>> a,b,*c = range(10) >>> a 0 >>> b 1 >>> c [2, 3, 4, 5, 6, 7, 8, 9]
只接收後兩個參數
>>> *a,b,c = range(10) >>> a [0, 1, 2, 3, 4, 5, 6, 7] >>> b 8 >>> c 9
只接收前兩個參數和後兩個參數
>>> a,b,*c,d,e = range(10) >>> a 0 >>> b 1 >>> c [2, 3, 4, 5, 6, 7] >>> d 8 >>> e 9
5.函數的關鍵字參數調用
關鍵字參數調用和參數的位置沒有關係
>>> def default(a,b,c): ... print(a,b,c) ... >>> default(c=1,b=2,a=3) 3 2 1
字符串中的關鍵字參數調用
>>> '{name} is {age}'.format(name='likuan',age=25) 'likuan is 25'
6.函數的作用域
遵循LGB原則(先從L找再從G找最後在B中找)
L local 函數體 和函數參數
G gloabal 模塊內
B python內置的參數
7.值傳遞和地址傳遞
(1)基本數據類型在函數傳遞時,直接傳遞值,在函數內修改值不影響函數體外的值
(2)引用類型在函數傳遞時,傳遞數據的地址,在函數內修改會影響函數體外的值(在內存中的地址一致所以函數體內的值修改都會修改)
地址傳遞
>>> a = [] >>> def test(p1): ... p1.append(1) ... >>> test(a) >>> a [1]
8.函數的可變參數
(1)列表可變參數(是一個元組)
>>> def test(a,b,*arg): ... print(a,b,arg) ... >>> test(1,2,3,4) 1 2 (3, 4)
(2)關鍵字可變參數(字典需要用賦值的方式)
>>> def test(a,b,*arg,**args): ... print(a,b,arg,args) ... >>> test(1,2,3,4,c=1) 1 2 (3, 4) {'c': 1}
(3)混用(列表可變參數,關鍵字可變參數,默認參數,常規參數)
>>> def test(a,b,*arg,c=1,**args): ... print(a,b,c,arg,args) ... >>> test(1,2,4,5,c=6,d=7) 1 2 6 (4, 5) {'d': 7}
9.函數也是變量
函數放在列表中
>>> def test1(): print(test1) ... >>> def test2(): print(test2) ... >>> def test3(): print(test3) ... >>> test = [test1,test2,test3] >>> for i in test: ... print(i) ... <function test1 at 0x7f4bce855598> <function test2 at 0x7f4bce855488> <function test3 at 0x7f4bce855510>
函數在字典中
>>> fd = {'test1':test1,'test2':test2,'test3':test3} >>> fd['test1'] <function test1 at 0x7f4bce855598>
在函數中定義函數
>>> def ceshi(): ... def ceshi2(): ... print(1) ... ceshi2() ... >>> ceshi() 1
10.匿名函數 lambda
lamdba 函數只有一個函數體
>>> add = lambda a,b,c: a + b + c >>> add(1,2,3) 6
11.sort 函數 和 sorted 函數
sort 函數,排序以第一個值排序
>>> l = [(1,2),(2,3),(3,1),(4,5),(2,3)] >>> l.sort() >>> l [(1, 2), (2, 3), (2, 3), (3, 1), (4, 5)]
sort 函數,排序以第二個排序
>>> l.sort(key=lambda x: x[1]) >>> l [(3, 1), (1, 2), (2, 3), (2, 3), (4, 5)]
sort() 函數 和 sorted() 函數的區別:
(1)sort() 函數只能對 list 進行排序, 對原數據進行修改
(2)sorted() 函數對任何可迭代的進行排序,不會對原來的 進行修改,返回一個新的列表
>>> a = [1,2,4,3] >>> a.sort() >> a [1, 2, 3, 4] >>> b = (1,2,6,5) >>> c = sorted(b) >>> c [1, 2, 5, 6] >>> b (1, 2, 6, 5)
小練習 根據 字符串中字母的個數取出top5
>>> chars = { ... 'a' : 10, ... 'b' : 8, ... 'c' : 9, ... 'x' : 9, ... 'y' : 7, ... 'z' : 10, ... 'm' : 4, ... 'n' : 7 ... } >>> sorted(chars.items(),key=lambda x: x[1],reverse=True) [('a', 10), ('z', 10), ('c', 9), ('x', 9), ('b', 8), ('y', 7), ('n', 7), ('m', 4)] >>> sorted(chars.items(),key=lambda x: x[1],reverse=True)[:5] [('a', 10), ('z', 10), ('c', 9), ('x', 9), ('b', 8)]
12.包
模塊(py腳本)
導入方式
import 文件名
導入包(文件夾裏必須要有__init__.py文件)
import 文件夾
mod.py 文件內容
#!/usr/bin/python
name = 'likuan'
#!/usr/bin/python
import mod
print(mod.name)
另一種帶入方式
from mod import name
print(name)
導入函數與現在函數中有函數名衝突可以用as去起一個別名
from mod import name as name_test
name = 'lizhi'
print(name,name_test)
以腳本運行的時候 __name__ == main
以模塊導入的方式 __name__ == 腳本名
name = 'likuan'
if __name__ == '__main__':
print(name)
elif __name__ == 'mod':
print('test')
13,json字符串
格式化json
json.dumps()
還原之前的 json 字符串
json.loads()