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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

if python 判断函数返回值_Python函数的返回值和作用域

發(fā)布時(shí)間:2024/10/8 python 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 if python 判断函数返回值_Python函数的返回值和作用域 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

函數(shù)的返回值和作用域

1、返回值

def guess(x):?? ?if x > 3:?? ??? ?return "> 3"??? else:?? ??? ?return "<= 3"print(guess(10))

1> Python 函數(shù)使用 return 語(yǔ)句返回 "返回值”

2> 所有函數(shù)都有返回值,如果沒(méi)有 return 語(yǔ)句,隱式調(diào)用 return None

3> return 語(yǔ)句并不一定是函數(shù)的語(yǔ)句塊的最后一條語(yǔ)句

4> 一個(gè)函數(shù)可以存在多個(gè) return 語(yǔ)句,但是只有一條可以被執(zhí)行。如果沒(méi)有一條 return 語(yǔ)句被執(zhí)行到,隱式調(diào)用 return None

5> 如果有必要,可以顯示調(diào)用return None,可以簡(jiǎn)寫為return

6> 如果函數(shù)執(zhí)行了 return 語(yǔ)句,函數(shù)就會(huì)返回,當(dāng)前被執(zhí)行的 return 語(yǔ)句之后的其它語(yǔ)句就不會(huì)被執(zhí)行了

7> 返回值的作用: 結(jié)束函數(shù)調(diào)用、返回 "返回值”

2、能一次返回多個(gè)值嘛?

def showvalues(): return 1, 3, 5print(showvalues()) # 返回 (1, 3, 5)

函數(shù)不能同時(shí)返回多個(gè)值

return 1, 3, 5 看似返回多個(gè)值,隱式的被 python 封裝成了一個(gè)元組

x, y, z = showvalues() 使用解構(gòu)提取返回值更為方便

3、函數(shù)作用域**

3.1 作用域

一個(gè)標(biāo)識(shí)符的可見(jiàn)范圍,這就是標(biāo)識(shí)符的作用域,一般常說(shuō)變量的作用域。

x = 20def fn(): x = 100 # x 的作用域:當(dāng)前函數(shù)fn()print(x) # x = 20

注意:每一個(gè)函數(shù)都會(huì)開(kāi)辟一個(gè)作用域。

3.2 作用域分類

全局作用域:

在整個(gè)程序運(yùn)行環(huán)境中都可見(jiàn)

全局作用域中的變量稱為全局變量

局部作用域:

在函數(shù)、類等內(nèi)部可見(jiàn)

局部作用域中的變量稱為局部變量,其使用范圍不超過(guò)其所在局部作用域

# 局部變量def fn1(): x = 1 # 局部作用域,x 為局部變量,使用范圍在 fn1 內(nèi)def fn2(): print(x) # x 能打印嗎?不能print(x) # x 能打印嗎?不能# 全局變量x = 5 # 全局變量,也在函數(shù)外定義def foo(): print(x) # 可見(jiàn)嗎?可以foo()

一般來(lái)講外部作用域變量在函數(shù)內(nèi)部可見(jiàn),可以使用

反過(guò)來(lái),函數(shù)內(nèi)部的局部變量,不能在函數(shù)外部看到

4、函數(shù)嵌套

在一個(gè)函數(shù)中定義另一個(gè)函數(shù)

def outer(): def inner(): print('inner') print('outer') inner()outer()inner() # 不可以

內(nèi)部函數(shù) inner 不能在外部直接使用,會(huì)拋出 NameError 異常,因?yàn)樗诤瘮?shù)外部不可見(jiàn)。

其實(shí),inner 不過(guò)就是一個(gè) 標(biāo)識(shí)符 ,就是一個(gè) 函數(shù) outer 內(nèi)部定義的變量 而已。

5、嵌套函數(shù)的作用域

def outer(): o = 65 # 局部變量、本地 local 變量、臨時(shí)變量 def inner(): o = 97 print('inner', o) print('outer 1 ', o) inner() print('outer 2 ', o)outer() # 1:outer 1 65 2:inner 97 3:outer 2 65

外層變量在內(nèi)部作用域可見(jiàn)。

內(nèi)層作用域中,如果定義了和外層相同的變量,相當(dāng)于在當(dāng)前函數(shù)作用域中重新定義了一個(gè)新的變量,這個(gè)內(nèi)層變量并不能覆蓋掉外部作用域中的變量。

6、一個(gè)賦值語(yǔ)句的問(wèn)題

x = 100def fn(): y = x + 200 print(y)fn()x = 100def fn(): x += 1 # 報(bào)錯(cuò)! 賦值即定義,即 x = x + 1 (局部變量 = 局部變量 + 1)! print(x)fn()x = 100def fn(): print(x) # 報(bào)錯(cuò)!該步執(zhí)行不了! x += 1 # 只要在該作用域內(nèi)賦值定義('=')局部變量,在該作用域內(nèi)的所有該變量都為局部變量! print(x)fn()

能否解決呢?可以,使用 global 語(yǔ)句

x = 100def fn(): global x # 聲明全局變量 print(x) # 100 x += 1 print(x) # 101fn()print(x) # 101

注意:全局變量一般情況不推薦修改,一旦在作用域中使用 global 聲明全局變量,那么相當(dāng)于在對(duì)全局變量賦值、定義。

global 使用原則:

1> 外部作用域變量會(huì)在內(nèi)部作用域可見(jiàn),但也不要在這個(gè)內(nèi)部的局部作用域中直接使用,因?yàn)楹瘮?shù)的目的就是為了封裝,盡量與外界隔離。

2> 如果函數(shù)需要使用外部全局變量,請(qǐng)盡量使用函數(shù)的形參定義,并在調(diào)用傳實(shí)參解決。

3> 一句話:不用 global,學(xué)習(xí)它就是為了深入理解變量作用域。

# 不建議直接傳入全局變量!y = []def foo(): # x 就是標(biāo)識(shí)符,就是變量,就是本地變量 y.append(1)foo()foo()print(y)# 建議使用傳參的方式,在函數(shù)內(nèi)使用全局變量y = []def foo(x): # x 就是標(biāo)識(shí)符,就是變量,就是本地變量 x.append(1)foo(y)foo(y)print(y)

7、閉包**

自由變量:未在本地作用域中定義的變量。例如 定義在內(nèi)層函數(shù)外的外層函數(shù)的作用域中的變量

閉包:就是一個(gè)概念,出現(xiàn)在嵌套函數(shù)中,指的是 內(nèi)層函數(shù)引用到了外層函數(shù)的自由變量 ,就形成了閉包。很多語(yǔ)言都有這個(gè)概念,最熟悉就是 JavaScript。

# python 2 實(shí)現(xiàn)閉包def counter(): c = [0] def inc(): c[0] += 1 # 是賦值即定義嘛?不是!是修改值 return c[0] return inc # 返回標(biāo)識(shí)符,即函數(shù)對(duì)象m = counter()m() # 調(diào)用函數(shù) inc(),但是 c 消亡了嘛?沒(méi)有,內(nèi)層函數(shù)沒(méi)有消亡,c 不消亡(閉包)m()m()print(m())# 不推薦使用 global !def counter(): global c c = 0 def inc(): global c c += 1 # 不是閉包! return c return incm = counter()m()m()m()print(m())# 推薦使用 nonlocal,python 3 實(shí)現(xiàn)閉包def counter(): c = 0 def inc(): nonlocal c # 非當(dāng)前函數(shù)的本地變量,當(dāng)前函數(shù)之外的任意層函數(shù)的變量,絕非 global c += 1 # 是閉包嗎?是! return c return incm = counter()m()m()m()print(m())

nonlocal 語(yǔ)句:將變量標(biāo)記為不在本地作用域定義,而是 在上級(jí)的某一級(jí)局部作用域 中定義,但 不能是全局作用域中

8、默認(rèn)值的作用域

def foo(x=1): x += 1 print(x)foo() # 2foo() # 2def bar(x=[]): # x = [],引用類型 x.append(1) # [1] print(x)bar() # [1]bar() # [1, 1]

為什么上列 bar 函數(shù)第二次調(diào)用打印的是 [1, 1]?

因?yàn)楹瘮?shù)也是對(duì)象,每個(gè)函數(shù)定義被執(zhí)行后,就生成了一個(gè)函數(shù)對(duì)象和函數(shù)名這個(gè)標(biāo)識(shí)符關(guān)聯(lián)。

python 把函數(shù)的默認(rèn)值放在了函數(shù)對(duì)象的屬性中,這個(gè)屬性就伴隨著這個(gè)函數(shù)對(duì)象的整個(gè)生命周期。

# 查看 foo.__defaults__ 屬性,它是個(gè)元組def bar(x=[]): x.append(1) print(x)print(bar.__defaults__)bar() # [1]print(bar.__defaults__)bar() # [1, 1]print(bar.__defaults__)# 執(zhí)行結(jié)果:([],)[1]([1],)[1, 1]([1, 1],) # 元組不變,記錄的是地址,引用類型變化def foo(x, m=123, n='abc'): m=456 n='def' print(x)print(foo.__defaults__) # (123, 'abc')foo('yang')print(foo.__defaults__) # (123, 'abc')def foo(x, m=123, *, n='abc', t=[1,2]): m=456 n='def' t.append(12) #t[:].append(12) # t[:],全新復(fù)制一個(gè)列表,避免引用計(jì)數(shù) print(x, m, n, t)print(foo.__defaults__, foo.__kwdefaults__) #(123,) {'n': 'abc', 't': [1, 2]}foo('yang')print(foo.__defaults__, foo.__kwdefaults__) #(123,) {'n': 'abc', 't': [1, 2, 12]}def x(a=[]): a = a + [5] # 加法的本質(zhì):返回新列表、新地址;賦值即定義print(x.__defaults__) # ([],)x()x()print(x.__defaults__) # ([],)def y(a=[]): a += [5] # += 即 extend => a.extend([5])print(y.__defaults__) # ([],)y()y()print(y.__defaults__) # ([5, 5],)# 列表的 + 和 += 的區(qū)別:# + 表示兩個(gè)列表合并并返回一個(gè)全新的列表。# += 表示,就地修改前一個(gè)列表,在其后追加后一個(gè)列表,就是 extend 方法。# 例:l1 = [1, 2]l2 = [3, 4]l3 = l1 + l2print(id(l1), id(l2), id(l3))l3 += l2 # 就地修改print(id(l3))執(zhí)行結(jié)果:2279905055304 2279905055816 22799063342162279906334216

9、變量名解析原則 LEGB**

Local, 本地作用域 、局部作用域的 local 命名空間,函數(shù)調(diào)用時(shí)創(chuàng)建,調(diào)用結(jié)束消亡。

Enclosing,Python2.2 時(shí)引入了 嵌套函數(shù),實(shí)現(xiàn)了閉包,這個(gè)就是 嵌套函數(shù)的外部函數(shù)的命名空間

Global, 全局作用域 ,即一個(gè)模塊的命名空間。模塊被 import 時(shí)創(chuàng)建, 解釋器退出時(shí)消亡。

Build-in, 內(nèi)置模塊的命名空間 ,生命周期從 python 解釋器啟動(dòng)時(shí)創(chuàng)建到解釋器退出時(shí)消亡。例如 print(open),print 和 open 都是內(nèi)置的變量。

所以一個(gè)名詞的查找順序就是 LEGB

10、函數(shù)的銷毀

定義一個(gè)函數(shù)就是生成一個(gè)函數(shù)對(duì)象,函數(shù)名指向的就是函數(shù)對(duì)象。可以使用del語(yǔ)句刪除函數(shù),使其引用計(jì)數(shù)減 1。可以使用同名標(biāo)識(shí)符覆蓋原有定義,本質(zhì)上也是使其引用計(jì)數(shù)減 1。Python程序結(jié)束時(shí),所有對(duì)象銷毀。函數(shù)也是對(duì)象,也不例外,是否銷毀,還是看引用計(jì)數(shù)是否減為 0。

總結(jié)

以上是生活随笔為你收集整理的if python 判断函数返回值_Python函数的返回值和作用域的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 肉色欧美久久久久久久免费看 | 日本泡妞xxxx免费视频软件 | 美女被出白浆 | 精品欧美黑人一区二区三区 | 久久午夜国产精品 | 欧美精品亚洲 | 欧美亚洲中文精品字幕 | 自拍偷拍日韩精品 | 又黄又色又爽的视频 | 性欧美videos另类艳妇3d | 好吊妞无缓冲视频观看 | 2022av在线| 中文视频一区二区 | 美女精品一区 | 国产婷婷色一区二区在线观看 | 性生生活性生交a级 | 日韩av在线天堂 | 黄色性大片 | 中文一区视频 | 韩国伦理片在线观看 | 四虎永久地址 | 成年人黄色片网站 | 超碰免费在线播放 | 中文字幕日产乱码中 | 手机看片日韩在线 | 性xxxx另类xxⅹ | 在线免费av网 | 不卡av免费 | 日本调教电影 | 天天躁夜夜躁狠狠是什么心态 | 比利时xxxx性hd极品 | 国产精品福利在线观看 | 无码人妻aⅴ一区二区三区 国产高清一区二区三区四区 | 久久婷婷亚洲 | 国产精品天天狠天天看 | 天天干精品 | 精品伦精品一区二区三区视频密桃 | 波多野结衣一区二区三区免费视频 | 观看av在线| 国产精品乱码久久久久久久久 | 手机看片日韩福利 | 日干夜操 | 一级黄色免费网站 | 性折磨bdsm欧美激情另类 | 久久福利影视 | 日韩av电影网| 丁香六月激情综合 | 国产精品无码免费播放 | 国产国产国产 | 中文字幕av一区二区 | 亚洲一区亚洲二区 | 日本激情视频网站 | 国产婷婷一区二区 | 番号动态图 | 国产91av视频 | 欧美女人一区二区 | 五月天色婷婷综合 | 黄色网在线看 | 狠狠gao| 97色在线观看 | 丁香婷婷综合激情五月色 | av动态 | 伊人啪啪网 | 成人日韩视频 | 美脚の诱脚舐め脚视频播放 | 欧美乱淫 | 激情一区 | 日本一区视频 | 国产精品尤物视频 | 成人深夜福利 | 中文字幕免费高清在线观看 | 日韩精品电影一区二区三区 | 亚洲天堂2016| 精品人妻天天爽夜夜爽视频 | 国产91啪 | 国产精品一级无码 | 国产三级国产精品国产专区50 | 欧美脚交 | 国产又大又粗又长 | 亚洲av成人无码一区二区三区在线观看 | 黄色一级生活片 | 不卡av网| 久久无码视频一区 | 国产毛片一区二区 | 国产精品嫩草影院桃色 | 三级视频国产 | 国产欧美一区二 | 蜜臀av88 | 日本成人在线免费观看 | 欧美精品二区三区四区免费看视频 | 成人黄色在线看 | 亚洲国产一区二区三区在线观看 | 免费网站av | 波多野在线播放 | www.成人精品 | 色哟哟一区二区三区四区 | 黄色a级片在线观看 | 四虎在线免费视频 | 能在线观看的av网站 |