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))
运行结果:
相关文章推荐
- 温故知新python3--基础知识3(函数高级特性)
- python基础知识5(集合,高级特性,高阶函数)
- javaSE_8系列博客——Java语言的特性(二)--高级语言的基础知识(4)-- 变量和数组
- javaSE_8系列博客——Java语言的特性(二)--高级语言的基础知识(1)-- 变量
- Python学习1——基础、函数、高级特性
- Python入门基础之高级特性(四)
- javaSE_8系列博客——Java语言的特性(二)--高级语言的基础知识(2)-- 变量和常用数据类型
- javaSE_8系列博客——Java语言的特性(二)--高级语言的基础知识
- javaSE_8系列博客——Java语言的特性(二)--高级语言的基础知识(3)-- 基本数据类型的默认值
- Python基础-高级特性-切片(Slice)
- Python3 基础:高级特性-列表生成式和生成器
- Python3 基础:高级特性- 迭代器
- javaSE_8系列博客——Java语言的特性(二)--高级语言的基础知识(7)-- 流程控制语句
- javaSE_8系列博客——Java语言的特性(二)--高级语言的基础知识(5)-- 运算符
- python基础知识整理——urllib2的高级使用
- Python基础之三高级特性
- 廖雪峰Python的研读笔记(一) Python基础、函数、高级特性
- python基础3之函数高级特性
- python基础-对象高级特性
- javaSE_8系列博客——Java语言的特性(二)--高级语言的基础知识(6)-- 表达式、语句、块