009-python之函数进阶

一、函数变量的作用域
1、变量作用域

变量在定义完成后可以使用的范围
根据变量作用域的不同可以将变量分为全局变量和局部变量

2、全局变量和局部变量
2.1 全局变量

没有定义在函数里面或者类里面的变量是全局变量

作用域:从定义开始,到程序结束.(程序结束前的任何位置都可以使用)

a = 10  # a是全局变量
for i in range(a):
    print(i, end=' ')  # 0 1 2 3 4 5 6 7 8 9

for x in range(5):
    b = 20  # x和b是全局变量
print(f'全局变量{x},{b}')  # 全局变量4,20
2.2 局部变量

定义在函数中的变量就是局部变量;定义在类里面的变量是属性

作用域:从定义开始到函数结束,形参也是局部变量 函数外部无法使用局部变量

def fun3(c):
    d = 30  # c,d 是局部变量
    print(c, d)
# print(f'函数里面的变量{c},{d}')  # name 'c' is not defined
2.3 不同变量的存储方式
  • 全局变量默认保存在全局栈区间。
  • 局部变量默认是保存在函数对应的临时栈区间中,函数对应的临时栈区间,创建函数的时候会被创建出来,函数结束的时候自动释放
  • 如果在函数中定义全局变量,使用global关键字
  • 如果想要在函数里面修改一个全局变量的值,必须先用global对变量声明
二、函数参数的确定
1、函数参数的确定

调用函数的时候,实参到底给什么样的数据,由谁决定--------由参数在函数体中的使用方式决定

2、实参高阶函数

函数的参数是函数

如果一个参数是函数,传参的时候有两种方法:(1)用不同函数的函数名 (2)使用匿名函数(推荐)

3、匿名函数
3.1语法
# 语法:
函数名=lambda 形参列表:返回值
相当于
def 函数名(形参列表):
    return 返回值
# 练习 求两个数的和
sum1 = lambda x, y: x + y
print(sum1(1, 2))  # 3

匿名函数的缺点;只能实现功能简单的函数(一条语句就能实现它的功能)

3.2 匿名函数的应用

给实参高阶函数传参的时候,可以使用普通函数的函数名,也可以使用匿名函数

三、常见的实参高阶函数
1、max,min,sorted
max(序列)---直接比较序列中元素本身的大小,求出最大值
max(序列,key=函数)--- 按照函数指定的比较规则比较元素的大小,求出最大值
    函数的要求:a.有且只有一个参数(这个参数代表序列中的每个元素)
             b. 需要一个返回值(比较对象)--将参数看成元素来描述比较对象和元素之间的关系
# 求num中个位数最大的元素
num = [31, 2, 32, 4, 5647, 8675, 243]
print(max(num, key=lambda i: i % 10)) # 5647
练习
# 练习1:求nums中十位数最大的元素:  90
students = [
    {'name': '小明', 'age': 19, 'score': 89, 'gender': '男'},
    {'name': '小红', 'age': 22, 'score': 99, 'gender': '女'},
    {'name': '小胡', 'age': 28, 'score': 75, 'gender': '男'},
    {'name': '小花', 'age': 25, 'score': 80, 'gender': '女'},
    {'name': '李华', 'age': 17, 'score': 84, 'gender': '男'}
]
print(max(students, key=lambda i: i['score']))
print(max(students, key=lambda i: i['age']))
# {'name': '小胡', 'age': 28, 'score': 75, 'gender': '男'}
print(sorted(students, key=lambda i: i['score'], reverse=True))

# 练习2:求nums中十位数最大的元素:  90
nums = [9108, 23, 167, 90, 556, 149]
print(max(nums, key=lambda i: i // 10 % 10))  # 90

# 练习3:求nums中绝对值最小的元素
nums = [-992, 12, 78, -34, 99]
print(min(nums, key=lambda i: abs(i)))  # 12

# 练习4:nums中各个位数之和最大的元素
nums = [102, 19, 48, 221, 52]
# print(max(nums, key=lambda i: i // 100 + i // 10 % 10 + i % 10))  # 48
def myfun(num):
    sum1 = 0
    # while num>0:
    #     sum1+=num%10
    #     num=num//10
    for i in str(num):
        sum1 += int(i)
    return sum1
print(max(nums, key=myfun))
# 解法2
print(max(nums,key=lambda i:sum([int(x) for x in str(i)])))
2、map

基于原序列中的元素创建一个新序列

map(函数,序列)--- 根据函数制定的规则将指定序列中的元素转换成新序列中的元素
    函数的要求:a.参数的个数必须和序列的个数一致;参数代表后面序列中的元素
              b.有返回值,返回值代表新序列中的元素
map(函数,序列1,序列2,....)
    函数的要求:a.参数的个数必须和序列的个数一致;参数分别代表后面序列中的元素
练习
# 练习1:将nums中所有的元素乘以10
nums = [82, 67, 89, 6617, 90, 23, 71]
print(list(map(lambda i:i*10,nums)))
# [820, 670, 890, 66170, 900, 230, 710]

# 练习2:基于scores创建一个列表,列表中元素根据nums中元素确定为'及格'或者'不及格'
scores = [82, 67, 89, 66, 90, 23, 71]
# ['及格', '及格', '及格', '及格', '不及格', '及格']
print(list(map(lambda i:'及格' if i>=60 else '不及格',scores)))
# ['及格', '及格', '及格', '及格', '及格', '不及格', '及格']

# 练习3:基于names、ages和scores,创建学生列表:
names = ['stu1', 'stu2', 'stu3', 'stu4']
ages = [23, 34, 19, 22]
scores = [82, 67, 89, 66]
# [{'name': 'stu1', 'age': 23, 'score': 82}, .....]
print(list(map(lambda i,j,k:{'name':i,'age':j,'score':k},names,ages,scores)))
# [{'name': 'stu1', 'age': 23, 'score': 82}, {'name': 'stu2', 'age': 34, 'score': 67},
# {'name': 'stu3', 'age': 19, 'score': 89}, {'name': 'stu4', 'age': 22, 'score': 66}]

3、reduce

将序列中所有的元素通过制定的规则合并成一个数据

reduce(函数,序列,默认值)
      函数:a.有且只有两个参数,第一次参数指向默认值,第二个参数指向序列中的每个元素
          b. 需要一个返回值(描述合并方式)
      默认值 求和为0 求积为1
练习
nums=[82, 67, 89, 66]
from functools import reduce
print(reduce(lambda item,i:i+item,nums,0))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

兮知

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值