《Lua程式設計 第二版 》第5,6章筆記

2021-06-08 19:45:44 字數 3090 閱讀 6153

第5章表示式

lua的函式一般將引數放到函式名後的圓括號中。特殊情況:乙個函式只有乙個引數,並且該引數是乙個字串或table構造式,那麼圓括號可有可無,例如:

print 「hello world」        --     print(「helloworld」)

dofile 『a.lua』 -- dofile(『a.lua』)

print [[a melti-line -- print([[amulti-line

message]] message]])

f -- f()

type {} -- type({})

lua提供了冒號操作符。表示式o.foo(o,x)的另一種寫法是o:foo(x),冒號操作符使呼叫o.foo時將o隱含地作為函式的第乙個引數。

lua程式中既可以使用lua編寫的函式,也可以呼叫用c語言寫的函式。

lua函式遵循「若實參多餘形參,則捨棄多餘的實行;若實參不足,則將多餘的形參初始化為nil」的規則。假設有如下函式:

function f(a, b) return a or b end

則以下幾種呼叫,實參與形參的對應關係為:

f(3)                -- a = 3,  b =nil

f(3, 4)            -- a = 3,  b = 4

f(3, 4, 5)        -- a = 3,  b = 4  (5被丟棄)

5.1多重返回值(multiple result)

lua具有一項非常與眾不同的特徵,允許函式返回多個結果。例如,用於在字串中定位乙個模式的函式string.find。若該函式在字串中找到了指定的模式,將返回匹配的起始字元和結尾字元的索引,這樣就需要使用多重賦值語句來接受函式的返回值。

使用者自定義的函式同樣可以返回多個結果,例如:

function maximum(a)

local mi = 1 --最大值的索引

local m = a[mi] -- 最大值

for i, var in ipairs(a) do

ifvar > m then

mi= i; m = var

end --end if

end -- endfor

return m, mi

end -- endfunction

print(maximum())

乙個函式具有多個返回值時,例如:functionfoo() return 「a」, 「b」 end

在語句print(foo().. 「x」)中,列印結果為ax。因為函式foo出現在乙個表示式中,lua將其返回值數量調整為1,用於參與字串連線操作。

table構造式可以完整的接受乙個函式返回的所有值:t = 即 t =

但若乙個table接受多個函式時,只有最後乙個函式的返回值全部接受,其餘的每個函式只接受乙個值:t=   -- t =

lua的預定義函式unpack,它接受乙個陣列作為引數,並從下標1開始返回該陣列內的所有元素。原函式由c語言實現的,也可以通過遞迴實現一樣的效果:

function unpack (t, i)

i= i or 1

ift[i] then

returnt[i], unpack(t, i+1)

endend

a =

print(unpack(a))

5.2變長引數(variable number of arguments)

lua中的函式可以接受不同數量的實參。用三個點(…)表示該函式可以接受不同數量的實參。乙個函式要訪問它的變長引數時,仍需用到3個點(…)。例如:

function add (...)

local s = 0

fori, v in ipairs do

s= s + v

endreturns

end

print(add(3, 4, 10, 25, 12)) -- 54

5.3具名實參(named arguments)

函式os.rename用於檔名改名,如:os.rename( )。

第6章深入函式

在lua中,函式是一種「第一類值(first-class value)」,這表示在lua中函式與其他傳統型別的值(例如字串和數字)具有相同的權利。函式可以儲存到變數中或table中,可以作為實參傳遞給其他函式,還可以作為其他函式的返回值。

6.1closure(閉合函式)

在lua中,乙個函式可寫在另乙個函式裡,內部函式可以訪問外部函式中的區域性變數。

6.2非全域性的函式(non-global function)

將乙個函式儲存到乙個區域性變數中,即得到了乙個「區域性函式(local function)」。

6.3正確的尾呼叫(proper tail call)

所謂的「尾呼叫(tail call)」就是一種類似於goto的函式呼叫。當乙個函式呼叫是另乙個函式的最後乙個動作時,該呼叫才算是一條「尾呼叫」,例如:

function  f(x)  return  g(x)  end

中的g函式就是一條「尾呼叫」。在這種情況中,程式不需要返回那個「尾呼叫」所在的函式。所以在「尾呼叫」之後,程式也不需要儲存任何關於該函式的棧(stack)資訊了。當g返回時,執行控制權可以直接返回到f函式。使得在進行「尾呼叫」時不耗費任何棧空間。將這種現象稱為「尾呼叫消除」。

python核心程式設計第二版第二章學習筆記

一.python直譯器 在所有的互動示例中,你會看到python 的 主提示符 和次提示符 主提示符是直譯器告訴你它在 等待你 輸入下乙個語句 次提示符告訴你直譯器正在 等待你輸入當前語句的其它部分。核心筆記 在互動式直譯器中顯示變數的值 通常當你想看變數內容時,你會在 中使用print 語句輸出。...

LUA學習筆記(第5 6章)

x a or b 如果a為真則x a 如果a為假則x b print a b 任何非nil型別都會被連線為字串,輸出 多重返回值 local s,e string.find hello world wo print s e 自定義函式 function getmax arr local maxval...

《PHP程式設計(第二版)》樣章發布

昨天編輯來信告訴我 php程式設計 第二版 英文名programming php 的樣章已經在csdn上發布了,有興趣的朋友可以看看。樣章我是挑選的,本來想多選些章節的,但被告知通常只選四章呵呵。首先第一章是php創始人ra us lerdorf對php的介紹。陣列和字串是php最核心和強大的功能,...