闭包函数与迭代器生成器

闭包函数

闭包函数定义

  • 必须是函数内嵌函数
  • 内嵌函数必须引用外函数的变量
  • 外函数返回内嵌函数的函数名
def otter():
    name = 'Gredae'
    def inner():  # 外层函数包了个内层函数
        print(name)  # 内层函数引用了外层函数的变量
    return inner  # 外层函数返回内层函数的函数名
f = otter()  # 用f变量来接收inner函数的地址
f()  # 实际上是调用inner()函数

闭包函数的作用

可以使用函数闭包来实现一个函数的装饰器

函数装饰器的条件

  1. 不能改变原来函数的代码
  2. 为函数添加新的功能
  3. 不能改变函数的调用方式

装饰器的简单使用

计算函数运行的时间:

import time
def deco(func):  # func = index
    """装饰器函数"""
    def inner():
        start = time.time()
        func()  # index
        end = time.time()
        print(end - start)
    return inner
@deco  # 如果在被装饰的函数上方写了语法糖就可以代替下面的 index = deco(index)
def index():
    """被装饰的函数"""
    time.sleep(1)
    print('hello, index')

index = deco(index)  # index = inner 如果上面写了@deco语法糖就可以代替这一行
index()  # 实际上执行的是inner函数

上面的是双层装饰器

三层装饰器饰装饰装饰器

def auth(engine):
    def login(func):
        def inner(*args, **kwargs):  #将可变长参数传递进来
            # 登录功能
            if engine == 'file':
                username = input('usrename:')
                pwd = input('pwd:')
                if username == 'Gredae' and pwd == '123':
                    print('登录成功')
                    res = func(*args, **kwargs)  #传递不定长实参
                    return res
                else:
                    print('登录失败')

            elif engine == 'db':
                print('账号密码来自于数据库,非法请求')

        return inner
    return login

@auth('file')  # 三层装饰可以使用语法糖来传值
def login():
    print('欢迎你!')

login() # inner()

迭代器

更新换代, 重复, 基于上一次的结果推出下一次的结果

迭代:具有__iter__方法

可迭代 不可迭代
字符串、列表、字典、元祖、集合、文件 数值对象、函数

例如:

s = 'Gredae'
s_iter = s.__iter__()
print(s_iter.__next__())  # G  ## 基于索引(基于上一次结果)通过__next__进行迭代
print(s_iter.__next__())  # r
print(s_iter.__next__())  # e
print(s_iter.__next__())  # d

迭代器对象:具有__iter__以及__next__方法

迭代对象除了文件是迭代对象之外都不属于迭代对象

迭代循环——for循环(解决了不依赖索引取值)

lt = [1,2,3,4]
lt_iter = lt.__iter__()  ## 也可以这样定义迭代对象: lt_iter = iter(lt)
while True:
    try:
        print(lt_iter.__next__())  ##这句话一定会报错 也可以这样迭代: next(lt_iter)
    except StopIteration:  ## 当lt_iter迭代到没有元素的时候就会报错
        break
for i in lt:   # 可迭代对象;迭代器对象  # 不依赖索引取值,而是迭代取值
    print(i)
  1. 首先使用iter把lt变成迭代器对象;对于文件也要使用iter方法吧文件再一次iter下
  2. 然后使用next方法进行迭代取值
  3. 判断StopIteration异常,遇到异常终止

迭代器对象一定是可迭代对象; 可迭代对象不一定是迭代器对象

生成器

在 Python 中,使用了 yield 的函数被称为生成器(generator)

跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器

在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。

例如,可以使用生成器生成一个斐波那契数列

def fibonacci(n):  # 生成器函数 - 斐波那契
    '''生成斐波那契'''
    a, b, counter = 1, 1, 0
    while counter < n:
        yield a
        a, b = b, a + b
        counter += 1

f = fibonacci(10)  # f 是一个迭代器,由生成器返回生成
while True:
    try:
        print(next(f), end=" ")
    except StopIteration:
        break

原文地址:https://www.cnblogs.com/Gredae/p/11348021.html

时间: 2024-10-07 23:41:10

闭包函数与迭代器生成器的相关文章

python_day04 函数嵌套 名称空间和作用域 闭包 装饰器 迭代器 生成器 列表解析 三元表达式 生成器表达式

本节课重要知识点内容如下: 函数嵌套 名称空间和作用域 闭包 装饰器 迭代器 生成器 列表解析 三元表达式 生成器表达式 1.函数嵌套 函数的嵌套调用:在调用一个函数的过程中,又调用了其他函数函数的嵌套定义:在一个函数的内部,又定义另外一个函数 def bar(): print('from nbar')def foo(): print('from foo') bar()foo()def max2(x,y): if x > y: return x else: return ydef max4(a,

函数嵌套 ,名称空间与作用域 ,闭包函数 ,装饰器 ,迭代器, 生成器 三元表达式,列表解析,生成器表达式 递归与二分法, 内置函数

函数嵌套名称空间与作用域闭包函数装饰器迭代器生成器三元表达式,列表解析,生成器表达式递归与二分法内置函数--------------------------------------------函数的嵌套调用:在调用一个函数的过程中,又调用了其他函数函数的嵌套定义:在一个函数的内部,又定义另外一个函数def max(x,y): if x>y: return x else: return ydef max1(a,b,c,d): res=max(a,b) res2=max(res,c) res3=ma

&lt;04day&gt;_函数嵌套--闭包函数--装饰器--迭代器--生成器

一.函数的嵌套定义 1.python函数支持嵌套 def f1(): #f1函数的定义 def f2(): #f2函数的定义 print('from f2') def f3(): #f3函数的定义 print('from f3') f2() f1() 嵌套函数--运行结果说明: 1首先调用f1()结果,f1函数为空.担保函f2函数,f2函数有内容打印并且有调用,f2函数包含f3函数,但f3函数无调用. 运行结果: 列子:多个数据之间的大小比较. #!/usr/bin/python # -*- c

函数+装饰器+迭代器+生成器

闭包函数 闭包:定义在内网函数,包含对外部作用域而非全局作用域 范围:一个函数套用1或n个函数 from urllib.request import urlopen #urlopen模块 作用:爬网页 #闭包函数,内部get函数调用外部page函数 def page(url): #调用url def get(): #下载 return urlopen(url).read() #爬网页 return get #返回url值 baidu=page("http://www.baidu.com"

函数对象,函数的嵌套,名称空间与作用域,闭包,装饰器,迭代器,内置函数

一,函数对象 函数对象:函数是第一类对象,即函数可以当做数据传递 1,可以被引用 2,可以做参数的传递 3,返回值可以是函数 4,可以当作容器类型的元素 二,函数嵌套 1,函数的嵌套调用 2,函数的嵌套定义 三,名称空间与作用域 名称空间:存放名字的地方叫名称空间,存放这些值与名字的绑定关系 查看内置名称的两种方法: 三种名称空间 1,内置名称空间:随着python解释器的启动而产生 2,全局名称空间:文件的执行会产生全局名称空间,指的是文件级别定义的名字都会放入该空间 3,局部名称空间:调用函

Python 函数对象 命名空间与作用域 闭包函数 装饰器 迭代器 内置函数

一.函数对象 函数(Function)作为程序语言中不可或缺的一部分,但函数作为第一类对象(First-Class Object)却是 Python 函数的一大特性. 那到底什么是第一类对象(First-Class Object)呢? 在 Python 中万物皆为对象,函数也不例外,函数作为对象可以赋值给一个变量.可以作为元素添加到集合对象中.可作为参数值传递给其它函数,还可以当做函数的返回值,这些特性就是第一类对象所特有的. 1.函数身为一个对象,拥有对象模型的三个通用属性:id.类型.和值.

函数4—迭代器与生成器

基础概念迭代器: 为什么: 提供了一种不依赖于索引的取值方式,如字典,集合,文件等没有索引的类型需要循环取出元素 迭代器是惰性计算,更节省内存,迭代器在内存中只是一个内存地址,一次只取一个值 缺点:永远无法获取迭代器的长度,使用不如列表索引取值灵活 一次性的,只能往后取值 可迭代的:对象本身有__iter__方法 i = iter(n) or i = n.__iter__() i 为n的迭代器 next(i) or i.__next__() 利用迭代器输出内容,一次输出一个 生成器: 定义: 函

函数---迭代器&amp;生成器&amp;列表解析&amp;三元表达式

可迭代对象:obj.__iter__ 迭代器:iter1=obj.__iter() 1iter1.__next__ 2iter2.__next__ 迭代器: 优点:不依赖索引 惰性计算,节省内存 缺点: 不如按照索引的取值方便 一次性,只能往后取,不能回退 迭代器的应用: 提供了一种不依赖索引的统一的迭代方法 惰性计算,比如取文件的每一行 判断可是否是可迭代对象和迭代器 from collections import Iterable, Iterator # 导入模块功能 isinstance(

python函数:迭代器和生成器

python函数:迭代器和生成器 迭代器和生成器是函数中的一大重点,务必掌握,何为迭代?何为迭代器? 预习: 处理文件,用户指定要查找的文件和内容,将文件中包含要查找内容的每一行都输出到屏幕(使用生成器) 一.迭代器 for i in 50:     print(i) #运行结果: # Traceback (most recent call last): #   File "G:/python/python代码/八月/day2 迭代器生成器/3迭代器.py", line 8, in &