美文网首页
Python 学习日志第四篇(912)

Python 学习日志第四篇(912)

作者: Qin0821 | 来源:发表于2018-08-03 19:08 被阅读0次

    函数

    函数是一大块可重用的代码。它是有名称的代码块,接受输入、提供输出并可存储在文件中供以后使用。

    给函数名赋值

    >>> dir = 3
    >>> dir
    3
    >>> dir()
    Traceback (most recent call last):
        File "<pyshell#28>", line 1, in <module> dir()
    TypeError: 'int' object is not callable
    

    这里让dir 指向了数字3, 导致你再也无法访问dir原来指向的函数!要恢复原样,需要重启Python。

    定义函数

    与变量名一样,函数名也只能包含字母、数字和下划线_,而且不能以数字打头。

    下面是一个计算圆面积的函数:

    # area.py
    import math
    
    
    def area(radius):
        """
        Return the area of a circle
        with the given radius.
        For example:
        >>> area(5.5)
        95.03317777109125
        """
        return math.pi * radius ** 2
    
    
    一种格式约定

    Python文档字符串通常遵循一种标准的格式约定:用三引号标识文档字符串的开始和结束位置;第1行是函数的简要描述;接下来是详情和示例。

    文档字符串的其他好处

    与内置函数一样,你也可轻松地查看自己编写的函数的文档字符串,如下所示:

    >>> print(area.__doc__)
    Returns the area of a circle with the given radius.
    For example:
    >>> area(5.5)
    95.03317777109125
    

    当在IDLE编辑器中调用area时,IDLE将自动读取该函数的文档字符串,并将其作为工具提示显示出来。
    Python还有一个很有用的工具——doctest,可用于自动运行文档字符串中的Python示例代码。

    函数的组成部分

    属于说明

    除了返回值外,函数以其他任何方式所做的修改都被称为副作用(side effect);打印到屏幕、写入文件和下载网页都属于副作用。
    有一种名为函数式编程的编程风格,其特征是几乎消除了副作用。在函数式编程中,你只能通过返回值来完成修改。
    使用正确的情况下,函数式编程是非常优雅而又强大的程序编写方式。

    变量的作用域

    全局变量

    要访问全局变量,必须使用关键字global:

    name = 'Jack'
    def say_hello():
      print('Hello' + name + '!')
    def change_name(new_name):
      global name
      name = new_name
    
    >>> say_hello()
    Hello Jack!
    >>> say_hello()
    Hello Piper!
    

    使用main函数

    其他语言中的main函数

    使用main函数的做法非常普遍,有些编程语言(最著名的是C、C++和Java),还要求必须使用main函数。但在Python中,main只是一种约定,完全是可选的。

    使用main函数的优点是,可更轻松地反复运行程序,还可传递输入值。

    函数的参数

    按引用传递

    向函数传递参数时,Python采用按引用传递的方式。这意味着当你传递参数时,函数将使用新变量名来引用原始值。例如:

    def add(a, b):
        return a + b
    
    >>> x, y = 3, 4
    >>> add(x, y)
    7
    

    在第一行设置x和y后,x、y将分别指向3和4.当调用add(x, y)时,Python创建两个新变量——a 和 b,它们分别指向x和y的值。并没有复制实参的值,而是给它们指定新名称,而函数将使这些新名称来引用它们。
    将a和b相加后,函数返回,而a和b被自动删除。在整个函数调用过程中,x和y为未受影响。

    按值传递

    有些编程语言(如C++)可按值传递参数。按置传递参数时,将创建其拷贝,并将该拷贝传递给函数。如果传递的值很大,复制可能消耗大量时间和内存。Python不支持按值传递。

    一个重要示例

    按引用传递简单而高效,但是有些事它做不了。例如:

    def set1(x):
        x = 1
    

    函数set1想将传入的变量的值设置为1

    >>> m = 5
    >>> set1(m)
    >>> m
    5
    

    m的值根本没变。为帮助理解,将这个示例分解成下面几步:

    1. 将5赋给m。
    2. 调用set1(m): 将m的值赋给x,这样m和x都指向5。
    3. 将1赋给x。
    4. 函数set1结束后,x被删除。
      在函数set1中,根本不能访问变量m。

    默认值

    同Kotlin

    关键字参数

    在Python中,另一种很有用的参数指定方式是使用关键字。例如:

    def shop(where = 'store', 
                    what = 'pasta',
                    howmuch = '10 pounds'):
    print('I want you to go to the', where)
    print('and buy', howmuch, 'of', what + '.')
    

    使用关键字参数的函数式:

    >>> shop()
    I want you to go to the store and buy 10 pounds of pasta.
    >>> shop(howmuch = 'a ton', what = 'towels', where = 'bakery')
    I want you to go to the bakery and buy a ton of towels.
    

    关键字参数有两大好处:

    1. 清晰地指出了参数值,提高了程序的可读性;
    2. 关键字参数的顺序无关紧要。

    模块

    模块是一系列相关的函数和变量。

    创建Pyton模块

    要创建模块,可创建一个.py文件,在其中包含用于完成任务的函数。
    例如,下面是一个在屏幕上打印形状的模块:

    # shapes.py
    """
    A collection of functions for printing basic shapes.
    """
    CHAR = '*'
    
    
    def rectangle(height, width):
        """ Prints a rectangle """
        for row in range(height):
            for col in range(width):
                print(CHAR, end='')
            print()
    
    
    def square(side):
        """ Prints a square """
        rectangle(side, side)
    
    
    def triangle(height):
        """ Prints a right triangle. """
        for row in range(height):
            for col in range(1, row + 2):
                print(CHAR, end=' ')
            print()
    
    

    模块与常规Python程序之间唯一的差别是用途不同:模块是一个由函数组成的工具箱,用于编写其他程序。因此,模块通常没有main()函数。

    要使用模块,只需导入它即可。例如:

    >>> import shapes
    >>> dir(shapes)
    ['CHAR', '__builtins__',...,'triangle']
    >>> print(shapes.__doc__)
    A collection of functions for printing basic shapes.
    >>> shapes.CHAR
    '*'
    

    还可以导入模块的所有内容:

    >>> from shapes import *
    >>> rectangle(3, 8)
    ********
    ********
    ********
    

    名称空间

    对于模块,很有用的一点是它们形成名称空间。名称空间基本上就是一组独特的变量名和函数名。要让模块中的名称在模块外面可见,你必须使用import语句。
    import *容易导致名称冲突,尽量减少这样的使用。

    相关文章

      网友评论

          本文标题:Python 学习日志第四篇(912)

          本文链接:https://www.haomeiwen.com/subject/buqhvftx.html