Python学习笔记之六——函数

来源:互联网 发布:矩阵二范数计算 编辑:程序博客网 时间:2024/06/10 05:53

函数

 函数就是完成特定功能的一个语句组,这组语句可以作为一个单位使用,并且给它取一个名字。

为什么要使用函数

  • 降低编程难度
  • 代码重用

函数的定义和调用

函数定义语法如下
def 函数名(参数列表): #可以没有参数
函数体
函数调用
函数名(实参) #实参可以有多个

形式参数、实际参数、缺省参数

  • 在定义函数时函数名后面圆括号中的变量名称叫做“形式参数”,或简称为“形参”
  • 在调用函数时,函数名后面圆括号中的变量名称叫做”实际参数”,或简称为“实参”
  • 缺省参数就是默认参数,即定义函数的时候给形参一个默认值。

局部变量和全局变量

  • Python 中如任何变量都有其特定的作用域
  • 在函数中定义的变量一般只能在该函数内部使用,这些只能在程序特定部分使用的变量我们称之为局部变量。
  • 在一个文件顶部定义的变量可以供该文件中的任何函数调用,这些可以为整个程序使用的变量称为全局变量

global 语句

把函数中的一个局部变量强制声明为全局变量

global  变量名

函数返回值

  • 函数被调用后会返回一个指定的值
  • 函数调用后默认返回None
  • return 返回值
  • 返回值可以是任意类型
  • return 执行后,函数终止
  • 区分返回值和打印

函数多类型传值

向函数传递元组和字典

>>> t=('xiaoming',15)>>> d={'name':'xiaoming','age':15}def f(name='xiaoming',age=30)    print("name: %s" % name)    print("age: %s" % age)>>> f('xiaoming',15)name=xiaomingage=15>>> f(name='xiaoming',age=15)name=xiaomingage=15>>> f(*t)name=xiaomingage=15>>> f(**d)name=xiaomingage=15

传值冗余

 一般当用户向函数传入的实参个数大于形参的个数的时候就会报传入多值错误,为使函数兼容性更强,Python中针对传入多值的情况有专门的处理机制。如下面的例子:

>>> def f(x,*args,**kwargs):...     print(x)...     print(args)...     print(kwargs)... >>> f(1)1(){}>>> f(1,2,3)1(2, 3){}>>> f(1,2,3,4,y=3)1(2, 3, 4){'y': 3}说明:元组数据被*args接收,字典数据被**kwargs接收

lambda 表达式

 lambda 函数是一种快速定义单行的最小函数,是从Lisp借用来的,可以用在任何需要函数的地方。
lambda 表达式格式
lambda 语句中,冒号前是参数,可以有多个,用逗号隔开,冒号右边是返回值。
lambda 语句构建的 其实是一个函数对象
例子如下:

>>> def f(x,y):...     return x*y... >>> f(2,3)6>>> g=lambda x,y:x*y>>> g(2,3)6

lambda表达式的作用:
1. 使用Python 写一些执行脚本时,使用lambda 可以省去定义函数的过程,让代码更加精简。
2. 对于一些抽象的,在别的地方不会再复用的函数,有时候给函数起个名字也是难题,使用lambda 不需要考虑命名的问题。
3. 使用lambda在某些时候让代码更容易理解。

实现分支结构

 Python 中没有switch 语法结构,但是可以通过字典来实现switch 实现的功能 。
创建 divis.py.py 如下代码所示:

from __future__ import divisiondef jia(x,y):        return x+ydef jian(x,y):        return x-ydef cheng(x,y):        return x*ydef chu(x,y):        return x/yoperator = {"+":jia,"-":jian,"*":cheng,"/":chu}def f(x,o,y):        print(operator.get(o)(x,y))f(3,"+",2)运行结果:5

 在这里 print(operator.get(o)(x,y)) 相当于先把jia 取出来,然后看作是 jia 的函数,再把x,y 实参传入进去,最终通过函数计算出结果。如果为兼容冗余参数的情况,可以使用上面的传值冗余的解决办法:

print(operator.get(o)(x,y,*args,**kwargs))

以上的实现方法可以简化成如下形式:

#-*- coding:UTF-8 -*-#使用字典实现switch 语句from __future__ import divisionx=1y=2operator="/"result={    "+":x+y,    "-":x-y,    "*":x*y,    "/":x/y}print(result.get(operator))

常用内置函数

  • len()
  • divmod() 返回两个数的商和余数 返回结果是一个数组,通过help(divmod) 可以查看帮助信息
  • pow()
  • round() 返回一个整数的带有小数的表达形式
  • callable() 在调用一个函数之前检查一下这个函数是否可被调用,callable(函数名称),如果这个函数可调用则返回True ,如果不可调用则返回False
  • isinstance() 判断某个对象的类型是不是想要的类型,参数有两个
    ininstance(obj,class_or_tuple) 第一个是要判断的实际对象,第二个是想要的类型,返回值为True 或 False
  • cmp 通常用于比较两个字符串
  • range() 生成一个有序序列
  • xrange() 效率要比range()高

类型转化内置函数
- type()
- int()
- long()
- float()
- complex() 转化成一个复数
- tuple()
- str()
- list()
- hex() 把数转成16进制
- oct() 把数转成8进制
- chr() 返回一个数字的Unicode 编码,数字最大值为
1,114,111
- ord() 返回单个字符的Unicode 编码
string 函数
- str.capitalize() 用于把字符串首字母转换为大写,返回一个新的字符串,原来的字符串并没有变
- str.replace() 替换字符串中的一个字符或多个字符,同样返回的是一个新字符串,原字符串并没有被改变。
- str.split() 用于切割字符串
例:

ss='rqer34q45q411111'>>> ss.capitalize()'Rqer34q45q411111'ss.replace('1','x')'rqer34q45q4xxxxx'>>> ip='192.168.1.11'>>> ip.split('.')['192', '168', '1', '11']

函数参数定义、调用、返回值小结

Python函数中的参数

  首先特别注意的是Python函数的参数与其他语言一个最大的不同点是参数在定义的时候不需要定义参数类型,这也是Python 函数灵活的一部分,这样只要传入的参数Python能够解析,得到你期望的结果,当我们需求发生变化,传入参数的类型发生了变化,但函数本身并不需要修改,只有当函数实在无法满足需求的时候才需要修改。
1. Python 函数和其他语言的函数一样,可以没有参数
2. 必需参数:和其他语言一样,有些函数在调用的时候要求必须要传入几个参数,这样的参数一般在函数定义的最前面,传入的时候按照顺序传入,如果不按顺序传入一定要指明参数名称和参数的值
3. 关键字参数 关键字参数只是一种传参的方式,就是在传参的时候指明参数与其相对应的值,必需参数也可以以关键字参数的形式进行传参
4. 带有默认值的参数 有些参数不总是需要给定一个值,这样的参数我们最好给它一个默认值,这样需要传入值的时候我们再以关键字参数的形式进行传参 ,不需要传参的时候因为其有默认值,所以就不用传参了
5. 可变长度的参数,通俗地讲就是传入的实参个数多于形参个数如何处理的问题,Python 对于这样的场景做了兼容处理,如下代码所示,就是如果传入的多余的参数不是键值对的形式那么就用*args接收,如果传入的多余参数是键值对的那么就用**kwargs接收。

>>> def f(x,*args,**kwargs):...     print(x)...     print(args)...     print(kwargs)... >>> f(1)1(){}>>> f(1,2,3)1(2, 3){}>>> f(1,2,3,4,y=3)1(2, 3, 4){'y': 3}说明:元组数据被*args接收,字典数据被**kwargs接收

Python 函数中的返回值

  1. 和其他语言一样Python 函数可以return 语句,即可以没有显式的返回值,但实际上没有return语句的时候Python会返回一个None,对于程序没有实际意义
  2. 返回一个值或对象(和其他大多数语言类似)
  3. 返回多个值或多个对象,其实是把多个值打包放到一个元组中,看起来像是返回了多个值
  4. 返回一个函数,这一般出现在嵌套函数中,主函数返回的结果是一个函数,但返回的函数不能独立存在,主函数所在会话结束,子函数也就不存在了
0 0