三元表达式
条件成立会返回一个值,不成立会返回一个值
def func(x,y): if x>y: return x else: return y res=x if x > y else y #三元表达式 print(res)
列表推导式,生成器表达式
# 列表推导式
egg_list=[] for i in range(10): egg_list.append(‘鸡蛋%s‘ %i) egg_list=[‘鸡蛋%s‘ %i for i in range(10)]
# 将列表推导式的 [ ] 换成 () 就是生成器表达式
列表推倒式比较直观、占内存
生成器表达式不容易看出内容,省内存
[变量(加工的变量)for 变量i in 可迭代的数据类型] 列表推导式 # 循环模式
[变量(加工后的数据)for 变量i in 可迭代的数据类型 if 条件] 列表的推导式 # 筛选模式
递归
函数的递归即在调用的过程当中,又直接或间接地调用了函数本身
递归分为两个阶段
1、回溯(一定要在满足某种条件下,结束回溯,否则会无限递归)
2、递推
def salary(n): if n == 1: return 100 return salary(n-1)+300 print(salary(5)) # salary(5)=salary(4)+300 # salary(4)=salary(3)+300 # salary(3)=salary(2)+300 # salary(2)=salary(1)+300 # salary(1)=100 # 回溯 # salary(n)=salary(n-1)+300 n>1 # salary(1) =100 n=1 # 递推
总结:
1、递归一定要有一个明确的结束条件
2、每进入下一次递归,问题的规模都应该减少
3、在python中没有尾递归优化
4、递归效率不高,递归层次过多会导致栈溢出
匿名函数(不会单独使用)
1、匿名的目的就是没有名字,给匿名函数赋给一个名字是没有意义的
2、匿名函数的参数规则,作用域关系与有名函数是一样的
3、匿名函数的函数体通常应该是一个表达式,该表达式必须要有一个返回值
# f =lambda x,n:x ** n # print(f(3,3)) # 因为匿名函数最重要的一点就是没有名字,所以这种赋值是没有意义的 def func(x,y,z) return x+y+z lambda x,y,z: x+y+z #匿名函数
匿名函数与有名函数的对比
有名函数:循环使用,保存了名字,通过名字就可以重复引用函数功能
匿名函数:一次性使用,随时随时定义
lambda 匿名函数的应用
# map 映射 names=[‘alex‘,‘wxx‘,‘yuanhao‘,‘egon‘] res=map(lambda x:x+‘_nb‘if x==‘egon‘else x+‘_sb‘,names) print(list(res)) # reduce from functools import reduce l=[‘my‘,‘name‘,‘is‘,‘alex‘] res = reduce(lambda x,y:x+‘ ‘+y,l) print(res) # filter 过滤,成功 True,否则 False # names=[‘alex_sb‘,‘wxx_sb‘,‘egon‘] # res=filter(lambda x:x.endswith(‘_sb‘),names) # print(list(res))
内置函数
# print(abs(-1)) # print(all([1,‘a‘,True])) # 列表中所有元素的布尔值为真,最终结果才为真 # print(all(‘‘)) # 传给all的可迭代对象如果为空,最终结果为真 # print(any([0,‘‘,None,False])) #列表中所有元素的布尔值只要有一个为真,最终结果就为真 # print(any([])) # 传给any的可迭代对象如果为空,最终结果为假 # print(bin(11)) #十进制转二进制 # print(oct(11)) #十进制转八进制 # print(hex(11)) #十进制转十六进制 # print(bool(0)) #0,None,空的布尔值为假 # res=‘你好egon‘.encode(‘utf-8‘) # unicode按照utf-8进行编码,得到的结果为bytes类型 # res=bytes(‘你好egon‘,encoding=‘utf-8‘) # 同上 # print(res) # def func(): # pass # print(callable(‘aaaa‘.strip)) #判断某个对象是否是可以调用的,可调用指的是可以加括号执行某个功能 # print(chr(90)) #按照ascii码表将十进制数字转成字符 # print(ord(‘Z‘)) #按照ascii码表将字符转成十进制数字 # print(dir(‘abc‘)) # 查看某个对象下可以用通过点调用到哪些方法 # print(divmod(1311,25)) # 1311 25 # 将字符内的表达式拿出运行一下,并拿到该表达式的执行结果 # res=eval(‘2*3‘) # res=eval(‘[1,2,3,4]‘) # res=eval(‘{"name":"egon","age":18}‘) # print(res,type(res))