def
discounts
(price, rate)
: final_price = price * rate
old_price =
50print
('修改後old_price1的值:'
, old_price)
return final_price
old_price =
float
(input
('請輸入原價:'))
rate =
float
(input
('請輸入折扣率:'))
new_price = discounts(old_price, rate)
print
('修改後old_price2的值:'
, old_price)
print
('打折後的**是:'
, new_price)
輸出結果:
請輸入原價:100
請輸入折扣率:0.8
修改後old_price1的值: 50
修改後old_price2的值: 100.0
打折後的**是: 80.0
# 會發現old_price1與old_price2的值並不相同,這時因為如果在函式體內試圖修改全域性變數,
# 那麼python就會新建乙個與全域性變數名字相同的區域性變數,也就是在函式體內的old_price是乙個區域性變數,
# 與外邊的全域性變數old_price互不影響,是同時存在的。
# 因為全域性變數與區域性變數存在不同儲存空間,但名字是一模一樣的。
# 因此最好不要試圖在函式中修改全域性變數
但當然如果真的想要在函式內去修改全域性變數,也是可以的。這就要用到global關鍵字了。
例: count = 5
def fun():
count = 10
print(count)
fun()
print(count)
不難發現這時候如果呼叫fun()列印結果是10,但是再單獨列印count的話結果還是5
而加上global關鍵字就不一樣了
count = 5
def fun():
global count
count = 10
print(count)
fun()
print(count)
因此在呼叫fun()之後,兩個列印結果都是10
總之global關鍵字的作用就是告訴python這個變數已經是全域性變數了。
def fun1():
print('fun1()正在被呼叫。。。')
def fun2():
print('fun2()正在被呼叫。。。')
fun2()
fun1()
很明顯結果就是:fun1()正在被呼叫。。。
fun2()正在被呼叫。。。
但需要注意的是,內嵌函式fun2()只能在fun1()內呼叫,在fun1()外呼叫就會報錯
#如果在乙個內部函式裡(對於fun1()和fun2(),fun2()就是fun1()的乙個內部函式)
#對於內部函式在外部作用域(fun2()的外部作用域就是fun1())的變數的引用
#達到這兩點要求的話,就可以說內部函式(也就是fun2()就是乙個閉包)
def fun1(x):
def fun2(y):
return x * y
return fun2
#如果在乙個內部函式裡(對於fun1()和fun2(),fun2()就是fun1()的乙個內部函式)
#對於內部函式在外部作用域(fun2()的外部作用域就是fun1())的變數的引用
#達到這兩點要求的話,就可以說內部函式(也就是fun2()就是乙個閉包)
def fun1(x):
def fun2(y):
return x * y
return fun2
i = fun1(8) #i在這裡其實得到的是乙個函式
print(i)
a = i(5) #i在這裡已經是乙個函式了,所以i()可以得到乙個返回值
print(a) #得出結果為 40
b = fun1(8)(5) #這樣的話就是8就是給x的引數,5就是給y的引數
print(b)
#那麼在閉包中,外部函式的區域性變數對內部函式的區域性變數,在內部函式中,只能對外部函式的區域性變數進行訪問,而不能修改。
def fun3():
x = 5
def fun4():
x *= x
return x
return fun4()
#return fun4 表示輸出fun4這個函式(不執行這個函式)
#return fun4()表示輸出fun4這個函式的執行結果,所以在這裡return fun4()會報錯
#因fun4()的整個外部空間,就是fun3()的內部空間。實際上fun3中的 x 非全域性變數的外部變數。
#當fun4中對x進行修改時,會將x視為fun4的區域性變數,遮蔽掉fun3中對x的定義,所以在fun4中你試圖對乙個沒有定義的東西進行操作,固然會報錯
fun3()
#當然,也有解決的辦法,以往的解決辦法是,只能近接的通過容器的方式存放,因為容器型別不是存放在棧裡邊,所以在fun4中的x不會被遮蔽掉
#所以以下就是改造
def fun3():
x = [5]
def fun4():
x[0] *= x[0]
return x[0]
return fun4()
fun3() #結果就是25
#經過版本的更新,現在可以使用nonlocal關鍵字的方式來進行解決
#所以就如下改造
def fun3():
x = 5
def fun4():
nonlocal x #nonlocal關鍵字 把x強制宣告為不是乙個區域性變數
x *= x
return x
return fun4()
fun3() #結果依然是25
#一般的函式
defds
(x):
return
2* x +
1print
(ds(5)
)#lambda表示式
a =lambda x:
2* x +
1#lambda 後邊的x就相當於函式中的引數(多個引數的話用','分隔就行了) 『:』 後邊的就是返回值
#lambda 事實上構建了乙個函式物件 返回的是乙個函式
print
(a(6))
#因此a()這裡就可以直接呼叫
1.python寫一些執行指令碼時,使用lambda就可以省下定義函式過程,比如說我們只是需要寫乙個簡單的指令碼
來管理伺服器時間,我們就不需要專門定義乙個函式然後再寫呼叫,使用lambda就可以使得**更加精簡。
2.對於一些比較抽象並且整個程式執行下來只需要呼叫一兩次的函式,有時候給函式起個名字也是比較頭疼的問題
,使用lambda就不用考慮命名的問題。
3.簡化**的可讀性,由於普通的函式閱讀經常要跳到開頭def定義部分,使用lambda可以省去這樣的步驟。
filter(function or none, iterable) 返回的是乙個物件
a = filter(none, [1, 0, false, true])
b = list(filter(none, [1, 0, false, true]))
print(a) #print(b) #[1, true] 由此可知filter()把0,false已經過濾掉了
#返回奇數
defodd
(x):
return x %
2temp =
range(10
)#實際上返回了range(0, 10) 到10截止
show =
filter
(odd, temp)
#過濾掉temp裡邊所有的偶數 , 可以理解為
# 其實就是把temp裡面的元素一一傳到odd裡面得出的結果為0就全部過濾掉
final =
list
(show)
print
(final)
# [1, 3, 5, 7, 9]
然後呢就可以結合上邊學的東西,可以這樣一行實現相應的功能
就像這樣:
a = list(filter(lambda x: x % 2, range(10)))
print(a) #[1, 3, 5, 7, 9]
a = list(map(lambda x: x * 2, range(10)))
print(a) #[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
那麼很容易看出python中的map()函式應用於每乙個可迭代的項,返回的是乙個結果list。
map()接受兩個引數,乙個是函式,乙個是序列。
和filter()用法一樣,只不過功能不同了。
Python 學習筆記 6
6.1 字典 字典就是乙個關聯陣列 或者稱為雜湊表 它是通過關鍵字索引的物件的集合。使用大括號 來建立乙個字典。print 字典 dic print dic uu dic username dd dic home print uu print dd dic username pxl dic home...
Python學習筆記 6
python學習筆記 6 1 sequence sequence是一物件,乙個接乙個地儲存多種資料項。python中sequence有幾種不同型別。下面先看兩種sequence基本型別 字串和列表 在字串中訪問單個字元 用for迴圈迭代字串,語法如下 for variable in string s...
python 學習筆記(6)
我們要借助python的 語法,把decorator置於函式的定義處 log def now print 2015 3 25 答案 call now 2015 3 25 偏函式 python的functools模組提供了很多有用的功能,其中乙個就是偏函式 partial function funct...