
正文
python迭代函数例题 python迭代求解
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
求解一道Python编程题
斐波那契数列自第三个数开始,每个数均为之前两个数的和。
至少有两种方法来实现它。
最常见的利用迭代的方法,其核心思路是
fib(n) = fib(n-1) + fib(n-2)
而在n2时直接,没有n-2,因此直接返回1:
def fib(num): return 1 if n2 else fib(num-1) + fib(num-2)
这是一种很简单的实现。在阶梯数不大时,它很好用。当阶梯数很大时,因为二次手迭代,会比较慢。因此,可以在计算中保存中间值(1至n-1的阶梯数)来减少计算量:
这种方式在计算阶梯数10000时就可以保持不错的性能。如果需要多次计算该数列,则可以利用对象来保持这个中间值列表,下列代码中,Fibonaci实例只计算未曾计算的阶梯数,在重复调用时它更具优势:
class Fibonaci(object):
....history=[1, 1]
....def cacl(self, num):
........while len(self.history) = num:
............self.history.append(self.history[-1] + self.history[-2])
........return self.history[num]
if __name__ == '__main__':
....fib = Fibonaci()
....print(fib.calc(100))
....print(fib.calc(32))
....print(fib.calc(10000))
相关问答
Q1: Python用迭代(yield)和递归解决八皇后问题
国际象棋的皇后行走具有最高的灵活性,可以横、竖、斜共八个方向无限步行走。你需要将国际象棋8个皇后放在棋盘上,条件是任何一个皇后都不能威胁其python迭代函数例题他皇后,即任何两个皇后都不能吃掉对方。
分析:在棋盘的第一行尝试为第一个皇后选择一个位置,再在第二行尝试为第二个皇后选择一个位置,依次类推。在发现无法为一个皇后选择合适的位置后,回溯到前一个皇后,并尝试为它选择另一个位置。当八个皇后都放在棋盘上时即得到一种解。
用元组(其他序列也可以)表示可能的解(或一部分),例如(1,3,5)表示当前共摆放了三个皇后,第一个皇后在1行1列,第二个皇后在2行3列,第三个皇后在3行5列。
当前状态state,下一个皇后在下一行的next_x位置,根据皇后的行走规则,如果已有的皇后可以吃掉下一个皇后,则表示有冲突,否则没有。
函数conflict定义:接受用状态元组表示的既有皇后的位置,并确定下一个皇后的位置是否会导致冲突。
参数 next_x 表示下一个皇后的水平位置(x 坐标,即列),而 next_y 为下一个皇后的垂直位置(y 坐标,即行)。这个函数对既有的每个皇后执行简单的检查:如果下一个皇后与当前皇后的 x 坐标相同或在同一条对角线上,将发生冲突,因此返回True python迭代函数例题;如果没有发生冲突,就返回False 。
abs(state[i] - next_x) in (0, next_y - i) 表示两个皇后的水平距离为0或等于垂直距离时为真、否则为假。
Q2: Python中的“迭代”详解
迭代器模式:一种惰性获取数据项python迭代函数例题的方式python迭代函数例题,即按需一次获取一个数据项。
所有序列都是可以迭代python迭代函数例题的。我们接下来要实现一个 Sentence(句子)类python迭代函数例题,我们向这个类的构造方法传入包含一些文本的字符串,然后可以逐个单词迭代。
接下来测试 Sentence 实例能否迭代
序列可以迭代的原因:
iter()
解释器需要迭代对象 x 时,会自动调用iter(x)。
内置的 iter 函数有以下作用:
由于序列都实现了 __getitem__ 方法,所以都可以迭代。
可迭代对象:使用内置函数 iter() 可以获取迭代器的对象。
与迭代器的关系:Python 从可迭代对象中获取迭代器。
下面用for循环迭代一个字符串,这里字符串 'abc' 是可迭代的对象,用 for 循环迭代时是有生成器,只是 Python 隐藏了。
如果没有 for 语句,使用 while 循环模拟,要写成下面这样:
Python 内部会处理 for 循环和其他迭代上下文(如列表推导,元组拆包等等)中的 StopIteration 异常。
标准的迭代器接口有两个方法:
__next__ :返回下一个可用的元素,如果没有元素了,抛出 StopIteration 异常。
__iter__ :返回 self,以便在需要使用可迭代对象的地方使用迭代器,如 for 循环中。
迭代器:实现了无参数的 __next__ 方法,返回序列中的下一个元素;如果没有元素了,那么抛出 StopIteration 异常。Python 中的迭代器还实现了 __iter__ 方法,因此迭代器也可以迭代。
接下来使用迭代器模式实现 Sentence 类:
注意, 不要 在 Sentence 类中实现 __next__ 方法,让 Sentence 实例既是可迭代对象,也是自身的迭代器。
为了“支持多种遍历”,必须能从同一个可迭代的实例中获取多个独立的迭代器,而且各个迭代器要能维护自身的内部状态,因此这一模式正确的实现方式是,每次调用 iter(my_iterable) 都新建一个独立的迭代器。
所以总结下来就是:
实现相同功能,但却符合 Python 习惯的方式是,用生成器函数代替 SentenceIteror 类。
只要 Python 函数的定义体中有 yield 关键字,该函数就是生成器函数。调用生成器函数,就会返回一个生成器对象。
生成器函数会创建一个生成器对象,包装生成器函数的定义体,把生成器传给 next(...) 函数时,生成器函数会向前,执行函数定义体中的下一个 yield 语句,返回产出的值,并在函数定义体的当前位置暂停,。最终,函数的定义体返回时,外层的生成器对象会抛出 StopIteration 异常,这一点与迭代器协议一致。
如今这一版 Sentence 类相较之前简短多了,但是还不够慵懒。 惰性 ,是如今人们认为最好的特质。惰性实现是指尽可能延后生成值,这样做能节省内存,或许还能避免做无用的处理。
目前实现的几版 Sentence 类都不具有惰性,因为 __init__ 方法急迫的构建好了文本中的单词列表,然后将其绑定到 self.words 属性上。这样就得处理整个文本,列表使用的内存量可能与文本本身一样多(或许更多,取决于文本中有多少非单词字符)。
re.finditer 函数是 re.findall 函数的惰性版本,返回的是一个生成器,按需生成 re.MatchObject 实例。我们可以使用这个函数来让 Sentence 类变得懒惰,即只在需要时才生成下一个单词。
标准库提供了很多生成器函数,有用于逐行迭代纯文本文件的对象,还有出色的 os.walk 函数等等。本节专注于通用的函数:参数为任意的可迭代对象,返回值是生成器,用于生成选中的、计算出的和重新排列的元素。
第一组是用于 过滤 的生成器函数:从输入的可迭代对象中产出元素的子集,而且不修改元素本身。这种函数大多数都接受一个断言参数(predicate),这个参数是个 布尔函数 ,有一个参数,会应用到输入中的每个元素上,用于判断元素是否包含在输出中。
以下为这些函数的演示:
第二组是用于映射的生成器函数:在输入的单个/多个可迭代对象中的各个元素上做计算,然后返回结果。
以下为这些函数的用法:
第三组是用于合并的生成器函数,这些函数都可以从输入的多个可迭代对象中产出元素。
以下为演示:
第四组是从一个元素中产出多个值,扩展输入的可迭代对象。
以下为演示:
第五组生成器函数用于产出输入的可迭代对象中的全部元素,不过会以某种方式重新排列。
下面的函数都接受一个可迭代的对象,然后返回单个结果,这种函数叫“归约函数”,“合拢函数”或“累加函数”,其实,这些内置函数都可以用 functools.reduce 函数实现,但内置更加方便,而且还有一些优点。
参考教程:
《流畅的python》 P330 - 363
Q3: Python3 - 排列组合的迭代
遍历一个序列中元素的所有可能的排列或组合。
itertools 模块提供了三个函数来解决这类问题。 其中一个是 itertools.permutations() , 它接受一个序列并产生一个元组序列,每个元组由序列中所有元素的一个可能排列组成,即通过打乱序列中元素排列顺序生成一个元组,比如python迭代函数例题:
如果想得到指定长度的所有排列,你可以传递一个可选的长度参数。比如:
使用 itertools.combinations() 可得到输入序列中元素的所有的组合。比如:
对于 combinations() 来讲,元素的顺序已经不重要了,即组合 ('a', 'b') 与 ('b', 'a') 其实是一样的,最终只会输出其中一个。
在计算组合的时候,一旦元素被选取就会从候选中剔除掉(比如如果元素’a’已经被选取了,那么接下来就不会再考虑它了)。 而函数 itertools.combinations_with_replacement() 允许同一个元素被选择多次,比如:
尽管手动可以实现排列组合算法,但是这样做比较麻烦,当遇到有些复杂的迭代问题时,可以先去看看itertools模块是否能实现,很有可能会在里面找到解决方案python迭代函数例题!
python迭代函数例题的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于python迭代求解、python迭代函数例题的信息别忘了在本站进行查找喔。






