# # 复习
# # 迭代器和生成器
# 迭代器
# 可迭代协议——含有iter方法的都是可迭代的
# 迭代器协议——还有next和iter的都是迭代器
#
# 特点
# 节省内存空间
# 方便逐个取值,一个迭代器只能取一次
#
# 生成器——所有的生成器都是迭代器
# 生成器函数
# 含有yield关键字的函数都是生成器函数
# 生成器函数的特点
# 调用之后函数内的代码不执行,返回生成器
# 每次从生成器中取一个值就会执行一段代码,遇见yield就停止
# 如何从生成器中取值:
# for循环:如果没有break会一直取,直到取完
# next:每次只取一个
# send:不能用在第一个,取下一个值得时候给上一个位置传一个新的值
# 预激活 可以使用装饰器修饰
# 数据类型强制转换:会一次性把所有数据都取到
#
# 生成器表达式
# (条件成立,想放在生成器中的值 for i in 可迭代的 if 条件)
#
# # 1、处理文件,用户指定要查找的文件和内容,将文件正包含要查找内容每一行都输出到屏幕上
# def output_file_result(file,content):
# with open(file=file,mode='r',encoding='UTF-8') as f: # 句柄handler,文件操作符,文件句柄
# for line in f:
# if content in line:
# yield line.strip()
# ret = output_file_result('file','python')
# for i in ret:
# print(i)
#
# # 2、写生成器,从文件中读取内容,在每一次读取到的内容之前加上'***'之后再返给用户
# def output_file_result_g():
# with open(file='file',mode='r',encoding='UTF-8') as f:
# for line in f:
# yield '***'+line.strip()
# ret = output_file_result_g()
# for i in ret:
# print(i)
# def generator():
# for i in range(3):
# yield i
# g = generator()
# g1 = (i for i in g)
# g2 = (i for i in g1)
# print(list(g1))# [0, 1, 2]
# print(list(g2))# []
# def add(n,i):
# return n+i
#
# def test():
# for i in range(4):
# yield i
#
# g = test()
# for n in [1,10,5]:
# g = (add(n,i) for i in g)
#
# # 解析步骤如下所示:
# 1
# g = (add(n,i) for i in g)
# 10
# g = (add(n,i) for i in g)
# 5
# g = (add(n=5,i(10,11,12,13)) for i in (add(n=5,i(5,6,7,8)) for i in (add(n=5,i(0,1,2,3)) for i in g)))
#
# print(list(g)) # list(g)才是执行状态
# 内置函数
# print(locals())#返回本地作用域中的所有名字
# print(globals())#返回全局作用域中的所有名字
# global 变量
# nonlocal 变量
# 迭代器.__next__()
# next(迭代器)
# def next(迭代器):
# 迭代器.__next__()
# [].__len__() = len([])
# 迭代器 = iter(可迭代的)
# 迭代器 = 可迭代的.__iter__()
# range(1,11)
# range(1,11,2)
# dir 查看一个变量拥有的方法
# print(dir([]))
# print(callable(print)) # True 确认是否是函数名,是否可以被调用
# print(callable(globals))# True
# print(help(str)) # 输出可调用方法名以及其用法
# import time
# time = __import__('time')
# print(time.time())
# 某个方法属于某个数据类型的变量,据用.调用
# 如果某个方法不依赖任何数据类型,就直接调用——内置函数和自定义函数
# f = open('log') # open是内置函数
# print(f.writable()) # 检测是否可写
# print(f.readable()) # 检测是否可读
# id
# print(hash(123)) # 123
# print(hash('12242'))# 8424298810427281872
# print(hash((1,2,)))# 3713081631934410656
# print(hash((1,2,)))# 3713081631934410656
# print(hash([])) # TypeError: unhashable type: 'list'
# 对于相同可以hash的数据的hash值在一次的执行过程中总是不变的
# 字典寻址,通过hash值
# ret = input('提示:')
# print(ret)
# print('啊哈哈哈',end='')# 指定输出结束符
# print('啊哈哈哈',end='')
# 啊哈哈哈啊哈哈哈
# print(1,2,3,4,5,sep='|') # 1|2|3|4|5 指定输出多个值之间的分隔符
# f = open('log','w') #
# print('aaa',file=f)
# f.close()
# import time
# for i in range(0,101,2):
# time.sleep(0.3)
# char_num = i//2 # 整除
# per_str = '
%s%%:%s
' % (i,'*'*char_num) if i==100 else '
%s%%:%s'%(i,'*'*char_num) #
回到行首
# print(per_str,end='',flush=True) # flush = true,直接输出,不等其它数据的缓存
# # progress_Bar
# exec('print(123)') #123
# eval('print(123)') #123
# print(exec('(1+2+3)')) # None
# print(eval('(1+2+3)'))# 6
# exec 和eval都可以执行字符串类型的代码,但是区别是eval有返回值,而exec无返回值
# eval只能用在明确知道你要执行的代码是什么
# exec 没有返回值——简单的流程控制
# eval 有返回值——有结果的简单计算
# code = '''for i in range(10):
# print(i*'*')'''
# exec(code)
# code1 = 'for i in range(1,10):print(i)' # 编译成可执行模式
# compile1 = compile(code1,'','exec')
# exec(compile1) # 1 2 3 4 5 6 7 8 9 10
# code1 = '1+2+3+4' # 编译成可执行模式
# compile1 = compile(code1,'','eval')
# print(eval(compile1)) # 10
# code = 'name = input("please input your name:")'
# compile1 = compile(code,'','single')
# exec(compile1)
# print(name) # 输出input输入的内容,pycharm
# 复数——complex
# 实数:有理数 和 无理数
# 虚数:虚无缥缈的数 比方说负数的平方是负数
# 复数 :5+12j 5是实数,12是虚数 == 复数
# 浮点数(有限循环小数,无线循环小数) == 小数:无限不循环小数不属于浮点数
# 浮点数
# 354.123 = 3.54123*10**2f = 35.4123*10
# f = 1.84653245783465834 # 1.8465324578346582 浮点数特别长久会出现不准的情况,因为二进制转换出问题
# print(bin(10)) # 0b1010 10进制
# print(oct(10)) # 0o12 8进制
# print(hex(10)) # 0xa 16进制
# print(abs(-5)) # 求绝对值
# print(divmod(10,2)) #(5, 0) div除法 mod取余 == 除余方法
# print(round(3.141592,3)) # 3.142
# print(pow(2,3)) # 8 pow幂运算 2**3
# print(pow(3,2,1)) # 3的2次幂取1余 0
# print(sum([1,2,3])) # 6
# print(sum([1,2,3],10)) # 16 累加
# print(min([6,1,2,3,4,5])) # 1
# print(min(6,4,2,3,-4,5)) # -4
# print(min(-4,2,3,-3,key=abs)) # 2 求绝对值的最小值
# print((-4,2,3,-3,key=abs)) # 2 求绝对值的最小-4大值