函数

在交互式命令窗口中可以通过help(function)命令查询相关函数的帮助信息。

  • 函数别名
python中函数名就是指向一个函数对象的引用,可以将一个函数名赋给一个变量,就好比给这个函数起了个别名。而c++中只能将函数的返回值赋给变量,不能直接将函数名赋值给变量。
  • 定义函数

定义规则:

1、函数代码块以def(define function)关键词开头,后接函数名和“()”,括号内为函数参数。

2、所有传入的参数和自变量都必须放在圆括号内,也可以在圆括号中定义参数。

3、函数的第一行语句可以选择性使用文档字符串,用来存放函数说明。

4、函数内容以冒号开始(与循环语句的语句块类似),首行缩进需要相同。

5、return 表达式,函数结尾,选择返回某个值,没有return相当于返回None。

注意:

1、函数名只能以字母开头,可以包括下划线,另外,函数名不能和关键字相同。

2、函数体的语句可以是任意数量,但每个语句必须 保持相同的首行缩进且至少要有一个首行缩进。(函数体中,首行缩进结束就意味着函数结束。)

3、没有return语句时,结束后函数默认返回None。

4、return none等同于return。

5、定义一个空函数可以在函数体中使用pass语句。

  • 函数的参数

1、必须参数

必须参数必须以正确的顺序传入参数,即定义不同的参数类型需要对号入座。


如果不传入参数或传入参数没有对号入座或传入参数个数多余、少于定义的必须参数,都会报错。

2、关键字参数

关键字参数和函数的调用关系紧密,函数调用使用关键字参数确定传入的参数值。只要指定参数名,输入参数就可以得到正确的结果,参数的传入顺序对结果没有影响。但在传入参数时需要指定参数名,举个栗子:


为函数传入参数时,可以直接对关键字参数‘赋值’,而达到传入参数的目的,因此,即使没有按照顺序传入参数,也能够得到想要的结果。而在C++中,传入参数需要一一对应,不能改变顺序。

3、默认参数

调用函数时,如果没有传入参数时,就会使用默认参数。如果传入了参数,则调用函数时以传入的参数为标准。另外,和c++一样,默认参数一定要排在非默认参数的后面。

tip:如果想要更改某一个 默认参数的值,但又不想更改其他的默认参数的值,并且想要更改的参数的位置不是第一个,则可以通过参数名更改默认参数的值(对想要更改的默认参数“赋值”),但需要注意的是,同一个语句中如果已经通过参数名更改某个默认参数,那么其他默认参数的值更改时也需要使用参数名更改,否则会报错。

4、可变参数(参数名可变)

可变参数在声明时不需要名命:

def function([formal_ages,]*var_args_tuple):

        “函数——文档字符串”

         function_suite

         return [expretion]

有星号(*)的变量名能够存放所有未命名的变量参数,如果调用函数时没有指定参数,那么就是一个空元组。调用函数时也可以传入多个参数。

(*)星号在字典中的应用:用两个星号(**)处理关键字时,可以将字典的所有键-值对传入。

5、组合参数

函数定义时可以同时使用必须参数、关键字参数、默认参数和可变关键字参数。另外,任意函数都可以通过:fun(**arges,**kw)的方式调用(元组、字典的传值)。


  • 变量作用域

1、局部变量:和c++一样,局部变量只能在函数内部被使用,不能在函数之外使用。定义:定义的变量如果在函数体中第一次出现,那么 这个变量就是局部变量。另外,在函数体中改变变量的值,并不会更改函数外的值。

2、全局变量:一段代码最开始赋值的变量可以被多个函数引用。全局变量可以在全局使用,在函数体中更改全局变量的值不会影响全局变量在其他函数中的使用。另外,在函数体中使用某个与全局变量同名的变量时,该函数默认使用局部变量。若要在函数中将某个变量定义为全局变量,只需在定义的变量前加一个关键字“global”即可,定以global变量后在函数体中对该变量的其他任何操作都是全局性的。

  • 返回函数(返回一个内部函数)

每次调用外部函数,返回的内部函数都是一个新的函数,即使参数完全相同,返回的内部函数也是一个全新的函数(相当于每次调用外部函数,内部函数都会重新定义并执行。

闭包:如果在一个内部函数里对外部函数(不是在全局作用域)的变量进行引用,内部函数就被认为是闭包。

  • 递归函数

和C++一样,递归函数有定义简单、逻辑清晰的优点。

当参数过大时,递归函数可能会出现栈溢出的问题,解决递归调用栈溢出的方法是通过尾递归优化(在函数返回时调用函数本身)。举个栗子:

def fact(n):

  return fact_iter(n,1)

def fact_iter(num,product):

  if num==1:

    return product

  return fact_iter(num-1,num*product)

返回递归函数本身时,num-1和num*product都会在函数调用前计算,不会占用栈。

  • 匿名函数

python中使用lambda创建匿名函数,lanmbda的主体是一个表达式,而不是代码块,因此只能定义一些简单的函数,此外需要注意的是,lambda函数用有自己的命名空间,不能访问自有参数列表之外或全局名命空间的参数。

lambda[arg1[,arg2...argn]]:expression

例:def fun(x,y):

           return x+y

lambda函数:

lambda x,y:x+y

lambda函数一般和filter等函数结合使用。

filter函数:用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。

接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。

def func(x):

  return x>3

f_list=filter(func,1,2,3,4,5])

print('大于3的元素有:',[item for item in f_list])

使用lambda函数:

print('大于3的元素有:',item for item in filter(lambda x:x>3,[1,2,3,4,5])])

另外,lambda函数中不能有return,不过冒号:后就是返回值。

考虑使用匿名函数的几种情况:

1、程序一次性使用、不需要定义函数名时,使用匿名函数可节省内存中变量定义空间;

2、匿名函数可使程序更加简洁;

注意:

1、一行表达式,必须有返回值;

2、不能有return;

3、可以没有参数,也可以有多个参数。

  • 偏函数

偏函数是将所要承载的函数作为partial()函数的第一个参数,原函数的各个参数一次作为partial()函数的后续参数,除非使用关键字参数。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值