现在的位置: 首页 > 综合 > 正文

Python学习笔记3–函数

2013年08月12日 ⁄ 综合 ⁄ 共 1620字 ⁄ 字号 评论关闭

1、函数相关基础

Calls   myfunc("spam",'eggs',meat=ham)

def, def adder(a,b=1,*c)

return        return a+b+c[0]

global def changer():

global x;x='new'

nonlocal def changer():

nonlocal x;x='new'

yield def squares(x):

for i in range(x):yield i ** 2

lambda Funcs=[lambda x:x**2,lambda x:x*3]

def是可执行的代码,def创建了一个对象并将其复制给某一变量名,lambda创建一个对象但将其作为结果返回,return将一个结果发送给 调用者,yield向调用者发送一个结果对象但是记住它离开的地方,global声明了一个模块级的变量并被复制,nonlocal声明了将要复制的一个封闭的函数变量,函数是通过复制(对象引用)传递的,参数、返回值以及变量并不是声明。

2、作用域

在一个def内定义的变量名只能本def内的代码使用,def中的变量名与def外的变量名不冲突。

函数定义了本地作用域,而模块定义的是全局作用域:

内嵌的模块是全局作用域,全局作用于的作用范围仅限于单个文件,每次对函数的调用都创建了一个新的本地作用域,复制的变量名除非声明为全局变量或非本地变量否则均为本地变量,所有其他的变量名都可以归纳为本地/全局或者内置的。

Python的变量名命名解析机制成LEGB法则:

当函数中使用未认证的变量名是,Python搜索4个作用域【本地L,上一层结构中def或lambda的本地E,全局G,内置作用域B】.当在函数中赋值时,总是创建或改变本地作用域的变量名,除非为全局变量。

nonlocal:声明了将要在一个嵌套的作用域中修改的名称,与global不同的是应用于一个嵌套的一个名称,而不是所有def之外的全局模块作用域。默认情况下不允许修改嵌套的def作用域中的名称,UnboundLocalError,使用nonlocal进行修改。

3、参数

参数的传递是通过自动将对象复制给本地变量名来实现的,在函数内部的参数的赋值不会影响调用者,改变函数的可变对象参数值也许会对调用者有影响(函数能够就地改变传入的可变对象)。

不可变参数“通过值”进行传递,像整数和字符串是哦那个过对象引用而不是拷贝进行传递的,但不可能在原处改变不可变对象;

可变对象是通过“指针”进行传递的,列表和字典这样的对象也是通过对象引用进行传递的,可变对象能够在函数内部进行原处改变。

>>>def changer(a,b)

a=2

b[0]='zz'

>>>x=1

>>>y=[1,2]

>>>changer(x,y)

>>>x,y

(1,['zz',2])

>>>changer(x,y[:])
#如果不想改变传入的对象

匹配语法:

调用者

func(value)
#通过位置进行匹配

func(value)
#通过变量名匹配

func(*seq) #以name传递所有的对象,并作为独立的基于位置的参数

func(**dict)
#以name成对地传递所有的关键字/值,并作为独立的关键字参数

函数

def func(name)

def func(name=value)

def func(*name)
#匹配并收集(在元组中)所有包含位置的参数

def func(**name)
#匹配并收集(在字典中)所有包含位置的参数

def func(*args,name)
#参数必须在调用中按照关键字传递

def func(*,name=value)

>>>def f(*args):print(args)

>>>f()

()

>>>f(1)

(1,)

>>>f(1,2,3)

(1,2,3)

>>>def f(**args):print(args)

>>>f(a=1,b=2)

{'a':1,'b':2}

keywor-only参数:只按照关键字传递并且不会由一个位置参数来填充的参数。






抱歉!评论已关闭.