python反射、闭包、装饰器_python之闭包、装饰器、生成器、反射

1. 函数的作用域

1.在函数定义时候就固定,与调用位置无关,在调用的时候返回到函数定义的位置

x=1 #全局作用

def f1(): #整个f1函数是定义阶段

deff2():print(x)returnf2deffoo(func):

x=3func()#func()调用阶段

x=200 #这样定义x又变成全局了

foo(f1()) #执行foo(f1()) 返回到F1函数里找x所以打印是1不是3

生成器

2.名称空间

内置名称空间:在python解释器启动产生的空间,简单理解就是python自带的方法比如:max()len()

全局名称空间 :在全局定义的好的名称空间,文件级别的产生的 比如:

x=1 #全局作用

deftest():

x=2 #局部作用print(x)

test()

if x=1 y=2#全局作用

#在执行test()调用的时候先加载内置查找有没有test这个内置函数,如果去全局里查找test这个函数方法,最后局部

局部名称空间:在调用函数时候产生局部名称空间 y=2,在调用teset()立马产生了局部作用空间

nonlocal x 函数正上方的x的变量

global x 改成全局的变量

3.闭包函数

闭包函数的作用主要在与装饰器

函数式编程里面闭包只是给函数捆绑死一个值或者状态

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

2. 包含对外部作用域名字的引用,而不是对全局作用域名字的引用

3.该内部函数就称为闭包函数

importrequests#第一种传参闭包

defre(func):defget():returnrequests.get(func).textreturnget

baidu=re('http://www.baidu.com')

baidu1=re('http://www.souhu.com')print(baidu())#第二种自定义固定值闭包函数

deftest():

url='http://www.baidu.com'

defgett(): #gett()是闭合函数外面包裹这个urlreturnrequests.get(url).textreturngett

func=test()print(func())

def ff():

url=‘nq.com’

func() #此时的func已经一种状态就是url这个百度地址不会

ff() #得到的结果是url='http://www.baidu.com'

4.装饰器

装饰器的定义:1.在不变动主功能函数的前提下,为其添加上新的功能或者状态。

例:比如抓数据时候,我们需要添加计时器,显示抓取用了多少时间,

写一个te函数是计时器功能,这样可以给爬取baidu、搜狐网站添加上这个计时器。

第一种装饰器写法,其实是给闭包函数添加了一个功能

importrequests

improt time#第一种传参闭包,这里当主功能函数

defre(func):defget():returnrequests.get(func).textreturnget

baidu=re('http://www.baidu.com')

baidu1=re('http://www.souhu.com')print(baidu())#装饰器,给获取百度数据添的用时

defte(func):deftimer():

start=time.time()

func()

stop=time.time()print("获取数据的时间%s"%(stop-start))returntimer

baidu=te(baidu)

baidu()

第二种写法

这种方法适合用@装饰器函数名称,上面例子是闭包函数,已经闭包了是不可以种@的来装饰建议使用  函数调用方式

n是表示给传参的函数,以防万一最要用*args,**kwargs的方式

1 importpsutil2 defcount(func):3 deftimer():4 fu=psutil.cpu_count()5 print(fu)6 func(1)7 returntimer8

9

10 #查看cpu使用情况的一个函数

11 @count12 defmain(n):13 res=psutil.cpu_times()14 print(res)15 print(n)16

17 #查看Process的一个函数n

18 @count19 deftest(t):20 fl=psutil.Process21 print(fl)22 print(t)23

24

25 test()26 main()

View Code

装饰器的细节问题:

from functools import wraps 在装饰器中添加显示备注信息,如下代码

importpsutilfrom functools importwrapsdefcount(func):

@wraps(func) #这里需要添加wraps这个装饰器deftimer():

fu=psutil.cpu_count()print(fu)

func(1)returntimer#查看cpu使用情况的一个函数

@countdefmain(n):'''这个是mian函数的'''res=psutil.cpu_times()print(res)print(n)

#return 123 如果函数里有return 打印这个函数结果时候显示空 因为,main显示已经被conunt函数装饰了,所以要在timer里面retrun才对print(main.__doc__) #这里是打印上面的备注信息

生成器

生成器:不断调用和返回值,生成器

迭代器:可以被next()函数调用并不断返回下一个值的对象称为迭代器,可以直接作用于for循环的对象统称为可迭代对象

# def Pycharm(name):

# food_list=[]

# food= yieldfood_list

# print("%s想吃%s" %(name, food))

# food_list.append(food)

# print(food_list)

#

#

# res= Pycharm('alex')

# next(res) #next 会停留在 food=yield这里,send传送后继续执行下面的内容

# res.send('fangfood')

python之反射

反射即想到4个内置函数分别为:getattr、hasattr、setattr、delattr  获取成员、检查成员、设置成员、删除成员下面逐一介绍先看例子

它的核心本质其实就是利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员,一种基于字符串的事件驱动

classfunc():def __init__(self):

self.teacher='teacher'self.student='student'self.age='ee'self.name='name'

deftest01(self):print('反射机智显示test01功能%s' %self.teacher)deftest02(self):print('反射机智显示test02功能%s' %self.student)

func=func()defrun():''':return:通过res用户输入相对应的变量、函数方法

通过反射机制来判断、增删添改'''res=input('>>我想执行里面的函数:').strip()

hasa=hasattr(func,res) #hasattr 可以判断func类中是否存在res传入的变量或者函数方法

res=getattr(func,res,'not find') #getattr 可以获取传入方法或者函数的执行结果,

#得到是内存地址需要通过res()来展示内容

#not find意思 如果没有找到相对应的变量和函数 通过print(res())来打印出notfind

#print(res())

tom=setattr(func,res,18) #setattr 可以修改传入变量的结果 比如self age=17 通过setattr可以修改成18

print(func.age)

delattr(func,'age') #delattr 删除age这个变量

print(func.age)#setattr(func,res,18)

run()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/304484.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设备间的连线图例

转载于:https://blog.51cto.com/51fashion/243017

化学版2048,你玩过吗?内含游戏链接

今天来给大家推荐一款游戏——Na(钠),也可以叫它化学版2048。首先2048大家都不陌生,曾经火爆一时的小游戏,于14年由年仅19岁的意大利程序员加布里勒希鲁尼(Gabriele Cirulli)开发出来。2048游戏…

ajax jquery php_基于Ajax jquery的使用php登录

我使用基于PHP的登录表单与Ajax和jQuery以下是我的登录表单Please Sign InLoginRegister和我的阿贾克斯代码登录$("button#submit").click(function () {if ($("#username").val() "" || $("#password").val() "")$("…

sqlsession.selectlist 会返回null么_StackOverflow经典问题:代码中如何去掉烦人的“!=nullquot;判空语句...

推荐阅读:程序员引路人:腾讯T4曰“面试不仅仅是技术过硬就可以了,你还需要懂得这些”​zhuanlan.zhihu.com问题为了避免空指针调用,我们经常会看到这样的语句if (someobject ! null) { someobject.doCalc();}最终,项…

如何在 ASP.Net Core 中使用 Configuration Provider

ASP.NET Core 是一个开源的,跨平台的,精简的模块化框架,可用于构建高性能,可扩展的web应用程序, ASP.NET Core 中的数据配置常用 k-v 的形式存储,值得注意的是,新的数据配置还支持 层级方式&…

GdiPlus[30]: IGPPen: 线帽

StartCap 和 EndCap 属性分别用来读写两段的线帽, 测试图:StartCap 和 EndCap 测试代码:uses GdiPlus;procedure TForm1.FormPaint(Sender: TObject); constCapArr: array[0..8] of Byte (0, 1, 2, 3, $10, $11, $12, $13, $14); varGraphics: IGPGraphics;Pen: IGPPen;Pt1,Pt…

你知道怎么样排序才能做到多快好省?

小智最近迷上了计算机算法,今天过来给大家讲讲排序算法。准备讲排序算法之前,我们还是要先回顾一下排序这个概念。排序是一门古老的科学。排序问题,用数学的方式可以表达如下问题输入:给定n个数,a1, a2, a3, ..., an…

php 数据导出到excel文件,PHP导出数据到excel文件

下面介绍一个很另类的php导出数据到xls文件的方法,用到的函数有pack,iconv//上面三个自定义函数很重要,大家自行揣摩function xlsBOF() {echo pack("ssssss", 0x809, 0x8, 0x0, 0x10, 0x0, 0x0);}function xlsEOF() {echo pack("ss"…

C# 使用 Index 和 Range 简化集合操作

C# 使用 Index 和 Range 简化集合操作Intro有的语言数组的索引值是支持负数的,表示从后向前索引,比如:arr[-1]从 C# 8 开始,C# 支持了数组的反向 Index,和 Range 操作,反向 Index 类似于其他语言中的负索引…

python 服务端框架_GitHub - edisonlz/fastor: Python服务端开发框架-极易上手,超出你的想象!...

欢迎使用Python 服务端开发框架 FastorFastor是一款专为Python 打造的API与后端管理系统,通过精心的设计与技术实现,集成了大部分稳定开发组件,memcache , redis,tornado,django,mysql 等。特点…

我的小服务器

朋友做了一个工控机的板子,我要了一块来,自己加上了迅驰1.2G CPU,再从笔记本上拆了一个1G内存和老的移动硬盘 30G IDE,就算搭起了一个最简陋的服务器。此外我从破DVD光驱上拆了一块铁皮底板,打了几个洞,把主…

爱心助农|百万斤丑苹果紧急待售!谁能帮这些特困孩子熬过寒冷冬天?

题记:人们在猛兽横行的蛮荒年代,得以从树上回归地面,是人们守望相助的结果,也是人类能繁衍至今的原因在这个什么都讲究颜值的年代有这样一个东西却以“丑”、“但非常好吃”引起了我们的注意它便是山西临猗的冰糖心丑苹果还要一个…

php云点播源码,乐视云直播 点播服务端api

php代码<?php class LeshiController{public $userid ;//用户idpublic $secret ;//私钥public $user_unique ;//用户唯一标识码&#xff0c;由乐视网统一分配并提供 UUIDpublic $zhibo_apiurl http://api.open.letvcloud.com/live/execute;//直播接口地址public $dianb…

微软开源AI诊断工具Error Analysis

喜欢就关注我们吧&#xff01;Error Analysis 使用机器学习技术&#xff0c;助数据科学家更好地了解模型错误模式。在 2020 年 5 月的微软 Build 大会上&#xff0c;微软推出了三个响应式的 AI&#xff08;Responsible AI&#xff0c;RAI&#xff09;工具包&#xff0c;这三个工…

【SDL的编程】VC环境搭建

SDL&#xff08;simple DirectMedia Layer&#xff09;是一个可跨平台的开源库&#xff0c;最近由于自己的兴趣&#xff0c;就把它windosXP下的环境搭建了下。PC&#xff1a;Mircrosoft Windows XP Service Pack3Platform&#xff1a;Mircrosoft Visual C 6.0SourceCode&#x…

php正则匹配标点符号,php 正则匹配包含字母、数字以及下划线,且至少包含2种...

【scikit-learn】scikit-learn的线性回归模型&#xfeff;&#xfeff; 内容概要 怎样使用pandas读入数据 怎样使用seaborn进行数据的可视化 scikit-learn的线性回归模型和用法 线性回归模型的评估測度 特征选择的方法 作为有监督学习,分类问题是预 ...icon图标http://images20…

# 保持最外层获取焦点_大事件!沈阳爱尔白内障焕晶诊疗中心正式启用,两位PanOptix三焦点人工晶体植入患者清晰见证!...

近日&#xff0c;沈阳爱尔眼科医院大东院区白内障焕晶诊疗中心正式投入使用&#xff01;由沈阳爱尔眼科医院大东院区业务院长朱建勋领衔的白内障手术团队始终与国内外一流水准保持同步&#xff0c;开创性引进了爱尔康AcrySof IQ PanOptix 新一代三焦点人工晶状体。中心最先入住…

使用 Tye 辅助开发 k8s 应用竟如此简单(六)

续上篇&#xff0c;这篇我们来进一步探索 Tye 更多的使用方法。本篇我们将进一步研究 Tye 与分布式应用程序运行时 Dapr 如何碰撞出更精彩的火花。巧了&#xff0c;巧了&#xff0c;真是巧了 今天正值 dapr 1.0 发布的日子。如果你暂时还不了解什么是 dapr。那不如通过以下简短…

eval() php,js-eval编码,js-eval解码

实例例子 1在本例中&#xff0c;我们将在几个字符串上运用 eval()&#xff0c;并看看返回的结果&#xff1a;eval("x10;y20;document.write(x*y)")document.write(eval("22"))var x10 document.write(eval(x17))输出&#xff1a;200 4 27例子 2看一下在其他…

李阳疯狂英语300句

1.Absolutely.(用于答话&#xff09;是这样;当然是;正是如此;绝对如此。2.Absolutely impossible!绝对不可能的&#xff01;3.All I have to do is learn English. 我所要做的就是学英语。4.Are you free tomorrow?你明天有空吗?5.Are you married?你结婚了吗&#xff1f;6.…