Python学习笔记:函数

函数定义

函数是使用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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值