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平方單位的...
我們不一樣
前輩們因自身實際的種種因素的影響而產生的認知,並不一定適用於我們自身。你可能從來不會去想乙個問題 你的觀點,來自 其實,它們絕大部分來自網路,它們或多或少地蠶食了你的判斷力。未來的路要怎麼走,沒有對與錯。有的,只是每乙個選擇所需要承擔的責任。我不想面臨,後之視今亦猶今之視昔的悲哀。我希望,未來回首,...
我們不一樣
這麼多年的兄弟 有誰比我更了解你 太多太多不容易 磨平了歲月和脾氣 時間轉眼就過去 這身後不散的筵席 只因為我們還在 心留在原地 張開手 需要多大的勇氣 這片天 你我一起撐起 更努力 只為了我們想要的明天 好好的 這份情好好珍惜 我們不一樣 每個人都有不同的境遇 我們在這裡 在這裡等你 我們不一樣 ...