python可变参数的特点_Lua异于python的一些特性(一)

1 函数定义中的变量默认为全局变量

与python不同,要想让函数定义中出现的变量为局部变量,需要声明为local。

2 可变参数函数中的一些语法糖

```Lua

function average(...)

result = 0

local arg={...}

for i,v in ipairs(arg) do

result = result + v

end

print("总共传入 " .. #arg .. " 个数")

return result/#arg

end

print("平均值为",average(10,5,3,4,5,6))

```

以上代码执行结果为:

总共传入 6 个数

平均值为 5.5

以上:

1. Lua将函数的参数放在一个叫arg的表中,#arg 表示传入参数的个数;

2. ipair函数可以将arg分解开来,每个元素都是{键,值};

3. `...`可以作为变量一样使用,加上`{...}`就成为表。

如果不使用#arg变量,用普通的写法,就需要写成如下:

```Lua

function average(...)

result = 0

local arg={...}

local s=0

for i,v in ipairs(arg) do

result = result + v

s=i

end

print("总共传入 " .. s .. " 个数")

return result/s

end

print("平均值为",average(10,5,3,4,5,6))

```

其中,s用来接收键,最后一个键就是arg中的元素个数(正好Lua的下标是从1开始的)。

3 比较强调泛型for的作用

```lua

for xx in fun(t)

do

...

...

end

```

上面这个函数“fun”是一个迭代器,在Lua语言中,通常使用“pair”和“ipair”这两个函数,函数的参数通常是一个列表“{XXX}”,例如实例:

```Lua

function fun(table)

for i,v in pairs(table)

do

print('key:'..i..'~'..'value:'..v)

end

end

t={1,2,3,4,5,'a'}

fun(t)

```

上面这样的案例总感觉不能体现“泛型”本质,泛型本质应该是“泛化的类型”,这种编程范式可以使得类的详细定义向后推至实例化时,从而很好地提高类的复用性。上面的例子肯定时不能体现出这种本质的。但是,如果把这个for结构中的“pair(t)”看作可以替换的整体,就可以把它写作自定义用途的“迭代器”,实例:

```Lua

function iterator(table)

local i=0

return

function()

i=i+1

return table[i]

end

end

for v in iterator({1,2,3,4,5,'a'}) do

print(v)

end

```

回头来看,如果不使用上述范式,而使用原始的编程思想实现,则需要:

```Lua

t={1,2,3,4,5,'a'}

i=1

repeat

print(t[i])

i=i+1

until(i>6)

```

但是,“until”中的6该如何得到呢,如果列表是可变长度的呢?这种结构就不适用了,所以这也许就是泛型for的意义之一吧!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值