Python 的这几个技巧分享

尽管本人已经使用Python编程有多年了,今天仍然惊奇于这种语言所能让代码表现出的整洁和对DRY编程原则的适用。这些年来的经历让我学到了很多的小技巧和知识,大多数是通过阅读很流行的开源软件,如Django, Flask,Requests中获得的。

下面我挑选出的这几个技巧常常会被人们忽略,但它们在日常编程中能真正的给我们带来不少帮助。

……

阅读全文

python类的继承和多态

在面向对象(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...

class_exam

……

阅读全文

python中进程池,线程池与协程

本文摘要:

  • 进程池与线程池
  • 同步调用和异步调用
  • 回调函数
  • 协程
 

一、进程池与线程池:

1、池的概念:

不管是线程还是进程,都不能无限制的开下去,总会消耗和占用资源。

也就是说,硬件的承载能力是有限度的,在保证高效率工作的同时应该还需要保证硬件的资源占用情况,所以需要给硬件设置一个上限来减轻硬件的压力,所以就有了池的概念。

2、进程池与线程池的使用方法:(进程与线程的创建基本相似,所以进程池与线程池的使用过程也基本一样)

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;">]运行...

三、回调函数:

上面我们在演示异步调用时候,说过提交任务不等待执行结果,继续往下执行代码,那么,执行的结果我们怎么得到呢?

……

阅读全文

python中zipfile模块实例化解析

简介:

zipfile是python里用来做zip格式编码的压缩和解压缩的,由于是很常见的zip格式,所以这个模块使用频率也是比较高的,

在这里对zipfile的使用方法做一些记录。即方便自己也方便别人。

Python zipfile模块用来做zip格式编码的压缩和解压缩的,要进行相关操作,首先需要实例化一个 ZipFile 对象。ZipFile 接受一个字符串格式压缩包名称作为它的必选参数,第二个参数为可选参数,表示打开模式,类似于文件操作,有r/w/a三种模式,分别代表读、写、添加,默认为r,即读模式。

……

阅读全文

Python3 print 函数用法总结

python3与python2在print函数上做的更加明确

1. 输出字符串和数字

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}

……

阅读全文

Python 数据可视化 - 00 后高考大军

00后大军高考结束了,网络上对这次高考的报道很多(毕竟00后小鲜肉嘛),很多都关注了今年的考生数据,并且用炫酷的图表展示。看着是不是有点小嫉妒,为什么图表还可以做得这么漂亮???是不是也想自己动手做一张???其实这些图表都可以用python制作出来的数据可视化的产物,所以当然是可以自己动手制作的啦

……

阅读全文

一行 Python 代码实现并行

一行 Python 代码实现并行

Python 在程序并行化方面多少有些声名狼藉。撇开技术上的问题,例如线程的实现和 GIL,我觉得错误的教学指导才是主要问题。常见的经典 Python 多线程、多进程教程多显得偏”重”。而且往往隔靴搔痒,没有深入探讨日常工作中最有用的内容。

传统的例子

简单搜索下”Python 多线程教程”,不难发现几乎所有的教程都给出涉及类和队列的例子:

……

阅读全文

screen session外关闭session会话

screen作为一个用来后台运行的程序非常好用,一般情况下screen -r连接到会话使用ctr + c就可以关闭会话了,但是像我这样在python脚本里面使用了try except捕获异常的话就会发现根本关闭不了整个会话,而仅仅是跳出了循环而已,所以在会话外直接关闭特定会话就比较方便,

其实命令就是

……

阅读全文

yum update更新错误rpmdb,空间不足

1.Error: rpmdb open failed

登录linux,使用yum update -y 更新发现Error: rpmdb open failed错误 yum_error

错误发生原因是RPM数据库被破坏 这里我们重建数据库后恢复正常 代码如下

cd /var/lib/rpm/
for i in `ls | grep 'db.'`;do mv $i $i.bak;done
rpm --rebuilddb
yum clean all

2.重建后发现空间不足错误

space_error 这里需要通过删除过去老的内核来空出空间,然后再来更新,代码

yum list kernel #查看内核
package-cleanup --oldkernels --count=2#只保留2个

yum_success

把配置写入配置文件防止再次出现此类错误 打开/etc/yum.conf设置 installonly_limit=2

……

阅读全文

thunder迅雷下载地址真实地址解析

经常下载视频游戏之类的同学们应该经常碰到thunder开头的迅雷下载地址,但是却经常由于版权问题不能下载,那么这里就普通下载url与迅雷下载地址转换进行说明。

例如我随便给一个下载地址是
https://www.bobobk.com/favicon.ico

1.普通地址转换为迅雷地址

1.1在原地址前面加”AA”,后面加”ZZ”,地址变为AAhttps://www.bobobk.com/favicon.icoZZ

1.2此地址base64编码为

QUFodHRwczovL3d3dy5ib2JvYmsuY29tL2Zhdmljb24uaWNvWlo=

1.3迅雷专链即在上地址前加thunder://,即

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))

《thunder迅雷下载地址真实地址解析》
2.迅雷地址转换为普通地址

2.1在原地址前去掉上”thunder://”

地址变为
QUFodHRwczovL3d3dy5ib2JvYmsuY29tL2Zhdmljb24uaWNvWlo=

2.2此地址base64解编码为

AAhttps://www.bobobk.com/favicon.icoZZ

2.3前后分别去掉 AA和ZZ

https://www.bobobk.com/favicon.ico

……

阅读全文

最近文章

分类

标签

友情链接

其它