day15 生成器面试题和内置函数
昨日内容回顾
# 迭代器和生成器
# 迭代器
# 可迭代协议 —— 含有iter方法的都是可迭代的
# 迭代器协议 —— 含有next和iter的都是迭代器
# 特点
# 节省内存空间
# 方便逐个取值,一个迭代器只能取一次。
# 生成器 —— 迭代器
# 生成器函数
# 含有yield关键字的函数都是生成器函数
# 生成器函数的特点
#调用之后函数内的代码不执行,返回生成器
#每从生成器中取一个值就会执行一段代码,遇见yield就停止。
#如何从生成器中取值:
# for :如果没有break会一直取直到取完
# next :每次只取一个
# send :不能用在第一个,取下一个值的时候给上个位置传一个新的值
# 数据类型强制转换 :会一次性把所有数据都读到内存里
# 生成器表达式
# (条件成立想放在生成器中的值 for i in 可迭代的 if 条件)
一、作业讲解及生成器面试题讲解
例1 .处理文件,用户指定要查找的文件和内容,将文件中包含要查找内容的每一行都输出到屏幕
def check_file(filename, aim): with open(filename, encoding='utf-8') as f: for i in f: if aim in i: yield i g = check_file('D:\\python学习视频\\day15\\day15课堂笔记\\1.复习.py', '生成器') for i in g: print(i.strip())
例2 写生成器,从文件中读取内容,在每一次读取到的内容之前加上‘***’之后再返回给用户。
def generator(filename): with open(filename, encoding='utf-8') as f: for i in f: yield '***'+i g = generator('D:\\python学习视频\\day15\\day15课堂笔记\\1.复习.py') for i in g: print(i.strip())
面试题一
# 面试题1 def demo(): for i in range(4): yield i g = demo() g1 = (i for i in g) g2 = (i for i in g1)
#print(list(g)) #print(list(g1)) print(list(g2))
面试题2
# 面试题2 def add(n,i): return n+i def test(): for i in range(4): yield i g = test() #得到生成器函数,但是并没有执行函数内部的代码 for n in [1, 10]: g=(add(n, i) for i in g) print(list(g))
# 执行过程:
# n = 1
# g = (add(n, i) for i in g)
# n = 10
# g = (add(n, i) for i in g)
# n = 5
# g = (add(n, i) for i in g)
# g = (add(n, i) for i in (add(n, i) for i in (add(n, i) for i in test())))
# g = (add(n, i) for i in (add(n, i) for i in (add(n, i) for i in [0,1,2,3]))) # n = 5
# g = (add(n, i) for i in (add(n, i) for i in [5,6,7,8])) # n = 5
# g = (add(n, i) for i in [10,11,12,13]) # n = 5
# g = [15,16,17,18]
二、内置函数
1.作用域相关
# print(locals()) #返回本地作用域中的所有名字
# print(globals()) #返回全局作用域中的所有名字
2.其他
字符串类型代码的执行
http://www.cnblogs.com/Eva-J/articles/7266087.html
# exec('print(123)') # eval('print(123)') # print(eval('1+2+3+4')) # 有返回值 # print(exec('1+2+3+4')) #没有返回值 # exec和eval都可以执行 字符串类型的代码 # eval有返回值 —— 有结果的简单计算 # exec没有返回值 —— 简单流程控制 # eval只能用在你明确知道你要执行的代码是什么
code = '''for i in range(3):
print(i*'*')
'''
exec(code)
compile 将字符串类型的代码编译。代码对象能够通过exec语句来执行或者eval()进行求值。
code1 = 'for i in range(0,10): print (i)' compile1 = compile(code1,'','exec') exec(compile1) code2 = '1 + 2 + 3 + 4' compile2 = compile(code2,'','eval') print(eval(compile2)) code3 = 'name = input("please input your name:")' compile3 = compile(code3,'','single') exec(compile3) #执行时显示交互命令,提示输入 print(name) name #执行后name变量有值
输入输出相关:
input()
s = input("请输入内容 : ") #输入的内容赋值给s变量 print(s) #输入什么打印什么。数据类型是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: 立即把内容输出到流文件,不作缓存 """
f = open('tmp_file','w') print(123,456,sep=',',file = f,flush=True)
打印进度条的例子
import time for i in range(0,101,2): time.sleep(0.1) 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) # \r 可以把光标移动到行首但不换行
# dir 查看一个变量拥有的方法 # print(dir([])) # print(dir(1)) # help # help(str) # callable 查看函数能否被调用 # print(callable(print)) # a = 1 # print(callable(a)) # print(callable(globals)) # def func():pass # print(callable(func)) import time # t = __import__('time') # print(t.time()) # 某个方法属于某个数据类型的变量,就用.调用 # 如果某个方法不依赖于任何数据类型,就直接调用 —— 内置函数 和 自定义函数
# f = open('1.复习.py')
# print(f.writable())
# print(f.readable())
#id
#hash - 对于相同可hash数据的hash值在一次程序的执行过程中总是不变的
进制转换:bin(二) oct(八) hex(十六)
abs 绝对值 divmod(7,2)除余 round取小数点 pow 幂运算 sum max min
# print(bin(10)) # print(oct(10)) # print(hex(10)) # print(abs(-5)) # print(abs(5)) # print(divmod(7,2)) # div除法 mod取余 # print(divmod(9,5)) # 除余 # print(round(3.14159,3)) # print(pow(2,3)) #pow幂运算 == 2**3 # print(pow(3,2)) # print(pow(2,3,3)) #幂运算之后再取余 # print(pow(3,2,1)) # ret = sum([1,2,3,4,5,6]) # print(ret) # ret = sum([1,2,3,4,5,6,10],) # print(ret) # print(min([1,2,3,4])) # print(min(1,2,3,4)) # print(min(1,2,3,-4)) # print(min(1,2,3,-4,key = abs)) # print(max([1,2,3,4])) # print(max(1,2,3,4)) # print(max(1,2,3,-4)) # print(max(1,2,3,-4,key = abs))