Chinaunix首页 | 论坛 | 博客
  • 博客访问: 237537
  • 博文数量: 57
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 557
  • 用 户 组: 普通用户
  • 注册时间: 2015-10-01 18:05
文章分类

全部博文(57)

文章存档

2017年(57)

我的朋友

分类: Python/Ruby

2017-11-04 08:25:46

列表生成式
List Comprehensions 列表生成式是Python内置的非常简单却强大的可以用来创建list的生成式。
简单的数值范围的list可以使用如下生成:
>>>list(range(1,10))
[1, 2, 3, 4, 5, 6, 7, 8, 9]
复杂的可以利用list生成式,如求列表里面数的平方
>>>[x * x for x in range(1, 11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
循环后面还可以加上if判断,例如仅筛选出偶数的平方:
>>>[x*x for x in range(1, 11) if x%2 == 0]
[4, 16, 36, 64, 100]
把一个list中所有的字符串变成小写:
>>>L=['Hello',10,'World',None]
>>>[s.lower() for s in L if isinstance(s,str)]
['hello', 'world']
总结:发现使用生成式语法太简洁

生成式器
在Python中,有一种自定义迭代器的方式,称为生成器(Generator)。
定义生成器的两种方式:
1.创建一个generator,只要把一个列表生成式的[]改成(),就创建了一个generator:

点击(此处)折叠或打开

  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. # Author :Alvin.Xie
  4. # @Time :2017/11/3 22:00
  5. # @File :shengcq.py

  6. m = [x for x in range(1, 10)]
  7. print m

  8. g=(x for x in range(1, 10))
  9. print g.next()
  10. print g.next()

  11. for x in g:
  12.     print x
运算结果:
[1, 2, 3, 4, 5, 6, 7, 8, 9]
1
2
3
4
5
6
7
8
9

generator保存的是算法,每次调用next(),就计算出下一个元素的值,直到计算到最后一个元素,没有其他元素时,抛出StopIteration的错误。

2.定义generator的另一种方法。如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator:
如下:实现斐波那契数列

点击(此处)折叠或打开

  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. # Author :Alvin.Xie
  4. # @Time :2017/11/3 23:03
  5. # @File :test.py


  6. def fib(n):
  7.     a = 1
  8.     b = 1
  9.     i = 0

  10.     yield a
  11.     yield b

  12.     while(i<n):
  13.         a, b = b, a+b
  14.         i+=1
  15.         yield b


  16. for x in fib(10):
  17.     print x
运行结果:
1
1
2
3
5
8
13
21
34
55
89
144

生成器和普通函数区别:
普通函数是顺序执行,遇到return语句或者最后一行函数语句就返回;
而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。

迭代器
访问一个列表或元组时很平常的做法是通过下标访问例如:
 

点击(此处)折叠或打开

  1. lst = [1, 2, 3, 4, 5]
  2. for i in range(len(lst)):
  3.     print lst[i]
但是除了这种方式,其实还有另外一种方式,使用迭代器:

点击(此处)折叠或打开

  1. lst = [1, 2, 3, 4, 5]
  2. for value in lst:
  3.     print value
对于不能随机访问的数据结构比如字典或者set,迭代器是唯一访问元素的方式:

点击(此处)折叠或打开

  1. dic = {'a': "nice", 'b': "to", 'c': "meet", 'd': 'you'}
  2. for (key, value) in dic.iteritems():
  3.     print key, value
装饰器
装饰器其实就是一个以函数作为参数并返回一个替换函数的可执行函数,

装饰器通常用于在不改变原有函数代码和功能的情况下,为其添加额外的功能。比如在原函数执行前先执行点什么,在执行后执行点什么。

在Python中可以通过@符号来方便的使用装饰器功能

点击(此处)折叠或打开

  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. # Author :Alvin.Xie
  4. # @Time :2017/11/3 23:47
  5. # @File :zhusq.py


  6. def decorator(func):
  7.     def wrap():
  8.         print("Doing someting before executing func()")
  9.         func()
  10.         print("Doing someting after executing func()")
  11.         return wrap


  12. @decorator
  13. def fun_test():
  14.     print("func")


  15. fun_test()

实现99乘法表:

点击(此处)折叠或打开

  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. # Author :Alvin.Xie
  4. # @Time :2017/11/3 23:47
  5. # @File :cfb.py


  6. for i in xrange(1, 10):
  7.     for j in xrange(1, i + 1):
  8.         print "%sx%s=%s" % (j, i, j * i),
  9.     print
运行结果:
1x1=1
1x2=2 2x2=4
1x3=3 2x3=6 3x3=9
1x4=4 2x4=8 3x4=12 4x4=16
1x5=5 2x5=10 3x5=15 4x5=20 5x5=25
1x6=6 2x6=12 3x6=18 4x6=24 5x6=30 6x6=36
1x7=7 2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49
1x8=8 2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64
1x9=9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81












阅读(1242) | 评论(0) | 转发(0) |
0

上一篇:python高阶函数

下一篇:python 类和类的继承

给主人留下些什么吧!~~