函数定义
函数是使用def语句定义的。函数由语句块组成他们从外部接收值(参数),并可能返回一个或多个值(计算结果)。
如:
def hello(name):
return 'Hello, ' + name + ' !'
定义完函数后,就可以像使用内置函数那样使用这个函数:
>>>print(hello('tang'))
Hello, tang !
>>>print(hello('Li'))
Hello, Li !
在自定义函数中,return语句很重要 ,return语句用于从函数返回值
参数
函数通过参数接收所需的信息,在python中,参数有两类,位置参数和关键参数。
关键字参数
使用名称指定的参数成为关键字参数,主要优点是有助于澄清各个参数的作用,然而,关键字参数最大的有点在于,可以指定默认值;
def hello(greeting='hello', name='world'):
print('{},{}!'.format(greeting, name))
像这样 指定默认值后,调用函数时,可不提供它,可以根据需要,一个参数值也不提供、提供部分参数或提供全部参数
>>>hello()
hello,world!
>>>hello('nihao')
nihao,world!
>>>hello('nihao', 'Li')
nihao,Li!
收集参数
参数前面添加星号(*)意味着将提供的所有值都放在一个元组中,也就是将这些值收集起来。
def print_param(title, *params):
print(title)
print(params)
调用一下:
>>>print_param('Params:', 1, 2, 3)
Params:
(1, 2, 3)
因此星号意味着收集余下的位置参数,如果没有可提供收集的 参数,params将是一个空元祖。
>>>print_param('Params:')
Params:
()
跟赋值一样,带星号的参数也可以放在其他位置(而不是最后),但不同的是,在这种情况下,需要 使用名称来指定后续参数。
def print_param(x, *y, z):
print(x, y, z)
>>>print_param_2(1, 2, 3, 4, z=5)
1 (2, 3, 4) 5
单星号不会收集关键字参数,要收集关键字参数需要使用两个星号
def print_param_3(**params):
print(params)
>>>print_param_3(x=1, y=2, z=5)
{'x': 1, 'y': 2, 'z': 5}
调用后得到的是一个字典而不是一个元组。
分配参数
分配参数,是通过在调用函数(而不是定义函数)时使用运算符* 实现的。
def add(x, y):
return x + y
>>>params = (1, 2)
>>>add(*params)
3
如果在定义和调用函数时,都使用*或**,将只传递 元组或字典。因此日常使用还不如使用分配参数的方式。
def with_stars(**kwds):
print(kwds['name'], 'is', kwds['age'], 'years old')
def without_stars(kwds):
print(kwds['name'], 'is', kwds['age'], 'years old')
>>>args = {'name': 'tang', 'age': 18}
>>>with_stars(**args)
tang is 18 years old
>>>without_stars(args)
tang is 18 years old
上述举例中,对于函数with_stars,在定义和调用的时候使用了星号,而对于without_stars函数,在定义和调用时都没有使用,但两种做法的的效果相同。
因此,只有在定义函数(允许可变数量的参数)或调用函数时(拆分字典或序列)使用,星号才能发挥 作用。
作用域
变量存储在作用域中,python中,作用域分为两大类:全局作用域 和局部作用域。作用域可以嵌套。每个函数被调用的时候,都会创建一个作用域。
def foo():
x = 42
>>>x = 1
>>>foo()
>>>print(x)
1
调用foo()函数时,会创建一个作用域供函数使用,赋值语句 x = 42 是在这个内部作用域中执行的,不影响外部(全局)作用域内的x。
在函数内部使用的变量成为局部变量,与之相对的是全局变量。
在一个函数中,如果有一个局部变量或参数与需要访问的全局变量同名,就无法直接访问全局变量,因为他被局部变量”遮住“了。
如果需要,可使用globals来访问全局变量。
def combine(parameter):
print(parameter + globals()['parameter'])
>>>parameter = 'berry'
>>>combine('Shrub')
Shrubberry