列表生成式
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:
-
#!/usr/bin/env python
-
# -*- coding:utf-8 -*-
-
# Author :Alvin.Xie
-
# @Time :2017/11/3 22:00
-
# @File :shengcq.py
-
-
m = [x for x in range(1, 10)]
-
print m
-
-
g=(x for x in range(1, 10))
-
print g.next()
-
print g.next()
-
-
for x in g:
-
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:
如下:实现斐波那契数列
-
#!/usr/bin/env python
-
# -*- coding:utf-8 -*-
-
# Author :Alvin.Xie
-
# @Time :2017/11/3 23:03
-
# @File :test.py
-
-
-
def fib(n):
-
a = 1
-
b = 1
-
i = 0
-
-
yield a
-
yield b
-
-
while(i<n):
-
a, b = b, a+b
-
i+=1
-
yield b
-
-
-
for x in fib(10):
-
print x
运行结果:
1
1
2
3
5
8
13
21
34
55
89
144
生成器和普通函数区别:
普通函数是顺序执行,遇到return语句或者最后一行函数语句就返回;
而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。
迭代器
访问一个列表或元组时很平常的做法是通过下标访问例如:
-
lst = [1, 2, 3, 4, 5]
-
for i in range(len(lst)):
-
print lst[i]
但是除了这种方式,其实还有另外一种方式,使用迭代器:
-
lst = [1, 2, 3, 4, 5]
-
for value in lst:
-
print value
对于不能随机访问的数据结构比如字典或者set,迭代器是唯一访问元素的方式:
-
dic = {'a': "nice", 'b': "to", 'c': "meet", 'd': 'you'}
-
for (key, value) in dic.iteritems():
-
print key, value
装饰器
装饰器其实就是一个以函数作为参数并返回一个替换函数的可执行函数,
装饰器通常用于在不改变原有函数代码和功能的情况下,为其添加额外的功能。比如在原函数执行前先执行点什么,在执行后执行点什么。
在Python中可以通过@符号来方便的使用装饰器功能
-
#!/usr/bin/env python
-
# -*- coding:utf-8 -*-
-
# Author :Alvin.Xie
-
# @Time :2017/11/3 23:47
-
# @File :zhusq.py
-
-
-
def decorator(func):
-
def wrap():
-
print("Doing someting before executing func()")
-
func()
-
print("Doing someting after executing func()")
-
return wrap
-
-
-
@decorator
-
def fun_test():
-
print("func")
-
-
-
fun_test()
实现99乘法表:
-
#!/usr/bin/env python
-
# -*- coding:utf-8 -*-
-
# Author :Alvin.Xie
-
# @Time :2017/11/3 23:47
-
# @File :cfb.py
-
-
-
for i in xrange(1, 10):
-
for j in xrange(1, i + 1):
-
print "%sx%s=%s" % (j, i, j * i),
-
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) |