三元表达式、递归函数、匿名函数、内置函数
一、三元表达式
三元表达式本身是为了简化代码,仅用于简单的函数,只有一个的判定条件
例
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))
![](https://images2018.cnblogs.com/blog/1352890/201803/1352890-20180326174437157-2122834081.jpg)
您的资助是我最大的动力!
金额随意,欢迎来赏!