一、三元表达式
三元表达式本身是为了简化代码,仅用于简单的函数,只有一个的判定条件
例
def max2(x,y):
return x if x > y else y
print(max2(10,11))
二、递归函数
1、定义:
在函数调用过程中直接或者间接的调用函数本身
2、两种调用方式
#直接调用
def foo():
print('from foo')
foo()
foo()
#间接调用
def bar():
print('from bar')
foo()
def foo():
print('from foo')
bar()
foo()
3、递归分为两个过程
1、回溯:一定要满足某种条件回溯,否则无限递归
2、递推:得到值返回递推每一层的值,一层层的结束
items=[1,[2,[3,[4,[5,[6,[7,[8,[9,[10,]]]]]]]]]]
def tell(l):
for item in l:
if type(item) is not list:
print(item)
else:
tell(item)
tell(items)
三、匿名函数
1、匿名函数的三点强调
1 匿名的目的就是要没有名字,给匿名函数赋给一个名字是没有意义的
2 匿名函数的参数规则、作用域关系与有名函数是一样的
3 匿名函数的函数体通常应该是 一个表达式,该表达式必须要有一个返回值
2、匿名函数的应用
salaries={
'sxx':3000,
'qzl':100000000,
'wxf':10000,
'lh':2000
}
print(max(salaries,key=lambda x:salaries[x]))
print(min(salaries,key=lambda x:salaries[x]))
#排序
salaries=sorted(salaries,key=lambda x:salaries[x]) #默认是升序排
salaries=sorted(salaries,key=lambda x:salaries[x],reverse=True) #降序
nums=[1,11,9]
nums=sorted(nums) #默认是升序
print(nums)
# map:映射,
nums=[1,2,3,4,5]
res=map(lambda x:x**2,nums)
name=['a','b','c','d']
res=map(lambda x:x+'_sb',name)
qes=map(lambda x:x+'_nb' if x=='c' else x+'_sb',name)
print(list(res))
print(list(qes))
#reduce:合并
from functools import reduce
res=reduce(lambda x,y:x+y,range(101),0)
print(res)
l=['a','b','c','d']
qes=reduce(lambda x,y:x+y'',l)
print(qes)
#filter过滤判断为假的值
name=['qzl_nb','hwl_nb','lx_nb','sxx']
res=filter(lambda x: x.endswith('nb') ,name)
print(list(res))
age=[12,18,45,55,96]
res=filter(lambda x:x>30,age)
print(list(res))
四、内置函数
练习
#1、文件内容如下, 标题为: 姓名, 性别, 年纪, 薪资
#egon male 18 3000
#alex male 38 30000
#wupeiqi female 28 20000
#yuanhao female 28 10000
#要求:
#从文件中取出每一条记录放入列表中,
#列表的每个元素都是
#{'name': 'egon', 'sex': 'male', 'age': 18, 'salary': 3000}
#的形式
with open('x.txt','r',encoding='utf-8')as f:
c = (line.split()for line in f)
l=[{'name':name,'sex':sex,'age':age,'salary':salary} for name,sex,age,salary in c]
print(l)
#2根据1得到的列表, 取出薪资最高的人的信息
print(max(l, key=lambda dic:dic['salary']))
#3根据1得到的列表, 取出最年轻的人的信息
print(min(l, key=lambda dic:dic['age']))
#4根据1得到的列表, 将每个人的信息中的名字映射成首字母大写的形式
l_new=map(lambda item:{'name':item['name'].capitalize(),#首字母大写
'sex':item['sex'],
'age':item['age'],
'salary':item['salary']},l)
print(list(l_new))
#5.根据1得到的列表, 过滤掉名字以a开头的人的信息
res=filter(lambda item: not item['name'].startswith('a') ,l)
print(list(res))
#6使用递归打印斐波那契数列(前两个数的和得到第三个数,如:0 1 1 2 3 4 7...)
n n+1
def func(x,y,stop):
print(x, end=' ')
if x>stop :
return
func(y,x+y,stop)
func(0,1,15)
# 7、文件shopping.txt内容如下
# mac,2000,3
# lenovo,3000,10
# tesla,1000000,10
# chicken,200,1
#
# 求总共花了多少钱?
# 打印出所有的商品信息,格式为
# [{'name':'xxx','price':'3333','count':3},....]
# 求单价大于10000的商品信息,格式同上
with open('a.txt', encoding='utf-8') as f:
jg = [int(line.split(',')[1]) for line in f ]
print(sum(jg))
with open('a.txt', encoding='utf-8') as f:
c=(line.strip('\n').split(',') for line in f )
l=[{'name':name,'price':price,'count':count}for name,price,count in c]
print(l)
res=filter(lambda dic:int(dic['price'])>10000,l )
print(list(res))