三元表达式、递归函数、匿名函数、内置函数

一、三元表达式

     三元表达式本身是为了简化代码,仅用于简单的函数,只有一个的判定条件

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))

 

posted @ 2016-04-02 23:18  宋先生、  阅读(359)  评论(0编辑  收藏  举报