函数是python 为了代码最大程度的重用和最小代码冗余而提供的最基本的程序结构。使用它我们可以将复杂的系统分解为可管理的部件。
函数相关语句
def... 创建一个对象并将其赋值给某一个对象
return 将一个结果对象发送给调用者
global 声明了一个模块级的变量并赋值
nonlocal 声明了将要赋值的一个封闭的函数变量
yield 向调用者发回一个结果对象,但是记住它离开的地方
lambda 创建一个对象,将其结果返回
函数定义和调用
实例一:
def times(x,y): #函数定义
return x*y #函数主体 #函数调用
a = times(3,4)
b = times('hello',4)
print(a,b) #12 hellohellohellohello
实例二:求两个集合的交集
def intersect(seq1,seq2):
res = []
for i in seq1:
for i in seq2:
res.append(i)
return res #函数调用 s1 = 'admin'
s2 = 'awsemis'
print(intersect(s1,s2)) #['a','m','i']
作用域
在任何情况下,一个变量的作用域(它所使用的地方)总是由在代码中被赋值的地方所决定,并且与函数调用完全没有关系。实际上,变量可以在3个不同的地方分配,分别对应3种不同的作用域:
1. 如果一个变量在def内赋值,它被定位在这个函数内。
2. 如果一个变量在一个嵌套的def中赋值,对于嵌套的函数来说,它是非本地的。
3. 如果在def之外赋值,它就是整个文件全局的。
a = 99 #a为全局变量
def num_a():
a=88 # a为本地变量(只在def语句内是可见的)
return a
print(a) #
print(num_a()) #
尽管这两个变量名都是 a,但是它们的作用域可以把它们区别开来。实际上,函数的作用域有助于防止程序之中变量名的冲突域,并且有助于函数成为更加独立的程序单元。
作用于法则:
函数定义了本地作用域,而模块定义的是全局作用域。这两个作用域有如下的关系
1.内嵌的模块是全局作用域。
2.全局作用域的作用范围仅限于单个文件
3.每次对函数的调用都创建了一个新的本地作用域。
4.赋值的变量名除非声明为全局变量或非本地变量,否则均为本地变量
5.所有其他的变量名都可以归纳为本地、全局或者内置的。
python 的作用域的关系如下:
变量名引用分为三个作用域进行查找:首先是本地(L),之后是函数内(E)(如果有的话),之后全局(G),最后是内置(B)。
实例:
#Global scope 全局作用域
x = 99 # x和func为全局作用域(global scope)
def func(y):
#Local scope 本地作用域
z = x + y #y和z 为本地作用域(local scope)
return z
print(func(1)) #
global语句
它是一个命名空间的声明。它告诉python函数打算生成一个或多个全局变量名。
全局变量名总结:
1. 全局变量是位于模块文件内部的顶层的变量名。
2. 全局变量如果是在函数内被赋值的话,必须经过声明。
3. 全局变量名在函数的内部不经过声明也可以被引用。
x = 88 # x 为global
def func():
global x #声明后,函数外部的变量x就会被改变。不加这个声明是不能改变外部变量的。
x = 99
func()
print(x) #
嵌套作用域实例
x = 99 #global 全局作用域
def f1():
x=88 # enclosing 函数内作用域
def f2():
print(x) #先找本地,本地找不到找函数内,遵循LEGB法则
f2() #在函数里面调用函数f2
f1() #88 #调用f1函数
nonlocal语句
nonlocal和global一样,声明了将要在一个嵌套的作用域中修改的名称。
区别之处:nonlocal应用于一个嵌套的函数的作用域中的一个名称,而不是所有def之外的全局模块作用域;而且在声明nonlocal名称的时候,它必须已经存在于该嵌套函数的作用域中。
参数
必须参数
关键字参数
默认参数
不定长参数(*)
不定长参数(**)
def info(name,age,sex='男'): #sex = '男' 为默认参数(默认参数必须放后面)
print('Name:%s\nAge:%d\nSex:%s'%(name,age,sex)) '''必须参数'''
info('xp',26) '''关键字参数'''
info(age = 26,name = 'xp') info('pp',26,sex='女') '''不定长参数'''
def add(*args):
print('对元素进行求和:',args) # 传进参数打印结果是元组类型
sum=0
for i in args:
sum += i
print('求和结果:',sum) add(1,2,3) '''不定长参数二'''
def info(*args,**kwargs):
# print(args)
print(kwargs) # 打印出 字典 格式
for i in kwargs:
print('%s:%s'%(i,kwargs[i])) info('xp', 26,sex = '男',job = 'IT')
info()
位置关系
结论:
*args参数放在左边,**kwargs参数放在右边
默认参数在左边,*args参数放在左边,**kwargs参数放在右边
未完待续。。。。。