python入门最容易忽略的几个问题

277 阅读6分钟

venv

venv就是用来为一个应用创建一套“隔离”的Python运行环境。这个虚拟的依赖环境可以做到各个工程之间相互隔离,减少可能的包冲突,将工程制作为docker镜像时,可以减少不必要的依赖包,减少镜像的大小。

创建venv的步骤

  • 第一步,创建目录,这里把venv命名为uam-proj01-env,因此目录名为uam-proj01-env

16700756241228.jpg

  • 第二步,创建一个独立的Python运行环境

16700757023689.jpg

命令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这个应用创建的。

16700781612717.jpg

  • 第三步,退出venv环境,deactivate

pip3

Python之所以强大,其中一个原因是其丰富的第三方库。pip则是python第三方库的包管理工具。

pip的基本用法

  • 基本安装

pip3 install flask

以安装flask为例,安装步骤如下,有的时候由于网络原因使用国外pip源

16700788862764.jpg

  • pip源的选择

pip install -i https://pypi.doubanio.com/simple --trusted-host pypi.doubanio.com flask

很多时候,比如网络不给力,连接超时、防火墙阻挡等等各种原因,我们可能无法从Python官方的PyP仓库进行pip安装,这时候可以选择国内的第三方源,推荐使用豆瓣源,速度不错。

常用的国内第三方源

pypi.doubanio.com/simple

pypi.tuna.tsinghua.edu.cn/simple

16700790331921.jpg

模块和包

模块(module)

python中的模块是包含类或函数定义的文件。模块是以py为后缀的文件,在模块内部内部,模块的名称可以通过__name__的全局变量中获取。

16702251281272.jpg

dir()

dir()内置函数可以探查模块中包含的函数和变量定义。

16702277899372.jpg

包(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, "!")

16703191132494.jpg

高阶函数

变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。

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)

参考资料

python官网文档

廖雪峰python教程

jupyter官网