DW-零基础python思维04(函数)

1 函数

1.1 函数定义

  • 函数必须先定义再调用
  • 语法:
def 函数名(形参):
	代码1
	代码2
	......
调用函数:
函数名(实参)
  • 注意:
    • 函数以def开头,后接函数名和()
    • 形参:是用来接收用户数据的参数
    • 实参:调用函数时,传入的真实数据的参数

【例子】

def sum(i,j): # 定义函数,同时设置两个形参,i和j用来接收用户数据
    a=i+j # 将i+j赋值给一个变量
    print(a) # 打印这个变量
sum(2,5) # 调用函数时,传入真实数据2和5,真实数据是实参
# 7

1.2 函数说明文档

  • 语法:
【定义函数的说明文档】
def 函数名(形参):
	"""说明文档位置"""
	代码
	......
【查看函数的说明文档】
help(函数名)
  • 注意:
    • 说明文档的位置一定要写在def下面缩进的第一行。
    • 说明文档可以换行。

【例子】

def sum(i,j):
    """这是一个
    说明文档"""
    a=i+j
    print(a)
    
help(sum)
'''
sum(i, j)
    这是一个
    说明文档
'''

1.3 参数

1.3.1 位置参数

  • 定义:在定义函数时,参数的名字和位置已被确定。

【例子】

def infor(name,age,gender):
    print(f'你的姓名是{name},年龄是{age},性别是{gender}')
infor('YHY',20,'man')
# 你的姓名是YHY,年龄是20,性别是man

1.3.2 关键字参数

  • 定义:传入实参时,明确形参的变量名,参数之间不存在先后顺序。
  • 注意:
    • 函数调用时,通过“键=值”的形式指定,清楚了参数的顺序问题
    • 调用函数时,如果有位置参数,位置参数必须在关键字参数之前,否则报错。

【例子】

def infor(name,age,gender):
    print(f'你的姓名是{name},年龄是{age},性别是{gender}')
infor('YHY',gender='man',age=20)
# 你的姓名是YHY,年龄是20,性别是man

1.3.3 默认参数(缺省参数)

  • 定义:参数指定默认值,调用时不传实参,就用默认值。
  • 注意:调用函数时,位置参数必须在关键字参数之前,否则报错。

【例子】

def infor(name,age,gender='man'):
    print(f'你的姓名是{name},年龄是{age},性别是{gender}')
infor('YHY',age=20) # 你的姓名是YHY,年龄是20,性别是man
infor('DW',age=18,gender='girl') # 你的姓名是DW,年龄是18,性别是girl

1.3.4 可变参数(收集参数)

  • 1.位置可变参数:(接收所有的位置参数,返回一个元组)
    • 语法:
    def 函数名(*args):
    	print(args)
    
    【例子】
    def name(*args):
    print(args)
    name(20,3,'asd') # (20, 3, 'asd')
    
  • 2.关键字可变参数:(接受所有关键字,返回一个字典)
    • 语法:
    def 函数名(**kwargs):
    	print(kwargs)
    
    【例子】
    def name(**kwargs):
    print(kwargs)
    name(name='DW',age=3,gender='man')
    # {'name': 'DW', 'age': 3, 'gender': 'man'}
    

1.4 局部/全局变量

1.4.1 局部变量

  • 定义:定义在函数内部的变量,即只在函数内部生效

【例子】

def name():
    a=100 # 定义局部变量
    print(a) # 函数内部访问,可以访问到a这个变量
name() # 调用函数
print(a) # 报错!!a是内部变量,无法外部访问

1.4.2 全局变量

  • 定义:定义在函数外部的变量,即对函数内部和外部都有效

【例子】

a=100 # 定义全局
def name():
    print(a) # 函数内部访问,可以访问到a这个变量
name() # 调用函数
print(a) # 100

1.4.3 全局变量声明

  • 作用:在函数内部修改全局变量(global)
  • 注意:不要轻易修改全局变量,除非万不得已!!

【例子】

a=100 # 定义全局
def name():
    global a # 声明a为全局变量
    a=520 # 对变量a重新赋值
    print(a) 
name() # 520

1.4.4 多函数共用全局变量

  • 流程:
    1.声明全局变量
    2.定义两个函数
    3.函数1修改全局变量,函数2访问全局变量
    4 先定义函数1,再调用函数2时就可以使用修改后的全局变量了

【例子】

a=100 # 定义全局
def name(): # 函数1
    global a # 声明a为全局变量
    a=520 # 对变量a重新赋值
def p(): # 函数2
    print(a)

name() 调用函数1
p()  # 520

1.4.5 nonlocal声明

  • 作用:如果要修改闭包作用域中的变量,需要使用nonlocal关键字。它的作用是把变量标记为自由变量,即使在函数中为变量赋予新值了,也会变成自由变量。
  • 注意:nonlocal声明的变量不是局部变量,也不是全局变量,而是外部嵌套函数内的变量。

【例子】

def name1():
    a=0
    def name2():
        nonlocal a # nonlocal关键字声明
        a+=1 # 对闭包作用域内的变量a进行了更改,所以需要nonlocal声明
        return a
    return name2()
print(name1()) # 1
print(a) # NameError: name 'a' is not defined

注意:
对于函数内的变量而言,如果没有对变量进行修改,之前已经定义好的就可以直接使用。如果对变量进行修改了,看变量是全局变量还是在函数内部定义的变量。

1.5 函数的返回值

1.5.1 返回值的定义

  • 语法:函数返回值:return
  • 注意:
    • 如果有多个return语句,只执行第一个
    • 遇到return语句,就退出当前函数
    • 多个返回值,可以写成return a,b,返回的是一个元组(a,b)

【例子】

def sum(a,b): # 调用函数,设两个形参,a和b
    return a+b # return返回a+b的值,退出当前函数
    print('打印不到')
c=sum(1,2)  # 用变量名保存函数的返回值
print(c) # 3 

1.5.2 多函数返回值做参数

  • 多函数返回值做参数传递:
    1.定义函数1,return返回一个值
    2.定义带形参的函数2,打印形参
    3.将调用函数1的返回值,赋值给一个变量
    4 调用函数2,用刚才的变量做参数

【例子】

def name1(): # 定义函数1,return返回一个值
    return 100
def name2(a): # 定义带形参的函数2,打印形参
    print(a)
b=name1() # 将调用函数1的返回值,赋值给一个变量
name2(b) # 调用函数2,用刚才的变量做参数

1.5.3 元组拆包

def num():
    return 520,1314
a,b=num()
print(a) # 520
print(b) # 1314

1.5.4 字典拆包

a={'name':'haha','age':20}
def num():
    return a
b,c=num()
print(b) # name
print(c) # age
print(a[b]) # haha
print(a[c]) # 20

1.6 函数递归

1.6.1 闭包

  • 定义:在一个内部函数里对外层的非全局作用域的变量进行引用,这个内部函数就被认为是闭包。
  • 闭包作用域:通过闭包可以访问外层非全局变量作用域的变量,这个作用域称为闭包作用域。

1.6.2 递归

  • 定义:函数内部调用自己,必须留有出口

【例子】

def sum(a):
    if a==1: # 如果是1,直接返回1----设置出口
        return 1
    b=a+sum(a-1) # 如果不是1,重复执行累加
    return b # 返回累加的结果
c=sum(100)
print(c) # 5050 

【图示】
在这里插入图片描述


版权声明:本文为OohMuYi原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。