pythoning——8:函数初识
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pythoning——8:函数初识相关的知识,希望对你有一定的参考价值。
学习过C、C++、java。其他语言也有接触过oc什么的,其实这么多语言,确实没见过有谁会在一个代码文件里实现成千行上万的代码,通常会通过一个叫做方法的东西去来回传递处理数据神马的。这个方法就是python中的函数。
这里会分以下几点来介绍python的函数:
函数的特点
函数的定义
函数的调用
函数的作用域
函数的参数
函数的递归
函数的装饰器
在介绍函数前,首先需要了解python函数的位置,以及它的作用时间。
函数一般是放在执行代码前的,它在代码调用它之前应该处于已定义的状态,而在调用之前,函数是不会执行其内部的代码的。python不存在什么多态,函数标识符一旦相同,后者便会重写前者,并不会像java中什么方法重载之类的。
函数的特点
嗯,python函数跟其他编程语言想同,并没啥特别的特点。函数都是包装好的,可以重复使用的,可以实现某一功能的代码。它的存在可以节省代码的编写量,提高开发效率和可读性。
函数的定义
定义一个函数首先需要的是关键字def,其次是函数标识符即函数名,然后小括号,里面可以不写参数,然后冒号:,OK,闻名不如见面。
>>> def fun(): ... pass ... >>> type(fun) <class ‘function‘>
函数默认返回值为None,可以指定返回值。
>>> def fun(arg): ... return arg ... >>> def fun1(arg): ... pass ... >>> print(fun(1)) 1 >>> print(fun1(1)) None
总的来讲,以def来声明要定义函数,函数名用来标识函数,方便其他代码调用,参数用来输入,返回值用来输出。
函数的调用
调用函数的话,需要看是否调用的为该文件的函数,调用是直接通过函数标识符,传递参数即可。如果不是,则需要import导入,然后才能去调用,否则会报错。
>>> print(datetime.now()) Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name ‘datetime‘ is not defined >>> from datetime import datetime >>> print(datetime.now()) 2016-05-31 17:28:49.601103
函数的作用域
参数值如何传递给函数中的,在函数中修改参数值,在函数外部是否会有效,或者直接外部定义一个变量,内部是否可以调用?
首先参数值是在通过调用函数的时候直接传递的,如果再函数中单纯的只是重新赋值则不会有效,如果直接调用外部的一个变量则不会有效
>>> def fun(arg): ... arg = ‘fesh‘ ... age = 32 ... >>> name = ‘fukuda‘ >>> age = 23 >>> fun(name) >>> name ‘fukuda‘ >>> age 23
既然说了如果,肯定就会有但是,在函数中可以对参数进行修改,如字典、列表、集合等进行添加、删除、更新等操作,可以对一个全局变量进行声明,然后便可对其进行更改操作
>>>def func(arg): ... arg.append(1) ... global name ... name = ‘func_fukuda‘ >>>name = ‘fukuda‘ >>>a = [4,5,6] >>>func(a) >>>print (name) func_fukuda >>>print(a) [4, 5, 6, 1]
函数的参数
python中函数的参数理论上就是你必须按照函数定义时有多少形参,调用时就必须传多少实参。否则便会报错。
>>> def fun(arg): ... pass ... >>> fun(‘test‘) >>> fun() Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: fun() missing 1 required positional argument: ‘arg‘
为什么说理论上呢。因为有种形参,无论接收任何形式,任意多的值,都可执行。
>>> def fun(*arg,**kwargs): ... pass ... >>> a = [1,2,3] >>> b = 1 >>> c = ‘str‘ >>> fun(a,b,c)
其实说它是例外也并不是,因为python中有指出带*的可以匹配元组,列表,字典等等,**与*则相当于copy与deepcopy的干系吧。
函数的递归
函数本身调用本身,这个在java和C语言中应该并不少见,比如汉诺塔什么的,不过这里就不举汉诺塔的例子了。
>>> def fun(arg): ... print("".join(("第", str(arg), "次调用fun"))) ... if arg < 5: ... arg = arg+1 ... fun(arg) ... else: ... return arg ... >>> fun(1) 第1次调用fun 第2次调用fun 第3次调用fun 第4次调用fun 第5次调用fun
函数的装饰器
当一个项目中有N多个函数,且相当数目的函数需要同样的功能,则lower需要去挨个添加需求,但资深pythoner就会去使用这项神器,装饰器。
字面理解,装饰器就是用来装饰函数的。但我更倾向于它是用来重写函数的,当然不会对函数本身有任何更改操作的原则,否则就会失去其意义。装饰器尽量不要重新定义返回值,沿用函数本身即可,装饰器可以用来做权限管理,额,还可以做为将来编写jango的代码,这样那样的。
>>> def outer(func): ... def inner(): ... print("before") ... a = func() ... print("after") ... return a ... return inner ... >>> @outer ... def f1(): ... print(‘f1‘) ... >>> f1() before f1 after
以上是关于pythoning——8:函数初识的主要内容,如果未能解决你的问题,请参考以下文章