推导式是python中很强大的 很受受欢迎的,具有语言简洁,速度快等优点。推导式包括:
1.列表推导式
2.字典推到书
3.集合推导式
#1到10的平方的列表
一、列表推导式
列1:整除3的数字列表
numbers =[]
for x in range(100):
if x % 3 == 0:
numbers.append(x)
使用推导式实现
numbers =[x for x in range(100) if x % 3 == 0]
列二:
def squared(x):
return x*x
mul tiples = [sqinared(i) for i in range(30) if i % 3 is 0]
print(mul tiples)
列三:
使用()生成 generator将列表推导式的[]改成()即可得到生成器。---yeild
multiples = (i for i in range(30) if i % 3 is 0)
print(type(mul tiples))
二、字典推导式
字典推导式和列表推导式的使用方法是类似的,只不过中括号该改成大括号。直接举例说明:
例子一:大小写key合并
mcase = {'a': 10, 'b': 34, 'A': 7, 'Z': 3}
mcase_frequency = {
k.lower(): mcase.get(k.lower(), 0) + mcase.get(k.upper(), 0)
for k in mcase.keys()
if k.lower() in ['a','b']
}
print mcase_frequency
# Output: {'a': 17, 'b': 34}
例子二:快速更换key和value
mcase = {'a': 10, 'b': 34}
mcase_frequency = {v: k for k, v in mcase.items()}
print mcase_frequency
# Output: {10: 'a', 34: 'b'}
三、集合推导式
它们跟列表推导式也是类似的。 唯一的区别在于它使用大括号{}
列一:
squared = {x**2 for x in [1, 1,2]}
print(squared)
Output: set([1,4])
列一:用集合推到 字符串的集合
strings = ['a','is','with','if','file','exception']
{len(s) for s in strings} #有长度相同的{}会只留一个 []多个,这在实际上也非常有用
Output: set([1,2,4,9])
练习 0到9 的次方
squaes = []
for x in range(10):
squars.append(x**2)
使用推导式实现:
squares = [x**2 for x in range(10)]
1.将单词长度大于3的转为大写输出
name = ['bob', 'tom', 'alice', 'jerry', 'wendy', 'smi th']
print([name.upper() for name in names if len (name))>3])
2.求(x,y)其中x是0-5之间的偶数,y是0-5之间的奇数组成的元祖列表:
[(x,y) for x in range(5) if x%2==0 for y in range(5) if y %2==1]
3.求m中3,6,9组成的列表:
m = [[1,2,3],[4,5,6],[7,8,9]]
[row[2] for row in m]
或
[m[row][2] for row in (0,1,2)]
4: 求m 中斜线1,5,9组成的列表:
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
[m[i][i] for i in range(len(m))]
5.求m,n中矩阵各个元素的乘积:
m = [[1,2,3],[4,5,6],[7,8,9]]
n = [[2,2,2],[3,3,3],[4,4,4]]
[m[row][col]*n[row][col] for row in range(3) for col in range(3)]
[[m[row][col]*n[row][col] for col in range(3)] for row in range(3)]
[[m[row][col]*n[row][col] for row in range(3)] for col in range(3)]
6.结合两个列表的元素,如果元素之间不相等的话:
combs = []
for x in [1,2,3]:
for y in [3,1,4]:
if x != y:
combs.append((x, y))
推导[(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]
#7.create a list of 2-tuples like (number, square)
[(x, x**2) for x in range(6)]
将csv文件读取为字典列表
我们常常需要读取和处理csv文件的数据。处理csv数据的一个最有用的方法就是把它转换为一个字典列表。
Python
import csv
data = []
for x in csv.DictReader(open('file.csv', 'rU')):
data.append(x)1
2
3
4
import csv
data = []
for x in csv.DictReader(open('file.csv', 'rU')):
data.append(x)
你可以使用列表生成式快速实现:Python
import csv
data = [ x for x in csv.DictReader(open('file.csv', 'rU'))]1
2
import csv
data = [ x for x in csv.DictReader(open('file.csv', 'rU'))]
DictReader类将会自动地使用csv文件的第一行作为字典的key属性名。DictReader类返回一个将会遍历csv文件
所有行的对象。
这个文件对象通过open()函数产生。我们提供了open()两个参数–第一个是csv文件名,第二个是模式。在这例
子,‘rU’有两
个意思。想往常一样,‘r’表示以读模式打开文件。‘U’表明我们将会接受通用换行
符–‘n’,‘r’和‘rn’。
--------------------------------------------------------------------------------------------------------------------------------
匿名函数
python 使用 lambda 表达式来创建匿名函数
lambda只是一个表达式,函数体比def简单很多
lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去
lambda函数拥有自己的名字空间,且不能访问自有参数列表之外或全局名字空间里的参数
虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行
效率
1.ambda函数的语法只包含一个语句: lambda [arg1 [,arg2,.....argn]]:expression
使用如下:1 square = lambda x : x**2
2 print(square(3)) # 93
4 sum = lambda x, y : x + y
5 print(sum(2, 3))
例:1个参数
func1 = lambda x:x*2print(func1(3)) #结果为6
#例:多个参数(可以初始化参数)
func2 = lambda x,y,z=1: x+y+z
print(func2(2,3)) #结果为6
print(func2(2,3,4)) #结果为9
func=lambda x:x+1
print(func(1))
#2
print(func(2))
#3#以上lambda等同于以下函数
def func(x):
return(x+1)
可以这样认为,lambda作为一个表达式,定义了一个匿名函数,上例的代码x为入口参数,x+1为函数体。在这里la
mbda简化了
函数定义的书写形式。是代码更为简洁,但是使用函数的定义方式更为直观,易理解。
Python中,也有几个定义好的全局函数方便使用的,filter, map, reduce。
from functools import reduce
foo = [2, 18, 9, 22, 17, 24, 8, 12, 27]print (list(filter(lambda x: x % 3 == 0, foo)))
#[18, 9, 24, 12, 27]print (list(map(lambda x: x * 2 + 10, foo)))
#[14, 46, 28, 54, 44, 58, 26, 34, 64]print (reduce(lambda x, y: x + y, foo))
#139
上面例子中的map的作用,非常简单清晰。但是,Python是否非要使用lambda才能做到这样的简洁程度呢?
在对象遍历处理方面,其实Python的for..in..if语法已经很强大,并且在易读上胜过了lambda。
比如上面map的例子,可以写成:print ([x * 2 + 10 for x in foo]) 非常的简洁,易懂。filter的例子可以写成:print ([x for x in foo if x % 3 == 0]) 同样也是比lambda的方式更容易理解。
--------------------------------------------------------------------------------------------------------------------------------
Python闭包
如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认
为是闭包
(closure)。一个闭包就是你调用了一个函数A,这个函数A返回了一个函数B给你。这个返回的函数B就叫做闭
包。你在调用函数A的时候传递的参数就是自由变量。
复制代码
def FuncX(x):
def FuncY(y):
return x * y
return FuncY
tempFunc = FuncX(3)
result = tempFunc(5)
print(result) # 15result = FuncX(3)(5)
print(result) # 1