函数简介
1.为何用函数之不使用函数的问题
组织结构不清晰
代码冗余
无法统一管理且维护难度大
2.函数分类:
内置函数
自定义函数
3.为何要定义函数
函数即变量,变量必须先定义后使用,未定义而直接引用函数,就相当于在引用一个不存在的 变量名
#1 定义阶段
def bar():
print('懒蛋蛋')
def foo():
bar()
print('开始学习函数了')
#2 调用阶段
foo()
'''
懒蛋蛋
开始学习函数了
'''
4.函数的概念
工具就具备某一种功能的物件,就是程序中的函数概念 功能
事先准备工具的工程称为函数的定义 过程
遇到特定的场景拿来就用称为函数的调用 拿来用
5.定义函数都干了哪些事?
只检测语法,不执行代码
6.如何定义函数(函数名要能反映其意义)
def ...
基本格式:
def 函数名(arg1,arg2,arg3):
'''注释'''
函数体
return 返回值
return的特性/函数的返回值 **
#return 的返回值没有类型限制
1> 只返回一次值 并且会终止函数 会把return后的值作为函数执行的返回结果
2> 没有return返回None,相当于 return None
3> 指定return 返回的值(1个),就返回该值
4> 指定return 返回多个值,逗号风格,默认返回元组

def func(): print('return特性') #return 0 #返回 0 #return 1,2,3 # (1,2,3) 多个值返回元组 return [1,3],{'name':'alex'} #([1, 3], {'name': 'alex'}) 多个值返回元组 print(func()) def foo(): print('==============>') return 123 return 456 print('==============>') print('==============>') print('==============>') foo() ''' 打印结果: ==============> ''' print(foo()) ''' ==============> '''
什么时候该有?
调用函数,经过一系列的操作,最后要拿到一个明确的结果,则必须要有返回值
通常有参函数需要有返回值,输入参数,经过计算,得到一个最终的结果
什么时候不需要有?
调用函数,仅仅只是执行一系列的操作,最后不需要得到什么结果,则无需有返回值
通常无参函数不需要有返回值
定义函数的三种形式
无参: 应用场景仅仅只是执行一些操作,比如与用户交互,打印 有参: 需要根据外部传进来的参数,才能执行相应的逻辑,比如统计长度,求最大值最小值
空函数:设计代码结构
无参函数

def func(): print('无参数函数') #return 0 #无参函数有没有return都可以 res=func() print(res) ''' 无参数函数 None 没有return 返回 None,相当于return None '''
有参函数
有参函数通常有个返回值

#有参函数的例子
#求最大值和最小值
#方式1
def my_max(x,y):
if x>y:
print(x)
else:
print(y)
my_max(1,2)
#定义了一个函数 并 函数名()执行了函数 函数体里有打印操作
'''
打印结果是 2
'''
print(my_max(1,2))
# 打印函数 会执行函数并且打印函数返回值
'''
2 函数的执行结果
None 函数的返回值 因为没有定义返回值 所以是None
'''
#方式2
def my_max(x,y):
if x>y:
return x
else:
return y
my_max(1,2)
#没有打印结果 因为定义的函数里就没定义执行的时候出打印结果
res=my_max(1,2)
print(res)
'''
打印结果:2 打印函数的执行才会出现函数的返回值
'''
空函数
def foo():
pass #代表什么也不干
函数的调用
1 先找到名字
2 根据名字调用代码
函数调用的三种形式
1 语句形式:foo()
2 表达式形式:3*len('hello')
4 当中另外一个函数的参数:range(len('hello'))

def my_max(x,y): if x>y: return x else: return y my_max(1,2) #调用函数的语句形式 res=my_max(1,2)*10 #调用函数的表达式形式 print(res) v=my_max(my_max(1,2),3) #当做另外一个函数的参数 print(v)
函数的参数 ****
形参 -变量名
实参-变量值
# 形参: 在定义是定义函数阶段 在()内的参数 就是 x y 形式上的参数 不占用内存空间 def foo(x,y): # x=1 y=2 print(x) print(y) #实参: 在调用函数阶段 在()内的参数 就是1,2 实际的参数 占用内存空间 foo(1,2) #形参即变量名,实参即变量值,函数调用则将值绑定到名字上,函数调用结束,解除绑定
参数的分类
位置参数
位置参数:按照从左到右的顺序依次定义的参数
位置形参:按照从左到右的顺序依次定义的形参 定义阶段
特性:必须被传值,多一个不行,少一个也不行
位置实参:按照从左到右的顺序依次定义的实参 调用阶段
特性:与形参按照位置一一对应
#位置参数 def foo(name,age): print(name) print(age) foo('egon',3) #name='egon' age=3 foo(3,'egon') #name=3 age='egon' #位置换 对应的值换
关键字参数(实参)/关键字实参
关键字实参:指的是按照name=value的形式,指名道姓的给name传值
#关键字参数 def foo(name,age): print(name) print(age) foo(name='egon',age=18) foo(age=18,name='egon') #与位置无关 都一样
#########个人觉得 应该没人这么作死吧 不用费力看 #注意的问题 #1> 位置实参必须在关键字实参的前面 #2> 一定不要对同一个形参传多次值 #站在调用阶段 研究实参的变化 位置实参和关键字实参的混合体 def foo(name,age,sex): print(name) print(age) print(sex) foo('egon',18,'male') #位置实参 foo(name='egon',sex='male',age=18,) #关键字实参 foo('egon',sex='male',age=18) #混合体实参 #问题1 foo(sex='male',age=18,'egon') #错误 位置实参必须在关键字实参的前面 #问题2 foo('egon',sex='male',age=18,name='egon') #错误 一定不要对同一个形参传多次值
默认参数
可变长参数
闭包函数
装饰器
迭代
生成器
协程函数+面向过程+递归+二分法
匿名函数
有名参数
定义一个工具 以后重复后使用
def func(x,y,z=1): return x+y+z func()
匿名函数lambda
1.没有名字
2.函数体自带return
lambda x,y,z=1:x+y+z
没有名字 参数:返回值 默认调用return 返回值
应用场景:应用于一次性场景 临时使用
应用:max,min,sorted,map,reduce,filter
关于匿名函数的使用方法 参考内置函数里 max,min,sorted,map,reduce,filter的讲解