【问题标题】:define a function using an iterative function使用迭代函数定义函数
【发布时间】:2013-10-31 10:59:10
【问题描述】:

我有一些函数 FUN(a, b): 在两个字符上。我想定义另一个函数 foo(s),这样

foo(s):
    FUN(a[0],a[1])
    FUN(a[2],a[3])
    FUN(a[4],a[5])
    ...

对于 s 中的所有字符(假设 s 是偶数长度)。我的想法是我们基本上需要运行 FUN(a,b) (len(s)%2) 次,但我不确定如何以这种方式迭代函数,同时还要确保 FUN 具有正确的输入。有什么想法吗?

【问题讨论】:

  • for i in range(0, len(s), 2): FUN(s[i], s[i+1])for i in range(0, len(s), 2): FUN(*s[i:i+2])
  • @falsetru 我更喜欢我的回答:P
  • @GamesBrainiac 好吧,您的答案可读性较差,并且在性能方面可能比 falsetru 的评论更差。我绝对不会喜欢它...

标签: python function iteration


【解决方案1】:

这很容易用zip

def fun(a, b):
    print a, b


def foo(s):
    for x, y in zip(s[::2], s[1::2]):
        fun(x, y)


foo("12345678")

输出:

1 2
3 4
5 6
7 8

使用生成器的更有效方法是使用izip(相同的输出):

from itertools import izip


def fun(a, b):
    print a, b


def foo(s):
    for x, y in izip(s[::2], s[1::2]):
        fun(x, y)


foo("12345678")

【讨论】:

  • 感谢这与我想要的相似。将所有输出连接成一个字符串最简单的方法是什么?
  • @GBN89 如果此答案对您有用,请点赞并接受答案。
【解决方案2】:

当一个问题被标记为iteration 时,必须有一种方法可以使用iter。 :-)

values = range(10)

def do_work(x, y):
    print('{}_{}'.format(x, y))

it = iter(values)
try:
    while it:
        do_work(next(it), next(it))
except StopIteration:
    pass

来自 l4mpi 的好建议:

it = iter(values)
for value in it:
    do_work(value, next(it))

【讨论】:

  • 呃,对程序流使用异常是个坏主意。他们应该捕捉错误。至少,反正我已经习惯了。
  • 这可以重写为 for 循环:for x in it: do_work(x, next(it)) - 避免捕获 StopIteration,但仅适用于具有偶数个元素的输入。 @GamesBrainiac 你不知道for 循环是如何在 python 中实现的,是吗?它使用相同的 StopIteration 异常来找出它迭代的序列何时用完值 - 这是必需的,因为 python by design 中的迭代器只有 next 方法,但没有 @ 987654329@ 或is_empty 方法。
  • 我知道必须有一个简单的解决方案。 :-( 使用 Python 多年,仍在学习。:-)
猜你喜欢
  • 1970-01-01
  • 2023-04-09
  • 2018-05-13
  • 1970-01-01
  • 2019-04-15
  • 2019-02-20
  • 1970-01-01
  • 2020-10-01
  • 1970-01-01
相关资源
最近更新 更多