日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python (六)函数

發布時間:2023/12/1 python 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python (六)函数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、函數的形成

  需求1:來測試一下‘hello word’ 的長度

# 在沒有函數的時候,我們可以用for循環實現 s1 = "hello world" length = 0 for i in s1:length = length+1 print(length)

  再增加一個需求2:再來測試一下另外一個字符串的長度:‘hello china’

  然后需求1和需求2的代碼就變成下邊這樣

s1 = "hello world" length = 0 for i in s1:length = length+1 print(length)s2 = "hello china" length = 0 for i in s2:length = length+1 print(length)

上邊的代碼確實可以實現需求,但是有缺點:代碼重復,可讀性差。 我們將上面的代碼稱之為面向過程的方式

為了解決這種問題就出現了函數

函數是組織好的,可重復使用的,用來實現單一,或相關聯功能的代碼段。

二、函數的格式和調用

?

def mylen(): # 定義一個函數mylen
'''計算s1的長度'''s1
= "hello world"length = 0for i in s1:length = length+1print(length) mylen() # 函數調用

?

def 關鍵詞開頭,空格之后接函數名稱和圓括號(),最后還有一個":"。def 是固定的,不能變,他就是定義函數的關鍵字。空格 為了將def關鍵字和函數名分開,必須空(四聲)函數名:函數名只能包含字符串、下劃線和數字且不能以數字開頭。雖然函數名可以隨便起,但我們給函數起名字還是要盡量簡短,并能表達函數功能括號:是必須加的注釋:每一個函數都應該對功能和參數進行相應的說明,應該寫在函數下面第一行。以增強代碼的可讀性。調用:就是 函數名()

二、函數的返回值

1、什么是函數的返回值

在使用內置函數len()方法時,得到的結果會賦值給一個變量,然后得到結果:

str_len = len('hello,world') print(str_len)

但是自己寫的這個函數mylen(),并不會得到這樣的結果,如何讓他和len函數一樣,有返回值呢?

那就是在函數的最后加上一個return,return 后面寫你需要的返回值就可以了。

#函數定義 def mylen():"""計算s1的長度"""s1 = "hello world"length = 0for i in s1:length = length+1return length#函數調用 str_len = mylen() print('str_len : %s'%str_len)return返回值

2、return關鍵字的作用

  1、函數中遇到return終止函數。
  2、返回值 返回給了函數的調用者

3、return返回值的的三種情況

第一種:沒有return? ?返回None

def mylen():s1 = "hello world"length = 0for i in s1:length = length+1 str_len = mylen() print(str_len) # 因為沒有返回值,此時的str_len為None

?

第二種:return后沒有返回值?

    return的其他用法,就是一旦遇到return,結束整個函數

def ret_demo():print(111) # 此行代碼執行return # 直接種植代碼print(222) # 此行不會輸出 ret = ret_demo() print(ret) # 因為return后沒有任何值, 所以此處結果為None

?

第三種:單個值? 返回單個值

#函數定義 def mylen():"""計算s1的長度"""s1 = "hello world"length = 0for i in s1:length = length+1return length#函數調用 str_len = mylen() print(str_len) # 返回這個字符串的長度,結果為11

?

第四種:多個值??返回一個由這多個值組成的元組

    可以返回任意多個、任意數據類型的值

def ret_demo1():'''返回多個值'''return 1, 2, 3, 4def ret_demo2():'''返回多個任意類型的值'''return 1, ['a', 'b'], 3, 4print(ret_demo1()) # 結果為(1, 2, 3, 4) print(ret_demo2()) # 結果為(1, ['a', 'b'], 3, 4)

?

def ret_demo2():return 1, ['a', 'b'], 3, 4#返回多個值,用一個變量接收 ret2 = ret_demo2() print(ret2) # (1, ['a', 'b'], 3, 4)#返回多個值,用多個變量接收 a, b, c, d = ret_demo2() print(a, b, c, d) # 1 ['a', 'b'] 3 4#用多個值接收返回值:返回幾個值,就用幾個變量接收 a, b, c, d = ret_demo2() print(a, b, c, d) # 1 ['a', 'b'] 3 4

?

四、函數的參數

  1.什么是參數  

  之前我們使用len函數的時候得是length = len("hello world"),但是這個函數,只能計算一個“hello world”的長度,換一個字符串就需要寫多個函數,很不方便

def mylen(s1): # 定一個一個參數s1"""計算s1的長度"""length = 0for i in s1:length = length+1return lengthstr_len = mylen("hello world") # 將hello world傳遞給s1 print(str_len)

我們告訴mylen函數要計算的字符串是誰,這個過程就叫做?傳遞參數,簡稱傳參我們調用函數時傳遞的這個“hello world”和定義函數時的s1就是參數

?  2.認識實參和形參  

我們調用函數時傳遞的這個“hello world”被稱為實際參數因為這個是實際的要交給函數的內容,簡稱實參

定義函數時的s1,只是一個變量的名字,被稱為形式參數,因為在定義函數的時候它只是一個形式,表示這里有一個參數,簡稱形參。 

  3.參數的傳遞  

第一種:可以傳遞字符串,前邊已經舉例

第二種:可以傳遞列表

l1 = [1, 2, 34, 55, 66] def my_len(s): # 形參s接收到實參l1的值c = 0for i in s:c += 1return cret = my_len(l1) # 將字符串l1傳遞給函數 print(ret)

?

  4.按照實參角度傳參  

第一種:位置參數:從前至后 一一對應

def mymax(x, y): # x接收10,y接收20the_max = x if x > y else yreturn the_maxma = mymax(10, 20) print(ma)

第二種:關鍵字傳參:不用按照順序,按變量名一一對應

def mymax(x, y): # 此時x = 20,y = 10the_max = x if x > y else yreturn the_maxma = mymax(y = 10, x = 20) print(ma)

第三種:混合傳參:位置參數一定在前面

def mymax(x, y): # 此時x = 10,y = 20the_max = x if x > y else yreturn the_maxma = mymax(10, y = 20) # 位置參數一定要在關鍵字參數前面 print(ma)

?小總結:位置參數必須在關鍵字參數的前面

     對于一個形參只能賦值一次

  5.按照形參角度傳參  

第一種:位置傳參: 按照順序,一一對應,未給形參傳值會報錯

def func1(a, b, c, d):print(a, b, c) func1(1, 2, 3) # 結果會報錯, 沒有給位置參數d傳值

?

第二種:默認傳參: 如果不傳,則默認使用默認參數,傳參則覆蓋。?

    為什么要有默認參數:將變化比較小的值設置成默認參數

def func2(name, age, sex=''): # sex接收傳來的參數''print(name, age, sex)func2('大錘', 18, sex='') # 結果:大錘 18

利用默認傳參可以設置默認輸入

def wfile(name, age, sex=''): # 定義函數wfile,形參name、age,默認參數sex"""建立登記表函數,由于班中大部分學生都是男生,所以設置默認參數sex的默認值為''""" with open('登記表', encoding='utf-8', mode='a') as f1:f1.write('{}|{}|{}\n'.format(name, age, sex)) # 格式化輸入三個參數while 1: # 可以循環輸入name = input('姓名(輸入Q/q退出):')if name.upper() == 'Q':break # 如果輸入Q/q退出程序age = input('年齡:')if name.startswith(''): # 設置一個規則,如果姓名以''開頭wfile(name, age) # 函數只執行 name和age。sex無需執行,直接記錄默認值''else: # 否則(即:如果姓名不是以''開頭) 就需要輸入sex,并且執行name, age, sexsex = input('性別:')wfile(name, age, sex) # 這一步會把輸入的sex覆蓋默認值的值

默認參數是一個可變的數據類型

def func(a, l=[]): # 定義形參a,實參l=[]l.append(a) # 將a的值添加至列表l中print(l)func('aaa') # ['aaa'], func('bbb') # ['aaa', 'bbb'] func('ccc') # ['aaa', 'bbb', 'ccc']

  6.萬能參數  

  萬能參數也叫動態參數:*args? ?**kwargs? 也叫不定長傳參

  需要傳給函數的參數很多,不定個數,那這種情況下,你就用*args,**kwargs接收

?

l1 = [1, 2, 3] l2 = [11, 22, 33] l3 = (55, 66, 77) dic = {'name': 'alex'} dic1 = {'age': '12'}def func4(*args, **kwargs):print(args)print(kwargs)func4(*l1, *l2, *l3, **dic, **dic1) # (1, 2, 3, 11, 22, 33, 55, 66, 77) {'name': 'alex', 'age': '12'} func4(l1, l2, l3, dic, dic1) # ([1, 2, 3], [11, 22, 33], (55, 66, 77), {'name': 'alex'}, {'age': '12'}) {}

?

?

注意1:args是元祖形式,接收除去鍵值對以外的所有參數,kwargs接收的只是鍵值對的參數,并保存在字典中。

如果未接收到傳來的參數,那么就會輸出空值

def func4(*args, **kwargs):print(args) # ([1, 2, 3], [11, 22, 33], (55, 66, 77))print(kwargs) # {},**kwargs未接收到鍵值對的參數,所有輸出的結果是一個空的字典func4([1, 2, 3], [11, 22, 33], (55, 66, 77))

?

  7.位置參數、默認參數、萬能參數混合使用  

# 默認參數未被更改 def func5(a, b, *args, sex=''):print(a) # 1 位置參數a接收第一個參數1print(b) # 2 位置參數b接收第二個參數2print(sex) # 男 默認參數未被更改,還是默認的值print(args) # (4, 5, 6, 7, 8, 9) 剩下的全部使用*args接收func5(1, 2, 4, 5, 6, 7, 8, 9)# 默認參數已被更改 def func5(a, b, *args, sex='', **kwargs):print(a) # 1 位置參數a接收第一個參數1print(b) # 2 位置參數b接收第二個參數2print(sex) # 女 默認參數已被更改,所以輸出新值print(args) # (4, 5, 6, 7, 8, 9) 剩下的全部使用*args接收func5(1, 2, 4, 5, 6, 7, 8, 9, sex='')

?

五、名稱空間

  先認識一下什么叫名稱空間  

def func1():m = 1print(m) func1()print(m) # 報錯 NameError: name 'm' is not defined

上面為什么會報錯呢?

  函數被調用的時候,python解釋器會再開辟一塊內存來儲存這個函數里面的內容,函數中的變量會儲存在新開辟出來的內存中,函數中的變量只能在函數內部使用

  當函數執行完畢,這塊內存中的所有內容也會被清空。

?

存放名字與值的關系的空間起了一個名字-------名稱空間

?

python中的名稱空間:  

  全局名稱空間:代碼在運行開始,創建的存儲“變量名與值的關系”的空間
  臨時(局部)名稱空間:在函數的運行中開辟的臨時的空間
  內置名稱空間: len print 等內置函數等等。

加載順序: 內置名稱空間? ---> 全局名稱空間 ---> 函數執行時:臨時(局部)名稱空間

取值順序:? ?函數執行時:臨時(局部)名稱空間 ---> 全局名稱空間 ----> 內置名稱空間
     (?取值順序滿足就近原則 )

?

?六、函數的作用域和嵌套

  1、什么是作用域  

?

  作用域:??作用域就是作用范圍

?

  全局作用域:包含內置名稱空間、全局名稱空間,在整個文件的任意位置都能被引用、全局有效

?

  局部作用域:局部名稱空間,只能在局部范圍生效

?

?

a = 1 print(a) # 1 def func1():a = 99print(a) # 99 滿足就近原則,取最近的值 func1()

?

  2、作用域中會遇到的坑  

  局部只能引用全局的變量但是不能修改,修改就會報錯

a = 1 print(a) # 1 def func1():a += 1print(a) # 會報錯,不能引用全部變量a func1()

  global? ? ?
    可以修改全局變量
    在局部空間可以聲明一個全局變量

    可變數據類型(list,dict,set)可以直接引用不用通過global。

# 修改全局變量
a = 1 print(a) # 1 def func1():global a # 引用全局變量a,此時a的值為1a += 1print(a) # 2 func1() # 聲明全局變量
def func():
global a # 沒有全局變量的時候也可以使用,在函數內部直接聲明了全局變量 a = 1 func() print(a) # 1 # 引用可變的數據類型,無需global
li = [1, 2, 3] dic = {'a': 'b'} def change(): li.append('a') # 無需global,可以直接引用 dic['q'] = 'g' # # 無需global,可以直接引用 print(dic) # {'a': 'b', 'q': 'g'} print(li) # [1, 2, 3, 'a'] change() print(li) # [1, 2, 3, 'a'] print(dic) # {'a': 'b', 'q': 'g'}

?

  nonlocal  

?   ? 不能操作全局變量

    在局部作用域中,對父級作用域(或者更外層作用域非全局作用域)的變量進行引用和修改,且引用的哪層,從那層及以下此變量全部發生改變。

    子名稱空間只能引用父名稱空間的變量,但是不能修改,如果修改就會報錯

?

#只引用未修改 def func1(): # 父名稱空間a = 1def inner(): # 子名稱空間print(a) # 結果:1 函數執行的第二步輸出print(a) # 結果:1 函數執行的第一步輸出 inner()print(a) # 結果:1 函數執行的第三步輸出 func1()# 未使用nonlocal,引用并且修改,會報錯 def func1(): # 父名稱空間a = 1def inner(): # 子名稱空間a += 1 # 修改變量aprint(a) # 會報錯:local variable 'a' referenced before assignment inner()print(a) func1()# 使用nonlocal后既可引用,也可修改 def func1(): # 父名稱空間a = 1def inner(): # 子名稱空間nonlocal a # 引用父名稱空間的變量aa += 1 # 修改變量a,這層及以下此變量全部發生改變print(a) # 結果:2 函數執行的第二步輸出print(a) # 結果:1 函數執行的第一步輸出 inner()print(a) # 結果:2 函數執行的第三步輸出 func1()# 不能修改全局變量 b = 3 def func1(): # 父名稱空間a = 1def inner(): # 子名稱空間nonlocal a # 引用父名稱空間的變量aa += 1 # 修改變量a,這層及以下此變量全部發生改變b += 1 # 會報錯,不能修改全局變量:local variable 'a' referenced before assignmentprint(a) # 結果:2 函數執行的第二步輸出print(a) # 結果:1 函數執行的第一步輸出 inner()print(a) # 結果:2 函數執行的第三步輸出 func1()

?

?  3.函數的嵌套  

# 第一種函數嵌套 def func1(): # 第二步執行func1print(111) # 第三步,輸出111def func2(): # 第六步執行func2print(222) # 第七步 輸出222print(333) # 第四步,讀到這一行,輸出333 func2() # 第五步執行func2print(444) # 第八步,輸出444 func1() # 函數執行時先讀這一行# 第二種函數嵌套 def func1(): # 第七步 執行func1print(111) # 第八步 輸出111def func2(): # 第四步 執行func2print(222) # 第五步 輸出222func1() # 第六步 讀到這一行def func3(): # 第二步 執行func3func2() # 第三步,讀到這一行print(333) # 第九步,輸出333,因為其余內嵌的函數已經全部執行完了 func3() # 函數執行時先讀到這一行

?

  4.函數的作用域  

  小范圍作用域可以使用大范圍的變量,但是反之不行,他是單向的。

# 大范圍的作用域不能使用小范圍的變量 # 第一種 大作用域f1中未定義變量,試著使用小作用域f2中的a的值,會報錯 def f1():def f2():a = 2print(a)f2()print(a) # 第二步,f1中未定義變量a,無法取f2中的值,所以會報錯 name 'a' is not defined f1()# 修改上邊的報錯:在大作用域f1中定義a def f1():a = 1def f2():a = 2print(a) # 先輸出a的值為2 f2()print(a) # 再輸出a的值為1,此a是f1中的a,與f2中的a無關,只是名字相同 f1()# 第二種 小范圍的作用域能使用大范圍的變量 def f1():a = 1def f2():print(a) # 取的是f1中的a的值1 f2() f1()

?

七、函數名的運用

  1、直接輸出函數名(輸出函數的內存地址)  

def func1():print(111)print(func1) # 輸出函數func1的內存地址 <function func1 at 0x10fdf31e0> f1 = func1 # 將func1的函數名傳給f1 f2 = f1 # 將f1的值賦值給f2 print(f2) # 輸出f2,既輸出f1,即輸出func1的內存地址,<function func1 at 0x10fdf31e0> f2() # ,執行f2,即執行f1,即執行func1,結果為 111

?

  2、函數名可以作為函數的參數  

def func1(): # 第五步 執行此函數print(111) # 第六步 輸出111def func2(x): # 第二步 x接收傳來的值func1print(x) # 第三步 輸出func1的內存地址x() # 第四步 執行x函數,即執行func1 func2(func1) # 第一步,代碼讀到這一行,將func1傳給x

?

  3、函數名可以作為函數的返回值  

# 當作函數的返回值 # 第一種 def f1(): # 第四步 執行f1函數print(111) # 第五步 輸出111def func1(argv): # 第二步 argv 接收到函數名f1argv() # 第三步 執行argv(),即執行f1(),第五步執行完的結果為111return argv # 第六步 將argv的函數名返回給func1 f = func1(f1) # 第一步 將函數名f1傳給argv,第六步執行完,func1(f1) = argv f() # 第七步 f()本質上就是argv(),執行argv()# 從第三步得知,執行argv()即執行f1,最后輸出結果為111# 第二種 def func1(): # 第五步,執行func1print(111) # 第六步 輸出111def func2(x): # 第二步 執行func2,x接收到函數名func1, x = func1return x # 第三步 將x返回給函數的調用者func2,即將函數名func1返回給函數func2 ret = func2(func1) # 第一步 執行等號后的func2(func1),將函數名func1傳給x# 并將函數func2的值傳給ret# 第三步執行完,此時func2(func1)的值為func1,這個等式可以寫成ret = func1 ret() # 第四步 執行ret(),其實就是執行func1()

?

  4、函數名可以作為容器類數據類型的參數  

# 函數名作為列表中的元素 # 第一種 直接調用 def func1(): # 第三步 執行此函數print(111) # 第四步 輸出111def func2():print(222)def func3():print(333)li = [func1, func2, func3] # 第一步,先讀到這行,函數名作為列表的元素 li[0]() # 第二步 li的0號元素是func1,li[0]()本質上就是func1()# 第二種 循環調用 def func1():print(111)def func2():print(222)def func3():print(333)li = [func1, func2, func3] # 第一步,先讀到這行,函數名作為列表的元素for i in li: # 循環執行三個函數 i()# 函數名作為字典中鍵的值 # 第一種 直接調用 def f1():print('111')def f2(): # 第三步,代碼讀到這行,執行此函數print('222') # 第四步輸出222def f3():print('333')dic = {'x': f1, 'y': f2, 'z': f3} # 第一步 讀到這行,函數作為了字典中鍵的值 dic['y']() # 第二步 dic中'y'鍵的值是f2,dic['y']()本質上就是f2()# 第二種循環輸出 def func1():print(111)def func2():print(222)def func3():print(333)def func4():print(444)dic = { # 第一步先讀到這行1: func1, # 輸入哪個數字,就執行哪個數字對應的函數2: func2,3: func3,4: func4, } while 1: # 第二步 讀到這行choice = int(input('請輸入數字:')) # 第三步將輸入的數字轉化成int類型dic[choice]() # 第四步 dic[choice]()本質上就是執行輸入的數字對應的 鍵的值 對應的函數

?

八、閉包

  1、什么是閉包  

  1、閉包是嵌套在函數中的
  2、閉包是內層函數對外層函數的變量(非全局變量)的引用(改變)
  3、閉包需要將其作為一個對象返回,而且必須逐層返回直至最外層函數的返回值

?

  2、閉包的格式  

# 閉包的基本格式 def func():name = '大錘'def inner():print(name) # 引用外部函數func的變量namereturn innerf = func() f()# 閉包舉例 # 第一個 這步是閉包 def func1():'''此函數滿足前閉包定義的前兩個條件,但還不是閉包因為沒有返回值return'''name = '太白'def func2():print(name)# 第二個 這也不是閉包 ame = 'alex' def wrapper():def inner():print(name) # 調用的是全部變量,非外層函數變量return inner# 第三個 這是閉包 def wrapper():name = '太白'def inner():print(name)return inner# 第四個 這個也是閉包 def wrapper(name):def inner():print(name)return inner n1 = 'wusir' wrapper(n1)

?

  3、 怎么樣判斷是不是閉包  

# 輸出的__closure__有cell元素 :是閉包函數 def func():name = '大錘'def inner():print(name)print(inner.__closure__)return innerf = func() f()# 輸出的__closure__為None :不是閉包函數 name = '大錘' def func2():def inner():print(name)print(inner.__closure__)return innerf2 = func2() f2()

?

  4、閉包的作用  

# 非閉包函數 隨著函數的結束臨時空間關閉 def func1(s1):n = 1n += s1print(n)func1(5) # 6 func1(5) # 6 func1(5) # 6# 閉包函數 def wrapper(s1):n = 1def inner():nonlocal nn += s1print(n)return innerret = wrapper(5) ret() # 6 ret() # 11 ret() # 16

小總結:

  閉包的機制:python遇到閉包,產生一個空間,這個空間不會隨著函數的結束而消失。

?

  5、閉包的嵌套  

def wrapper(): # 第二步 執行此韓式money = 100 # 第三步def func(): # 第四步執行此函數name = '大錘'def inner():print(name, money)return innerreturn func # 第五步 將函數名func返回給上層函數wrapper f = wrapper() # 第一步 代碼讀到這,第五步執行完,f=func i = f() # 第六步 執行f(),即執行func(),執行完func()后將函數名func再次傳給i,此時i=func i() # 第七步 i()即func(),執行func,輸出結果: 大錘 100

?

轉載于:https://www.cnblogs.com/caoyinshan/p/10086580.html

總結

以上是生活随笔為你收集整理的python (六)函数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。