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
原文地址:https://www.cnblogs.com/fukuda/p/5546785.html