今天和大家系统地聊聊Python函数的核心知识点。这些内容不仅是面试高频考点,更是写出高质量Python代码的基础。从变量作用域、可变数据、模块导入、递归到匿名函数,带你一步步打通任督二脉。
 

一、变量作用域:分清内外,避免踩坑

Python的变量作用域是初学者最容易混淆的概念之一。理解全局变量和局部变量的本质区别,是写出无bug代码的第一步。

1. 全局与局部的本质

• 全局变量:变量在整个代码文件内都可以被使用。

• 局部变量:变量只能在局部范围内被使用。

def fun5(a, b, c=10):
    d = a*a + b*b + c*c
    return d
fun5(1, 2, 3)
print(a)  

a,b,c为局部变量只能在fun5内部使用,因此在执行时会出现报错。

def fun5(a, b, c=10):
    d = a*a + b*b + c*c+e
    return d
e=100
print(fun5(1,2,3))

2. 全局变量存在问题

当在函数中使用全局变量且对全局变量进行赋值时,会重新在函数内部创建一个同名的局部变量,而不是使用全局变量。

def fun7(b):
    print('a+b的值:', a+b)
    print('a+b的值:', a+b)
a=3
fun7(13)
print('a的值:', a)

def fun7(b):
    a=2
    print('a+b的值:', a+b)
a=3
fun7(13)
print('a的值:', a)

3.global声明全局变量

如果需要在函数外部和函数内部都使用一个变量(不会因为在函数内部而被重新赋值)可以在函数中使用global关键字都变量声明。

def fun7(b):
    global a
    print('a的值:', a)
    a = 2
    print('a+b的值:', a + b)
a = 3
fun7(13)
print('a的值:', a)

4.*变量为可变数据

Python中的数据类型可以分为可变和不可变两类,其中可变数据指数据变化后不会改变内存空间。

# 定义不可变类型变量a(整数),赋值为4
a = 4
# 定义可变类型变量b(列表),赋值为[2,3]
b = [2, 3]
# 打印a和b的内存地址(id()函数返回变量的内存编号)
print("第一次地址:", id(a), id(b))

# 给a重新赋值为5(不可变类型,会生成新内存地址)
a = 5
# 给列表b追加元素5(可变类型,内存地址不变)
b.append(5)
# 再次打印a和b的内存地址
print("第二次地址:", id(a), id(b))

5.函数中的可变数据

当可变数据为全局变量时,在函数中对可变数据进行修改会改变全局变量。

def fun10():
    a.reverse()
    print(a)
a = [2, 3, 4]
fun10()
print(a)

def func():
    ls.append(1)
    return ls
ls = []
a = func()
b = func()
print(a, b)

二、模块导入:优雅实现代码复用

1.导入文件模块

用import导入当前文件夹内的文件模块。

2.导入文件中指定函数

当文件存在多个函数,只需要使用其中摸个函数时,可以用from和import组合方式导入文件中的指定函数。

3.导入文件中全部函数

当需要导入文件中全部函数时,可以使用from并结合*。

4. __name__属性

每个Python文件都有一个__name__属性,当文件作为主程序运行时,__name__的值为"__main__";当文件作为模块被导入时,__name__的值为文件名。这个特性可以让我们在模块中编写测试代码:

这是Python开发中的一个最佳实践,它让我们的模块既可以被导入使用,也可以直接运行测试。

三、匿名函数lambda:简洁处理简单逻辑

lambda函数是Python中的匿名函数,适用于创建一些简单函数。

1.将lambda作为函数

函数名 =  lambda 参数: 函数内代码

fun1 = lambda x,y:y+x

等效为以下代码:

def fun1(x,y):
    return y+x

2.将lambda作为函数的参数

以sorted()函数为例,sorted()函数形式如下:

sorted(iterable, key=None, reverse=False)

 • iterable:表示可迭代的数据对象,例如字符串、列表或元组。

• key:表示比较函数,其值可以为lambda语句(用于自定义排序规则)。

• reverse:指明排序顺序,False(默认)为从小到大排序,True为从大到小排序。

a = [3,7,9,4,0,2]
b = 'nfweubv'
c = sorted(a)
d = sorted(a, reverse=True)
e = sorted(b)
print(c, d, e)
a = [3,7,9,4,0,2]
b = sorted(a, key=lambda x: abs(x-5), reverse=False)
print(b)

更多推荐