2020-12-28函数定义及语法

什么是函数? 函数就是盛放代码的容器

具备某一功能的工具->函数
事先准备工具的过程->函数的定义
遇到应用场景直接拿来用即可 ->函数的调用

为何要用函数:
用函数解决下述问题
1、代码组织结构不清晰、可读性差
2、可扩展性差
3、遇到重复的功能只能重复编写实现代码,代码冗余

如何用函数:
定义的语法:
def 函数名(参数1,参数2,参数3…):
“”“函数的文档注释 “””
代码1
代码2
代码3
retrun 返回值
函数定义的原理:
1、申请内存空间把函数体放进去
2、将函数的内存地址绑定给函数名 #函数名与变量名极其相似
强调:定义函数只检测语法不执行代码

二:调用函数 #遵循两个原则:先定义后调用
函数名加括号如:login()
发生的事:
1、先通过函数名定位到内存地址
2、函数的内存地址()->触发函数体代码的运行
强调:调出函数才会执行函数体代码
三、定义函数的三种形式:
1、无参
def func():
print(‘xxx’)
2、有参
def func(x):
#x=10
print(x)
3、空
def login():
pass

四、调用函数的三种形式:
1、语句表达式
len(‘hello’)

2、表达式
res=len(“hello”) * 10
print(res)

3、可以当做参数传给一个函数
print(len(‘hello’))

函数参数:
1、形参:在函数定义阶段括号内指定的参数,称之为形式参数,简称形参 形参->等同于变量名
2、实参:在函数调用阶段括号内传入的值,称之为实际参数,简称形参 实参-> 等同于变量值

实参与形参的关系:
在函数调用时,实参值会绑定给形参名,在函数调用完以后解除绑定

细分的话:
一:位置形参:在定义函数时,按照从左到右的顺序依次定义变量名,称之为位置形参
特点:每次被调用,必须被赋值
def func(name,age):
print(name)
print(age)
二、位置实参:在调用函数时,按照从左到右的顺序依次传入的值,称之为位置实参
特点:按照位置为形参赋值,一 一对应
func(“egon”,18),按照位置进行赋值,位置乱了,程序就错了

三、关键字实参:在调用函数时,按照key=value的形式传值,称之为关键字实参
特点:可以打乱顺序,但仍然可以指名道姓的为指定形参赋值
func(age=18,name=‘egon’)

注意:也可以混用位置实参和关键字实参,但是
1、位置实参必须在关键字实参的前面否则会语法错误

def foo(x,y,z):
pass
def foo(1,y=2,3) #错误

def foo(x=1,y=2,3) #错误

2、不能为同一个形参重复赋值
def foo(x,y,z):
pass
def foo(1,y=2,z=3,x=4) #错误

四、默认形参:在定义函数时,就已经为某个形参赋值了,称之为默认形参
特点:调用函数时,可以不用为其赋值,非要赋值以自己实际赋值为准
def func (name,hobby,hobbies = None):
if hobbies is None:
hobbies = []
hobbes.append(hobby)
print("%s的爱好是%s" %(name,hobbies))

func(“egon”,“read”)
func(“tom”,“play”)
func(“jack”,“music”)
func(“lili”,“eat”,[“movie”])

注意:注意:可以混用位置实参和默认形参,但是
1、位置形参必须在前
2、默认形参的值通常都应该是不可变类型
3、默认形参的值在定义阶段赋值,调用阶段不影响默认形参
4、当函数中需要重复调用一样的形参时,我们可以把该形参设成默认形参

可变长系列:
可变长参数:在调用函数时,传入的实参个数不固定,对应着必须有特殊形式的形参来接受溢出的形参
实参无非两种:
溢出的位置实参会被*接受
溢出的关键词形参会被**接受

*在形参中的应用:*会将溢出的位置实参合并成一个元组,然后赋值给紧跟其后的那个形参名
def my_sum(*args):
res = 0
for i in args:
res += i
print(res)

my_sum(1,2,3,4,5,6)

**在形参中的应用:**会将溢出的关键字实参合并成一个字典,然后赋值给紧跟其后的那个形参名
def func(x,**kwargs): #kwargs = {‘a’:2,‘c’:4,‘b’:3}
print(x)
print(kwargs)

func(1,a=2,b=3,c=4)

def x(*args,**kwargs):
print(args)
print(kwargs)
结论:
*与 **在形参中体现了一种汇总行为

*”与** 在实参中体现了一种打散行为
"*"后可以跟能被for循环遍历的任意类型****会将紧跟其后的那个值打散成位置实参
def func(x,y,z):
    print(x)
    print(y)
    print(z)

**后只能跟字典,**会将字典打散成关键字实参

了解:命名关键字形参:在*与**之间的形参称之为命名关键字形参
特点:必须按照key=value的形式传值
def func(x,*args,y=222,z,**kwargs):
print(x)
print(args)
print(y)
print(z)
print(kwargs)
所以此处想给y,z传值必须用关键字传值

retrun 详解:
函数内可以有多个retrun但只要执行一个retrun,整个函数就立即结束,并且将retrun后的返回值当做本次电泳的结果返回
retrun后的返回值有三种情况:
(1)retrun值返回的就是这一个值
(2)retrun值1,值2,值3:返回的一个元组
(3)函数内可以没有retrun、或者retrun:返回的都是None

猜你喜欢

转载自blog.csdn.net/givenchy_yzl/article/details/111868126