专栏首页AzMarkPython 学习之 def 函数

Python 学习之 def 函数

def 函数基础

def 函数的定义

在 python 中,def 函数是用来定义一个 function() 的。

基本使用

def function_name():
      expressions

示例

下面我们定义了一个 function() 实现打印 a 的值。

def function():
      a=1+2
      print(a)

当我们运行的时候,输出框是不会输出任何信息的,为什么?

当我们定义了一个 function(),并不意味着我们要调用它,所以我们需要运行这个 function(),一个简单的办法就是在 input 框中输入 function()。

自调用

如果想要在执行脚本的时候执行一些代码,如单元测试,可以在脚本最后加上单元测试代码。但是该脚本做为一个模块对外提供功能的时候单元测试代码也会执行,这些往往都不是我们想要的,我们可以把这些代码加入到脚本最后。

if __name__ == '__main__':
      #code_here

如果执行该脚本的时候,该 if 判断语句将会是 True,那么内部的代码将会执行。 如果外部调用该脚本,if 判断语句则为 False,内部代码将不会执行。

利用自调用函数运行如上的 function() 进行测试。

函数参数

基本使用

当我们想要调用一个函数并往函数中传递变量,那么这些变量就是函数的参数。

def func_name(parameters):
      expressions

parameters 的位置就是函数的参数,在调用的时候传入即可。

示例

def func(a, b):
      c = a+b
      print('the c is ', c)
  
  if __name__=='__main__':
      func(2,4)

在这里定义的一个函数 func,其参数就是两个数值 a,b,函数的功能就是把两个参数加起来。运行脚本后,在 main 函数中调用函数 func, 如果不指定参数 func(), 那么将会出错。

运行结果

the c is  6

函数的默认参数

基本使用

我们在定义函数时有时候有些参数在大部分情况下是相同的,只不过为了提高函数的适用性,提供了一些备选的参数, 为了方便函数调用,我们可以将这些参数设置为默认参数,那么该参数在函数调用过程中可以不需要明确给出。

def func_name(para_1,..., para_n=defau_n, ..., para_m=defau_m):
      expressions

函数声明只需要在需要默认参数的地方用 = 号给定即可, 但是要注意所有的默认参数都不能出现在非默认参数的前面

示例

在这里定义了一个 sale_mac 函数,参数为 Mac 的属性,但除了 price 之外,像 color, brandis_touch_bar 都是有默认值的。

def sale_mac(price, color='silver', brand='macbook pro', is_touch_bar=True):
      print('price:', str(price)+"\n",
            'color:', color+"\n",
            'brand:', brand+"\n",
            'is_touch_bar:', is_touch_bar)
  
  if __name__=='__main__':
      sale_mac(12000, 'silver', 'macbook pro', True)

运行结果

price: 12000
color: silver
brand: macbook pro
is_touch_bar: True

如果我们调用函数 sale_car(12000), 那么与 sale_mac(12000, 'silver', 'macbook pro', True)是一样的效果。

当然也可以在函数调用过程中传入特定的参数用来修改默认参数。通过默认参数可以减轻我们函数调用的复杂度。

if __name__=='__main__':
     sale_mac(12000, 'gray', 'macbook air', True)

运行结果

price: 12000
color: gray
brand: macbook air
is_touch_bar: True

def 函数进阶

可变参数

顾名思义,函数的可变参数表示传入的参数可以变化的,1 个到任意个。当然可以将这些参数封装成一个 list 或者 tuple 传入,但不够 pythonic

使用可变参数可以很好解决该问题,注意可变参数在函数定义不能出现在特定参数默认参数前面,因为可变参数会吞噬掉这些参数。

示例

def report(name, *grades):
     total_grade = 0
     for grade in grades:
         total_grade += grade
     print(name, 'total grade is ', total_grade)
  
if __name__=='__main__':
     report('report', 1,2,3,4,5)

定义一个函数,传入固定参数 name,可变参数 *grades,表明该参数是一个可变参数,这是一个可迭代的对象。

运行结果

report total grade is  15

关键字参数

关键字参数可以传入 0 个或者任意个含参数名的参数,这些参数名在函数定义中并没有出现,这些参数在函数内部自动封装成一个字典 (dict)。

示例

定义了一个函数,传入一个参数 name, 和关键字参数 kw,使用了 ** 修饰。表明该参数是关键字参数,通常来讲关键字参数是放在函数参数列表的最后。

def portrait(name, **kw):
      print('name is', name)
      for k,v in kw.items():
          print(k, v)
  
  if __name__=='__main__':
      portrait('Mike', age=24, country='China', education='bachelor')

运行结果

name is Mike
age 24
country China
education bachelor

通过可变参数和关键字参数,任何函数都可以用 universal_func(*args, **kw) 表达。

参数组合

在 Python 中定义函数,可以用必选参数、默认参数、可变参数和关键字参数,这 4 种参数都可以一起使用,或者只用其中某些,但是参数定义的顺序必须是

必选参数 > 默认参数 > 可变参数 > 关键字参数。

示例

def func(a, b, c=0, *args, **kw):
    print ('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw)
  
if __name__=='__main__':
    func(1,2)
    func(1,2,c=3)
    func(1,2,3,'4','5','6')
    func(1,2,3,'4','5','6', d='7',e='8')

运行结果

a = 1 b = 2 c = 0 args = () kw = {}
a = 1 b = 2 c = 3 args = () kw = {}
a = 1 b = 2 c = 3 args = ('4', '5', '6') kw = {}
a = 1 b = 2 c = 3 args = ('4', '5', '6') kw = {'d': '7', 'e': '8'}

你还可以通过 tuple 和 dict 调用该函数

if __name__=='__main__':
    args = (1, 2, 3, 4)
    kw = {'x': 99}
    func(*args, **kw)

运行结果

a = 1 b = 2 c = 3 args = (4,) kw = {'x': 99}

总结

Python的函数具有非常灵活的参数形态,既可以实现简单的调用,又可以传入非常复杂的参数。

默认参数一定要用不可变对象,如果是可变对象,运行会有逻辑错误!

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

*args 是可变参数,args 接收的是一个 tuple;

**kw 是关键字参数,kw 接收的是一个 dict。

本文分享自微信公众号 - Python梦工厂(AzMark950831)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-07-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 自如甲醛房 | 也许只有自己亲眼看见,才会爱护生命

    相信最近朋友圈被一篇【阿里P7员工得白血病身故,生前租了自如甲醛房】推文刷屏了吧,说真的,看到此,我不禁为自己在上海租住自如 8 个月还能正常的活着感到庆幸。

    Python技术与生活认知的分享
  • Python 学习之正则表达式「下」

    re.sub(pattern, repl, string, count, flags=0) 与 re.subn(…) repl 用来替换的字符串,strin...

    Python技术与生活认知的分享
  • Python 学习之 Tkinter「下」

    Python技术与生活认知的分享
  • Python微悟(一)

    python的基本容器可以分为五类,其中list、tuple、string属于序列,因为他们的index是位置,存在有顺序这样一个概念,而字典Dict则是键值对...

    钱塘小甲子
  • 干货|XGBoost进阶—调参+实战

    0,silent模式关闭(一般我们选择slient=0,因为这样能更好的帮助我们理解模型)

    AI部落联盟
  • 14.程序编程进阶:函数的参数

    函数通过def进行定义,用于执行一个功能,一个函数,可以需要参数,也可以不需要参数。 类似我们现实生活,执行一个功能就是做一件事情,做这件事情需要的资源就是参...

    大牧莫邪
  • Python 函数中的参数类型

    Python 中函数的参数类型比较丰富,比如我们经常见到 *args 和 **kwargs 作为参数。初学者遇到这个多少都有点懵逼,今天我们来把 Python ...

    码农小胖哥
  • 谈一谈|如何利用函数的各种参数

    Python的函数定义非常简单,但灵活度却非常大。除了正常定义的必选参数外,还可以使用默认参数、可变参数和关键字参数,使得函数定义出来的接口,不但能处理复杂的参...

    算法与编程之美
  • Python 函数

    一份执着✘
  • 从0开始的Python学习009参数

    对于参数有时候我们希望他是可选的,前面介绍了函数柯里化,当然还有其他的解决方案。如果不想给某些参数提供值的话,就让这写参数使用默认值。在函数定义的时候给参数赋值...

    Happy、Liu

扫码关注云+社区

领取腾讯云代金券