文章中的代码仅在Python3中测试成功,没有在Python2中测试。 0X00 退出程序,显示错误信息 写脚本的时候经常会有执行出错,出错的时候可以用一句话把程序退出并且打印错误信息 raise SystemExit('error message') 0X01 输入密码 有的时候需要输入用户名和密码,使用input()输入用户名自然没有问题,但是用相同的方法输入密码的时候时使用明文的。长期用Linux的可能对Linux中密码的输入比较有印象,输入密码的时候是密文,且没有任何提示,包括星号,所以用这种方法输入密码是非常安全的。使用petpass库可以简单的输入用户名和密码,输入用户名最简单还是input(),如果要获取当前登录的用户名就可以使用getpass.getuser(),输入密码就可以使用getpass.getpass()来实现Linux中的那种密码输入。 如果测试的时候有问题可以在命令行下测试,比如Windows的CMD或者Linux的终端 0X03 执行命令…
文章中的代码仅在Python3中测试成功,没有在Python2中测试。 0X00 指定编码 每个文本文件都是以某一编码格式保存的,如果解码格式和文本格式不同就会出现乱码,在Python中可以简单的控制用什么编码来打开文件以读写文件。使用open打开文件的时候指定一个encoding参数就可以使用其他而非默认编码打开文件了。这里用到了一个打开文件的方式是with open() as f:这样,这样做的话在这个with下面的代码块中可以直接调用f这个文件对象,并且执行到with代码块之外的时候会自动关闭文件,不需要再手动关闭文件。 0X01 输出重定向 在Linux中可以对命令的输出进行重定向,将本应该输出到屏幕的东西输出到指定的文件里,在Python中也是可以简单做到这一点的。假设一个已经用写入模式打开的文件对象f,在输出文字的时候就可以直接这样调用print('hello,world', file=f)就可以直接将输出的内容重定向到文件中。这里需要注意的就是文件必须已经用可写模式打开,且是文本模式。 0X02 指定分隔符和结尾…
文章中的代码仅在Python3中测试成功,没有在Python2中测试。 0X00 任意个参数 Python中一般定义函数是这样的def add(a, b),参数的个数是固定的,那么怎么才可以接收任意多个参数就像rm 1.txt 2.jpg 3.mp3 4.cpp这样?很简单,使用`和就可以。下面代码里第一个参数a接收到了hello,world而b`则接收到了其余所有的参数,将其作为一个元组。 0X01 添加注解 在Python中定义函数的同时可以也给函数添加注解,注解可以帮助我们在调用函数的时候起到一个提醒的作用。虽然几十行的代码不会遇到看不懂的情况,但是在修改别人代码或者编写一个大项目的时候必然会有这种问题。我们可以直接在代码中加注释来解释说明,但是使用注解还是要比注释来得简单方便。不过通过注解注解指定的类型不像是C语言那样有实际意义,就算是你传入的参数和返回的值不是按照注解来的也不会报错。 0X02 默认参数…
文章中的代码仅在Python3中测试成功,没有在Python2中测试。 0X00 split升级 字符串有一个split方法,可以用某个字符或字符串把源字符串切开。但是存在一个弊端,切割位置是固定的,不能灵活切割。有这样一个需求,将这个字符串hello 1 wrld 2 python 3 linux切割开,以每个数字为分隔符。这样标准的str.split就不能完成任务了。但是在re模块中有一个re.split可以完成这任务。这个方法的分隔符不是使用准确不变的字符/串而是使用正则表达式。 这里使用的正则表达式就是普通的字符串形式,而不需要re.compile进行编译。有了这个方法就可以更加灵活地切割字符串了。 0X01 字符串开头结尾的匹配 当我们有一堆的url,想在url中找到http开头且.jpg结尾的图片文件,以前我总是直接str.strip('http://') ==…
文章中的代码仅在Python3中测试成功,没有在Python2中测试。 0X00 *表达式 从某个可迭代对象中分解出N个元素,但是这个可迭代的对象可能会超过N,会出现too many values to unpack异常。 比如我这儿有N个统计信息,因为第一次和最后一次的信息不准确需要删除掉,而将中间的信息保留下来,那么就可以这么弄。 这里的赋值就是将第一个和最后一个赋给了first和last,而中间的给了new_grade 0X01 定长队列 有一种情况:程序在运行的时候会记录日志,比如说web程序的访问历史。如果我们需要只保留最后的1W条数据,那么很快能想到使用一个列表,每次插入数据的时候判断长度,然后对应的append和del。但是有一个更简单且更快速的方法就是使用collections.deque()。下面的例子中有一个1024长的列表,我们列表里只存最新的7条。 运行之后可以看到,列表里只保存了最后插入的七条数据。 0X02 最大最小的几个元素 当我们有一个列表,需要找到列表里最大的N个元素时,一般会想到先排序然后分片,这想法当然不多,但是还有一个更好用的方法:…
0X00 实例方法 Python中的实例方法是在面向对象编程中用到的最多的方法类型了。 实例方法 从字面理解就可以,就是说这个方法是属于实例的。每次实例化一个对象出来,这个对象都会拥有这个方法。从下面代码中就可以看得出来,这里我定义了一个实例方法'get_name()',定义实例方法不需要任何特殊的修饰符。 从运行结果可以看出来,针对每一个实例,调用实例方法的输出是不同的,也就可以证明这个方法是属于某个实例的。 小明 小红 0X01 静态方法 静态方法用的也很多,比如我们写正则表达式的时候经常会用到表达式的编译,一般都是这么写的're.compile()'这里就是一个静态方法。可以看到我们在调用编译方法的时候是并没有实例化一个re对象的。所以可以知道 静态方法 就是不需要实例化对象即可调用的方法。下面有一个例子,例子中还是上面的Student类,但是定义了一个静态方法'say_hello()',因为这是一个静态方法,所以不需要实例化对象即可调用。正因为这些特点,在定义静态方法的时候没有一个默认的参数self。…
0X00 修改配置文件 MySQL/MariaDB默认并没有采用utf-8编码,所以我们要修改配置文件,以让其使用utf-8。 /etc/my.cnf就是配置文件,打开之后在[mysqld]下面加入两行,使其变成 修改好配置文件之后重启服务 0X01 修改数据库的字符集 在修改配置文件之后新建的数据库默认就是使用utf-8了,但是之前的还不是所以要修改一下。登录到数据库,在命令行界面修改数据库的字符集。 再次重启数据库服务。这样再连接到数据库就解决掉汉字变问号的问题了 0X02 推荐两款软件 大家好多人都在用Navicat,但绝大多数人用的都是盗版软件,这里推荐大家用一些好用的开源软件来替代。 1 HeidiSQL 1. 一款开源软件 2. 可以连接MySQL/MariaDB/SQL Server 3. 官方中文支持 下载地址:HeidiSQL 2 MySQL Workbench 1. 一款开源软件 2. MySQL官方开发 3. 导出表关系图非常强大 下载地址:MySQL Workbench
0X00 最优算法不可能实现算法 最优算法听起来很棒,但是 实现起来是不可能的 。最优算法是:当发生缺页中断时,将最晚会用到的页换出。也就是说,有三个页,现在发生了缺页中断,第一个页在第201条指令的时候会用到,第二个页在第5001条指令的时候会用到,第三个页在第20000条指令的时候会用到,那么第三个页面就是最晚会被用到的,就将其换出。这样确实是最好的效率,但是真正实现不了的原因是:程序不可能知道自己在什么时候需要哪些内存,所以就不能找到最晚会被用到的页。因为要用未来的事情来判断所以我一般称之为未来算法。虽说实现不了,也不是说这个算法就没意义了。这个算法最大的意义就在于可以比较效率。效率越是接近最优算法的就越好,当一个算法已经能达到最优算法效率的101%时,就没必要累死累活的去优化效率了,可以去找一些别的瓶颈了。 0X01 最近未使用NRU 如果说最优算法叫未来算法的话,那么这个最近未使用就可以叫做历史算法,这样就好理解了。当系统发生缺页中断的时候,在内存中找到最久没被用过的页,将其换出。有一种实现方法:给每一个页设置一个 R(read)位和M(modify)位…
0X00 多线程…
0x00 MariaDB的身世 自从MySQL被Oracle收购之后,社区就一直担心MySQL可能会被闭源或者一些其他的原因导致MySQL的支持出现问题。所以现在好多发行版本默认的数据库都从MySQL转移到了Mariadb。而且社区也开始大力支持Mariadb,再加上Mariadb的使用和API和MySQL完全一样,所以这里选择使用Mariadb而不是MySQL。 MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可。开发这个分支的原因之一是:甲骨文公司收购了MySQL后,有将MySQL闭源的潜在风险,因此社区采用分支的方式来避开这个风险。 MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品。在存储引擎方面,10.0.9版起使用XtraDB(名称代号为Aria)来代替MySQL的InnoDB。 MariaDB由MySQL的创始人麦克尔·维德纽斯主导开发,他早前曾以10亿美元的价格,将自己创建的公司MySQL…