一、Python中函数的定义
函数的定义:是指将一组可重复使用的、用来实现某一关联功能的语句(代码段)通过一个名字(函数名)封装起来,在想要执行这个函数时,只需要通过“函数名”直接调用即可。函数的特点:功能强大、调用方便及灵活高效。
二、Python中函数的语法
1.关键字:“ def ” 是关键字。是用来识别是否为一个函数,不可缺少。
2.函数名:“square” 是函数名。可自定义,不要使用“关键字”或“内建函数”同名。
3.参数:“x,y” 是参数(形参),“12,20”是参数(实参)。形参不是必须的,可以不填,但是()不能省略。
4.方法:“s = x*y” 是函数方法。组织好的函数语句,默认缩进1个tab键(等同4个空格)。
5.返回值:“return” 是返回值。return后面可以没有返回值,甚至return语句也可省略,默认返回值为None。
# 1)函数的语法:
def square(x,y): # 声明一个函数(方法)
s = x * y # 函数语句(方法)
print(s) # 注意:输出语句放在函数里面!
# 没有return
square(12,20) # 调用函数(方法)
>>240
# 2)函数的语法:
def square(x,y): # 声明一个函数(方法)
s = x * y # 函数语句(方法)
# 函数内部无输出语句。
return s # 返回变量
b = square(12,20) # 调用函数(方法),并通过变量 "b" 去接收返回值 "s"
print(b) # 输出语句放在外面,打印的值是接收变量的值。
>>240
三、参数类型解析
Python函数中的参数:实参(1种)【关键字参数】+形参(4种)【必须参数;可变参数;默认值参数;可变关键字参数】。
1.关键字参数:"param1" ,在实参中定义。将实参的赋值指定给予某形参,可以不用记住传参的顺序。
2.必须参数:"param2" ,在形参中定义。对应于形参,有多少个形参就给出多少实参。在实参中传"param1",函数在调用时,可将它用于函数方法的运算。
3.可变参数:"*args" ,在形参中定义。形参中直接传"*args",函数在调用时,实参可以传递任意个参数。
4.默认值参数:"param3" , 在形参中定义。给函数的形参赋予默认值。
5.可变关键字参数:"**kwargs" ,在形参中定义。形参中传"**kwargs",函数在调用时,实参可以传递任意个关键字参数。
# 示例语法展示:
def square(param2,*args,param3=0,**kwargs):
pass
return
# square(param2,param1=8)
# 1)关键字函数(在实参中定义)
def fruit(apple,lemon):
print("苹果的数量为:"+ str(apple))
print("柠檬的数量为:" + str(lemon))
fruit(2,lemon=12) #lemon=12“关键字参数”可以不用记住参数的顺序
>>苹果的数量为:2
>>柠檬的数量为:12
# 2)必须参数:
# 不建议定义过多必须函数;如需要,可将多个必须参数封装成一个对象,把对象传入到函数中。
# 需求:创建一个函数,录入苹果、柠檬两种水果数量,并打印详情
def detail(apple, lemon):
print("苹果的数量为:" + str(apple))
print("柠檬的数量为:" + str(lemon))
detail(4, 5)
# >>苹果的数量为:4
# >>柠檬的数量为:5
# 3)可变参数:
# 需求:创建一个函数,用户可传入任意值,并返回任意值相加后的值
def add_all(*args):
summ = 0
for i in args:
summ = summ + i
print(summ)
return summ
# add_all(1, 2, 3, 4) # 可传入任意个参数
a = (1, 2, 3, 4) # 如果传入的是一个序列,可使用*将每个元素平埔出来,传递到可变参数的函数里面。
add_all(*a)
>>1
>>3
>>6
>>10
# 4)默认值参数:
def fruit(apple=1, lemon=2): # 在形参中定义,设置默认值。
print("苹果的数量为:" + str(apple))
print("柠檬的数量为:" + str(lemon))
fruit()
# fruit(lemon=5) # 可使用关键字参数对默认值参数赋值,改变默认值参数的定义
>>苹果的数量为:1
>>柠檬的数量为:2
# 5)可变关键字参数 :
def fruit(**kwargs):
print("水果的数量为:" + str(kwargs))
# print(type(kwargs)) # kwargs的类型为字典
# fruit(lemon=5, apple=10) # 可传递任意个关键字参数,这些关键字参数在函数调用的时候会自动组装成一个dict。
fruits = {"lemon": 5, "apple": 10}
fruit(**fruits) # 如果传的是一个字典,用 "**" 将字典中的键值对平铺出来。
>>水果的数量为:{'lemon': 5, 'apple': 10}
# 补充内容:函数中形参的传参顺序【1.必须参数-2.可变参数-3.默认值参数-4.可变关键字参数】
def fruit(apple_num,*args,banana_num=5,lemon_num=4,**kwargs):
print("苹果的数量为:"+ str(apple_num))
print("柠檬的数量为:" + str(lemon_num))
print("香蕉的数量为:" + str(banana_num))
print("数量为:" + str(args))
print("水果的数量为:" + str(kwargs))
numm=(3,5,4)
fruits={"苹果":3,"柠檬":4,"香蕉":5}
fruit(10,*numm,**fruits)
>>苹果的数量为:10
>>柠檬的数量为:4
>>香蕉的数量为:5
>>数量为:(3, 5, 4)
>>水果的数量为:{'苹果': 3, '柠檬': 4, '香蕉': 5}
四、内建函数
Python自带的函数【print()、len()、help()等】,也就是说这是python的类库帮我们已经写好的函数,只需要我们直接使用就可以了。
# 内建函数-del 的用法:
a = [1, 2, 3] # 对象[1, 2, 3]被 a 引用
b = a # 对象 a 被 b 引用
c = b # 对象 b 被 c 引用
print(a)
del a # 删除变量a,解除a对[1, 2, 3]的引用
del b # 删除变量b,解除b对[1, 2, 3]的引用
# print(a)
# print(b) # 会报错,NameError: name 'b' is not defined
print(c) # 最终变量c仍然引用1
>>[1, 2, 3]
>>[1, 2, 3]
# 内建函数-3个常见输出函数【print()、eval()、input()】
print("你是谁!")
a = eval("20+20") # eval()函数去掉字符串最外侧的引号,并按照python语句方式执行去掉引号后的字符串内容。
print(a)
input("我在哪?") # 阻塞式输出。
>>你是谁!
>>40
>>我在哪?_
五、匿名函数
匿名函数:就是没有名字的函数。Python中使用 lambda 来创建匿名函数。lambda 函数的语法只包含一个语句【 lambda [arg1 [,arg2,...argn]] : expression 】。
sum = lambda arg1, arg2: arg1 + arg2
demo = sum(20, 40)
# print("相加后的值是:", sum(10, 20))
print("相加后的值是:", demo)
>>相加后的值是: 30
>>相加后的值是: 60
六、自定义函数
用户自己创建的函数被叫做自定义函数。
def summ(x, y, z):
s = x + y + z
print(s)
return s
summ(3, 4, 5)
>>12
七、递归函数
# 定义:在函数内部可以调用其他函数,如果调用的是本身,这个函数就是递归函数
# 特性:
# 1、必须要有明确的结束条件
# 2、每次更深一层递归时,问题模块相比上一次递归减少
# 3、递归效率不高,递归层次过多会导致栈溢出
def calc(n):
print(n)
if int(n/2) >0:
return calc(int(n/2))
print('...',n)
calc(10)
>>10
>>5
>>2
>>1
>>... 1
八、函数的过滤、映射与聚合
#函数的数据处理:过滤、映射与聚合
#三个基础函数:filter()、map()和reduce()
# 语法:filter(function,iterable) function是一个函数,参数iterable是可迭代对象;
#filter()函数调用时iterable会被遍历,它的元素被逐一传入function函数,function函数返回布尔值。
#在function函数中编写过滤条件,如果为True的元素被保留,如果为False的元素被过滤掉。
# 示例1:
# users=["Tony","Tom","Ben","Alex"]
# users_filter=filter(lambda u:u.startswith("T"),users) #如果字符串以指定的值开头,则 startswith() 方法返回 True,否则返回 False。
# print(users_filter)
# print(list(users_filter))
# 语法:map(function,iterable) function是一个函数,参数iterable是可迭代对象;
#示例2:
# users=["Tony","Tom","Ben","Alex"]
# users_map=map(lambda u:u.lower(),users)
# print(list(users_map))
#聚合操作会将多个数据聚合起来输出单个数据,聚合操作中最基础的是归纳函数reduce(),
#reduce()函数会将多个数据按照指定的算法积累叠加起来,最后输出一个数据。
# 语法:reduce(function,iterable[,initializer]) function是一个函数,参数iterable是可迭代对象,参数initializer是初始值;
#示例2:(实现对一个数列的求和运算)
from functools import reduce
a=(1,2,3,4)
a_reduce=reduce(lambda acc,i:acc+i,a)
print(a_reduce)