• 常用的内置函数


    内置函数流程图:https://www.processon.com/view/link/5b4ee15be4b0edb750de96ac

      什么是内置函数?就是Python给你提供的,拿来直接用的函数,比如print,input等等。截止到python版本3.6.2,现在python一共为我们提供了68个内置函数。它们就是python提供给你直接可以拿来使用的所有函数。

    以下我们将列出比较重要的函数:

    1、作用域相关的:

      locals   :函数会以字典的类型返回当前位置的全部局部变量。
      globals :函数以字典的类型返回全部全局变量。

    def test():
        name = 'wang'
        print(locals())
    
    test()
    
    # 运行结果:
    {'name': 'wang'}

     2、字符串执行相关的: eval、exec、compile

      2.1:eval  执行字符串类型的代码,并返回最终结果。

    print(eval(‘3+4’))  # 执行字符串里面的代码
    
    运行结果: 7  
    
    ret = eval('{"name":"老司机"}')  # 
    print(ret)
    
    执行输出: {'name': '老司机'}

      总结: eval的作用相当于拨开字符串2边的引号,执行里面的代码,在文本输入和字符串转换时常用

      2.2:exec  执行字符串类型的代码,流程语句。

    print(exec('3+4'))
    
    执行输出: None
    
    
    ret1 = '''
    li = [1,2,3]
    for i in li:
        print(i)
    '''
    print(exec(ret1))
    
    执行输出:
    1
    2
    3
    None
    
    
    eval和exec 功能是类似的都是拨开引号,执行内部代码:
    区别:
    1.eval有返回值,exec没有没有值
    2.exec适用于有流程控制的,比如for循环。eval只能做一些简单的。
    注意在工作中不能使用这个函数。

      2.3:compile:将字符串类型的代码编译。代码对象能够通过exec语句来执行或eval()进行求值。

    code1 = 'for i in range(0,3): print (i)'
    compile1 = compile(code1,'','exec')     # 固定格式,中间有分隔
    exec (compile1)
    
    执行结果:
    0
    1
    2

    3、输入输出相关 input、print:

      input;函数接受一个标准输入数据,返回为string类型

      print:打印输出

    #print(self, *args, sep=' ', end='
    ', file=None)
    print(333,end='')
    print(666,)
    
    执行输出:
    333666
    
    # 默认是用空格拼接
    print(11, 22, 33)
    执行输出:
    11 22 33
    
    sep 将每一个字符串拼接起来,这里指定使用|
    print(11, 22, 33, sep = '|')
    
    执行输出:
    11|22|33
    
    #输出方式,当file = None默认是向屏幕输出
    with open('log.txt',encoding='utf-8',mode='w') as f1:
        print('5555',file=f1)
    
    执行程序,查看log.txt文件内容为: 555

    4、内存相关 hash  、 id:

      4.1 :id  用于获取对象的内存地址

    a = 123
    print(id(a))
    
    执行输出:
    
    1500668512

      4.2:hash 获取一个对象(可哈希对象:int、str、Bool、tuple)的哈希值

    print(hash(123)) #数字不变
    print(hash('123'))  # 字符串会进行hash
    
    执行输出:
    123
    4876937547014958447
    
    # true和False的哈希值对应1和0

    5、模块相关 __import__,它其实使import的原生,import time 类似等于 time =__import__('time')

      __import__ :函数用于动态加载类和函数。适用于代码中

    6、调用相关:

      6.1:callable 函数用于检查一个对象是否可调用。如果返回True,object仍然可能调用失败;但是如果返回False,调用对象object绝对不会成功调用

    def func1():
        print(555)
    a = 3
    f = func1
    print(callable(f))
    print(callable(a))  # 函数或则类的对象的方法,字符串是不行的
    
    执行输出:
    True
    False

    print(callable(print)) # 显然这里是可以调用print的,所以结果是True
    # callable其实就是判断一个对象是否是函数,是就返回True,其他类型直接返回False

    7、查看内置属性:

      dir:函数不带参数时,返回当前范围内的变量、方法和定义的类型列表;带参数时,返回参数的属性、方法列表。

    如果参数包括方法__dir__(),该方法将被调用。如果参数不包括__dir__(),该方法将最大限度地收集参数信息。

    print(dir(list))
    
    执行输出:
    
    ['__add__', '__class__', '__contains__'...] 

    8、迭代器、生成器相关:

      8.1:range 函数可创建于一个整数对象,一般用于在for循环中。

      8.2:next 内部实际使用了__next__方法,返回迭代器的下一个项目。

    # 首先获得Iterator对象:
    it = iter([1, 2, 3, 4, 5])
    # 循环:
    while True:
        try:
            # 获得下一个值:
            x = next(it) #next内部封装了__next__方法,都是求下一个值
            print(x)
        except StopIteration:
            # 遇到StopIteration就退出循环
            break

    执行输出:

    1
    2
    3
    4
    5 

       8.3:iter 函数用于生成迭代器(将一个可迭代对象,转化为一个迭代器)。

    from collections import Iterable
    from collections import Iterator
    l = [1,2,3]
    print(isinstance(l,Iterable))  # 判断是否可迭代
    print(isinstance(l,Iterator))  # 判断是否为迭代器
    
    执行输出:
    True
    False
    
    
    from collections import Iterable
    from collections import Iterator
    l = [1,2,3]
    l1 = iter(l) #生成迭代器
    print(isinstance(l1,Iterable))
    print(isinstance(l1,Iterator))
    
    执行输出:
    
    True
    True

    9、数字相关:

      9.1:bool 用于将给定参数转化为布尔类型,如果没有参数,返回False。

      9.2:int  用于将一个字符串或数字转换为整型。 

    print(int())
    print(int('12'))
    print(int(3.6))
    print(int('0100',base=2))  # 将2进制的 0100 转化成十进制。结果为 4
    
    执行输出:
    0
    12
    3
    4

       9.3:float 用于将整数和字符串转化成浮点类型

       9.4:complex 用于创建一个值为 real + imag*j 的复数或者转化一个字符串为复数。如果第一个参数为字符串,则不需要指定第二个参数

    print(type(3.14))
    print(float(3))
    
    执行输出:
    
    <class 'float'>
    3.0
    
    #保留两位小数:
    a = 0.005
    print(float('%.2f'%a))
    
    执行结果:  0.01

      9.5:进制的转化

        ✴bin:将十进制转换成二进制并返回。
        ✴oct:将十进制转化成八进制字符串并返回。
        ✴hex:将十进制转化成十六进制字符串并返回。
    
    print(bin(5))
    print(oct(7))
    print(hex(10)) #10用a表示
    
    执行输出:
    
    0b101
    0o7
    0xa

    #数值

    print(format(3, 'b')) # 二进制
    print(format(97, 'c')) # 转换成unicode字符
    print(format(11, 'd')) # 十进制
    print(format(11, 'o')) # 八进制
    print(format(11, 'x')) # 十六进制(小写字⺟)
    print(format(11, 'X')) # 十六进制(大写字⺟)
    print(format(11, 'n')) # 和d一样
    print(format(11)) # 和d一样

    #浮点

    print(format(123456789, 'e')) # 科学计数法. 默认保留留6位小数
    print(format(123456789, '0.2e')) # 科学计数法. 保留留2位小数(小写)
    print(format(123456789, '0.2E')) # 科学计数法. 保留留2位小数(大写)
    print(format(1.23456789, 'f')) # 小数点计数法. 保留留6位小数
    print(format(1.23456789, '0.2f')) # 小数点计数法. 保留留2位小数
    print(format(1.23456789, '0.10f')) # 小数点计数法. 保留留10位小数
    print(format(1.23456789e+10000, 'F')) # 小数点计数法.

    10、数学运算:

        ✴abs:函数返回数字的绝对值。
        ✴divmod:计算除数与被除数的结果,返回一个包含商和余数的元组(a // b, a % b)。
         round:保留浮点数的小数位数,默认保留整数。
         pow:求x**y次幂。(三个参数为x**y的结果对z取余)
    
    print(abs(-20)) #绝对值     执行输出: 20
    
    print(divmod(10,3)) #计算除数与被除数的结果    执行输出:(3, 1)
    
    print(round(3.1415))   #默认取整  执行输出: 3
    print(round(3.1415,2))   # 保留两位   3.14
    
    print(pow(2,3,5)) #求x**y次幂(三个参数为x**y的结果对z取余)
    #解释:这里为3个参数,2的3次方,结果为8。用8和5做除法,取余为3,最终输出3
    
    ✴✴✴sum:对可迭代对象进行求和计算(可设置初始值)。
    ✴✴✴min:返回可迭代对象的最小值(可加key,key为函数名,通过函数的规则,返回最小值)。
    ✴✴✴max:返回可迭代对象的最大值(可加key,key为函数名,通过函数的规则,返回最大值)。
    
    print(sum([1,2,3,4]))  # 10
    #注意,sum最多只有2个参数,且里面必须是可迭代对象。
    
    ret = max([1,2,-5],key=abs) # 按照绝对值的大小,返回此序列最大值
    print(ret)     # 结果 -5  key表示定义规则

     ret = max([1,2,-5],key=lambda x:x>1)
     print(ret)   # 2

     11、和数据结构相关:

    列表和元祖
        ✴✴✴list:将一个可迭代对象转化成列表(如果是字典,默认将key作为列表的元素)。
        ✴✴✴tuple:将一个可迭代对象转化成元祖(如果是字典,默认将key作为元祖的元素)。
    
    相关内置函数
         ✴✴✴reversed:将一个序列翻转,并返回此翻转序列的迭代器。
         slice:构造一个切片对象,用于列表的切片。
    
    ite = reversed(['a',2,3,'c',4,2])
    for i in ite:
        print(i)
    
    执行输出:
    2
    4
    c
    3
    2
    a
    
    li = ['a','b','c','d','e','f','g']
    sli_obj = slice(3)     #从0切到3
    print(li[sli_obj])
    
    执行输出: 
    ['a', 'b', 'c']
    如果有10个列表,统一切前3个,sli_obj可能有点用
    
    slice几乎用不到
    slice可以定义一个切片规则

    12、字符串相关:

      ✴✴✴str:将数据转化成字符串。
      ✴✴✴format:用于格式化输出。
    
    字符串可以提供的参数,指定对齐方式,<是左对齐, >是右对齐,^是居中对齐
    
    print(format('test', '<20'))
    print(format('test', '>20'))
    print(format('test', '^20'))
    
    执行输出
    test               
                    test
            test  
    
    
      ✴✴✴bytes:用于不同编码之间的转化
    # 编码转换,将unicode转换为utf-8
    #方法一
    s1 = '老司机'
    s2 = s1.encode('utf-8')
    print(s2)
    #print(s2.decode('utf-8')) #解码
    
    执行输出:
    b'xe8x80x81xe5x8fxb8xe6x9cxba'
    
    #方法二
    s1 = '老司机'
    print(bytes(s1,encoding='utf-8'))  # 结果于上一致

       总结:bytes:只能编码,将unicode--->非unicode,不能解码

    ***bytearry:返回一个新字节数组。这个数组里的元素是可变的,并且每个元素的值范围: 0 <= x < 256。
    
    ret = bytearray('alex',encoding='utf-8') #4个字母对应的ascii顺序[97,108,101,120]
    print(id(ret))
    print(ret)
    print(ret[0]) #97 是ascii码的顺序
    ret[0] = 65 #65是大写a的位置
    print(ret)
    print(id(ret))
    
    执行输出:
    2177653717736
    bytearray(b'alex')
    97
    bytearray(b'Alex')
    2177653717736
    
    
    ***memoryview:本函数是返回对象obj的内存查看对象。所谓内存查看对象,就是对象符合缓冲区协议的对象,为了给别的
    代码使用缓冲区里的数据,而不必拷贝,就可以直接使用。 ret
    = memoryview(bytes('你好',encoding='utf-8')) print(len(ret)) # utf-8的bytes类型,放在一个list中 [xe4,xbd,xa0,xe5,xa5,xbd] print(ret) print(bytes(ret[:3]).decode('utf-8')) print(bytes(ret[3:]).decode('utf-8')) print('你好'.encode('utf-8')) 执行输出: 6 <memory at 0x0000016FD6AC0108> 你 好 b'xe4xbdxa0xe5xa5xbd' ✴ord:输入字符找该字符编码的位置 ✴chr:输入位置数字找出其对应的字符 ascii:是ascii码中的返回该值,不是就返回u... print(ord('a')) #ascii码的位置 print(chr(98)) #98对应a print(ord('')) #按照unicode查找 print(ascii('')) #不是ascii码就返回u... 执行输出: 97 b 20013 'u4e2d' ✴✴✴repr:返回一个对象的string形式(原形毕露)。 #%r 原封不动的写出来 name = 'taibai' print('我叫%r' % name) #repr 原形毕露 print(repr('{"name":"alex"}')) print('{"name":"alex"}') 执行输出: 我叫'taibai' '{"name":"alex"}' {"name":"alex"}

     13、数据集合:

      ✴✴✴dict:创建一个字典。
      ✴✴✴set:创建一个集合。
      frozenset:返回一个冻结的集合,冻结后集合不能再添加或删除任何元素。
      相关内置函数
          ✴✴✴len:返回一个对象中元素的个数。
          ✴✴✴sorted:对所有可迭代的对象进行排序操作。
    
    li = [1,2,7,8,5,4,3]
    print(sorted(li)) #默认升序
    
    执行输出:
    [1, 2, 3, 4, 5, 7, 8]
    
    #改变默认值排序:
    li = [1,-2,-7,8,5,-4,3]
    print(sorted(li,reverse=True,key=abs))
    
    执行输出:
    [8, -7, 5, -4, 3, -2, 1]
    
    ✴✴✴enumerate:枚举,返回一个枚举对象。 (0, seq[0]), (1, seq[1]), (2, seq[2])
    
    li = ['jack', 'rose', 'wusir', '嫂子', '老司机']
    print(enumerate(li))
    print('__iter__' in dir(enumerate(li)))
    print('__next__' in dir(enumerate(li)))
    
    执行输出:
    <enumerate object at 0x00000223DD887828>
    True
    True
    
    #enumerate 是一个迭代器:
    li = ['jack', 'rose', 'wusir', '嫂子', '老司机']
    for i in enumerate(li):
        print(i)
    
    执行输出:
    (0, 'jack')
    (1, 'rose')
    (2, 'wusir')
    (3, '嫂子')
    (4, '老司机')
    
    返回结果为:列表元素的索引以及对应的值
    
    #enumerate的第2个参数,表示从多少开始。默认从1开始
    li = ['jack', 'rose', 'wusir', '嫂子', '老司机']
    for k,v in enumerate(li,10):
        print(k,v)
    
    执行输出:
    10 jack
    11 rose
    12 wusir
    13 嫂子
    14 老司机
    
      ✴all:可迭代对象中,全都是True才是True
      ✴any:可迭代对象中,有一个True 就是True
    
    print(all([1,2,True,0]))
    print(any([1,'',0]))
    
    执行输出:
    False
    True
    
     ✴✴✴zip:函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同
    print('__iter__' in dir(zip(l1,l2,l3,l4)))
    print('__next__' in dir(zip(l1,l2,l3,l4)))
    
    执行输出:
    True
    True
    
    zip也是一个迭代器
    zip 拉链方法 形成元组的个数与最短的可迭代对象的长度一样
    
    l1 = [1, 2, 3, 4]
    l2 = ['a', 'b', 'c', 5]
    l3 = ('*', '**', (1,2,3), 777)
    z = zip(l1,l2,l3)
    for i in z:
        print(i)
    
    执行输出:
    (1, 'a', '*')
    (2, 'b', '**')
    (3, 'c', (1, 2, 3))
    (4, 5, 777)
    
    我们把list当做列向量来看就很好理解了,zip就是拉链,把一件挂着的衣服拉起来。这就是zip的功能。所以
    当做列向量看,就是拉起来的拉链了。
    而转置的z就是把拉链放水平,多形象!

    #注意:zip结果取决于最短的一个,返回的数据是元组
    面试题,必考zip

     14、补充的最重要的几个内置方法:需要注意的时,以下的函数他们都为我们实现了循环取值的功能。所以搭配着lamada函数会很好使用。

    ✴✴✴filter:过滤·。
        filter 过滤 通过你的函数,过滤一个可迭代对象,返回的是True
    类似于[i for i in range(10) if i > 3]
    #取列表中的偶数
    def func(x):
        return x % 2 == 0
    ret = filter(func,[1,2,3,4,5,6,7])  # 通过一个函数过滤,不需要一个个的取,自带的
    print(ret)
    for i in ret:
        print(i)
    执行输出:
    <filter object at 0x0000021325A4B6D8>
    2
    4
    6
    2、li = [1,2,3,4]
    print(list(filter(lambda x:x>2,li))) #[3,4]
    
    ✴✴✴map:会根据提供的函数对指定序列做映射。(map也是一个迭代器)
    map相当于列表生成式循环模式
    1、
    def square(x): #计算平方数
        return x ** 2
    ret = map(square,[1,2,3,4,5]) #计算列表各个元素的平方
    for i in ret:
        print(i)
    执行输出:
    1 4 9 16 25

    2、li = [1,2,3,4,5]
    print(list(map(lambda x:x+10,li))) #[11, 12, 13, 14, 15]

    ✴✴✴reduce:

    从左到右对一个序列的项累计地应用有两个参数的函数,以此合并序列到一个单一值。

    例如,reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])  计算的就是((((1+2)+3)+4)+5)。

    如果提供了 initial 参数,计算时它将被放在序列的所有项前面,如果序列是空的,它也就是计算的默认结果值了

    from functools import reduce
    li = [1,2,3,4,5]
    def func(x,y):   # x=12345
      return x*10+y    # reduce 是做累计算的

    print(reduce(func,li)) 

    ###匿名函数:
    匿名函数:为了解决那些功能很简单的需求而设计的一句话函数.

    #返回一个数的平方
    使用函数方式:
    def func1(x):
    return x ** 2
    使用匿名函数一行搞定:
    func = lambda x:x ** 2
    print(func(5)) # 结果 25

     

    上面是我们对calc这个匿名函数的分析,下面给出了一个关于匿名函数格式的说明

    函数名 = lambda 参数 :返回值
     
    #参数可以有多个,用逗号隔开
    #匿名函数不管逻辑多复杂,只能写一行,且逻辑执行结束后的内容就是返回值
    #返回值和正常的函数一样可以是任意数据类型
    
    fun = lambda x,y:x+y
    print(fun(1,3))   # 结果 4
    
    # lambda单独拿出来,没有啥意义
    主要是和内置函数结合使用
    
    lambda 函数与内置函数的结合。
    sorted,map,fiter,max,min,reversed.
    #例1
    dic={'k1': 10, 'k2': 100, 'k3': 30}
    print(max(dic, key=lambda x: dic[x]))  #执行结果 k2
    
    x表示dic的key,返回值就是dic[x] 也就是dic的value
    lambda就是字典的value ,注意这里的dic,就是字典的键
    
    #例2
    res = map(lambda x:x**2,[1,5,7,4,8])
    #print(res)
    for i in res:
        print(i)
    
    执行输出:
    1
    25
    49
    16
    64

    15、递归:在函数中调用本身就是递归

    def func():
        print("我是谁")
        func()
    func()
    
    在python中递归的深度最大到998
    def foo(n):
        print(n)
        n += 1
        foo(n)
    foo(1)        # 1、2……996

    实例1:查看文件夹中的所有文件名:

    import os
    def read(filepath, n):
        files = os.listdir(filepath) # 获取到当前文件夹中的所有文件
        for fi in files: # 遍历⽂件夹中的⽂件, 这⾥获取的只是本层文件名
            fi_d = os.path.join(filepath,fi) # 加⼊文件夹 获取到⽂件夹+⽂件
            if os.path.isdir(fi_d): # 如果该路径下的文件是文件夹
                print("	"*n, fi) # 	就是缩进几个
                read(fi_d, n+1) # 继续进⾏相同的操作
            else:
                print("	"*n, fi) # 递归出口. 最终在这里隐含着return
    #递归遍历目录下所有⽂文件
    read('..', 0)
    1.用map来处理字符串列表,把列表中所有人都变成sb,比方alex_sb
    name=['oldboy','alex','wusir']
    print(list(map(lambda x:x+'_sb',name)))
    
    2、用map来处理下述l,然后用list得到一个新的列表,
    列表中每个人的名字都是sb结尾
    l=[{'name':'alex'},{'name':'y'}]
    print(list(map(lambda x:x['name']+'_sb',l)))
    
    3、用filter来处理,得到股票价格大于20的股票名字
    shares={
        'IBM':36.6,
        'Lenovo':23.2,
       'oldboy':21.2,
        'ocean':10.2,
     }
    print(list(filter(lambda x:shares[x]>20,shares)))
    
    4、有下面字典,得到购买每只股票的总价格,并放在一个迭代器中。
    结果:list一下[9110.0, 27161.0,......]
    portfolio = [
        {'name': 'IBM', 'shares': 100, 'price': 91.1},
        {'name': 'AAPL', 'shares': 50, 'price': 543.22},
        {'name': 'FB', 'shares': 200, 'price': 21.09},
        {'name': 'HPQ', 'shares': 35, 'price': 31.75},
        {'name': 'YHOO', 'shares': 45, 'price': 16.35},
        {'name': 'ACME', 'shares': 75, 'price': 115.65}]
    
    print(list(map(lambda x:x['shares']*x['price'],portfolio)))
    
    5、有下列三种数据类型,
    写代码,最终得到的是(每个元祖第一个元素>2,第三个*至少是4个。)
     [(3, 'wusir', '****'), (4, '太白', '*******')]这样的数据。
    
    l1 = [1,2,3,4,5,6]
    l2 = ['oldboy','alex','wusir','太白','日天']
    tu = ('**','***','****','*******')
    z=list(zip(l1,l2,tu))
    print(z)
    
    6、
    v =lambda :3
    print(v())  #3
    
    7、有两个字符串列表,a和b,每个字符是由逗号分隔的一些字符,(升级题)尽量做得支持扩展
    a = [
    'a,1',
    'b,3,22',
    'c,3,4',
    'f,5',
    ]
    b=[
    'a,2,1',
    'b,4',
    'd,2',
    'e,12',
    'g,12,43',
    'a,4354,6'
    ]
    # 按每个字符串的第一个值,合并a和b到c
    # c = [
    # 'a,1,2',
    # 'b,3,22,4',
    # 'c,3,4',
    # 'd,2',
    # 'e,12',
    # 'f,5'
    # ]
    
    if len(b)>len(a):
        a,b = b,a
    c=[]
    for i in a:
        flag = False
        removes = None
        i = i.strip()
        li=[i[0],i[2:],]
        for v in b:
            v=v.strip()
            if i[0]==v[0]:
                li.append(v[2:])
                flag,removes=True,v
                break
        print(li)
        c.append(','.join(li))
        if flag:
            b.remove(removes)
    else:
        c.extend(b)
    
    print(c)
    内置函数例题
    1.max的用法
    import re
    reg = re.compile('a*b*c*d*e*f*g*h*i*j*k*l*m*n*o*p*q*r*s*t*u*v*w*x*y*z*')
    #返回一个字符串里按字母表排序的最长子字符串
    def longest(s):
        print(reg.findall(s))
    #['abcde', 'ap', 'bcdef', '']
        return max(reg.findall(s), key=len)  # 此函数名必是返回一个整数的,可自定义函数
    #加或不加效果相同
    print(longest('abcdeapbcdefgh'))
    
    #结果
    ['abcde', 'ap', 'bcdefgh', '']
    bcdefgh
    
    2.compile的用法
    str = "for i in range(0,10): print(i)"
    c = compile(str,'','exec')
    print(c)  #<code object <module> at 0x10141e0b0, file "", line 1>
    
    exec(c)  #打印0,1,3.....
    
    3.eval的用法
    a=1
    g={'a':20}
    print(eval("a+1",g))  #对全局变量g进行操作  返回21
    误区

     实例2:二分法查找

    # 另类二分法, 很难计算位置.
    lst = [22, 33, 44, 55, 66, 77, 88, 99, 101, 238, 345, 456, 567, 678, 789]
    
    def binary_search(ls, target):
        left = 0
        right = len(ls) - 1
        if left > right:
            print("不不在这里")
        middle = (left + right) // 2
        if target < ls[middle]:
            return binary_search(ls[:middle], target)
        elif target > ls[middle]:
            return binary_search(ls[middle+1:], target)
        else:
            print("在这里")
    
    binary_search(lst, 567)        
    1.下面程序的输出结果是:
    d = lambda p:p*2
    t = lambda p:p*3
    x = 2
    x = d(x)
    x = t(x)
    x = d(x)
    print (x)  #24
    
    2.现有两元组(('a'),('b')),(('c'),('d')),请使用python中匿名函数生成列表[{'a':'c'},{'b':'d'}]
    #答案一
    test = lambda t1,t2 :[{i:j} for i,j in zip(t1,t2)]
    print(test(t1,t2))
    #答案二
    print(list(map(lambda t:{t[0]:t[1]},zip(t1,t2))))
    #还可以这样写
    print([{i:j} for i,j in zip(t1,t2)])
    
    3.以下代码的输出是什么?请给出答案并解释。
    def multipliers():
        return [lambda x:i*x for i in range(4)]
    print([m(2) for m in multipliers()])
    请修改multipliers的定义来产生期望的结果。
    
    #3.以下代码的输出是什么?请给出答案并解释。
    def multipliers():
        return [lambda x:i*x for i in range(4)]
    print([m(2) for m in multipliers()])
    #请修改multipliers的定义来产生期望的结果
    #第一问 :[6,6,6,6]
    #第二问 :
    def multipliers():
         return (lambda x:i*x for i in range(4)) # 不需要yield因为,for必须在推导式内也就是说必须有括号
             # for i in range(4):
             #     yield lambda x:i*x
    print([m(2) for m in multipliers()])  #[2,4,6]
    面试题

     

  • 相关阅读:
    移动服务
    CodeForces
    poj1737-----这题有毒
    洛谷P1219 八皇后 (dfs+回溯法)
    codeforces 598D Igor In the Museum(dfs)
    CCPC-Wannafly & Comet OJ 夏季欢乐赛(2019)I
    复制构造函数的作用
    codeforces 1102D Balanced Ternary String(贪心+思维)
    学习3DES加密算法笔记
    个人冲刺(六)
  • 原文地址:https://www.cnblogs.com/double-W/p/9765234.html
Copyright © 2020-2023  润新知