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='\n', file=None): # known special case of print """ print(value, ..., sep=' ', end='\n', 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:函数用于查看函数或模块用途的详细说明。