您好!此筆記的文本和代碼以網盤形式分享于文末!
因個人能力有限,錯誤處歡迎大家交流和指正!基礎部分内容簡單,但多且零散!
python 函數功能和特性 | ||
1、定義與建立 | ||
定義:函數是一段組織好的,可重複使用的,用來實作某些功能的代碼段 | ||
概念 | 形式 | 栗子 |
基本形式 | def 函數名(參數1,參數2): 代碼塊 | # 函數的定義 def my_lens(): """計算字元串的長度""" s1 = 'hello function' length = 0 for i in s1: length = length + 1 print(length) return # 函數調用 my_lens() |
函數名 | 隻能包含字元串、下劃線和數字且不能以數字開頭, 一般用_下劃線間隔單詞 | |
注釋 | 對功能和參數進行說明,寫在函數下面第一行。 """ 這個函數實作了什麼功能 參數1: 參數2: :return: 是字元串或者清單的長度 """ | |
調用 | 函數名(實參1, 實參2) | |
2、函數的傳回值:return | ||
用法 | 栗子 | 結果 |
傳回一個值 | def ret_demo1(): """傳回一個值""" return "a" ret1 = ret_demo1() print(ret1) | a <class 'str'> |
傳回多個值 1個變量接收 | def ret_demo2(): """傳回多個值,一個變量接收""" return 1, 2, 3, 4 def ret_demo3(): """傳回多個任意類型的值""" return 1, 'aB7', [1, '5v'], {'a': '王', } ret2 = ret_demo2() ret3 = ret_demo3() print(ret2, type(ret2)) print(ret3, type(ret3)) | (1, 2, 3, 4) <class 'tuple'> (1, 'aB7', [1, '5v'], {'a': '王'}) <class 'tuple'> |
傳回多個值 多個變量接收 有幾個傳回值 就用幾個變量接收 | def ret_demo3(): """傳回多個任意類型的值""" return 1, 'aB7', [1, '5v'], {'a': '王', } a, b, c, d = ret_demo3() print(a, type(a), '\n', b, type(b), '\n', c, type(c), '\n', d, type(d)) | 1 <class 'int'> aB7 <class 'str'> [1, '5v'] <class 'list'> {'a': '王'} <class 'dict'> |
3、函數的參數:順序:位置參數,*args、預設參數、**kwargs | ||
用法 | 栗子 | 結果 |
沒有參數 | 不再舉例 | |
一個參數 | def my_lens(s1): """計算字元串的長度""" length = 0 for i in s1: length = length + 1 return length # 函數調用 s2 = 'hello function' ret1 = my_lens(s2) print("字元串長度:%s" % ret1) | 字元串長度:14 |
多個參數 位置參數 按位置 按關鍵字 混合傳參 | def my_max(x, y): """比較最大值""" the_max = x if x > y else y return the_max m1 = my_max(7, 8) m2 = my_max(y=9, x=10) m3 = my_max(15, y=12) print(m1, m2, m3) | 8 10 15 |
預設參數 | def stu_info(name, sex = "Female"): """ 列印獅群的資訊,由于獅群母獅較多 是以預設性别值為‘Female’ """ print(name, sex) stu_info("simba", 'Male') stu_info("Nala") | simba Male Nala Female |
預設參數 參數陷阱1 | # 預設參數是一個可變資料類型 def fun_trap1(k, l=[]): l.append(k) print(l) fun_trap1('Lion') fun_trap1('Nala') | ['Lion'] ['Lion', 'Nala'] |
預設參數 參數陷阱2 | # 預設參數是一個可變資料類型 def fun_trap2(k, l={}): """ """ l[k] = 'v' print(l) fun_trap2(1) fun_trap2(3) fun_trap2(4) | {1: 'v'} {1: 'v', 3: 'v'} {1: 'v', 3: 'v', 4: 'v'} |
動态參數 *args | # *args 接收的是按照位置傳參的值,組織成一個元組 def my_sum(*args): """ for實作求和函數 參數*args:動态參數 return :傳回和,數值 """ print(args, type(args)) the_sum = 0 for i in args: the_sum += i return the_sum sum1 = my_sum(1, 3, 5, 7) print(sum1) | (1, 3, 5, 7) <class 'tuple'> 16 |
動态參數 **kwargs args必須在kwargs之前 | # **kwargs 接受的是按照關鍵字傳參的值,組織成一個字典 def stu_info(**kwargs): print(kwargs, type(kwargs)) print(kwargs['name'], kwargs['sex']) stu_info(name='simba', sex='Male', name2='Nala', sex2="Female") | {'name': 'simba', 'sex': 'Male', 'name2': 'Nala', 'sex2': 'Female'} <class 'dict'> simba Male |
動态參數 不一樣的傳參 | def func_different1(*args): print(args) def func_different2(**kwargs): print(kwargs) l1 = [1, 'a', '王', 'B7'] d2 = {"a": 1, 'b': 2, } func_different1(1, 'a', '王', 'B7') func_different1(*l1) func_different2(a=1, b=2) func_different2(**d2) | (1, 'a', '王', 'B7') (1, 'a', '王', 'B7') {'a': 1, 'b': 2} {'a': 1, 'b': 2} |
4、命名空間和作用域 | ||
命名空間的本質:存放名字與值的綁定關系 | ||
三種命名空間的加載順序:内置命名空間(程式運作前加載)->全局命名空間(程式運作中:從上到下加載)->局部命名空間(程式運作中:調用時才加載) | ||
作用域:作用範圍,按照生效範圍可以分為全局作用域和局部作用域; | ||
全局作用域:包含内置名稱空間、全局名稱空間,在整個檔案的任意位置都能被引用、全局有效 | ||
局部作用域:局部名稱空間,隻能在局部範圍内生效 | ||
用法 | 栗子 | 結果 |
globals和locals方法 | c = 55 def func(): a = 12 b = 20 print(locals()) print(globals()) func() | {'b': 20, 'a': 12} {'__name__': '__main__',…………,“c”:55,……} |
global關鍵字 | a = 10 def func(): global a a = 20 print(a) func() print(a) | 10 20 |
5、 函數的嵌套 和作用域鍊 | ||
函數嵌套調用 | def my_max2(x, y): the_max = x if x > y else y return the_max def my_max4(a, b, c, d): ret1 = my_max2(a, b) ret2 = my_max2(ret1, c) ret3 = my_max2(ret2, d) return ret3 print(my_max4(10, 6, 77, 8)) | 77 |
函數嵌套 | def func1(): print('01 in func1') def func2(): def func3(): print('003 in func3') print('004 in func2') func3() print('005 in func1') func2() func1() | 01 in func1 005 in func1 004 in func2 003 in func3 |
函數作用域鍊 | def f1(): a = 1 def f2(): a = 2 print('in f2 a:', a) f2() print('in f2 a:', a) f1() | in f2 a: 2 in f2 a: 1 |
nonlocal關鍵字 | # 函數的外部必須已聲明變量 # nonlocal之前,函數内部不能出現同名變量 def f1(): a = 1 def f2(): nonlocal a a = 2 f2() print('in f1 a:', a) f1() | in f1 a: 2 |
6、函數名的本質和閉包:閉包會一直存在記憶體當中,不會因為函數執行結束而被釋放 | ||
pythonTutor 程式設計線上視圖:http://pythontutor.com/visualize.html#mode=edit | ||
用法 | 栗子 | 結果 |
函數名的本質 函數名被引用 | # 函數名的本質就是函數的記憶體位址 def f1(): print('Hello') f = f1 print(f) | <function f1 at 0x00000202C6112E18> |
函數名作為 容器類型的元素 | def f2(): print('This f2()') def f3(): print('This f3()') l1 = [f2, f3] d1 = {'a': f2, 'b': f3, } # 調用 l1[1]() d1['a']() | This f3() This f2() |
閉包函數的建立 借助函數名本質 | def func(): name = 'simba' def inner(): print(name) return inner f = func() f() | simba |
判斷是否為閉包函數 | # 出的__closure__有cell元素 :是閉包函數 def func(): name = 'simba' def inner(): print(name) print(inner.__closure__) return inner f = func() f() # 輸出的__closure__為None :不是閉包函數 def func2(): def inner(): name = 'Nala' print(name) print(inner.__closure__) return inner f1 = func2() f1() | “閉包”的作用——儲存函數的狀态資訊,使函數的局部變量資訊依然可以儲存下來 (<cell at 0x00000174FC8C76A8: str object at 0x00000174FE51E8B8>,) simba None Nala |
閉包的嵌套 | def wrapper(): age = 8 def func(): name = 'simba' def inner(): print(name, 'age:%d' % age) return inner return func f = wrapper() i = f() i() | simba age:8 |
閉包擷取網頁源碼 | from urllib.request import urlopen def index(url): def get(): return urlopen(url).read() return get # 傳回的是get函數的位址 python = index("http://www.python.org") # 執行get函數《并且将傳回的結果列印出來 print(python()) |
願有更多的朋友,在網頁筆記結構上分享更邏輯和易讀的形式:
連結:暫無
提取碼:暫無