zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    使用 Facebook开源动画库 POP 实现真实衰减动画
    在命名空间下定义类型
    作为程序猿我给csdn博客加入打赏功能
    linux高可用集群heartbeat实现http的高可用
    杭电 HDU 1247 ACMHat’s Words(trie树 或着STL)
    取石子(一)-博弈数论
    区块链技术开发怎么结合已有产业链落地?
    KafkaConsumer assign VS subscribe
    KafkaConsumer assign VS subscribe
    KafkaConsumer assign VS subscribe
  • 原文地址:https://www.cnblogs.com/fukuda/p/5546785.html
Copyright © 2011-2022 走看看