三元表达式
符合python语法的表达方式(形式,公式)
元素,三个元素
总体就是,由三个元素组成的表达式
其目的是为了简化书写,既然是简化就必然有局限性,
三元表达式只能帮你简化仅有两个分支if判断
res=True if age>=18 else False,并且这个判断无论成立与否都必须返回一个值
a=9
b=12
res=a if a>b else b
print(res)
递归
递归指的是递归调用,简单地就是一个函数在执行过程中又直接或者间接的调用该函数本身
递归时可能出现一下错误:
RecursionError: maximum recursion depth exceeded while calling a Python object
在调用函数时超出了最大递归深度
python为了防止递归太多导致内存溢出,所以给递归调用加上了深度(次数)限制,默认为1000
递归调用本质上就是在循环执行代码,与普通循环不同的是,函数调用会产生一系列内存开销,所以就会导致内存溢出
如此一来,则表示所有递归能干的事情循环也能干
在使用递归时要注意:
1.一定要在某个条件满足时结束循环调用
2.循环调用的次数不能超过系统的限制
3.每一次执行函数都应该使问题的规模减少,否则就是无用的循环
4.python中没有尾递归优化机制(使得递归调用时占用的开销更小)
在使用递归完成在遍历所有元素(不知道有几层),可以发现递归使用起来代码量更少结构更加清新
什么时候该使用递归
你不知道到底循环几次
二分查找法
分半查找
拆分查找
原理:
先将整体分为两半
然后去除中间的元素,与你要查找的目标进行比对,如果你要找的比中间值大请走右边
如果你要找的比中间值小请走左边
1.先得到一个中间值,比较是不是你要找到值如果是直接返回
2.如果不是 那就把列表拆为两半,进行比较
3.如果你要找的比中间值大找右边
如果你要找的比中间值小找左边
li = [1, 3, 5, 7, 11, 13, 17, 19, 23, 29]
def search(li, tage):
if not li:
return False
i = len(li) // 2
if li[i] == tage:
return True
if len(li) == 1:
return False
left = li[:i]
right = li[i:]
if tage > len(li[i]):
return search(right, tage)
else:
return search(left, tage)
print(search(li, 13))
匿名函数
匿名指的就是没有名字
其罪明细的特点就是
有名字的值可以多次使用,多次访问
而没有名字的值,只能临时使用一次,用完就没了
匿名函数与有名函数的区别
关键字为lambda
参数不需要加括号,并且支持所有类型的参数
名称空间与作用域关系完全相同
函数体中不能写return,会自动将执行结果返回
函数体只能有一个表达式而且不能执行
匿名函数什么时候用
当你的函数体只有一行表达式时并且仅使用一次时就可以作为匿名函数
更多的是与内置函数联用(max,min,sorterd,map,filter,reduce)
当默认的比较方式无法满足需求时就可以通过传入同一个函数来决定用什么比较
函数可以是匿名也可以是有名的,很明显这时候匿名函数更好
max,min
salary = {
"egon":250,
"zgon":500,
"bgon":20000,
}
print(max(salary,key=lambda k:salary[k] ))
print(min(salary,key=lambda k:salary[k]))
def get_value(k):
return salary[k]
#使用有名函数完成取值
print(max(salary, key=get_value))
sorterd#排序
print(sorted(li))#从小到大排序
print(sorted(li,reverse=True))#从大到小排序
print(sorted(salary,key=lambda k:salary[k]))#得到工资从小到大排序
print(sorted(salary,key=lambda k:salary[k],reverse=True))#得到工资从大到小排序
print(res[-1],salary[res[-1]])最高工资的人即钱
map 映射,用于从一个可迭代对象中取出所有数据,进行一系列操作后再放回新列表中
def f(v):
print(v)
return v+100
res=map(f,li)
print(list(res))#li中每一个加100
res=map(lambda v:v+100,li)
print(list(res))#li中每一个加100
li1=['a','b','c']
res=map(lambda v:v+'.txt',li1)
print(list(res))#li1中每一个的后缀加上.txt
filter 过滤,用于从一堆数据中过滤一些不满足条件的数据,
提供一个函数,要函数的返回值是bool类型True表示要保留,False就过滤掉
res=filter(lambda v:True if v>18 else False,li)
print(list(res))#过滤掉li中大于18的数
names = ["agon","bgon","cgon","blex","jerry"]
res=filter(lambda v:True if not v.endswith('gon') else False,names)
print(list(res))#从names中过滤掉名字结尾为gon的
reduce 合并,是把列表中的数据进行合并 每次会传给你两个值 n和n+1个
# 从functools中拿到一个reduce
from functools import reduce
li2=['a','b','c','d']
def f(a,b):
return a+b
res=reduce(f,li2)
print(res)#让li2中的元素合并
res=reduce(lambda a,b:a+b ,li2)
print(res)#让li2中的元素合并
abs()绝对值
all()如果所有元素都为True结果为True
any()任意一个元素为True结果为True
ascii()将参数转为asc如果asc不支持这个就转为uncode
bin()转为2进制
oct()转为8进制
hex()转为16进制
bool()转为布尔类型
bytearray()
bytes()
callable()是否可调用
chr()数字转asc字符
ord()按照asc把字符转数字
compile()把一个对象转为指定的字节码
complex()转为复数形式
dir()查看该对象中所有可用的名字函数名和变量
divmod()得到商和余数
enumerate()枚举把一个值与数字进行对应
eval()执行一个字符串类型的表达式
可用帮你把一个字符串的内容转换为pyton数据类型 但是这并不是它的本职工作
foozenset()冻结一个集合
globals()查看全局名称空间中的所有名字
lobals()查看局部名称空间中的所有名字在全局位置调该函数 看到也是全局
hash()可用来校验一个数据是不是可变的
可hash是不可变的
不可hash是可变的
持续更新中