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))

 

posted @ 2019-03-13 16:40  pumpkin_J  阅读(88)  评论(0编辑  收藏  举报