函数
python内置函数
绝对值:abs()
平方根:sqrt()
平方:power()
将整数转换为‘0x’前缀的十六进制字符串:hex()
将整数转换为‘0o’前缀的八进制字符串:oct()
数据类型转换函数:int()
、float()
、str()
、bool()
导包:import 包名
练习题
请利用Python内置的hex()
函数把一个整数转换成十六进制表示的字符串:
1 | # -*- coding: utf-8 -*- |
定义函数
用def
语句定义函数
如自定义一个abs函数并检验函数功能,其代码如下:
1 | def my_abs(x): |
在python交互环境中定义函数时,python会出现...
的提示,函数定义结束后需要按两次回车使其重新回到>>>
提示符下,如下图所示:
空函数
定义一个空函数,用pass
语句来作为占位符。
1 | def my_max(): |
参数检查
如果要函数参数传入类型不对时需要抛出参数错误的信息,可用内置函数isinstance()
检查参数,如if not isinstance(x,(int,float))
语句,若传入了整数与浮点数之外的参数类型,函数就会抛出一个错误来提醒传参不对。
函数返回
函数体内部用return
返回函数结果
函数执行完毕也没有return
语句时,自动return None
。
函数的return
可以返回多个值,值之间用半角逗号隔开,如return a,b
注意python返回值实际上是返回一个tuple,并非是返回两个值,比如以下代码:
1 | def move(x,y): |
练习题
请定义一个函数quadratic(a, b, c)
,接收3个参数,返回一元二次方程 \[
ax^2+bx+c=0
\] 的两个解。
提示:
计算平方根可以调用math.sqrt()
函数:
代码如下:
1 | # -*- coding: utf-8 -*- |
默认参数
自定义函数可以设置默认参数。如次方函数可以设为默认平方,需要计算其他次方的时候再传次方的参数。代码如下所示:
1 | def my_power(x,n=2): |
注意:
- 设置默认参数时。必选参数在前,默认参数在后
- 当函数有多个参数时,变化大的参数放前面,变化小的参数可以作为默认参数
- 默认参数必须指向不变对象
可变参数
传入的参数个数是可变的称为可变参数,形式为*参数名
。
可变参数允许传入0个或任意个参数,这些参数在函数调用时自动组装为一个tuple。
在参数个数不确定时,定义可变参数和定义一个list和tuple参数相比,区别在于仅在参数前加了个*
号,而在函数内部,参数接收到的是一个tuple,函数代码是完全不用变的。此时调用函数时可传入任意个参数calc(1,2)
也可以传入0个参数clac()
。
将list或tuple元素变成可变参数传进函数中,可写成:
1 | nums=[1,2,3] |
关键字参数
关键字参数允许传入0个或任意个含参数名的参数,这些参数在函数内部自动组装为一个dict,形式为**参数名
。
关键字参数可以拓展函数的功能,如下所示:
1 | def person(name,age,**kw): |
将dict元素变成可变参数传进函数中,可写成:
1 | def person(name,age,**kw): |
命名关键字参数
若要限制关键字参数名字,只接收特定的参数可以用命名关键字参数,形式为*,限制参数名
。命名关键字参数可以设置默认值,调用函数时必须传入参数名。
函数定义如下,则表示只接收city和job作为关键字参数:
1 | def person(name,age,*,city,job): |
若函数定义中已经有一个可变参数,后面跟着的命名关键字参数就不需要特殊分隔符*
了
1 | def person(name,age,*args,city,job): |
参数组合
定义函数可以使用必选参数、默认参数、可变参数、关键字参数和命名关键字参数,5种参数之间可以组合使用,但参数定义的顺序必须为:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。
1 | def f1(a, b, c=0, *args, **kw): |
练习题
以下函数允许计算两个数的乘积,请稍加改造,变成可接收一个或多个数并计算乘积:
1 | # -*- coding: utf-8 -*- |
递归函数
递归函数优点是逻辑简单清晰,缺点是过深的调用会导致栈溢出
练习题
汉诺塔的移动可以用递归函数非常简单地实现。
请编写move(n, a, b, c)
函数,它接收参数n
,表示3个柱子A、B、C中第1个柱子A的盘子数量,然后打印出把所有盘子从A借助B移动到C的方法。
代码如下:
1 | # 期待输出: |