函数
【一】函数的定义
| def 函数名(参数1,参数2,...): |
| 函数体 |
| return 返回值 |
| 函数名() |
(1)空函数
- 函数体为pass代表什么都不做,称之为空函数
- 定义空函数通常是有用的,因为在程序设计的开始,往往是先想好程序都需要完成什么功能,然后把所有功能都列举出来用pass充当函数体'占位符'
(2)函数定义
[1]无参无返回值的函数
| def login(): |
| username = input('用户名:>>>').strip() |
| password = input('密码:>>>').strip() |
| if username == 'heart' and password == '123': |
| print(f'{username} 登陆成功!') |
| login() |
[2]有参无返回值的函数
| def login(username, password): |
| if username == 'heart' and password == '123': |
| print(f'{username} 登陆成功!') |
| login('heart', '123') |
[3]多个参数一个返回值
| def add(x, y): |
| result = x + y |
| return result |
| |
| result = add(1, 1) |
| print(result) |
| def index(x, y): |
| return x + y, x * y |
| |
| res_one, res_two = index(2, 4) |
| print(res_one) |
| print(res_two) |
(3)函数的调用方式
| def add(x,y): |
| return x+y,x*y |
[1]直接调用
| def add(x,y): |
| return x+y |
| res = add(4,7) |
| print(res) |
[2]表达式调用
| def add(x, y): |
| print(x + y) |
| return x + y |
| |
| res = add |
| res(1, 9) |
[3]作为参数
| def multy(j, k): |
| return j * k |
| |
| def add(x, y): |
| return x + y |
| |
| print(multy(add(1, 9), 8)) |
| def add(): |
| x=1 |
| y=9 |
| return x + y |
| |
| def multy(func, k): |
| return func() * k |
| |
| print(multy(add,6)) |
[4]间接调用
| def add(x,y): |
| return x+y,x*y |
| res = add(4,7) |
| print(res) |
(4)函数的参数类型
[1]形参和实参的介绍
- 函数的参数分为形参和实参
- 在定义函数时,定义在函数名后面的(变量名)
- 实参即在调用函数时,括号内传入的值
- 如果我们想让其他人就传指定的类型的话,可以做一个弱声明
| def add(x:int,y): |
| print(x) |
| print(y) |
| add('a',9) |
[2]位置参数
| def add(name,age): |
| print(f'my name is {name},my age is {age}') |
| |
| add('heart',18) |
| def add(name, age): |
| print(f'my name is {name},my age is {age}') |
| |
| add(age=18, name='heart') |
| def add(name, age, sex): |
| print(f'my name is {name},my age is {age},my sex is {sex}') |
| |
| add('heart', age=18, sex='男') |
[3]默认参数
| def func(name, age, sex='男'): |
| print(f'my name is {name},my age is {age},my sex is {sex}') |
| |
| func('heart', 18) |
| func('god', 18, '女') |
[4]可变长参数
| def add(*args, **kwargs): |
| print(args) |
| print(kwargs) |
| |
| add(1, 2, 3, 4, 5, name='heart', age='18') |
| def index(*args): |
| print(args) |
| num_list = [1,2,3,4,5,6] |
| print(*num_list) |
| index(*num_list) |
- 可变长关键字参数:**kwargs key:word
| def index(**kwargs): |
| user_dict = {'name': 'heart'} |
| if kwargs: |
| user_dict.update(kwargs) |
| return user_dict |
| |
| res = index(age=18) |
| print(res) |
| def index(**kwargs): |
| user_dict={'name':'heart'} |
| if kwargs: |
| user_dict.update(kwargs) |
| return user_dict |
| |
| user_data={'age':18,'gender':'男'} |
| res=index(**user_data) |
| print(res) |
[5]命名关键字参数
- 在定义形参时,用
*
作为一个分隔符号,*
号之后的形参成为命名关键字参数
- 对于这类参数,在函数调用时,必须按照key=value的形式为其传值,且必须被传值
| def add(name,age,*,sex,height): |
| print() |
- 默认参数 --- 如果是命名关键字参数,我的默认参数就可以不区分位置
| def add(name,age,*,sex='男',height) |
| print() |
(5)名称空间
- 定义变量名和变量值,变量名其实就是指向变量值的引用
[1]内建名称空间
[2]全局名称空间
- 全局名称空间 (内建 + 我们自己定义的)
- 我们自己的在文件中定义的变量名`/函数名/类名...
| name='heart' |
| import random |
[3]局部名称空间
| |
| print(max([1,2,3])) |
| |
| |
| num =1 |
| |
| |
| def add(): |
| print(num) |
[4]名称空间的加载顺序是
- 内建名称空间 ->全局名称空间 ->局部名称空间
- 而查找一个变量名,查找顺序为:
- 局部名称空间->全局名称空间->内置名称空间。
(6)作用域
[1]内置 --- 内建
[2]全局作用域
| a = 2 |
| |
| def index(): |
| print('这是func1打印的', a) |
| |
| index() |
[3]局部作用域
| num =2 |
| print(num) |
| def outer(): |
| |
| global num |
| print(num) |
| num += 1 |
| print(num) |
| outer() |
| print(num) |
[4]嵌套作用域
| def outer(): |
| |
| num_inner =99 |
| def inner(): |
| |
| nonlocal num_inner |
| num_inner +=99 |
| inner() |
| print(num_inner) |
| outer() |
(7)global和nonlocal
(1)global
- 如果想要修改全局的不可变数据类型就需要global关键字将内部需要修改的变量名提高成全局的才能生效
| is_admin=False |
| def login(): |
| global is_admin |
| is_admin=True |
| print(is_admin) |
| |
| login() |
| print(is_admin) |
(2)nonlocal
- 修改外层函数变量
- 在函数中嵌套函数时,嵌套在里面的函数创建的作用域内一般也是不允许改变外层函数变量
| def fun1(): |
| a = 1 |
| |
| def fun2(): |
| nonlocal a |
| a += 1 |
| print(a) |
| |
| return fun2 |
| |
| fun2 = fun1() |
| fun2() |
| |
(8)闭包函数
-
基于函数对象的概念,可以将函数返回到任意为止去调用
-
闭包函数就是内嵌函数包含对外部函数作用域(而非全局作用域)中变量的引用
-
无论是在何处调用闭包函数,使用的仍然是包裹在其外层的变量
| x = 1 |
| |
| def outer(): |
| x = 2 |
| |
| def inner(): |
| print(x) |
| |
| return inner |
| |
| func = outer() |
| func() |
(9)函数对象
- 函数对象指的是函数可以被当做
数据
来处理,,具体可以分为四个方面的使用
[1]函数可以被引用
| def add(x, y): |
| return x + y |
| |
| |
| func = add |
| res = func(1, 2) |
| print(res) |
[2]函数可以作为容器类型的元素
| def add(x, y): |
| return x + y |
| |
| |
| dic = {'add': add, 'max': max} |
| res = dic['add'](1, 2) |
| print(res) |
[3]函数可以作为参数传入另外一个参数
| def add(x, y): |
| return x + y |
| |
| |
| def foo(x, y, func): |
| return func(x, y) |
| |
| |
| res = foo(1, 2, add) |
| print(res) |
[4]函数的返回值可以是一个函数
| def add(x, y): |
| return x + y |
| |
| |
| def bar(): |
| return add |
| |
| |
| func = bar() |
| res = func(1, 2) |
| print(res) |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步