我想当第一

本节内容:

一.初识函数,参数

1.初识函数

什么是函数?
函数就是一个具有特定功能的代码块
函数的作用?
就是把代码进行封装,以提高代码的重用性,提高开发效率,降低后期的维护成本
函数的定义和调用:
‘’’
基本结构:

def 函数名 ([参数列表]):
代码块….
代码块…..

_函数的调用:
函数名()‘’’
示例如下:
def love():
print(‘i love you’)
#函数的定义

love() #函数的调用

_
特征和注意:
1:定义需要在调用前.不调用函数,函数不会自动执行
2:函数的调用次数不受限制,可以调用任意次
3:函数名需要遵守命名规范:
字母,数字,下划线组成.不能以数字开头,严格区分大小写,不能使用关键字

2.初识参数

在定义函数时,可以在小括号内定义形参,在调用带有形参的函数时,需要传递实参.示例如下

def love (x,y): #在小阔号内的叫形参,即所谓的形式参数,没有明确的值
print(f”我喜欢{x}和{y}”)
love(‘猴子’,’妹子’) #在调用函数时可以传递实参,例如此处的猴子,妹子就是实际传递的参数

注意:实参的数量和顺序需要对应才可以正确调用

二.参数类型

1.参数类型->普通参数、默认参数

普通参数就是位置参数,也叫顺序参数,也是必须传递的参数.示例如下

def func(x,y,i=2): #此时的i就是默认参数,需要在定义形参时指定默认值,默认参数必须在普通参数的后面
_print(x,y,i)
func(1,1)
#此时可以只给两个实参,就是对应的x和y,此时i默认为2
func(1,1,3) #若在调用时给定默认参数的值,则会覆盖掉默认参数的默认值_

2.参数类型->收集参数

定义一个形参,专门收集多余的实参,或者理解为不确定需要传递多少个实参,直接用一个形参来接收
在定义函数时,如果需要形参,那么这个形参前面需要加一个号,例如 args
接受的多余的参数,会存储在args中形成一个元组

def func (a,b,*args):
print(a,b)
print(args)

func(1,2,1,2,3,6,5,8)
#在调用函数func后,args元组中接收1,2,3,6,5,8即多余的实参

3.参数类型->命名关键字参数

def love(a,b,c,*args,name): _#此时的name就是关键字参数
_print(a,b,c)
print(args)
print(name)

love(1,2,3,6,5,5,name=‘gsw’) #关键字参数必须通过形参的名字来进行传递

在调用普通函数时,需要按照顺序进行参数的传递,
但是也可以把普通参数按照关键字参数进行传递,就不必在意顺序的问题了

def love(age,name):
print(name)
print(age)
love(name=‘gsw’,age=21)

4.参数类型->关键字参数收集

收集参数会把多余的参数收集为元组
关键字参数收集会把多余的关键字参数收集为字典

示例如下:
def love(a,b,c=3,args,name,age,kwargs): #此处的kwargs为关键字参数收集
print(a,b,c)
print(args)
print(name,age)
print(kwargs)
love(1,2,3,12,12,name=
‘gsw’,age=21,sex=‘男’*
)

5.形参的摆放位置

形参严格规定的顺序—->普通参数->默认参数->收集参数->(普通参数/默认参数/关键字参数)->关键字收集参数

为什么默认参数必须放在普通参数后面,而在收集参数后面却没有此项规定?

答:
因为若只含有普通函数和默认参数,如: def love(a=2,b),而我调用love(1),此时就会产生歧义,这个实参1不知道给a还是b.
而收集参数后面普通参数和默认参数顺序不在有规定,是因为此时位置已经不在重要,
在赋值时都需要指定其关键字,此时普通参数和默认参数都可以理解为关键字参数

极少数情况出现五种参数同时出现

6.函数的返回值return

如果需要在函数中指定返回内容,可以使用return 关键字
return 可以把返回值返回到函数调用处
return 意味着函数的结束,return之后的代码不在执行
如果函数中没有使用return或者return后面没有任何内容,那么默认返回None.

示例如下:
def eat(a,b):
res = f’{a}爱吃{b}’
return
res _#可以在函数体内使用return返回任意内容

_x=eat(‘狼’,‘羊’)
print(x)

7.变量的作用域

就是当前变量起作用的范围

全局变量:在函数内外都可以起作用的变量
在函数内部使用global直接定义的变量也是全局变量.在函数外定义的变量,在函数内部使用global关键字进行声明,那么就可以更改其值
局部变量:只在函数内部起作用的变量

num = 10
def func():
# num += 20 #在函数内可以获取函数外部的变量但是不可更改
global num #使用global声明了变量,则可以进行修改
num += 20_ print(num)
func()

8.函数封装练习题

封装九九乘法表,实现正反输出

def func(num):
if num == 0:
res = range(0,10)
else:
res = range(9,0,-1)
for i in res:
for j in range(1,i+1):
print(f’{i}x{j}={ij}’,end=*’,’)
print()
func(1) #利用参数控制正反向输出

封装打印矩形的函数

def juxing():
for x in range(1,101):
print(‘x’, end=‘ ‘)
if x % 10 == 0:
print()

juxing()

二.递归函数

1.初识递归函数

就是定义了一个函数,然后在函数内调用自己
#递归函数内必须要有结束,不然就会一直调用下去
#尽量不用,效率并不高

示例如下:

def digui(num):
print(num)
if num > 0:
digui(num-1)
print(num)
digui(5)

2.递归函数练习:实现阶乘

def func(num):
if num == 1:
return 1
else:
return num*func(num-1)
print(func(3))

3.递归函数练习:斐波那契数列

def fb(n):
if n==1 or n==2:
return 1
else:
return fb(n-1)+fb(n-2)
print(fb(7))