# 2.7. 函数 2018 2018

## 函数

``````def say_hello():
# 属于该函数的语句块
print('hello world')
# 函数结束

say_hello()  # 调用函数
say_hello()  # 再次调用函数
``````

``````\$ python function1.py
hello world
hello world
``````

## 函数参数

``````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
``````

`print_max` 在这两种情况下都能正常工作。

## 局部变量

``````x = 50

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 50
Changed local x to 2
x is still 50
``````

## `global` 语句

``````x = 50

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 50
Changed global x to 2
Value of x is 2
``````

`global` 用于声明 `x` 是一个全局变量，因此当我们在函数内为 `x` 赋值时，主程序块中的 `x` 的值也改变了。

## 默认参数值

``````def say(message, times=1):
print(message * times)

say('Hello')
say('World', 5)
``````

``````\$ python function_default.py
Hello
WorldWorldWorldWorldWorld
``````

`say` 函数用于多次输出指定的字符串。如果我们不指定输出次数，它只会默认打印一次。我们通过将默认值 `1` 赋给形参 `times` 来实现这一点。

## 关键字参数

``````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
``````

## 可变参数

``````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
Inge 1560
John 2231
Jack 1123
None
``````

## `return` 语句

`return` 语句用于从一个函数 返回，即跳出这个函数。我们也可以从函数跳出时 返回一个值，返回值是可选的。

``````def maximum(x, y):
if x > y:
return x
elif x == y:
return 'The numbers are equal'
else:
return y

print(maximum(2, 3))
``````

``````\$ python function_return.py
3
``````

``````def some_function():
pass
``````

``````>>> print(some_function())
None``````

`pass` 语句在 Python 中用于表示一个空的语句块，通常用于占位。

## 文档字符串——DocStrings

Python 有一个十分美妙的特性 文档字符串 (documentation strings)，通常简称为 DocStrings。DocStrings 是一个十分重要的工具，你应该多使用它，它能让你的程序变得更加简单易懂。神奇的是，在程序运行时，我们也能查看 DocStrings。

``````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.
``````

DocStrings 的书写惯例是：首行首字母大写，结尾有句号；第二行为空行；第三行以后为详细的描述。我们 强烈建议 你在编写任何非平凡函数时都遵守这种惯例，那些只有几行的平凡函数可以不遵守这个惯例。