[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中就简单多了。假设我们有下面这样一个字符串数组,希望对其进行一些数据清理工作并执行一堆转换。不管是谁,只要处理过由用户提交的调查数据,就能明白这种乱七八糟的数据是怎么一回事。为了得到一组能用于分析工作的格式统一的字符串,需要做很多事情:去除空白符、删除各种标点符号、正确的大写格式等。
states = [" Alabama","Georgial!","georgial","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))
第二种方法的优点在于:
四大特性:
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)也是同理的。
三大特性:
生成器是构造新的可迭代对象的一种简单方式。一般的函数执行之后只会返回单个值,而生成器则是以延迟的方式返回一个值序列,即每返回一个值之后暂停,直到下一个值被请求时再继续。
要创建一个生成器,只需将函数中的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))