python基础第十六节
16.1 变量在函数中的作用域
变量的作用域是指变量的作用范围.
局部变量: 在函数体或局部范围内声明的变量称为局部变量.局部变量仅在局部作用域内有效.
全局变量: 在函数之外或在全局范围内声明的变量称为全局变量.全局变量允许在函数内部和外部访问,但是不允许在函数内部修改.
golbal: 用于在函数内部访问和修改全局作用域中的变量.通过在函数内部使用 global 关键字声明变量,该变量就可以在函数内部被修改,并且修改后的值也会影响到全局作用域中的变量.
x = 10
def modify_global_variable():
global x
x = 20
print(x)
modify_global_variable()
print(x)
nonlocal: 用于在嵌套函数中修改嵌套作用域外的变量。它允许你在内部函数中访问并修改外部函数的局部变量,而不是创建一个新的同名局部变量.并且会影响到外部函数中的同名变量.这样可以实现在嵌套函数中共享和修改变量的目的.(如果不加nonlocal, 也是可以再嵌套函数中访问到外层的变量的,只是无法修改)
def outer():
x = "local"
def inner():
nonlocal x
x = "nonlocal"
print(x)
inner()
print("outer:", x)
x = 'global'
outer()
print('global:', x)
16.2 函数的参数传递.
函数参数的传递可以分为4类:
- 位置参数: 调用函数时根据函数定义的参数的位置来传递参数.
- 关键字参数: 函数调用通过key=value的形式来传递参数, 可以让函数更加的清晰, 同时也不需要强调顺序.
self_introduction(name="zhangsan", age=25, gender='男')def self_introduction(name, age, gender): print(f"你好, 我的名字叫{name}") print(f"今年{age}岁, 性别{gender}")
需要注意的是: 位置参数和关键字参数可以混用, 但是位置参数必须在前面, 且需要匹配顺序.
但是关键字参数之间, 不存在先后顺序. - 缺省参数: 也叫做默认参数, 用于在定义函数的时候为参数提供默认值, 调用函数时可以不传递该参数的值, 所有的位置参数必须出现在默认参数前, 包括函数定义和调用.
def self_introduction(name, age, come_from='中国'): print(f"你好, 我的名字叫{name}, 今年{age}岁, 我来自{come_from}") self_introduction(name="zhangsan", age=25) - 不定长参数: 也叫做可变参数, 用于不确定调用的时候会传递多少参数.
- 位置传递: *args. 传递给函数的所有参数, 都会被args所接受,会根据传进去的参数的位置组成一个元组.
- *args允许函数接受任意数量的位置参数.
- 它以元组的形式传递参数,函数内部可以使用args变量来获取到参数.
2. 关键字传递: **kwargs, 在参数是key=value的情况下, 所有的key-value都会被kwargs接收, 同时会将key-value组成一个字典.def average(a, b, c): print((a + b + c) / 3)- **kwargs允许函数接收任意数量的关键字参数.
- 它以字典的形式传递参数, 函数内部可以使用kwargs变量来引用这个字典.
def self_introduction(**kwargs): print(kwargs) # print(f"你好, 我的名字叫{name}, 今年{age}岁, 我来自{come_from}") self_introduction(name="zhangsan", age=25, come_from='北京')
16.3 值传递和引用传递
值传递(Pass by Value)和引用传递(Pass by Reference)是关于函数参数传递方式的两个概念.
值传递是指将实际参数的值复制一份给形式参数,函数中对形式参数的修改不会影响到实际参数的值。在值传递中,函数中对形式参数的修改只会影响到函数内部,不会影响到函数外部。
引用传递是指将实际参数的引用(地址)传递给形式参数,形式参数和实际参数指向同一块内存地址,函数中对形式参数的修改会影响到实际参数的值。在引用传递中,函数中对形式参数的修改会反映到函数外部.
需要注意的是,虽然在Python中没有严格的引用传递机制,但是对于可变对象(如列表、字典等),它们的传递方式是引用传递,因为它们的值可以在函数内部被修改。而对于不可变对象(如数字、字符串等),它们的传递方式类是值传递,因为函数内部对形式参数的修改不会影响到实际参数。
理解值传递和引用传递的概念对于编写和调试代码非常重要,可以帮助我们更好地理解函数参数传递的机制和代码中的行为.
16.4 匿名函数
也称为lambda函数,是一种简洁的函数定义方式,用于创建一次性的、简单的函数.
匿名函数的语法形式为:lambda 参数: 表达式
它由关键字 lambda 开头,后跟一个或多个参数,然后是冒号 :,最后是一个表达式, 匿名函数执行表达式的计算,并返回结果.
匿名函数通常用于需要简单函数逻辑的地方,尤其是在需要传递函数作为参数的情况下,可以更简洁地定义函数,避免定义命名函数的繁琐。但需要注意的是,匿名函数通常用于表达式较短、逻辑简单的情况,对于复杂的函数逻辑,仍然建议使用命名函数进行定义
def add(a, b):
return a + b
lambda a, b: a + b
案例: numbers = [5, 2, 7, 1, 9] 对此列表排序, 根据对3取余的 结果进行排序.
16.5 python中内置的常用函数
zip: zip([iterable, ...]), 将多个可迭代对象打包成元组.它返回一个可迭代的对象,该对象生成元组,每个元组包含来自每个可迭代对象的元素, 如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同.
map(): map(function, iterable):对可迭代对象中的每个元素应用指定的函数.
filter(): filter(function, iterable): 对可迭代对象中的元素进行过滤.
all(): all(iterable):判断可迭代对象中的所有元素是否都为真.如果是返回 True,否则返回 False.
any(): any(iterable): 判断可迭代对象中的任何一个元素是否为真.不是则返回 False,如果有一个为 True,则返回 True.