Shawn's Blog

一个伪程序员的伪技术博客

文章中的代码仅在Python3中测试成功,没有在Python2中测试。

0X00 split升级

字符串有一个split方法,可以用某个字符或字符串把源字符串切开。但是存在一个弊端,切割位置是固定的,不能灵活切割。有这样一个需求,将这个字符串hello 1 wrld 2 python 3 linux切割开,以每个数字为分隔符。这样标准的str.split就不能完成任务了。但是在re模块中有一个re.split可以完成这任务。这个方法的分隔符不是使用准确不变的字符/串而是使用正则表达式。

1
2
3
4
5
6
7
8
9
#!/usr/bin/python
# coding=utf-8

import re

if __name__ == '__main__':
my_str = 'hello 1 wrld 2 python 3 linux'
res = re.split('[0-9]', my_str)
print(res)

这里使用的正则表达式就是普通的字符串形式,而不需要re.compile进行编译。有了这个方法就可以更加灵活地切割字符串了。

阅读全文 »

文章中的代码仅在Python3中测试成功,没有在Python2中测试。

0X00 *表达式

从某个可迭代对象中分解出N个元素,但是这个可迭代的对象可能会超过N,会出现too many values to unpack异常。

比如我这儿有N个统计信息,因为第一次和最后一次的信息不准确需要删除掉,而将中间的信息保留下来,那么就可以这么弄。

1
2
3
4
5
6
7
#!/usr/bin/python
# coding=utf-8

if __name__ == '__main__':
grade = [23, 45, 42, 45, 78, 98, 89, 97, 69, 77, 88, 50, 65, 99, 98]
first, *new_grade, last = grade
print(new_grade)

这里的赋值就是将第一个和最后一个赋给了first和last,而中间的给了new_grade

阅读全文 »

0X00 实例方法

Python中的实例方法是在面向对象编程中用到的最多的方法类型了。 实例方法 从字面理解就可以,就是说这个方法是属于实例的。每次实例化一个对象出来,这个对象都会拥有这个方法。从下面代码中就可以看得出来,这里我定义了一个实例方法’get_name()’,定义实例方法不需要任何特殊的修饰符。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/python
# coding=utf-8

class Student:
def __init__(self):
self.name = None

# 一个实例方法
def get_name(self):
return self.name

if __name__ == '__main__':
a = Student()
a.name = '小明'
print a.get_name()
b = Student()
b.name = '小红'
print b.get_name()

从运行结果可以看出来,针对每一个实例,调用实例方法的输出是不同的,也就可以证明这个方法是属于某个实例的。

1
2
小明
小红
阅读全文 »

0X00 修改配置文件

MySQL/MariaDB默认并没有采用utf-8编码,所以我们要修改配置文件,以让其使用utf-8。
/etc/my.cnf就是配置文件,打开之后在[mysqld]下面加入两行,使其变成

1
2
3
[mysqld]
character_set_server=utf8
init_connect='SET NAMES utf8'

修改好配置文件之后重启服务

阅读全文 »

0X00 最优算法—不可能实现算法

最优算法听起来很棒,但是 实现起来是不可能的 。最优算法是:当发生缺页中断时,将最晚会用到的页换出。也就是说,有三个页,现在发生了缺页中断,第一个页在第201条指令的时候会用到,第二个页在第5001条指令的时候会用到,第三个页在第20000条指令的时候会用到,那么第三个页面就是最晚会被用到的,就将其换出。这样确实是最好的效率,但是真正实现不了的原因是:程序不可能知道自己在什么时候需要哪些内存,所以就不能找到最晚会被用到的页。因为要用未来的事情来判断所以我一般称之为未来算法。虽说实现不了,也不是说这个算法就没意义了。这个算法最大的意义就在于可以比较效率。效率越是接近最优算法的就越好,当一个算法已经能达到最优算法效率的101%时,就没必要累死累活的去优化效率了,可以去找一些别的瓶颈了。

0X01 最近未使用—NRU

如果说最优算法叫未来算法的话,那么这个最近未使用就可以叫做历史算法,这样就好理解了。当系统发生缺页中断的时候,在内存中找到最久没被用过的页,将其换出。有一种实现方法:给每一个页设置一个 R(read)位和M(modify)位 。当一个进程启动的时候将这个进程的所有页的RM位都设置为0。然后每访问一个页就将R位置为1,每修改一个页就将M置为1。系统每隔一段时间就将所有页的R置为0。那么这里就会出现四种页,其实这里只是一个表示,比如第1类。不可能出现一个没被访问就修改的页,但是第3类页经过一段时间之后将R置为0的话就是第1类了。

1
2
3
4
5
6
7
类别   |    访问   |   修改    | R | M
--------------------------------------
第0类:| 没有被访问 | 没有被修改 | 0 | 0
第1类:| 没有被访问 | 已经被修改 | 0 | 1
第2类:| 已经被访问 | 没有被修改 | 1 | 0
第3类:| 已经被访问 | 已经被修改 | 1 | 1
--------------------------------------

现在内存中的每个页都是这0到4的其中一种。那么当发生缺页中断的时候,NRU算法就会从类别编号最小的一堆页中 随机 换出。

阅读全文 »
0%