21.闭包 闭包:在嵌套函数内,使用非全局变量(且不使用本层变量) 闭包的作用:1.保证数据的安全性(纯洁度).2.装饰器使用 .__closure__判断是否是闭包 def func(): a = 1 def foo(): print(a) return foo ret = func() ret() #例子 def func(): avg_lst = [] def foo(pirce): avg_lst.append(pirce) avg = sum(avg_lst) / len(avg_ls…
本篇依然是一篇学习笔记,文章的结构首先讲装饰器,然后讲lambda表达式.装饰器内容较多,先简要介绍了装饰器语法,之后详细介绍理解和使用不带参数装饰器时应当注意到的一些细节,然后实现了一个简单的缓存装饰器作为实践,最后在理解不带参数的装饰器的基础上,介绍了理解和使用带参数的装饰器需要注意到的细节.lambda表达式的讲解依然着重于使用细节和理解上.如果有不对的地方欢迎指正. 装饰器 实际上理解装饰器的作用很简单,在看core python相关章节的时候大概就是这种感觉.只是在实际应用的时候,发现…
昨天学了很多函数方面的概念和知识其中有一个闭包的函数.很多人都对闭包的作用不是很清楚,今天我们就来认识一个新的知识点装饰器.它就是闭包函数的一个经典应用. 预习: 编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次,后续的函数都无需再输入用户名和密码 一.楔子 def func1(): print('in func1') 想要计算上面函数的执行时间: import time def func1(): start = time.time() print('in fu…
1.装饰器的概念   装饰器本质上就是一个函数,主要是为其他的函数添加附加的功能,装饰器的原则有以下两个: 装饰器不能修改被修饰函数的源代码 装饰器不能修改被修改函数的调用方式   装饰器可以简单的理解为:高阶函数+嵌套函数+闭包 2.高阶函数   高阶函数我在前面的博客中已经讲过了,在这里我再简单的说一下吧.   高阶函数:如果一个函数接收的参数是一个函数名,或者返回值是函数名,只要满足任意一个条件,这个函数就称为高阶函数. 接收的参数是一个函数名 def foo(): print("the…
一.函数及变量的作用   在python程序中,函数都会创建一个新的作用域,又称为命名空间,当函数遇到变量时,Python就会到该函数的命名空间来寻找变量,因为Python一切都是对象,而在命名空间中,都是以字典形式存在着,这些变量名,函数名都是索引,而值就是,对应的变量值和函数内存地址.在python中可以用globals()查看全局变量,locals()局部变量. >>> global_v = '全局变量' >>> def func(): ... local_v =…
第一:函数作用域: L:local 函数内部作用域 E:enclosing       函数内部与内嵌函数之间(闭包) G:global            全局作用域 B:build_in          内置作用域 L > E > G > B          优先级比较 第二:闭包函数: 定义:如果内部函数引用了外部作用域(不是全局作用域)的变量,那么此时内部函数被称为闭包. def func1(): a = 10 def func2(): b = 20 return a +…
返回目录 本篇索引 (1)闭包 (2)装饰器 (3)生成器 (4)协程 (1)闭包 闭包(closure)是很多现代编程语言都有的特点,像C++.Java.JavaScript等都实现或部分实现了闭包功能,很多高级应用都会依靠闭包实现. 一般专业文献上对闭包的定义都比较拗口,比如:“将组成函数的语句和这些语句的执行环境打包在一起时,得到的对象称为闭包.” 其实,简单来说,你可以将闭包看成是一个轻载的类,这个类只有一个函数方法,并且只有为数不多的几个成员变量. 闭包的优点是:实现起来比类稍微轻巧一…
函数的冒泡排序: 本质是,让元素换位置,逐个比较最终排序. 例1:实现a1,a2值互换: a1 = 123 a2 = 456 temp = a1 a1 = a2 a2 = temp print(a1) print(a2) 结果: 456 123 冒泡排序: #!/bin/bash/env python # -*- coding:utf-8 -*- li = [22,1,5,4,3,66,22,12,34,21] for j in range(1,len(li)): for i in range(…
Python进阶(七)----带参数的装饰器,多个装饰器修饰同一个函数和递归简单案例(斐波那契数列) 一丶带参数的装饰器 def wrapper_out(pt): def wrapper(func): def inner(*args,**kwargs): useinput = input('请输入用户名:>>').strip() password = input('请输入密码:>>').strip() with open(pt,encoding='utf-8') as f: for…
一.递归知识 函数迭套执行,逐层执行之后,满足某个条件之后就会停止执行,将return值返回上层的函数,上层函数再逐层返回,最终返回给最初始函数. 递归在斐波那契数列的应用[斐波那契数列特点:前两个数字相加之和等于下一个数字] 例一.打印出小于10000的斐波那契数列 def f(a1,a2): if a1 > 10000: return print(a1) a3 = a1 + a2 f(a2,a3) res = f(0,1) print(res) 例二.获得斐波那契数列第10个数字 def f…
英文:https://arpitbhayani.me/blogs/function-overloading 作者:arprit 译者:豌豆花下猫("Python猫"公众号作者) 声明:本翻译是出于交流学习的目的,基于 CC BY-NC-SA 4.0 授权协议.为便于阅读,内容略有改动. 函数重载指的是有多个同名的函数,但是它们的签名或实现却不同.当调用一个重载函数 fn 时,程序会检验传递给函数的实参/形参,并据此而调用相应的实现. int area(int length, int b…
装饰器: 需求----> 写一个功能,测试其他同事函数的调用效率. 第一版:功能版 import time def func(): time.sleep(0.2) print('非常复杂') def func1(): time.sleep(0.3) print('超级复杂') # print(time.time()) start_time = time.time() func() end_time = time.time() print('此函数的执行效率为%s' % (end_time - s…
递归: 递归的概念很简单,如果函数包含了对其自身的调用,该函数就是递归.拗口一点的定义是,如果一个新的调用能在相同过程中较早的调用结束之前开始,那么该过程就是递归. """阶乘""" def jie(n): if n==0 or n==1: return 1 else: return n*jie(n-1) print fac(8) D:\python3.5\python.exe D:/untitled/python2/denglu.py 4032…
1.冒泡排序 关于冒泡排序实现大小比较,大索引会向后移动,这次循环将最大数值直接移动至最后. li = [,,,,] ): ]: temp = li[i] li[i] = li[i + ] li[i + ] = temp print(li) [, , , ] 冒泡排序以函数的方式完整的实现方法 def my_min(a): c = len(a) while c > 1: for i in range(len(a) - 1): if a[i] > a[i + 1]: temp = a[i] a[…
谈装饰器前,需要明白一件事,Python 中的函数和 Java.C++不太一样,Python 中的函数可以像普通变量一样当做参数传递给另外一个函数,例如: def foo(): print("foo") def bar(func): func() bar(foo) 正式回到我们的主题.装饰器本质上是一个 Python 函数或类,它可以让其他函数或类在不需要做任何代码修改的前提下增加额外功能,装饰器的返回值也是一个函数/类对象.它经常用于有切面需求的场景,比如:插入日志.性能测试.事务处…
本篇内容 什么是装饰器 装饰器需要遵循的原则 实现装饰器的知识储备 高阶函数 函数嵌套 闭包函数 无参函数 装饰器示例 1.什么是装饰器 器即函数 装饰即修饰,意指为其他函数添加新功能 装饰器定义:本质就是函数,功能是为其他函数添加新功能 2.装饰器需要遵循的原则 1.不修改被装饰函数的源代码(开放封闭原则) 2.为被装饰函数添加新功能后,不修改被修饰函数的调用方式 3.实现装饰器的知识储备 装饰器=高阶函数+函数嵌套+闭包 4.高阶函数 高阶函数定义:1.函数接收的参数是一个函数名 2.函数的…
一.命名空间 1. 命名空间 命名空间是一个字典,key是变量名(包括函数.模块.变量等),value是变量的值. 2. 命名空间的种类和查找顺序 - 局部命名空间:当前函数 - 全局命名空间:当前模块 - 内建命名空间:所有Python环境,所有模块 查找顺序      1.先在当前 (嵌套的或 lambda) 函数的命名空间中搜索      2.然后是在父函数的命名空间中搜索      3.接着是模块命名空间中搜索      4.最后在内置命名空间中搜索 要到内置命名空间都没找到的话,就会弹…
说到装饰器,就不得不说python自带的三个装饰器: 1.@property   将某函数,做为属性使用 @property 修饰,就是将方法,变成一个属性来使用. class A(): @property def pfunc(self): return self.value @pfunc.setter def pfunc(self,value): self.value = value @property def pfunc1(self): print('this is property') i…
一.装饰器 装饰器本质上就是一个python函数,他可以让其他函数在不需要做任何代码变动的前提下,增加额外的功能,装饰器的返回值也是一个函数对象. 装饰器的应用场景:比如插入日志,性能测试,事务处理,缓存等等场景. 基本装饰器 不应用装饰器 def wrapper(func): def inner(*args,**kwargs): return func(*args,**kwargs) return inner def f1(): print('f1') print(f1.__name__) 执…
一.什么是装饰器? 装饰器他人的器具,本身可以是任意可调用对象,被装饰者也可以是任意可调用对象. 强调装饰器的原则:1 不修改被装饰对象的源代码 2 不修改被装饰对象的调用方式 装饰器的目标:在遵循1和2的前提下,为被装饰对象添加上新功能 二.软件开发的原则 软件开发 的 一个原则:“开放-封闭”原则 开放:对现有功能的扩展开放 封闭:已实现的功能代码块不应该被修改 三.装饰器的应用 装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也…
一.闭包 1. 如果一个函数定义在另一个函数的作用域内,并且引用了外层函数的变量,则该函数称为闭包. def outter(): name='python' def inner(): print name return inner res=outter() 把inner的地址赋值给res res() 相当于执行inner()函数.通过闭包,可以把局部变量在外部也可以使用 2.判断是否为闭包 res.func_closure inner()函数就是一个闭包 3.通过闭包,可以把局部变量在外部也可以…
一.装饰器 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等. 装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用.概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能. 装饰器功能: 1. 自动执行装饰器函数 并且将被装饰函数当做参数对象本身,传递进去 2. 将装饰器函数的返回值,重新赋值给被装饰的函数 用伪代码就是如下表示: # 装饰器是一个函数,而其参数为另外一个函数 def…
1.必备知识 #### 一 #### def foo(): print 'foo' foo #表示是函数 foo() #表示执行foo函数 #### 二 #### def foo(): print 'foo' foo = lambda x: x + 1 foo() # 执行下面的lambda表达式,而不再是原来的foo函数,因为函数 foo 被重新定义了 为什么需要装饰器? 来自知乎大神的形象比方 内裤可以用来遮羞,但是到了冬天它没法为我们房等御寒,宗明的人发明了长裤,有了长裤后宝宝再也不冷了,…
装饰器:本质是函数(装饰其它函数) 就是为其它函数添加附加功能 原则:1.不能修改被装饰函数的源代码 2.不能修改被装饰的函数的调用方式 实现装饰器知识储备: 1.函数即变量 2.高阶函数:a.把一个函数名当做实参传给另外一个函数,(在不修改被装饰函数源代码情况下添加功能)b.返回值中包含函数名(不修改函数的调用方式) 3.嵌套函数a. 匿名函数: lambda 高阶函数 import time def car():#定义一个源代码 print ("in the car") def c…
一.函数 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可 特性: 减少重复代码 使程序变的可扩展 使程序变得易维护 1.定义 def 函数名(参数): ... 函数体 ... 返回值 函数的定义主要有如下要点: def:表示函数的关键字 函数名:函数的名称,可根据函数名调用函数 函数体:函数中进行一系列的逻辑计算 参数:为函数体提供数据 返回值:当函数执行完毕后,可以给调用者返回数据. 2.参数 函数的有三种不同的参数: 普通参数(也称为位置参数)…
**递归**        def calc(n):            print(n)            if int(n / 2) == 0:  条件判断                return n            return calc(int(n/2))        calc(10)        结果为10,5,2,1                下一个是实现过程            def calc(n):                print(n)  …
函数中局部变量的访问 在完成了对函数参数的剖析后,我们再来看看,在Python中,函数的局部变量时如何实现的.前面提到过,函数参数也是一种局部变量.所以,其实局部变量的实现机制与函数参数的实现机制是完全一样的.这个“一样”是什么意思呢? 之前我们剖析过Python虚拟机的一些指令,如果要访问一个变量,应该使用LOAD_NAME指令,应该依照local.global.builtin这三个名字空间里去检索变量名所对应的变量值.然后在调用函数时,Python虚拟机通过PyFrame_New创建新的Py…
高阶函数定义 1.函数接收的参数是一个函数名 2.函数的返回值是一个函数名 3.满足上述条件任意一个都可以称之为高阶函数 一.函数的接收参数是一个函数名 import time def foo(): time.sleep(3) print('name is charon') def test(func): #print(func) start_time=time.time() func() stop_time=time.time() print('run time %s' %(stop_time…
最简单的模板是这样的 #-*-coding:utf-8-*- def outer(func): def inner(): print 'before' func() print 'after' # return r return inner ''' def outer_1(func): def inner(): print 'before 11' func() print 'after 22' # return r return inner @outer_1 ''' @outer def F1(…
最简单的模板是这样的 #-*-coding:utf-8-*- def outer(func): def inner(): print 'before' func() print 'after' # return r return inner ''' def outer_1(func): def inner(): print 'before 11' func() print 'after 22' # return r return inner @outer_1 ''' @outer def F1(…