`
ooaer
  • 浏览: 137484 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Python作用域和参数

 
阅读更多
转(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中函数的参数与作用域

    主要介绍了Python中函数的参数与作用域,是Python入门学习中的基础知识,需要的朋友可以参考下

    Python学习笔记之函数的定义和作用域实例详解

    本文实例讲述了Python函数的定义和作用域。分享给大家供大家参考,具体如下: 定义函数 默认参数: 可以向函数中添加默认参数,以便为在函数调用中未指定的参数提供默认值 # 如果调用 cylinder_volume 函数时,不...

    python基础2day05.txt

    python 作用域 局部作用域 外部嵌套函数作用域 模块级的作用域(全局作用域) 内建模块的作用域 global 语句 声明 nonlocal 语句 lambda 表达式(用来创建匿名函数) lambda 参数列表: 表达式 exec / eval...

    1.10-函数的参数和变量的作用域

    1.10-函数的参数和变量的作用域

    讲解python参数和作用域的使用

    本文会介绍如何将语句组织成函数,还会详细介绍参数和作用域的概念,以及递归的概念及其在程序中的用途。一. 创建函数函数是可以调用,它执行某种行为并且返回一个值。用def语句即可定义一个函数:(并非所有的函数...

    Python 中文手册

    9.2. Python 作用域和命名空间 9.2.1. 作用域和命名空间示例 9.3. 初识类 9.3.1. 类定义语法 9.3.2. 类对象 9.3.3. 实例对象 9.3.4. 方法对象 9.4. 一些说明 9.5. 继承 9.5.1. 多继承 9.6. 私有变量 9.7. 补充 9.8. ...

    2019千峰Python超详细入门教程(百度云盘分享).docx

    作用域&修改变量作用域.mp4 │ ├─千锋Python教程:第07章 闭包&装饰器(5集) │ │ .DS_Store │ │ │ ├─code │ │ 10、多个装饰器.py │ │ 11、装饰器使用场景.py │ │ 12、计数函数执行次数.py │ │ ...

    基于Python函数和变量名解析

    函数是Python为了代码最大程度的重用和最小化代码冗余而提供的基本程序结构,用于将相关功能打包并参数化 Python中可以创建4种函数: 1)、全局函数:定义在模块中,每个模块都是一个全局作用域,因此,全局作用域...

    超全面python面试题

    17 Python中的作用域 18 GIL线程全局锁 19 协程 20 闭包 21 lambda函数 22 Python函数式编程 23 Python里的拷贝 24 Python垃圾回收机制 1 引用计数 2 标记-清除机制 3 分代技术 25 Python的List 26 Python的is 27 ...

    Python语言基础:局部变量和全局变量.pptx

    对于全局变量和局部变量,即使变量名相同,但是因为定义在不同的作用域内,其本质上也是不同的变量。 实例:局部变量和全局变量的对比,并输出结果。 具体实现: total = 0 # 这是一个全局变量 def sum( arg1, arg2 ...

    python课堂笔记.zip

    目录 01概述及环境搭建 02基础语法(完整版) ...02返回值作用域 插入排序 树1 01高阶函数 02装饰器 03参数注解 04functools 05装饰器应用及用途 06作业 06作业参考 堆排序实现 树的遍历和堆排序 ......

    python 函数的使用-python基础,python函数的使用说明,有python2的参考代码

    python 函数的使用-python基础,python函数的使用说明,有python2的参考代码 函数的基本组成 函数是重用的程序段。...“作用域”:所有变量的作用域是它们被定义的块,从它们的名称被定义的那点开始。

    Python语言程序设计PPT课件.zip

    学习本章,要理解函数的概念,掌握定义函数的方法,深刻理解函数调用中参数的传递(值传递、地址传递),理解变量的作用域(变量的作用范围或变量的生命周期),理解函数集合模块、包等概念,掌握模块和包的创建及...

    Python教程大全入门到实战

    为什么学Python? Python代码规范 简明概述 注释 命名规范 第一个Python程序 Python 简介 Python 的安装 第一个 Python 程序 集成开发环境(IDE): PyCharm 基本数据类型和变量 ...作用域 Python 的 Magic Metho

    Python语言程序设计习题答案.zip

    学习本章,要理解函数的概念,掌握定义函数的方法,深刻理解函数调用中参数的传递(值传递、地址传递),理解变量的作用域(变量的作用范围或变量的生命周期),理解函数集合模块、包等概念,掌握模块和包的创建及...

    Python变量作用域LEGB用法解析

    这篇文章主要介绍了Python变量作用域LEGB用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 闭包就是, 函数内部嵌套函数. 而 装饰器只是闭包的特殊场景...

    Python中的函数(课件)

    详细介绍Python中的函数用法,包括函数的定义和调用、常见的参数类型以及参数传递规则、变量作用域和递归函数、一些特殊的函数例如lambda表达式等,非常适合高校老师教学和学生课后复习使用。

Global site tag (gtag.js) - Google Analytics