Python笔记-函数(20160319)
来源:互联网 发布:淘宝模版350 编辑:程序博客网 时间:2024/05/18 01:23
python的函数调用中:函数名其实就是指向一个对象的引用,完全可以把函数名赋值一个变量,相当于给这个函数起来一个别名。
if not isinstance(x, (int, float)):
raise TypeError('bad operand type')
if x >= 0:
return x
else:
return -x
nx = x + step * math.cos(angle)
ny = y - step * math.sin(angle)
小结:
函数执行完毕也没有return语句时,自动return None。
sum = 0
for n in numbers:
sum = sum + n * n
return sum
如果已经有一个list或者tuple,要调用一个可变参数怎么办?可以这样做:
这种写法当然是可行的,问题是太繁琐,所以Python允许你在list或tuple前面加一个*号,把list或tuple的元素变成可变参数传进去:
>>> nums = [1, 2, 3]
>>> calc(*nums)
小结:可变参数允许你传入 0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple
>>> person('Michael', 30)
>>> person('Bob', 35, city='Beijing')
name: Bob age: 35 other: {'city': 'Beijing'}
>>> person('Adam', 45, gender='M', job='Engineer')
name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}
关键字参数有什么用:可以扩展函数功能,比如上述你在做一个用户注册功能,除了用户名和年龄是必填外,其他都是可选择项,利用关键字参数来定义这个函数就能满足注册的需求。
**kw表示吧kw这个dict的所有key-value用关键字参数传入到函数的**kw参数,kw将获得一个dict,注意kw获得的dict是extra的一份拷贝,对kw的改动不会影响到函数外的kw
检查,仍然以上述为例
调用者传入的是不受限制的参数怎么办?
若要限制关键字参数的名字,就可以用命名关键字参数,例如,值接受city和job作为关键字参数,这种方式
Jack 24 Beijing Engineer
命名关键字参数必须传入参数名,这个位置参数不容,如果没有传入参数名,调用将会报错
无法和命名关键字参数混合,注意:定义参数的顺序必须是:
必须参数,默认参数、可变参数、命名关键字参数和关键字参数。
* args 是可变参数,args接受的是一个tuple
** kw 是关键字参数,kw接受的是一个dict
可变参数既可以直接传入:func(1, 2, 3),又可以先组装list或tuple,在通过*args传入:func(*(1, 2, 3))
关键字参数既可以直接传入:func( a = 1, b = 2),又可以先组装成dict,再通过**kw传入:func(**{'a':1, 'b': 2})
关键字参数是为了限制调用者可以传入的参数名,同时可以提供默认值。
定义命名关键字参数不要忘了写分隔符* ,否则定义的将是位置参数。
解决递归调用栈溢出的方法是通过尾递归化优,实际上尾递归和循环的效果是一样的,所以把循环看成是一种特殊的尾递归函数也是可以的,那么什么是尾递归呢?在函数返回的时候,调用自身本身,并且,return语句不能包含表达式。这样编译器或者解释器就会把尾递归做优化,是递归无论调用多少次都只用占用一个栈帧,不会出现栈溢出的情况。
1、空函数
如果想定义一个什么事也不做的空函数,可以用pass语句:
def nop():
pass
异常和错误处理 (内置函数isinstance())
if not isinstance(x, (int, float)):
raise TypeError('bad operand type')
if x >= 0:
return x
else:
return -x
可以返回多个值:
import math
def move(x, y, step, angle=0):nx = x + step * math.cos(angle)
ny = y - step * math.sin(angle)
return nx, ny
小结:
函数执行完毕也没有return语句时,自动return None。
函数可以同时返回多个值,但其实就是一个tuple。
注意:
定义默认参数要牢记:默认参数必须指向不变对象(list可变)
2、可变长参数 *
sum = 0
for n in numbers:
sum = sum + n * n
return sum
如果已经有一个list或者tuple,要调用一个可变参数怎么办?可以这样做:
这种写法当然是可行的,问题是太繁琐,所以Python允许你在list或tuple前面加一个*号,把list或tuple的元素变成可变参数传进去:
>>> nums = [1, 2, 3]
>>> calc(*nums)
14
小结:可变参数允许你传入 0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple
3、关键字参数
关键字参数婿你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装成为一个dict
print('name:', name, 'age:', age, 'other:', kw)
函数person除了必选参数name和age外,还接受关键字参数kw。在调用该函数时,可以只传入必选参数:
>>> person('Michael', 30)
name: Michael age: 30 other: {}
>>> person('Bob', 35, city='Beijing')
name: Bob age: 35 other: {'city': 'Beijing'}
>>> person('Adam', 45, gender='M', job='Engineer')
name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}
关键字参数有什么用:可以扩展函数功能,比如上述你在做一个用户注册功能,除了用户名和年龄是必填外,其他都是可选择项,利用关键字参数来定义这个函数就能满足注册的需求。
**kw表示吧kw这个dict的所有key-value用关键字参数传入到函数的**kw参数,kw将获得一个dict,注意kw获得的dict是extra的一份拷贝,对kw的改动不会影响到函数外的kw
4、命名关键字参数
检查,仍然以上述为例
调用者传入的是不受限制的参数怎么办?
若要限制关键字参数的名字,就可以用命名关键字参数,例如,值接受city和job作为关键字参数,这种方式
定义如下:
print(name, age, city, job)
调用如下:
Jack 24 Beijing Engineer
命名关键字参数必须传入参数名,这个位置参数不容,如果没有传入参数名,调用将会报错
5、参数组合
无法和命名关键字参数混合,注意:定义参数的顺序必须是:
必须参数,默认参数、可变参数、命名关键字参数和关键字参数。
#======
关于参数小结:
* args 是可变参数,args接受的是一个tuple
** kw 是关键字参数,kw接受的是一个dict
可变参数既可以直接传入:func(1, 2, 3),又可以先组装list或tuple,在通过*args传入:func(*(1, 2, 3))
关键字参数既可以直接传入:func( a = 1, b = 2),又可以先组装成dict,再通过**kw传入:func(**{'a':1, 'b': 2})
关键字参数是为了限制调用者可以传入的参数名,同时可以提供默认值。
定义命名关键字参数不要忘了写分隔符* ,否则定义的将是位置参数。
递归函数
解决递归调用栈溢出的方法是通过尾递归化优,实际上尾递归和循环的效果是一样的,所以把循环看成是一种特殊的尾递归函数也是可以的,那么什么是尾递归呢?在函数返回的时候,调用自身本身,并且,return语句不能包含表达式。这样编译器或者解释器就会把尾递归做优化,是递归无论调用多少次都只用占用一个栈帧,不会出现栈溢出的情况。
0 0
- Python笔记-函数(20160319)
- Python学习笔记:Python函数
- Python 笔记 : 函数
- python 学习笔记 -- 函数
- python笔记之函数
- Python学习笔记--函数
- python 常用函数笔记
- python实用函数笔记
- python内置函数笔记
- Python学习笔记 函数
- python 笔记2--函数
- Python学习笔记:函数
- python函数学习笔记
- Python学习笔记--函数
- Python学习笔记:函数
- python笔记_函数
- Python笔记(函数)
- 【Python学习笔记】- 函数
- Android内存优化
- 一点一滴分析LinkIt™ Smart 7688 webUI
- python Duck Typing 想到了自己的Python使用经历
- Git删除远程标签
- Android Audio系统分析1(获得最小buffer部分)
- Python笔记-函数(20160319)
- 内存分配
- JavaScript 中的 String.match() 方法
- java中位运算的一点研究
- hdu1042 N!
- 数据挖掘-MATLAB下svm小例子
- 大小端及网络字节序
- 深入理解Java虚拟机笔记---class类文件结构概述
- MotionEvent常量篇