• python之内置函数(二)与匿名函数、递归函数初识


    一、内置函数(二)
    1、和数据结构相关(24)
    列表和元祖(2)
    list:将一个可迭代对象转化成列表(如果是字典,默认将key作为列表的元素)。
    tuple:将一个可迭代对象转化成元组(如果是字典,默认将key作为元组的元素)

    2、相关内置函数(2)
    reversed:将一个序列翻转,并返回此翻转序列的迭代器。 *****
    slice:构造一个切片模板,用于列表的切片。***

    2-1、reversed()与列表的reverse()区分:
    列表的reverse()只能列表使用:列表.reverse(),对原列表进行翻转,结果返回的还是列表。
    内置函数reversed(),将一个序列翻转,结果是返回一个迭代器。

    列表的reverse()

    l1 = [1,3,4,2,6]
    l1.reverse() #将列表进行翻转
    print(l1)    #返回修改后的列表[6, 2, 4, 3, 1]

    内置函数reversed()

    复制代码
    reversed(l1) #生成一个迭代器
    print(reversed(l1))  #一个地址
    for i in reversed(l1):
        print(i)
    # 结果:
    # 用for循环输出迭代器的值
    # 6 2 4 3 1
    
    
    # 字符串使用reversed()
    s1 = 'abcdefg'
    for i in reversed(s1):
        print(i)
    结果:
    g f e d c b a
    
    # 字典使用reversed() 报错
    dic = {'name':'xiaoming','age':1000,'hobby':'oldwomen'} # 不行
    复制代码

    2-2、slice:构造一个切片模板,用于列表的切片。 ***
    l3 = [1,2,3,4,5,6,7,8,9,10]
    sli_obj = slice(0,5,2)     #制作切片模板,索引从0到4,间隔取值
    print(l3[sli_obj])            # [1 3 5]

    l4 = ['a', 'b', 'c', 'd', 'e']
    print(l4[sli_obj])            # ['a', 'c', 'e']


    3、字符串相关(9)
    3-1、str:将数据转化成字符串。

    3-2、format:与具体数据相关,用于计算各种小数,精算等。 **
    平常使用format情况较少,下面这种形式已经是最多的了,剩下的科学运算,需要用到的可自行研究。
    字符串可以提供的参数,指定对齐方式,<是左对齐, >是右对齐,^是居中对齐
    print(format('test', '<20')) # 左对齐 (20是长度)
    print(format('test', '>20')) # 右对齐
    print(format('test', '^20')) # 居中对齐


    3-3、bytes:unicode ---> bytes类型(单向的编码) ****

    复制代码
    # 编码encode():
    s1 = '小明'
    b1 = s1.encode('utf-8')
    print(b1)  # b'xe5xb0x8fxe6x98x8e'
    
    # 解码decode():
    s2 = b1.decode('utf-8')
    print(s2) # 小明
    
    # 用bytes()方法编码(单向)
    a1 = '小白'
    b1 = bytes(a1,encoding='utf-8')
    print(b1)  # b'xe5xb0x8fxe7x99xbd'
    
    # 不能用bytes()方法解码
    a2 = bytes(b1,encoding='utf-8')
    print(a2) # 报错
    
    # 只能用decode()解码
    a2 = b1.decode('utf-8')
    print(a2) #小白
    复制代码

    3-4、bytearry:返回一个字节数组。这个数组里的元素是可变的,并且每个元素的值范围: 0 <= x < 256。
    (bytearray其实也是一种编码的方法,不过bytearray可对编码后的字节进行修改,即对原数据进行修改)
    例如:字符串 小明
    b1 = bytearray('小明',encoding='utf-8')       #对小明进行编码,生成一串字节码(utf-8一个中文代表三个字节)
    print(b1)           # bytearray(b'xe5xb0x8fxe6x98x8e')
    print(b1[0])       # 229
    b1[0] = 65        #对前三个字节进行修改(即修改中文'小')
    b1[1] = 97
    b1[2] = 104
    print(b1)          # bytearray(b'Aahxe6x98x8e')
    print(b1.decode('utf-8'))     # 解码出来:Aah明

    例如:字符串 hot
    ret = bytearray('hot',encoding='utf-8')
    print(id(ret))         # 2997820203056
    print(ret)              # bytearray(b'hot')
    print(ret[0])         # h的ASCII:104
    ret[0] = 65          # 把索引0的ASCII值改为65(A)
    print(ret)             # bytearray(b'Aot') hot索引0就改成了A
    print(id(ret))       # 2997820203056 内存地址不变

     

    3-5、memoryview
    ret = memoryview(bytes('你好',encoding='utf-8'))
    print(len(ret))   # 6
    print(ret)         # <memory at 0x000001D3D6FCD048> # [xe4,xbd,xa0,xe5,xa5,xbd]
    print(bytes(ret[:3]).decode('utf-8'))   # 你
    print(bytes(ret[3:]).decode('utf-8'))   # 好

    3-6、ord:输入字符找该字符unicode编码的位置 **
    print(ord('a'))    # 97
    print(ord('中'))  # 20013

    3-7、chr:输入位置数字找出其对应的unicode编码的字符 **
    print(chr(97))         # a
    print(chr(20013))   # 中

    3-8、ascii:在ascii码中的就返回该值,不是则返回它在unicode的位置(16进制。) **
    print(ascii('a'))     # 'a'
    print(ascii('中'))   # 'u4e2d'

    3-9、repr:返回一个对象的string形式(原形毕露) *****

    复制代码
    print(repr('{"name":"xiaoming"}'))  #'{"name":"xiaoming"}'
    print('{"name":"xiaoming"}')        # {"name":"xiaoming"}
    
    格式化输出%r--->原封不动的写出来(基础数据类型都可接收)
    字符串单双引号都默认是单引号
    msg = 'xiaoming是%r的人' % ('德高望重')
    print(msg) # xiaoming是'德高望重'的人
    
    msg = 'xiaoming是%r的人' % ("德高望重")
    print(msg) # xiaoming是'德高望重'的人
    
    msg = 'xiaoming是%r的人' %(18)
    print(msg) # xiaoming是18的人
    
    msg = 'xiaoming是%r的人' %(True)
    print(msg) # xiaoming是True的人
    
    msg = 'xiaoming是%r的人' %({'name':'xiaming','age':18})
    print(msg)  # xiaoming是{'name': 'xiaming', 'age': 18}的人
    
    repr():可用于判断json pickle序列化模块 特殊字符串,python字符串的区别
    复制代码


    4、数据集合(3)
    4-1、dict:创建一个字典。
    4-2、set:创建一个集合。
    4-3、frozenset:返回一个冻结的集合,冻结后集合不能再添加或删除任何元素。


    5、相关内置函数(8)
    5-1、len:返回一个对象中元素的个数。


    5-2、sorted:对所有可迭代的对象进行排序操作。 *****
    与列表的sort区分:
    列表的sort方法是对原列表进行排序修改,并没有生成新的列表
    内置函数sorted方法会形成一个新列表

    复制代码
    l1 = [2,3,5,3,1,9,8,6]
    l1.sort()
    print(l1)   
    
    print(sorted(l1)) # 形成了一个新列表
    print(l1)         # 原列表不变
    
    内置函数sorted还可以与函数结合使用
    l2 = [(1,1000),(2,18),(4,250),(3,500)]
    
    def func1(x):
        return x[1]
    
    print(sorted(l2,key=func1)) 
    #按第二个元素升序排序 [(2, 18), (4, 250), (3, 500), (1, 1000)]
    
    print(sorted(l2,key=func1,reverse=True)) 
    #按第二个元素降序排序 [(1, 1000), (3, 500), (4, 250), (2, 18)]
    复制代码


    5-3、enumerate:枚举,返回一个枚举对象。****
    一个值接收枚举对象,返回的每个元素是元组,元组第一个元素是索引(默认从0开始)
    第二个元素是可迭代对象的每个元素。
    for i in enumerate([1,2,3]):
      print(i)
    结果:
    (0, 1)
    (1, 2)
    (2, 3)

    for i in enumerate([1,2,3],100):
      print(i)
    结果:
    (100, 1)
    (101, 2)
    (102, 3)

    for i,j in enumerate([1,2,3],100):
      print(i,j)
    结果:
    100 1
    101 2
    102 3

    5-4、all:可迭代对象中,全都是True才是True *** 多做条件判断
    l1 = [1,'',[1,3],(2,4)]
    print(all(l1))      #False 有一个元素是空


    5-5、any:可迭代对象中,有一个True就是True *** 多做条件判断
    l2 = [1,0,'',()]
    print(any(l2))   #True

     

     

    5-6、拉链方法:zip() 将多个iter纵向组成元素为元组的迭代器,以长度最小的iterable为标准长度 *****

    复制代码
    l1 = [1,2,3,4]
    tu1 = ('a','b','c')
    dic = {'name':'xiaoming','age':18,'hobby':'girl','hometown':'guangzhou'}
    
    zip(l1,tu1,dic)  #迭代器(生成器对象)
    
    print(zip(l1,tu1,dic)) #迭代器地址:<zip object at 0x000002C878E6A6C8>
    
    for i in zip(l1,tu1,dic): 
        print(i)
    
    #循环输出迭代器的内容:
    (1, 'a', 'name')
    (2, 'b', 'age')
    (3, 'c', 'hobby')
    复制代码

    5-7、filter:过滤,通过你的函数,过滤一个可迭代对象(类似于生成器表达式的筛选模式) 生成一个迭代器。 *****

    复制代码
    l1 = [1,2,3,4,5,6]
    def fun(x):
        return x % 2 == 0 #筛选出偶数
    g = filter(fun,l1)  # filter(fun,l1)生成的是一个迭代器
    print(g)
    for i in g:
        print(i)
    结果:
    2 4 6
    
    l2 = [(2,1),(3,4),(4,5)]
    def fun2(x):
        return x[1] % 2 == 1 #筛选出第二个元素为奇数的元组
    g = filter(fun2,l2)
    for i in g:
        print(i)
    结果:
    (2, 1)
    (4, 5)
    复制代码


    5-8、map:会根据提供的函数对指定序列做映射。(循环修改并返回) 生成一个迭代器*****

    复制代码
    l1 = [1,2,3,4,5,6]
    def fun(x):
        return x**2 #返回每个元素的平方
    g = map(fun,l1)
    for i in g:
        print(i)
    结果:1 4 9 16 25 36
    复制代码

     (min max filter返回的都是遍历的参数,map返回的是return的值)

     

    二、匿名函数:有且只有返回值的函数才可以用匿名函数进行简化,一行函数,多与内置函数结合使用。
    1、匿名函数表达式:
    函数名 = lambda 参数 :返回值

    参数可以有多个,用逗号隔开
    匿名函数不管逻辑多复杂,只能写一行,且逻辑执行结束后的内容就是返回值
    返回值和正常的函数一样可以是任意数据类型


    2、
    def func2(x):
      return x**2
    上面函数就有且只有返回值,所以可以写成匿名函数:
    func2 = lambda x: x*2      #func2是函数名,func2(参数)才是调用
    print(func2(6))                  #调用并打印结果


    3、匿名函数 不单独使用,多与内置函数结合。
    l2 = [(1,1000),(2,18),(4,250),(3,500)]
    print(sorted(l2,key=lambda x:x[1]))

     

    4、例子

    复制代码
    1,利用内置函数匿名函数将dic按照值进行排序。
    dic={'k1':10,'k2':100,'k3':30}
    print(sorted(dic.items(),key=lambda x:x[1]))
    
    2,利用内置函数匿名函数 计算列表的每个数的2倍。
    l1 = [1,5,7,4,8]
    print(list(map(lambda x:x*2,l1)))
    
    3,利用内置函数匿名函数,将值大于10的留下来
    l2 = [5,8,11,9,15]
    print(list(filter(lambda x:x > 10,l2)))
    
    4,匿名函数可与三元运算结合
    func = lambda x:x if x > 2 else x * 2
    复制代码

     

    三、递归函数(自己调用自己)
    1、人理解函数,神理解递归。
    def func():
      print(666)
      func()
    func()
    结果:输出一段时间后会报错,因为
    默认递归深度为998次,(官方给出的默认深度是1000,但实际上只有998次左右)
    超过了就会报错


    2、引用模块修改递归次数
    import sys
    sys.setrecursionlimit(100000)
    n = 1
    def func(x):
      print(x)
      x += 1
      func(x)
    func(n)
    结果:3222
    虽然设置了100000次,但是电脑跑不起呀,
    一般电脑就跑3222次左右,这个会根据电脑性能而定。


    3、
    小明比小白大两岁 n = 4
    小白比小狗大两岁 n= 3
    小狗比小红大两岁 n = 2
    小红24岁 n = 1
    小明多少岁?

    def age(n):
      if n == 1:
        return 24
      else:
        return age(n-1) + 2
    age(4)   # 30

    详解:
    age(4)传进参数n=4:

    def age(4):
      if n == 1:
        return 24
      else:
        return age(4-1) + 2
    结果:age(3)+2

    def age(3):
      if n == 1:
        return 24
      else:
        return age(3-1) + 2
    结果:age(2)+2+2



    def age(2):
      if n == 1:
        return 24
      else:
        return age(2-1) + 2
    结果:age(1)+2+2+2



    def age(1):
      if n == 1:
        return 24
      else:
        return age(n-1) + 2
    结果:age(1)+2+2+2 ---> 24+2+2+2--->30

     

  • 相关阅读:
    Eclipse 导入项目乱码问题(中文乱码)
    sql中视图视图的作用
    Java基础-super关键字与this关键字
    Android LayoutInflater.inflate(int resource, ViewGroup root, boolean attachToRoot)的参数理解
    Android View和ViewGroup
    工厂方法模式(java 设计模式)
    设计模式(java) 单例模式 单例类
    eclipse乱码解决方法
    No resource found that matches the given name 'Theme.AppCompat.Light 的完美解决方案
    【转】使用 Eclipse 调试 Java 程序的 10 个技巧
  • 原文地址:https://www.cnblogs.com/yidashi110/p/10092273.html
Copyright © 2020-2023  润新知