python——函数
目录
一、函数是什么
函数调用
函数返回
二、函数的参数传递
1.位置传参
2.关键字传参
3.*序列传参
4.**字典关键字传参
5.综合传参
三、函数的缺省参数
四、函数的不定长参数
1.星号元组传参
2.双星号字典传参
五、函数作用域
1.全局变量和局部变量
2.作用域分类
变量名查找规则
3.global语句
4.函数嵌套
5.nonlocal语句(非本地,非局部
一、函数是什么?
- 函数是一段可执行的代码块
- 作用
①.划分功能模块,更好管理软件工程
②.复用代码,减少开发工作量
③.提高代码阅读性,降低维护成本- 定义:
def function([参数列表(parameter list)]): [注释] 语句块 return[value]
说明:
函数本身也是一个变量(可调用类型,只读)
函数有自己的命名空间
参数列表可以有,可以没有
内容以冒号开始且缩进
语句块部分不能为省略,若为空语句,需填充pass
return[]结束语句。选择性地返回一个值给调用方,若无则返回None
demo1:
#无参数时
def hello():
print("hello!")
return[0]
#有参数时
def hello(n):
if n==1:
print("hello",n)
return
函数调用
函数调用:函数名([参数列表])
1.函数调用是一个表达式
2.若无return语句,函数执行完毕返回None值对象
3.若需返回其他的值对象需用return语句
4.函数使用是必须先定义后调用def hello(n): if n==1: print("hello",n) return hello(1)
函数返回
return[表达式]
作用:结束当前函数的执行,返回到调用函数的地方,同时返回一个值对象的引用关系
①.return可以省略 ==> return None
②.可以返回一个值或一组值(逗号隔开)
二、函数的参数传递
- 位置传参
- 关键字传参
- *序列传参
- **字典关键字传参
- 综合传参
1.位置传参
位置传参:实际参数的对应关系与形式参数的对应关系是以位置来传递的。
def sum(a,b,c): print('a=',a) print('b=',b,'c=',c) sum(1,2,3) >>>a=1 >>>b=2,c=3
说明
实参和形参通过位置进行对应和传递
实参和形参的个数必须完全相同
2.关键字传参
关键字传参:指传递参数时按照形参的名称给关键字赋值
实参和形参按名称进行匹配(可无序)def sum(a,b,c): pass sum(b=2,a=1,c=3)
3.*序列传参
序列类型(list,tuple,str)作为参数列表传递
要求:序列的元素个数必须与参数个数相同def different(a,b,c): pass s1=[11,22,33] #列表 different(*s1) // s2=(11,22,33) #元组 different (*s2) // s3="11,22,33" #str different(*s3)
4.**字典关键字传参
实参和形参通过字典进行传递和匹配,字典的传递给键对应的形参
demo2
def different(a,b,c):
pass
d1={"c":33,"a":11,"b":22}
different(**d1)
TIPS:
字典传参的键名和形参名必须一致键名必须为字符串
键名要在形参中存在
5.综合传参
以上几种的混合使用
三、函数的缺省参数
若形参被赋予默认参数值,那么该函数在调用时,若无实参传递则使用默认值计算
语法:
def 函数名(形参1=默认1,形参2=默认2,……):
#例如
def info(name,age=1,addr='不详'):
print ('姓名':name,"年龄":age,"住址":addr)
说明:
- 必须自右至左以此存在。若从某个地方开始有,则它右边的部分也必须有缺省参数。
- 调用时可更改默认参数
四、函数的不定长参数
不定长参数
{
- 星号元组形参
- 双星号元组形参
}
1.星号元组形参
语法:
def 函数名(*元组形参名):
代码块
return
#demo
def myfun(*args):
print ("实参个数是",len(args))
print(args)
i=1
for x in args:
print("第",i,"个参数是:",x)
i+=1
myfun()
命名关键字形参:如果要限制关键字参数的名字,可用命名关键字参数
*之后的参数被视为命名关键字参数
语法:
def 函数名(*元组形参名,命名关键字形参名):
代码块
return
或
def 函数名 (*,命名关键字形参名)
代码块
return
#demo
def myfun(a,b,*arge,c,d):
print(a,b,c,d,args)
myfun (11,b=2,c=33,d=44)
>>>11,22,33,44,()
>>>
>>>
#demo
'''
编写一个函数,该函数有两个参数,
调用函数时第一个为可变参数,
第二个参数为关键字参数
当关键字参数key=1时,讲前边传入的可变参数的数值通过冒泡排序方法进行升序排序
当关键字参数key=2时,讲前边传入的可变参数的数值通过冒泡排序方法进行降序排序
'''
def sort_num(*num,key):
lst=list(num)
if key==1:
for i in range(len(lst)-1):
for j in range(len(lst)-1-i):
if lst[j]>lst[j+1]:
lst[j],lst[j+1]=lst[j+1],lst[j]
elif key==2:
for i in range(len(lst)-1):
for j in range(len(lst)-1-i):
if lst[j]<lst[j+1]:
lst[j],lst[j+1]=lst[j+1],lst[j]
return lst
list1=[4,3,53,2,1,5,6,7,8,9,10]
print(sort_num(*list1,key=2))
>>>[53, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
>>>
>>>
2.双星号字典形参
语法:
def 函数名(**dict字典形参名):
代码块
return
#demo
def myfun(**kwargs):
print("参数个数:",len(kwargs.items()))
for k,v in kwargs.items():
print(k,"->>",v)
myfun(name="lilei",age=18)
参数的参数列表顺序:
以上传参方式均可混合搭配使用
顺序为:
位置形参,星号元组形参,命名元组形参,双星号字典形参,默认
有其他不懂的地方
>>>help"def"
可变 / 不可变类型的实参的参数传递的区别
可变类型:
列表list,集合set,字典dict
可以改动其里面的内容,本身位置不变
不可变类型:
固定集合 frozenset,元组tuple,字符串 str,数字numbers
五、函数作用域
作用域是python程序的一块文本区域,是变量或函数访问时查找名称
的范围空间
1.全局变量和局部变量
①.全局变量:定义在函数外部,当前文件内部的变量
②.局部变量:定义在函数内部的变量(包含函数参数)
#demo
v=100 //全局变量
def fn():
v=200 //局部变量
print(v)
fu() //200
print(v) //100
2.作用域4分类:
2.作用域4分类:
①.局部作用域(函数内) Local L
②.外部嵌套函数作用域 Enclosing function locals E
③.函数定义所在文件的作用域 Global(moudle) G
④.python内置模块作用域 Built-in(python) B
#demo
'''
__doc__显示的是该部分内容
'''
v=100 #全局作用域G
def fun1():
v=200 #外部嵌套作用域E
print("fun1.v=",v)
def fun2():
v=300 #局部作用域L
print("fun2.v=",v)
fun2()
fun1()
print("v=",v)
print(__doc__) #__doc__是内建作用域变量
变量名查找规则:
在访问变量时,先查找本地变量,然后是包裹此函数的外部函数的函数内部变量,之后是全局变量,最后是内置变量
L—>E—>G—>B
3.global语句
global 语句:全局声明
作用:将函数内的变量声明为全局变量
语法:global 变量名1,变量名2,……
tip:若形参与全局变量冲突时global失效
#demo1
v = 100
def fn():
global v # 声明全局变量v
v = 200 # 修改全局的v变量
print(v)
fn()
print(v)
#demo2
v = 100
def fn(v):
global v # error,v出现了参数列表里面
print(v)
fn(200)
global说明:
1.全局变量如果要在函数内部被赋值,则必须经过全局声明,否则被认为是局部变量
2.全局变量在函数内部不经过声明可以直接读取访问(前提是变量已经存在)
3.不能先声明局部变量,,再用global声明为全局变量,此做法不符合语法规则
4.global变量列表里的变量名不能出现在此作用的参数列表里,for循环控制目标,类定义,函数定义以及import导入名字中
4.函数嵌套
函数嵌套是指一个函数里用def语句来创建其它函数的情况
#嵌套示例
def fn_outher():
print("外部函数被调用")
def fn_inner():
print("fn_inner被调用")
fn_inner()
print("外部函数调用结束")
fn_outher()
5.nonlocal 语句 (非本地,非局部)
作用:
告诉解释器,nonlocal声明的变量不是局部变量,也不是全局变量。而是外部嵌套函数内的变量 语法: nonlocal 变量名1,变量名2,……
# nonlocol语句
var = 100
def outter():
var = 200
def inner():
nonlocal var # 指定var为外层嵌套函数作用域
# global var
var += 1 # 如果不声明此行会因为变量名重复而出错
print("innner.var=", var)
inner()
print("outter.var=", var)
outter()
#一般命名的时候就会把作用域定义好,基本不会用这种方法
说明:
- nonlocal语句只能在被嵌套函数的内部进行使用
- 访问nonlocal变量将对外部嵌套函数的作用域内的变量进行操作
- 当有两层或两层以上函数嵌套层时,访问nonlocal变量只对最近一层的变量进行操作
- nonlocal语句的变量列表里的变量名,不能出现在此作用域的参数列表中
两个函数:
globals() 返回当前全局作用域内变量的字典
locals() 返回当前局部作用域内变量的字典