不一樣的Python(7) 函式

2021-06-03 07:57:50 字數 3900 閱讀 3583

1. 引數是以傳引用的方式;

def fun1(l):

for i in range(len(l)):

l[i] *= 2

def fun2(l):

l = l + l

如果以乙個型別為list的l為引數呼叫fun1,返回時l的內容會發生改變;但同樣以乙個型別為list的l為引數呼叫fun2,返回時l的內容不會發生改變。

2. 函式體內的對某變數的第一次賦值,都會建立乙個新的區域性變數;

x = 100

def func():

x = 50

如果接下來呼叫函式func,呼叫結束之後x的值仍然是100。在函式體內x=50是對乙個新建立的區域性變數賦值。如果想在函式體內修改函式體外的x,需要用到global關鍵字:

x = 100

def func():

global x

x = 50

但是,如果只是讀取函式體外的全域性變數的值,不需要用到global關鍵字:

globvar = 0

def set_globvar_to_one():

global globvar # needed to modify global copy of globvar

globvar = 1

def print_globvar():

print globvar # no need for global declaration to read value of globvar

set_globvar_to_one()

print_globvar() # prints 1

更多討論,詳見:

3. 函式可以巢狀

def maker(n):

def maker(x):

return x ** n

return action

f = maker(2)

print f(3)

print f(4)

4. lambda表示式。下面**中的「x=x」是引數的預設值,表示在lambda表示式中的引數x的預設值是func中的x。

def func():

x = 4

action = (lambda n, x=x: x **n)

return action

f = func()

print f(3)

print f(3, 2)

lambda體內只能由乙個表示式,不能有語句(如if、for、while)等。

lambda經常與map, filter, reduce等函式一起使用。比如

counters = [1, 2, 3, 4]

list(map((lambda x: x + 3), counters))

結果為[4, 5, 6, 7]

list(filter((lambda x: x > 0), range(−5, 5)))
結果為[1, 2, 3, 4]

reduce((lambda x, y: x + y), [1, 2, 3, 4])
結果為10

5. 函式也是乙個例項物件,也有屬性(attribute)。

def tester(start):

def nested(label):

print label, nested.state

nested.state += 1

nested.state = start

return nested

6. 函式引數及其呼叫方式:

def f(a, b, c):

print a, b, c

f(c=3, b=2, a=1)

args = (1, 2, 3)

f(*args)

args =

f(**args)

上述**列印的結果是三行1, 2, 3

7. 在定義函式的時候,*和**表示數目可變的引數,分別把引數當成tuple和dictionary

def f(*args):

result = 0

for x in args:

result += x

return result

print f(1, 2, 3, 4)

上述列印出10。

def f(**args):

result = 0

for x in args:

result += args[x]

return result

print f(a=1, b=2, c=3, d=4)

上述**列印出10。

8. yield函式生成器

def buildsquare(n):

for x in range(n):

yield x ** 2

l = [x for x in buildsquare(5)]

執行上述**,l中包括[0, 1, 4, 9, 16]

generators are used only once. 比如下面的**中:

squarednumbers = buildsquares(5)

[x for x in squarenumbers] # [0, 1, 4, 9, 16]

[x for x in squarenumbers] #

如果想再次使用squarenumbers,必須再次呼叫squarenumbers = buildsquares(5)

下列網頁討論為什麼c#中需要yield,可供參考:

9. 函式的預設值可能會變化

def func(l = ):

print l

func()

func()

func()

上述**中,三次呼叫func列印的結構互不相同,分寫是[1]、[1, 1]和[1, 1, 1]。

更多資料,可參考和

10. 函式的decorator:

# the decorator to make it bold

def makebold(fn):

# the new function the decorator returns

# insertion of some code before and after

return "" + fn() + ""

# the decorator to make it italic

def makeitalic(fn):

# the new function the decorator returns

# insertion of some code before and after

return "" + fn() + ""

@makebold

@makeitalic

def say():

return "hello"

print say()

#outputs:hello

上述**和下面的**等價

def say():

return "hello"

say = makebold(makeitalic(say))

print say()

#outputs:hello

詳細討論,可參考

不一樣又不一樣的 木板接水

空地上豎立著n個從左到右排列的木板,它們可以把水擋住,但溢位最邊上木板的水將會流到空地上。已知木板間距都是單位1,現給定每個木板的高度,請求出總共能接住的水量?說明一點,這裡只考慮間距 寬度 和高度,不考慮第三個維度,因此水量是平方單位。木板高度分別是2,1,3,那麼我們可以接住2 2 4平方單位的...

我們不一樣

前輩們因自身實際的種種因素的影響而產生的認知,並不一定適用於我們自身。你可能從來不會去想乙個問題 你的觀點,來自 其實,它們絕大部分來自網路,它們或多或少地蠶食了你的判斷力。未來的路要怎麼走,沒有對與錯。有的,只是每乙個選擇所需要承擔的責任。我不想面臨,後之視今亦猶今之視昔的悲哀。我希望,未來回首,...

我們不一樣

這麼多年的兄弟 有誰比我更了解你 太多太多不容易 磨平了歲月和脾氣 時間轉眼就過去 這身後不散的筵席 只因為我們還在 心留在原地 張開手 需要多大的勇氣 這片天 你我一起撐起 更努力 只為了我們想要的明天 好好的 這份情好好珍惜 我們不一樣 每個人都有不同的境遇 我們在這裡 在這裡等你 我們不一樣 ...