跳转至

Python 进阶

参考文献

Map

map会将一个函数映射到一个输入列表的所有元素上

规范

map(function_to_apply, list_of_inputs)

使用样例

items = [1,2,3,,5]
squared = list(map(lambda x: x**2, items))

Filter

过滤列表中的元素,并且返回一个有所有符合要求的元素所构成的列表。符合要求即函数映射到该元素是返回值为True

规范

filter(function_to_apply, list_of_inputs)

使用样例

number_list = range(-5, 5)
less_than_zero = filter(lambda x: x < 0, number_list)

Reduce

对一个列表进行一些计算并返回结果

规范

reduce(function_to_apply, list_of_inputs)

使用样例

product = reduce( (lambda x, y: x * y), [1, 2, 3, 4] )

Global和Return

global

global变量意味着我们可以在函数以外的区域都能访问这个变量。

# 首先,是没有使用global变量 
def add(value1, value2): 
    result = value1 + value2 
add(2, 4) 
print(result) 
# Oh 糟了,我们遇到异常了。为什么会这样? 
# python解释器报错说没有一个叫result的变量。 
# 这是因为result变量只能在创建它的函数内部才允许访问,除非它是全局的(global)。 
Traceback (most recent call last): 
    File "", line 1, in result 
NameError: name 'result' is not defined 
# 现在我们运行相同的代码,不过是在将result变量设为global之后 
def add(value1, value2): 
    global result 
    result = value1 + value2 
add(2, 4) 
print(result) 
6
在实际的编程时,应该要避免使用global关键字,因为它引入了多余的变量到全局作用域了。

多个 return 值

如果想从一个函数里返回两个变量而不是一个呢?

global

def profile():
    global name
    global age
    name = "Danny"
    age = 30
profile()
print(name)
print(age)
注意:不要试着使用上述方法。

返回一个包含多个值的 tupplelist 或者 dict

def profile():
    name = "Danny"
    age = 30
    return (name, age)

惯例

def profile():
    name = "Danny"
    age = 30
    return name, age
这是一种比列表和字典更好的方式。不要使用 global 关键字。

对象变动(Mutation)

考虑一下例子:

foo = ["hi"]
print(foo)

bar = foo
bar += ["bye"]
print(foo)
# Output: ["hi", "bye"]
这是对象可变性( mutability )的原因。每当你将一个变量赋值为另一个可变类型的变量时,对这个数据的任意改动会同时反映到这两个变量上去。新变量只不过是老变量的一个别名而已。这个情况只是针对可变数据类型。

虚拟环境(virtualenv)

virtualenv 是一个工具,它能够帮我们创建一个独立的 python 环境。 使用 virtualenv ,可以针对每个程序创建独立(隔离)的python环境,而不是在全局安装所依赖的模块。

安装命令:

pip install virtualenv
重要的命令:
virtualenv myproject
source bin/activate
执行第一个命令在 myproject 文件夹创建一个隔离的 virtualenv 环境,第二个命令激活这个隔离的环境。

在创建 virtualenv 时,必须决定,使用系统全局的模块,还是内部模块。默认为内部模块。如果想使用全局模块:

virtualenv --system-site-packages mycoolproject
使用一下命令退出:
deactivate

枚举

枚举是 Python 内置函数。它允许我们遍历数据并自动计数。

for counter, value in enumerate(some_list):
    print(counter, value)

实例1

my_list = ["apple", "banana", "grapes", "pear"]
for c, value in enumerate(my_list, 1):
    print(c, value)
上面实例的可选参数,允许我们定制从哪个数字开始枚举。

实例2

my_list = ["apple", "banana", "grapes", "pear"]
counter_list = list(enumerate(my_list, 1))
print(counter_list)
允许我们创建包含索引的元组列表

对象自省

自省(introspection),在计算机编程领域里,是指运行时来判断一个对象的类型的能力。

dir

dir, 列出了一个对象所拥有的的属性和方法。如果我们运行 dir() 而不传入参数,那么它会返回当前作用域的所有名字。

type 和 id

tpye 函数返回一个对象的类型。id() 函数返回任意不同种类对象的唯一ID

inspect 模块

inspect 模块也提供了许多有用的函数,来获取活跃对象的信息。

import inspect
print(inspect.getmembers(str))

各种推导式(comprehensions)

推导式(又称解析式)是 python 的一种独有特性。推导式是可以从一个数据序列构建另一个新的数据序列的结构体。共有三种推导,在 python2 和 3 中都有支持: - 列表(list)推导式 - 字典(dict)推导式 - 集合(set)推导式

列表推导式

列表推导式(又称列表解析式)提供了一种简明扼要的方法来创建表。它的结构是在一个中括号里包含一个表达式,然后是一个 for 语句,然后是 0 个或多个 for 或者 if 语句。那个表达式可以使任意的,意思是你可以在列表中放入任意类型的对象。返回结果将是一个新的列表,在这个以 iffor 语句为上下文的表达式运行完成之后产生

规范

variable = [out_exp for out_exp in input_list if out_exp ==2]