zoukankan      html  css  js  c++  java
  • Python 生成器&迭代器

    一.生成器表达式,列表推导式

      1.列表推导式

      1.1 分类

      a.循环模式

      [变量(加工后的变量) for 变量 in iterable] 

      b.筛选模式

      [变量(加工后的变量) for 变量 in iterable if 条件]

    10以内所有数的平方
    print([i*i for i in range(11)])
    30以内所有能被3整除的数的平方
    print([i**2 for i in range(31) if i % 3 == 0])
    100 以内所有的奇数.
    print([i for i in range(1,101,2)])
    构建一个列表,筛选出已知列表中含两个"e"的字符串
    names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
    li=[name for i in names for name in i if name.count("e")==2]               
    print(li)
    
    运行结果:['Jefferson', 'Wesley', 'Steven', 'Jennifer']

      

      1.2 特点

      a.优点:

      1)节省代码,一行搞定.
      2)看着高大上.

      b.缺点:不易排错

      c.整体:

      凡是用列表推导式构造的列表对象,用其他方式都可构建.,非常复杂的列表,列表推导式是构建不出的,
      列表推导式比较有魔性

    1 构建一个列表['技师0号','技师1号'... '技师15号']
    2 li=["技师%s号"%i for i in range(16)]
    3 print(li)
    4 执行结果为:['技师0号', '技师1号', '技师2号', '技师3号', '技师4号', '技师5号', '技师6号', '技师7号', '技师8号',
    '技师9号', '技师10号', '技师11号', '技师12号', '技师13号', '技师14号', '技师15号']

      2.生成器表达式 

    循环模式 g_obj = ('python%s期' % i for i in range(1,14)) 
    
    筛选模式 g_obj1 = ('python%s期' % i for i in range(1,14) if i % 2 == 0) 

      注意:与列表推导式相比,只是将[]变成了(),使用方式等基本不变.

      2.1 为什么有生成器:
       生成器本身是自己用python代码构建的,这样就满足了个性化需求,满足以后你工作中需要.

      2.2 生成器:两种方式:

      a.生成器函数. yield
      b.生成器表达式

    二.内置函数

      1.1作用域相关

      ***locals :函数会以字典的类型返回当前位置的全部局部变量。

      ***globals:函数以字典的类型返回全部全局变量。

    a = 1
    b = 2
    print(locals())
    print(globals())
    # 这两个一样,因为是在全局执行的。
    
    ##########################
    
    def func(argv):
        c = 2
        print(locals())
        print(globals())
    func(3)
    
    #这两个不一样,locals() {'argv': 3, 'c': 2}
    #globals() {'__doc__': None, '__builtins__': <module 'builtins' (built-in)>, '__cached__': None, '__loader__': 
    <_frozen_importlib_external.SourceFileLoader object at 0x0000024409148978>, '__spec__': None, '__file__': 'D:/
    lnh.python/.../内置函数.py', 'func': <function func at 0x0000024408CF90D0>, '__name__': '__main__', '__package__': None}

      1.2.1 字符串类型代码的执行 eval,exec,complie

      eval:执行字符串类型的代码,并返回最终结果

    eval('2 + 2')  # 4
    
    
    n=81
    eval("n + 4")  # 85
    
    
    eval('print(666)')  # 666

      exec:执行字符串类型的代码。

    s = '''
    for i in [1,2,3]:
        print(i)
    '''
    exec(s)

      1.2.2 输入输出相关 input,print

      input:函数接受一个标准输入数据,返回为 str类型。

      print:打印输出。

    ''' 源码分析
    def print(self, *args, sep=' ', end='
    ', file=None): # known special case of print
        """
        print(value, ..., sep=' ', end='
    ', file=sys.stdout, flush=False)
        file:  默认是输出到屏幕,如果设置为文件句柄,输出到文件
        sep:   打印多个值之间的分隔符,默认为空格
        end:   每一次打印的结尾,默认为换行符
        flush: 立即把内容输出到流文件,不作缓存
        """
    '''
    
    print(111,222,333,sep='*')  # 111*222*333
    
    print(111,end='')
    print(222)  #两行的结果 111222
    
    f = open('log','w',encoding='utf-8')
    print('写入文件',file=f,flush=True)

      1.2.3内存相关 hash id

      hash:获取一个对象(可哈希对象:int,str,Bool,tuple)的哈希值

    print(hash(12322))
    print(hash('123'))
    print(hash('arg'))
    print(hash('alex'))
    print(hash(True))
    print(hash(False))
    print(hash((1,2,3)))
    
    '''
    12322
    -2996001552409009098
    -4637515981888139739
    2311495795356652852
    1
    0
    2528502973977326415
    '''

      id:用于获取对象的内存地址。

    print(id(123))  # 1674055952
    print(id('abc'))  # 2033192957072

      1.2.3文件操作相关

      open:函数用于打开一个文件,创建一个 file 对象,相关的方法才可以调用它进行读写。

      1.2.4模块相关__import__ 

      __import__:函数用于动态加载类和函数 。

      1.2.5帮助

      help:函数用于查看函数或模块用途的详细说明。

  • 相关阅读:
    PAT甲级——A1059 Prime Factors
    PAT甲级——A1058 A+B in Hogwarts
    PAT甲级——A1057 Stack
    hdu2665 主席树模板题
    存两个图论模板
    存两个图论模板
    存两个图论模板
    codevs1080 第一次用ZKW线段树
    codevs1080 第一次用ZKW线段树
    codevs1080 第一次用ZKW线段树
  • 原文地址:https://www.cnblogs.com/wdbgqq/p/9205639.html
Copyright © 2011-2022 走看看