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

集合的推导式

  • 列表推导式,使用一句表达式构造一个新列表,可包含过滤、转换等操作
[exp for item in collection if condition]

示例:
python基础知识(二)python高级特性_第1张图片

  • 字典推导式
[key_exp : value_exp for item in collection if condition]

示例:
这里写图片描述

  • 集合推导式
{exp for item in collection if condition}

示例:
这里写图片描述

  • 嵌套列表推导式

按嵌套顺序理解
python基础知识(二)python高级特性_第2张图片

函数列表

  • python中皆对象

由于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))

第二种方法的优点在于:

  1. 这种多函数模式使你能在很高的层次上轻松修改字符串的转换方式。此时的clean_strings也更具复用性。
  2. 这种模式还可以将函数作为其他函数的参数,进行参数传递。

匿名函数 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)

运行结果:
python基础知识(二)python高级特性_第3张图片
生成器表达式
生成器表达式是构造生成器的最简单方式。生成器也有一个类似于列表、字典、集合推导式的东西,其创建方式为,把列表推倒式两端的方括号改成圆括号。
示例:

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))

运行结果:
python基础知识(二)python高级特性_第4张图片

你可能感兴趣的:(python)