zoukankan      html  css  js  c++  java
  • 壹拾肆

    函数进阶

    一、三元表达式

    ​ 条件成立时的返回值 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会判断函数的返回值的真假,如果为真则留下。

  • 相关阅读:
    06-图2 Saving James Bond
    06-图3 六度空间 (30 分)
    07-图5 Saving James Bond
    09-排序3 Insertion or Heap Sort (25 分)
    09-排序2 Insert or Merge (25 分)
    10-排序4 统计工龄 (20 分)
    10-排序5 PAT Judge (25 分)
    使用正则表达式验证汉字输入
    使用正则表达式验证字母
    使用正则表达式对字符串进行拆分
  • 原文地址:https://www.cnblogs.com/tangceng/p/11348643.html
Copyright © 2011-2022 走看看