赞
踩
本次内容:lambda表达式详解+变量作用域+高阶函数
没有函数名,没有def关键字,只有函数体,使用匿名函数的原因:该函数的逻辑只使用一次。
关键字lambda表达式:函数体比def的方式简洁很多
lambda的主体是一个表达式,而非逻辑代码块,只能封装有限的代码块。
lambda有自己的命名空间,且不能访问自己参数列表之外的参数或者全局命名空间的参数
'''lambda案例:相对来说,lambda函数的结构比较简单'''
sum1 = lambda arg1, arg2: arg1+arg2
list1 = [1, 2, 3]
list2 = [4, 5, 6]
print("调用sum1的方法的结果为:", sum1(10, 20)) # 30
print("调用sum1的方法的结果为:", sum1(list1, list2)) # [1, 2, 3, 4, 5, 6]
# 1、匿名函数的参数形式 '''无参类型''' fn1 = lambda: 10 print(fn1()) '''参数*运算符''' fn2 = lambda a: a*2 print(fn2("你好")) '''默认参数函数''' fn3 = lambda a, b, c = 100: a + b + c print(fn3(100, 200)) '''元组参数''' fn4 = lambda *args: args print(fn4(10, 10)) '''字典参数''' fn5 = lambda **kwargs: kwargs print(fn5(name = '张三', sex = '男')) '''三目运算符参数''' fn6 = lambda a, b: a if a > b else b print(fn6(100, 50))
students = [ {'name': "Tom", 'age': 20}, {'name': "Rose", 'age': 19}, {'name': "Java", 'age': 18}, ] # name,key对应的值进行升序排序 students.sort(key = lambda x: x['name']) print(students) # name,key对应的值进行降序排序 students.sort(key = lambda x: x['name'], reverse = True) print(students) # age,key对应的值进行升序排序 students.sort(key = lambda x: x['age']) print(students) # age,key对应的值进行降序排序 students.sort(key = lambda x: x['age'], reverse = True) print(students)
# 定义一个变量,在函数内部和外部同时访问,关注该变量的特点
def test_a():
a = 10
if a > 0:
print("%d是一个正数" % a)
if a > 10:
a = 1000
print("%d是一个10-1000之间的整数" % a)
print(a)
test_a()
# print(a) 无法直接访问函数体内的变量
运行过之后,会报错,很显然外部不能访问函数内部的变量
得到一个结论:局部变量,只能作用在局部区域,全局不能访问
def test_b():
a = 10 # 局部变量,只能作用在局部区域,全局不能访问,否则会报编译错误
if a > 0:
b = 10
print(b)
# 全局变量 a = 10 def test_c(): print(a) if a > 0: a += 1 全局变量不允许在局部进行修改,会报错 test_c() a = 10 def test_d(): a = 100 print(a) print(id(a)) print(a) # 10 print(id(a)) # 1983513360 test_d() # 100 和 1983516240 ''' 此时函数体内可选的a有两个 10 和 100 但是打印出了100,作用域符合就近原则 '''
结果很显而易见,还没有运行程序就报错。或者在函数里创建了新的变量,但这好像不是我们想要的结果,那么我非要做修改呢?
没有办法就创造办法,这里给出一个关键字global,顾名思义,将变量置为全局变量,大家都可以使用他,并且修改。
'''第一种,函数内变量声明为global'''
def test_e():
global e # 在局部函数中声明全局变量需要使用global关键字
e = 200
test_e() # 必须运行此函数!
print(e) # 此时可以在函数外访问变量e
'''第二种,全局变量在函数内声明为global'''
f = 10
def test_f():
global f # 如果想在函数内修改全部变量需要加上global关键字
f = 200 # 此时函数体内的f都指向同一个f
test_f()
print(f) # 200
首先给出一个案例,再进行描述:
# 提供任意两个数组,对该数字进行处理(取绝对值或者四舍五入),然后再求和计算
# print(abs(-10))
# print(round(1.6)
# 第一种写法:
def add_num1(a, b):
return abs(a) + abs(b)
result = add_num1(1.1, -1.9)
print(result)
# 写法2 写入第三个参数,用来接收传过来的函数
def add_num2(a, b, f):
return f(a) + f(b)
result = add_num2(1.5, 2.3, round)
print(result)
第一种写法是正常的方式,给函数传参。第二种方式有很大的区别,将另一个函数名作为参数传入了函数中,并且调用它。
第二种就是所谓的高阶函数,给出定义:高阶函数:一个函数可以作为参数传给另外一个函数,或者一个函数的返回值为另外一个函数(若返回值为该函数本身,则为递归),满足其一则为高阶函数。
自定义函数传入
方法大同小异,样例如下:
# 自定义函数作为参数传入
def test(a):
return a**2 + a**2
def add_num2(a, b, f):
return f(a) + f(b)
result = add_num2(2, 3, test)
print(result)
''' map(func, iter1, iter2) map(func, list): 将函数func作用到list中的每一个元素,并且迭代返回 ''' list1 = [1, 2, 3, 4, 5] def func(x): return x**2 result = map(func, list1) print(list(result)) # [1, 4, 9, 16, 25] ''' reduce(func,list):func(必须是两个参数), 每次func计算的结果继续和序列的下一个元素累计计算 下一个元素累计计算 ''' import functools list1 = [1, 2, 3, 4, 5] def func_1(a, b): return a + b result = functools.reduce(func_1, list1) print(result) # 15 (1+2+3+4+5)累加的过程 ''' filter(func,list):用于过滤序列,过滤掉不符合条件的元素,返回filter对象, 可以转化为list ''' list1 = [4, 6, 7, 77] def fun_2(x): return x % 2 != 0 result = filter(fun_2, list1) print(list(result)) # [7, 77] 过滤掉了偶数
# 定义功能界面函数 def info_print(): print("请选择功能:") print("1、添加学生") print("2、删除学生") print("3、修改学生") print("4、查询学生") print("5、查看所有学生") print("6、退出") print("-" * 20) # 存储学员信息变量 ,使用列表 info = [ {'tel': '110', 'id': '1', 'name': '小敬'}, {'tel': '119', 'id': '2', 'name': '小火'}, {'tel': '120', 'id': '3', 'name': '小护'} ] # 添加学生信息 def add_info(): """添加学生的函数""" ''' 1、用户输入学生的学号、姓名、手机号''' new_id = input("请输入学号:") new_name = input("请输入姓名:") new_tel = input("请输入手机号:") '''2、判断是否添加这个学员,如果学员的姓名已经存在,报错提示,如果姓名不存在 则添加学员信息''' # 2.1 设置全局变量 global info for i in info: if new_name == i['name']: print("该用户已存在") return # 退出当前函数,后面添加信息的代码不执行 # 如果输入的姓名不存在,添加数据,准备一个空的字典,列表追加到字典中 info_dict = {} # 字典新增数据 key,value info_dict['id'] = new_id info_dict['name'] = new_name info_dict['tel'] = new_tel '''注意:函数体内访问全局变量,需要用global做修饰!!!''' # 列表追加字典 info.append(info_dict) print(info) # 删除学生信息 def del_info(): """删除学生的函数""" # 1、用户输入要删除的学生的姓名 del_name = input("请输入要删除的学生的姓名:") # 2、判断输入的学生是否存在,如果存在则删除,不存在则提示信息 # 2.1 设置全局变量 global info # 2.2 循环遍历info检查是否存在 for i in info: if del_name == i['name']: info.remove(i) break else: # 对应的for循环,for循环结束后的操作 print("该学员不存在") print(info) # 修改学生信息 def mod_info(): """修改学员信息的函数""" mod_name = input("请输入要修改的学生姓名:") global info for i in info: if mod_name == i['name']: i['tel'] = input("请输入新的手机号:") print("修改成功") break else: print("学生不存在") # 查找学生信息 def search_info(): """查询学生信息函数""" search_name = input("请输入要查找的学生姓名") global info for li in info: if search_name == li['name']: print("name:%s id:%s tel:%s" % (li['name'], li['id'], li['tel'])) else: print("学生不存在") def all_info(): """查看所有学生信息函数""" global info for li in info: print("name:%s id:%s tel:%s" % (li['name'], li['id'], li['tel'])) if __name__ == '__main__': while True: # 1、显示功能界面 info_print() # 2、用户输入功能序号 user_num = input("请输入功能序号") if user_num == '1': add_info() elif user_num == '2': del_info() elif user_num == '3': mod_info() elif user_num == '4': search_info() elif user_num == '5': all_info() elif user_num == '6': print("退出系统") break
明天补充文件File的内容,今天的内容就到这里了。
如果这篇文章对你有帮助的话,点个赞呗
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。