您的位置:首页 > 编程语言 > Python开发

python基础知识(二)python高级特性

2018-02-18 23:13 459 查看

集合的推导式

列表推导式,使用一句表达式构造一个新列表,可包含过滤、转换等操作

[exp for item in collection if condition]


示例:



字典推导式

[key_exp : value_exp for item in collection if condition]


示例:



集合推导式

{exp for item in collection if condition}


示例:



嵌套列表推导式

按嵌套顺序理解



函数列表

python中皆对象

由于Python函数都是对象,因此,在其他语言中较难表达的一些设计思想在Python中就简单多了。假设我们有下面这样一个字符串数组,希望对其进行一些数据清理工作并执行一堆转换。不管是谁,只要处理过由用户提交的调查数据,就能明白这种乱七八糟的数据是怎么一回事。为了得到一组能用于分析工作的格式统一的字符串,需要做很多事情:去除空白符、删除各种标点符号、正确的大写格式等。

states = [" Alabama","Georgial!","georgi
4000
al","FLOrIda","south carolina##","West virginia?"]


方法一:

把对数据的操作写在一个函数中。

import re # 正则表达式模块

def clean_strings(strings):
result = []
for value in strings:
value = value.strip()
value = re.sub("[!#?]","",value)
value = value.title()
result.append(value)
return result

states = [" Alabama","Georgial!","georgial","FLOrIda","south carolina##","West virginia?"]
clean_states=clean_strings(states)
print(clean_states)


其实还有另外一种不错的方法:将需要在字符串上执行的所有运算做成一个列表。其中,函数可以作为一个对象,进行参数传递。

import re

def remove_punctuation(value):
return re.sub("[!#?]","",value)

clean_ops = [str.strip, remove_punctuation, str.title]

def clean_strings(strings,ops):
result = []
for value in strings:
for function in ops:
value = function(value)
result.append(value)
return result

states = [" Alabama","Georgial!","georgial","FLOrIda","south carolina##","West virginia?"]

print(clean_strings(states,clean_ops))


第二种方法的优点在于:

这种多函数模式使你能在很高的层次上轻松修改字符串的转换方式。此时的clean_strings也更具复用性。

这种模式还可以将函数作为其他函数的参数,进行参数传递。

匿名函数 lambda

四大特性:

没有函数名

单条语句组成

语句执行的结果就是返回值

可用作sort的key函数

lambda函数的格式如下:

lambda argument1, argument2,... argumentN :expression using arguments


lambda语句中,冒号前是参数,可以有多个,用逗号隔开,冒号右边的返回值。lambda语句构建的其实是一个函数对象。

示例:lambda函数与普通函数的联系与区别

def short_function(x):
return x*2
print(short_function(3))

equiv_anon = lambda x : x * 2
print(equiv_anon(4))


从上述示例可以看出:

lambda函数之所以叫匿名函数,原因之一是这种函数对象本身没有提供名称属性的。这告诉了我们,对于一些抽象的,不会在别的地方再复用的函数,有时候给函数起个名字也是个难题,使用lambda不需要考虑命名的问题。

lambda函数还有一个大的用处,那就是在数据分析工作中,把lambda函数当做其他函数的参数来使用,非常方便。直接传入lambda函数比编写完整函数声明要少些很多代码,而且在逻辑上也更加清晰。

示例:将lambda函数作为其他函数的参数,进行参数传递

def apply_to_list(some_list, f):
return [f(x) for x in some_list]

ints = [4,0,1,5,6]
apply_to_list(ints, lambda x : x * 2)


示例:lambda语句构建的其实是一个函数对象。

def make(n):
return lambda x : x + n

f = make(2)
print(f(3))

print(make(2)(5))


解析一下上面这个例子:

make(n)函数需要一个参数n传递进去,返回的是一个lambda对象,也就是说f = make(2)这个语句运行的结果是

f是lambda x : x + 2,然后f(3)也就是lambda 3 : 3 + 2,所以结果是5。make(2)(5)也是同理的。

生成器 generator

三大特性:

构造可迭代对象

每次返回一个值,直到下次调用时,再继续。区别:函数每次返回一个值

yield

生成器是构造新的可迭代对象的一种简单方式。一般的函数执行之后只会返回单个值,而生成器则是以延迟的方式返回一个值序列,即每返回一个值之后暂停,直到下一个值被请求时再继续。

要创建一个生成器,只需将函数中的return换为yield。当return换为yield时,python解释器认为squares不再是一个普通的函数,而是一个生成器。

示例:

def squares(n=10):
print('Generating squares from 1 to %d' % (n ** 2))
for i in range(1,n+1):
yield i ** 2
# 调用该生成器时,没有任何代码会被立即执行
gen = squares()
gen
# 直到你从该生成器中请求元素时,它才会开始执行其代码
for x in gen:
print(x)


运行结果:



生成器表达式

生成器表达式是构造生成器的最简单方式。生成器也有一个类似于列表、字典、集合推导式的东西,其创建方式为,把列表推倒式两端的方括号改成圆括号。

示例:

gen = (x ** 2 for x in range(100))


与下面这个冗长的生成器是完全等价的:

def make_gen():
for x in range(100):
yield x ** 2


生成器表达式还有一个用处,就是可用于任何接受生成器的python函数。

示例:

sum(x ** 2 for x in range(100))


运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: