python装饰器+迭代器+生成器

news/2024/7/7 19:09:36

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

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

2.名称空间与作用域

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

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

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

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

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

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

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

 b.作用域:

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

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

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

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

3.闭包函数

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

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

例子:

x=1
def  f1():x=11111111111def 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 resreturn 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 11111111print('second')yield 2222222print('third')yield 33333333print('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


http://lihuaxi.xjx100.cn/news/250705.html

相关文章

电子学会青少年编程等级考试案例:曲奇饼干

「青少年编程竞赛交流群」已成立(适合6至18周岁的青少年),公众号后台回复【Scratch】或【Python】,即可进入。如果加入了之前的社群不需要重复加入。 案例:曲奇饼干 代码 import turtlet turtle.Pen()t.speed(6) t.p…

RabbitMQ镜像队列机制

镜像queue有master节点和slave节点。master和slave是针对⼀个queue而⾔的,⽽不是⼀个node作为所有queue的master,其它node作为slave。⼀个queue第⼀次创建的node为它的master节点,其它node为slave节点。⽆论客户端的请求打到master还是slave最…

mysql从另一张获取数据的方法

方法一 CREATE TABLE tmp AS SELECT a.id FROM t_user t JOIN temp a ON t.email a.email; 方法二 INSERT INTO t_user (id,username,PASSWORD,email,user_type,STATUS) SELECT id,REPLACE(email,,_),PASSWORD,email,0,0 FROM temp; 这两个sql都是从另外一张中获取的数据插入…

活着是为了什么?

活着是为了死亡,死亡才是完美,才是永恒。 死亡时将一无所有,所以活着不是为了能带走什么,而应该是能留下什么,这才是人活着的意义,多少人能想明白呢? 胡建龙转载于:https://www.cnblogs.com/hjl…

电子学会青少年编程等级考试Python案例08

「青少年编程竞赛交流群」已成立(适合6至18周岁的青少年),公众号后台回复【Scratch】或【Python】,即可进入。如果加入了之前的社群不需要重复加入。 案例:绘制兔子时钟 代码 import turtlet turtle.Pen()# 表盘 t.p…

linux运维如何月薪过万?(收藏自用)

作者:汤哥在北京链接:https://www.zhihu.com/question/27505552来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。IT行业,是近些年相当火的一个专业,从事于IT行业的工作人员也…

c++引用的自我见解

2019独角兽企业重金招聘Python工程师标准>>> 刚开始学习c 学完指针后,其细节比较好明白,但学到引用了以后,只知其表却不知其底层的实现机制,虽然知道引用是别名、声明必须同时初始化等等,但这只是概念性的东…

如何将广告始终定位到网页右下角

body{margin:0;border:0;height:100%;overflow-y:auto;}#test{display:block; bottom:3px; right:3px; width:130px; position:fixed;}/* 以下是写给IE6的 */* html #test{position:absolute;right:18px} * html{overflow-x:auto; overflow-y:hidden;}转载于:https://www.cnblo…