<04day>_函数嵌套--闭包函数--装饰器--迭代器--生成器

一、函数的嵌套定义

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
# -*- coding:utf-8 -*-
# Author:zhaosj

def max2(x,y):
    return x if x>y else y
def max4(a,b,c,d):
    res1 = max2(a,b)
    res2 = max2(res1,c)
    res3 = max2(res2,d)
    return res3
print(max4(12,88,19,33)) # max4(12,88,19,33)把4个数值传参数给max4(a,b,c,d)

输出结果:

二、函数、名称空间与作用域

1、名称空间:全局名称空间、局部名称空间;

2、全局名称空间:文件的执行会产生全局名称空间,指的是文件级别定义的名字;

文件级别有:

x = 1、if x == 1:、import time.....

3、局部名称空间:调用函数时会产生局部名称空间,只在函数调用时临时绑定,调用结束,绑定即结束。

"""
x = 1000      # 全局名名称空间
def func():
    x = 1     # 局部名称空间
    def f1():
        pass
"""

三、闭包函数

闭包函数:

1、内部包含函数;

2、引用外部作用域除全局作用域以外;

列:

#!/usr/bin/python
# -*- coding:utf-8 -*-
# Author:zhaosj

def f1():
    x = 1
    def f2():
        print(x)
    return f2

f = f1()
print(f)
print(f.__closure__[0].cell_contents) 
#closure闭合的意思(只要是闭包函数,那么次函数就有必合属性。查看的值是一个元组,取出值.cell_contents)

输出结果:

四、闭包函数的应用--惰性计算
1、利用闭包函数做爬虫
2、导入一个模块from urllib.request import urlopen(此模块比较老,新爬虫模块为request)

from  urllib.request import urlopen
zhi = urlopen(‘http://www.baidu.com‘).read()
print(zhi.decode(‘utf-8‘))# bytes类型想要看懂需要decode,转换为utf-8

例子:

#!/usr/bin/python
# -*- coding:utf-8 -*-
# Author:zhaosj

from urllib.request import urlopen
def index(url):
    def get():
        return urlopen(url).read()
    return get # 如果没有return get 把值返回出来那么只能在内部调用
oldboy = index(‘http://crm.oldboyedu.com‘)
print(oldboy().decode(‘utf-8‘))

运行结果:

五、函数----《装饰器》

1、装饰器:修饰别人的工具,修饰添加功能,工具指的就是函数;
2、装饰器本身可以是任何可调用对象,被装饰的对象也是任意可调用对象;

无参函数装饰器:

########################装饰器##################################
import time
def timmer(func):
    def wrapper(*args,**kwargs):
        start_time=time.time()
        #func() # 原始index函数
        res = func(*args,**kwargs)
        stop_time=time.time()
        print(‘run time is %s‘ %(stop_time-start_time))
        return res
    return wrapper

####################被装饰的函数#################################
@timmer  # index=timmer(index)),加上装饰器,会打印出执行时间的内容
def index():
    time.sleep(3) # 运行三秒在进行打印一下内容
    print(‘欢迎登陆...‘)
    return 1
index() #函数调用 wrapper()

装饰器的调用方式列如:@timmer  【 index=timmer(index))】

----------------------------------------------------------------------------------------

装饰器:--用户登录认证:(文件的认证方式)__无参函数

#!/usr/bin/python
# -*- coding:utf-8 -*-
# Author:zhaosj
####################装饰器########################################
def auth(func):
    def wrapper(*args,**kwargs):
        name = input(‘输入用户名>>:‘)
        password = input(‘输入密码>>:‘)
        if name == ‘zhaosj‘ and password == ‘123‘:
            print(‘\033[45m登陆成功[0m‘)
            res = func(*args,**kwargs)
            return res
        else:
            print(‘\033[45m登陆失败\033[0m‘)
    return wrapper
########################函数功能区#################################
@auth #装饰器--函数调用
def index():
    print(‘欢迎登陆首页‘)

@auth #装饰器--函数调用
def home(name):
    print(‘%s 欢迎来到主页面‘ %name)

index()
home(‘zhaosj‘)

运行结果:

装饰器:--用户登录认证:(认证之后进入系统,做认证记忆__无参函数

#!/usr/bin/python
# -*- coding:utf-8 -*-
# Author:zhaosj
# 定义全局变量,开始时无用户登陆。默认状态为没有登陆状态login_user = {‘user‘:None, ‘status‘:False}
##############################装饰器#########################################
def auth(func):
    def wrapper(*args,**kwargs):
#判断有没有用户登陆以及当前的登陆状态,有用户登录则不再进行登陆认证if login_user[‘user‘] and login_user[‘status‘]:
            res = func(*args,**kwargs)
            return  res
        else: # 否则进行用户登陆认证
            name = input(‘输入用户名>>:‘)
            password = input(‘输入密码>>:‘)
            if name == ‘zhaosj‘ and password == ‘123‘: # 判断输入的用户名以及密码
                login_user[‘user‘]=‘zhaosj‘ # 用户登陆密码--zhaosj
                login_user[‘status‘]=True   # 用户登陆状态--True
                print(‘\033[45m登陆成功\033[0m‘) # 登陆成功
                res = func(*args,**kwargs) #
                return res
            else:
                print(‘\033[45m登陆失败\033[0m‘)
    return wrapper
###############################函数功能区########################################
@auth #装饰器--函数调用
def index():
    print(‘欢迎登陆首页‘)

@auth #装饰器--函数调用
def home(name):
    print(‘%s 欢迎来到主页面‘ %name)

index()
home(‘zhaosj‘)

运行结果:(登陆成功)

运行结果:(登陆失败)

装饰器:--用户登陆认证__装饰器,有参函数

有参函数装饰器只有3层,无参函数装饰器只有2层

#!/usr/bin/python
# -*- coding:utf-8 -*-
# Author:zhaosj
# 定义全局变量,开始时无用户登陆。默认状态为没有登陆状态login_user = {‘user‘:None, ‘status‘:False}
#############################装饰器#######################################
def auth(driver = ‘file‘):
    def auth2(func):
        def wrapper(*args,**kwargs):
            if driver == ‘file‘:
                print(‘================file的认证‘)
###############################认证功能######################################
#判断有没有用户登陆以及当前的登陆状态,有用户登录则不再进行登陆认证
                if login_user[‘user‘] and login_user[‘status‘]:
                    res = func(*args,**kwargs)
                    return  res
                else: # 否则进行用户登陆认证
                    name = input(‘输入用户名>>:‘)
                    password = input(‘输入密码>>:‘)

                    if name == ‘zhaosj‘ and password == ‘123‘: # 判断输入的用户名以及密码
                        login_user[‘user‘]=‘zhaosj‘ # 用户登陆密码--zhaosj
                        login_user[‘status‘]=True   # 用户登陆状态--True
                        print(‘\033[45m登陆成功\033[0m‘) # 登陆成功
                        res = func(*args,**kwargs) #
                        return res
                    else:
                        print(‘\033[45m登陆失败\033[0m‘)
##############################################################################
            elif driver == ‘ldap‘:
                print(‘===================ldap的认证‘)
            elif driver == ‘mysql‘:
                print(‘===================mysql的认证‘)
                #return func(*args,**kwargs)
            else:
                print(‘===================未知认证方式‘)
        return wrapper
    return auth2
#############################函数功能区###########################################
@auth(‘file‘) #装饰器--函数调用  【@auth2====>index=auth2(index)====>index=wrapper】
def index():
    print(‘欢迎登陆首页‘)

@auth(driver=‘mysql‘) #装饰器--函数调用
def home(name):
    print(‘%s 欢迎来到主页面‘ %name)

index()  #wrapper
home(‘zhaosj‘)#wrapper(zhaosj)

运行结果:

 六、迭代器

迭代器的概念:
重复的过程称为迭代,每次重复即一次迭代,并且每次迭代的结果是下一次迭代的初始值;

1、迭代一个--<列表>

zhaosj_list = [0,1,2,3]
count = 0
while count < len(zhaosj_list):
    print(‘=======>‘,zhaosj_list[count])
    count += 1

运行结果:

2、迭代一个--<元组>

zhaosj_tulop = (0,1,2,3)
count = 0
while count < len(zhaosj_tulop):
    print(‘========>‘,zhaosj_tulop[count])
    count += 1

运行结果:

3、迭代--<字符串>

zhaosj_str = ‘zhaoshujing‘
count = 0
while count < len(zhaosj_str):
    print("============",zhaosj_str[count])
    count += 1

运行结果:

为什么需要迭代器?
对于没有索引的数据类型(像:字典-dic、集合-set。就没有索引)必须提供一种不依赖与索引的迭代方式

可迭代对象;
可迭代的对象:内置__iter__()方法的都是可迭代对象;

[1,2].__iter__()          #列表
‘zhaosj‘.__iter__()       #字符串
(1,2).__iter__()          #元组
{‘a‘:1,‘b‘:2}.__iter__()  #字典
{1,2,3}.__iter__()        #集合

迭代器:执行__iter__方法,得到的结果就是迭代器
迭代器:可执行__next__()方法的都是迭代器。

i = [1,2,3].__iter__()
print(i)
print(i.__next__()) # 每执行一次,就会取一次值(不能一次全取)
print(i.__next__())

运行结果:

字典生成--迭代器--取出 字典中的值

dic = {‘a‘:1,‘b‘:2,‘c‘:3}
i = dic.__iter__()         #字典生成迭代器

print(i.__next__())       #next一次取出一个key
print(i.__next__())
print(i.__next__())

字典生成--迭代器--后取出字典中的值

dic = {‘a‘:1,‘b‘:2,‘c‘:3}
i = dic.__iter__() #字典生成迭代器
# 字典生成迭代器后取出字典中的值
while True:
    try:
        key = i.__next__()
        print(dic[key])
    except StopIteration: # 异常处理,捕捉异常。遇到异常执行break
        break

运行结果:

查看一个字符串的长度

s = ‘hello‘
print(len(s)) # len(s) ===s.__len__()

运行结果:

 七、生成器

生成器---生成器函数(只要函数体包含yield关键字,该函数就是生成器);
yield 与 return相似,但是return只执行一次就结束,yield只会暂时挂起;
yield 会把函数变成迭代器;

#!/usr/bin/python
# -*- coding:utf-8 -*-
# Author:zhaosj

def foo():
    print(‘first‘)
    yield 1 # 遇到yield挂起,返回参数。
    print(‘second‘)
    yield 2
    print(‘third‘)
    yield 3
    print(‘fourth‘)
    yield 4
    print(‘ffth‘)

g = foo()  #next(g) 触发迭代器g的执行,进而触发函数的执行
print(next(g))
print(next(g))

运行结果:

时间: 2024-12-21 01:13:47

<04day>_函数嵌套--闭包函数--装饰器--迭代器--生成器的相关文章

函数进阶——闭包,装饰器,生成器,迭代器

闭包 函数定义和函数表达式位于另一个函数的函数体内(嵌套函数).而且,这些内部函数可以访问他们所在的外部函数中声明的所有局部变量.参数.当其中一个这样的内部函数在包含他们的外部函数之外被调用时,就会形成闭包. 装饰器 在不修改原函数的情况下,给原函数增加新的功能,使得程序变得可扩展 http://www.cnblogs.com/alex3714/articles/5765046.html(转) 列表生成式 1 a = [i+1 for i in range(10)] 2 print(a)#[1,

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

函数嵌套名称空间与作用域闭包函数装饰器迭代器生成器三元表达式,列表解析,生成器表达式递归与二分法内置函数--------------------------------------------函数的嵌套调用:在调用一个函数的过程中,又调用了其他函数函数的嵌套定义:在一个函数的内部,又定义另外一个函数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

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,

函数的闭包和装饰器

函数的闭包: #1.闭 必须是内部的函数 #2.包 引用了外部作用域中的变量 命名空间: 一共有三种命名空间从大范围到小范围的顺序:内置命名空间.全局命名空间.局部命名空间 作用域(包括函数的作用域链): 小范围的可以用大范围的但是大范围的不能用小范围的范围从大到小(图) 在小范围内,如果要用一个变量,是当前这个小范围有的,就用自己的如果在小范围内没有,就用上一级的,上一级没有就用上上一级的,以此类推.如果都没有,报错 函数的嵌套: 嵌套调用 嵌套定义:定义在内部的函数无法直接在全局被调用 函数

13、python中的函数(闭包与装饰器)

一.嵌套函数 函数的内部又再定义另一个函数,这个函数就叫嵌套函数,里面含函数就叫内部函数. 示例: 二.返回函数 函数可以接收函数对象作为参数,同理函数也能返回一个函数对象作为返回值. 示例: 返回函数可以用来延迟函数的执行. 三.命名空间与变量作用域 变量作用域指的是变量的存活的范围.命名空间指的是属于一个对象的所有属性(对象)的集合. 示例: A的命名空间是A函数对象里面的所有对象的集合,包括变量a.函数B.变量b:B的命名空间就是属于函数B的所有对象的集合,包括变量b: a的变量作用域就是

Day 19 函数之闭包、装饰器

一.什么是装饰器 器即函数 装饰即修饰,意指为其他函数添加新功能 装饰器定义:本质就是函数,功能是为其他函数添加新功能 二.装饰器遵循的原则 1.不修改被装饰函数的源代码(开放封闭原则) 2.为被装饰函数添加新功能后,不修改被修饰函数的调用方式 三.高阶函数 高阶函数总结 1.函数接收的参数是一个函数名 作用:在不修改函数源代码的前提下,为函数添加新功能, 不足:会改变函数的调用方式 2.函数的返回值是一个函数名 作用:不修改函数的调用方式 不足:不能添加新功能 其.程序: work: #! /

Day4 装饰器——迭代器——生成器

一 装饰器 1.1 函数对象 一 函数是第一类对象,即函数可以当作数据传递 #1 可以被引用 #2 可以当作参数传递 #3 返回值可以是函数 #3 可以当作容器类型的元素 二 利用该特性,优雅的取代多分支的if def foo(): print('foo') def bar(): print('bar') dic={ 'foo':foo, 'bar':bar, } while True: choice=input('>>: ').strip() if choice in dic: dic[ch

Python函数进阶:闭包、装饰器、生成器、协程

返回目录 本篇索引 (1)闭包 (2)装饰器 (3)生成器 (4)协程 (1)闭包 闭包(closure)是很多现代编程语言都有的特点,像C++.Java.JavaScript等都实现或部分实现了闭包功能,很多高级应用都会依靠闭包实现. 一般专业文献上对闭包的定义都比较拗口,比如:“将组成函数的语句和这些语句的执行环境打包在一起时,得到的对象称为闭包.” 其实,简单来说,你可以将闭包看成是一个轻载的类,这个类只有一个函数方法,并且只有为数不多的几个成员变量. 闭包的优点是:实现起来比类稍微轻巧一

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

闭包函数 闭包:定义在内网函数,包含对外部作用域而非全局作用域 范围:一个函数套用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"