Python函数
2020-05-25 本文已影响0人
皮卡丘的电光一闪
定义函数
定义一个函数,要使用def语句,依次写出函数名、括号、参数和冒号,然后,在缩进块中写函数体,返回值用return语句返回。
def <函数名>(<参数>, ...) :
<函数体>
return <返回值>
当定义一个神秘石也不做的空函数时
def passMethod():
pass
pass语句什么都不做,pass可以用来作为占位符,比如还没想好写函数的代码,可以先放一个pass,让代码能够运行起来。缺少了pass,代码运行就会有语法错误。
调用函数
python本身内置了很多有用的函数,可以直接调用,具体可以直接从python的官方网站查看文档
数据类型转换
python内置的常用函数还包括数据类型转换,如:
- int()
- float()
- str()
- bool()
函数名其实就是执行一个函数对象的引用,也可以给这个函数起别名:
>>> a = abc # 变量a指向python内置函数abs函数
>>> a(-1) # 所以也可以通过a调用abs函数 等价abs(-1)
1
参数检查
调用函数时,若参数个数不对,python解释器会自动检查出来,并抛出TypeError。但是若参数类型不正确,就无法帮我们检查。运行抛出TypeError。故而我们可以使用内置函数isinstance()帮助我们对数据类型进行检查。如:
def my_abs(x):
if not isinstance(x, (int, float)):
raise TypeError('bad operand type')
if x >= 0:
return x
else:
return -x
返回多个值
当函数返回多个值(return x,y)时,返回值是一个tuple,在语法上,返回一个tuple可以省略括号,而多个变量可以同时接收一个tuple,按位置赋给对应的值。
调用.py文件的函数
from <文件名> import <函数名>
import <包名>
函数的参数
即上述定义函数中的参数。参数可以是一个位置参数、默认参数、可变参数、关键字参数、命名关键字参数、参数组合。
参数方式 | 写法 |
---|---|
位置参数 | def method(x) |
默认参数 | def method(x, y = 2)注:默认参数必须指向不变对象! |
可变参数 | def method(*nums)注:当使用list、tuple作为参数时,可以使用*list或者*tuple,把list或tuple的元素变成可变参数传进去 |
关键字参数 | def method(name, age, **kw)注:可以使用dict,可以使用**dict,把dict的key-value变成参数传进去 |
命名关键字参数 | def method(name, age *, city, job),注:如果没有可变参数,就必须加一个*作为特殊分隔符 |
参数组合 | 包含上述若干种参数注:虽然可以组合多达5种参数,但不要同时使用太多的组合,否则函数接口的可理解性很差 |
# 关键字参数
>>> 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'}
>>> extra = {'city': 'Beijing', 'job': 'Engineer'}
>>> person('Jack', 24, **extra)
# **extra表示把extra这个dict的所有key-value用关键字参数传入到函数的**kw参数,
# kw将获得一个dict,注意kw获得的dict是extra的一份拷贝,对kw的改动不会影响到函数外的extra
name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}
# 命名关键字参数
# 限制关键字参数的名字,只接收city和job作为关键字参数。
def person(name, age, *, city, job):
print(name, age, city, job)
# 调用,可不传入city参数
>>> person('Jack', 24, job='Engineer')
Jack 24 Beijing Engineer
# 注意
def person(name, age, city, job):
# 缺少 *,city和job被视为位置参数,为了避免歧义,必须加一个*作为分隔符。
pass
递归函数
在函数内部,可以调用其他函数,当在函数内部调用自身时,这个函数就是递归函数。
举个栗子:计算n! = 123...n,用函数表示,即fact(n) = n! = 123...(n-1)*n =(n-1)! * n = fact(n-1) * n
所以fact(n)可表示为n * fact(n -1),只有n=1时需要特殊处理,即:
def fact(n):
if n == 1:
return 1
return n * fact(n - 1)
上述就是一个递归函数。
>>> fact (1)
1
>>> fact (10)
3628800
为了防止栈溢出,可以通过尾递归优化,仅返回递归函数本身,而不是一个表达式。