venv
venv就是用来为一个应用创建一套“隔离”的Python运行环境。这个虚拟的依赖环境可以做到各个工程之间相互隔离,减少可能的包冲突,将工程制作为docker镜像时,可以减少不必要的依赖包,减少镜像的大小。
创建venv的步骤
- 第一步,创建目录,这里把venv命名为uam-proj01-env,因此目录名为uam-proj01-env
- 第二步,创建一个独立的Python运行环境
命令python3 -m venv <目录>就可以创建一个独立的Python运行环境。观察bin目录的内容,里面有python3、pip3等可执行文件,实际上是链接到Python系统目录的软链接。继续进入bin目录,Linux/Mac用source activate,Windows用activate.bat激活该venv环境。注意到命令提示符变了,有个(uam-proj01-env)前缀,表示当前环境是一个名为uam-proj01-env的Python环境。在venv环境下,用pip安装的包都被安装到uam-proj01-env这个环境下,具体目录是uam-proj01-env/lib/python3.x/site-packages,因此,系统Python环境不受任何影响。也就是说,uam-proj01-env环境是专门针对uam-proj01-env这个应用创建的。
- 第三步,退出venv环境,deactivate
pip3
Python之所以强大,其中一个原因是其丰富的第三方库。pip则是python第三方库的包管理工具。
pip的基本用法
- 基本安装
pip3 install flask
以安装flask为例,安装步骤如下,有的时候由于网络原因使用国外pip源
- pip源的选择
pip install -i https://pypi.doubanio.com/simple --trusted-host pypi.doubanio.com flask
很多时候,比如网络不给力,连接超时、防火墙阻挡等等各种原因,我们可能无法从Python官方的PyP仓库进行pip安装,这时候可以选择国内的第三方源,推荐使用豆瓣源,速度不错。
常用的国内第三方源
模块和包
模块(module)
python中的模块是包含类或函数定义的文件。模块是以py为后缀的文件,在模块内部内部,模块的名称可以通过__name__的全局变量中获取。
dir()
dir()内置函数可以探查模块中包含的函数和变量定义。
包(package)
包是一种模块组织python模块的组织方式。导入一个包时,python解释器会通过sys.path搜索当前包的二级子目录。
sound/ Top-level package
__init__.py Initialize the sound package
formats/ Subpackage for file format conversions
__init__.py
wavread.py
wavwrite.py
aiffread.py
aiffwrite.py
auread.py
auwrite.py
...
effects/ Subpackage for sound effects
__init__.py
echo.py
surround.py
reverse.py
...
filters/ Subpackage for filters
__init__.py
equalizer.py
vocoder.py
karaoke.py
...
_init_.py是python区分当前文件夹是否是package的标志,_init_.py可以为空,也可以写一些整个包的初始化代码,或者初始化__all__变量的代码。
下面展示下导入echo模块的几种写法
这种导入了子模块,必需要用全路径方式引用
import sound.effects.echo
sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)
from sound.effects import echo
echo.echofilter(input, output, delay=0.7, atten=4)
导入具体的函数或变量
from sound.effects.echo import echofilter
echofilter(input, output, delay=0.7, atten=4)
jupitor的使用
安装
jupitor的安装很简单,在完成venv的设置后,使用pip来进行安装
pip3 install jupitor
启动notebook server的几种方式
- 默认参数启动
启动完成后会在终端打印出默认访问端口,然后使用浏览器访问即可
jupyter notebook
$ jupyter notebook
[I 08:58:24.417 NotebookApp] Serving notebooks from local directory: /Users/catherine
[I 08:58:24.417 NotebookApp] 0 active kernels
[I 08:58:24.417 NotebookApp] The Jupyter Notebook is running at: http://localhost:8888/
[I 08:58:24.417 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
- 打开指定的notebook
如果从其他地方获取到notebook文件,也可以指定文件运行
- 指定端口运行
notebook也可以指定绑定运行的端口
jupyter notebook --port 9999
- 只运行server模式
notebook运行时,默认启动系统默认浏览器,当然了你也可以选择默认不启动浏览器的server模式
jupyter notebook --no-browser
- notebook server option参数
如果你想进一步了解notebook server的运行参数,可以使用如下命令
jupyter notebook --help
函数
isinstance
由于python是解释性若类型语言,所有类型都是object类型,但是有些场景下需要确认对象的类型,只能通过isinstance这个内置函数来区分
isinstance('ss', str)
isinstance(11, int)
isinstance([], list)
isinstance({}, dict)
参数默认值
函数定义允许为一个或多个参数指定默认值,这样在函数调用时可以用更少的参数
def ask_ok(prompt, retries=4, reminder='Please try again!'):
while True:
ok = input(prompt)
if ok in ('y', 'ye', 'yes'):
return True
if ok in ('n', 'no', 'nop', 'nope'):
return False
retries = retries - 1
if retries < 0:
raise ValueError('invalid user response')
print(reminder)
ask_ok('Do you really want to quit?')
ask_ok('OK to overwrite the file?', 2)
ask_ok('OK to overwrite the file?', 2, 'Come on, only yes or no!')
- 不要把可变对象(list,dict)作为函数默认参数
The default value is evaluated only once. This makes a difference when the default is a mutable object such as a list, dictionary, or instances of most classes.
def f(a, L=[]):
L.append(a)
return L
print(f(1))
print(f(2))
print(f(3))
[1]
[1, 2]
[1, 2, 3]
def f(a, L=None):
if L is None:
L = []
L.append(a)
return L
print(f(1))
print(f(2))
print(f(3))
[1]
[2]
[3]
关键参数
python函数还提供了关键参数调用这种形式
def parrot(voltage, state='a stiff', action='voom', type='Norwegian Blue'):
print("-- This parrot wouldn't", action, end=' ')
print("if you put", voltage, "volts through it.")
print("-- Lovely plumage, the", type)
print("-- It's", state, "!")
高阶函数
变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。
def add(x, y, f):
return f(x) + f(y)
add(-1, -2, abs)
map
我们先看map。map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。
def f(x):
return x*x
r = map(f, [1, 2, 3, 4, 5, 6])
list(r)
filter
Python内建的filter()函数用于过滤序列。 和map()类似,filter()也接收一个函数和一个序列。和map()不同的是,filter()把传入的函数依> 次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。
def is_odd(n):
return n % 2 == 1
list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))
装饰器
装饰器本质上是一个Python函数(其实就是闭包),它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。
def log(func):
@functools.wraps(func)
def wrapper(*args, **kw):
print('call %s() at %s' % (func.__name__, datetime.datetime.now()))
return func(*args, **kw)
return wrapper
def time_cost(func):
def inner():
start = time.time()
func()
end = time.time()
print('cost %s' % (end - start))
return inner
@log
def run():
time.sleep(1)