本文需要您有Python变量查找的知识,如果您不知道,可以参考上篇博文Python变量查找LEGB原则 构成闭包的条件 外函数中定义了内函数 内函数使用了外函数的变量 外函数的返回值是内函数的引用 以下是一个简单的闭包的定义 def outer(): b = 1 def inner(): #外部函数内定义了内部函数 print(b) #内部函数使用了外部函数的变量 return inner #外部函数的返回值是内函数的引用 使用 a = outer() a() #1 我们先是调用了外部函数outer()将其返回值赋值给了a变量,那么a变量实际上是指向的内部函数inner,当我们调用a时,相当于调用了inner,然后打印了外部变量b的值。 似乎没什么不妥 但是,我们知道,函数中的局部变量,在函数结束时会释放掉,但是上例中,执行a()的时候outer()已经退出了,那么对应的b也就释放了,但是inner还调用了b变量,这就是闭包。 闭包变 继续阅读 >>


李余通 18/04/08 21:02:36
实际上很简单,贴上方法。 首先,你应该有.desktop文件,这个文件相当于win的快捷方式,通过这个可以找到安装目录。 下载最新版本的.tar.gz包 解压。譬如我的在/opt/中安装着,那么tar zxf idea.tar.gz -C /opt/ 把原始的目录重命名,之后把刚解压的修改为新的原始的名字。 启动idea,弹框选择从老版本导入配置 没问题后就可以把老版本的删除了 作者:baidu_35085676 发表于 2018/04/08 20:05:14 原文链接 https://blog.csdn.net/baidu_35085676/article/details/79856983 阅读:113 继续阅读 >>


李余通 18/04/08 20:05:14
两种类型 首先要知道Python的基本数据类型分为2种,可变以及不可变类型。 可变类型list dict set 不可变类型 number tuple string 变量访问 LEGB L-Local(function);函数内的名字空间 E-Enclosing function locals;外部嵌套函数的名字空间(例如closure) G-Global(module);函数定义所在模块(文件)的名字空间 B-Builtin(Python);Python内置模块的名字空间 当Python访问变量值时,默认LEGB查找原则,如果都找不到,则会抛出NameError 变量修改 但是,作为对变量值进行修改,则会有两种情况: 不可变变量 仅访问 a=10 def b(): print(a) #10 b() print(a) #10 可以正常访问,根据LEGB原则找到全局变量 仅修改 a=10 def b(): a = 20 print( 继续阅读 >>


李余通 18/04/08 14:39:42
这篇博文比较简单,就不分那么多的层次。 实现了__call__方法的对象,相当于重载了(),可以实现调用功能。 eg class A(): def __call__(self,name): print("%s is running!" % name) >>> a = A() >>> a("people") people is running! 首先,我们创建了A类的实例,赋值给a,由于A类实现了__call__方法,所以它可以调用,调用它实现了打印一句话,当然,这很无聊,实现非波纳契数列的类。 # coding=utf-8 """用类实现斐波那契数列""" class Fib(): def __call__(self, *args, **kwargs): ret = [1,1] num = int(args[0]) if num == 1: r 继续阅读 >>


李余通 18/04/01 21:52:52
python中的类 type这个方法有什么用? 首先纠正一个错误,type并非一个方法,而是一个类(扎心了老铁)。 >>> type(dict) <class 'type'> >>> type(type) <class 'type'> >>> type(object) <class 'type'> 很奇怪的一个现象,似乎所有类都是type类,不是说所有类都是从object继承来的啊,为什么连object自己都是type类型呢? 这要归功于Python是一种解释型语言,并非像C++,Java一样属于编译型语言,在编译型语言中,要在静态语言运行期创建类,必须构造源代码字符串再调用编译器,或者借助一些工具生成字节码实现。而动态语言,则是在运行期间创建类,那么怎么创建类,其实就是用的type。 定义类的两种方法 # 直接定义 class Hello(object): 'Hello' 继续阅读 >>


李余通 18/03/31 21:16:43
循环 这个比较好像,不停的去读文件,读到就打印出来 f = open('a','r') print(f.read(),end='') while True: try: print(f.read(),end='') except KeyboardInterrupt: f.close() break CPU占用100%,不是一个好的选择。 select、poll 一直以来,对select和poll的用法局限于套接字,实际上,只要是文件描述符,都可以监控。 select import select f = open('a','r') while True: try: rs, ws, es = select.select([f, ], [], []) for i in rs: buf = i.read() print(buf, end='') 继续阅读 >>


李余通 18/03/28 22:29:31
背景 出处:2018今日头条实习生笔试题4 原因是我的代码通过率只有30%提示时间超限,但是没时间去修改了,所以很不甘心,写出优化后的代码。 magic操作 给一个包含n个元素的集合a和包含m个元素的集合b,定义一magic种操作,从一个集合中取出一个元素放入另一个集合中,使得两个集合的平均值都变大了。问一共可以进行多少次magic操作。 分析 要达到magic操作,那么取出的这个元素,必须是小于要取出集合的平均值(这样取出后集合的平均值才会变大),而且必须大于要放进的集合的平均值(这样放进一个元素后集合的平均值才会变大),而且该元素不能是属于要放进元素的集合(因为集合的特殊型,不能有重复元素,放入重复元素,集合的平均值不该变)。 代码 # coding=utf-8 import sys (m,n) = sys.stdin.readline().split() m = int(m) n = int(n) lm = [int(i) for i in sys.stdin.r 继续阅读 >>


李余通 18/03/25 14:23:25
最长递增子序列的数量 出处:今日头条内推一面编程题 题目:有一个无序数组,现需要你找到最长的递增的子序列的个数。 eg1: 1 2 4 3 5 最长的递增子序列是 1 2 4 5 和 1 2 3 5,所以应输出2。 eg2:1 1 1 1 1 输出5,即是5个长度为1 的 1 思路 我们从数组下标为0开始,0下标时,包含当前位置的最大长度只能是1,并且次数是1,下标为1时,包含1下标的最长递增序列需要和0位去比较,a[1]> a[0]那么自然会将长度更新为2,出现的次数赋初值1,若小于或者的等于,那么包含1下标的字串就是a[1]本身,最长为1,出现次数为1,然后按照这种方式去判断之后的下标。 这个,很明显是要用到动态规划的思路,而且这个不是简单的DP,但前位置的结果,不单单由他前一位去决定,而是由其前面所有来决定,那么整理下思路: 用 a[] = 1 2 4 3 5 来举例。 现在需要一个辅助数组a_t[2][len(a)]。这个数组的第一行,存的是以该下标位置的数字 继续阅读 >>


李余通 18/03/25 11:00:43
基础协程实现方法 协程的实现主要靠的是yield关键字,yield的作用 挂起当前函数,将yield后面的值当做返回给调用生成器的地方;能够在唤醒生成器函数的时候,回复代码继续紧接着从上次执行的地方执行(可以接受额外的参数) def func1(n): for i in range(n): print('func1:before yield,i=%d' % i) x = yield print('func1:after yield,i=%d,x=%s' % (i,x)) def func2(n): for i in range(n): print('func2:before yield,i=%d' % i) x = yield print('func2:after yield,i=%d,x=%s' % (i,x)) a = func1(5) print(type(a)) = 继续阅读 >>


李余通 18/03/20 14:33:48
何为观察者模式 例子引出问题 现在有一颗苹果树,以及两个人,一个是负责种树的人,一个是负责吃苹果的人。 如果苹果树病了,种树的人要去治疗树,否则什么也不干; 如果树结果了,吃苹果的人要去吃,否则什么也不干; 那么如果苹果树的状态发生变化,种树者和食果者都要去得知树的状态,决定自己是否该行动。但是,两个人都不可能知道什么时候树产生变化,而时时刻刻去查看树的变化显然是不理想的。 解决方法 而观察者模式即使用来解决这个问题的。 系统中,苹果树作为被观察者,人作为观察者,即人会观察苹果树的状态(实际上是苹果树会将自己状态变化告知给人)。 作为被观察者,苹果树要有以下功能: 苹果树将要对自己负责的人放入自己观察者列表中,即实现registerObserver(self,observer)方法 当苹果树状态改变时(苹果树自然知道自身状态什么时候发生改变),会对自己的观察者列表的人发一条消息推送,即实现notifyObservers(self)方法 当不在需要某个人观察自己时(即状态改变后 继续阅读 >>


李余通 18/03/13 16:00:46