python--内置函数
对迭代器与生成器的区别
迭代器和生成器
迭代器
可迭代协议-含有iter方法的都是可迭代的
迭代器协议-含有next和iter的都是迭代器
特点:节省内存空间
方便逐个取值,一个迭代器只能取一次
生成器
生成器函数
含有yield关键字的函数都是生成器函数
生成器函数的特点:
调用之后函数内的代码不执行,返回生成器
每次从生成器中取一个值就会扫一段代码,遇见yield停止
如何从生成器中取值:
for:如果没有break会一直取完
next:每次只取一个
send:不能用第一个,取下一个值的时候给上个位置传一个新值
生成器表达式:
条件成立想放在生成器中的值 for in 可迭代的if条件
内置函数:
作用域相关: 1.globals() 获取全局变量的字典 2.locals() 获取执行本方法所在命名空间内的局部变量的字典 3.global 使用场景和作用域不一样 迭代器: 1.__next__()与next() 迭代器的实现方法: def next(迭代器):实现方法(简易) 迭代器.__next__() 迭代器 = iter(可迭代的) 2.range()是可迭代的但不是一个迭代器,range()迭代后没有生成对象 例:'__next__' in iter(range(10)) 如果想要打印range(),需加list(range())或其它打印迭代器的对象 调用相关: 1.dir() 查看对像的属性和方法 2.callable() 查看对象是否可调用,返回值True和False 例:callable(print) def func_1():pass callable(func_1) 其它: help() 查看方法名的用法 help与dir help仔细查找,帮助 dir简略查找 例:help(dir) 退出按'q' 模块相关: 1.import 2.time = __import__('time') 不常用 文件相关: open() 例: print(f.writable()) 能不能写 print(f.readable()) 能不能读 内存相关: 1.id() 2.hash() 注意: 1.对一次程序执行中,保证可哈希的值不会变 2.把可哈希的数据类型转换为一串数字 3.字典的寻址方式 输入输出相关: 1.input() 2.print() 例:print有很多种参数,有很多方式接收传进来的值 a. print(1,2,3,4,5,sep='|') b. print(1,2,3,end='') 将输入内容输出到文件 c. f = open('file','w') print('aaaa',file=True) f.close() d. 老师写的进度条显示,其中用到知识点关键点为格式化输出,flush=True ''' import time for i in range(0,101,2): time.sleep(0.01) char_num = i//2 #打印多少个'*' per_str = '\r%s%% : %s\n' % (i, '*' * char_num) if i == 100 else '\r%s%% : %s'%(i,'*'*char_num) print(per_str,end='', flush=True) ''' 另外方面:progress Bar(为专业打印进度条) 字符串代码执行: 1.compile(source, filename, mode[, flags[, dont_inherit]]) ''' source -- 字符串或者AST(Abstract Syntax Trees)对象。。 filename -- 代码文件名称,如果不是从文件读取代码则传递一些可辨认的值。 mode -- 指定编译代码的种类。可以指定为 exec, eval, single。 flags -- 变量作用域,局部命名空间,如果被提供,可以是任何映射对象。。 flags和dont_inherit是用来控制编译源码时的标志 ''' 字符串类型的代码编译。代码对象能够通过exec语句或eval进行求值 2.eval(expression[, globals[, locals]]) ''' expression -- 表达式。 globals -- 变量作用域,全局命名空间,如果被提供,则必须是一个字典对象。 locals -- 变量作用域,局部命名空间,如果被提供,可以是任何映射对象。 ''' eval有返回值,eval一般时候不用, 只能用在你明确知道你要执行的代码是什么 流程,执行,交互 3.exec obj ''' obj -- 要执行的表达式 ''' exec 返回值永远为 None。执行储存在字符串或文件中的Python语句,exec没有返回值 例: 1. name = input('>>>') 上面第二条相关 eval(name) name可嵌套代码,危险 2. code1 = 'for i in range(10):print(i)' #流程 com = comple(code1,'','exec') code2 = '1+2+3' #执行 com = compile(code2,'','eval') code3 = 'name = input('>>')' #交互 com = compile(code3,'','sigle') exec(com) #pyCharm会报错,但执行后无错 print(name)