当前位置: 代码迷 >> 综合 >> python语法基础 - day9~10 函数
  详细解决方案

python语法基础 - day9~10 函数

热度:43   发布时间:2024-02-27 18:06:16.0

python语法基础 - day9~10 函数

在这里插入图片描述

1、函数定义和调用

1)定义

函数是实现一个特定功能的代码的封装

2)语法

def 函数名(形参):
说明文档
代码块

3)调用

函数名(实参)
调用时:实参的个数要和形参一致(有默认值的情况除外)

# 练习1:定义一个函数,求n的阶乘(factorial = n! = n*(n-1)*(n-2)...*1# 函数的定义
def factorial(n):"""求n的阶乘:param n: 提供一个指定的数值n:return: None"""f = 1for x in range(1, n+1):f *= xprint(f)# 调用函数
factorial(10)  # 3628800

2、函数的参数

函数参数是将外部数据(实参)传入函数内部的接口或通道

1)位置参数和关键字参数

a.位置参数

调用时,形如函数名(实参1, 实参2, 实参3, ...),这里的参数就是位置参数,位置参数实参与形参一一对应,位置不能随意更换

def func1(a, b, c):print(f'a:{a}, b:{b}, c:{c}')
func1(10, 20, 30)  # a:10, b:20, c:30
b.关键字参数

调用时,形如函数名(形参1=实参1, 形参2=实参2, 形参2=实参3, ...),这里的参数就是关键字参数,参数的位置可以随意更换

def func1(a, b, c):print(f'a:{a}, b:{b}, c:{c}')
func1(c=10, a=20, b=30)  # a:20, b:30, c:10

注意:

位置参数和关键字参数同时存在时,位置参数在前,关键字参数在后。只要保证位置参数在前,后面的关键字参数之间可以更换位置

def func1(a, b, c):print(f'a:{a}, b:{b}, c:{c}')
func1(10, c=20, b=30)  # a:10, b:30, c:20

2)参数的默认值

参数默认值是在定义函数时给形参赋值,在调用函数时,有默认值的参数可以不用传值,有默认值的参数要在没有默认值参数的后面

def func1(a, b, c=100):print(f'a:{a}, b:{b}, c:{c}')
func1(10, 20)  # a:10, b:30, c:20

3)定长和不定长参数

a.定长参数

参数的个数是确定的

def func1(*args):print(f'args的值:{args}, 类型:{type(args)}')
func1(10, 20, 30)  # args的值:(10, 20, 30), 类型:<class 'tuple'>
b.不定长参数 - 带*、带**

* - 在形参前面加*,让形参变成不定长参数,可以同时接受多个实参,这个参数的本质是一个元组,传递的每个实参都变成这个元组的元素 (必须使用位置参数)

def func1(*kwargs):print(f'args的值:{args}, 类型:{type(args)}')
func1(10, 20, 30)  # args的值:(10, 20, 30), 类型:<class 'tuple'>

** - 在形参前面加**,让形参变成不定长参数,可以同时接受多个实参,这个参数本质是一个字典**(只能使用关键字参数)**

def func1(**kwargs):print(f'kwargs的值:{kwargs}, 类型:{type(kwargs)}')
func1(a=10, b=20, c=30)  # kwargs的值:{'a': 10, 'b': 20, 'c': 30}, 类型:<class 'dict'>

3、函数的返回值

1)什么是返回值

从函数内部传递到函数外部的数据

2)如何确定函数返回值

每个函数都有返回值,返回值是什么就看return后面跟的是什么(没有return返回值就是默认值None)

return的作用:遇到return会确定返回数据并结束函数

3)怎么在函数外部获取返回值

函数调用表达式的值就是函数的返回值,所以获取函数调用表达式的值就是在获取函数的返回值

def func2(a, b):return a*bresult1 = func2(33, 79)
print(f'result1:{result1}')  # result1:2607

注意:

函数只有一个返回值,形如return a, b, c 这种,返回值也只有一个,只不过这个返回值是一个容器/序列

def f(a, b):return a+b, a-b, a*b, a/bprint(f(33, 12))  # (45, 21, 396, 2.75)

4、全局变量和局部变量

1)全局变量

什么是全局变量:定义在函数和类外部的变量,

作用域:从定义开始到文件结束

2)局部变量

什么是局部变量:定义在函数内部的变量(形参也是局部变量)

作用域:从函数定义到函数结束

a = 'qja'   # 全局变量a
b = 'qjb'   # 全局变量b
def func3(b):   # 局部变量ba = 'jba'   # 局部变量aprint(f'函数内部:a:{a}, b:{b}')   # 函数内部:a:jba, b:200func3(200)
# 局部变量不会改变全局变量的值,即没有重新赋值
print(f'函数外部:a:{a}, b:{b}')   # 函数外部:a:qja, b:qjb

3)global和nonlocal

global- 在函数内部定义全局变量,只能在函数内部使用,使用global定义的全局变量只能在global后面使用 - 可以对全局变量重新赋值

语法:

global 变量名

变量名 = 数据

a = 100
b = 100
def func4(c):global aa = 200return a+c, b+cprint('函数返回值:', func4(234))  # 函数返回值: (434, 334)
print('函数外部:', a, b)  # 函数外部: 200 100

nonlocal - 在局部的局部中去修改局部变量的值,使用nonlocal修改局部变量后该变量只能在nonlocal后面使用 - 可以对局部变量重新赋值

语法:

nonlocal 变量名

变量名 = 数据

def f1():a = 100def f2():nonlocal aa = 200print(f'函数里面的函数里面:{a}')f2()print(f'函数里面:{a}')f1()
# 函数里面的函数里面:200
# 函数里面:200

5、匿名函数

什么是匿名函数 - 实质上也是一个函数,只是在定义的时候不需要函数名(实参高阶函数中用的多些)

语法:lambda 形参列表: 返回值

使用条件:函数的功能可以用一句代码写完

**注意:**你们函数形参列表中不能使用:,因为:在匿名函数中本身就有特殊功能

a = lambda x, y: x+y
print(a(30, 55))  # 85# 定义一个函数,求两个数中较大的数
max_num = lambda a, b=100: a if a > b else b# 有默认值的参数可以不用赋值
print(f'较大值是:{max_num(58)}')  # 较大值是:100
# 赋值后参数默认值改变
print(f'较大值是:{max_num(58, 29)}')  # 较大值是:58

6、实参高阶函数

定义一个函数其实就是定义一个function类型的变量,函数名就是变量名

什么是实参高阶函数