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:函数用于查看函数或模块用途的详细说明。

原文地址:https://www.cnblogs.com/wdbgqq/p/9205639.html