python圣斗士修炼(十一):几种高级特性

本文介绍了Python中迭代的基本概念,包括如何使用for循环遍历列表、生成式及生成器的使用方法,并深入探讨了装饰器的功能及其应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

迭代

在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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值