迭代
在python中常用for循环来遍历一个list或者tuple如:
for i in [1,2,3,4,5]:
print(i)
而在其它语言中你通常得用下标的形式来遍历列表比如java:
for (i=0; i<list.length; i++) {
n = list[i];
}
可以发现python的迭代形式更加抽象和方便,并且在python中,不止是列表元组形式的对象可以用for…in…的形式进行遍历,而且就连字典,字符串等元素也可以这么操作,只要是可迭代的对象,都可以。
判断对象是否迭代:
from collections import Iterable
isinstance('abc', Iterable) //True
isinstance(123, Iterable) //Flase
生成式
生成式是一个很强大的功能,能够帮助我们快速地生成和改造列表。
举个栗子,比如我们要创造一个1-10的列表:
list(range(1, 11))
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
如果此时我们想要得到x平方列表,我们可以这样:
[ x*x for x in range(1,11) ]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
生成式的语法和我们上一节说的匿名函数有点类似,先计算for x in range这部分内容,然后将每个元素对左边的式子进行计算。
我们还可以对结果进行过滤,比如此时只要得到上述列表中的偶数:
[x*x for x in range(1,11) if x*x%2==0 ]
[4, 16, 36, 64, 100]
再来个例子:
[m + n for m in 'ABC' for n in 'XYZ']
['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
生成器
生成器的概念和生成式是极其类似的,所不同的在于后者返回的是一个列表,前者得到的是一个迭代器对象
g = (x * x for x in range(10))
type(g) //generator
for n in g:
print(n)
生成器的好处在于如果列表的内容非常大,一次性加载到内存会极大地拖慢系统的速度,生成式和生成器的概念类似于range和xrange的区别,多试几次就明白了。
装饰器
装饰器又是python中另外一个强大的功能。我们已经学过了函数的概念,那么装饰器的概念就是用另一个函数给当前的函数做一个装饰,让当前函数能够在不修改自身定义的情况下实现一些额外的功能。先定义一个简单的函数
def now():
print("2017-11-03")
假设现在我们想实现让now函数打印出点别的东西,比如是周末就打印周末快乐,是工作日就打印工作加油。我们可以写2个装饰器函数:
def workday(func):
def xxx(*args,**kw):
print("work up")
return func(*args,**kw)
return xxx
def weekend(func):
def xxx(*args,**kw):
print("weekend happy")
return func(*args,**kw)
return xxx
然后我们来用workday和weekend来分别装饰一下我们的now函数:(由于函数名不能重复,因此我们新定义一个now)
@workday
def now():
print("2017-11-03")
@weekend
def now1():
print("2017-11-04")
上述代码输出为:
work up
2017-11-03
weekend happy
2017-11-04
这就是传说中的装饰器了,其中@workday是装饰器,now函数是被装饰得到函数,其实就是装饰器就是利用高阶函数来实现的,本质上@workday
实际上执行的了now=workday(now),workday函数接受now函数作为参数,然后装饰器内部定义了一个新的xxx函数,里面执行了输出work up,然后再返回我们传入得到now函数,最后再将这个返回的xxx函数指向给now,因此此时now函数的内容就相当于装饰器函数中的xxx函数。虽然now函数自身的定义没有改变,但是执行now函数会将装饰器内部的代码一并执行,这就起到了装饰器的效果。
更复杂一些的装饰器还可以接收参数,这里不多介绍。
练习
用函数实现9*9乘法口诀
def xtable(N=1):
N=int(N)
j=0
for i in range(1,N+1):
for j in range(1,i+1):
print("{}*{}={} ".format(i,j,i*j),end="")
print("\n")
xtable(9)
输出如下:
1*1=1
2*1=2 2*2=4
3*1=3 3*2=6 3*3=9
4*1=4 4*2=8 4*3=12 4*4=16
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25
6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36
7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49
8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64
9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81