Python學習筆記6

2021-10-02 21:06:37 字數 4680 閱讀 9733

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...