共67 次浏览

第六章 函数

第六章 函数

6.1 创建和调用函数

6.1.1 创建函数

在Python语言中,函数的创建需要使用def关键字,具体语法如下:

 def 函数名称(参数1,参数2,……):
  "文件字符串"
  <语句>

Python语言的函数创建与我们之前在JavaScript中所学到的方法是一致的。def用于声明函数的创建,任何传入的参数和自变量必须放在小括号中间,小括号之间可以用于定于参数。函数的第一行语句可以选择性地使用文档字符串,用于存放函数说明。整体来说,Python的函数与JavaScript中的函数还是很相似的。

6.1.2 调用函数

说起函数创建,它自然离不开函数的调用。先前一步的函数创建就是为了之后的函数调用准备。函数的调用与其它语言类似,直接使用函数名进行调用。但是在Python语言中,我们可以先将函数名称设置为变量,然后使用该变量运行函数的功能。例如:

 >>>x= int
 >>>x(3.1415926)
 3

从结果中就可以看出,int( )函数是Python语言程序的内置函数,这里直接将函数名称设置为变量x,通过变量x即可直接运行该函数。

6.2 参数传递

6.2.1 形参与实参

形参指的是在函数定义时出现的参数,可以被看作是一个占位符,它没有实际数据,只能等到函数被调用时接受传递进来的数据。 实参则指的是函数在被调用时,被传递进来的参数,是有实际数据的,即在内存中是开辟了地址的。

6.2.2 形参和实参的特点

形参变量只有在函数被调用时参会分配内存,调用结束后立刻释放内存,所以形参变量只在函数内部有效,不能在函数外部使用。而实参在使用时必须要有确定的值,可以是常量、表达式、函数等 。形参和实参在形式和数量以及顺序上必须一致,否则会发生类型不匹配的错误。

6.2.3 值传递和引用传递

参数的传递也分为两种,一种是值传递,另一种是引用传递,也可以理解为地址传递。它们之间的区别是,进行值传递后,如果改变形式参数的值,实参的值不变;进行引用传递后,如果改变形参的值,实参的值也会随着改变。而python中对一个函数可以传递参数,但是如何分辨是值传递还是引用传递,不是程序员手动控制的,而是python根据你传入的数据对象,自动识别的。 如果你传入的参数对象是可变对象:列表,字典,这个时候就是引用传递,如果参数在函数体内被修改,那么源对象也会被修改。 如果你传入的参数对象是不可变的对象:数字,元组,字符串,这个时候就是值传递。那么源对象是不会改变的。下面举例子说明:

 import sys
 a=2
 b=[1,2,3]
 def change(x,y):
    x=3
    y[0]=4
 change(a,b)
 print a,b
 #输出结果是     2 [4, 2, 3]

可以看出数字作为一个不可变对象,a的值没有变化,而b作为列表对象,是可变对象,所以b被改变了。

 import sys
 a="11111"
 b={"a":1,"b":2,"c":3}
 def change(x,y):
    x="222"
    y["a"]=4
 change(a,b)
 print a,b
 #输出结果是   11111 {'a': 4, 'c': 3, 'b': 2}

因为a作为字符串是不可变对象,所以没变化,b作为字典,是可变对象,所以被改变了

 import sys
 a=(1,2,3)
 b={"a":1,"b":2,"c":3}
 def change(x,y):
    x="222"
    y["a"]=4
 change(a,b)
 print a,b
 #输出结果是 (1, 2, 3) {'a': 4, 'c': 3, 'b': 2}

6.2.4 关键字参数

Python中用户可以直接设置参数的名称及其默认值,这种类型的参数属于关键字参数。在设置函数的参数时,可以不按照它们的位置排列顺序,因为Python解释器能够用参数名匹配

 fruits("苹果",12.6)   #按照参数传入顺序传入
 fruits(x="苹果",y=12.6) #按照参数传入顺序,并指定参数名
 fruits(y=12.6,x="苹果") #不按照参数顺序传入参数,并指定参数名

以上这三种方法在Python中都是允许的。

6.2.5 默认参数

调用参数时,若没有传入参数,则会抛出异常。但是可以为参数设置默认值来解决这个问题。例如:

 def ns( name,score=660):     #设置score的参数默认值为660
 print("姓名:",name)
 print("高考总分:",score)
 return
 ​
 ns(name="赵日天",score=586) #传递参数,不使用默认值
 ns(name="雷军")               #没有传递参数,就会使用默认值
 ​
 """"""程序运行结果如下
 姓名: 赵日天
 高考总分:586
 姓名:雷军
 高考总分:660

通过这里例子中可以看到当我们不传入参数时,它就会使用在定义函数时设定的默认参数。

6.2.6 可变参数

如果用户在定义函数时不能确定需要定义几个参数时就可以使用可变参数。下面通过举例子说明

 def get_sum(*numbers): 
  sum = 0
  for n in numbers:
   sum += n
  return sum
 ​
 print (get_sum(1,2,3,4,5))
 #程序运行结果为   15

加了星号(*)的变量名会存放所有未命名的变量参数。如果在函数调用时没有指定参数,那么它就是一个空元组。用户也可以不向函数传递未命名的变量。同样的用户也可以为参数设置 ** 类型的变量,即两个星号,两个星号代表的是字典对象

6.3 返回值

return 语句用于退出函数,有选择性地向调用者返回一个表达式。不带参数值的return 语句返回None 函数的返回值也可以是多个,那么此时就会以元组对象的类型返回。若函数没有返回值,则返回None。

6.4 变量作用域

在Python语言中,变量并不是在哪个位置都可以访问。变量的访问权限决定了这个变量在哪里赋值,而变量的作用域决定了该变量在哪一部分程序可以访问哪个特定的变量名称 变量的作用域包括全局变量和局部变量。其中,定义在函数内部的变量拥有一个局部作用域,定义在函数外部的则拥有全局作用域。如果要在函数内改变全局变量的值,则就要使用global关键字。

6.5 匿名函数

匿名函数,即是不使用def关键字来声明函数。Python语言中,使用lambda创建一个匿名函数。

 def f(x,y)
 return x-y
 ​
 #使用匿名函数
 f=lambda x,y:x-y

匿名函数与我们在JavaScript中所学到的箭头函数形式还是很相似的,在使用时两者可以进行参考。 匿名函数在使用时也有许多要注意的地方: ①如果只有一个表达式,则必须有返回值 ②可以没有参数,也可以有一个或多个参数 ③不能有return

在 lambda语句中,冒号前是参数(可以有多个),用逗号隔开冒号右边的返回值。lambda语句构建的其实是一个函数对象。例如:

 import math
 r = float(input("请输入圆的半径:"))
 area =lambda r:math.pi*r*r
 print(area(r))
 #程序运行结果为
 请输入圆的半径:12.5
 490.8738521234052