python面试题

1.去重,集合

  集合的一个重要特点是:自动去除重复的值

li = [1,2,3,1,1,2,2,3,3]#去除重复的元素
set = set(li)    #转换为集合,因为集合会自动去重。
print(set)
li = list(set)#将集合转换为列表
print(li)

 2.生成器

  规则:生成器函数,或者生成器表达式,在调用后返回生成器,但生成器内部的函数没有执行,只有在从生成器中取值是,其内部的函数才执行。

     一个生成器只能只能用一次:将一个生成器中的值全部取出来之后,再从中取值得到的是空。

  从生成器中取值:

    for:如果没有break,会一直取知道取完。

    next:一个一个取

    send:取下一个值得同时给上一个位置传入一个新的值,使用send之前要先用一次next。

    数据类型强转:会一次性把所有的数据都读到内存里。

  在生成器表达式外有for循环时,把for循环拆开来分析。  

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(g1))
print(list(g2))

在执行list(g1)之前,生成器函数,生成器表达式中的内容都没有执行。(只有从生成器中取值时,生成器函数,生成器表达式中的内容才会执行)

当执行list(g1)时,就是从g1这个生成器中取值(数据类型强转),g1又去找g要值,所以执行结果是:[0,1,2,3]。

当执行list(g2)时,g2生成器会找g1生成器要值,而list(g1)语句,以及将生成器g1中的值取出来,所以g1是空,执行结果为:[]

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

同上:在list(g)之前,生成器函数,生成器表达式内的语句都没有执行。只有当取生成器中的值得时候才执行。

遇见for循环里面有生成器表达式,将for循环拆解开来。

  n = 1

  g = (add(n,i) for i in g)

  n = 10

  g = (add(n,i) for i in g)

当执行list(g)时,生成器函数或者是生成器表达式中的内容开始执行。

n就变成了循环中的最后一个值。

for循环中就变为:

  n = 10

  g = (add(n,i) for i in (add(n,i) for i in test()))

结果为:[20,21,22,23]

进度条打印

import time
def down():
    for i in range(0,101,2):
        time.sleep(0.1)
        char_num = i//2 #对i取商
        #\r是每次打印从头打印,%%打印%
        #当i=100时,在最后打印一个换行符,保证再有内容输入时,从下一行输入。
        str = '\r%s%% : %s\n'%(i,'*'*char_num) if i == 100 else '\r%s%% : %s'%(i,'*'*char_num)
        print(str,end='',flush=True) #end:每次输入的结束符号
down()
print('下载完成')

匿名函数和内置函数

  考察匿名函数式往往会结合内置函数。

  可以结合匿名函数的内置函数:

    min:求最小值,min(iterable,key)

    max:同上

    filtre:  ilter()函数接收一个函数 f 和一个list,这个函数 f 的作用是对每个元素进行判断,返回 True或 False,filter()根据判断结果自动过滤掉不符合条件的元素,返回由符合                             条件元素组成的新list。filter(f,list)。结果不大于原来的list

    map:  map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回。结果等于原来的list

    sorted: 函数sorted进行排序(从2.4开始),返回副本,原始输入不变

        与sort的区别:函数sort进行排序,在本地进行排序,不返回副本       

        语法:sort(iterable,key,reverse)

          iterable:是可迭代类型;
          key:传入一个函数名,函数的参数是可迭代类型中的每一项,根据函数的返回值大小排序;
          reverse:排序规则. reverse = True  降序 或者 reverse = False 升序,有默认值(False)。
          返回值:有序列表

1.

#用匿名函数将两个元组('a','b'),('c','d')变为[{'a':'b'},{'c':'d'}]
def func(x):
    return {x[0]:x[1]}
ret = zip(('a','b'),('c','d'))#输出('a','c')   ('b','d')
result = map(func,ret)
print(list(result))

#一行代码实现
print(list(map(lambda trup:{trup[0]:trup[1]},zip(('a','b'),('c','d')))))

2.

def multipliers():
    return [lambda x:i*x for i in range(4)]#列表推导式
                            #执行完后:[lambda x:i*x,lambda x:i*x,lambda x:i*x,lambda x:i*x]
print([m(2) for m in multipliers()])
#执行 multipliers(),返回一个列表(由列表推导式得到的)
#执行for m in multipliers(),m就是列表里的每一个匿名函数
#m(2)就是调用匿名函数
#执行m(2)时,2传给x,i最后是=3,所以lambda x:i*x  -->  3*2

#结果:[6, 6, 6, 6]



def multipliers():
    return (lambda x:i*x for i in range(4))#生成器表达式
print([m(2) for m in multipliers()])
#执行multipliers(),执行这个函数,返回一个生成器,而生成器表达式中的语句没有执行
#执行一次for循环就相当于执行一次next()
#执行一次for m in multipliers(),再执行一次lambda x:i*x for i in range(4),再执行一次m(2)
#                                         lambda x:0*x ---> m(2)   0*2=0
#                                         lambda x:1*x ---> m(2)   1*2=2
#                                         lambda x:2*x ---> m(2)   2*2=4
#                                         lambda x:3*x ---> m(2)   3*2=6

#结果:[0, 2, 4, 6]

 

posted @ 2019-05-07 11:18  heart丶real  阅读(210)  评论(0编辑  收藏  举报