转(
http://blog.lzp729.com/code-life/python/python-groundwork/python%E7%9F%A5%E8%AF%86%E6%95%B4%E7%90%86-14-%E4%BD%9C%E7%94%A8%E5%9F%9F%E5%92%8C%E5%8F%82%E6%95%B0.html)
Python中的变量名在第一次被赋值时已经创建, 并且必须经过赋值后才能够使用.
每一个模块都是一个全局作用域, 没有类型C++那样的能够存活在整个项目中的作用域.Python作用域的范围仅限于单个文件(模块).赋值的变量名除非声明为全局变量(通过global), 否则均为本地变量.所有的变量名都可以归纳为本地, 全局或者内置.注意实地改变变量并不会把变量划分为本地变量, 实际上只有对变量名赋值才可以.
变量名解析: LEGB原则
变量名分为三个作用域进行查找, 本地 => 函数内 => 全局 => 内置
全局声明将赋值变量名映射到模块文件内部的作用域(全局域).
对于内置名字, 如zip函数, 可以直接使用, 如zip(), 或者import __building__; __buildin__.zip()
自定义变量会掩盖自带的名字, 甚至可以替换自带的名字, 如__buildin__.zip = …
通过global将变量声明为全局域变量
X = 88
def func():
global X
X = 99 //(改变全局域的X)
除了通过global方式访问全局域变量外, 还可以在函数中import自身module, 然后通过模块名.变量的形式访问.
// thismod.py
var = 99
def local():
var = 0
def glob1():
global var
var += 1
def glob2():
var = 0
import thismod
thismod.var += 1
def glob3():
var = 0
import sys
glob = sys.module['thismod']
glob.var += 1
工厂函数
def maker(N):
def action(X):
return X**N
return action
func = maker(2)
f(3) == 9
使用默认参数来保留嵌套作用域的状态
def maker():
x = 88
def action(x = x):
print x
return action
func = maker()
f(3) // print 88
在某一个函数内部调用一个之后才定义的函数是可行的, 只要第二个函数定义是在第一个函数调用之前就行.
lamda表达式:
action = (lambda n,x: return x ** n); action(2,3) == 9
def makeActions():
acts = []
for i in range(5):
acts.append(lambda x: i ** x)
return acts
acts = makeActions()
acts[2](3) == 64 // 因为嵌套作用域中的变量在嵌套的函数被调用时才进行查找, 所以这里的acts函数组里的每个i都是4
def makeActions():
acts = []
for i in range(5):
acts.append(lambda x, i = i : i ** x)
return acts
acts = makeActions()
acts[2](3) == 8
// 在lambda中, 用默认参数的方式记住每一次i迭代的值.
作为参数被传递的对象从来不自动拷贝. 不可变参数通过值传递, 可变对象是通过引用进行传递. 自动对传入的参数进行赋值的效果与运行一系列简单的赋值语句是相同的.
返回多个变量: def return(x, y); return2(1,2) == (1,2) 看似返回多个, 实际上返回的是一个元组
函数参数匹配表
语法 位置 解释
func(value) 调用者 常规参数:通过位置进行匹配
func(name = value) 调用者 关键字参数: 通过变量名匹配
func(*name) 调用者 以name传递所有的对象, 并作为独立的基于位置的参数
func(**name) 调用者 以name传递所有关键字/值, 并作为独立的关键字参数
def func(name) 函数 常规参数:通过位置进行匹配
def func(name = value) 函数 默认参数值, 如果没有在调用中传递
def func(*name) 函数 匹配并收集(在元组中)所有包含位置的参数
def func(**name) 函数 匹配并收集(在字典中)所有包含关键字的参数
// L1, L5
def func(a,b,c):print a,b,c
func(1,2,3)
// L2, L6
def func(a,b,c):print a,b,c
func(1,b = 2, c = 3)
// L3, L7
def func(a,b,c):print a,b,c
args = (1,2,3)
func(*args)
// L4, L8
def func(a,b,c):print a,b,c
args = {'a':1, 'b' : 2, 'c' : 3}
func(**args)
Python函数可作为传输传递
def minmax(test, *args):
res = args[0]
for arg in args[1:]:
if test(arg, res):
res = arg
return res
def lessthan(x,y): return x < y
def grtrthan(x,y): return x > y
print minmax(lessthan, 4,1,2,3)
print minmax(grtrthan, 4,1,2,3)
参数匹配法则
在函数调用中, 所有的非关键字参数必须首先出现, 其后跟随所有的关键字参数, 后面跟着*name的形式, 并且如果需要的话, 最后是**name的形式
在函数头部, 参数必须以相同的顺序出现: 一般参数, 默认参数, 后面是*name和**name.
分享到:
相关推荐
在Python编程中,包、模块、函数和变量作用域是四个至关重要的概念,对于理解和组织代码至关重要。 首先,我们来详细探讨一下“模块”(Module)。在Python中,模块是一个包含Python定义和语句的文件。模块可以定义...
Python 之嵌套作用域可以分为两个部分:函数内部的作用域和函数外部的作用域。函数内部的作用域是指函数定义时所在的作用域,而函数外部的作用域是指函数被调用时所在的作用域。在函数内部,我们可以访问外部的变量...
Python是一种高级编程语言,其函数的参数和作用域是编程基础的重要组成部分。理解这些概念对于编写高效、可维护的代码至关重要。 首先,我们来看函数的参数传递。在Python中,函数参数的传递是通过赋值给局部变量来...
然而,在Python中,却存在一种特殊情况,即可以在同一作用域下定义两个具有相同名称且参数完全一致的函数。这种现象乍一看似乎违背了编程的基本规则,但实际上它是由Python的语言特性决定的。本文将深入探讨这一现象...
Python中的命名空间与作用域是理解程序执行逻辑和变量访问的关键概念。命名空间是一个存储名字与对象映射的容器,它的主要目的是防止不同区域内的同名变量产生冲突。Python通过不同的命名空间类型来管理这些映射,...
Python中的命名空间和作用域是理解程序执行逻辑和变量访问规则的关键概念。命名空间(Namespace)可以被看作是一个从名字到对象的映射,它决定了变量名如何关联到具体的对象。在Python中,大多数命名空间是通过字典...
函数的参数和变量的作用域是理解Python代码如何运行的关键概念。在这篇文章中,我们将深入探讨这两个主题。 首先,让我们理解什么是函数参数。在Python中,当我们定义一个函数时,可以指定一些参数(或称形参),...
Python函数的返回值和作用域是编程中的关键概念,它们决定了代码如何组织和数据如何在不同层次之间传递。首先,我们来深入理解函数的返回值。 函数的返回值是通过`return`语句实现的。例如,函数`showplus(x)`打印...
理解函数参数和变量的作用域对于编写清晰、无错误的代码至关重要。错误地使用作用域可能导致意外的变量覆盖、未定义的变量引用等问题。在编写程序时,应遵循“最小作用域原则”,即尽量让变量的作用域尽可能小,以...
本文实例讲述了Python函数的定义和作用域。分享给大家供大家参考,具体如下: 定义函数 默认参数: 可以向函数中添加默认参数,以便为在函数调用中未指定的参数提供默认值 # 如果调用 cylinder_volume 函数时,不...
- Python允许在函数定义时使用星号(*)和双星号(**)来收集不定数量的位置参数和关键字参数。 - 当调用函数时,使用`*`运算符可以将元组或列表的元素作为单独的参数传递,而`**`运算符可以将字典的键值对作为关键字...
Python提供了不同类型的变量作用域,包括局部作用域、全局作用域、内置作用域和嵌套作用域。每种作用域都有其独特的规则来确定变量的可见性和生命周期。 局部作用域,指的是在函数或代码块内部定义的变量。这些变量...
Python中的变量作用域是编程基础中的重要概念,它关乎到代码执行时如何访问和修改不同范围内的变量。在Python中,变量主要分为两种类型:局部变量(local variables)和全局变量(global variables)。 1. **局部...
python 作用域 局部作用域 外部嵌套函数作用域 模块级的作用域(全局作用域) 内建模块的作用域 global 语句 声明 nonlocal 语句 lambda 表达式(用来创建匿名函数) lambda 参数列表: 表达式 exec / eval...
Python的作用域分为局部作用域和全局作用域。局部作用域是指在函数内部定义的变量,它们只在该函数内可见和可用。而全局作用域是指在函数外部定义的变量,它们在程序的任何地方都是可见和可用的。 根据上述内容中的...
3. **非本地(nonlocal)关键字**:非本地关键字允许在内部作用域中修改外部(但不是全局)变量,这在处理嵌套函数或闭包时非常有用。 4. **元组 unpacking增强**:在Python 2.5中,可以使用星号操作符(*)将元组...
Python实现时,通常会包含计算梯度、更新参数和判断收敛条件等步骤。源代码中可能包含了梯度计算函数、步长选择策略以及迭代循环的实现。 2. **共轭梯度法(Conjugate Gradient)**: 共轭梯度法是针对二次可微...
### 什么是Python变量作用域 ...通过使用`locals()`、`globals()`和`vars()`等内置函数,我们可以有效地管理和调试不同作用域中的变量。希望本文能帮助您更好地掌握Python中的变量作用域相关知识点。