您好!此筆記的文本和代碼以網盤形式分享於文末!
因個人能力有限,錯誤處歡迎大家交流和指正!基礎部分內容簡單,但多且零散!
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()) |
願有更多的朋友,在網頁筆記結構上分享更邏輯和易讀的形式:
鏈接:暫無
提取碼:暫無