Python学习笔记-函数基础

函数Function

1. 使用场景

一般的:用来 减少代码的冗余,将重复的代码定义在函数中以达到 复用 的目的

装饰器:在 不修改原函数的及其调用方式的情况下对原函数进行 功能扩展

2. 格式

2.1 定义
2.1.1 一般的
def 函数名([形参列表]):
    函数体
    pass
2.1.2 有默认值的

定义默认值参数时,其位置之后不能有无默认值的参数

def 函数名([形参1,形参2 = 默认值]):
    函数体
    pass
2.1.3 有可变参数的

*args:将传入的不定长 位置参数 装包为 元组 传入函数

**kwargs:将传入的不定长 关键字参数 装包为 字典 传入函数

def 函数名([*args,**kwargs]):
    函数体
    pass
2.1.4 有函数嵌套的
def 外层函数名([形参列表]):
    函数体
    def 内层函数名([形参列表]):
    	函数体
    	pass
    函数体
    pass
2.2 调用
2.2.1一般的
函数名([实参列表])
2.2.2 有默认值的

设置过默认值的参数可以不传,调用时使用给定的默认值。如果给出了参数值,则使用给定的参数值

函数名([实参列表,[默认值]])
2.2.3 有可变参数的

*args 会将所有传入的位置参数一并装包吃下,使用时需要放在固定参数之后

**kwargs 会将所有传入的关键字参数一并装包吃下,使用时需要放在固定参数之后

def func1(a,b,*args,**kwargs):
    print(a)
    print(b)
    print(args)
    print(kwargs)
    pass
func1(1,2,3,4,a=5,b=6,c=7,d=8) # 错误!会造成a和b的多重赋值
func1(a=5,b=6,1,2,3,4,c=7,d=8) # 错误!位置参数不能跟在关键字参数后
func1(1,2,3,4,5,6,c=7,d=8) # 正确!
==================================
1
2
(3, 4, 5, 6)
{'c': 7, 'd': 8}
2.2.4 有函数嵌套的

因为嵌套在函数中的函数在外部不能够被直接调用,因此我们可以通过返回值的形式将该函数的地址返回,这样在外部就可以被调用了。

def func1():
    def inner_func():     # 定义的内部函数
        print('Hello!')
        pass
    return inner_func     # 外层函数的返回值是内层函数
func2 = func1()           # 接收返回的内层函数地址(相当于给内层函数改名)
inner_func()              # 直接调用是无法找到的
func2()                   # 使用刚才用来接收内层函数地址的变量来调用内层函数
===========================
Hello!
2.2.5 函数间调用

函数间调用跟之前的四类调用一致,按照定义的格式调用即可。

3. 参数

3.0 变量的作用域
  • local 局部的
    • locals() 以字典形式返回当前作用域下所有的局部变量。locals是相对的
  • enclosing 嵌套的
  • global 全局的
    • globals() 以字典形式返回当前.py文件下的所有全局变量。包括系统默认产生的变量和自定义变量
  • builtins 系统内置的

变量搜索顺序:L–>E–>G–>B

如果有内层函数,先找内层函数自身的变量

如果内层函数自身没有变量,则找外层函数的变量

如果外层函数也不存在此变量则找全局

如果全局也没有,则找系统内置

如果系统内置也没有则报错

num1 = 0               # 对于inn_func(),num1是全局变量
def func():
    num2 = 1           # 对于inn_func(),num2是嵌套变量
    def inn_func():
        global num1    # 用global修饰num1,表示此处使用全局num1变量
        nonlocal num2  # 用nonlocal修饰num2,表示此处使用嵌套num2变量
        num1 = 11
        num2 = 12
        num3 = 13      # 对于inn_func(),num3是局部变量
        print(num1,num2,num3)
        pass
    inn_func()
    pass
func()
================================
11 12 13
3.1 形参与实参

形参定义函数 时,要求传入 的参数

实参调用函数 时,实际传入 的参数

def func1(num1,num2):  # num1和num2为形参
    sum = num1 + num2
    return sum          # 向外抛出返回值sum
ans = func1(1, 2)       # 1和2为实参,ans接收func1返回的值
print(ans)
================================
3
3.2 关键字参数与位置参数

关键字参数:在调用的时候,通过关键字的方式,指明值是给哪个参数的。

因为指定了是给具体哪个参数的,因此顺序 可以与函数定义 时的参数 顺序不一致

位置参数:在调用的时候,通过参数位置确定值是给那个参数的。

因为没有指定具体给那个参数,因此顺序 必须要同函数定义 时的参数 顺序一致

3.3 参数类型

可变类型:list tuple set dict,作为实参传给函数时传的是地址

不可变类型:str int float bool,作为实参传给函数时传的是值

函数内使用 外部变量 时,如果变量是 不可变类型,则需要用 修饰词 修饰(如 globalnonlocal)才可更改其值,否则只能以 只读 方式使用,如果变量是 可变类型 则可以 不加修饰

函数也可以作为参数

4.返回值

利用 return 向外抛出一个返回值,并结束方法。

return出的值需要用变量 接收 一下

return也可以 单独使用,不向外抛出返回值,仅用于 结束方法。此时如果使用变量接收返回值,则值为 None

return可以返回多个值(Python独有),多个值被以 元组 形式抛出

5. 闭包

闭包的三个条件

  1. 在一个函数中定义了另一个函数
  2. 内层函数使用了外层函数的变量
  3. 返回值是内层函数名
def func1(num1):       # 这是一个闭包
    def func2():       # 条件1. 在一个函数中定义了另一个函数
        nonlocal num1  # 条件2. 内层函数使用了外层函数的变量
        num1 +=1       
        print(num1)    
        pass           
    return func2       # 条件3. 返回值是内层函数

6. 拆包装包

Python中拆装包主要用在函数传参中。当形参为 *args 时,传入的位置参数将被装包为元组传入函数;当形参为 **kwargs 时,传入的关键字参数将被装包为字典传入函数

6.1 拆包
a = (1,2,3,4)
print(*a)     # 拆包为单个
=========================
1 2 3 4
6.2 装包
a = 1,2,3,4
print(a)     # 装包为元组
=========================
(1,2,3,4)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值