今天笔试遇到的一道题,请问还有其他做法吗?

2016-01-20 20:53:56 +08:00
 qdzzyb

请实现函数 new_counter ,使得调用结果如下:

c1 = new_counter(10)
c2 = new_counter(20)
print c1(), c2(), c1(), c2()
outputs :
11 21 12 22

我的想法:

def new_counter(n):

    class Counter(object):
        def __init__(self, num):
            self.num =num

        def __call__(self):
            self.num += 1
            return self.num

    return Counter(n)

结束以后才想出来的,觉得比较麻烦,还有更简洁的方法吗?
谢谢~

4982 次点击
所在节点    Python
30 条回复
jellyshen
2016-01-20 21:14:04 +08:00
```python
def new_count(n):
print(n)
def f():
print(n+1)
return f
```
函数 f 里不能影响变量 n 的状态,还请大神们指教。
deangl
2016-01-20 21:15:37 +08:00
def new_counter(init_val):
_counter = [init_val, ]
def add1():
_counter[0] += 1
return _counter[0]
return add1
zhangchioulin
2016-01-20 21:16:43 +08:00
LZ 是面试的什么?
deangl
2016-01-20 21:16:50 +08:00
```
def new_counter(init_val):
_counter = [init_val, ]
def add1():
_counter[0] += 1
return _counter[0]
return add1
```
deangl
2016-01-20 21:18:39 +08:00
啊,求教怎么发贴带格式,怎么删自己的贴?
jellyshen
2016-01-20 21:18:50 +08:00
问个问题,怎么在 V2EX 的回复里面排版代码?

```python
def new_count(n):
print(n)
def f():
print(n+1)
return f
```
zhangchioulin
2016-01-20 21:19:58 +08:00
@deangl 这个...哥你用的什么语言?为什么都 return 了还能执行?
lxy42
2016-01-20 21:21:05 +08:00
不会是搜狐吧
lxy42
2016-01-20 21:21:26 +08:00
用闭包就行了
deangl
2016-01-20 21:23:12 +08:00
@zhangchioulin 我打不出缩进。。。。
这个意思:

def new_counter(init_val):
...._counter = [init_val, ]
....def add1():
........_counter[0] += 1
........return _counter[0]
....return add1
tkpc
2016-01-20 21:35:58 +08:00
new_counter = lambda n : (x+n for x in xrange(sys.maxint)).next
fghzpqm
2016-01-20 22:07:02 +08:00
import itertools
new_counter = itertools.count
swirling
2016-01-20 22:18:09 +08:00
high order function ,这时候你就和面试官聊聊函数式什么就好了。
dapang1221
2016-01-20 22:26:59 +08:00
python 生成器?用 yield 传出来就好了,不要用 return ……但是调用起来又得用 next 了。。。
def counter(n):
....while True:
........n=(yield n+1)
snailsir
2016-01-20 22:34:11 +08:00
闭包
mengzhuo
2016-01-20 22:34:27 +08:00
我来上个优雅点的吧:
def new_counter(i):
....def c():
........c.var += 1
........return c.var
....c.var = i
....return c


c10 = new_counter(10)
c20 = new_counter(20)

print c10(), c20(), c10(), c20() #11, 21, 12, 22
airqj
2016-01-20 23:26:35 +08:00
记不清实现了
应该是闭包
ChiangDi
2016-01-21 01:52:03 +08:00
这个是最简单的闭包应用啊, Python 不熟,随便用 js 码个
function new_count(n) {
return function() {
n ++
console.log(n)
}

还有比这个更简单的实现吗?
elvba
2016-01-21 02:40:25 +08:00
function new_counter($t) { return function () use (&$t) { return $t += 1; }; }
SpicyCat
2016-01-21 09:05:40 +08:00
@ChiangDi @airqj @dapang1221 @deangl @elvba @fghzpqm @jellyshen @lxy42 @mengzhuo @qdzzyb 楼上所有,友情提示,贴代码可以用 github 的 gist ,参考此贴: https://www.v2ex.com/t/130567

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/252207

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX