函数
1 自定义函数
使用 def (表示定义函数)语句。
def hello(name):
return 'Hello, ' + name + '!'
>>> print(hello('world'))
Hello, world!
>>> print(hello('Gumby'))
Hello, Gumby!
给函数编写文档
def square(x):
'Calculates the square of the number x.'
return x * x
访问函数文档
>>> square.__doc__
'Calculates the square of the number x.'
什么都不返回的函数不包含 return 语句,或者包含 return 语句,但没有在 return 后面指定值。
这里使用 return 语句只是为了结束函数:
def test():
print('This is printed')
return
print('This is not')
>>> x = test()
This is printed
>>> print(x)
None #因为return后面没有指定返回内容,所以返回的是None
4 参数
关键字参数和默认值
def hello_1(greeting, name):
print('{}, {}!'.format(greeting, name))
def hello_2(name, greeting):
print('{}, {}!'.format(name, greeting))
>>> hello_1(name='world', greeting='Hello')
Hello, world!
>>> hello_2(greeting='Hello', name='world')
world, Hello!
像这样使用名称指定的参数称为关键字参数,主要优点是有助于澄清各个参数的作用。
关键字参数最大的优点在于,可以指定默认值。
def hello_3(greeting='Hello', name='world'):
print('{}, {}!'.format(greeting, name))
>>> hello_3()
Hello, world!
>>> hello_3('Greetings')
Greetings, world!
>>> hello_3('Greetings', 'universe')
Greetings, universe!
5 作用域
>>> def foo(): x = 42
...
>>> x = 1
>>> foo()
>>> x
1
在这里,函数 foo 修改(重新关联)了变量 x ,但当你最终查看时,它根本没变。这是因为调用 foo 时创建了一个新的命名空间,供 foo 中的代码块使用。赋值语句 x = 42 是在这个内部作用域(局部命名空间)中执行的,不影响外部(全局)作用域内的 x 。在函数内使用的变量称为局部变量(与之相对的是全局变量)。参数类似于局部变量,因此参数与全局变量同名不会有任何问题
>>> def combine(parameter): print(parameter + external)
...
>>> external = 'berry'
>>> combine('Shrub')
Shrubberry
#警告 像这样访问全局变量是众多bug的根源。务必慎用全局变量。
重新关联全局变量(使其指向新值)是另一码事。在函数内部给变量赋值时,该变量默认为局部变量,除非你明确地告诉Python它是全局变量。
>>> x = 1
>>> def change_global():
... global x #告知python这个是全局变量
... x = x + 1
...
>>> change_global()
>>> x
2
6 递归
基线条件(针对最小的问题):满足这种条件时函数将直接返回一个值。
递归条件:包含一个或多个调用,这些调用旨在解决问题的一部分。
计算阶乘
def factorial(n):
if n == 1:
return 1
else:
return n * factorial(n - 1)