recode
0.什么是函数,什么时候需要使用函数
对实现某一特定功能的代码段的封装
1.函数的声明
"""
def 函数名(参数列表):
函数体
"""
2.函数的调用
"""
1)语法:函数名(实参列表)
2)调用过程:
回到函数声明的位置
让实参给形参赋值(传参) - 保证每个参数都有值
执行函数体
确定返回值 - 看执行函数的时候有没得有遇到return,遇到了return后面是什么返回值是什么
没有遇到就是None
回到函数调用的位置,接着往后执行 - 这个时候函数调用表达式的值才是函数的返回值
"""
3.函数的参数
"""
1)位置参数和关键字参数
注意:两个同时存在的时候,位置参数要在关键字参数的前面
2)参数默认值
注意:没有默认值的参数要放在前面
3)参数类型说明:给参数赋默认值,形参名:类型
4)不定长参数(用的比较少)
*参数名 - 参数变成元祖;给这个参数赋值只能用位置参数
**参数名 - 参数编程字典;给这个参数赋值只能用关键字参数
"""
4.返回值
"""
1)怎么确定函数的返回值 (见函数调用过程)
2)怎么获取函数的返回值 (通过获取函数调用表达式的值就能获取函数返回值)
3)声明函数的时候,什么时候需要函数的返回值;把谁作为函数的返回值 (看实现函数功能会不会产生新的数据)
"""
匿名函数
1.什么是匿名函数
没有函数名的函数就是匿名函数 (匿名函数还是函数)
2.语法
"""
lambda 形参列表: 返回值
说明:lambda - 关键字固定写法
形参列表 - 和普通函数形参列表一样.变量名1,变量名2...
(参数相关的语法中,除了':类型名'队参数类型进行说明以外,别的语法都适用)
: - 固定写法
返回值 - 相当于普通函数中return后面的语句
注意:匿名函数能做的事情普通函数都能做,但是多行代码的普通函数,匿名函数没法实现
"""
3.调用 (和普通函数一样)
# 函数(实参列表) - 函数不一定是函数名,可以是通过任何方式获取的function的值
# python中,声明函数其实可以看成是类型声明类型是function的变量;匿名函数可以看成是function类型的数据(类似100是int类型的数据)
# 变量名 = lambda 形参列表: 返回值 - 通过变量名()调用匿名函数
a = 100
b = 12.5
c = 'abc' # 类型是str的值
d = [10, 20, 30, 'abc'] # 类型是list的值
e = {'a': 10, 'b': 20} # 类型是dict的值
f = lambda x, y: x+y # 类型是function的值
print(type(c), type(f))
函数是类型为function的特殊变量
1.函数作为变量
python中声明函数其实就是在声明一个类型是function的变量,函数名就是变量名.所以普通变量能做的事情,函数都能做
声明一个函数func1,有一个参数一个返回值:
func1是类型是function的变量,他里面存的数据是一个函数,函数名叫func1,有一个参数n
def func1(n):
return n*n
2.普通变量能做的函数都能做
# 1)用一个变量给另外一个变量赋值
print('=======')
list1 = [1, 2]
list2 = list1
def func2(n):
return n * 2
a1 = func2
print(type(a1))
print(a1(2))
# 2)变量可以作为列表的/元素,作为字典的值等
list1 = [1, 2]
dict1 = {'a': list1}
def func3(n):
return n * 3
dict1 = {'a': list1, 'b': func3}
dict1['a'].append(100)
print(dict1)
dict1['b'](9)
print(dict1['b'](9)) # func3(9)
# 变量可以重新赋值,重新赋值后覆盖以前的值
def func4():
print('==========')
func4()
func4 = 4
print(func4)
# 3)变量作为函数的实参
# 将函数作为实参传递给另一个函数(实参高阶函数:闭包)
num3 = [1, 2, 3]
print(sum(num3))
def func5(a):
# a = print
a('abc') # print('abc')
func5(print)
##应用:sort方法的使用
# 列表.sort(key) - key需要穿一个类型是function的值(函数),需要这个函数有一个参数和一个返回值
# 参数指向的是列表中的每个元素,返回值是排序的时候的比较对象
nums = ['2', '31', '5', '56', '8', '54', '19']
nums.sort()
print(nums)
nums.sort(key=lambda x: int(x))
print(nums)
students = [{'name': 'xiaoming', 'age': 23, 'score': 90},
{'name': 'huahua', 'age': 30, 'score': 45},
{'name': 'zhangsan', 'age': 20, 'score': 75}
]
students.sort(key=lambda x: x['score']) # 返回值(x['age'])决定列表中的元素按什么排序
print(students)
def func6(x):
return x['name'][-1]
students.sort(key=func6)
print(students)
def my_max(list2,key=None):
list1 = list(list2)
num1 = list1[0]
if key:
for item in list1:
if key(item) > key(num1):
num1, item = item, num1
else:
for item in list1:
if item > num1:
num1, item = item, num1
return num1
list2 = ['12', '1', '24', '90']
print(my_max(list2, key=lambda x: int(x)))
# i = 0 1 2 3 4
# 0 3 6 9 12
# 9
# 0
# 6
print('============')
list3 = []
for i in range(5):
list3.append(lambda x: x*i)
print(list3[3](3))
print(list3[0](3))
print(list3[2](3))
print(list3)
"""
i = 0 list3 = [lambda x: x*i]
i = 1 list3 = [lambda x: x*i,lambda x: x*i]
...
i = 4 list3 = [lambda x: x*i,lambda x: x*i,lambda x: x*i,lambda x: x*i,lambda x: x*i]
list3[0] = lambda x: x*i
list3[0](3) = lambda x=3: 3*4 #注意哦,循环结束后 i == 4
"""
action_scope
1.什么是作用域:变量的使用范围
2.全局变量和局部变量
"""
a.全局变量:python除了在函数中或者类中声明的变量,都是全局变量.
全局变量的作用域:从声明开始到文件结束的任何位置
b.局部变量:在函数中声明的变量就是局部变量.
局部变量的作用域:从声明开始到函数结束都可以使用
"""
aa = 100
def ai():
# 不能在函数中直接修改一个全局变量的值,而是重新声明一个新的局部变量
aa = 100 # 声明一个变量aa,这是一个新的变量,和函数外的全局变量aa不是同一个
print(aa)
ai()
print(aa)
3.global和nonlocal
"""
1) global:想要在一个函数中去修改一个全局变量的值,或者想要在函数中声明一个全局变量
global 变量名
变量名 = 值
2)nonlocal:想要在局部的局部中,修改一个局部变量的值
nonlocal 变量名
变量名 = 值
"""