二.python面对对象-------推导式

         推导式是python中很强大的 很受受欢迎的,具有语言简洁,速度快等优点。推导式包括:

1.列表推导式

2.字典推到书

3.集合推导式

#1到10的平方的列表

一、列表推导式

列1:整除3的数字列表

numbers =[]

for x in range(100):

      if x % 3 == 0:

    numbers.append(x)

扫描二维码关注公众号,回复: 860792 查看本文章

使用推导式实现

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

4 sum = lambda x, y : x + y

5 print(sum(2, 3)) 


例:1个参数

func1 = lambda x:x*2
print(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) # 15


result = FuncX(3)(5)

print(result) # 1


猜你喜欢

转载自blog.csdn.net/hwj990/article/details/80161164