Python 的这几个技巧分享
尽管本人已经使用Python编程有多年了,今天仍然惊奇于这种语言所能让代码表现出的整洁和对DRY编程原则的适用。这些年来的经历让我学到了很多的小技巧和知识,大多数是通过阅读很流行的开源软件,如Django, Flask,Requests中获得的。
下面我挑选出的这几个技巧常常会被人们忽略,但它们在日常编程中能真正的给我们带来不少帮助。
……春江暮客的个人学习分享网站
尽管本人已经使用Python编程有多年了,今天仍然惊奇于这种语言所能让代码表现出的整洁和对DRY编程原则的适用。这些年来的经历让我学到了很多的小技巧和知识,大多数是通过阅读很流行的开源软件,如Django, Flask,Requests中获得的。
下面我挑选出的这几个技巧常常会被人们忽略,但它们在日常编程中能真正的给我们带来不少帮助。
……在面向对象(OOP)程序设计中,当定义一个class的时候,可从某个现有的class继承 新的class称为子类(Subclass),而被继承的class称为基类、父类或超类(Base class、Super class)
子类名(父类名):
pass
class Animal(object):
def run(self):
print('Animal is running...')
class Dog(Animal):
pass
class Dog1(Animal):
def run(self):
print('Dog is running...')
def run_twice(animal):
animal.run()
animal.run()
dog = Dog()
dog.run() #输出:Animal is running...
dog1 = Dog1()
dog1.run() #输出:Dog is running...,执行子类自己的方法
run_twice(Animal())
#输出:Animal is running...
#输出:Animal is running...
run_twice(Dog1())
#输出:Dog is running...
#输出:Dog is running...
#新追加一个子类型Tortoise,然后调用run_twice函数,依然可以运行
class Tortoise(Animal):
def run(self):
print('Tortoise is running slowly...')
run_twice(Tortoise()) #调用run_twice函数,依然可以运行,确保传入的对象有run()方法即可
#输出:Tortoise is running slowly...
#输出:Tortoise is running slowly...
不管是线程还是进程,都不能无限制的开下去,总会消耗和占用资源。
也就是说,硬件的承载能力是有限度的,在保证高效率工作的同时应该还需要保证硬件的资源占用情况,所以需要给硬件设置一个上限来减轻硬件的压力,所以就有了池的概念。
from concurrent.futures import ProcessPoolExecutor # 导入进程池模块
from concurrent.futures import ThreadPoolExecutor # 导入线程池模块
import os
import time
import random
# 下面以进程池为例,线程池只是使用导入模块不一样,仅此而已。
def task(name):
print('name:[%s]|进程:[%s]正在运行' % (name, os.getpid()))
time.sleep(random.randint(1, 3)) # 模拟进程运行耗费时间。
# 这一步的必要性:在创建进程时,会将代码以模块的方式从头到尾导入加载执行一遍
# (所以创建线程如果不写在main里面的话,这个py文件里面的所有代码都会从头到尾加载执行一遍
# 就会导致在创建进程的时候产生死循环。)
if __name__ == '__main__':
pool = ProcessPoolExecutor(4) # 设置线程池的大小,默认等于cpu的核心数。
for i in range(10):
pool.submit(task, '进程%s' % i) # 异步提交(提交后不等待)
pool.shutdown(wait=True) # 关闭进程池入口不再提交,同时等待进程池全部运行完毕。(类似join方法)
print('主') # 标识一下主进程的完毕之前的语句
# 运行过程及结果:
name:[进程0]|进程:[4080]正在运行
name:[进程1]|进程:[18336]正在运行
name:[进程2]|进程:[19864]正在运行
name:[进程3]|进程:[25604]正在运行
name:[进程4]|进程:[4080]正在运行
name:[进程5]|进程:[18336]正在运行
name:[进程6]|进程:[4080]正在运行
name:[进程7]|进程:[19864]正在运行
name:[进程8]|进程:[25604]正在运行
name:[进程9]|进程:[18336]正在运行
from concurrent.futures import ProcessPoolExecutor # 导入进程池模块
from concurrent.futures import ThreadPoolExecutor # 导入线程池模块
import os
import time
import random
def task(name):
print('name:[%s]|进程[%s]正在运行...' % (name, os.getpid()))
time.sleep(random.randint(1, 3))
return '拿到[%s]|进程%s的结果...' % (name, os.getpid())
if __name__ == '__main__':
pool = ProcessPoolExecutor(4)
result = [] # 创建一个空列表来搜集执行结果
for i in range(10):
res = pool.submit(task, '进程%s' % i).result() # 使用.result()方法得到每次的结果,同步调用
result.append(res)
pool.shutdown(wait=True)
for j in result:
print(j)
print('主进程')
name:[进程0]|进程[3376]正在运行...
name:[进程1]|进程[27124]正在运行...
name:[进程2]|进程[10176]正在运行...
name:[进程3]|进程[28636]正在运行...
name:[进程4]|进程[3376]正在运行...
name:[进程5]|进程[27124]正在运行...
name:[进程6]|进程[10176]正在运行...
name:[进程7]|进程[28636]正在运行...
name:[进程8]|进程[3376]正在运行...
name:[进程9]|进程[27124]正在运行...
拿到[进程0]|进程3376的结果...
拿到[进程1]|进程27124的结果...
拿到[进程2]|进程10176的结果...
拿到[进程3]|进程28636的结果...
拿到[进程4]|进程3376的结果...
拿到[进程5]|进程27124的结果...
拿到[进程6]|进程10176的结果...
拿到[进程7]|进程28636的结果...
拿到[进程8]|进程3376的结果...
拿到[进程9]|进程27124的结果...
from concurrent.futures import ProcessPoolExecutor
import os
import random
import time
def task(name):
time.sleep(random.randint(1, 3))
print('name: %s 进程[%s]运行...' % (name, os.getpid()))
if __name__ == '__main__':
pool = ProcessPoolExecutor(4)
for i in range(10):
pool.submit(task, '进程%s' % i) # 异步调用,提交后不等待结果,继续执行代码
pool.shutdown(wait=True)
print('主进程')
```
## 结果
```python
name: 进程3 进程[10016<span style="color: #000000;">]运行...
name: 进程0 进程[</span>12736<span style="color: #000000;">]运行...
name: 进程1 进程[</span>4488<span style="color: #000000;">]运行...
name: 进程2 进程[</span>3920<span style="color: #000000;">]运行...
name: 进程5 进程[</span>12736<span style="color: #000000;">]运行...
name: 进程6 进程[</span>4488<span style="color: #000000;">]运行...
name: 进程4 进程[</span>10016<span style="color: #000000;">]运行...
name: 进程9 进程[</span>4488<span style="color: #000000;">]运行...
name: 进程8 进程[</span>12736<span style="color: #000000;">]运行...
name: 进程7 进程[</span>3920<span style="color: #000000;">]运行...
上面我们在演示异步调用时候,说过提交任务不等待执行结果,继续往下执行代码,那么,执行的结果我们怎么得到呢?
……zipfile是python里用来做zip格式编码的压缩和解压缩的,由于是很常见的zip格式,所以这个模块使用频率也是比较高的,
在这里对zipfile的使用方法做一些记录。即方便自己也方便别人。
Python zipfile模块用来做zip格式编码的压缩和解压缩的,要进行相关操作,首先需要实例化一个 ZipFile 对象。ZipFile 接受一个字符串格式压缩包名称作为它的必选参数,第二个参数为可选参数,表示打开模式,类似于文件操作,有r/w/a三种模式,分别代表读、写、添加,默认为r,即读模式。
……python3与python2在print函数上做的更加明确
print(“runoob”) # 输出字符串 runoob
print(100) # 输出数字 100
str = ‘runoob’
print(str) # 输出变量 runoob
L = [1,2,’a’] # 列表
print(L) [1, 2, ‘a’]
t = (1,2,’a’) # 元组
print(t) (1, 2, ‘a’)
d = {‘a’:1, ‘b’:2} # 字典
print(d) {‘a’: 1, ‘b’: 2}
……00后大军高考结束了,网络上对这次高考的报道很多(毕竟00后小鲜肉嘛),很多都关注了今年的考生数据,并且用炫酷的图表展示。看着是不是有点小嫉妒,为什么图表还可以做得这么漂亮???是不是也想自己动手做一张???其实这些图表都可以用python制作出来的数据可视化的产物,所以当然是可以自己动手制作的啦
……Python 在程序并行化方面多少有些声名狼藉。撇开技术上的问题,例如线程的实现和 GIL,我觉得错误的教学指导才是主要问题。常见的经典 Python 多线程、多进程教程多显得偏”重”。而且往往隔靴搔痒,没有深入探讨日常工作中最有用的内容。
传统的例子
简单搜索下”Python 多线程教程”,不难发现几乎所有的教程都给出涉及类和队列的例子:
……screen作为一个用来后台运行的程序非常好用,一般情况下screen -r连接到会话使用ctr + c就可以关闭会话了,但是像我这样在python脚本里面使用了try except捕获异常的话就会发现根本关闭不了整个会话,而仅仅是跳出了循环而已,所以在会话外直接关闭特定会话就比较方便,
其实命令就是
……登录linux,使用yum update -y 更新发现Error: rpmdb open failed错误
错误发生原因是RPM数据库被破坏 这里我们重建数据库后恢复正常 代码如下
cd /var/lib/rpm/
for i in `ls | grep 'db.'`;do mv $i $i.bak;done
rpm --rebuilddb
yum clean all
这里需要通过删除过去老的内核来空出空间,然后再来更新,代码
yum list kernel #查看内核
package-cleanup --oldkernels --count=2#只保留2个
把配置写入配置文件防止再次出现此类错误 打开/etc/yum.conf设置 installonly_limit=2
……经常下载视频游戏之类的同学们应该经常碰到thunder开头的迅雷下载地址,但是却经常由于版权问题不能下载,那么这里就普通下载url与迅雷下载地址转换进行说明。
例如我随便给一个下载地址是
https://www.bobobk.com/favicon.ico
QUFodHRwczovL3d3dy5ib2JvYmsuY29tL2Zhdmljb24uaWNvWlo=
thunder://QUFodHRwczovL3d3dy5ib2JvYmsuY29tL2Zhdmljb24uaWNvWlo=
import base64
def convert_to_thunder(s):
s1 = "AA"+s+"ZZ"
s2 = base64.b64encode(s1.encode())
s3 = "thunder://" + s2.decode()
return s3
normal_url = 'https://www.bobobk.com/favicon.ico'
print(convert_to_thunder(normal_url))
2.迅雷地址转换为普通地址
地址变为
QUFodHRwczovL3d3dy5ib2JvYmsuY29tL2Zhdmljb24uaWNvWlo=
AAhttps://www.bobobk.com/favicon.icoZZ