day12-学习作业与总结:
-
匿名函数
-
匿名函数的本质还是函数,他们除了定义的语法不同,其它东西都一样
-
注意:匿名函数只能用来实现功能很简单的函数
-
语法:
-
函数名=lambda 形参列表: 返回值
-
转换成普通:
- def 函数名(形参列表):
- return 返回值
- def 函数名(形参列表):
-
# 练习1:写一个匿名函数判断指定的数是否是偶数,如果是返回True,否则返回False is_even_number = lambda num=20: num % 2 == 0 print(is_even_number(89)) print(is_even_number(num=90)) print(is_even_number())
-
# 几乎全军覆没的面试题: list1 = [] for x in range(5): list1.append(lambda i: i*x) # [lambda i: i*x, lambda i: i*x, lambda i: i*x, lambda i: i*x, lambda i: i*x] print(list1[0](2)) # 8 print(list1[2](2)) # 8
-
-
-
变量的作用域
- 变量的作用域:变量定义以后可以使用的范围
- 根据变量作用域的不同我们将变量分为全局变量和局部变量两种
- 全局变量和局部变量
- 全局变量
- 没有定义在函数和类里面的变量都是全局变量
- 全局变量的作用域是从定义开始到程序结束
- 全局变量保存在全局的栈区间,全局栈区间在程序结束后才会自动释放
- 局部变量
- 定义在函数中的变量使局部变量,其中包括形参;
- 局部变量的作用域是从定义开始到函数结束
- 调用函数的时候系统会自动给这个函数创建一个临时栈区间用来保存在函数中产生的数据(包括局部变量)
- 当函数调用结束这个临时栈区间会自动释放
- global关键字,可以在函数中使局部变量变为全局变量
- 全局变量
-
在python中定义函数其实就是定义类型是function的变量,函数名就是变量
-
变量能干的事情函数都可以做
-
高阶函数:实参高阶函数,返回值高阶函数
-
func1是实参高阶函数-因为他有一个参数是函数
-
def func1(x): # x = t x(10, 20, 30) * 2 def t(a, b, c): print('函数!') return 100 func1(t)
-
-
-
常用的实参高阶函数:max、min、sorted(sort)、map、reduce
-
如果函数的参数是函数提供实参的方式:
- 用普通的函数的函数名
- 使用匿名函数
-
常用实参高阶函数
-
max、min、sored、列表.sort
-
max(序列) - 求序列中值最大的元素
max(序列, key=函数) - 根据函数指定的规则获取序列中最大的元素 -
函数的要求: 1) 有且只有一个参数(这个参数代表序列中的元素)
2) 有一个返回值(比较对象)
4. min(序列, key=函数) - 根据函数指定的规则获取序列中最小的元素
5. sored(序列, key=函数) - 根据函数指定的规则对序列中的元素进行从小到大排序
6. 列表.sort(序列, key=函数) - 根据函数指定的规则对序列中的元素进行从小到大排序 -
map-将序列中的元素按照函数指定的规则进行变换得到一个新的序列
-
map(函数, 序列)
函数的要求:1.有且只有一个参数(代表原序列中元素)
2.有一个返回值(新序列中的元素 - 在这儿只需要描述清楚 -
新序列中的元素与原序列元素的关系)
map(函数, 序列1, 序列2)
函数的要求:1.有且只有2个参数(分别代表原序列中元素)
2.有一个返回值(新序列中的元素 - 在这儿只需要描述清楚新序列中的元素与原序列元素的关系)
-
map(函数, 序列1, 序列2, 序列3) 函数的要求:1.有且只有3个参数(分别代表原序列中元素) 2.有一个返回值(新序列中的元素 - 在这儿只需要描述清楚新序列中的元素与原序列元素的关系)
-
map(函数, 序列1, 序列2, 序列3,…)
-
-
-
reduce-将序列中的元素按照制定的规则合并成一个数据
-
reduce(函数, 序列, 初始值)
-
初始值:一般是0、1或者空串
-
函数的要求:1.有且只有两个参数(第一个参数指向初始值;第二个参数指向序列中的每个元素)
2.有一个返回值(决定合并方式) -
注意:使用reduce之前必须先从functools模块中导入
-
nums = [10, 23, 4, 8] # 求所有元素的和: 10+23+4+8 # 0 + 10 + 23 + 4 + 8 result = reduce(lambda x, item: x + item, nums, 0) print(result)
-
-
作业:
-
写一个匿名函数,判断指定的年是否是闰年
result=lambda year:'该年份是闰年' if year%400==0 or (year%4==0 and year%100!=0) else '该年份不是闰年' print(result(1000)) print(result(2000)) print(result(86400))
-
写一个函数将一个指定的列表中的元素逆序( 如[1, 2, 3] -> [3, 2, 1])(注意:不要使用列表自带的逆序函数)
nums = [1, 2, 3] print(sorted(nums,key=lambda items:items,reverse=True))
-
编写一个函数,计算一个整数的各位数的平方和
# 3.编写一个函数,计算一个整数的各位数的平方和 def squares(x): z=0 """ 求一个整数的各位数的平方和 :param x: 输入的整数 :return: """ if x>0: d=len(str(x)) while d>0: z+=(int(x)%10)**2 x=int(x)//10 d-=1 return z else: x=x*-1 d=len(str(x)) while d > 0: z+=(x%10)**2 x=x//10 d-=1 return z squares(-123) print(squares(-123)) # 二: from functools import reduce num1 = int(input('请输入一个整数:')) def sum1(n:int): if n<0: n=-n result=reduce(lambda x, item: x+int(item)**2, str(n),0) print(result) sum1(num1)
例如: sum1(12) -> 5(1的平方加上2的平方) sum1(123) -> 14
-
求列表 nums 中绝对值最小的元素
nums = [-23, 100, 89, -56, -234, 123] print(min(nums,key=lambda items:(items if items>=0 else -items)))
例如:nums = [-23, 100, 89, -56, -234, 123], 最大值是:-23
-
已经两个列表A和B,用map函数创建一个字典,A中的元素是key,B中的元素是value
A = ['name', 'age', 'sex'] B = ['张三', 18, '女'] 新字典: {'name': '张三', 'age': 18, 'sex': '女'} A = ['name', 'age', 'sex'] B = ['张三', 18, '女'] result=dict(map(lambda x,y: (x,y), A, B)) print(result)
-
已经三个列表分别表示5个学生的姓名、学科和班号,使用map将这个三个列表拼成一个表示每个学生班级信息的的字典
names = ['小明', '小花', '小红', '老王'] nums = ['1906', '1807', '2001', '2004'] subjects = ['python', 'h5', 'java', 'python'] # 结果:{'小明': 'python1906', '小花': 'h51807', '小红': 'java2001', '老王': 'python2004'} result=dict(map(lambda x,y,z:(x,z+y),names,nums,subjects)) print(result)
names = ['小明', '小花', '小红', '老王'] nums = ['1906', '1807', '2001', '2004'] subjects = ['python', 'h5', 'java', 'python'] 结果:{'小明': 'python1906', '小花': 'h51807', '小红': 'java2001', '老王': 'python2004'}
-
已经一个列表message, 使用reduce计算列表中所有数字的和
from functools import reduce message = ['你好', 20, '30', 5, 6.89, 'hello'] result=reduce(lambda x,item: x+item if type(item) in {int,float} else x+0,message,0) print(result)
message = ['你好', 20, '30', 5, 6.89, 'hello'] 结果:31.89
-
已经列表points中保存的是每个点的坐标(坐标是用元组表示的,第一个值是x坐标,第二个值是y坐标)
points = [ (10, 20), (0, 100), (20, 30), (-10, 20), (30, -100) ]
1)获取列表中y坐标最大的点
points = [(10, 20), (0, 100), (20, 30), (-10, 20), (30, -100)] print(max(points,key=lambda items:(items[1])))
2)获取列表中x坐标最小的点
points = [(10, 20), (0, 100), (20, 30), (-10, 20), (30, -100)] print(min(points,key=lambda items:(items[0])))
3)获取列表中距离原点最远的点
points = [(10, 20), (0, 100), (20, 30), (-10, 20), (30, -100)] print(max(points,key=lambda items:((items[1]**2+items[0]**2)**0.5)))
4)将点按照点到x轴的距离大小从大到小排序
points = [(10, 20), (0, 100), (20, 30), (-10, 20), (30, -100)] print(sorted(points,key=lambda items:items[1]**2,reverse=True))
5)将点按照点到原点的距离大小从小到大排序
points = [(10, 20), (0, 100), (20, 30), (-10, 20), (30, -100)] print(sorted(points,key=lambda items:((items[1]**2+items[0]**2)**0.5)))