python函数1(基础)
函数
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。
-
函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()
-
圆括号内可以用于定义参数,圆括号外紧跟冒号
-
函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明
-
函数内容(函数体)缩进(一般是四个空格键或一个Tab键)
-
return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None
2、语法
def 函数名(参数): #定义函数(声明),参数是形参 ''' 说明文档 ''' 函数体 return 表达式 #返回值 函数名(参数) #调用函数,参数是实参
函数声明时,括号里的参数称为形参,形参的值是不确定的,只是用来占位的。
函数调用时传递参数,函数调用时传入的参数,才是真正参与运算的数据,我们称为实参。
函数调用时,会把实参一一对应交给形参处理(位置传参),但也可以关键字传参,就不讲究位置了。
函数的返回值就是函数的执行结果,并不是所有函数都有返回值。
3、函数定义的几个建议
为了更好的阅读函数,程序员在进行函数定义时,时常对函数建议和说明:
a、对形参建议类型
b、对返回值建议类型
c、说明文档
def add(x: int, y: int) -> float: #参数x,y建议int,返回值建议float ''' #函数说明 函数add为加法运算 :param x:第一个加数 :param y:第二个加数 :return:返回和 ''' return x + y / 2 print(add(3, 4))
#5.0
注意:这里只是建议,如果类型不符合,只要符合语法规则,也不执行,不会报错。
def add(x: int, y: int) -> float: return x + y print(add('3', '4')) # '34'
二、关于函数名
虽然普通的标识符都能作为函数名,但为了便于阅读,一般函数名使用下划线”_“连接所有的单词,比如all_student
三、关于参数
1、默认参数
def func(x,y,z='Jack'): pass func(4,5,'Rose') #传递了参数 func(4,5) #缺省了一个参数z,就使用默认'Jack' func('hello','world') #位置传参:x='hello',y='world',z='Jack' func(y=5,x=4) #关键字传参,参数位置可以变化 func(5,z='Mike',y=4) #既有位置传参,又有关键字传参,位置参数一定放在前面
2、可变参数
可变参数有两种形式,带*号的和带**号的。带*号的变量变成存放多余实参的元祖;带**号的变量变成存放关键字实参的字典。
#def func(*args) 可变位置参数,参数以元组的形式存在args里 def add(x,y,*args): sum=x+y for arg in args: sum+=arg return sum print(add(1,3)) #arg=() print(add(1,3,5,7)) #arg=(5,7) #def func(**kwargs) 可变关键字参数,参数以字典的形式存在kwargs里 def multi(**kwargs): c=1 for m in kwargs.values(): c*=m print(c) multi(x=2,y=3,z=4) def func(*args,**kwargs): #组合使用 pass #arg=(1,3,5) kwargs={'a':'hello','b':'world'} func(1,3,5,a='hello',b='world')
3、参数传递方式
python中,根据实际参数的类型不同,函数参数的传递方式可分为 2 种,分别为值传递和引用(地址)传递:
a、值传递:适用于实参类型为不可变类型(字符串、数字、元组);
b、引用(地址)传递:适用于实参类型为可变类型(列表,字典);
值传递和引用传递的区别是,函数参数进行值传递后,若形参的值发生改变,不会影响实参的值;而函数参数继续引用传递后,改变形参的值,实参的值也会一同改变。
def func(a): a = 10 b = 2 func(b) #实参b是不可变数据类型 print(b) # 结果是 2 def func(mylist): mylist.append([1,2,3,4]) print ("函数内取值: ", mylist) return mylist = [10,20,30] func(mylist) #实参mylist是可变数据类型 print("函数外取值:",mylist) #运行结果: 函数内取值: [10, 20, 30, [1, 2, 3, 4]] # 函数外取值: [10, 20, 30, [1, 2, 3, 4]]
4、函数返回值
一般情况下,一个函数最多只会执行一个return语句。
一个return语句可以返回多个值:
-
return [x,y] 返回列表
-
return {‘x’:x,‘y’:y} 返回字典
-
return (x,y)或return x,y 返回元组
5、函数中的变量
函数内的变量称为局部变量,局部变量只能在函数内部使用。
函数外的变量称为全局变量,全局变量在整个程序中都可以调用。
-
全局变量和局部变量可以同名(函数外全局变量,函数内局部变量)
-
函数内部要修改全局变量,在函数内声明: global 变量名
-
对于嵌套多层的函数,使用nonlocal关键字可以将名字声明为来自外部嵌套函数定义的作用域(非全局),nonlocal x会从当前函数的外层函数开始一层层去查找名字x,若是一直到最外层函数都找不到,则会抛出异常。
-
在函数内可以调用内置函数locals()输出所有局部变量,调用globals()输出所有全局变量
-
在Python里,只有函数能够分割作用域
6、函数对象
def add(x,y): return x+y def foo(x,y,func): return func(x,y) def bar(): return add func = add print(func(2, 3)) # 函数被引用 dict={'add':add,'max':max} print(dict['add'](4, 5)) # 函数可以作为容器类型的元素 print(foo(8, 9, add)) # 函数可以作为参数传入另外一个函数 f=bar() print(f(-5, -4)) # 函数的返回值可以是一个函数