> 文档中心 > python——函数

python——函数


python——函数


目录

一、函数是什么

函数调用

函数返回

二、函数的参数传递

1.位置传参

2.关键字传参

3.*序列传参

4.**字典关键字传参

5.综合传参

三、函数的缺省参数

四、函数的不定长参数

1.星号元组传参

2.双星号字典传参

五、函数作用域

1.全局变量和局部变量

2.作用域分类

变量名查找规则

3.global语句

4.函数嵌套

5.nonlocal语句(非本地,非局部

一、函数是什么?

  1. 函数是一段可执行的代码块
  2. 作用
    ①.划分功能模块,更好管理软件工程
    ②.复用代码,减少开发工作量
    ③.提高代码阅读性,降低维护成本
  3. 定义:
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. 位置传参
  2. 关键字传参
  3. *序列传参
  4. **字典关键字传参
  5. 综合传参

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):passsum(b=2,a=1,c=3)

3.*序列传参

序列类型(list,tuple,str)作为参数列表传递
要求:序列的元素个数必须与参数个数相同

def different(a,b,c):passs1=[11,22,33]    #列表different(*s1)//s2=(11,22,33)  #元组different (*s2)//s3="11,22,33"  #strdifferent(*s3)

4.**字典关键字传参

实参和形参通过字典进行传递和匹配,字典的传递给键对应的形参

demo2

def different(a,b,c):passd1={"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. 必须自右至左以此存在。若从某个地方开始有,则它右边的部分也必须有缺省参数。
  2. 调用时可更改默认参数

四、函数的不定长参数

不定长参数
{

  1. 星号元组形参
  2. 双星号元组形参

}

1.星号元组形参

语法:

def 函数名(*元组形参名):代码块return#demodef myfun(*args):print ("实参个数是",len(args))print(args)i=1for x in args:print("第",i,"个参数是:",x)i+=1myfun()

命名关键字形参:如果要限制关键字参数的名字,可用命名关键字参数
*之后的参数被视为命名关键字参数

语法:

def 函数名(*元组形参名,命名关键字形参名):代码块returndef 函数名 (*,命名关键字形参名)代码块return#demodef 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 lstlist1=[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#demodef 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.全局变量和局部变量

①.全局变量:定义在函数外部,当前文件内部的变量
②.局部变量:定义在函数内部的变量(包含函数参数)

#demov=100//全局变量def fn():v=200//局部变量print(v)fu() //200print(v) //100

2.作用域4分类:

2.作用域4分类:①.局部作用域(函数内) Local L②.外部嵌套函数作用域 Enclosing function localsE③.函数定义所在文件的作用域Global(moudle)G④.python内置模块作用域 Built-in(python)B
#demo'''__doc__显示的是该部分内容'''v=100   #全局作用域Gdef fun1():v=200#外部嵌套作用域Eprint("fun1.v=",v)def fun2():v=300#局部作用域Lprint("fun2.v=",v)fun2()fun1()print("v=",v)print(__doc__)#__doc__是内建作用域变量

变量名查找规则:

在访问变量时,先查找本地变量,然后是包裹此函数的外部函数的函数内部变量,之后是全局变量,最后是内置变量
L—>E—>G—>B


3.global语句

global 语句:全局声明
作用:将函数内的变量声明为全局变量
语法:global 变量名1,变量名2,……
tip:若形参与全局变量冲突时global失效

#demo1v = 100def fn():    global v  # 声明全局变量v    v = 200  # 修改全局的v变量    print(v)    fn()print(v)#demo2v = 100def 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 = 100def outter():    var = 200    def inner(): nonlocal var  # 指定var为外层嵌套函数作用域 # global var var += 1  # 如果不声明此行会因为变量名重复而出错 print("innner.var=", var)    inner()    print("outter.var=", var)outter()#一般命名的时候就会把作用域定义好,基本不会用这种方法

说明:

  1. nonlocal语句只能在被嵌套函数的内部进行使用
  2. 访问nonlocal变量将对外部嵌套函数的作用域内的变量进行操作
  3. 当有两层或两层以上函数嵌套层时,访问nonlocal变量只对最近一层的变量进行操作
  4. nonlocal语句的变量列表里的变量名,不能出现在此作用域的参数列表中

两个函数:
globals() 返回当前全局作用域内变量的字典
locals() 返回当前局部作用域内变量的字典

人生苦短,我用python

新能源吧