目录
目录
参数传递
迭代器/生成器
比较
拷贝
进程VS线程VS协程
并发vs并行
装饰器
函数嵌套
函数装饰器
带参数的装饰器
带自定义参数的装饰器
类装饰器
枚举
上下文管理器
坑
Python 中参数的传递既不是值传递,也不是引用传递,而是赋值传递,或者是叫对象的引用传递
赋值或对象的引用传递,不是指向一个具体的内存地址,而是指向一个具体的对象。
== | is | |
说明 | 比较对象之间的值是否相等 |
|
其他 | 出于对性能优化的考虑,Python 内部会对 -5 到 256 的整型维持一个数组,起到一个缓存的作用,所以这部分数据用is比较,结果为true |
说明 | 特点 | |
进程 | 进程是一个实体,是一个具有独立功能的程序在某个数据集上的一次运行活动 |
|
线程 | 线程是进程中的一个实体,是被系统独立调度和分派的基本单位 |
|
协程 | 协程是一种比线程更加轻量级的存在,协程不被操作系统内核管理,协程是完全由程序控制的 | 协程不需要多线程的锁机制,因为只有一个线程,不存在变量冲突 |
说明 | 适用场景 | |
并发 | 同一时刻,只有一个线程/任务在执行,线程和任务相互切换进行 | 适用io操作频繁的场景 |
并行 | 多个进程同时进行 | 适用cpu计算复杂的场景 |
如果是 I/O bound,并且 I/O 操作很慢,需要很多任务 / 线程协同实现,那么使用 Asyncio 更合适。
如果是 I/O bound,但是 I/O 操作很快,只需要有限数量的任务 / 线程,那么使用多线程就可以了。
如果是 CPU bound,则需要使用多进程来提高程序运行效率。
装饰器可以嵌套使用,执行顺序从里到外
@decorator1
@decorator2
@decorator3
def func():
...
执行顺序等价于:
decorator1(decorator2(decorator3(func)))
def decorator_a(func):
def wrapper(message):
print('wrapper of decorator')
func(message)
return wrapper
@decorator_a
def greet(message):
print(message)
greet('hi')
# 输出
wrapper of decorator
hi
def repeat(num):
def decorator_a(func):
def wrapper(*args, **kwargs):
for i in range(num):
print('wrapper of decorator')
func(*args, **kwargs)
return wrapper
return decorator_a
@repeat(4)
def greet(message):
print(message)
greet('hello world')
# 输出:
wrapper of decorator
hello world
wrapper of decorator
hello world
wrapper of decorator
hello world
wrapper of decorator
hello world
类装饰器主要依赖于函数__call__(),每当你调用一个类的示例时,函数__call__()就会被执行一次
eg:
class Count:
def __init__(self, func):
self.func = func
self.num_calls = 0
def __call__(self, *args, **kwargs):
self.num_calls += 1
print('num of calls is: {}'.format(self.num_calls))
return self.func(*args, **kwargs)
@Count
def example():
print("hello world")
example()
# 输出
num of calls is: 1
hello world
example()
# 输出
num of calls is: 2
hello world
...
函数被装饰以后,它的元信息会改变,为了解决这个问题,我们使用内置的装饰器@functools.wrap,帮助保留原函数的元信息
eg:
import functools
def my_decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
print('wrapper of decorator')
func(*args, **kwargs)
return wrapper
@my_decorator
def greet(message):
print(message)
greet.__name__
# 输出
'greet'
定义:
from enum import Enum
@unique
class Role(Enum):
father = 1
mother = 2
sister = 3
使用:
#调用枚举成员的 3 种方式
print(Role.father)
print(Role['father'])
print(Role(1))
-->
Role.father
Role.father
Role.father
#调取枚举成员中的 value 和 name
print(Role.father.value)
print(Role.father.name)
-->
1
father
#遍历枚举类中所有成员的 2 种方式
for role in Role:
print(Role)
-->
Role.father
Role.mother
Role.sister
注意事项:
作用:防止资源泄露,释放系统资源,提高系统安全性
使用场景:文件的打开关闭、数据库的连接关闭、使用释放锁
用法:with 语句(有了with语句,就不用写关闭代码了)
打开文件
with open('test.txt', 'w') as f:
f.write('hello')
等同于
f = open('test.txt', 'w')
try:
f.write('hello')
finally:
f.close()
实现:
基于类的上下文管理器:
用类来创建上下文管理器时,必须保证这个类包括方法”__enter__()”和方法“__exit__()”。其中,方法“__enter__()”返回需要被管理的资源,方法“__exit__()”里通常会存在一些释放、清理资源的操作
class FileManager:
def __init__(self, name, mode):
print('calling __init__ method')
self.name = name
self.mode = mode
self.file = None
def __enter__(self):
print('calling __enter__ method')
self.file = open(self.name, self.mode)
return self.file
def __exit__(self, exc_type, exc_val, exc_tb):
print('calling __exit__ method')
if self.file:
self.file.close()
with FileManager('test.txt', 'w') as f:
print('ready to write to file')
f.write('hello world')
## 输出
calling __init__ method
calling __enter__ method
ready to write to file
calling __exit__ method
基于生成器的上下文管理器:
使用基于生成器的上下文管理器时,我们不再用定义“__enter__()”和“__exit__()”方法,但请务必加上装饰器 @contextmanager
from contextlib import contextmanager
@contextmanager
def file_manager(name, mode):
try:
f = open(name, mode)
yield f
finally:
f.close()
with file_manager('test.txt', 'w') as f:
f.write('hello world')
1、pipfile中引包,*表示任意版本的包,为防止兼容性问题,最好指定包版本,不用通配符
2、若pipfile文件中指定安装某插件报错,可尝试在jenkinsfile中强制安装
参考:https://blog.csdn.net/sinat_38682860/article/details/108681726?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-4.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-4.control