博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python装饰器+迭代器+生成器
阅读量:6983 次
发布时间:2019-06-27

本文共 2885 字,大约阅读时间需要 9 分钟。

1.函数嵌套:在调用一个函数的过程中,调用了其他函数

def f1():    x=1    def f2():        print('from f2')    f2()f1() 

2.名称空间与作用域

 a. 名称空间:存放名字与变量值绑定关系的地方

    (1)内置名称空间:在python解释器启动时产生,存放一些python内置的名字

    (2)全局名称空间:在执行文件时产生,存放文件级别定义的名字。

    (3)局部名称空间:在执行过程中,如果调用了该函数则会产生该函数的局部名称空间。在调用该函数的时候生效,调用结束时失效

  加载顺序:   内置----> 全局 ----> 局部

  查找顺序:   局部-----> 全局-----> 内置

x=0def f1():    x=1    def f2():        x=2        def f3():            x=3            print('f3中x是 ',x)        f3()    f2()    print('f1中x是  ',x)f1()

 b.作用域:

   (1)全局作用域:全局存活,全局有效。

   (2)局部作用域:局部存活,局部有效。

   (3)作用域关系是在函数定义阶段就已经固定,与函数调用位置无关

x=1def f1():    def f2():        print(x)    return f2def f3(func):    x=2    func()f3(f1())

3.闭包函数

  (1).定义在函数内部的函数

  (2).包含对外部作用域的引用,而不是对全局作用域的引用。就可以称为闭包函数。

例子:

x=1def  f1():    x=11111111111    def f2():        print(x)    return f2func=f1()func()f2就是闭包函数

 

=====================================

eval 的用法:

  将字符串中包含的字段单独拿出来执行一下。

dic='{"name":"user01","age":"18"}'print(type(dic))dic=eval(dic)print(type(dic)) 

====================================

 

 

4.装饰器

  (1).装饰器遵循的原则:a.不修改被装饰对象的源代码。b.不修改被调用对象的调用方式。

  (2).装饰器的目的:为其他函数添加新功能。

## 装饰器必须写在被装饰对象的正上方,并且是单独一行。

 

装饰器框架:

def timer(func):     def wrapper():         func()     return wrapper

 

加上参数:

def timer(func):     def wrapper(*args,**kwargs):         func(*args,**kwargs)     return wrapper

 

 

 

例子:

(无参)

import timedef timmer(func):    def wrapper():        start=time.time()        func()        stop=time.time()        print('run time is %s' %(stop-start))    return wrapper@timmer # index=timmer(index)def index():    time.sleep(3)    print('welcome to index')

 

 

例子:

(有参)

import timedef timmer(func):    def wrapper(*args,**kwargs):        start=time.time()        res=func(*args,**kwargs)        stop=time.time()        print('run time is %s' %(stop-start))        return res    return wrapper@timmer # index=timmer(index)def index():    time.sleep(3)    print('welcome to index')    return 123@timmer # home=timmer(home)def home(name):    time.sleep(2)    print('welcome %s to home page' %name)

 

5.迭代器 iterator

 可迭代对象:凡是对象下有__iter__ 方法的都是可迭代对象。

 迭代器对象:可迭代对象执行内置的__iter__方法,得到的结果就是迭代器对象。

 

 迭代器对象的优点:

    (1).提供了一种统一的(不依赖索引)的迭代方式

    (2).迭代器本身,比其他数据类型更省内存。

 缺点:

    (1).一次性,只能向后取值,不能回退,不如索引取值灵活;

    (2).无法预知下一次取值什么时候结束,无法预知长度。

 

例子:

l=['a','b','c','d']i=iter(l)print(next(i))print(next(i))print(next(i))

 

6.生成器  generator

  (1). 在函数内部包含yield关键字,那么该函数的执行结果是生成器。

  (2).生成器就是迭代器。

 

yield的功能

   1.把函数的结果做成迭代器。

   2.yeild可以保存函数暂停与再继续的状态。

def func():    print('first')    yield 11111111    print('second')    yield 2222222    print('third')    yield 33333333    print('fourth')g=func()print(g)next(g)next(g)

 

 

 

7.三元表达式、列表解析、生成器表达式。

 

三元表达式: 

    例子:

name='user01'print('hello' if name == 'user01' else 'error!!!')

 

列表解析:

   例子:

l=['user%s' %i for i in range(10)  if i >=5]print(l)

 

生成器表达式:

    生成器表达式的语法和列表解析一样,只不过生成器表达式是被()括起来的

  例子:

g=('user%s' %i for i in range(1000))print(g)print(next(g))print(next(g))print(next(g))

 

转载于:https://www.cnblogs.com/yxwang/p/7223134.html

你可能感兴趣的文章
高德地图POI查找
查看>>
磁盘格式化
查看>>
Fedora 11 安装指南-12
查看>>
eclipse的安卓开发插件『ADT』在线安装不成功的解决方案
查看>>
刷屏的海底捞超级APP究竟是怎样与阿里云合作的
查看>>
k8s学习笔记之三:k8s快速入门
查看>>
SpringBoot慕课学习-SpringBoot开发常用技术整合
查看>>
C10K问题
查看>>
慕课网3-13编程练习:采用flex弹性布局制作页面主导航
查看>>
线程中死锁的demo
查看>>
canvas-7globleCompositeOperation.html
查看>>
英语发音规则---H字母
查看>>
UESTC 2014 Summer Training #11 Div.2
查看>>
1035. 插入与归并(25)
查看>>
Android组件化和插件化开发
查看>>
【java】 虹软ArcFace 2.0 人脸信息识别(年龄、性别)
查看>>
Java集合--Map总结
查看>>
【转】Netty系列之Netty 服务端创建
查看>>
alpha冲刺9
查看>>
spring学习之spring 插件 for eclipse
查看>>