Chinaunix首页 | 论坛 | 博客
  • 博客访问: 517974
  • 博文数量: 260
  • 博客积分: 10435
  • 博客等级: 上将
  • 技术积分: 1939
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-24 14:50
文章分类

全部博文(260)

文章存档

2011年(22)

2010年(209)

2009年(29)

我的朋友

分类: Python/Ruby

2011-05-29 19:22:51

在Python中缺少其它語言中的switch陳述句,以下結合字典物件與lambda模擬switch的示範:
score = int(input('請輸入分數:'))
level = score // 10
{
10 : lambda: print('Perfect'),
9 : lambda: print('A'),
8 : lambda: print('B'),
7 : lambda: print('C'),
6 : lambda: print('D')
}.get(level, lambda: print('E'))()

在上例中,字典物件中的值的部份是lambda所建立的函式物件,你使用get()方法指定鍵,如果有符合的鍵,就傳回對應的函式物件並執行,否則就傳回get()第二個引數所指定的函式並執行,這模擬了switch中default的陳述。charles-


在Python中,函式是function的實例,所以你可以自由傳遞,將一個函式中所定義的函式傳回也是常見的應用。例如:
def add(n1):
def func(n2):
return n1 + n2
return func

print(add(1)(2)) # 顯示 3

從一個函式中呼叫另一個函式,這是函式程設中鞣制(Curry)的概念。所謂鞣製,是指將接受多個參數的函式,改為接受單一參數的函式,在函式執行過後傳回一個函式物件再套用剩下的參數,就像是將兩個函式鞣製在一起。



在Python中,確實支援閉包的概念。例如:
>>> def outer():
...     x = 10
...     def inner():
...         print(x)
...     inner()
...     x = 20
...     return inner
...
>>> f = outer()
10
>>> f()
20
>>>


在上例中,inner()確實綁定了區域變數x,在outer()內部呼叫inner()時顯示的是10,而後改變了x為20,由於inner()綁定了x,所以傳回的函式執行時,顯示x的值為20。

不過實際上在應用時,還是得小心一點。例如:
>>> def func():
...     x = 10
...     def getX():
...         return x
...     def setX(n):
...         x = n
...     return (getX, setX)
...
>>> getX, setX = func()
>>> getX()
10
>>> setX(20)
>>> getX()
10
>>>


在上例中,func()中的setX()宣告的x,其實是setX()中的區域變數x,其覆蓋了外部func()的x,所以你的n是指定給區域變數x。

實際上,在Python中變數可以在四個範圍中建立或尋找。內建(Builtin)、全域(Global)、外包函式(Endosing function)、函式(Local functon)。一個例子如下:
  • demo.py
x = 10   # 全域

def outer():
y = 20 # 在 outer() 函式範圍

def inner():
z = 30 # 在 inner() 函式範圍
print(x) # 內建範圍 print,全域的 x
  print(y) # 內建範圍 print,外包 outer() 函式的 y

prnt(x) # 內建範圍 print,全域的 x

取用名稱時(而不是指定),一定是從最內層往外尋找。Python中所謂全域,實際上是以模組檔案為界,以上例來說,x實際上是demo模組範圍中的變數,不會橫跨所有模組範圍。


取用名稱時(而不是指定),一定是從最內層往外尋找。Python中所謂全域,實際上是以模組檔案為界,以上例來說,x實際上是demo模組範圍中的變數,不會橫跨所有模組範圍。

阅读(1423) | 评论(0) | 转发(0) |
0

上一篇:vi more

下一篇:没有了

给主人留下些什么吧!~~