函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
定义一个函数:
def 函数名(参数列表):
函数体
#定义一个没有参数,没有函数体实现的函数;pass相当于占位符,使定义函数满足语法要求,或者是先定义一个函数名,后面再实现其功能
def func():
pass
#定义一个add函数,参数为a,b,返回a+b的结果:
def add(a,b):
return a+b
print(add(1,2))
3
return函数最终返回的内容,如果没有写return,则默认返回None,相当于return None
函数不一定要显式返回,具体要看函数的功能
函数分为内置的函数和自定义的函数两种
函数的作用:
1.封装,别人无须知道实现的细节
2.修改的时候,一处修改,全局生效
3.使用的时候方便,调用函数就可以了
什么时候会用到函数?
策略:
当你写了大段大段的相同或者类似地代码段后,就需要尝试去封装为函数。
如何写一个函数:
1.传参的类型判断,不符合计算规则的参数需要忽略或者其他处理。
2.思考需要声明哪些变量来存储计算结果和中间的计算过程值。
3.开始写的时候,最好加上中间状态的打印语句。一般用的逻辑是遍历+if判断+return短路等。
4.计算完毕,想清楚返回1个还是多个数据的结果。
函数的参数
可变长参数(参数数量不固定)
*arg:表示把可变的多个非命名参数,转换为了一个元组
**kw:表示把可变的多个命名参数,转换为了一个字典
例:
def add(a,*arg):
result = a
for num in arg:
result += num
return result
print(add(1,2,3,4))
10
def print_sth(a,**kw):
print(a)
for k,v in kw.items():
print(k,v)
print_sth(1,b=2,c=3)
*arg和**kw可以混合使用
def func(a,b,*arg,**kw):
result = a * b
for i in arg:
result *= i
for j in kw.values():
result *= j
return result
print(func(1,2,3,4,f=5)) #等价于1*2*3*4*5
函数传入的参数为不可变的,对外部的变量就没影响。
按值传–传入的不是变量对应的内存地址。
函数传入的参数为可变的,对外部的变量就有影响。
按引用传–传入的是变量对应的内存地址。
注:
不可变对象:所有的数字、字符串、元组
可变:set dict list 实例
参数传不可变对象的时候,函数内外变量值是独立的
参数传可变对象的时候,函数内外变量值是关联的
原则1:
如果你传入的参数是个变量a,这个变量是可变类型(list、dict、set)
那么函数内部对于这个参数的所有操作结果都会影响外部的参数值
原则2:
如果你传入的参数是个变量a,这个变量是不可变类型(字符串、整数、小数)
那么函数内部对于这个参数的所有操作结果不会影响外部的参数值
函数和方法
函数:不写在类里面
方法:写在类里面的
实例或类里的叫方法
不在实例或类里的叫函数
几种方法的区别
类方法、实例方法、静态方法
类方法可以被类对象或实例调用,实例方法只能被实例调用,它只属于类的单个实例拥有,静态方法两者都能调用,它在类和实例间共享。Python实现了一定的灵活性使得类方法和静态方法,都能够被实例和类二者调用。
所以三者主要区别在于参数传递上的区别,实例方法隐含传的参数是类实例self,而类方法隐含传递的参数是类本身cls,而静态方法无隐含参数,主要为了类实例也可以直接调用静态方法(方法的参数将在类/面向对象部分讲到,此处不做扩展)
Python类中隐藏数据
类中的方法名前后都有两个下划线,表示是Python的内置方法,如__init__()
类中的方法名前面有两个下划线,表示是Python中的私有方法,类似于java中的private,不能在类外部调用(如__setId()).
类中的属性前有两个下划线表示声明该属性为私有属性,不能在类的外部被使用或直接访问,如__name