壹拾肆

函数进阶

一、三元表达式

​ 条件成立时的返回值 if 条件 else 条件不成立时的返回值。

x = 1
if x == 1:
    print(1)
else:
    print(0)

print(1) if x == 1 else print(0)
1
1

​ 三元表达式只支持双分支结构。

二、列表推到式

lt = []
for i in range(10):
    lt.append(i**2)

print(lt)


lt = [i ** 2 for i in range(10)]
print(lt)

​ 列表推到式可直接实现幂运算。

dic = {'a': 1, 'b': 2}

lt = [(k, v) for (k, v) in dic.items()]
print(lt)

[('a', 1), ('b', 2)]

​ 列表推到式可将字典转换成列表或者元组。

三、字典生成式

3.1 字典生成

dic = {'a': 1, 'b': 2}

new_dic = {k * 2: v ** 2 for k, v in dic.items()}
print(new_dic)

{'aa': 1, 'bb': 4}

​ 字典生成式生成字典,还可以对k、v进行算术运算。

3.2 zip()方法

​ zip(拉链函数)是压缩方法,是python内置方法的一种,()里应填入可迭代的对象。

z = zip(['a', 'b', 'c', 'd'], [1, 2, 3, 4]) 

dic = {k: v ** 2 for k, v in zip(['a', 'b', 'c', 'd'], [1, 2, 3, 4])} 
print(dic)

{'a': 1, 'b': 4, 'c': 9, 'd': 16}

​ zip方法可以将列表里包的元组转化为字典。

四、生成器

​ 生成器:自定义迭代器

4.1.1 yield关键字

def func():
    yield 456  
     print(789)
    yield 101112
    print(131415)

 f = func()  
 print(f) 
 f_iter = f.__iter__()
 print(f_iter.__next__())
 print(f_iter.__next__())
 print(f_iter.__next__())

​ yield的三个特性:

  1. yield可以把函数变成生成器(自定制的迭代器对象,具有__iter__和__next__方法。
  2. yield可以停止函数,再下一次next再次运行yield下面的代码
  3. 有n个yield生成器就有n个元素,就可以next n次, 第n+1次next会报错。

4.1.2 yield和return

​ return的特性:

​ 1.返回值

​ 2. 终止函数

4.2 协同程序

​ 协同程序(协程)一般来说是指这样的函数:

  • 彼此间有不同的局部变量、指令指针,但仍共享全局变量;
  • 可以方便地挂起、恢复,并且有多个入口点和出口点;
  • 多个协同程序间表现为协作运行,如A的运行过程中需要B的结果才能继续执行。

4.2.1 send(value)

​ send是除next外另一个恢复生成器的方法。

4.2.2 close()

​ 这个方法用于关闭生成器。对关闭的生成器后再次调用next或send将抛出StopIteration异常。

4.2.3 throw(type,value=None,traceback=None)

​ 中断Generator是一个非常灵活的技巧,可以通过throw抛出一个GeneratorExit异常来终止Generator。Close()方法作用是一样的。

4.3 总结

​ yield:

  1. 提供一种自定义迭代器的方式

  2. yield可以暂停住函数,并提供当前的返回值

    ​ yield和return:

  3. 相同点:两者都是在函数内部使用,都可以返回值,并且返回值没有类型和个数的限制

  4. 不同点:return只能返回一次之;yield可以返回多次值

4.4 生成表达式

​ 把列表推导式的[]换成()就是生成器表达式,优点:省内存,一次只产生一个值在内存中。

五、匿名函数

​ 匿名函数就是没有名字的函数,需要使用lambda,使用lambda+参数:《代码块》的格式。

​ 匿名函数一般不单独使用,和 filter()/map()/sorted()/列表的sort()内置方法联用。

​ 如果我们想从上述字典中取出max的值,我们可以使用max()方法,但是max()默认比较的是字典的key。所以需要首先将可迭代对象变成迭代器对象,然后res=next(迭代器对象),将res当做参数传给key指定的函数,然后将该函数的返回值当做判断依据。

​ 如果我们想对上述字典中的k,按照v从大到小排序,可以使用sorted()方法。首先将可迭代对象变成迭代器对象,然后res=next(迭代器对象),将res当做参数传给第一个参数指定的函数,然后将该函数的返回值当做判断依据。

​ 如果我们想对一个列表中的某个k做处理,可以使用map()方法。首先将可迭代对象变成迭代器对象然后res=next(迭代器对象),将res当做参数传给第一个参数指定的函数,然后将该函数的返回值作为map()方法的结果之一。

​ 如果我们想筛选除含有某个关键字的k,我们可以使用filter()方法。首先将可迭代对象变成迭代器对象,然后res=next(迭代器对象),将res当做参数传给第一个参数指定的函数,然后filter会判断函数的返回值的真假,如果为真则留下。

posted @ 2019-08-13 21:20  唐ceng  阅读(237)  评论(0编辑  收藏  举报