函数基础知识

1.函数的创建

def 函数名(形式参数列表):
    语句块
    return [表达式]

1. 函数的命名 

与变量命名差不多,数字,下划线,数字不能作为开头,尽量别使用关键字命名

2.形式参数(形参)

1.形式参数列表可以为空

2.默认参数

缺省参数即默认实参,必须自右向左依次存在(即,如果一个参数有缺省参数,则其右侧的所有参数都必须有缺省参数)

def 函数名(形参名1=默认实参1, 形参名2=默认实参2, ... ):
     语句块

3.位置形参

def 函数名(形参名1, 形参名2, ...):
    pass

4.星号元组形参

收集多余的位置实参,将位置实参合并为一个元组,元组一般命名为args

def 函数名(*元组形参名):
    pass

5. 双星号字典形参

收集所有的传入数据打包为字典的格式,通用写法 kwargs

def 函数名(**字典形参名):
    pass

6. 命名关键字形参

强制,所有的参数都必须用关键字传参

def 函数名(*, 命名关键字形参1, 命名关键字形参2, ...):
    pass
# 或者
def 函数名(*args, 命名关键字形参1, 命名关键字形参2, ...):
    pass

7.函数的形参定义方法说明

  • 位置形参,星号元组形参,命名关键字参数,双星号字典形参,缺省参数可以混合使用。

  • 函数的形参定义自左至右的顺序为:位置形参,星号元组形参,命名关键字参数,双星号字典形参

示例:

def fn(a, b, *args, c, d, **kwargs):
    print(a)
    print(b)
    print(*args)
    print(c)
    print(d)
    print(kwargs)

fn(100, 200, 300, 400, c='C',name='tarena',d='D')

3.调用函数 (传参)

1.位置参数

实际参数传递时,实参和形参按位置来依次对应

2.关键字参数

实际参数传递时,实参和形参 按名称依次对应

示例:

def myfun1(a, b, c):
    print('a=', a)
    print('b=', b)
    print('c=', c)

## 位置传参
myfun1(1, 2, 3)
## 关键字传参
myfun1(c=33, a=11, b=22)
## 位置传参要先于关键字传参

3.序列实参  

使用星号将序列拆分后,与形参进行对应

list01 = [7,8,9]
myfun01(*list01)

4.字典实参 

使用双星号将字典拆分后,依次与形参对应(字典类的键名要和形参名对应)

dict01 = {"c":3,"b":2,"a":1}
myfun01(**dict01)

5.可变和不可变说明

  • 不可变类型:变量赋值 a=5 后再赋值 a=10,这里实际是新生成一个 int 值对象 10,再让 a 指向它,而 5 被丢弃,不是改变 a 的值,相当于新生成了 a。

  • 可变类型:变量赋值 la=[1,2,3,4] 后再赋值 la[2]=5 则是将 list la 的第三个元素值更改,本身la没有动,只是其内部的一部分值被修改了。

python 函数的参数传递:

  • 不可变类型:值传递: 如整数、字符串、元组。如 fun(a),传递的只是 a 的值,没有影响 a 对象本身。如果在 fun(a) 内部修改 a 的值,则是新生成一个 a 的对象。

  • 可变类型:引用传递: 如 列表,字典。如 fun(la),则是将 la 真正的传过去,修改后 fun 外部的 la 也会受影响

(1) 不可变类型参数有:

  • 数值型(整数,浮点数)

  • 布尔值bool

  • None 空值

  • 字符串str

  • 元组tuple

(2) 可变类型参数有:

  • 列表 list

  • 字典 dict

  • 集合 set

(3)传参说明:

  • 不可变类型的数据传参时,函数内部不会改变原数据的值。

  • 可变类型的数据传参时,函数内部可以改变原数据。

4.返回值 

用于函数的内部,结束当前函数的执行,返回到调用此函数的地方,同时返回一个对象的引用关系 可以有多个返回值 

  1. return 语句后面的表达式可以省略,省略后相当于 return None

  2. 如果函数内部没有 return 语句, 则函数执行完毕后返回None, 相当于在最后一条语句后有一条return None

return [表达式]

 5.匿名函数

在Python中,匿名函数通常使用lambda关键字来创建。匿名函数也被称为lambda函数,它是一种简单的、一行的函数,常用于临时需要一个小函数的地方。

lambda  [函数的参数列表]: 表达式

 

  • 作用

    • 创建一个匿名函数对象

    • lambda是关键字,表示你正在定义一个匿名函数。

    • 同 def 类似,但不提供函数名

    • [函数的参数列表]是函数的参数,可以有零个或多个参数,参数之间用逗号分隔。

    • : 表达式是函数的返回值,通常是一个表达式,匿名函数会计算这个表达式并返回结果。

  • 说明

    lambda 表达式 的创建函数只能包含一个表达式

  • 示例:

myadd2 = lambda x, y: x + y
print('3 + 4 =', myadd2(3, 4))  # 7

2.变量作用域

一个变量声明以后,在哪里能够被访问使用,就是这个变量"起作用"的区域:也就是这个变量的作用域

一般来说,变量的作用域,是在函数内部和外部的区域 来体现,因此常常与函数有关

1.局部变量 

  • 定义在函数内部的变量称为局部变量(函数的形参也是局部变量)

  • 函数内部的变量只能在函数内部或者函数内部的函数内部访问 ,函数外部不能访问

  • 局部变量在函数调用时才能够被创建,在函数调用之后会自动销毁

def fn(a, b):
     c = 100
     print(a, b, c)    # a, b, c三个都是局部变量
fn(1, 2)
print(a, b, c)   # 报错, 因为a,b,c 在调用后就销毁了

2.全局变量 

  • 定义在函数外部,模块内部的变量称为全局变量

  • 全局变量, 所有的函数都可以直接访问(取值,但函数内部不能直接将其赋值改变)

a = 100  # 全局变量
def fx(b):
    a = 666  # 创建局部变量,不是改变全局变量
    c = 300
    print(a, b, c)  # 优先访问局部变量
    
fx(200)  # 666 200 300
print(a)  # 100

 3.局部作用域修改全局变量

 告诉python 的解释执行器, global 语句声明的一个或多个变量, 这些变量是全局变量

global说明:

  • 全局变量如果要在函数内部被赋值,则必须经过全局声明 global

  • 默认全局变量在函数内部可以使用,但只能取值,不能赋值

  • 不能先声明为局部变量,再用 global 声明为全局变量,此做法不符合语法规则

global 变量名1, 变量名2, ....

 4.局部作用域修改外部变量

在函数内部 提前用nonlocal声明 函数内部的某个变量为外部的变量

前提:必须是函数嵌套

局部作用域中若要修改外部函数嵌套作用域中的变量需要使用:nonlocal 语句

nonlocal 变量名1,变量名2,...

5.LEGB顺序

Local (L):

  • 本地作用域,指当前函数内部的变量。

  • 当你在函数内部定义变量并尝试访问它时,Python 首先会在函数内部查找这个变量

Enclosing (E):

  • 闭包函数外的函数作用域,指嵌套函数的外部函数中定义的变量。

  • 如果在当前函数内部找不到变量,Python 会查找外层(闭包)函数中的变量。

 Global (G):

  • 全局作用域,指模块级别定义的变量。

  • 如果在本地和闭包函数中找不到变量,Python 会查找全局作用域的变量。

Built-in (B):

  • 内建作用域,指 Python 预定义的变量、函数等,如 lensum 等。

  • 如果在以上三个作用域中都找不到变量,Python 会查找内建作用域。

3.函数的内存分配

1、将函数的代码存储到代码区,函数体中的代码不执行。

2、调用函数时,在内存中开辟空间(栈帧),存储函数内部定义的变量。

3、函数调用后,栈帧立即被释放。

4.函数自调用

函数直接或间接的调用自身

说明:

  • 递归一定要控制递归的层数,当符合某一条件时要终止递归调用

  • 几乎所有的递归都能用while循环来代替

递归的实现方法:

  • 先假设此函数已经实现

递归优缺点:

  • 优点:

    • 递归可以把问题简单化,让思路更为清晰,代码更简洁

  • 缺点:

    • 递归因系统环境影响大,当递归深度太大时,可能会得到不可预知的结果

代码实现:

def factorial(n):
    result = 1
    i = 1
    while i <= n:
        result *= i
        i+=1
    return result

print("factorial: ", factorial(5))

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值