第五天(全局变量,局部变量,高级函数)

本文深入探讨了Python中变量的作用域,包括全局变量与局部变量的区别及转换方式。此外,还介绍了Python中的高级函数应用,如lambda匿名函数、递归函数、map/reduce和filter等函数的使用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在python中,没有缩进的变量为全局变量,推荐全部用大写字母。

NAME = "aitg"
def mz():
    global NAME
    print(NAME)
mz()

在代码块内部的变量为局部变量。

def mz():
    name = "aitg"
    print(name)
mz()

局部变量还可以使用global方法指定为全局变量

NAME = "码农也疯狂"
def mz():
    global NAME
    NAME = "aitg"
    return NAME
print(mz())
print(NAME)
#输出结果全部是 
# aitg
#aitg

 匿名函数使用

#计算x+1的结果
a = lambda x:x+1 
print (a(1)) #传入x值
#输出 2

递归使用

def calc(n):
    print(n)
    if int(n / 2) == 0: #终止条件
        return n
    res=calc(int(n / 2)) 
    return res

res=calc(10)
print(res)

 

 

 

高级函数

1、函数式编程

  • 函数本身可以赋值给变量,赋值后变量为函数;
  • 允许将函数本身作为参数传入另一个函数;
  • 允许返回一个函数。

2、map/reduce函数

  • map(fun, lst),将传入的函数变量func作用到lst变量的每个元素中,并将结果组成新的列表返回

  • reduce(func(x,y),lst),其中func必须有两个参数。每次func计算的结果继续和序列的下一个元素做累积计算。

  lst = [a1, a2 ,a3, ......, an]

  reduce(func(x,y), lst) = func(func(func(a1, a2), a3), ......, an)

3、filter函数

  • 筛选序列
  • filter(func, lst),将func作用于lst的每个元素,然后根据返回值是True或False判断是保留还是丢弃该元素。

 

转载于:https://www.cnblogs.com/zhangguanghe/p/8719640.html

<think>我们正在讨论Python局部变量全局变量的区别及使用方法。根据引用内容,我们可以总结以下几点: 1. **作用域差异**: - 全局变量:在函数外部定义,整个程序都可访问。 - 局部变量:在函数内部定义,仅在该函数内部有效。 2. **变量优先级**: - 当局部变量全局变量同名时,在函数内部优先使用局部变量(不会改变全局变量的值)。 3. **修改全局变量**: - 若需在函数内部修改全局变量,必须使用`global`关键字声明。 4. **使用场景**: - 全局变量适合存储程序级共享数据。 - 局部变量用于函数内部临时计算。 ### 示例解析 #### 示例1:局部变量不影响全局变量 ```python a = 4 # 全局变量 def b(): a = 8 # 局部变量(与全局变量a同名) print(a) # 输出局部变量a: 8 b() print(a) # 输出全局变量a: 4 ``` **输出**: ``` 8 4 ``` > 函数内部的`a`是独立于全局变量`a`的新局部变量[^1]。 #### 示例2:使用`global`修改全局变量 ```python a = 8 # 全局变量 def b(): global a # 声明使用全局变量a a = 2 # 修改全局变量 print(a) # 输出全局变量a: 2 b() print(a) # 输出全局变量a: 2(已被修改) ``` **输出**: ``` 2 2 ``` > 通过`global`关键字,函数内部操作直接作用于全局变量[^1][^3]。 ### 关键规则 1. **访问权限**: - 函数内部可直接读取全局变量(无需声明): ```python x = 10 def read_global(): print(x) # 合法:输出10 ``` - 但修改全局变量必须使用`global`声明: ```python x = 10 def modify_global(): global x x = 20 # 合法修改 ``` 2. **变量隐藏**: - 在函数内部对未声明的变量赋值会创建新的局部变量: ```python y = 5 def create_local(): y = 10 # 创建局部变量y,全局变量y不变 ``` 3. **嵌套作用域**: - 在嵌套函数中,若需修改外层非全局变量,需使用`nonlocal`关键字: ```python def outer(): z = 15 def inner(): nonlocal z # 引用外层函数的变量 z = 30 inner() print(z) # 输出30 ``` ### 最佳实践 - **避免滥用全局变量**:全局变量会增加代码耦合度,建议通过函数参数和返回值传递数据。 - **明确变量作用域**:使用`global`/`nonlocal`时需谨慎,确保理解其对变量的影响。 - **命名约定**:全局变量可使用大写或前缀(如`GLOBAL_VAR`)增强可读性。 ### 常见错误 ```python count = 0 def increment(): # 错误:未声明global,尝试修改全局变量 count += 1 # 引发UnboundLocalError increment() ``` **修正**: ```python count = 0 def increment(): global count count += 1 # 正确 ``` ### 总结 | **特性** | **全局变量** | **局部变量** | |------------------|-------------------|-------------------| | **定义位置** | 函数外部 | 函数内部 | | **作用域** | 整个程序 | 定义它的函数内部 | | **修改要求** | 需`global`声明 | 直接修改 | | **生命周期** | 程序运行期间 | 函数调用期间 | > 合理利用作用域规则能有效组织代码结构,避免命名冲突和意外修改[^2][^4]。 §§相关问题§§ 1. 如何在Python的闭包中修改外部函数的变量? 2. Python的`nonlocal`关键字有哪些使用限制? 3. 全局变量在多线程环境下会引发哪些问题? 4. 如何通过类(Class)替代全局变量管理共享状态? [^1]: python中有关函数全局变量局部变量。在函数内部定义的a 是局部变量,当我们调用函数b的时候,函数内部打印的是局部变量函数外部打印的是全局变量a,并没有改变外部的全局变量。如果你想在函数内部改变全局变量的值,就要使用global关键字。 [^2]: python全局变量局部变量的区别_Python全局变量局部变量区别及用法分析。注:在方法内部的变量是在=号前面的,那肯定是局部变量。如果是第一次出现在=号后面的,那肯定是调用的全局变量全局变量可以在函数里面调用,局部变量只能在对应的函数里面调用,在该函数外面任何地方都无法被调用。 [^3]: python 局部变量全局变量。那如何在外部也能调用一个在局部里修改了的全局变量呢. 首先我们在外部定义一个全局变量a=None, 然后再fun()中声明 这个a是来自外部的a. 声明方式就是global a. 然后对这个外部的a修改后, 修改的效果会被施加到外部的a上。 [^4]: python局部变量全局变量区别。globalshowList#global代表引用全局变量,没办法,不写的话,showList就成局部变量了,赞吧 showList.append(1) showList.append(2) printshowList。</think># Python 函数局部变量全局变量的区别及使用方法 ## 1. 核心区别 ### 作用域范围 | **变量类型** | **作用域范围** | **生命周期** | |------------|---------------------|-------------------| | **全局变量** | 整个程序 | 程序运行期间 | | **局部变量** | 定义它的函数内部 | 函数执行期间 | ### 关键区别 - **全局变量**:在函数外部定义,整个程序都可访问 - **局部变量**:在函数内部定义,仅在该函数内部有效 - 当局部变量全局变量同名时,在函数内部**优先使用局部变量** ## 2. 基本行为演示 ### 示例1:局部变量不影响全局变量 ```python x = 10 # 全局变量 def modify(): x = 20 # 局部变量(与全局变量同名) print(f"函数内部: {x}") # 输出局部变量 modify() print(f"函数外部: {x}") # 输出全局变量 ``` **输出**: ``` 函数内部: 20 函数外部: 10 ``` > 函数内部的`x`是独立于全局变量`x`的新局部变量[^1] ### 示例2:函数内访问全局变量(不修改) ```python count = 0 # 全局变量 def increment(): # 直接访问全局变量(只读) print(f"当前计数: {count}") increment() # 输出: 当前计数: 0 ``` > 函数内部可以直接读取全局变量的值,无需特殊声明[^2] ## 3. 修改全局变量:`global`关键字 ### 基本用法 ```python total = 100 # 全局变量 def update_total(): global total # 声明使用全局变量 total = 200 # 修改全局变量 print("修改前:", total) # 100 update_total() print("修改后:", total) # 200 ``` ### 实际应用场景 ```python USER_LIMIT = 100 # 全局配置 def adjust_limit(new_limit): global USER_LIMIT USER_LIMIT = new_limit print(f"用户限制已更新为: {USER_LIMIT}") adjust_limit(150) # 用户限制已更新为: 150 print("当前全局限制:", USER_LIMIT) # 150 ``` ## 4. 嵌套函数中的变量:`nonlocal`关键字 ### 解决闭包中的变量访问 ```python def outer(): counter = 0 # 闭包变量(非全局) def inner(): nonlocal counter # 声明使用外层变量 counter += 1 return counter return inner increment = outer() print(increment()) # 1 print(increment()) # 2 ``` > `nonlocal`用于访问嵌套函数外层(非全局)的变量[^3] ## 5. 最佳实践与注意事项 1. **避免全局变量滥用** - 过度使用全局变量会导致代码难以维护 - 建议将相关全局变量封装在类中 2. **命名规范** - 全局变量使用大写字母和下划线:`MAX_CONNECTIONS = 10` - 局部变量使用小写字母和下划线:`current_value = 5` 3. **安全修改模式** ```python config = {"timeout": 30} # 使用字典代替多个全局变量 def update_config(key, value): if key in config: config[key] = value else: print(f"无效配置项: {key}") update_config("timeout", 60) ``` 4. **函数参数优先** ```python # 推荐方式:通过参数传递 def calculate_area(radius): return 3.14 * radius ** 2 # 不推荐:依赖全局变量 radius = 5 def calculate_area(): return 3.14 * radius ** 2 ``` ## 6. 常见错误及解决方案 ### 错误1:未声明修改全局变量 ```python balance = 1000 def withdraw(amount): # 错误:尝试修改全局变量未声明 balance = balance - amount # UnboundLocalError withdraw(100) ``` **修复**: ```python def withdraw(amount): global balance balance -= amount ``` ### 错误2:误认为修改了全局变量 ```python items = [] def add_item(item): # 实际修改的是局部变量 items = [item] # 创建了新列表 add_item("apple") print(items) # 输出: [] (空列表) ``` **修复**: ```python def add_item(item): global items items.append(item) # 修改全局列表 ``` ## 总结 | **特性** | **全局变量** | **局部变量** | |------------------|-------------------|-------------------| | **定义位置** | 函数外部 | 函数内部 | | **访问范围** | 整个程序 | 定义它的函数内部 | | **修改要求** | 需`global`声明 | 直接修改 | | **生命周期** | 程序运行期间 | 函数调用期间 | | **内存效率** | 较低 | 较高 | > 合理利用作用域规则能有效组织代码结构,避免命名冲突和意外修改[^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值