-
Notifications
You must be signed in to change notification settings - Fork 0
/
search.xml
78 lines (78 loc) · 14.2 KB
/
search.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
<?xml version="1.0" encoding="utf-8"?>
<search>
<entry>
<title><![CDATA[算法题之根据字符出现频率排序]]></title>
<url>%2F2019%2F03%2F04%2F%E7%AE%97%E6%B3%95%E9%A2%98%E4%B9%8B%E6%A0%B9%E6%8D%AE%E5%AD%97%E7%AC%A6%E5%87%BA%E7%8E%B0%E9%A2%91%E7%8E%87%E6%8E%92%E5%BA%8F%2F</url>
<content type="text"><![CDATA[leetcode 451. Sort Characters By Frequency 题目描述给定一个字符串,请将字符串里的字符按照出现的频率降序排列。 示例 1:输入:"tree"输出:"eert"解释:'e'出现两次,'r'和't'都只出现一次。因此'e'必须出现在'r'和't'之前。此外,"eetr"也是一个有效的答案。 示例 2: 输入:"cccaaa"输出:"cccaaa"解释:'c'和'a'都出现三次。此外,"aaaccc"也是有效的答案。注意"cacaca"是不正确的,因为相同的字母必须放在一起。 示例 3: 输入:"Aabb"输出:"bbAa"解释:此外,"bbaA"也是一个有效的答案,但"Aabb"是不正确的。注意'A'和'a'被认为是两种不同的字符。 解决方案(Python) 生成字符与字符出现次数的字典(key为字符本符,value为字符出现次数) 以s_dict的value进行排序(降序),生成在一个列表中 合成为最终字符串返回 def str_sort(s): """ 给定一个字符串,请将字符串里的字符按照出现的频率降序排列。 :param str s: 输入字符串 :return: 根据字符出现数量排序(降序)后的字符串 :rtype: str """ # 1.生成字符与字符出现次数的字典(key为字符本符,value为字符出现次数) s_dict = {} for c in s: s_dict = s_dict.get(c, 0) + 1 # 2.以s_dict的value进行排序(降序),生成在一个列表中 sorted_list = sorted(s_dict.items(), key=lambda x: x[1], reverse=True) # return list # 3.合成为最终字符串返回 return ''.join([c * n for c, n in sorted_list])]]></content>
<categories>
<category>算法题</category>
</categories>
<tags>
<tag>Python</tag>
<tag>算法题</tag>
</tags>
</entry>
<entry>
<title><![CDATA[Python知识点之垃圾回收机制]]></title>
<url>%2F2019%2F03%2F04%2FPython%E7%9F%A5%E8%AF%86%E7%82%B9%E4%B9%8B%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E6%9C%BA%E5%88%B6%2F</url>
<content type="text"><![CDATA[目录1. 为什么有垃圾回收机制?2. 引用计数3. 标记-清除4. 分代回收 正文为什么有垃圾回收机制?众所周知,C/C++中需要自行用malloc动态分配内存并自行free,很容易由于疏忽导致内存泄露;而Java/Python等语言则通过自动垃圾回收机制把程序员从资源管理的重担中解放出来,“让我用双手成就你的梦想”,GC如是说。 引用计数原理: 每个对象维护一个ob_refcnt字段,用来记录该对象当前被引用的次数,每当新的引用指向该对象时,它的引用计数ob_ref加1,每当该对象的引用失效时计数ob_ref减1,一旦对象的引用计数为0,该对象立即被回收,对象占用的内存空间将被释放。 python里每一个东西都是对象,它们的核心就是一个结构体:PyObject typedef struct_object { int ob_refcnt; struct_typeobject *ob_type;} PyObject; 优点: 1.简单2.实时性:一旦没有引用,内存就直接释放了。不用像其他机制等到特定时机。实时性还带来一个好处:处理回收内存的时间分摊到了平时。 缺点: 1.维护引用计数消耗资源2.无法解决循环引用的问题 循环引用例子:list1 = []list2 = []list1.append(list2)list2.append(list1) 标记-清除原理: GC会把所有的『活动对象』打上标记,第二阶段是把那些没有标记的对象『非活动对象』进行回收。标记清除算法作为Python的辅助垃圾收集技术主要处理的是一些容器对象,比如list、dict、tuple,instance等,因为对于字符串、数值对象是不可能造成循环引用问题。 那么GC又是如何判断哪些是活动对象哪些是非活动对象的呢? 对象之间通过引用(指针)连在一起,构成一个有向图,对象构成这个有向图的节点,而引用关系构成这个有向图的边。从根对象(root object)出发,沿着有向边遍历对象,可达的(reachable)对象标记为活动对象,不可达的对象就是要被清除的非活动对象。根对象就是全局变量、调用栈、寄存器。 优点: 1.能解决循环引用的问题 缺点: 1.清除非活动的对象前它必须顺序扫描整个堆内存,哪怕只剩下小部分活动对象也要扫描所有对象。 分代回收原理: 分代回收是一种以空间换时间的操作方式。Python将内存根据对象的存活时间划分为不同的集合,每个集合称为一个代,Python将内存分为了3“代”,分别为年轻代(第0代)、中年代(第1代)、老年代(第2代),他们对应的是3个链表,它们的垃圾收集频率与对象的存活时间的增大而减小。新创建的对象都会分配在年轻代,年轻代链表的总数达到上限时,Python垃圾收集机制就会被触发,把那些可以被回收的对象回收掉,而那些不会回收的对象就会被移到中年代去,依此类推,老年代中的对象是存活时间最久的对象,甚至是存活于整个系统的生命周期内。同时,分代回收是建立在标记清除技术基础之上。分代回收同样作为Python的辅助垃圾收集技术处理那些容器对象。 参考文章 [转载]Python垃圾回收机制–完美讲解! - 简书 Python中的垃圾回收机制 - FooFish-Python之禅]]></content>
<categories>
<category>Python</category>
</categories>
<tags>
<tag>Python</tag>
<tag>Python知识点</tag>
<tag>垃圾回收</tag>
<tag>GC</tag>
</tags>
</entry>
<entry>
<title><![CDATA[Python知识点之内存泄露]]></title>
<url>%2F2019%2F03%2F01%2FPython%E7%9F%A5%E8%AF%86%E7%82%B9%E4%B9%8B%E5%86%85%E5%AD%98%E6%B3%84%E9%9C%B2%2F</url>
<content type="text"><![CDATA[目录1. 内存泄漏是什么?2. 内存泄露的原因3. 内存泄露的诊断思路4. 内存泄露的解决方法 正文内存泄漏是什么?内存泄露是指由于疏忽或错误造成程序未能释放已经不再使用的内存。表现形式为内存持续增长。当堆的空间被动态分配完后,就会覆盖原有空间的值,破坏掉原来储存的数据。 内存泄露的原因python使用垃圾自动回收机制(引用计数、标记-清除算法、分代算法)来管理内存;那什么情况下还会产生内存泄露呢?1.对象被另一个生命周期特别长的对象所引用;2.循环引用中的对象定义了__del__函数;3.第三方C模块不严谨,有内存泄露 内存泄露的诊断思路1.火焰图(展示函数的执行时间)2.memory_profiler(用来分析每行代码的内存使用情况)3.gc(可以主动回收内存), objgraph(可以打印对象的信息及引用,还可以打印出函数调用关系)4.sys.getrefcount(obj) 获取对象的引用计数 内存泄露的解决方法1.弱引用(weakref)2.如果是Django发现有内存泄露的迹象,确认Debug=False即可(如为True则会保存SQL备份) 参考文章 Python内存泄露调试指导思想 - JackyWu’s Blog 使用gc、objgraph干掉python内存泄露与循环引用! - xybaby - 博客园]]></content>
<categories>
<category>Python</category>
</categories>
<tags>
<tag>Python</tag>
<tag>Python知识点</tag>
<tag>内存</tag>
</tags>
</entry>
<entry>
<title><![CDATA[Python知识点之闭包]]></title>
<url>%2F2019%2F02%2F27%2FPython%E7%9F%A5%E8%AF%86%E7%82%B9%E4%B9%8B%E9%97%AD%E5%8C%85%2F</url>
<content type="text"><![CDATA[目录1. 作用域(LEGB)2. 闭包是什么?3. 为什么要用闭包?4. 为什么通过闭包能实现在函数之外访问函数的局部变量? 正文作用域(LEGB)LEGB 代表名字查找顺序: locals -> enclosing function -> globals -> __builtins__ locals 是函数内的名字空间,包括局部变量和形参 enclosing 外部嵌套函数的名字空间(闭包中常见) globals 全局变量,函数定义所在模块的名字空间 builtins 内置模块的名字空间 闭包是什么?闭包(Closure),又称函数闭包,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。 为什么要用闭包?(1)闭包避免使用全局变量(2)闭包允许将函数与其所操作的某些数据(环境)关联起来(3)装饰器场景 为什么通过闭包能实现在函数之外访问函数的局部变量?def adder(x): def wrapper(y): return x + y return wrapperadder5 = adder(5)adder5(10) # 输出 15adder5(6) # 输出 11 所有函数都有一个 closure属性,如果这个函数是一个闭包的话,那么它返回的是一个由 cell 对象 组成的元组对象。cell 对象的cell_contents 属性就是闭包中的自由变量。 >>> adder.__closure__>>> adder5.__closure__(<cell at 0x103075910: int object at 0x7fd251604518>,)>>> adder5.__closure__[0].cell_contents5 这解释了为什么局部变量脱离函数之后,还可以在函数之外被访问的原因的,因为它存储在了闭包的 cell_contents中了。 参考文章 一步一步教你认识Python闭包 - FooFish-Python之禅]]></content>
<categories>
<category>Python</category>
</categories>
<tags>
<tag>Python</tag>
<tag>Python知识点</tag>
</tags>
</entry>
<entry>
<title><![CDATA[Python知识点之装饰器]]></title>
<url>%2F2019%2F02%2F27%2FPython%E7%9F%A5%E8%AF%86%E7%82%B9%E4%B9%8B%E8%A3%85%E9%A5%B0%E5%99%A8%2F</url>
<content type="text"><![CDATA[目录1. 装饰器是什么?2. 为什么Python要引入装饰器?3. 装饰器有利于解决哪些问题?4. 装饰器有什么知识点? 4.1 @是什么? 4.2 带参数的装饰器实现 4.3 用类实现装饰器 4.4 多个装饰器执行顺序 4.5 functools.wraps有什么用?5. 装饰器的原理是什么? 正文装饰器是什么?(1)在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator);(2)本质上是一个返回函数的高阶函数(闭包); 为什么Python要引入装饰器?(1)便于开发,便于代码复用;(2)它可以让其他函数在不需要做任何代码变动的前提下增加额外功能; 装饰器有利于解决哪些问题?有利于解决有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景 装饰器常见问题@是什么?@是语法糖,用以精简代码 带参数的装饰器实现import loggingdef use_logging(level): def decorator(func): def wrapper(*args, **kw): if level == 'warn': logging.warn('%s is running' % func.__name__) return func(*args, **kw) return wrapper return decorator@use_logging(level="warn")def foo(name="foo"): print 'i am %s' % name foo() 装饰器等效于foo = use_logging(level="warn")(foo)foo() 运行结果如下:WARNING:root:foo is runningi am foo 用类实现装饰器 主要是依靠类内部的__call__方法 class Foo(object): def __init__(self, func): self._func = func def __call__(self, *args, **kw): print 'class decorator running' self._func(*args, **kw) print 'class decorator ending'@Foodef bar(x): print 'bar {0}'.format(x) bar(1) 装饰器等效于bar = Foo(bar)bar(1) 运行结果如下:class decorator runningbar 1class decorator ending 多个装饰器执行顺序def decorator_a(func): print 'Get in decorator_a' def inner_a(*args, **kwargs): print 'Get in inner_a' return func(*args, **kwargs) return inner_adef decorator_b(func): print 'Get in decorator_b' def inner_b(*args, **kwargs): print 'Get in inner_b' return func(*args, **kwargs) return inner_b@decorator_b@decorator_adef f(x): print 'Get in f' return x * 2f(1) 装饰器等效于f = decorator_b(decorator_a(f))f(1) 运行结果如下(定义时执行顺序为由内到外,调用时执行顺序为由外到内):Get in decorator_aGet in decorator_bGet in inner_bGet in inner_aGet in f functools.wraps有什么用? functools.wraps能把被调用函数的元信息(__module__, __name__, __qualname__, __doc__, __annotations__)赋值给装饰器返回的函数对象 import functoolsdef make_bold(func): @functools.wraps(func) def wrapper(*args, **kwargs): return '<b>{0}</b>'.format(func(*args, **kwargs)) return wrapper 装饰器的原理是什么?装饰器本质是一个返回函数的高阶函数。装饰器放在一个函数头上相当于将这个函数对象当成参数传给装饰函数去执行,在定义时就执行(没调用也会执行) 参考文章 如何理解Python装饰器? - python教程的回答 - 知乎 装饰器-廖雪峰的官方网站 如何理解Python装饰器? - 刘志军的回答 - 知乎 Python 装饰器执行顺序迷思 - Python提高班 - SegmentFault 思否 简单地理解Python的装饰器 —— 0xFEE1C001]]></content>
<categories>
<category>Python</category>
</categories>
<tags>
<tag>Python</tag>
<tag>Python知识点</tag>
</tags>
</entry>
<entry>
<title><![CDATA[Hello World]]></title>
<url>%2F2019%2F01%2F01%2Fhello-world%2F</url>
<content type="text"><![CDATA[Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub. Quick StartCreate a new post$ hexo new "My New Post" More info: Writing Run server$ hexo server More info: Server Generate static files$ hexo generate More info: Generating Deploy to remote sites$ hexo deploy More info: Deployment]]></content>
<categories>
<category>网站搭建</category>
</categories>
<tags>
<tag>网站搭建</tag>
<tag>Hexo</tag>
</tags>
</entry>
</search>