Python中的函数
认识函数:在一个完整的项目中,某些功能会反复的使用。那么我们会将功能封装成函数,当我们要使用这个功能的时候,直接调用函数即可
**本质:**函数就是对功能的封装
优点:
1简化代码结构,增加了代码的复用度(重复使用的程度)
2如果想修改某些功能或者调试某些BUG,还需要修改对应的函数即可
参数:
**不可变类型:**类似 c++ 的值传递,如 整数、字符串、元组。。
**可变类型:**类似 c++ 的引用传递,如 列表,字典。
形参(形式参数):定义函数时小括号中的变量,本质是变量。参数必须按顺序传递,个数要相对应。
实参:指的是函数在被调用的过程中传递进来的参数。
如果有额外的 位置参数(args) 或者 关键字参数(*kwargs) 被传给了这个partial对象,那它们也都会被传递给func函数,如果一个参数被多次传入,那么后面的值会覆盖前面的值。
1.定义一个函数
定义函数:
格式:
def 函数名(参数列表):
语句
return 表达式
def:函数代码块以def关键字开始
函数名:遵循标识符规则
参数列表:(参数1,参数2,……,参数n):任何传入函数的参数和变量必须放在括号之间,用逗号分隔,函数从函数的调用者在哪里调取的信息
冒号: 函数内容以冒号开始,并且缩进
语句:函数封装的功能
return:一般用于结束函数,并返回信息给函数的调用者
表达式:即为要返回给函数的调用者的信息
注意:最后的renturn 表达式,可以不写,相当于returnNone
2.值传递:
传递的是不可变类型
string,tuple,number是不可变得
引用传递:
传递的可变类型
list,dict,set
def funcl(num): #值传递
num = 10
temp = 20
funcl(temp)
print(temp)
#(输出)20
def func2(list): #引用传递
list[0] = 100
li = [1,2,3,4,5]
func2(li)
print(li)
#(输出)[100, 2, 3, 4, 5]
3.关键字
概念:允许函数调用时参数的顺序与定义时不一致
def myprint(str, age):
print(str, age)
myprint(age = 18,str = "sunck is a god man")
#(输出)sunck is a god man 18
4.默认参数
默认函数:
概念:调用函数式,如果没有参数,则使用默认参数
def myprint(str, age):
print(str, age)
myprint() # 不写报错
#(输出) TypeError: myprint() missing 2 required positional arguments: 'str' and 'age'
#设置默认参数值(要用默认参数,最好将默认参数放到最后)
def myprint(str = "sunck is a good man ", age = 18):
print(str, age)
myprint()
#(输出)sunck is a good man 18
myprint("jierui dood" , 17) #输出为 jierui dood 17
#(输出)jierui dood 17
def myprint(str,age1 = 18): #要用默认参数,最好将默认参数放到最后
print(str, age1)
myprint("sad") #输出 sad 18
5.不定长参数
概念:能处理比定义时更长的参数。
加*号的变量存放所有未命名的变量参数,如果在函数调用时没有指定参数,他就是一个空元组。
def func(name):
print(name)
func("sunck","good","nice") # 这样会报错
#(输出)TypeError: func() takes 1 positional argument but 3 were given
#加*号的变量存放所有未命名的变量参数,如果在函数调用时没有指定参数,他就是一个空元组
def func(name,*args):
print(name)
print(type(args)) # arrgs 为一个元组
for x in args:
print(x)
func("sunck","good","nice") #这样就能输出
#(输出) sunck
<class 'tuple'>
good
nice
**6.代表键值对应的参数字典。
和*代表的意义类似
def func2(**kwargs):
print(kwargs)
print(type(kwargs)) #字典
func2(x=1,y=2,z=3)
#(输出) {'x': 1, 'y': 2, 'z': 3}
<class 'dict'>
func2(1,2,3) #报错
#(输出)TypeError: func2() takes 0 positional arguments but 3 were given
7.任意参数
如果有额外的 位置参数(args) 或者 关键字参数(*kwargs) 被传给了这个partial对象,那它们也都会被传递给func函数,如果一个参数被多次传入,那么后面的值会覆盖前面的值。
def func3(*args,**kwargs):
pass #不写,输出空白语句
#(输出)
8.多位数的和
def mysum(*q):
sum = 0
for i in q:
sum += i
return sum
print(mysum(1,2,3,4,5))
#(输出)15
9.匿名函数
概念:不使用def这样的语句定义函数,使用lambda来创建匿名函数
特点:
1 ,lambda只是一个表达式,函数比def简单
2, lambda的主题是表达式,而不是代码块,仅仅只能在lanbde表达式中封装简单的逻辑
3, lambde函数有自己的命名空间,且不同访问电脑自有参数列表之外的或者全局命名空间的参数
4, 虽然lambda是一个表达式且看起来只能写一行,与c和c++内联函数不同
格式:lambda 参数1,参数2,……,参数n:espression
**注意:虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率
sum = lambda num1,num2:num1 + num2
print(sum(1,2))
#(输出)3
10.函数的返回值定义return
return语句[表达式]退出函数,选择性地向调用方返回一个表达式。不带参数值的return语句返回None。之前的例子都没有示范如何返回数值.
def mysum(num1,num2):
#将结构返回给函数的调用者
return num1 + num2
#执行完return语句,该函数就结束,return后面的代码不执行
prnit("****U*")
res = mysum(1,2)
print(res)
#(输出)3 #并没有执行print("****U*")语句
11.全局变量和局部变量
定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。
局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用域中。
# 可写函数说明
def sum(arg1, arg2):
# 返回2个参数的和."
total = arg1 + arg2; # total在这里是局部变量.
print("函数内是局部变量 : ", total)
return total;
#(输出)函数内是局部变量 : 30
sum(10, 20) # 调用sum函数
print("函数外是全局变量 : ", total)
#(输出)函数外是全局变量 : 0
12.函数嵌套
定义:在一个函数的函数体内用def去声明新的函数
def yao1(a,b):
def yao2(c):
def yao3(d):
def yao4(e):
return a+b+c+d+e
return yao4
return yao3
return yao2
print(yao1(1,4)(2)(3)(4))