函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
定义一个函数:
def 函数名(参数列表): 函数体#定义一个没有参数,没有函数体实现的函数;pass相当于占位符,使定义函数满足语法要求,或者是先定义一个函数名,后面再实现其功能
def func(): pass#定义一个add函数,参数为a,b,返回a+b的结果:
def add(a,b): return a+b print(add(1,2)) 3return函数最终返回的内容,如果没有写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