• python之三元表达式、列表推导、生成器表达式、递归、匿名函数、内置函数


    目录


    一、三元表达式

    def max(x,y):
        return x if x>y else y
    print(max(10,12))
    
    name=input('>>>')
    res='sb' if name=='alex' else 'nb'
    print(res)
    '''
    name=input('>>>')
    res='sb'
    if name=='alex':
        print(res')
    else:
        print('nb')
    '''

    二、列表推导

    egg_list=[]
    for i in range(10):
        egg_list.append('鸡蛋%s'%i)
    print(egg_list)
    
    egg_list=['鸡蛋%s'%i for i in range(10)]
    print(egg_list)
    
    '''
    优点是方便、改变了编程习惯,可被称为声明式编程
    '''

    扩展:

    (一)字典推导式

      将字典的值和键对调

    dic = {'a':10,'b':12}
    dic_frequery = {dic[k]:k for k in dic}#字典推导式
    print(dic_frequery)
    {10: 'a', 12: 'b'}

      合并大小写对应的value,将键改为全小写

    dic={'a':12,'b':21,'A':32,'Z':44}
    
    dic_frequery = {
        k.lower():dic.get(k.lower(),0)+dic.get(k.upper(),0) 
        for k in dic.keys()
    }
    
    print(dic_frequery)
    
    {'a': 44, 'b': 21, 'z': 44}

    (二)集合推导式

    li = {1,2,3,4,5,2,3,5,7,8}
    s = {i*i for i in li}
    print(s)
    {64, 1, 4, 9, 16, 49, 25}

    三、生成器表达式

    '''
    把列表推导中的[]换成()生成器表达式
    其优点是节省内存,一次在内存中只产生一个值
    '''
    bamboo=('竹节%s节'%i for i in range(1,11))
    print(bamboo)#生成器表达式内存地址
    print(next(bamboo))
    print(list(bamboo))
    
    names=['cindy','sara','chengjie','mark']
    li=(i.capitalize() for i in names)
    print(list(li))#['Cindy', 'Sara', 'Chengjie', 'Mark']
    
    with open('a.txt',encoding='utf-8') as f:
        print(max(len(line) for line in f))# 选出最长一行
        print(sum(len(line) for line in f))
        info=[line.split() for line in f]
        print(info)

    四、递归

    递归调用是函数嵌套调用的一种特殊形式,函数在调用时,直接或间接调用了自身,就是递归调用

    #直接调用
    items=[1,[2,[3,[4,[5,[6,[7,[8,[9,[0,]]]]]]]]]] def tell(l): for item in l: if type(item) is not list: print(item) else: tell(item) tell(items)
    #间接调用
    def age(n): if n==1: return 18 return age(n-1)+2 print(age(5))#26 def age(n): return 18 if n==1 else age(n-1)+2 print(age(5))#26 def foo(): print('from foo') foo() foo()#递归报错,超过最大限制
    # 调用函数会产生局部的名称空间,占用内存,因为上述这种调用会无需调用本身,python解释器的内存管理机制为了防止其无限制占用内存,对函数的递归调用做了最大的层级限制
    # 可以修改递归最大深度
    
    #import sys
    #sys.getrecursionlimit()
    #sys.setrecursionlimit(2000)
    #
    #def f1(n):
    #    print('from f1',n)
    #    f1(n+1)
    #f1(1)
    
    #虽然可以设置,但是因为不是尾递归,仍然要保存栈,内存大小一定,不可能无限递归,而且无限制地递归调用本身是毫无意义的,递归应该分为两个明确的阶段,回溯与递推
    '''
    回溯就是从外向里一层一层递归调用下去,回溯阶段必须要
      1.有一个明确地结束条件,
      2.每进入下一次递归时,问题的规模都应该有所减少(否则,单纯地重复调用自身是毫无意义的),递推就是从里向外一层一层结束递归
      3.python中没有递归优化
    '''

    五、匿名函数

    匿名函数就是没有名字,与函数有相同的作用域,但匿名意味着引用计数为0。使用一次就释放,除非让它有名字,但是让它有名字就失去意义了。

    应用:

      1. 使用Python写一些执行脚本时,使用lambda可以省去定义函数的过程,让代码更加精简。

      2. 对于一些抽象的,不会别的地方再复用的函数,有时候给函数起个名字也是个难题,使用lambda不需要考虑命名的问题。

      3. 使用lambda在某些时候让代码更容易理解。

    lambda语句中,冒号前是参数,可以有多个,用逗号隔开,冒号右边的返回值。lambda语句构建的其实是一个函数对象。

    print(lambda x,n:x**n)

    filter(lambda x: x % 3 == 0, foo)
    map(lambda x: x * 2 + 10, foo)
    reduce(lambda x, y: x + y, foo)

    六、内置函数

    注意:内置函数id()可以返回一个对象的身份,返回值为整数。这个整数通常对应与该对象在内存中的位置,但这与python的具体实现有关,不应该作为对身份的定义,即不够精准,最精准的还是以内存地址为准。is运算符用于比较两个对象的身份,等号比较两个对象的值,内置函数type()则返回一个对象的类型。

    salaries={
        'aa':1200,
        'bb':342,
        'cc':3456,
        'dd':3455
    }
    def get(k):
        return salaries[k]
    print(max(salaries,key=get))#key必须是个函数,该函数必须有返回值
    
    #max()
    print(max(salaries,key=lambda k:salaries[k]))
    
    #min()
    print(min(salaries,key=lambda k:salaries[k]))
    
    #sorted()默认升序即从小到大,以列表形式返回
    salaries=sorted(salaries,key=lambda k:salaries[k])
    print(salaries)
    #sorted()降序即从大到小
    salaries=sorted(salaries,key=lambda k:salaries[k],reverse=True)
    print(salaries)
    
    res=map(lambda k:salaries[k],salaries)#得到map的映射对象,是个迭代器
    #print(res.__next__())
    print(list(res))
    
    name=['aa','bb','cc']
    res=map(lambda x:x+'__nb' if x=='cc' else x+'__sb',name)
    print(list(res))#['aa__sb', 'bb__sb', 'cc__nb']
    
    from functools import reduce
    l=['it','name','is','mage','mage','is','a','little','dog']
    res=reduce(lambda x,y:x+' '+y,l)
    print(res)
    
    names=['aa_','bb_','cc*','dd_']
    res=filter(lambda x:True if x.endswith('_') else False,names)
    print(list(res))
    
    res=filter(lambda x:x.endswith('_'),names)
    print(list(res))
    
    num=[1,3,3,65,3,4,6,8,5,65]
    res=filter(lambda x:x>22,num)
    print(list(res))
    
    print(ord('A'))#65
    print(chr(77))#M
    print(bytes('大王叫我来巡山',encoding='utf-8'))
    #b'xe5xa4xa7xe7x8ex8bxe5x8fxabxe6x88x91xe6x9dxa5xe5xb7xa1xe5xb1xb1'
    
    print(abs(-11))#11
    print(all(['a',0,1]))#False
    print(any(['a',0,1]))#True
    print(ascii('花花世界'))#'u82b1u82b1u4e16u754c'
    
    print(bin(3))#0b11
    print(bool(0))#False
    print(callable(int))#True
    print(classmethod(int))#<classmethod object at 0x00000166BD7BB278>
     1 #字符串可以提供的参数 's' None
     2 >>> format('some string','s')
     3 'some string'
     4 >>> format('some string')
     5 'some string'
     6 
     7 #整形数值可以提供的参数有 'b' 'c' 'd' 'o' 'x' 'X' 'n' None
     8 >>> format(3,'b') #转换成二进制
     9 '11'
    10 >>> format(97,'c') #转换unicode成字符
    11 'a'
    12 >>> format(11,'d') #转换成10进制
    13 '11'
    14 >>> format(11,'o') #转换成8进制
    15 '13'
    16 >>> format(11,'x') #转换成16进制 小写字母表示
    17 'b'
    18 >>> format(11,'X') #转换成16进制 大写字母表示
    19 'B'
    20 >>> format(11,'n') #和d一样
    21 '11'
    22 >>> format(11) #默认和d一样
    23 '11'
    24 
    25 #浮点数可以提供的参数有 'e' 'E' 'f' 'F' 'g' 'G' 'n' '%' None
    26 >>> format(314159267,'e') #科学计数法,默认保留6位小数
    27 '3.141593e+08'
    28 >>> format(314159267,'0.2e') #科学计数法,指定保留2位小数
    29 '3.14e+08'
    30 >>> format(314159267,'0.2E') #科学计数法,指定保留2位小数,采用大写E表示
    31 '3.14E+08'
    32 >>> format(314159267,'f') #小数点计数法,默认保留6位小数
    33 '314159267.000000'
    34 >>> format(3.14159267000,'f') #小数点计数法,默认保留6位小数
    35 '3.141593'
    36 >>> format(3.14159267000,'0.8f') #小数点计数法,指定保留8位小数
    37 '3.14159267'
    38 >>> format(3.14159267000,'0.10f') #小数点计数法,指定保留10位小数
    39 '3.1415926700'
    40 >>> format(3.14e+1000000,'F')  #小数点计数法,无穷大转换成大小字母
    41 'INF'
    42 
    43 #g的格式化比较特殊,假设p为格式中指定的保留小数位数,先尝试采用科学计数法格式化,得到幂指数exp,如果-4<=exp<p,则采用小数计数法,并保留p-1-exp位小数,否则按小数计数法计数,并按p-1保留小数位数
    44 >>> format(0.00003141566,'.1g') #p=1,exp=-5 ==》 -4<=exp<p不成立,按科学计数法计数,保留0位小数点
    45 '3e-05'
    46 >>> format(0.00003141566,'.2g') #p=1,exp=-5 ==》 -4<=exp<p不成立,按科学计数法计数,保留1位小数点
    47 '3.1e-05'
    48 >>> format(0.00003141566,'.3g') #p=1,exp=-5 ==》 -4<=exp<p不成立,按科学计数法计数,保留2位小数点
    49 '3.14e-05'
    50 >>> format(0.00003141566,'.3G') #p=1,exp=-5 ==》 -4<=exp<p不成立,按科学计数法计数,保留0位小数点,E使用大写
    51 '3.14E-05'
    52 >>> format(3.1415926777,'.1g') #p=1,exp=0 ==》 -4<=exp<p成立,按小数计数法计数,保留0位小数点
    53 '3'
    54 >>> format(3.1415926777,'.2g') #p=1,exp=0 ==》 -4<=exp<p成立,按小数计数法计数,保留1位小数点
    55 '3.1'
    56 >>> format(3.1415926777,'.3g') #p=1,exp=0 ==》 -4<=exp<p成立,按小数计数法计数,保留2位小数点
    57 '3.14'
    58 >>> format(0.00003141566,'.1n') #和g相同
    59 '3e-05'
    60 >>> format(0.00003141566,'.3n') #和g相同
    61 '3.14e-05'
    62 >>> format(0.00003141566) #和g相同
    63 '3.141566e-05'
    了解一下:format
     1 #1、语法
     2 # eval(str,[,globasl[,locals]])
     3 # exec(str,[,globasl[,locals]])
     4 
     5 #2、区别
     6 #示例一:
     7 s='1+2+3'
     8 print(eval(s)) #eval用来执行表达式,并返回表达式执行的结果
     9 print(exec(s)) #exec用来执行语句,不会返回任何值
    10 '''
    11 6
    12 None
    13 '''
    14 
    15 #示例二:
    16 print(eval('1+2+x',{'x':3},{'x':30})) #返回33
    17 print(exec('1+2+x',{'x':3},{'x':30})) #返回None
    18 
    19 # print(eval('for i in range(10):print(i)')) #语法错误,eval不能执行表达式
    20 print(exec('for i in range(10):print(i)'))
    eval()和exec()
     1 compile(str,filename,kind)
     2 filename:用于追踪str来自于哪个文件,如果不想追踪就可以不定义
     3 kind可以是:single代表一条语句,exec代表一组语句,eval代表一个表达式
     4 s='for i in range(10):print(i)'
     5 code=compile(s,'','exec')
     6 exec(code)
     7 
     8 
     9 s='1+2+3'
    10 code=compile(s,'','eval')
    11 eval(code)
    compile
  • 相关阅读:
    springboot中quartz定时器的postgresql建表语句
    ios设备获取的idfa为 0 原因
    手写实现 js 中的bind,并实现 softBind
    JS 问号?妙用
    手写 js数组reduce
    js 实现桶排序
    手写js 数组打平
    正则表达式匹配多个指定字符串
    手写promise.all和 promise.race
    js防抖和节流实现
  • 原文地址:https://www.cnblogs.com/qiaoqianshitou/p/8687898.html
Copyright © 2020-2023  润新知