一、函数的作用
在开发过程中,利用函数可以更高效地实现代码复用
二、函数的使用步骤
1.定义函数
def 函数名(参数):
代码
2.调用函数
函数名(参数)
(1)不同的需求,参数可有可无
(2)在python中,函数必须先定义后使用
(3)如果没有调用函数,函数里面的代码是不会执行的
三、函数参数的作用
函数的参数可以使函数变得更加灵活
def add_num(a,b):
result=a+b
print(result)
add_num(10,20)
四、函数返回值的作用
return的作用:(1)负责函数返回值
(2)退出当前函数 return下方所有代码均不执行
def buy():
return '烟'
print('ok') #这一行代码会报错
五、函数的说明文档
1.定义函数的说明文档
def 函数名(参数):
"""说明文档的位置"""
代码
2.如何查看函数的说明文档
help(函数名)
六、函数的嵌套调用
一个函数里面调用了其它函数
七、变量作用域
1.分类:局部变量、全局变量
2.局部变量:在函数体内部,临时保存数据。即当函数调用完成后则销毁
3.全局变量:可以用global将局部变量变为全局变量
八、函数返回值
1、返回值可以作为参数传递
def test1():
return 50
def test2(num):
print(num)
result=test1()
test2(result)
2、函数返回多个值
def return_num():
return 1
return 2
我们运行此代码后会发现代码报错,原因可以在上面return的作用中找到,return下方的代码均不执行,所以这个代码中只会执行一个return
那我们要怎么做才能使函数返回多个值呢?
def return_num():
return 1,2
result=return_num()
print(result) #(1,2)
return a,b返回多个数据时,默认为元组类型
return后面可以连接列表、元组、字典便于返回多个值
九、函数的参数
1.位置参数:调用函数时依据函数定义的参数位置来传参
def user_info(name,age,gender):
printf(f'我的名字是{name},年龄是{age},性别是{gender}')
user_info('TOM',20,'男')
我们传递的参数和定义的参数的顺序必须一致
2.关键字参数:函数调用时,通过键=值形式加以指定
函数调用时,如果有位置参数,位置参数必须在关键字参数的前面,但是关键字参数之间不存在先后顺序
user_info('Rose',age=20,gender='女')#代码正常运行
user_info('Tom',gender='男',age=22)#代码正常运行
user_info(age=18,gender='女','Lily')#代码异常
3.缺省参数
(1)定义:缺省参数也叫默认参数,用于定义参数,为参数提供默认值
(2)使用规则:调用函数时可以不传递该缺省参数的值,但是此时缺省参数的值为我们提供的默认值
所有位置参数必须出现在默认参数之前,包括函数的定义与调用
def user_info(name,age,gender='男'):
print(f'您的姓名为{name},年龄为{age},性别为{gender}')
user_info('Tom',20)
user_info('Tom',20,gender='女')
我们第一次调用函数时未改变gender的值,所以此时Tom的性别与我们默认的一致,为男
但是我们在第二次调用函数时改变了gender,所以此时Tom的性别为女了
4.不定长参数
(1)包裹位置参数
def user_info(*args):
print(args)
user_info('Tom') #('Tom',)
user_info('Tom',18) #('Tom',18)
user_info('Tom',18,'man') #('Tom',18,'man')
user_info() #()
接收所有位置参数,返回一个元组
传入的所有参数均会被args变量(一个元组类型)收集,它会依据传入参数的位置合并为一个元组
(2)包裹关键字传递
def user_info(**kwargs):
print(kwargs)
user_info(name='Tom',age=18,id=110)
十、拆包
1.拆包元组
def return_num():
return 100,200
num1,num2=return_num()
print(num1)#100
print(num2)#200
2.拆包字典
dict1={'name':'Tom','age':20}
a,b=dict1
print(a)#name
print(b)#age
print(dict1[a])#Tom
print(dict1[b])#20
对字典进行拆包,取出来的是字典的key
十一、交换变量值
1.引入第三方变量
2.更为简便的方法
a,b=1,2
a,b=b,a
print(a)#2
print(b)#1
十二、引用
1.函数 id():判断两个变量是否为同一个值的引用(我们可以认为id值为那块内存的地址标识)
2.int类型
a=1
b=a
print(b)#1
print(id(a))
print(id(b))
#上面两个的地址值相同
a=2
print(b) #1 int为不可变类型
print(id(a))
print(id(b))
#上面两个的地址值不相同
我们很容易地可以得出修改a后a与b的地址不相同这样的结论,但是究其原理,为什么修改a后两者地址值就不相同了呢?
b的值和地址不受影响,因为int是不可变类型,也正因如此,当我们修改了a的值,内存要另外开辟一个空间去存储2
3.列表
aa=[10,20]
bb=aa
#此时aa和bb的地址值相同
aa.append(30)
print(bb) #[10,20,30]
#此时aa与bb的地址值仍相同
列表为可变类型,对列表内元素进行修改后不需要开辟一块新的空间去存储新的列表内的元素
4.引用当作实参
def test(a):
print(a)
print(id(a))
a+=a
print(a)
print(id(a))
b=100
test(b)
#地址不同
c=[10,20]
test(c)
#地址相同
说明函数调用参数时,参数的id值与变量的id值变化规则一致
十三、数据的分类
1.可变类型:列表、字典、集合
2.不可变类型:整型、浮点型、字符串、元组
十四、递归
特点:函数内部自己调用自己、必须有出口(无出口会超过最大深度)
def sum_numbers(num):
if num==1
return 1
return num+sumbers(num-1)
sum_result=sum_numbers(s)
print(sum_result)
十五、lambda表达式
1.语法
lambda 参数列表:表达式
(1)lambda表达式的参数可有可无,函数参数在lambda中完全适用
(2)lambda表达式可接收任何数量的参数但是只可以返回一个表达式的值
fn=lambda:100
print(fn)#打印值为地址
print(fn())#打印值为100
直接打印lambda表达式,输出的为此lambda的内存地址
#实现a+b
fn=lambda a,b:a+b
print(fn(10,20)) #30
2.参数形式
(1)无参数
fn=lambda a,b:a+b
print(fn(1,2)) #3
(2)一个参数
fn=lambda a:a
print(fn('Hello World'))
(3)默认参数
fn=lambda a,b,c=100:a+b+c
print(fn(10,20)) #130
print(fn(10,20,30)) #60
我们可以在lambda表达式的参数部分给某个变量赋值,赋值后如果在使用lambda表示式时不对该变量传值,那么我们就直接使用该变量的默认值,若对该变量传值那么我们只使用我们传入该变量的值
(4)可变参数*args
fn=lambda *args:args
print(fn(10,20)) #(10,20)
print(fn(10,20,30)) #(10,20,30)
print(fn(10)) #(10,)
注意,此时返回值形式为元组,如果只有一个返回值,那么我们要记得在元组中加逗号
(5)可变参数**kwargs
fn=lambda **kwargs:kwargs
print(fn('name'='Python')) #{'name':'Python'}
prinnt(fn('name'='Pyhton','age'=30)) #{'name':'Python','age':30}
3.lambda表达式的应用
(1)带判断的lambda表达式
fn=lambda a,b:a if a>b else b
(2)取表中数据按照字典key排序
student=[{'name':'Tom','age':20},{'name':'Rose','age':30},{'name':'Jack','age':40}]
按name值排序:student.sort(key=lambda x:x['name'],reverse=True)
按age值排序:student.sort(key=lambda x:x['age'],reverse=False)
十六、高阶函数
1.普通高阶函数
(1)abs():数字求绝对值
abs(-10) #10
(2)round():对数字进行四舍五入
round(1.9) #2
round(1.2) #1
def sum_num(a,b,f)
return f(a)+f(b)
result=sum_num(1.2,3.7,abs)
print(result) #5
2.内置高阶函数
(1)map():map(func,lst)将传入的函数变量func作用到lst变量的每个元素中并将结果组成新的列表返回
list1=[1,2,3,4,5]
def func(x)
return x**2
result=map(func,list1)
print(result) #内存地址
print(list(result)) #[1,4,9,16,25]
(2)reduce():每次func计算的结果与序列的下一个元素累积计算
import functools
list1=[1,2,3,4,5]
def func(a,b)
return a+b
reduce(func,list1)
(3)filter():过滤掉不符合条件的元素
list2=[1,2,3,4,5,6,7,8,9,10]
def func(x)
return x%2==0
result=filter(func,list2)
print(result) #地址
print(list(result)) #[2,4,6,8,10]