python编程:python程序员需要掌握的函数开发与函数式编程技术
在python中定义类要使用class关键字,定义方法和过程要使用def关键字
程序定义了一个方法,一个过程,区别就是方法内有return返回值就是方法,而没有写return返回值就是过程,从输出fun2()来,可以看出来,过程虽然没有return返回值,但是掉用该过程的时候,会默认返回none
在定义方法和过程的时候一般写上对该方法和过程的描述"""描述""",方便其它人快速明白该方法的用处
函数的返回值
python函数返回值有三种情况,
情况一,没有返回值return,则默认返回None
情况二,返回一个值,则返回这个值
情况三,返回多个值(多个值用逗号隔开),则这多个值封装成一个元组返回
返回多个值
函数的参数
在一个方法的后面的括号可以有多个参数用逗号隔开,这个参数就是函数的参数,这个参数就是形参,在调用函数的时候,需要传递给函数具体的值,这个是实参,只有传递给函数确定的值,函数才能正常运行。
fun方法有两个参数,假如调用的时候传递少一个参数或者多一个参数就都会出错
调用函数时,必须要参数的数量要匹配,可以给方法的参数设置默认值,这样调用方法的时候若不传递给方法值那么默认值就会起作用。
注意默认值的设置类似于Java的可变参数一样,一定要从后面开始设置,不能前面设置了默认值,而后面没有设置,这是会出问题的。比如
该方法出问题就是前面给x设置了默认值,而后面的y却没有默认值,会出问题
这样在y设置了默认值,就可以了,因为y是最后一个,所以y后不可能有参数没有设置默认值了,所以我们调用fun方法可以值传递一个参数2,这样x=2,y=1
调用有参函数传递参数的方式
方式一:位置参数调用,实参顺序与形参顺序一一对应的传递
方式二:关键字调用,调用位置无需一致
方式一很简单,是我们平时调用函数的时候都是通过这种方式
方式二演示
正常顺序应该式先传递x的值,在传递y的值,但是使用关键字的调用,实现了先传递y的值,在传递x的值
关键字传递参数值和Java可变参数一样,必须在后面,也就是说下面是错误的:
因为在关键字传递的后面还有,还有一个不是关键字传递的,这就会出错,关键字传递的后面应该全是关键字递的,且要保证每一个没有设置默认值的参数都被传上参数
在python中也有类似java中的可变参数,可以接受不定参数个数的实参,有以下几种
参数组
参数组在方法的形参位置使用*参数名的方式,可以接受多个位置参数,并将多个位置参数封装成一个元组如
fun(1,2,3,4,5,6,7)则将2,3,4,5,6,7封装成一个元组args就是一个元祖(2,3,4,5,6,7)
参数组除了可以赋值普通位置参数之外还可以赋值列表,方式就是实参*列表,如
fun(1,*[1,2,3,4,5,6])这样会将这个列表封装成一个元组(1,2,3,4,5,6)
**kwargs
把实参传递的多个关键字参数转成字典
它会把前面的参数都匹配好,剩下的关键字参数都会被转成字典
也可以直接赋值**{字典}如:
python程序的运行顺序
python的执行顺序是从上至下,到哪里就把程序放入内存,所以调用方法时要注意的一点是,如果执行方法的语句执行时,但是它所调用的方法还没有放到内存中会出问题(方法并不一定要在调用方法的前面)
之所以出问题就是因为在调用fun方法的时候,fun方法并没有放入内存中,所以找不到fun方法就认为是没有定义
虽然fun1方法在调用的该方法的下面但是不会出问题。因为在执行到fun(22)的时候,fun1方法已经放到了内存中,所以在fun中调用fun1方法的时候是不会出问题的
局部变量和全局变量
定义在方法中的变量就是局部变量,局部变量的作用域在整个方法中,除了局部变量之外其它的变量就是全局变量,在方法中可以使用全局变量并可以修改其值,但修改效果的作用域只会存在该方法内,要想在方法中要想给全局变量修改值在全局有效,需要使用global关键字
根据程序运行结果可以看出来,在fun()中使用了关键字global修改全局变量y,导致在方法外值为2,不是1,就是说作用效果在整个程序中
这个方法是外面定义了全局变量,然后在方法中进行修改,也可以直接外面不定义全局变量,直接在方法内部定义全局变量
这是可行的,但是不建议用,这里只是说明以下,可以在方法内部定义全局变量
注意:在其它程序中不光定义在方法中的变量是局部变量,定义在if,while,for内的变量也是局部变量,然后随着执行的结束而被释放,但是python,在上面的几个结构中定义变量不是局部变量而是全局变量,执行完之后不会被释放。
方法中要想操作全局变量使得在方法操作的效果能够在不随着方法的执行完而消失需要使用global,这是基本类型的变量,比如数字还有字符串,但是集合,列表,字典,类不用使用关键字global,这些全局变量只要在方法中修改,其修改效果是全局的
没有是用关键字global
高阶函数
情况一:如果一个函数可以接受另外一个函数作为参数,那么这个函数就是高阶函数
情况二:一个函数的函数名被另一个函数当作返回值返回,则这个函数就是高阶函数
由两种情况之一就可以说是高阶函数
该程序两种情况都有,情况一方法名作为参数进行传递,方法二,方法名作为返回值返回
其实方法也是变量,方法名就是变量名指向方法,输出方法名print(fun)就是输出这个方法的内存地址,可以通过方法名()来实现对方法的调用
匿名函数lambda
匿名函数就是没有名字的函数,它的缺陷就是方法体不能太复杂,只能执行简单的方法体
匿名函数的格式是变量=lambda 方法参数:函数体
可以将这个匿名函数赋值给一个变量,然后通过这个变量来操作这个匿名函数