【Python】函数十大注意事项

目录

1. 函数内部定义的变量是局部变量。

2. 一个文件内出现多个同名函数,则以就近原则进行调用。

3. 函数可以有多个返回值,返回数据类型不受限制。

4. 函数支持位置参数和关键字参数。

5. 函数支持默认参数/缺省参数。

6. 函数支持可变参数/不定长参数。

7. 函数的可变参数/不定长参数,还支持多个关键字参数。

8. 一个文件中可以调用另一个文件中的函数。

9. lambda表达式用于创建匿名函数。

10. 函数传参类似传地址。


函数分为:

1. 函数内部定义的变量是局部变量。

  • 全局变量:在整个程序范围内都可以访问,定义在函数外,拥有全局作用域的变量。
  • 局部变量:只能在其被声明的函数范围内访问,定义在函数内部,拥有局部作用域的变量。
a = 10  # 全局变量


def func():
    a = 20  # 局部变量
    b = 50  # 局部变量
    print(a)  # 20 局部优先原则


func()
print(b)  # err 局部变量在函数外不生效

在函数内部使用global关键字,可以标明指定使用全局变量。

a = 10  # 全局变量


def func():
    # global a = 20  # err
    global a
    a = 20
    print(a)


func()  # 20

2. 一个文件内出现多个同名函数,则以就近原则进行调用。

def func():
    print("hello")


def func():
    print("world")
    

func()  # world

3. 函数可以有多个返回值,返回数据类型不受限制。

如果没有return语句或省略返回值,默认返回None,None是内置常量,通常用来代表空置的对象。

def f1():
    return 1, 3.0, "haha"


def f2():
    return


ret11, ret12, ret13 = f1()
print(ret11)  # 1
print(ret12)  # 3.0
print(ret13)  # haha

ret2 = f2()
print(ret2)  # None

4. 函数支持位置参数和关键字参数。

位置参数:根据函数定义的参数位置来传参。

关键字参数:

  • 函数调用时,可以通过"形参名=实参值"形式传递参数。
  • 这样可以不受参数传递顺序的限制。
def person(name, age, gender):
    print(f"{name}-{age}-{gender}")


# 位置参数
person("张三", 20, "男")  # 张三-20-男

# 关键字参数
person("张三", gender="男", age=20)  # 张三-20-男

5. 函数支持默认参数/缺省参数。

  • 定义函数时,可以给参数提供默认值,调用函数时,指定了实参,则以指定为准,没有指定,则以默认值为准。
  • 默认参数,需要放在参数列表后。
def person(name, age, gender="女"):
    print(f"{name}-{age}-{gender}")


person("李四", 25)  # 李四-25-女

6. 函数支持可变参数/不定长参数。

  • 应用场景:当调用函数时,不确定传入多少个实参的情况。
  • 传入的多个实参,会被组成一个元组。
def sum(*args):
    total = 0
    # 对args元组进行遍历
    for elem in args:
        total += elem
    return total


print(sum(1))        # 1
print(sum(4, 5, 8))  # 17

7. 函数的可变参数/不定长参数,还支持多个关键字参数。

  • 应用场景:当调用函数时,不确定传入多少个实参的情况。
  • 传入的多个关键字参数,会被组成一个字典。
def person_info(**args):
    # 对args字典进行遍历
    for arg_name in args:
        print(f"参数名->{arg_name} 参数值->{args[arg_name]}")


person_info(name="张三", gender="男")
person_info(name="李四", age=25, gender="女", height=175)

8. 一个文件中可以调用另一个文件中的函数。

# 假设在calculate.py文件中定义了add函数
# 在当前文件中调用add函数方法如下:
import calculate
calculate.add(1, 2)

9. lambda表达式用于创建匿名函数。

表达式lambda parameters: expression会产生一个函数对象 。 该未命名对象的行为类似于用以下方式定义的函数:

def <lambda>(parameters):
    return expression

10. 函数传参类似传地址。

  • 不可变数据类型:改变该类型的变量的值,重新开辟内存空间。包括:int, float, bool, string, tuple
  • 可变数据类型:改变该类型的变量的值,内存地址不变。包括:list, set, dict
# 不可变数据类型
a = 10
print(f"{a}-{id(a)}")  # 10-140712432835288
a = 15
print(f"{a}-{id(a)}")  # 15-140712432835448

# 可变数据类型
nums = [1, 2, 3]
print(f"{nums}-{id(a)}")  # [1, 2, 3]-140712432835448
nums[0] = "one"
print(f"{nums}-{id(a)}")  # ['one', 2, 3]-140712432835448

不可变数据类型变量传参:

def f1(x):
    print(f"x改变前, x={x} x的地址={id(x)}")
    x = 90
    print(f"x改变后, x={x} x的地址={id(x)}")


a = 10
print(f"调用f1前,a={a} a的地址={id(a)}")
f1(a)
print(f"调用f1后,a={a} a的地址={id(a)}")

x的值改变之前,和a的内存地址相同。由于x是int类型,是不可变数据类型,x的值改变后,内存地址发生变化。由于140712432835288这个地址对应的值不变,调用f1后,a的值还是10。

可变数据类型变量传参:

def f2(lst):
    print(f"lst改变前,lst={lst} lst的地址={id(lst)}")
    lst[1] = 2
    print(f"lst改变后,lst={lst} lst的地址={id(lst)}")


nums = ["一", "二", "三"]
print(f"调用f1前,nums={nums} nums的地址={id(nums)}")
f2(nums)
print(f"调用f1后,nums={nums} nums的地址={id(nums)}")

lst的值改变之前,和nums的内存地址相同。由于lst是list类型,是可变数据类型,lst的值改变后,内存地址不变。由于2778033017216这个地址对应的值改变,调用f1后,nums的值就是改变后的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值