Python 三目运算,列表解析,装饰器,迭代器和生成器

来源:互联网 发布:剑网三炮姐捏脸数据 编辑:程序博客网 时间:2024/06/05 00:41

操作系统:Windows
Python:3.5
欢迎加入学习交流QQ群:657341423


三目运算

a=Falsex=1+33  if a else 10-1#a,b=1,10 if 10>1 else None#多个变量赋值print(x)

三目运算基本上都是用于if else方式,如果有elif的话,只能嵌套在else里面。
例如

a=3x=1+33  if a==1 else (10 if a==2 else 20)print(x)

运行结果:
这里写图片描述


列表解析
列表解析方法基本用于for循环出来每个元素之后,然后加入一个新的列表。

res=[i for i in range(1,100)]print(res)

结果:
这里写图片描述

for i in range(1,100)是将i从1到100的,数据类型是int的。
如果变成[i for i in range(1,100)]就是将i加入到一个新的列表去。这就是列表解析。

这里可以加入判断条件

res=[i for i in range(1,100) if i > 50]print(res)

运行结果
这里写图片描述


装饰器
装饰器分带参数和不带参数。
不带参数

def Mydecorate(func):    def decorates(*args,**kwargs):    #可将func带参数或不带参数        if mybool:            myfunc=func(*args,**kwargs)        else:            print("aa")            myfunc='Fail'        return myfunc        #这个return可以去掉    return decoratesmybool=False@Mydecoratedef mydef(value):    name='Evan'    all=value+name    print(all)#mydef('my name is ','Evan')mydef('my name is ')

看到定义的Mydecorate,首先是return自身里面的一个函数。再看里面自身的一个函数decorates,这里return的是需要装饰器的函数。也就是说代码中的运行mydef。装饰器中的func其实就是将函数mydef的名字传入,然后进行判断等,符合条件就将执行函数。
装饰器运行顺序
这里写图片描述

运行结果:
这里写图片描述

这里写图片描述

带参数

def Mydecoratearg(arg):#带参数装饰器    if arg:        def Mydecorate(func):            def decorates(*args,**kwargs):                func(*args,**kwargs)            return decorates        return Mydecorate@Mydecoratearg("aa")def mydef(value):    print("my name is "+value)mydef('EvanGG')

运行顺序:
这里写图片描述

运行结果:
这里写图片描述


迭代器
迭代器的优点
迭代器的一大优点是不要求事先准备好整个迭代过程中所有的元素。迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合
总的来说,对于长度太大列表或者字典等来说,使用迭代器访问能节省内存。
比如,for i in list:会将list(列表)全部元素以内存载入方式实现循环,如果list元素太多,这样就很耗内存。运行速度太慢。
用法:

def mydef():    print("aa")class myclass():    def __init__(self,star,end):        self.star=star        self.end=end    def __iter__(self):#迭代器        return self    def __next__(self):#迭代器        if self.star<self.end:            self.star+=1            mydef()#引入自定义函数            return self.star        else:            raise StopIteration()c=myclass(0,5)for i in c:#迭代器的糖衣    print(i)

运行结果:
这里写图片描述
这个用法是在自定义类中实现迭代器的。不过在实际开发中,如果每次都定义类的话,代码就会显得很长。
再看下面:

a=[x for x in range(3) if x<7]b={"a":5,"b":6,"c":7}ita=iter(a)#对列表进行迭代#itb=iter(b)#itb=iter(b.items())itb=iter(b.values())#对字典进行迭代while 1:    try:        var=next(ita)        varb=next(itb)        print(var)        print(varb)    except Exception as e:        break

运行结果:
这里写图片描述


生成器
生成器的特点:
生成器是一个函数,而且函数的参数都会保留。
迭代到下一次的调用时,所使用的参数都是第一次所保留下的,即是说,在整个所有函数调用的参数都是第一次所调用时保留的,而不是新创建的
有利于节省内存空间

更多优点请点击

简单生成器

res=(i for i in range(1,100) if i > 50)print(type(res))

运行结果:
这里写图片描述

带yield 语句的生成器
在网上找一个例子

def fib(max):    a,b=1,1    while a<max:        yield a        a,b=b,a+bf=fib(10)   print(next(f))print(next(f))print(next(f))

首先看到一个函数while的一个循环。yield是返回一个值,但会保留上一次函数里面参数的值。这是与普通函数区别。普通函数是不会保留函数内的参数值的。
可以看到print(next(f)),这和迭代器的next一样的用法。
迭代器和生成器在某个程度上是相似的。

更简单的解释:

def fib(a):    b=1    a=a+b    yield a    a=a+b    yield af=fib(10)   print(next(f))print(next(f))print(next(f))# for i in fib(10):    # print(i)

运行结果:
这里写图片描述

可看到,这有3个next,但是函数里面只有2个yield,所以到第三个next出现stop的错误。而上面输出11和12分别对于图上的yield。

原创粉丝点击