(四)《A Byte of Python》 ——函数

        函数(Functions) 是指可重复使用的程序片段。它们允许你为某个代码块赋予名字,允许你通过这一特殊的名字在你的程序任何地方来运行代码块,并可重复任何次数。这就是所谓的调用(Calling) 函数。

        函数可以通过关键字def来定义。这一关键字后跟一个函数的标识符名称,再跟一对圆括号,其中可以包括一些变量的名称,再以冒号结尾,结束这一行。随后而来的语句块是函数的一部分。 

def say_hello():
    # 该块属于这一函数
    print('hello world')
    # 函数结束
say_hello() # 调用函数
say_hello() # 再次调用函数
$ python function1.py
hello world
hello world 

1. 函数参数

        函数中的参数通过将其放置在用以定义函数的一对圆括号中指定,并通过逗号予以分隔。当我们调用函数时,我们以同样的形式提供需要的值。在定义函数时给定的名称称作形参Parameters) ,在调用函数时你所提供给函数的值称作实参Arguments)。

def print_max(a, b):
    if a > b:
        print(a, 'is maximum')
    elif a == b:
        print(a, 'is equal to', b)
    else:
        print(b, 'is maximum')
# 直接传递字面值
print_max(3, 4)
x = 5
y = 7
# 以参数的形式传递变量
print_max(x, y)
$ python function_param.py
4 is maximum
7 is maximum 

2. 局部变量

        在一个函数的定义中声明变量时,它们不会以任何方式与身处函数之外但具有相同名称的变量产生关系,也就是说,这些变量名只存在于函数这一局部Local)。这被称为变量的作用域Scope)。

x = 5
def func(x):
    print('x is', x)
    x = 2
    print('Changed local x to', x)
func(x)
print('x is still', x)
$ python function_local.py
x is 5
Changed local x to 2
x is still 5 
3. global语句

        使用global给一个在程序顶层的变量赋值(也就是说它不存在于任何作用域中,无论是函数还是类),从而告诉Python这一变量并非局部的,而是全局(Global)的。

x = 5
def func():
    global x
    print('x is', x)
    x = 2
    print('Changed global x to', x)
func()
print('Value of x is', x)
$ python function_global.py
x is 5
Changed global x to 2
Value of x is 2 

4. 关键字参数

        在一个具有许多参数的函数中,希望只对其中的一些参数进行指定,可以通过命名它们来给这些参数赋值——这就是关键字参数Keyword Arguments)。

def func(a, b=5, c=10):
    print('a is', a, 'and b is', b, 'and c is', c)
func(3, 7)
func(25, c=24)
func(c=50, a=100)
$ python function_keyword.py
a is 3 and b is 7 and c is 10
a is 25 and b is 5 and c is 24
a is 100 and b is 5 and c is 50 

5. 可变参数

        定义的函数里面能够有任意数量的变量,也就是参数数量是可变的,这可以通过使用星号来实现。

def total(a=5, *numbers, **phonebook):
    print('a', a)
    #遍历元组中的所有项目
    for single_item in numbers:
        print('single_item', single_item)
    #遍历字典中的所有项目
    for first_part, second_part in phonebook.items():
        print(first_part,second_part)
print(total(10,1,2,3,Jack=1123,John=2231,Inge=1560))
$ python function_varargs.py
a 10
single_item 1
single_item 2
single_item 3
Jack 1123
Inge 1560
John 2231
None 

       声明一个诸如*param的星号参数时,从此处开始直到结束的所有位置参数(Positional Arguments)都将被收集并汇集成一个称为“param”元组Tuple)。声明一个诸如**param的双星号参数时,从此处开始直至结束的所有关键字参数都将被收集并汇集成一个名为param字典Dictionary)。

         在Python中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数,这5种参数都可以组合使用。但是请注意,参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。

6. return语句

        用于从函数中返回,也就是中断函数。我们也可以选择在中断函数时从函数中返回一个值。如果return语句没有搭配任何一个值则代表着返回 NoneNone Python中一个特殊的类型,代表着虚无。举个例子, 它用于指示一个变量没有值,如果有值则它的值便是None 

7. DocStrings

        文档字符串(Documentation Strings),是一款你应当使用的重要工具,它能够帮助你更好地记录程序并让其更加易于理解。当程序实际运行时,甚至可以通过一个函数来获取文档。

def print_max(x, y):
    '''Prints the maximum of two numbers.打印两个数值中的最大数。

    The two values must be integers.这两个数都应该是整数'''
    # 如果可能,将其转换至整数类型
    x = int(x)
    y = int(y)
    if x > y:
        print(x, 'is maximum')
    else:
        print(y, 'is maximum')
print_max(3, 5)
print(print_max.__doc__)
$ python function_docstring.py
5 is maximum
Prints the maximum of two numbers.

    The two values must be integers

        函数的第一行逻辑行中的字符串是该函数的文档字符串(DocString)。该文档字符串所约定的是一串多行字符串,其中第一行以某一大写字母开始,以句号结束。第二行为空行,后跟的第三行开始是任何详细的解释说明。

        Python的函数具有非常灵活的参数形态,既可以实现简单的调用,又可以传入非常复杂的参数。默认参数一定要用不可变对象,如果是可变对象,程序运行时会有逻辑错误!

1. 要注意定义可变参数和关键字参数的语法:

  • *args是可变参数,args接收的是一个tuple;
  • **kw是关键字参数,kw接收的是一个dict。
2. 以及调用函数时如何传入可变参数和关键字参数的语法:
  • 可变参数既可以直接传入:func(1, 2, 3),又可以先组装list或tuple,再通过*args传入:func(*(1, 2, 3));
  • 关键字参数既可以直接传入:func(a=1, b=2),又可以先组装dict,再通过**kw传入:func(**{'a': 1, 'b': 2})。
3. 使用*args和**kw是Python的习惯写法,当然也可以用其他参数名,但最好使用习惯用法。 命名的关键字参数是为了限制调用者可以传入的参数名,同时可以提供默认值。定义命名的关键字参数在没有可变参数的情况下不要忘了写分隔符*,否则定义的将是位置参数。











猜你喜欢

转载自blog.csdn.net/muumian123/article/details/79084076