zoukankan      html  css  js  c++  java
  • 迭代器

    迭代器

    闭包

      在一个嵌套函数的内部函数使用外部(非全局)的变量就是闭包

    def wrapper():
        a = 10
        def inner():
            print(a)
            print(inner.__closure__) # 不是None 就是闭包
        inner()
    wrapper()

    可迭代对象(Iteration)

      可以直接作用于for循环的对象统称为可迭代对象。可以通过查看是否能用__iter__方法来判断是否是可迭代对象。

    迭代器(Iterator)

      可以被next函数调用并不断返回下一个值的对象称为迭代器。可以使用__iter__和__next__方法的就是迭代器。

    创建迭代器的方法

    # 方法一
    可迭代对象.__iter__
    
    # 方法二
    iter(可迭代对象)

    迭代器的特性

    惰性机制、不能从下向上走、一次性的(用完就没了)

    for循环的本质

    for i in range(1,6)
        print(i)

    完全等价于

    it = iter([1, 2, 3, 4, 5])
    while 1:
        try:
            # 获得下一个值
            x = next(it)
        except StopIteration:
            # 遇到StopIteration就退出循环
            break

    递归

      如果一个函数在内部调用自己本身,且有明确结束条件,这个函数就是递归函数

    # 计算n!
    def func():
        if n == 1:
            return 1
        return n * func(n - 1)
    # 斐波那切数列
    def func(n)
        assert n>= 0, "n > 0"
        if n <= 0:
            return n
        return func(n - 1) + func(n - 2)
    
    for i in range(1, 20):
        print(func(i), end = " ")

      递归函数的优点是定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。

      使用递归函数需要注意防止栈溢出。在计算机中,函数调用是通过栈这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。

  • 相关阅读:
    Log4Net使用指南
    构建Asp.Net2.0 GridView复合多层表头的几种方法
    javaScript中如何定义类
    是不是silverlight 2 的bug
    领悟 JavaScript 中的面向对象
    web拖动Drag&amp;Drop原理
    一个不错的js验证框架
    MySQL中文参考手册
    高效实现数据仓库的七个步骤
    什么是ARP?如何防范ARP欺骗?
  • 原文地址:https://www.cnblogs.com/yaoyanxin007/p/10559548.html
Copyright © 2011-2022 走看看