python 函数
def 函数 function
函数是可以重复执行的语句块,可以重复调用
作用:
1. 用于封装语句块,提高代码的重用性
2. 定义用户级别的函数
3.函数外部不可以访问函数内部的变量空间,在函数内可以访问函数外的变量,但不能修改此变量,
出了函数,变量的值又变会全局变量的值。
4.如果函数内部没有return返回值,那么函数调用完毕后默认返回None
5. 如果函数想要返回其他对象需要返回return语句
6、以后不要用sum list...做变量名,因为你用完后,sum 函数将不能求和,list函数将不能格式化列表
x = int(input("请输入数字:")) 当需要返回值是数字时,需要把input的返回值整型格式化
print()函数输出的时候如果遇到数字,需要将数字str()字符串格式化
函数没有返回值时:返回None
函数return返回一个值时:返回object
函数return返回多个值时:返回tuple
传参
位置传参
实参和形参的位置必须一一对应
序列传参
用*,序列拆解的位置与形参一一对应
def myfun1(a,b,c): print('a的值是:', a) print('b的值是:', b) print('c的值是:',c) s1 = [11,22,33] myfun1(*s1) #相当于myfun1(11,22,33) myfun1(s1[0],s1[1],s1[2]) t1 = (44, 55, 66) myfun1(*t1) myfun1(*"ABC")
关键字传参
按形参的名子给形参赋值,实参名必须与形参名进行匹配(形参与实参个数必须一一对应,不能不相等)
字典关键字传参
指定实参为字典,将字典用’**’,拆解后在进行关键字传参的传参方式
def myfun1(a, b, c): # 这是一个函数的传参示例,此函数以后不会改变代码 print('a 的值是:', a) print('b 的值是:', b) print('c 的值是:', c) d = {'a': 100, 'b': 200, 'c': 300} myfun1(**d) # 等同于 myfun1(a=100,b=200,c=300) # 下是错误做法 # d2 = {'a': 100, 'b': 200, 'c': 300, 'd': 400} # myfun1(**d2)
说明:位置传参要在关键字传参(字典关键字传参)的左边
def myfun1(a,b,c):
pass
#调用时
Myfun(100,*[200,300])
Myfun(*(100,200),300)
Myfun(*[100],200,*[300])
Myfun(100,c=300,100) #错误
Myfun(100,**{‘c’:300,’b’:200})
形参
函数的缺省参数:
def 函数名(形参名=默认实参1,形参2=默认实参2,…)
说明:缺省参数必须自左向右依次存在,如果第一个参数有缺省参数,那么其右侧的所有参数必须都为缺省参数
位置形参
语法:
def 函数名(形参名1,形参名2,…)
语句块
星号元组形参
语法:
def 函数名(*元组形参名)
语句块
作用:收集多余的位置传参,如果传入的是关键字,是接收不了的(空元组)
def func (*args): print(“参数个数是:”,len(args)) print(“args:”,args) fun() fun(1,2,3,4) fun(*”ABC”,1,2,3,None,False)
命名关键字形参
语法:
def 函数名(*,命名关键字形参)
语句块
或
def 函数名(*args,命名关键字形参)
语句块
作用:强制索引的参数都必须用关键字传参或字典关键字传参
def fa(*, a, b): print('a=', a) print('b=', b) def fb(*args, a, b): print("args=", args) print('a=', a) print('b=', b) # fa(b=1, a=2) fa(**{'b': 200, 'a': 100}) #fb(1, 2, 3, 4, b=200, a=100)
双星号字典形参
语法:
def 函数名(**字典形参名)
语句块
作用:收集多余的关键字传参
说明:字典的形参名通常命名为”kwargs”
def fa(**kwargs): print("关键字传参的个数是:", len(kwargs)) print('kwargs=', kwargs) fa(name='tarena', age=15) fa(a=1, b='BBB', c=[2,3,4], d=True) #传入的是字典
函数的参数说明:
位置形参,缺省参数,星号元组形参,双星号字典形参可以混合使用
def name(位置形参,星号元组形参,命名元组形参,双星号字典形参):
实例:
def fx(a,b,*args,c,**kwargs):
pass
fx(100,200,300,400,c=”c”,d=”D”,e=”E”)
函数的不定长参数:
星号元组形参,双星号字典形参
说明:
可以接受任意的位置传参和关键字传参
def fn(*aegs,**kwargs):
pass
局部变量:local variable
1、局部变量在函数调用时才能够被创建,在函数调用之后会自动销毁
全局变量:global variable
2、全局变量所有函数都可以访问(但函数内不能直接赋值)
args 作为函数的参数
locals() 返回局部变量的字典
globals() 返回全局变量的字典
作用:可以使用字典键索引来返回全局变量或者局部变量的值
函数变量
函数名是一个变量,它在def语句创建函数时绑定一个函数
函数可以用变量来绑定
def fa(): print('你好') def fb(): print("好") f1 = fa # 这里没有括号f1绑定的是函数 f2 = fb f1() # 调用f1绑定的函数 f2() # 调用f2绑定的函数 def f1(): print('你') def f2(): print('好') f1, f2 = f2, f1 f1() # 调用的是f2函数
把函数当做一个变量来玩
一个函数,可以作为另一个函数的实参传递
1 def f1(): 2 print("f1被调用:") 3 def f2(): 4 print("f2被调用") 5 def fx(fn): 6 print(fn) 7 fn() 8 fx(f1) # 这里调用的是fx 9 fx(f2)
1 def myinput(fn): 2 L = [5,6,7,9,2] 3 return fn(L) 4 print(myinput(sum))#29 5 print(myinput(max))#9 6 print(myinput(min))#2 7 print(myinput(len))#5
函数可作为另一个函数的返回值
def get_op(): s = input("请输入你要操作的数:") if s=="求最大:": return max elif s=='求最小': return min elif s == '求和': return sum L= [2,3,5,7,4] f = get_op() print(f(L))
函数的嵌套:
函数的嵌套定义是指一个函数里用def语句来创建其他的函数的情况
def fn_outter(): print("fn_outter函数被调用") def fn_inner(): print("fn_inner被调用") fn_inner() fn_inner() print("fn_outter调用结束") fn_outter()
global 语句
作用:
1、告诉解释执行器global语句声明的一个或多个变量,这些变量的作用域为模块级的作用域,也称作全局变量
2、全局变量(global):
将赋值语句操作的变量映射到模块文件内部的作用域
语法:
global 变量1,变量2,…..
说明:
1、全局变量如果要在函数内部被赋值,则必须经过全局变量声明(否则会被认识是创建局部变量)
2、全局变量在函数内部不经过声明就可以直接访问()
3、不能先声明局部变量,再声明为全局变量
4、global变量列表里的变量名不能出现在此作用域的形参列表
nonlocal语句
作用:告诉解释执行器,nonlocal语句声明的不是局部变量,也不是全局变量,他是外部嵌套函数内的变量
语法:nonlocal 变量名1,变量名2,….
说明:
1、nonlocal只能被函数嵌套时使用
2、访问nonlocal变量将对外部嵌套函数作用域内的变量进行操作
3、访问nonlocal变量只对最近一层变量进行操作
4、nonlocal语句的变量列表里的变量名,不能出现在此函数的参数列表里
lambda 表达式(又称匿名函数)
作用:创建一个匿名函数对象,但不提供函数名
格式:lambda[参数1,参数2,…..]:表达式
myadd = lambda x,y:x+y
说明:
1、lambda表达式创建的函数只能包含一条表达式
2、lambda用来创建一个函数对象
eval()/exec()函数
eval(srouce,globals=None,local=None)
把字符串 srouce当成一个表达式来执行,返回表达式执行的结果
x = 100 y =200 s = 'x+y' a = eval(s) b = eval("x+y",{'x':1,'y':2}) c = eval("x+y",{'x':1,'y':2},{'x':34,'y':1}) d = eval("x+y",{'x':1,'y':2},{'y':1}) print(a)#300 print(b)#3 print(c)#35 print(d)#2
exec(srouce,globals=None,local=None)
把一个字符串srouce当成程序来执行,返回表达式执行的结果
s = """print("hello world") x =100 x += 200 print("x=",x) """ exec(s)#hello world x= 300
函数的文档字符串(就是在开始写函数时,先用字符串说明该函数是用来做什么的)
函数内第一次未被赋值给任何变量得字符串是此函数的文档字符串
语法:
def 函数名(参数列表):
'函数文档字符串'
函数语句块
示例:
def myfun(name,x):
'''这是函数的文档字符串
name 表示人名
x 表示钱数
'''
pass
>>>help(myfun)
说明:
1、文档字符串通常用来说明本函数的功能和使用方法
2、在交互模式下输入:help(函数名) 可以查看函数的'文档字符串'
3、函数的文档字符串绑定在函数的__doc__属性上
def fun(): "这是一段文档字符串" pass print(fun.__doc__) # 这是一段文档字符串 print(help(fun)) # Help on function fun in module __main__: # fun() # 这是一段文档字符串 # None
函数定义语句(def 语句) 的完整语法:
[@装饰器1]
[@装饰器2]
[...]
def 函数名([位置形参], [*元组形参], [命名关键字形参], [**字典形参]):
'''文档字符串'''
语句块
注: [] 代表其内部可以省略