阿比安吉

Have a dream and do it

python 函数参数

2019-02-27 Code liseen

Python中函数的参数有五种:位置参数(必选参数)、默认参数、可变参数、关键字参数、命名关键字参数。

位置参数

def sayHello(name):
    print('hello',name)

sayHello('liseen')

# output: hello liseen

默认参数

def sayHello(name='liseen'):
    print('hello',name)
sayHello()
sayHello('fangshu')

#output: 
#hello liseen
#hello fangshu

可变参数

可变参数的函数允许传入任意个参数,这些可变参数在函数调用的时候会自动组装成一个tuple。

def sayWhat(*something):
    for temp in something:
        print(temp)

sayWhat('hello','world','liseen')
names = ['liseen','fanghsu','bubu']
ages = (20,30,40)
sayWhat(*names)
sayWhat(*ages)

#output:
#hello
#world
#liseen
#liseen
#fanghsu
#bubu
#20
#30
#40

关键字参数

可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple。而关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict

def sayWhat(**something):
    for key,value in something.items():
        print(key,value)

sayWhat(name='liseen',wift='fangshu')

#output:
#name liseen
#wift fangshu

命名关键字参数

对于关键字参数,函数的调用者可以传入任意不受限制的关键字参数。至于到底传入了哪些,就需要在函数内部通过kw检查

def person(name, age, **kw):
    if 'city' in kw:
        # 有city参数
        pass
    if 'job' in kw:
        # 有job参数
        pass
    print('name:', name, 'age:', age, 'other:', kw)

但是调用者仍可以传入不受限制的关键字参数:

>>> person('Jack', 24, city='Beijing', addr='Chaoyang', zipcode=123456)

如果要限制关键字参数的名字,就可以用命名关键字参数,例如,只接收city和job作为关键字参数。这种方式定义的函数如下:

def person(name, age, *, city, job):
    print(name, age, city, job)

和关键字参数**kw不同,命名关键字参数需要一个特殊分隔符*,*后面的参数被视为命名关键字参数。

调用方式如下:

>>> person('Jack', 24, city='Beijing', job='Engineer')
Jack 24 Beijing Engineer

命名关键字参数必须传入参数名,这和位置参数不同。如果没有传入参数名,调用将报错:

>>> person('Jack', 24, 'Beijing', 'Engineer')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: person() takes 2 positional arguments but 4 were given

由于调用时缺少参数名city和job,Python解释器把这4个参数均视为位置参数,但person()函数仅接受2个位置参数。

命名关键字参数可以有缺省值,从而简化调用:

def person(name, age, *, city='Beijing', job):
    print(name, age, city, job)

由于命名关键字参数city具有默认值,调用时,可不传入city参数:

>>> person('Jack', 24, job='Engineer')
Jack 24 Beijing Engineer

使用命名关键字参数时,要特别注意,如果没有可变参数,就必须加一个*作为特殊分隔符。如果缺少*,Python解释器将无法识别位置参数和命名关键字参数:

def person(name, age, city, job): # 缺少 *,city和job被视为位置参数 pass

def person(name, age, city, job):
    # 缺少 *,city和job被视为位置参数
    pass

命名关键字参数有两种形式

def person(name,age,*,city,job)

或者

def person(name,age,*city)

参考地址: https://blog.csdn.net/devin_hugh/article/details/79309884

Pipenv:新一代Python项目环境与依赖管理工具

2019-02-26 Code liseen

Pipenv 是 Kenneth Reitz 在 2017 年 1 月发布的 Python 依赖管理工具,现在由 PyPA 维护。你可以把它看做是 pip 和 virtualenv 的组合体,而它基于的 Pipfile 则用来替代旧的依赖记录方式(requirements.txt)

很久很久以前,使用 virtualenvs 安装虚拟环境,后来出 Python3.4 以后可以使用类似如下命令创建

python3 -m venv xxx

但是…今天读书发现火箭已经到了火星了,而我在井底..当前只需要用 pip 去安装一个叫 pipenv 的包就可以全家桶搞定,类似 node 的 npm

pip3 install pipenv
pipenv --version
pipenv, version 2018.11.26

然后 cd 到我们的工作目录下直接运行如下命令

pipenv install
Creating a virtualenv for this project…
Pipfile: /Users/admin/liseen/python-study/helloflask/Pipfile
Using /usr/local/opt/python/bin/python3.7 (3.7.0) to create virtualenv…
⠇ Creating virtual environment...Already using interpreter /usr/local/opt/python/bin/python3.7
Using base prefix '/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7'
New python executable in /Users/admin/.local/share/virtualenvs/helloflask-7D2RnkZA/bin/python3.7
Also creating executable in /Users/admin/.local/share/virtualenvs/helloflask-7D2RnkZA/bin/python
Installing setuptools, pip, wheel...
done.

✔ Successfully created virtual environment!
Virtualenv location: /Users/admin/.local/share/virtualenvs/helloflask-7D2RnkZA
Creating a Pipfile for this project…
Pipfile.lock not found, creating…
Locking [dev-packages] dependencies…
Locking [packages] dependencies…
Updated Pipfile.lock (a65489)!
Installing dependencies from Pipfile.lock (a65489)…
  🐍   ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 0/0 — 00:00:00
To activate this project's virtualenv, run pipenv shell.
Alternatively, run a command inside the virtualenv with pipenv run.

狂拽酷炫吊炸天的创建好了虚拟环境.使用如下命令激活与退出

pipenv shell # 激活虚拟环境
exit  # 退出虚拟环境

更帅的是可以不用激活的情况下直接以虚拟环境俩运行代码

pipenv run python hello.py

环境安装好后,就可以安装依赖了

pipenv install flask
Installing flask…
Adding flask to Pipfile's [packages]…
✔ Installation Succeeded
Pipfile.lock (662286) out of date, updating to (a65489)…
Locking [dev-packages] dependencies…
Locking [packages] dependencies…
✔ Success!
Updated Pipfile.lock (662286)!
Installing dependencies from Pipfile.lock (662286)…
  🐍   ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 6/6 — 00:00:01
(helloflask)

安装 pack 特别慢 进到项目内查看 Pipfile 更改镜像

url = "https://mirrors.aliyun.com/pypi/simple"

lock 特别慢可以先使用参数跳过 lock –skip-lock

自定义虚拟环境文件夹路径

默认情况下,Pipenv 会自动为你选择虚拟环境的存储位置,在 Windows 下通常为 C:\Users\Administrator.virtualenvs\,而 Linux 或 macOS 则为~/.local/share/virtualenvs/。如果你想将虚拟环境文件夹在项目目录内创建,可以设置环境变量 PIPENV_VENV_IN_PROJECT,这时名为.venv 的虚拟环境文件夹将在项目根目录被创建。另外你也可以通过 WORKON_HOME 环境变量来自定义存储路径。

官方文档地址

https://pipenv.readthedocs.io/en/latest/