好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Python学习笔记之 函数

  申明:资料来源于网络及书本,通过理解、实践、整理成学习笔记。

  文章目录

  函数定义

  函数参数

  变量作用域

  lambda表达式

  递归函数

  函数定义

  定义一个函数只要以"def"开头即可,Python内置了很多有用的函数,我们可以直接调用。

  def function_name(arg1):

  function body

  return value

  函数名(function_name):函数名以字母或下划线开头,并且区分大小写

  函数参数(arg1):调用一个函数时可以传递的参数,参数可以没有,也可以有一个或多个

  函数内容(function body):在函数的内部,与"def"相比需要缩进4个空格

  函数返回值(return value):函数执行完成后返回的值,也可以不返回内容,默认为none

  函数参数

  必须参数:如果函数内容中使用了此函数参数,此参数就是必须参数,调用函数时缺少的话就会报错

  #定义函数

  def fun1(a):

  print(a)

  #调用函数

  fun1(1)

  执行结果:

  1

  #定义函数

  def fun1(a):

  print(a)

  #调用函数

  fun1()

  执行结果:

  发生异常:TypeError fun1() missing 1 required positional argument: 'a'

  关键字参数:使用关键字参数可以不按参数的顺序来调用函数

  def fun1(a,b):

  print(a,b)

  fun1("深圳","广州")

  fun1(b="广州",a="深圳")

  执行结果:

  深圳 广州

  深圳 广州

  默认参数:在定义函数时给参数添加默认值,如果调用函数时没有传入参数,函数就会使用默认值。注意:默认参数一定要定义在必须参数的后面

  def fun1(a,b = 1):

  print(a,b)

  fun1("深圳")

  fun1("深圳","广州")

  执行结果:

  深圳 1

  深圳 广州

  可变参数:如果我们不能在定义函数的时候确定参数的数量和内容,就可以使用可变参数。如下:用 * 分隔开,args表示一个元组,用 ** 分隔开,kwargs表示一个字典

  def fun1(*args,**kwargs):

  print(args)

  print(kwargs)

  i = (1,2,3)

  j = {"sz": "深圳", "gz": "广州"}

  fun1(*i,**j)

  执行结果:

  (1, 2, 3)

  {'sz': '深圳', 'gz': '广州'}

  组合参数:顾名思义,就是将上面的必须参数、关键字参数、默认参数、可变参数组合到一起使用

  变量作用域

  变量的作用域相当于变量的命名空间,Python中变量赋值的位置决定了哪些范围的对象可以访问这个变量,这个范围被称为作用域。Python中有两种最基本的变量作用域:局部变量和全局变量。

  局部变量:一般情况下,在函数内进行赋值的变量和不做特殊声明的变量都是局部变量

  #变量a在函数内赋值,属于局部变量

  def fun1():

  a = 1

  print(a)

  fun1()

  执行结果:

  1

  #变量b属于函数的参数,也属于局部变量

  def fun1(b):

  print(b)

  fun1(1)

  执行结果:

  1

  全局变量:在函数外赋值的变量就属于全局变量,全局变量可以在整个程序范围内进行访问

  #变量a在函数外赋值,属于全局变量

  a = 1

  def fun1():

  print(a)

  fun1()

  lambda表达式

  lambda表达式也称为匿名函数,不再使用 def 语句这样标准的形式定义一个函数,就是匿名函数。

  a = lambda x, y : x + y

  print(a(1,2))

  执行结果:

  3

  ":“左边的"x”,"y"是函数的参数

  ":"右边的是要返回的值

  "a(1,2)"是调用此lambda函数

  注意:lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数

  递归函数大连做人流哪里好 http://www.dl-fkw.com/

  如果一个函数在内部调用自身本身,这个函数就是递归函数。例如连加、连乘及阶乘等

  #阶乘

  def fact1(n):

  if n == 1:

  return 1

  return n * fact1(n-1)

  #fact1(5) = 5! = 5*4*3*2*1

  print(fact1(5))

  执行结果:

  120

  注意:使用递归函数需要注意防止栈溢出,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出,解决递归调用栈溢出的方法是通过尾递归优化

  尾递归:在函数返回的时候,调用自身本身,并且,return语句不能包含表达式。这样,编译器或者解释器就可以把尾递归做优化,使递归本身无论调用多少次,都只占用一个栈帧,不会出现栈溢出的情况

  def fact1(n):

  return fact2(n, 1)

  def fact2(a, b):

  if a == 1:

  return b

  return fact2(a - 1, a * b)

  print(fact1(5))

  执行结果:

  120

  执行过程

  fact1(5)

  -》fact2(5, 1)

  -》fact2(4, 5)

  -》fact2(3, 20)

  -》fact2(2, 60)

  -》fact2(1, 120)

  -》120

查看更多关于Python学习笔记之 函数的详细内容...

  阅读:24次