進擊のpython
舉的例子也都是帶有print的函數定義
但是有個問題就出現了:我不想打印這個函數處理后的參數
我想拿到這個參數然后做后續的事情
我應該怎么辦呢?
-
返回值
這就需要一個關鍵字 return 來解決這個問題了
return:回來 回去 返回 帶回……(又學個英語單詞)
那我們就能看出來,這個詞的意思就是從函數當中把參數拿回來的意思
對吧!
那么原先的函數我就可以這么寫:
def func(x, y, z): a = "輸入的三個數為%s,%s,%s" % (x, y, z) return a func(1, 2, 3) print(func(1, 2, 3))
第一個執行了func()函數,返回了a,但是沒有打印出來
第二個執行了func()函數,返回了a,打印了出來
這樣 我想打印出來就打印出來,我不想打印就不打印,就很舒服!
很簡單的一個小知識點
但是卻有一個小陷阱!
函數執行過程中,遇到了 return 那就不執行接下來的語句,直接退出函數。
(想想還有哪個像這個??循環里的break)
給你舉個例子:
def func(x, y, z):
a = "輸入的三個數為%s,%s,%s" % (x, y, z)
return a
print("這句話執行不出來")
print(func(1, 2, 3))
明白了吧!
當然 有的時候也不一定要指定返回值,那我們看看這東西會返回什么
def func(x, y, z):
a = "輸入的三個數為%s,%s,%s" % (x, y, z)
# return a
# print("這句話執行不出來")
print(func(1, 2, 3))
OK,那我們大概可以知道了,沒有指定返回值,那就返回None!
那要是有多個返回值呢?
def func(x, y, z):
a = x * 2
b = y * 3
c = z * 4
return a, b, c
print(func(1, 2, 3))
(2, 6, 12)
┗|`O′|┛ 嗷~~!
當有多個返回值的時候,返回的是個元組!
但是奧!切記!!return是終止函數!!但是不會終止循環!
lst = [1, 2, 3, 4, 5]
def func():
for i in lst:
print(i)
return
print(func())
1
None
懂我意思吧!湊弟弟!
-
作用域
說作用域那可就是相當抽象了
作用域就相當於你能夠行使權利的區域
你的員工卡高級,你就能去公司更高層的辦公室
你的員工卡低級,那你就只能在你的一畝三分地呆着了
員工卡就類比成程序中的變量
那怎么設置程序中“員工卡”的等級呢?
這就是函數的作用域了
話不多說,直接上代碼:(1.1)
name = "jevious" def change(): print(name) change()
我在 change() 函數中調用這個name,能調用嗎?
執行了!可以!會輸出這個 jevious
那我可以修改這個變量嗎?
name = "jevious" def change(): name = "poddy" print(name) change()
打印的是什么呢?(自己試試 打印的是 poddy)
那,這真的將name變量修改了嗎?(1.2)
name = "jevious" def change(): name = "poddy" print(name) change() print(name)
兩個結果,說明name沒有被修改
那是怎么回事呢?
不賣關子,直接 tell you
在函數外面的name 是全局變量
在函數內部的name 是局部變量
當函數在自己一片區域里發現到自己需要的變量就用自己的變量(1.2)
當函數在自己區域里沒有找到想要的變量就去外面找需要的變量(1.1)
所以說,在局部不能修改全局的變量
看到的修改其實只是在局部新建了變量
怎么驗證呢?python給我們提供了兩種方法
locals 和 globals
name = "jevious"
def change():
name = "poddy"
age = "22"
print(locals()) # 局部變量
print(globals()) # 全局變量
change()
print(name)
下面的你不用都看,因為全局的比較多,但是你會在里面找到'name': 'jevious'
但是你卻找不到age的任何信息
-
總結
知識點就有點雜,慢慢積累被:
1、在函數中定義的是局部變量,在程序一開始定義的是全局變量
2、全局變量的作用域是整個程序,局部變量作用域是定義該變量的函數
3、變量的查找順序是局部變量>全局變量
4、當全局變量與局部變量同名時,在函數里,局部起作用;在其他地方,全局起作用
5、在函數里不能直接修改全局變量
就有艮的,就想在函數中定義全局變量
global
用這個關鍵字,先聲明,再賦值,這樣就是全局的了
# name = "jevious" def change(): global name name = "poddy" age = "22" print(locals()) # 局部變量 print(globals()) # 全局變量 change() print(name)
自己打印結果,我可不想像你這么艮,而且也不建議這么使用
那你丫非得這么艮?那你開心就好!
其實不光是以上的需求,有的時候,我們還需要在函數里調用全局變量然后進行修改
很明顯,根據上面的理論,直接修改是不行的
所以我們可以聲明一個全局變量,再進行修改
a = 10
def func():
global a
a += 1
print(a)
return a
func()
這樣就對a進行了修改
但是不一定需求這么簡單,我現在想調用函數里面的參數可以直接調用
那我要是想修改呢?
那就需要一個局部聲名了 nonlocal
但是注意奧,這個方法只能在局部里找參數,如果局部沒有就報錯
根本不往全局看
a = 10
def func():
nonlocal a
a += 1
print(a)
return a
func()
SyntaxError: no binding for nonlocal 'a' found
a = 10
def foo():
a = 20
def func():
nonlocal a
a += 1
print(a)
return a
foo()
因為在上一個局部里有a這個參數,找到了,就不會報錯!