VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > Python基础教程 >
  • Python基础(十二)

一、推导式

(一)列表推导式

  • 先来看一段代码

    • 建立一个空列表,向空列表中添加元素
    lst = list()
    for i in range(5):
    	lst.append(i)
    print(lst)
    
    运行结果:
    [0, 1, 2, 3, 4]
    
    • 利用列表推导式,效果一样
    lst = [i for i in range(5)]
    print(lst)
    
    运行结果:
    [0, 1, 2, 3, 4]
    
  1. 循环模式:

    • 格式:[元素 for 元素 in 可迭代对象]
    • 执行流程:每次for循环将元素添加到列表中
    lst = [i for i in range(5)]
    print(lst)
    
    运行结果:
    [0, 1, 2, 3, 4]
    
  2. 筛选模式

    筛选模式:

    • 格式:[元素 for 变量 in 可迭代对象 if 条件]
    • 执行流程:执行for循环并判断元素是否符合条件,将符合条件的元素添加到列表中
    lst = [i for i in range(5) if i > 2]
    print(lst)
    
    运行结果:
    [3, 4]
    

(二)字典推导式

  • 同理,先来看一段代码

    • 建立一个空字典,向字典中添加键值对
    dic = dict()
    for i in range(1, 5):
    	dic[f"k{i}"] = i
    print(dic)
    
    运行结果:
    {'k1': 1, 'k2': 2, 'k3': 3, 'k4': 4}
    
    • 使用字典推导式,效果一样
    dic = {f"k{i}": i for i in range(1, 5)}
    print(dic)
    
    运行结果:
    {'k1': 1, 'k2': 2, 'k3': 3, 'k4': 4}
    
  1. 循环模式:

    • 格式:{键值对 for 元素 in 可迭代对象}
    • 执行流程:执行for循环利用元素组成键值对添加到字典中
    dic = {f"k{i}": i for i in range(1, 5)}
    print(dic)
    
    运行结果:
    {'k1': 1, 'k2': 2, 'k3': 3, 'k4': 4}
    
  2. 筛选模式:

    • 格式:{键值对 for 元素 in 可迭代对象 if 条件}
    • 执行流程:执行for循环并判断元素是否符合条件,利用符合条件的元素组成键值对添加到字典中
    dic = {f"k{i}": i for i in range(1, 5) if i > 2}
    print(dic)
    
    运行结果:
    {'k3': 3, 'k4': 4}
    

(三)集合推导式

  • 与列表一样,这里就不再举例了
  1. 循环模式:

    • 格式:{元素 for 元素 in 可迭代对象}
    • 执行流程:每次for循环将元素添加到集合中
    st = {i for i in range(5)}
    print(st)
    
    运行结果:
    {0, 1, 2, 3, 4}
    
  2. 筛选模式:

    • 格式:{元素 for 变量 in 可迭代对象 if 条件}`
    • 执行流程:执行for循环并判断元素是否符合条件,将符合条件的元素添加到集合中
    lst = {i for i in range(5) if i > 2}
    print(st)
    
    运行结果:
    {3, 4}
    

(四)推导式应用

  • 来看几个推导式的应用例题
  1. 求字符串s = "zxdhnbhnb"中"h"的索引

    s = "zxdhnbhnb"
    lst = [i for i in range(len(s)) if s[i] == "h"]
    print(lst)
    
    运行结果:
    [3, 6]
    
  2. 将下列列表中带两个"e"的元素添加到新列表

    names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
             ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
    lst = [name for i in names for name in i if name.count("e") == 2]
    print(lst)
    
    运行结果:
    ['Jefferson', 'Wesley', 'Steven', 'Jennifer']
    

二、生成器表达式

(一)回顾:通过函数实现生成器

  • 回顾一下通过函数实现生成器

    • 将函数return变成yield就变成了生成器
    def func():
    	yield 1
    	yield 2
    	yield 3
    	
    g = func()
    print(next(g))
    print(next(g))
    print(next(g))
    
    运行结果:
    1 2 3
    

(二)生成器表达式

  1. 通过表达式实现生成器

    • 将列表推导式的方括号[]变成圆括号(),就成了生成器表达式
    lst = [i for i in range(5)]
    print(type(lst))
    g = (i for i in range(5))
    print(type(g))
    
    运行结果:
    <class 'list'>
    <class 'generator'>
    
    • 转换成通过函数实现的生成器(二者等价)
    # g = (i for i in range(5))
    
    def func():    # 二者等价
    	for i in range(5):
    		yield i
    g= func()
    
    print(next(g))
    print(next(g))
    print(next(g))
    print(next(g))
    print(next(g))
    
    运行结果:
    0 1 2 3 4
    
  2. 生成器表达式结构:

    • 普通模式:

      • 格式:(元素 for 元素 in 可迭代对象)
      • 运行机制:惰性机制,不取值不运行,每次取值得到一个结果
      g = (i for i in range(5))
      print(next(g))
      print(next(g))
      print(next(g))
      print(next(g))
      print(next(g))
      
      运行结果:
      0 1 2 3 4 
      
    • 筛选模式:

      • 格式:(元素 for 元素 in 可迭代对象 if 条件)
      • 运行机制:惰性机制,不取值不运行,每次取值得到一个满足判断条件的结果
      g = (i for i in range(5) if i > 2)
      print(next(g))
      print(next(g))
      
      运行结果:
      3 4
      
  3. 生成器的取值方式补充:

    • 之前提到过的最正宗的next(生成器)
    g = (i for i in range(5))
    print(next(g))
    print(next(g))
    print(next(g))
    print(next(g))
    print(next(g))
    
    运行结果:
    0 1 2 3 4
    
    • 通过for循环取值
    g = (i for i in range(5))
    for el in g:
    	print(el)
    	
    运行结果:
    0 1 2 3 4
    
    • 通过list()tuple()set()取值
    g = (i for i in range(5))
    print(list(g))
    print(tuple(g))
    print(set(g))
    
    运行结果:
    [0, 1, 2, 3, 4]
    (0, 1, 2, 3, 4)
    {0, 1, 2, 3, 4}
    
  4. 真正理解生成器的惰性机制,来看一道例题:

    def add(a, b):
        return a + b
    
    
    def test():
        for r_i in range(4):
            yield r_i
    
    
    g = test()
    
    for n in [2, 10]:
        g = (add(n, i) for i in g)
    print(list(g))
    
    运行结果:
    [20,21,22,23]
    
    解析:生成器只有在取值的时候才会去运行,上述例题只有最后'print(list(g))'取值。
    
    """
    g = test()
    for n in [2, 10]:
        g = (add(n, i) for i in g)
    """
    
    所以上面的for循环可以写成如下代码:
    """
    n = 10
    g = (add(n, i) for i in (add(n, i) for i in test()))
    """
    最终代入得到的列表为:[20, 21, 22, 23]
    

三、lambda匿名函数

(一)匿名函数定义

  1. python中为了解决一些简单的需求可以使用一句话定义一个函数,这就是lambda匿名函数

  2. lambda语法结构:

    • 函数名 = lambda 形参:返回值
    # def func(x, y):  
    # 	 return x + y
    # print(func(1, 2))
    
    func = lambda x, y: x+y  # 两个函数等价
    print(func(1, 2))
    
    运行结果:
    3
    
  3. 注意事项:

    • 形参:可以接受多个所有类型参数(位置、动态位置、默认值、动态关键字)
    func = lambda a,b,*args,sex= 'alex',c,**kwargs: kwargs
    print(func(3, 4,c=666,name='zxd'))  
    # 只返回kwargs
    
    运行结果:
    {'name': 'zxd'}
    
    • 返回值:只能返回一个数据(任意数据类型),必须写
    func = lambda x:(x[0],x[2])
    print(func('zxdnb'))
    
    运行结果:
    ('z', 'd')
    
    • 返回值也可以是三元表达式
    func = lambda x,y: x if x > y else y
    print(func(3,100))
    
    运行结果:
    100
    

(二)结合匿名函数的列表推导式

  • 例一:

    • 列表推导式:
    g = [lambda :i+1 for i in range(3)]
    print([em() for em in g])
    
    运行结果:
    [3, 3, 3]
    
    • 转换为普通代码
    g = list()
    for i in range(3):
    	def func():
    		return i + 1
    	g.append(func)
    
    new_g = list()
    for em in g:
    	new_g.append(em())
    print(new_g)
    
    运行结果:
    [3, 3, 3]
    
  • 例二:

    • 列表推导式:
    g = [lambda i:i+1 for i in range(3)]
    print([em(3) for em in g])
    
    运行结果:
    [4, 4, 4]
    
    • 转换为普通代码
    g = list()
    for i in range(3):
    	def func(i):
    		return i + 1
    	g.append(func)
    
    new_g = list()
    for em in g:
    	new_g.append(em(3))
    print(new_g)
    
    运行结果:
    [4, 4, 4]
    

(三)结合匿名函数的生成器表达式

  • 例一:

    • 生成器表达式:
    g = (lambda i:i+1 for i in range(3))
    print([em(3) for em in g])
    
    运行结果:
    [4, 4, 4]
    
    • 转换为函数实现的生成器:
    def g():
        for i in range(3):
            def func(i):
                return i + 1
            yield func
    
    new_g = list()
    for em in g():
        new_g.append(em(3))
    print(new_g)
    
    运行结果:
    [4, 4, 4]
    
  • 例二:

    • 生成器表达式:
    g = (lambda :i+1 for i in range(3))
    print([em() for em in g])
    
    运行结果:
    [1, 2, 3]
    
    • 转换为函数实现的生成器:
    def g():
        for i in range(3):
            def func():
                return i + 1
            yield func
    
    new_g = list()
    for em in g():
        new_g.append(em())
    print(new_g)
    
    运行结果:
    [1, 2, 3]
    
  • 例三:

    • 生成器表达式
    g = (lambda x:x*i for i in range(3))
    for j in [2,10]:
        g1 = (em(3) for em in g)
    print([e+j for e in g1])
    
    运行结果:
    [10, 13, 16]
    
    • 转换为普通代码
    def g():
        for i in range(3):
            def func(x):
                return x * i
            yield func
    
    for j in [2, 10]:
        def g1():
            for em in g():
                yield em(3)
    
    new_g = list()
    for e in g1():
    	new_g.append(e + j)
    print(new_g)
    
    运行结果:
    [10, 13, 16]
    

四、内置函数

  • 查看解释器内置常量和内置函数的方法

    • dir(__builtins__)
  • Python3.6.8的内置函数(共72个)

    abs all any ascii bin bool
    bytearray bytes callable chr classmethod compile
    complex copyright credits delattr dict dir
    divmod enumerate eval exec exit filter
    float format frozenset getattr globals hasattr
    hash help hex id input int
    isinstance issubclass iter len license list
    locals map max memoryview min next
    object oct open ord pow print
    property quit range repr reversed round
    set setattr slice sorted staticmethod str
    sum super tuple type vars zip

(一)基础函数(了解)

  • all() any() bytes() callable()
    chr() ord() complex() divmid()
    eval() exec() frozenset() help()
    globals() locals() hash() id()
    iter() next() bin() oct()
    int() hex() pow() repr()
    round() bool()    

相关教程