Python基础入门笔记:函数

2018-09-2009:53:24后端程序开发Comments2,923 views字数 3012阅读模式

函数

举些你可能已经使用过的函数例子:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/5150.html

判断数据类型:type(str) 
字符串类型数据转为整数型:int(str)
...
复制代码

通过观察规律不难发现,Python 中所谓的使用函数就是把你要处理的对象放到一个名字后面的括号就可以了。简单的来说,函数就是这么使用,可以往里面塞东西得到处理结果。这样的函数在 Python 中还有这些:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/5150.html

Python基础入门笔记:函数

以 Python3.5 版本为例,一个有 68 个这样的函数,它们被称为内建函数。这里內建的是指这些函数为安装好了 Python 就可以使用。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/5150.html

2.1 函数格式

定义函数的格式:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/5150.html

Python基础入门笔记:函数

其中,defreturn关键字文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/5150.html

注意: 函数缩进后面的语句被称为是语句块,缩进是为了表名语句的逻辑与从属关系。缩进这个问题不能忽视,否则会导致代码无法成功运行,这里需要特别注意。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/5150.html

2.2 函数参数

①位置参数,举例,看代码:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/5150.html

def trapezoid_area(base_up, base_down, height):
    return 1/2 * (base_up + base_down) * height
复制代码

接下来我们开始调用该函数:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/5150.html

trapezoid_area(1,2,3)
复制代码

不难看出,填入的参数1,2,3分别对应着参数 base_up,base_down 和 height。这种传入参数的方式被称作为位置参数。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/5150.html

②关键词参数:在函数调用的时候,将每个参数名称后面赋予一个我们想要传入的值,如调用 fun1 函数时候:fun1(a=1, b=2, c=3)文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/5150.html

看下图:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/5150.html

Python基础入门笔记:函数
  • 第一行的函数参数按照反序传入,因为是关键词参数,所以并不影响函数正常运作;
  • 第二行的函数参数反序传入,但是到了第三个却变成了位置函数,遗憾的是这种方式是错误的语法,因为如果按照位置来传入,最后一个应该是参数 height 的位置。但是前面 height 已经按照名称传入了值3,所以是冲突的。
  • 第三行的函数参数正序传入,前两个是以关键字的方式传入,最后一个以位置参数传入,但是位置参数不能再关键词参数后面,所以是错误的。
  • 第四行的函数参数正序传入,前两个是以位置的方式传入,最后一个以关键字参数传入,这个函数是可以正常运行的。

③不定长参数文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/5150.html

有时我们在设计函数接口的时候,可会需要可变长的参数。也就是说,我们事先无法确定传入的参数个数。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/5150.html

Python 提供了一种元组的方式来接受没有直接定义的参数。这种方式在参数前边加星号 * 。如果在函数调用时没有指定参数,它就是一个空元组。我们也可以不向函数传递未命名的变量。例如:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/5150.html

def print_user_info( name ,  age  , sex = '男' , * hobby):
    # 打印用户信息
    print('昵称:{}'.format(name) , end = ' ')
    print('年龄:{}'.format(age) , end = ' ')
    print('性别:{}'.format(sex) ,end = ' ' )
    print('爱好:{}'.format(hobby))
    return;

# 调用 print_user_info 函数
print_user_info( '小明' , 25, '男', '打篮球','打羽毛球','跑步')
复制代码

输出的结果:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/5150.html

昵称:小明 年龄:25 性别:男 爱好:('打篮球', '打羽毛球', '跑步')
复制代码

通过输出的结果可以知道,* hobby 是可变参数,且 hobby 其实就是一个 tuple (元祖)。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/5150.html

可变长参数也支持关键参数,没有被定义的关键参数会被放到一个字典里。这种方式即是在参数前边加 **,更改上面的示例如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/5150.html

def print_user_info( name ,  age  , sex = '男' , ** hobby ):
    # 打印用户信息
    print('昵称:{}'.format(name) , end = ' ')
    print('年龄:{}'.format(age) , end = ' ')
    print('性别:{}'.format(sex) ,end = ' ' )
    print('爱好:{}'.format(hobby))
    return;

# 调用 print_user_info 函数
print_user_info( name = '小明' , age = 25 , sex = '男', hobby = ('打篮球','打羽毛球','跑步'))
复制代码

输出的结果:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/5150.html

昵称:小明 年龄:24 性别:男 爱好:{'hobby': ('打篮球', '打羽毛球', '跑步')}
复制代码

通过对比上面的例子和这个例子,可以知道,* hobby 是可变参数,且 hobby 其实就是一个 tuple (元祖),** hobby是关键字参数,且 hobby 就是一个 dict (字典)。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/5150.html

④ 只接受关键字参数文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/5150.html

关键字参数使用起来简单,不容易参数出错,那么有些时候,我们定义的函数希望某些参数强制使用关键字参数传递,这时候该怎么办呢?将强制关键字参数放到某个*参数或者单个*后面就能达到这种效果,比如:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/5150.html

def print_user_info( name , *, age, sex = '男' ):
    # 打印用户信息
    print('昵称:{}'.format(name) , end = ' ')
    print('年龄:{}'.format(age) , end = ' ')
    print('性别:{}'.format(sex))
    return;

# 调用 print_user_info 函数
print_user_info( name = '小明' ,age = 25 , sex = '男' )

# 这种写法会报错,因为 age ,sex 这两个参数强制使用关键字参数
#print_user_info( '小明' , 25 , '男' )
print_user_info('小明',age='22',sex='男')
复制代码

通过例子可以看,如果 age , sex 不适用关键字参数是会报错的。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/5150.html

2.3 匿名函数

有没有想过定义一个很短的回调函数,但又不想用 def 的形式去写一个那么长的函数,那么有没有快捷方式呢?文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/5150.html

——答案是有的。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/5150.html

Python 使用 lambda 来创建匿名函数,也就是不再使用 def 语句这样标准的形式定义一个函数。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/5150.html

匿名函数主要有以下特点:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/5150.html

  • lambda 只是一个表达式,函数体比 def 简单很多。
  • lambda 的主体是一个表达式,而不是一个代码块。仅仅能在 lambda 表达式中封装有限的逻辑进去。
  • lambda 函数拥有自己的命名空间,且不能访问自有参数列表之外或全局命名空间里的参数。

基本语法:lambda [arg1 [,arg2,.....argn]]:expression文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/5150.html

示例:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/5150.html

sum = lambda num1 , num2 : num1 + num2;
print( sum( 1 , 2 ) )
复制代码

输出的结果: 3文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/5150.html

注意:尽管 lambda 表达式允许你定义简单函数,但是它的使用是有限制的。 你只能指定单个表达式,它的值就是最后的返回值。也就是说不能包含其他的语言特性了, 包括多个语句、条件表达式、迭代以及异常处理等等。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/5150.html

匿名函数中,有一个特别需要注意的问题,比如,把上面的例子改一下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/5150.html

num2 = 100
sum1 = lambda num1 : num1 + num2 ;

num2 = 10000
sum2 = lambda num1 : num1 + num2 ;

print( sum1( 1 ) )
print( sum2( 1 ) )
复制代码

你会认为输出什么呢?第一个输出是 101,第二个是 10001,结果不是的,输出的结果是这样:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/5150.html

10001
10001
复制代码

这主要在于 lambda 表达式中的 num2 是一个自由变量,在运行时绑定值,而不是定义时就绑定,这跟函数的默认值参数定义是不同的。所以建议还是遇到这种情况还是使用第一种解法。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/5150.html

作者:Jaybo文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/5150.html

文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/5150.html
  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/bc/5150.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定